<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Guides Archives - Cube Websites</title>
	<atom:link href="https://cubewebsites.com/category/guides/feed/" rel="self" type="application/rss+xml" />
	<link>https://cubewebsites.com/category/guides/</link>
	<description>web design and development</description>
	<lastBuildDate>Wed, 23 Aug 2023 19:06:41 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://cubewebsites.com/wp-content/uploads/2019/04/cropped-favicon-32x32.png</url>
	<title>Guides Archives - Cube Websites</title>
	<link>https://cubewebsites.com/category/guides/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Fix: SSH No Matching Host Key Type Found</title>
		<link>https://cubewebsites.com/guides/fix-ssh-no-matching-host-key-type-found/</link>
					<comments>https://cubewebsites.com/guides/fix-ssh-no-matching-host-key-type-found/#respond</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Wed, 23 Aug 2023 19:06:40 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Hosting]]></category>
		<guid isPermaLink="false">https://cubewebsites.com/?p=1229</guid>

					<description><![CDATA[<p>Earlier I was connecting to a client server via SSH when I received the following error: After looking up the error I was able to fix this by using the following instructions: On your local machine, edit/create ~/.ssh/config Add this (replace the x&#8217;s with the server IP) Host x.x.x.x HostKeyAlgorithms=+ssh-dss After this try connecting. You [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/fix-ssh-no-matching-host-key-type-found/">Fix: SSH No Matching Host Key Type Found</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Earlier I was connecting to a client server via SSH when I received the following error:</p>



<pre class="wp-block-code"><code>Unable to negotiate with x.x.x.x port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss</code></pre>



<p>After looking up the error I was able to fix this by using the following instructions:</p>



<p>On your local machine, edit/create ~/.ssh/config</p>



<p>Add this (replace the x&#8217;s with the server IP)</p>



<pre class="wp-block-preformatted">Host x.x.x.x
    HostKeyAlgorithms=+ssh-dss</pre>



<p>After this try connecting. You may need to remove the host from your known hosts first&#8230;</p>



<p>Edit ~/.ssh/known_hosts</p>



<p>Search for your server IP, and remove any matching line(s)</p>



<p>That&#8217;s all, after this you&#8217;ll be able to reconnect using your existing keys</p>
<p>The post <a href="https://cubewebsites.com/guides/fix-ssh-no-matching-host-key-type-found/">Fix: SSH No Matching Host Key Type Found</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/fix-ssh-no-matching-host-key-type-found/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How To: Setup Content Translations In Directus</title>
		<link>https://cubewebsites.com/guides/how-to-setup-content-translations-in-directus/</link>
					<comments>https://cubewebsites.com/guides/how-to-setup-content-translations-in-directus/#respond</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Thu, 05 Jan 2023 11:50:41 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Guides]]></category>
		<category><![CDATA[directus]]></category>
		<guid isPermaLink="false">https://cubewebsites.com/?p=1201</guid>

					<description><![CDATA[<p>I&#8217;ve recently been playing with Directus as a backend for some small projects. One of the great features that Directus provides is translation support which I decided to try out. Unfortunately, it when it came to the setup I couldn&#8217;t find much documentation on this so it took me a bit of read and some [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-setup-content-translations-in-directus/">How To: Setup Content Translations In Directus</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve recently been playing with Directus as a backend for some small projects.  One of the great features that Directus provides is translation support which I decided to try out.  Unfortunately, it when it came to the setup I couldn&#8217;t find much documentation on this so it took me a bit of read and some trial and error to figure it out. </p>



<p>This articles shares my findings and shows how easy it is to setup.</p>



<h2 class="wp-block-heading">Setup your collection</h2>



<p>Select an existing (or create a new collection) that you want translations for.  Don&#8217;t add any fields that need translations just yet!</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="372" src="https://cubewebsites.com/wp-content/uploads/2023/01/image-1024x372.png" alt="" class="wp-image-1202" srcset="https://cubewebsites.com/wp-content/uploads/2023/01/image-980x356.png 980w, https://cubewebsites.com/wp-content/uploads/2023/01/image-480x174.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /><figcaption class="wp-element-caption">An example of a categories collection that we want to add translations to</figcaption></figure>



<p>Next, click on Create Field and choose the &#8216;Translations&#8217; type field:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="842" height="1024" src="https://cubewebsites.com/wp-content/uploads/2023/01/image-1-842x1024.png" alt="" class="wp-image-1203"/><figcaption class="wp-element-caption">The default options for the Translation field are fine for now</figcaption></figure>



<p>If you like you can modify some of the field configuration by clicking the <code>Continue in Advanced Field Creation Mode</code>.  For example I prefer using UpperCamelCase for my table names, so I modified the <code>languages</code> table name to <code>Languages</code></p>



<h2 class="wp-block-heading">Setup Translation Fields</h2>



<p>Once you&#8217;ve done that go back to the <code>Data Model</code> screen.  Here you&#8217;ll see a new hidden collection, in my case <code>Categories Translations</code></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="84" src="https://cubewebsites.com/wp-content/uploads/2023/01/image-3-1024x84.png" alt="" class="wp-image-1205" srcset="https://cubewebsites.com/wp-content/uploads/2023/01/image-3-980x80.png 980w, https://cubewebsites.com/wp-content/uploads/2023/01/image-3-480x39.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></figure>



<p>Click into the <code>Categories_Translations</code> table, and within this collection add all the fields for <code>Categories</code> that need translations. e.g.:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="527" src="https://cubewebsites.com/wp-content/uploads/2023/01/image-4-1024x527.png" alt="" class="wp-image-1206" srcset="https://cubewebsites.com/wp-content/uploads/2023/01/image-4-980x504.png 980w, https://cubewebsites.com/wp-content/uploads/2023/01/image-4-480x247.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /><figcaption class="wp-element-caption">The id, Categories_id, Languages_id fields are created automatically when you setup the translations on Categories.  I added Name and Description</figcaption></figure>



<h2 class="wp-block-heading">Add Translated Content</h2>



<p>Now, go to the Content menu and choose your collection.  You&#8217;ll see the fields you&#8217;ve added to the Translations table appear with the option to fill them out in different languages.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="928" src="https://cubewebsites.com/wp-content/uploads/2023/01/image-5-1024x928.png" alt="" class="wp-image-1207" srcset="https://cubewebsites.com/wp-content/uploads/2023/01/image-5-980x888.png 980w, https://cubewebsites.com/wp-content/uploads/2023/01/image-5-480x435.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /><figcaption class="wp-element-caption">Example of adding translated content</figcaption></figure>



<p>Here you can use the Translations input to select a language, and then use the input fields below to populate the content in your selected Language.  There&#8217;s even a split view which is very handy if you&#8217;re translating content from one language to another.</p>



<h2 class="wp-block-heading">Managing Languages</h2>



<p>You can control which Languages appear by modifying the entries in the Languages collection.  By default Directus populates that table with 8 common languagues.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="867" height="1024" src="https://cubewebsites.com/wp-content/uploads/2023/01/image-6-867x1024.png" alt="" class="wp-image-1208" srcset="https://cubewebsites.com/wp-content/uploads/2023/01/image-6-867x1024.png 867w, https://cubewebsites.com/wp-content/uploads/2023/01/image-6-480x567.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 867px, 100vw" /></figure>



<p>Hopefully this demonstrates how easy it is to add translated content in Directus.  Of course, if there&#8217;s fields that don&#8217;t need translation you just add them in the parent table &#8211; in this case the <code>Categories</code> collection.</p>



<p></p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-setup-content-translations-in-directus/">How To: Setup Content Translations In Directus</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/how-to-setup-content-translations-in-directus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How To: Check Which Docker Container Is Using A Port</title>
		<link>https://cubewebsites.com/guides/how-to-check-which-docker-container-is-using-a-port/</link>
					<comments>https://cubewebsites.com/guides/how-to-check-which-docker-container-is-using-a-port/#respond</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Tue, 03 Jan 2023 12:30:23 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[tools]]></category>
		<guid isPermaLink="false">https://cubewebsites.com/?p=1197</guid>

					<description><![CDATA[<p>This morning I had a Docker service fail to start. On inspection of the error, it turned out it was because the port was in use by another service. In this particular case, my Docker service was trying to use port 8029 so that&#8217;s what I&#8217;ve used in the examples below. This searches through your [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-check-which-docker-container-is-using-a-port/">How To: Check Which Docker Container Is Using A Port</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>This morning I had a Docker service fail to start.  On inspection of the error, it turned out it was because the port was in use by another service.  In this particular case, my Docker service was trying to use port 8029 so that&#8217;s what I&#8217;ve used in the examples below.</p>



<pre class="wp-block-code"><code>docker ps | grep 8029</code></pre>



<p>This searches through your docker containers, and finds any that are running on port 8029.  The output should look like this:</p>



<pre class="wp-block-code"><code>fec0c35f0b2d directus/directus:latest "docker-entrypoint.s…" 15 minutes ago Up 5 minutes 127.0.0.1:8029->8055/tcp directus-example</code></pre>



<p>In the above example you can see that port 8029 was identified to be in use by the directus-example container.  It turns out I did a test install of Directus on that port, and then forgot to delete it.</p>



<p>Stop the docker container:</p>



<pre class="wp-block-code"><code>docker stop fec0c35f0b2d</code></pre>



<p>The container ID (<code>fec0c35f0b2d</code>) used above is from the first command which provided the container ID</p>



<p>Delete the docker container. In my case I no longer needed this Directus container, so I deleted the container too.  If you need to keep your container, then just change its configuration to run on a different port that doesn&#8217;t clash.</p>



<pre class="wp-block-code"><code>docker rm fec0c35f0b2d</code></pre>



<p>With this complete, I was able to start the Docker container that&#8217;s actually supposed to be running on port 8029 with no issues.</p>



<p>In my case I knew that the port would be used by Docker because I use that port range for Docker only.  If you don&#8217;t know for sure that it&#8217;s Docker using the port, then you can use the following to check which service is using the port.  Note that you will need sudo access to run this.</p>



<pre class="wp-block-code"><code>sudo netstat -tulpn | grep 8029</code></pre>



<p>The output from this should tell you which service is using that port.</p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-check-which-docker-container-is-using-a-port/">How To: Check Which Docker Container Is Using A Port</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/how-to-check-which-docker-container-is-using-a-port/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guide: Using n8n to Send New WordPress Posts to Mastodon</title>
		<link>https://cubewebsites.com/guides/guide-using-n8n-to-send-new-wordpress-posts-to-mastodon/</link>
					<comments>https://cubewebsites.com/guides/guide-using-n8n-to-send-new-wordpress-posts-to-mastodon/#respond</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Mon, 02 Jan 2023 16:43:25 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[directus]]></category>
		<category><![CDATA[mastodon]]></category>
		<category><![CDATA[n8n]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://cubewebsites.com/?p=1192</guid>

					<description><![CDATA[<p>Lately I&#8217;ve been interested in using Mastodon as a social media platform. In previous efforts I used the ActivityPub plugin to automatically push new posts to Mastodon, but unfortunately this came with a lot of limitations. I&#8217;ve now setup a new integration which uses some additional tools (Directus and n8n) to help with this process. [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/guide-using-n8n-to-send-new-wordpress-posts-to-mastodon/">Guide: Using n8n to Send New WordPress Posts to Mastodon</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Lately I&#8217;ve been interested in using Mastodon as a social media platform.  In previous efforts I used the ActivityPub plugin to automatically push new posts to Mastodon, but unfortunately this came with a lot of limitations.</p>



<p>I&#8217;ve now setup a new integration which uses some additional tools (Directus and n8n) to help with this process.  The below provides a quick run-through of the process and explanation of this approach.</p>



<h2 class="wp-block-heading">Advantages</h2>



<p>Directus provides a quick way of creating an API around data models.  They offer a free cloud version which is perfect for this small-scale integration.  It can also be self-hosted in a number of ways, including using Docker which makes it very easy to setup.</p>



<p>Note that you don&#8217;t necessarily need Directus &#8211; you could use a database (e.g. MySQL) and replace the n8n API calls with database queries instead.</p>



<p>n8n (nodemation) is a powerful automation tool similar to Zapier or Logic Apps.  You can build workflows to help you achieve complicated processes using simple building blocks.  This also has a Cloud version (paid) or a self-hosted version.</p>



<p>Using the above means that I have far more control over what is going out to Mastodon, and can easily be expand to cover additional platforms e.g. Telegram, Slack or Teams.</p>



<ul class="wp-block-list">
<li>messages can be customised to your liking</li>



<li>messages can be deleted if a post is updated, and you can resubmit</li>



<li>you use your own Mastodon account so your profile can be managed fully</li>
</ul>



<h2 class="wp-block-heading">The Process</h2>



<ol class="wp-block-list">
<li>In Directus create a Collection called &#8216;rss_feed_items&#8217; with a field called &#8216;guid&#8217;.  This is used to track posts which have already been sent to Mastodon to prevent duplicates</li>



<li>In n8n, use a Schedule trigger to run every 5 minutes or so</li>



<li>Use the RSS block to fetch the RSS feed for your WordPress blog</li>



<li>Use the HTTP block to get a list of existing guids from the Directus API</li>



<li>Use the Merge block to keep only new blog posts</li>



<li>Use a Code block to prepare the message for Mastodon i.e. get the title, link and convert the categories to hashtags</li>



<li>Use the Mastodon block to post the message to Mastodon.  This is a third-party block at the moment.</li>



<li>Use the HTTP block to call the Directus API and create a record for the guid of the blog post</li>
</ol>



<p>Using this method, if a blog post is updated, I can just edit my post on Mastodon.  It could actually be made more sophisticated by keeping the Mastodon status ID and Mastodon post content in Directus with the GUID, and then if the new content is different to the old n8n can delete the old post and create a new post for you.</p>



<p>Note that on the first run, it will send all the posts that appear on your current RSS feed to Mastodon. </p>



<p>Enjoy!</p>
<p>The post <a href="https://cubewebsites.com/guides/guide-using-n8n-to-send-new-wordpress-posts-to-mastodon/">Guide: Using n8n to Send New WordPress Posts to Mastodon</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/guide-using-n8n-to-send-new-wordpress-posts-to-mastodon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HOW TO: Using Laravel with Vite on MAMP</title>
		<link>https://cubewebsites.com/development/laravel/how-to-using-laravel-with-vite-on-mamp/</link>
					<comments>https://cubewebsites.com/development/laravel/how-to-using-laravel-with-vite-on-mamp/#respond</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Wed, 28 Dec 2022 11:34:42 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[mamp]]></category>
		<category><![CDATA[vite]]></category>
		<guid isPermaLink="false">https://cubewebsites.com/?p=1186</guid>

					<description><![CDATA[<p>I recently needed to help someone out who was using MAMP on a MacBook Pro on a Laravel 9 project. The project was configured to: The Problem When running the default project with yarn run dev and accessing the project in the browser via the hostname configured in MAMP, the hot reload feature was not [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/development/laravel/how-to-using-laravel-with-vite-on-mamp/">HOW TO: Using Laravel with Vite on MAMP</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>I recently needed to help someone out who was using MAMP on a MacBook Pro on a Laravel 9 project.</p>



<p>The project was configured to:</p>



<ul class="wp-block-list">
<li>run on MAMP</li>



<li>the MAMP host was configured to use SSL</li>



<li>Laravel 9</li>



<li>Vite</li>



<li>InertiaJS</li>
</ul>



<h2 class="wp-block-heading">The Problem</h2>



<p>When running the default project with <code>yarn run dev</code> and accessing the project in the browser via the hostname configured in MAMP, the hot reload feature was not working and the network and console tabs in Developer Tools were polluted with lots of 404 errors about the failure to connect to the Vite Ping URL e.g. <code>__vite_ping</code> to which it keeps trying to reconnect to.</p>



<h2 class="wp-block-heading">How to fix</h2>



<p>You have to configure Vite to run on https.  This can be done in a number of ways, but the easiest is to use the <a href="https://www.npmjs.com/package/@vitejs/plugin-basic-ssl" target="_blank" rel="noreferrer noopener nofollow">@vitejs/plugin-basic-ssl</a> plugin.  It&#8217;s really easy to get started:</p>



<ol class="wp-block-list">
<li>Add the plugin to your project
<ul class="wp-block-list">
<li>with yarn: <code>yarn add --dev @vitejs/plugin-basic-ssl</code></li>



<li>with npm: <code>npm i @vitejs/plugin-basic-ssl</code></li>
</ul>
</li>



<li>Open the <code>vite.config.js</code> file in your Laravel project</li>



<li>Import the plugin at the top of the file:
<ul class="wp-block-list">
<li><code>import basicSsl from '@vitejs/plugin-basic-ssl'</code></li>
</ul>
</li>



<li>Enable the plugin using the defineConfig block e.g.</li>
</ol>



<pre class="wp-block-preformatted">export default {
  plugins: [
    basicSsl()
  ]
}</pre>



<p>Note: you might already have other plugins or config options in the <code>defineConfig</code> block, but you just need to make sure you add the called to <code>basicSsl()</code> in the plugins section.</p>



<p>After this when you run your project using <code>yarn run dev</code> it will provide you with a Local URL e.g.</p>



<pre class="wp-block-code"><code>11:15:06 &#91;vite] vite.config.js changed, restarting server...
11:15:06 &#91;vite] server restarted.

  > Local: https://localhost:3000/
  > Network: use `--host` to expose</code></pre>



<p>Open that Local URL in your browser and you&#8217;ll receive an SSL warning.  Accept the risks to accept the SSL certificate generated by the plugin.</p>



<p>Once that&#8217;s done when you visit your application dev URL, you&#8217;ll see all the Vite 404 errors have disappeared and you&#8217;re left with one neat little log that tells you Vite is now connected.</p>



<pre class="wp-block-code"><code>&#91;vite] connecting... <a href="https://127.0.0.1:3000/src/client/client.ts">client.ts:16:8</a>
&#91;vite] connected. client.ts:53:14</code></pre>



<p>Hope this helps!</p>
<p>The post <a href="https://cubewebsites.com/development/laravel/how-to-using-laravel-with-vite-on-mamp/">HOW TO: Using Laravel with Vite on MAMP</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/development/laravel/how-to-using-laravel-with-vite-on-mamp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How To: Add Your WordPress Blog to the Fediverse</title>
		<link>https://cubewebsites.com/guides/how-to-add-your-wordpress-blog-to-the-fediverse/</link>
					<comments>https://cubewebsites.com/guides/how-to-add-your-wordpress-blog-to-the-fediverse/#respond</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Tue, 27 Dec 2022 22:09:51 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[fediverse]]></category>
		<category><![CDATA[mastodon]]></category>
		<guid isPermaLink="false">https://cubewebsites.com/?p=1184</guid>

					<description><![CDATA[<p>This article is based on the already well-written article on Fedi.Tips. The idea is to automatically make all your blog posts on WordPress available on the Fediverse that people can follow on their apps such as Mastodon. Caution: before doing this read the notes below around the downsides to this integration. Doing this is really [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-add-your-wordpress-blog-to-the-fediverse/">How To: Add Your WordPress Blog to the Fediverse</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>This article is based on the <a href="https://fedi.tips/the-fediverse-beyond-mastodon/" target="_blank" rel="noreferrer noopener nofollow">already well-written article on Fedi.Tips</a>.</p>



<p>The idea is to automatically make all your blog posts on WordPress available on the Fediverse that people can follow on their apps such as Mastodon.</p>



<p><strong>Caution: before doing this read the notes below around the downsides to this integration.</strong></p>



<p>Doing this is really easy&#8230;</p>



<ol class="wp-block-list">
<li>Note that this will only work on self-hosted WordPress installations</li>



<li>Note that there&#8217;s very limited configuration options</li>



<li>Install the ActivityPub for WordPress plugin</li>



<li>Activate it</li>



<li>Done &#8211; on the plugin settings page it will give you the username and URL that can be shared for others to follow.  Any new posts will start to appear to all followers.</li>
</ol>



<p><strong>Quick fix: </strong>when I installed the plugin and went to the Health Checks page, it was showing that my author page was not returning valid JSON with the error:</p>



<pre class="wp-block-code"><code>Your author URL https://cubewebsites.com/author/Cube Websites/ does not return valid JSON for application/activity+json. Please check if your hosting supports alternate Accept headers</code></pre>



<p>The reason for this issue was that the author name format in the URL is from an old version of WordPress.  To fix it all you need to do is:</p>



<ol class="wp-block-list">
<li>Connect to your database using a management tool e.g. phpMyAdmin, TablePlus etc</li>



<li>Go to the users table</li>



<li>Find your user account</li>



<li>Change the user_nicename field to a username/slug format i.e. no spaces, lowercase</li>



<li>Save the changes</li>



<li>You&#8217;ll now see that your author page starts to work and the error message goes away</li>
</ol>



<h2 class="wp-block-heading">Why do this?</h2>



<p>I only set this up to test this feature out.  It&#8217;s quite cool but extremely limited as it creates a Fediverse presence for your site with little to no control.  From what I can tell it registers your site domain as a Fediverse server to give you a unique presence.</p>



<p>The following is all missing:</p>



<ul class="wp-block-list">
<li>option to modify a post once it&#8217;s published</li>



<li>specify hashtags to include (very useful on Mastodon)</li>



<li>personalise your profile directly</li>



<li>receive notifications for any engagement with your content i.e. replies and favourites</li>



<li>changing your Fediverse address</li>
</ul>



<p>The Fediverse address, it&#8217;s always @admin@yourdomain.com which isn&#8217;t a particularly appealing good name in this world of vanity usernames.  For profiles it will pick up your profile picture from the user account, so you can modify that.  Perhaps it picks up additional fields from your WordPress user profile but I haven&#8217;t explored that far.</p>



<p>I made a post that I published without setting the category, so the URL includes the &#8216;uncategorized&#8217; slug.  After fixing this mistake, there was no way to go back and change the automatic post it&#8217;s pushed out on the Fediverse feed.</p>



<h2 class="wp-block-heading">Alternative Approaches</h2>



<ol class="wp-block-list">
<li>An easy option is to create a Fediverse account on an existing Mastodon server.  Then connect your blog to push to this account using the API via a plugin, or via the RSS feed</li>



<li>Setup your own Mastodon server so you can use your own server address instead of a general one, and then use that to push the same way as above</li>



<li>Explore Friendica which seems to have the option of making RSS Feeds into Fediverse accounts</li>
</ol>



<p>My preferred option is Option 1, and perhaps at a later date when I have the time to setup my own server, I would migrate the account to that server.  It provides the most control and personalisation and means you can use the Mastodon app to engage with readers.</p>



<p></p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-add-your-wordpress-blog-to-the-fediverse/">How To: Add Your WordPress Blog to the Fediverse</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/how-to-add-your-wordpress-blog-to-the-fediverse/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>FIX: WordPress on nginx (ERR_INCOMPLETE_CHUNKED_ENCODING)</title>
		<link>https://cubewebsites.com/guides/fix-wordpress-on-nginx-err_incomplete_chunked_encoding/</link>
					<comments>https://cubewebsites.com/guides/fix-wordpress-on-nginx-err_incomplete_chunked_encoding/#comments</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Mon, 27 Jul 2015 16:54:27 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">http://www.cubewebsites.com/blog/?p=441</guid>

					<description><![CDATA[<p>Over the weekend I was migrating several of my sites over to an nginx-based VPS.  Whilst the migration itself seemed to go fine, I was getting a weird issue with the WordPress admin where the styles and javascript was not fully loading. After inspecting the requests with the Firebug Console, I saw that the culprit [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/fix-wordpress-on-nginx-err_incomplete_chunked_encoding/">FIX: WordPress on nginx (ERR_INCOMPLETE_CHUNKED_ENCODING)</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Over the weekend I was migrating several of my sites over to an nginx-based VPS.  Whilst the migration itself seemed to go fine, I was getting a weird issue with the WordPress admin where the styles and javascript was not fully loading.</p>
<p>After inspecting the requests with the Firebug Console, I saw that the culprit was the request:</p>
<pre>/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=jquery-core,jquery-migrate,utils,plupload&amp;ver=4.2.3</pre>
<p>I tried the normal fixes such as checking permissions, updating everything, and even reinstalling WordPress but to no avail.  Then I started looking on Google for a potential fix and found <a href="http://felixmilea.com/2014/12/err_incomplete_chunked_encoding-wordpress-nginx/" target="_blank" rel="noopener">this</a> article which not only provides the solution, but also a detailed explanation of why the error occurs in the first place.</p>
<p>As soon as I made the recommended updates, all the sites started working properly with no issue whatsoever.</p>
<p>Full credit goes to the article author.  Just posting here for my own reference more than anything else!</p>
<p>UPDATE: As the original article no longer exists I&#8217;ve posted the instructions below:</p>
<p>It turns out the solution to this is quite simple. Nginx and php-fpm need to run as the same user and the directory <code>/var/lib/nginx</code> needs to be owned by that user. Personally I like to run all my web-related services under a <code>www-data</code> user, but running it under a <code>nginx</code> or <code>apache</code> user is also common. To change the user nginx runs under, edit the main nginx config file usually located at <code>/etc/nginx/nginx.conf</code>:</p>
<pre class="brush: plain; title: ; notranslate">
user www-data;
worker_processes 4;
pid runnginx.pid;
</pre>
<p>Now to change the user php-fpm runs under we need to edit its config file. On my Amazon Linux system this was located at <code>/etc/php-fpm.d/www.conf</code> while on my old Debian setup it was located at <code>/etc/php5/fpm/pool.d/www.conf</code>. There are two user-related settings in the config file. First, if php-fpm runs as a socket (as opposed to listening on a port), the user and group owner of the socket should be set to the same user as nginx so that nginx can access it to run php files. This is not relevant for our error, but can cause other issues if nginx doesnt have permissions to access the socket. Second, the user and group that the php-fpm process runs under needs to be the same as nginx.</p>
<pre class="brush: plain; title: ; notranslate">
    user  = www-data
    group = www-data
     
    listen = varrunphp5-fpm.sock
    listen.owner = www-data
    listen.group = www-dataL
</pre>
<p>To change the ownership of the nginx lib directory simply run the command <code>chown -R www-data:www-data /var/lib/nginx</code> as root (<code>sudo</code> will do on most systems). Finally, if we edited any config files, we need to restart the appropriate services for the changes to take effect. On most systems this can be done by running <code>service nginx restart</code> or <code>/etc/init.d/nginx restart</code> as root. For php-fpm the service name is <code>php5-fpm</code>.</p>
<p>The post <a href="https://cubewebsites.com/guides/fix-wordpress-on-nginx-err_incomplete_chunked_encoding/">FIX: WordPress on nginx (ERR_INCOMPLETE_CHUNKED_ENCODING)</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/fix-wordpress-on-nginx-err_incomplete_chunked_encoding/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>FIX: Telegram Webhooks Not Working</title>
		<link>https://cubewebsites.com/guides/fix-telegram-webhooks-not-working/</link>
					<comments>https://cubewebsites.com/guides/fix-telegram-webhooks-not-working/#comments</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Sat, 04 Jul 2015 11:40:35 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[telegram]]></category>
		<guid isPermaLink="false">http://www.cubewebsites.com/blog/?p=438</guid>

					<description><![CDATA[<p>Telegram messenger recently released an API that lets you easily create bots for their platform.  After deciding to have a bit of a play with it, I found that I had an issue where the webhooks would not send any updates to my server with no apparent error. The Problem I made all the following [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/fix-telegram-webhooks-not-working/">FIX: Telegram Webhooks Not Working</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Telegram messenger recently released an API that lets you easily create bots for their platform.  After deciding to have a bit of a play with it, I found that I had an issue where the webhooks would not send any updates to my server with <em>no apparent error.</em></p>
<p><strong>The Problem</strong></p>
<p>I made all the following checks:</p>
<ol>
<li>Valid SSL certificate</li>
<li>Webhook successfully registered using the Telegram setWebhook method</li>
<li>The method responded properly when I sent a test request using a REST service tester</li>
<li>Server access logs &#8211; look like Telegram had never even hit the server</li>
</ol>
<p><strong>The Solution</strong></p>
<p>After a full day of searching, testing and bashing my head against the keyboard, I found <a href="https://www.reddit.com/r/Telegram/comments/3b4z1k/bot_api_recieving_nothing_on_a_correctly/csjmj8y">this thread</a> on Reddit, where the user described a problem where a full chained certificate was required on the server, not just the server certificate.</p>
<p>To create chained certificate you&#8217;ll need to have a look at what instructions your certificate issuer provides.</p>
<p>In my case the certificate being used was a Comodo PositiveSSL, for which I downloaded all the certificates that they sent, which contained:</p>
<ul>
<li>Root CA Certificate &#8211; AddTrustExternalCARoot.crt</li>
<li>Intermediate CA Certificate &#8211; COMODORSAAddTrustCA.crt</li>
<li>Intermediate CA Certificate &#8211; COMODORSADomainValidationSecureServerCA.crt</li>
<li>Your PositiveSSL Certificate &#8211; my_domain.crt</li>
</ul>
<p>I had to combine them all into a file in the following order:</p>
<ul>
<li>my_domain.crt</li>
<li>COMODORSADomainValidationSecureServerCA.crt</li>
<li>COMODORSAAddTrustCA.crt</li>
<li>AddTrustExternalCARoot.crt</li>
</ul>
<p>For the example above the command would have been:</p>
<pre>cat my_domain.crt COMODORSADomainValidationSecureServerCA.crt AddTrustExternalCARoot.crt COMODORSAAddTrustCA.crt &gt; bundle.crt</pre>
<p>After that it was just a case of uploading the new bundle.crt to my server, updating the nginx config, and hey presto, within minutes I was receiving all the responses for my webhooks</p>
<p>The post <a href="https://cubewebsites.com/guides/fix-telegram-webhooks-not-working/">FIX: Telegram Webhooks Not Working</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/fix-telegram-webhooks-not-working/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>How To Use Impress.Js</title>
		<link>https://cubewebsites.com/guides/how-to-use-impress-js/</link>
					<comments>https://cubewebsites.com/guides/how-to-use-impress-js/#comments</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Wed, 04 Jan 2012 22:37:13 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[impress]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://www.cubewebsites.com/blog/?p=374</guid>

					<description><![CDATA[<p>Yesterday, I wrote about Impress.js, an awesome JavaScript library for creating online presentations. Since posting online, I’ve had several people ask how exactly to use it, as there’s no set documentation on the actual project page.  This guide will help you get started and allow you to create a simple slideshow, but after completing it [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-use-impress-js/">How To Use Impress.Js</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Yesterday, I <a title="Impress.js – A JavaScript Presentation Library" href="http://www.cubewebsites.com/blog/development/javascript/impress-js-a-javascript-presentation-library/">wrote about Impress.js</a>, an awesome JavaScript library for creating online presentations. Since posting online, I’ve had several people ask how exactly to use it, as there’s no set documentation on the actual project page.  This guide will help you get started and allow you to create a simple slideshow, but after completing it please bear in mind that there’s so much more that can be done with it.  The only limit is your creativity!</p>
<p>This tutorial is available for you to <a href="https://github.com/cubewebsites/Impress.js-Tutorial" target="_blank">view and download on GitHub</a></p>
<p><strong>Requirements</strong></p>
<p>To see this tutorial in action, please use Google Chrome or Safari (or Firefox 10 or IE10).  Impress.js is not currently compatible with earlier versions of Firefox or Internet Explorer.</p>
<p><strong>Setup</strong></p>
<p>The first thing you want to do is create a new webpage.  Mine’s index.html and within it setup the basic head and body elements.</p>
<pre>&lt;!doctype html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Impress Tutorial&lt;/title&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
    &lt;/head&gt;
    &lt;body&gt;

    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Add the impress.js file before the end of the body element.  This imports the Impress library into your project</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode">&lt;script type=<span class="str">"text/javascript"</span> src=<span class="str">"impress.js"</span>&gt;&lt;/script&gt;</pre>
</div>
<p>Next we’ll create a wrapper which will contain the slideshow.  This is simply a &lt;div&gt; element with an id of ‘impress’</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">id</span><span class="kwrd">="impress"</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
<p><strong>Creating Slides</strong></p>
<p>Now you’ll see how easy it is to create a new slide in the presentation.  Each slide is a &lt;div&gt; element (within the wrapper) with a class name of ‘step’</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="step"</span><span class="kwrd">&gt;</span>
    My first slide
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
</div>
<p>Whilst that creates a simple slide, things are a lot more fun you start adding data properties to your slides.  Data attributes signify properties of your slide for when it’s NOT the active slide.  The following data properties are available to you:</p>
<ul>
<li><span style="color: #404040;">data-x = the x co-ordinate of the slide</span></li>
<li><span style="color: #404040;">data-y = the y co-ordinate of the slide</span></li>
<li><span style="color: #404040;">data-z = the z co-ordinate of the slide (how far/close it appears to the user)</span></li>
<li><span style="color: #404040;">data-scale = scales your slide by a factor of this value.  A data-scale of 5 would be 5 times the original size of your slide</span></li>
<li><span style="color: #404040;">data-rotate = rotates your slide by the specified number of degrees</span></li>
<li><span style="color: #404040;">data-rotate-x = For 3D slides.  This is the number of degrees it should be rotated about the x-axis.  (Tilt forward/lean back)</span></li>
<li><span style="color: #404040;">data-rotate-y = For 3D slides. This is the number of degrees it should be rotated about the y-axis (swing in from the left/right)</span></li>
<li><span style="color: #404040;">data-rotate-z = For 3D slides. This is the number of degrees it should be rotated about the z-axis</span></li>
</ul>
<p><strong>Data Attributes In Action</strong></p>
<p>The following slide configuration will guide you through each of the data attributes in action.</p>
<p>Let’s start with an initial slide.  This slide has it’s x and y data attributes set to 0, so will appear in the center of the page.</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="step"</span> <span class="attr">data-x</span><span class="kwrd">="0"</span> <span class="attr">data-y</span><span class="kwrd">="0"</span><span class="kwrd">&gt;</span>
    This is my first slide
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
<p>The second slide will have an x position of 500, but the y position of 0.  This means that it’s going to have to come in 500 pixels across the x-axis (slide left) when it becomes active.</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="step"</span> <span class="attr">data-x</span><span class="kwrd">="500"</span> <span class="attr">data-y</span><span class="kwrd">="0"</span><span class="kwrd">&gt;</span>
    This is slide 2
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
<p>Easy huh?  The next slide will start with the same x-position as slide 2, but a y position of –400.  This will slide in from the top 400 pixels.</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="step"</span> <span class="attr">data-x</span><span class="kwrd">="500"</span> <span class="attr">data-y</span><span class="kwrd">="-400"</span><span class="kwrd">&gt;</span>
    This is slide 3
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
<p>Slide 4 uses the scale value to show how a slide can appear to zoom in/out.  It has a scale value of 0.5, meaning that it’s half the size it should be.  When it becomes active the presentation will adjust the scale of ALL the slides by the factor required to make the scale of the active website 1.  What this means in this example is that for this slide to display normally (scale value 1) it will need to be scaled up by a factor of 2 (0.5*2 = 1).  All the other slides will also be scaled up by a factor of two, and become twice the size.</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="step"</span> <span class="attr">data-x</span><span class="kwrd">="500"</span> <span class="attr">data-y</span><span class="kwrd">="-800"</span> <span class="attr">data-scale</span><span class="kwrd">="0.5"</span><span class="kwrd">&gt;</span>
    This is slide 4
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
<p>The rotate attributes allows you to rotate a slide into view.  Slide 5 is set to rotate by 90 degrees.</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="step"</span> <span class="attr">data-x</span><span class="kwrd">="0"</span> <span class="attr">data-y</span><span class="kwrd">="-800"</span> <span class="attr">data-rotate</span><span class="kwrd">="90"</span><span class="kwrd">&gt;</span>
    This is slide 5 and it rotates in.
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
<p>Finally, for a 3D transition, you can specify rotate attributes for each dimensional axis (x,y,z).</p>
<p>The x axis is the horizontal axis.  This means that you can make things tilt forwards (positive value) or backwards (negative value).<br />
The y axis is the vertical axis so you can have things swing in from the left (negative value) or right (positive value).<br />
The z axis is the depth axis (the one coming out at you) so rotating things on this would be rotating things up (negative value) and down (positive value).</p>
<p><strong>Combinations</strong></p>
<p>Now that you know all about the data attributes, which is really all you need to animate your slideshow, you can use your imagination to combine these in weird and wonderful ways to create your own style of slideshow.</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="step"</span> <span class="attr">data-x</span><span class="kwrd">="-2600"</span> <span class="attr">data-y</span><span class="kwrd">="-800"</span> <span class="attr">data-rotate-x</span><span class="kwrd">="30"</span> <span class="attr">data-rotate-y</span><span class="kwrd">="-60"</span> <span class="attr">data-rotate-z</span><span class="kwrd">="90"</span> <span class="attr">data-scale</span><span class="kwrd">="4"</span><span class="kwrd">&gt;</span>
    This is slide 7 and it has a 3D transition AND a scale.
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
<p><strong>Unsupported Browsers</strong></p>
<p>Impress automatically detects whether or not a browser supports it or not, and if it doesn’t then automatically adds a class name called ‘impress-not-supported’ to the wrapper ‘&lt;div&gt;’.  Using some CSS we can show a message to people on browsers which aren’t supported by Impress.</p>
<p>At the start of your &lt;div id=”impress”&gt; add the following:</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">="no-support-message"</span><span class="kwrd">&gt;</span>
    Your browser doesn't support impress.js.  Try Chrome or Safari.
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
</div>
<p>Then, create a stylesheet or add this to your existing stylesheet:</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<pre id="codeSnippet" class="csharpcode"><span class="cls">.no-support-message</span> { <span class="kwrd">display</span>:<span class="str">none;</span> }
<span class="cls">.impress-not-supported</span> <span class="cls">.no-support-message</span> { <span class="kwrd">display</span>:<span class="str">block;</span> }</pre>
</div>
<p>This hides the message by default, but then displays it to browser if the impress-not-supported class is present.</p>
<p><strong>Have fun!</strong></p>
<p>This tutorial covers the fundamentals of using Impress.js to create your very own online presentation.  The entire example is available on Github for you to download and play with.</p>
<p><a href="https://github.com/cubewebsites/Impress.js-Tutorial" target="_blank">View on GitHub</a></p>
<p>The post <a href="https://cubewebsites.com/guides/how-to-use-impress-js/">How To Use Impress.Js</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/how-to-use-impress-js/feed/</wfw:commentRss>
			<slash:comments>32</slash:comments>
		
		
			</item>
		<item>
		<title>TUTORIAL: Adding / Editing / Deleting Pages In Concrete5</title>
		<link>https://cubewebsites.com/guides/tutorial-adding-editing-deleting-pages-in-concrete5/</link>
					<comments>https://cubewebsites.com/guides/tutorial-adding-editing-deleting-pages-in-concrete5/#comments</comments>
		
		<dc:creator><![CDATA[Cube Websites]]></dc:creator>
		<pubDate>Tue, 27 Dec 2011 16:21:55 +0000</pubDate>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[c5]]></category>
		<category><![CDATA[concrete5]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://www.cubewebsites.com/blog/?p=280</guid>

					<description><![CDATA[<p>Concrete5 is my current CMS platform of choice.  It provides a very flexible framework for me to develop on, as well a simple and intuitive interface for end-users too. This tutorial shows you how easy it is to add/edit/delete pages on your Concrete5 Content Managed website. Adding A New Page Login to your Dashboard Select [&#8230;]</p>
<p>The post <a href="https://cubewebsites.com/guides/tutorial-adding-editing-deleting-pages-in-concrete5/">TUTORIAL: Adding / Editing / Deleting Pages In Concrete5</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Concrete5 is my current CMS platform of choice.  It provides a very flexible framework for me to develop on, as well a simple and intuitive interface for end-users too.</p>
<p>This tutorial shows you how easy it is to add/edit/delete pages on your Concrete5 Content Managed website.</p>
<p><iframe loading="lazy" src="http://www.youtube-nocookie.com/embed/1_E5JCNW6qY?rel=0&amp;hd=1&amp;wmode=transparent" frameborder="0" width="640" height="480"></iframe></p>
<p><span id="more-280"></span></p>
<h3>Adding A New Page</h3>
<ol>
<li>Login to your <strong>Dashboard</strong></li>
<li>Select the <strong>Sitemap</strong></li>
<li>Click on the page which will be the parent of your new page</li>
<li>Click <strong>Add Page</strong> from the context menu which appears</li>
<li>Select your <strong>Page Type</strong></li>
<li>Give your page a <strong>Name</strong> and <strong>Description</strong></li>
<li>Click <strong>Add Page</strong></li>
</ol>
<h3>Editing A Page</h3>
<div>
<ol>
<li>Go to the <strong>Sitemap</strong></li>
<li>Click on the page you wish to edit</li>
<li>Click <strong>Visit</strong> from the context menu which appears</li>
<li>Click <strong>Edit Mode</strong> in the top left of the toolbar</li>
<li>Click an area you wish to add your block to</li>
<li>Select <strong>Add Block</strong></li>
<li>Select the type of block you wish to add</li>
<li>Configure the options (if available)</li>
<li>Click <strong>Add</strong> to save your block</li>
<li>Repeat for as many blocks as needed</li>
<li>Once you&#8217;re happy click <strong>Exit Edit Mode</strong></li>
<li><strong>Publish</strong> your changes</li>
</ol>
<h3>Reverting To An Older Version Of A Page</h3>
<div>
<ol>
<li>Click <strong>Edit Page</strong></li>
<li>Click <strong>Versions</strong> on the toolbar</li>
<li>Check the version you wish to revert to</li>
<li>Click the <strong>Approve</strong> button</li>
<li>Check the newer version to delete</li>
<li>Click <strong>Remove</strong></li>
</ol>
<h3>Deleting A Page</h3>
<div>
<ol>
<li>Click <strong>Edit Page</strong></li>
<li>Click <strong>Move / Delete</strong></li>
<li>Click <strong>Delete Page</strong> and confirm</li>
</ol>
</div>
</div>
</div>
<p>If you&#8217;d like a Concrete5 powered Content Management System of your own, why not <a href="http://www.cubewebsites.com/contact/">get in touch</a>?</p>
<p>Stay tuned for more tutorials.</p>
<p>The post <a href="https://cubewebsites.com/guides/tutorial-adding-editing-deleting-pages-in-concrete5/">TUTORIAL: Adding / Editing / Deleting Pages In Concrete5</a> appeared first on <a href="https://cubewebsites.com">Cube Websites</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cubewebsites.com/guides/tutorial-adding-editing-deleting-pages-in-concrete5/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
