Archive for the ‘Content Management’ Category

Two days ago, late in the evening, I wanted to clean up my list of “favourite” sites in the right column on this site. Since I couldn’t remember how things were handled, I went to the appearance section in the settings. What I saw, was an announcement the the widget section would now be handled with the block editor. OK. But…

The old widgets were supposed to remain available, unless I misread the announcement, no? There were pencil icons next to them, but clicking on them resulted in nothing – or so I thought. But when I reloaded the home page in another browser windows, I was shocked to see that the nice calendar had changed into a long, long list of dates! After all, there are more than 3000 posts on this site. Same for the tag cloud: it had turned into a list of categories. No, I was not amused when I saw that – and I’m doing my best to stay polite here.

Yesterday I had a bit of time to investigate. Since I’m using the free hosted WordPress service, I am not able to install the required plugin to continue editing the old widgets. The new editor showed no widgets (although the site still displayed those long lists), so I added the (new) Calendar widget… and sanity returned, more or less: the lists were replaced by a calendar, like I wanted to. The tag cloud was bit harder; the new one isn’t as nice as the old one. Even when I diminish the number of words shown, the display isn’t as readable as before, as you can see :-(

As for my links list: when I try to add the “Links” widget all I get is an unspecified error message. That’s not what I wanted in terms of “cleanup”.

It’s good that WordPress continues to evolve – yes, it’s gotten better over the years, and I’m confident that it will continue to do so. But in an evolving product it pays to take care of the old features until there is a reliable way to transform the old into the new. What I went through is no fun, and as a developer you should not force your users to go undergo such a process. Really.


Read Full Post »

The last two years, and 2020 in particular, have seen much writing and talking about “digitalisation” and “digital maturity”. A quick search on the Internet makes it clear: the big consulting firms have lots of advice on the subject, magazines and blogs write about it, and there is even a five-stage “Digital Maturity Model” – how could we discuss the subject without an appropriate model ? Sarcasm aside:  there doesn’t seem to be a clear and concise definition of “digital maturity”.

Don’t expect me to deliver that definition; I’m not even convinced it is necessary. It’s a bit like “digitalisation”: the term became ‘en vogue’ the last few years, and was used in politics to defend all kinds of measures that were supposedly “transforming” enterprises and societies into something better, more future-proof, more productive, more…

I don’t know about you, but when I started my professional career in IT more than 35 years ago, we called it “automation”. I was not even part of the first wave of automation; I was among those who were going to replace the mini-computers in the sales part of the company I work(ed) for, and introduce PC’s. We were laying foundations for a lot of digital work in the enterprise, so in my view “digitalisation” started already in the 1980’s.

Anyway, here’s what CMSWire has to say about how to become digitally mature:

But it isn’t enough to throw money at a problem and buy the latest digital tools. Instead, CEOs should be focused on solving problems. The objective of digital transformation isn’t just transferring data from paper to digital, or being able to run a business off of a computer. It’s about identifying what problems and inefficiencies employees are experiencing and implementing technology solutions that will solve those problems. It’s also about empowering employees with tools to make their lives easier.

Identifying problems; finding and designing solutions; solving problems: it takes collaboration between all parties concerned to do that right. That’s easier said than done, as evidenced by the fact that an extensive industry was built around collaboration! There are many considerations to be taken into account when you’re taking the CMSWire way to improve the digital maturity of your company. Let me just list three of them.

  • There should be only one content management system in your company“. If you’re going to diverge from that rule, at least make sure that you have very good and explicit rules for doing so – there are indeed situations where you need more than one. If you don’t follow the guideline, you’ll end up with data and documents in different systems within a company, and then the question becomes: where do I store this document? Will all documents of the same type end up in a single location? That is very unlikely – and it will become problem in the (near) future: where will you find the documents you’re looking for?

  • Invest in a good enterprise-wide search engine“. “Enterprise-wide” means that ideally it should cover all data and documents that circulate within the company – if you have multiple content stores, the search engine should be able to index them all. The investment needed does not just cover the installation and runtime cost of the search, but should include the daily management of the data and metadata needed to make the search work for everyone. For example, it may seem like a little thing, but making sure that data and documents can be found using the vocabulary of the people in the company is harder than you think. Is project X called “X” when people talk about it, or do Marketing and IT use different abbreviations? If there are multiple names, how will they find documents related to the project? A bit of AI may help, but even then it may well take a full-time job (or more!) to keep your search engine running perfectly.
  • Establish clear governance rules for collaboration tools“. The pandemic of 2020 and 2021 has fueled the rapid growth of video meeting and chat tools. The problem, of course, is that there are many choices. Most of those tools are an island upon themselves, incompatible with others that do the same thing from and end user point of view. It may seem simple to pick one of them and use that for all and any communication within and outside your company – but depending on circumstances that may not be the best choice. Perhaps you want to install one on your own infrastructure, to serve all internal meetings, and use an internet-based tool for contacts with your clients or partners? There may be financial, legal, or other reasons to take or avoid that road. Regardless of the solution chosen for any type of collaboration tool, you will need to establish clear governance rules: when to use the tool; how to use it; what precautions to take when interacting with external parties; what and how to archive; etc. Those rules should just be added to an existing body of governance for other tools like paper, email, etc. – I’m assuming any organisation worth calling an ‘enterprise’ already has such rules.

I did encounter the negative consequences of not following those guidelines at least once in my career so far, and certainly in big companies it’s very difficult to get everyone aligned on a single, enterprise-wide approach. But when every division or team starts its own collaboration project and chooses its own tools it becomes very hard to collaborate on anything. Good collaboration throughout the entire company: that is a cornerstone of an effective and productive digitalisation process.

Making hard choices on an enterprise level is necessary to reach a higher “digital maturity” level; when it comes to internal tools for content management and collaboration those choices can make or break your strategy. Choose wisely!

Read Full Post »

I hope you had a bit of time to play with Docker and WordPress, as I explained earlier. While playing, however, you may have encountered problems when trying to load certain extensions or themes. Specifically, WordPress may have told you that it could not download the files you selected because they were too large for its current settings – after all, 2 MB isn’t that big.

Here’s a solution to that problem.

First, start your WordPress and MariaDB containers.

Now launch a command line shell on the WordPress container by going to Docker Desktop and clicking on the second icon on the right of your WordPress container (when you hover over it with your pointer it will say “CLI” for “command line interface”). You’ll end up in a Linux shell in a separate window – because the container is running WordPress on the Linux OS.

Now type the following commands into that shell, ending each line with ENTER:

apt update

apt install nano

These commands will install the latest version of a little text editor called ‘nano‘. Now you’re ready to start ‘nano‘ and edit a file called ‘.htaccess‘. Type this line and hit ENTER again:

nano .htaccess

That ‘.htaccess‘ file will allow us to override the default maximum file size used by WordPress, plus a few other parameters that go along with that maximum file size. Use the keyboard arrows to go to the last line in the file, below the line that reads ‘# END WordPress’, and add the following lines:

php_value upload_max_filesize 32M

php_value post_max_size 64M

php_value memory_limit 128M

php_value max_execution_time 300

php_value max_input_time 300

To save the file, just use these key sequences: CTRL-O and ENTER, and then exit ‘nano‘ with CTRL-X. You’re back on the command line of the container, so be nice and type ‘exit’ and press ENTER again.

Now go back to Docker Desktop, and restart the WordPress container. If all goes well, you can now upload any theme or extension you want, or even upload the backup of a small existing WordPress site so you can experiment on that.

Do note that it is a temporary solution, in the sense that it will be applied to a running container; running containers do lose your modifications if you don’t turn them into a new Docker image. But writing your own Docker images comes with its own complexities and pitfalls; let’s keep that for another day (at least, that’s what I will do for now).

Read Full Post »

A few days ago I was telling you to check out multiple solutions to your CMS needs when you want to find out what works for you, and what not. But how do you check out a server-based tool, like Drupal, Joomla, WordPress, Typo3 and others, if you don’t have a specialist to help you out with the installation and configuration of that tool?

I will use WordPress as an example, since I wanted to try out a series of WordPress themes and plugins before committing to some of them on a running site. But the same approach can be used for other tools; there are multiple articles on the Web to detail their How-to’s.

The good news is that it’s easy to test many CMS’s with too much fuss by using Docker and “containers”. I’m not going to explain what Docker is and how it works here: there are several excellent introductions available, starting (of course) with the Docker Docs website.

Docker will take care of getting and configuring the software or packages you need. It will install them in one or more containers, and launch those containers to get the system up and running. You need two things to get going: the Docker application, and a definition for what you want to run in the container or containers.

Installing Docker isn’t difficult: the Docker website explains it for Linux, Mac OS and Windows. I installed Docker Desktop, which includes Docker Compose. The “composer” is easier to use than the command-line version of Docker for Docker newbies like me – remember that I want to learn about WordPress; learning more about Docker will come later if and when necessary.

By itself Docker does nothing: you have to tell it which “services” it has to run before it can do its job. What we need is a “Docker Compose” file detailing what is needed for the application we want to run. I created a folder on my Mac’s filing system called ‘wordpress‘, and in that directory I created a file called ‘docker-compose.yml‘. Here’s the content that needs to go in that file to get WordPress going:

version: "3.3"
            image: mariadb
                - db_data:/var/lib/mysql
            restart: always
                MYSQL_ROOT_PASSWORD: example
                MYSQL_DATABASE: wordpress
                MYSQL_USER: youruser
                MYSQL_PASSWORD: yourpw

          image: wordpress
              - "8000:80"
              - wp_data:/var/www/html
            WORDPRESS_DB_HOST: mysql
            WORDPRESS_DB_USER: yourwpuser
            WORDPRESS_DB_PASSWORD: yourwppw
            WORDPRESS_DB_NAME: wordpress
              - mysql
          restart: always
        db_data: {}
        wp_data: {}

You’ll notice that this file tells Docker that two ‘services‘ are needed: a database and the WordPress application itself. For a database, I chose MariaDB, a MySQL variant. The ‘image‘ line specifies which software (version) Docker has to retrieve from its extensive catalog. The environment lines detail the values to be used for some of the configuration parameters required for the package. The ‘ports‘ line in the ‘wordpress‘ service explains to Docker that traffic from your browser on port 8000 should be routed to the default port 80 on the WordPress container.

Then there are the somewhat less self-evident lines about volumes.

When you start an application from one or more Docker containers, like we are doing now, Docker will check that what it has downloaded from its catalog still corresponds to what was specified in the docker-compose.yml file. When no specific version is spelled out, Docker assumes we want the latest version; it will download a newer version than the last one used if that is outdated. When it does that, it will also overwrite the data that has been stored on the container – data like the content of our site. To keep our data – in this case: the content we want to put into WordPress – separate from the container we have to tell Docker to save certain things outside the containers and on our own file system. The ‘volumes’ in the docker-compose.yml file do exactly that: normally, MariaDB will store its database in a Linux path at ‘/var/lib/mysql‘; the file says that the database must be stored in a local path (folder) called ‘db_data‘. WordPress data normally stored at ‘/var/www/html‘ must be stored in our ‘wp_data‘ folder.

I think Docker is supposed to create those folders if they don’t exist, but that did not happen during my first tests. So I created those to folders (volumes) in the same ‘wordpress‘ folder where the docker-compose.yml file resides before starting Docker.

When all that is done, it is time to start a command line shell. Set your working directory to the ‘wordpress‘ folder, and launch the following command:

docker-compose up -d

Docker will start by downloading the required software images if they do not yet exist on your machine. This may take a few minutes, and it certainly will if it’s the first time you use Docker. When all goes well, it will finish by telling you that the “Network” has been created and the “containers” have been started.

That’s when you can open a browser, go to the address “http://localhost:8000“, and start installing WordPress. Just follow the instructions: pick a language for your site, then enter a title for the site and create the credentials for the site administrator. After that, you’re using WordPress and can start creating content and changing the way the site displays that content to its users. From here on you can explore WordPress, trying out themes and extensions and so much more.

If you think using Docker is hard, you may want to compare my instructions with the “How to install WordPress” page on the WordPress website. I hope it is clear that Docker does a lot of the configuration work for you. Even better: Docker does it in way that makes the process very repeatable – do this again on another machine and you’ll get exactly the same result, with little chances of typos and other errors complicating the process. Thank you, Docker!

Read Full Post »

The Content Management Systems (CMS) market is quite extensive: the well-known CMS Matrix website lists more than 1300 products! That doesn’t make a choice any easier, of course. Hence sometimes people say: “Let’s build our own CMS“.

Is that a good idea? What does it mean to build your own CMS? What advantages and disadvantages do you have to take into account when starting to write a CMS from scratch?

The article “Why Would You Write Your Own CMS?” is highly recommended to any developer and webmaster considering writing their own CMS. The author does not pretend to be exhaustive, but I think he manages to list the main characteristics of that process.

When all is said and done, the main reason I chose to write my own CMS is because I wanted to. The main benefit is that it’s precisely what I need, and the main drawback is that it took ages to build.

Now it is of course true that James Edwards built a system that is “precisely what he needed”: he is also the only user, so to speak. If you want to build your own CMS for the company, you have to consider additional disadvantages – and advantages, of course. I know from experience that one of those important advantages is the flexibility with which you can adapt the CMS to the inevitable changes within and around your company. And you cannot say that about many existing products …

On the other hand, a plea for “do it yourself” should not mean that you should not look at a number of content management platforms. Such a platform offers basic functionalities, and on top of that it will have one or more ways to add custom functions. The examples are well-known: Drupal, Joomla, WordPress, Typo3 and many others can be installed on your own servers; platforms such as Wix, BigCommerce, Shopify and Bitrix24 provide the hosting, so you only have to focus on the content.

Each type of solution has advantages and disadvantages, so there is no “best” solution for all possible situations. Studying, trying and comparing different solutions is the only way to find out what fits your needs!

You can read this post in dutch on the ‘innologos’ blog.

Read Full Post »

I am using WordPress for ten years now, and I have always appreciated the fact that WP is a solid piece of software. I know I’m not using all of its possibilities and functions, but until a a few weeks ago I have never encountered anything that could be considered a “bug”.

However… since the change to the Block editor for editing Posts and Pages all my editing sessions regularly show me this message:

Conflicting messages: did WP save the post or not?

What does WordPress mean, by the way, when it says I’m not allowed to edit my own Post? And if I’m not allowed to edit it, where did it save the Post? Why do I find parts of what I wrote in my site, even when it tells me that the update failed?

This is, of course, a nice example of how not to inform your user. Because just to be sure I keep clicking the “Save” or “Update” buttons, only to see the same message popping up most of the time!

Worse: sometimes the editor says “Saved”, but does not save the Post, thus forcing me to retype it. Having experienced that on a few occasions, I even started to write my Posts in a separate text editor program on my Mac or PC before copy-pasting them into the block editor – and that can and should not be the right way to use a tool like WordPress that can handle a minimal but complete editorial flow from writing over revising and approving to publishing.

Back to the message shown above: it occurs when I create a new Post, but also when I edit older Pages and Posts that were created with the Classic editor. Until very recently, I always preferred the Classic editor: it gives me a certain measure of control over the HTML code, something I (like many web developers) appreciate a lot. By the way: the Classic block in the Block editor may look like the Classic editor, but it isn’t the same and does not allow the same measure of control over your content. So  it’s not a good equivalent.

I know I still have to learn to get to grips with the Block editor, which is by definition better than the Classic editor when it comes to structuring content in a web page. That’s a big plus when changing the look and feel of a site, or when you move content from one site to another. So from a Content Management point of view the Block editor is way better than the Classic editor.

But the Block editor should be able to handle existing “classic” posts and pages without strange hick-ups (I seen a few of those as well) and without trying to apply the Block editor rules on those old Posts. It would be better if WordPress could simply revert to the Classic editor if it notices that there is no “Block” stuff in them.

And certainly the Block editor should save my edits correctly and without fail – and without dubious messages! Because that’s a bug, in my view!

Read Full Post »

Who would have thought that this blog would last for at least 20 years? Not me – at least that was not my plan when I started exactly 20 years ago, on December 23, 1999. I started this blog not on WordPress, I admit, but on EditThisPage.com – thanks to Dave Winer. Dave gave away a great gift at the time: a way for anyone who wanted to learn about how to edit a website in a simple way. I am still grateful for that opportunity!

The start of this blog was also the start of my interest in what later would be called “content management systems” for internet sites. Like this blog, that “interest” is still going strong.

Happy birthday, blog!

PS. A present that allows you to learn stuff: isn’t that the beste present you can receive?

Read Full Post »

A week ago, Dave Winer complained about the loss of “essential” (or important) web pages on the Web:

Earlier this year we lost the handle on Radio UserLand weblogs because the new owner of weblogs.com was unwilling to maintain a DNS entry pointing to them. That and Google’s marking HTTP sites as not secure have been huge blows to the web as an archival medium.

I too am a big fan of keeping stuff of all kinds (let’s call it “archiving”, shall we?). I also would like to keep web pages around indefinitely. I hate it when I find a reference on my blog responding with a 404 error, since I pride myself to write only (OK, mostly) about serious subjects. But the Web by itself is too human and too complex, I fear, to avoid deletion of pages and sites.

What I have learned the hard way, after losing part of my first website in the mid-1990’s, is that you have to your own “curator”. If you want to “keep” certain information from the Web, just keep a copy of it on a location that you control. By the way, “information” does not necessarily equal “web page”: text, images, movies, sound, etc. can be stored separately from a “web page”.

When I find “linkrot” on my blog, I do try to check the existence of the corresponding page on the Internet Archive, also known as the “Wayback Machine”. There’s an extensive archive over there, but no one should expect it to be complete. But it remains useful, so let me propose a neat little software project: a browser extension that automatically goes looking into the Wayback Machine when it encounters a “Page not found” error?

Google’s first home page as seen in the Wayback Machine

Clearly there will never be a complete copy of the Web as a whole. It would be nice if someone were to take on the role of “chief web archivist” and build a real archive of essential and relevant sites and pages. But shouldn’t that include the server-side resources as well as the resulting pages? I mean: what use is it to have the first version of Google’s search page if you don’t have the underlying search engine and its data as well?

Read Full Post »

This blog is almost as old as ‘inessential‘, written by Brent Simmons. We both started in 1999, and I must admit that I did not know what I was doing at that moment! I certainly did not expect me to be sitting here, more than 18 years later, still writing in a language that is not native to me.

I do hope that you may agree with his view:

[…] to read a good blog is to watch a writer get a little bit better, day after day, at writing the truth.

Om Malik mentions how blogs help you understand a person:

And that’s precisely what blogs do. That’s what Dave does. That’s Gruber’s log. The words made you understand the writer, and the person.

That is exactly what Dave Winer means when he defines a blog as ‘The unedited voice of a person‘. A business blog usually is just a chronological announcement list, not a blog, making it a platform for the communication or marketing division. Useful, perhaps, but not a blog.

Read Full Post »

In Wired’s “It’s Time For An RSS Revival“, RSS gets a bit of love – some would say: “much needed love”. RSS isn’t a new web technology; its original version was published in 1999.

“The most amazing thing to me about RSS is that no one really went away from it,” says Wolf. “It still exists…”

Well, of course RSS still exists, and there are many websites, personal and commercial, that publish one or more RSS feeds. What purpose do these “feeds” serve?

If you have never used an RSS feed, you may not know what you’re missing. RSS stands for “RDF Site Summary” or “Really Simple Syndication“, but that does not explain much. An RSS feed will publish a list of “items”, each pointing to a webpage on the site publishing the feed. Details about the link may include a page title, a summary of the link’s content or the whole text, an audio attachment (think ‘podcast’), publication date, etc. Usually, these lists are used to publish the latest updates on a site. That’s how they allow you to use them to discover new opinions, news, updates to pages, etc. without having to go to each individual page. “Feed reader” software combines the RSS feeds of multiple feeds, thus giving you a single tool to discover news from multiple sites.

Such feed reader software is what I have used for more than a decade now, to keep up with the many news sources I like to consult. Combining multiple sources in a single tool on a mobile device (tablet of smart phone) was the first driver for my decision to go that way. The possibility to read those feeds even when you’re not even online was the second driver: indeed, once you have downloaded the feed, you do not need an internet connection to get your dose of news – and that was very handy in those days when mobile internet access was hard to get and expensive!

Even today, when I’m practically always online, I still prefer browsing “the news” through a feed reader. That allows me to bypass the homepages of sites filled with screaming titles and adverts, and use just the item titles to judge their value to me. I find this so much more compelling than surfing from website to website, that an RSS feed reader was the first mobile app that I paid for – I’m using Byline on iOS, and I love it!

I can only encourage you to try out a web-based RSS reader like Feedly if you want to discover what RSS is all about. Then go looking for the RSS icon on the sites you care about, and add those feeds to your Feedly account. When you decide to use a separate application or app to read your feeds, there’s plenty of choice – and more may be coming, if Wired’s talk of a revival comes through. And no, you don’t have to be tired of Facebook to start reading RSS feeds – just don’t be surprised when you discover that RSS feeds are more interesting than a stream of messages on one of the many social media…

Read Full Post »

On December 23, 1999, I wrote the first post on this blog. Remember Userland’s Manila? That was my tool of choice then, because it was available online, without installation, and free to try. In those days, I wasn’t ready to produce HTML by hand, and I still don’t want to do that. Picking a blog tool was the start of my study of content management solutions. Remarkably, the Manila website is still up and running, inviting you to start a trial site – I’m not certain where that will lead you, though.

When Userland seemed unable to continue to offer a good service, I started building a copy of my blog on WordPress. I did exactly what I tell everyone to avoid: I migrated each and every post from Manila to WordPress by hand. You see, Manila had this one feature that I also needed in whatever tool able to replace it: a complete, yet simple backup mechanism. The HTML from the Manila backup could be pasted into the WordPress editor without much intervention. That’s how this site remains what it became over the course of the years: a not so virtual memory for travels on the Web – and in real life as well, of course.

Happy holidays!


Read Full Post »

I like WordPress a lot. It is, in my opinion, one of the best content management systems on the market, and being available as a free and open source tool is a big added bonus. WordPress is also a big internet site, of course, hosting many thousands of blogs and sites. That is another matter, and it’s also what makes this article more than bit frightening: “WordPress ignoring terrorist propaganda, campaigners say” (on www.telegraph.co.uk). Core of the message:

One of the world’s biggest blogging websites is turning a blind eye to pages run by Isil, even after they have been reported, anti-terrorism campaigners say.

I hope Automattic, the owner of WordPress, has a good answer for that situation; better yet: I hope they can change their stance on this. Even freedom of speech has limits, and should not be an excuse to allow hate speech and terrorist exhortations on the internet.

Read Full Post »

It’s been a long time since I suggested that a system like S5 should include an editing mode, and see my post of March 15, 2012 repeated that suggestion. As it turns out, there is now a very similar tool that does just that: remark. No, it’s not a Wiki, it’s a lightweight CMS, using Markdown (plus extensions) to do its magic.

To be honest, between my first suggestions in 2005 and now a number of similar tools have been created, many based on S5, by the way – just check out http://wiki.s5project.org/HTML_slideshow_tools. But things over there aren’t too lively anymore, it seems…

I’m waiting for a good opportunity to try ‘remark’ out, if only to see  on how many platforms it can be used for editing without too many limitations.

For a quick try-out, head over to Platon.io – it’s an editable webpage powered by remark.

Read Full Post »

Bye Bye, Woozweb

I have been using the services of the french Woozweeb to monitor the availability and the performance of a few of my own websites since many years. A free Woozweb account allowed me to define up to five (later up to ten) URLs to be checked on a regular base (I don’t recall the exact frequency, but it was multiple times per hour). Woozweb would accumulate the responses, display a graph of response times as well as the latest HTTP response code, analyse the response headers, etc. Every so three of four weeks, I would check my account, to verify that the different providers were not failing to do what they promised: host a responsive website.

This should be part of your content management solution: after all, content isn’t worth anything if it is not available. So monitoring your site is an essential part of your CM system, even if you do so in a separate tool.

Although I received a mail to extend my Woozweb account just few days ago, an attempt to log into the site just showed a shutdown notice:


I will be on the lookout for alternative solutions like Woozweb (suggestions are welcome). And remember: if you’re going to close down your service, make sure not to send out renewal notices after the shutdown!

Read Full Post »

Google is big, in numbers. Google is big business, in numbers. Google embodies “search”, and we no longer know Altavista and the like from a good decade ago. So I pretty sure that, given the task, you could find “26 Crazy Facts You Never Knew About Google“, a nice infographic with a few tidbits about Google.


But there are alternatives to Google, especially if you prefer a more private and less personalised search experience. OptiLocal presents an infographic comparing Google to DuckDuckGo.

I am a longtime user of Google, because of the quality of its search results. But I must admit that I’m no longer appreciating the barrage of “targeted” ads after any occasional search on websites that have nothing to do with Google, or so it seems. So I will be using DuckDuckGo the next weeks, and see what that gives in terms of results and in terms of how it feels…

Read Full Post »

Older Posts »