<?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>Free software &#8211; Henry Poon&#039;s Blog</title>
	<atom:link href="https://blog.henrypoon.com/blog/tag/free-software/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.henrypoon.com</link>
	<description></description>
	<lastBuildDate>Sun, 02 Oct 2022 05:08:45 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
<site xmlns="com-wordpress:feed-additions:1">83044199</site>	<item>
		<title>Installing Seafile with Docker and Apache 2</title>
		<link>https://blog.henrypoon.com/blog/2019/06/12/installing-seafile-with-docker-and-apache-2/</link>
					<comments>https://blog.henrypoon.com/blog/2019/06/12/installing-seafile-with-docker-and-apache-2/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Wed, 12 Jun 2019 07:12:42 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[9]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apache 2]]></category>
		<category><![CDATA[Apache HTTP Server]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[cloud storage]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Dia]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[DROPBOX]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[File sharing]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Gran]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Lie]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Matt]]></category>
		<category><![CDATA[Nap]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[OS-level virtualisation]]></category>
		<category><![CDATA[Page]]></category>
		<category><![CDATA[Password]]></category>
		<category><![CDATA[PATH]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Run]]></category>
		<category><![CDATA[seafile]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[System software]]></category>
		<category><![CDATA[Systemd]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[USR]]></category>
		<category><![CDATA[ypres]]></category>
		<category><![CDATA[Z]]></category>
		<guid isPermaLink="false">https://blog.henrypoon.com/?p=3509</guid>

					<description><![CDATA[Seafile is an open source file sharing software that allows its users to setup their own cloud storage at home. Think Dropbox, but self-hosted. This post is about deploying an instance of Seafile using Docker on a non-standard port (i.e. not 80 and 443). The reason to deploy the app on a non-standard port is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a rel="noreferrer noopener" aria-label="Seafile (opens in a new tab)" href="https://www.seafile.com" target="_blank">Seafile</a> is an open source file sharing software that allows its users to setup their own cloud storage at home.  Think Dropbox, but self-hosted.</p>



<p class="wp-block-paragraph">This post is about deploying an instance of Seafile using Docker on a non-standard port (i.e. not 80 and 443).  The reason to deploy the app on a non-standard port is usually because there is already another webserver running on that port (in my case Apache 2).  In such scenarios, it is necessary to set up a reverse proxy so the Seafile port can be exposed by Apache on ports 80/443.  Under typical circumstances, deploying Seafile on a standard port would mean that the app would host itself without the need for Apache 2 at all.  This post also assumes Ubuntu 16.04 as the operating system, but in theory should apply to other Linux OS&#8217;s.</p>



<p class="has-text-align-left wp-block-paragraph">The process can be split into multiple parts:</p>



<ol class="wp-block-list"><li>Setup Docker</li><li>Deploy Seafile</li><li>Configure Apache 2</li><li>Setup systemd</li><li>Setup e-mail (optional)</li><li>Backing up the image</li><li>Troubleshooting</li></ol>



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



<p class="wp-block-paragraph">This guide won&#8217;t go into depth on how to setup Docker, but rather the setup guide and more information about what Docker is can be found here: <a rel="noreferrer noopener" aria-label="https://docs.docker.com/get-started/ (opens in a new tab)" href="https://docs.docker.com/get-started/" target="_blank">https://docs.docker.com/get-started/</a></p>



<h2 class="wp-block-heading">Deploy Seafile</h2>



<p class="wp-block-paragraph">The key page in the Seafile documentation for deploying Seafile within Docker can be found here: <a href="https://github.com/haiwen/seafile-docker" target="_blank" rel="noreferrer noopener">https://github.com/haiwen/seafile-docker</a>.  The command I used is as follows:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">docker run -d --name seafile \
  -e SEAFILE_SERVER_HOSTNAME=seafile.example.com \
  -e SEAFILE_ADMIN_EMAIL=me@example.com \
  -e SEAFILE_ADMIN_PASSWORD=a_very_secret_password \
  -v /opt/seafile-data:/shared \
  -p 8000:80 \
  seafileltd/seafile:latest</code></pre>



<p class="wp-block-paragraph">I recommend setting up Seafile with an actual secret password because it&#8217;s not easy to change once it&#8217;s set up.</p>



<p class="wp-block-paragraph">Note that the port argument shows 8000:80.  It means that Docker will use the host port 8000 and the container will use port 80 &#8211; meaning that using Docker will interpret requests from my host OS on port 8000 as requests on port 80 in the container.  8000 was used on my setup because port 80 was already used. </p>



<p class="wp-block-paragraph">Once the command is executed, the necessary files will be downloaded and the container will start and will be accessible on port 8000.</p>



<p class="wp-block-paragraph">There is also an option to setup Seafile with an SSL cert from <a rel="noreferrer noopener" aria-label="Let's Encrypt (opens in a new tab)" href="https://letsencrypt.org/" target="_blank">Let&#8217;s Encrypt</a>, but I didn&#8217;t do this because I already had a cert that I wanted to reuse.</p>



<p class="wp-block-paragraph">Once the server is up, navigate to <a href="#">https://seafile.example.com/sys/settings/</a> and change SERVICE_URL and FILE_SERVER_URL to match your domain name.</p>



<h2 class="wp-block-heading">Configure Apache 2</h2>



<p class="wp-block-paragraph">Adding a reverse proxy on Apache 2 will allow Apache 2 to route requests to port 8000, which will go to port 80 in the container.  The main reference for this section is this: <a href="https://manual.seafile.com/deploy/deploy_with_apache/" target="_blank" rel="noreferrer noopener">https://manual.seafile.com/deploy/deploy_with_apache/</a>.  This is done by adding a new site to Apache 2.  The following configuration assumes that a LetsEncrypt SSL certificate is used.</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">cd /etc/apache2/sites-available
sudo nano seafile.conf</code></pre>



<pre class="wp-block-code"><code lang="apacheconf" class="language-apacheconf">&lt;IfModule mod_ssl.c&gt;
&lt;VirtualHost *:443&gt;
    ServerName seafile.example.com
    ServerAdmin me@example.com

    RewriteEngine On

    # ModSecurity does not process requests.  There is a hard limit of 1 GB
    # with ModSecurity.
    SecRuleEngine Off

    # Whitelist internal IPs for mod_evasive
    DOSWhitelist 192.168.1.*

    &lt;Location /media&gt;
        Require all granted
    &lt;/Location&gt;

    # Stuff for seafile server
    ProxyPass /seafhttp http://127.0.0.1:8082
    ProxyPassReverse /seafhttp http://127.0.0.1:8082
    RewriteRule ^/seafhttp - [QSA,L]

    # Stuff for seahub
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8000/
    ProxyPassReverse / http://127.0.0.1:8000/

    ErrorLog ${APACHE_LOG_DIR}/seafile_error.log
    CustomLog ${APACHE_LOG_DIR}/seafile_access.log combined

    Include /etc/letsencrypt/options-ssl-apache.conf

    SSLCertificateFile /path/to/cert/file.pem
    SSLCertificateKeyFile /path/to/cert/key/file.pem
&lt;/VirtualHost&gt;
&lt;/IfModule&gt;
</code></pre>



<p class="wp-block-paragraph">I&#8217;ve added my local domain to the whitelist so that mod_evasive doesn&#8217;t think my local host is a threat.</p>



<p class="wp-block-paragraph">There are two sets of ProxyPass and ProxyPassReverse lines.  The reason for this is that Seafile is split up into Seahub and Seafile, where one uses port 8082 (by default), while the other uses 8000.  These two lines are essentially what allows Apache to read requests from port 443 and pass them on to the container.</p>



<p class="wp-block-paragraph">Once the file is saved, execute the following</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo a2ensite seafile.conf
sudo service apache2 reload</code></pre>



<p class="wp-block-paragraph">Navigating to the site at the Apache 2 defined port should now load Seafile without having to go to port 8000.</p>



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



<p class="wp-block-paragraph">systemd allows the Docker container to be started up on boot, and be controlled like this:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo service seafile start/stop/restart</code></pre>



<p class="wp-block-paragraph">The configuration is as follows:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo nano /etc/systemd/system/seafile.service</code></pre>



<pre class="wp-block-code"><code lang="properties" class="language-properties">[Unit]
Description=Seafile Server
After=network.target mysql.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker container start seafile
ExecStop=/usr/bin/docker container stop seafile
ExecReload=/usr/bin/docker container restart seafile
RemainAfterExit=yes
User=root
Group=root

[Install]
WantedBy=multi-user.target</code></pre>



<p class="wp-block-paragraph">Once the configuration is saved, shut off the existing running instance of Seafile and then let systemd start it up for you.</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo systemctl daemon-reload
sudo service seafile start</code></pre>



<p class="wp-block-paragraph">At this point, Seafile should start automatically on boot, with Apache 2 doing a reverse proxy to the true Seafile port.</p>



<h2 class="wp-block-heading">Setup e-mail (optional)</h2>



<p class="wp-block-paragraph">Optionally, Seafile can be configured to send e-mails.  The reference is here: <a href="https://manual.seafile.com/config/sending_email/" target="_blank" rel="noreferrer noopener">https://manual.seafile.com/config/sending_email/</a>.  The config file should be under:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">/opt/seafile-data/seafile/conf/seahub_settings.py</code></pre>



<p class="wp-block-paragraph">I happen to be using Gmail SMTP, so at the end of the file I&#8217;ve added</p>



<pre class="wp-block-code"><code lang="properties" class="language-properties">EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'me@example.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = EMAIL_HOST_USER</code></pre>



<h2 class="wp-block-heading">Backing up the image</h2>



<p class="wp-block-paragraph">After setting everything up, you&#8217;ll probably want to backup the Docker image.  First, print out the list of running containers</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo docker ps</code></pre>



<p class="wp-block-paragraph">Then take a snapshot of the current running state:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">docker commit -p &lt;container ID&gt; &lt;whatever you want to call this snapshot&gt;</code></pre>



<p class="wp-block-paragraph">Running this command lists all the images and should show this newly saved image:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo docker images</code></pre>



<p class="wp-block-paragraph">I don&#8217;t have a private docker repository, so I saved the image to the disk and backed up the file by doing the below.  Just make sure to actually move the image to an actual backup location.</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo docker save -o &lt;whatever path you want&gt;/&lt;filename&gt;.tar &lt;the name used earlier&gt;</code></pre>



<p class="wp-block-paragraph">The image should be backed up now.  To restore the image, it&#8217;s a matter of running this:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo docker load -i &lt;path to the backup file&gt;</code></pre>



<p class="wp-block-paragraph">Listing the images as above should show that the image was successfully loaded.  Running this starts it back up again.</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo docker run &lt;container name&gt;</code></pre>



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



<p class="wp-block-paragraph">Seafile logs can be helpful if it doesn&#8217;t start up correctly.  These can be found at:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">/opt/seafile-data/logs/seafile</code></pre>



<p class="wp-block-paragraph">There may be a need to ssh into the Docker container.  The command for that is:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo docker exec -it seafile /bin/bash</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2019/06/12/installing-seafile-with-docker-and-apache-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3509</post-id>	</item>
		<item>
		<title>Running Selenium Webdriver on Bash for Windows</title>
		<link>https://blog.henrypoon.com/blog/2017/06/18/running-selenium-webdriver-on-bash-for-windows/</link>
					<comments>https://blog.henrypoon.com/blog/2017/06/18/running-selenium-webdriver-on-bash-for-windows/#comments</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Sun, 18 Jun 2017 20:02:23 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[Drive]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Graphical user interface testing]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[ise]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[lamb]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Run]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[Sleep]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[USR]]></category>
		<category><![CDATA[Variable]]></category>
		<category><![CDATA[Vol]]></category>
		<category><![CDATA[Web browsers]]></category>
		<category><![CDATA[Web development software]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Xming]]></category>
		<guid isPermaLink="false">https://blog.henrypoon.com/?p=2711</guid>

					<description><![CDATA[NOTE: This article is for WSL1, for WSL2, see this post Bash for Windows has been working pretty great for me until I needed to run Selenium Webdriver on it. I quickly learned that it wouldn&#8217;t work just work right out of the box, and the set up for it is quite convoluted. You will [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">NOTE: This article is for WSL1, for WSL2, see <a href="https://blog.henrypoon.com/blog/2020/09/27/running-selenium-webdriver-on-wsl2/" target="_blank" rel="noreferrer noopener">this post</a></p>



<p class="wp-block-paragraph">Bash for Windows has been working pretty great for me until I needed to run Selenium Webdriver on it. I quickly learned that it wouldn&#8217;t work just work right out of the box, and the set up for it is quite convoluted.</p>



<p class="wp-block-paragraph">You will need</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" href="https://msdn.microsoft.com/en-us/commandline/wsl/install_guide" target="_blank">Bash for Windows</a></li><li><a rel="noreferrer noopener" href="https://sourceforge.net/projects/xming/" target="_blank">Xming</a> &#8211; This will actually allow the Window to appear on the screen</li><li><a rel="noreferrer noopener" href="https://github.com/mozilla/geckodriver/releases" target="_blank">geckodriver</a> &#8211; Selenium now needs this to run Firefox</li></ul>



<h2 class="wp-block-heading">Bash setup</h2>



<p class="wp-block-paragraph">Install Firefox:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo apt-get install firefox</code></pre>



<p class="wp-block-paragraph">Export DISPLAY variable in ~/.bashrc. Just add this to the ~/.bashrc:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">export DISPLAY=:0</code></pre>



<h2 class="wp-block-heading">Xming setup</h2>



<p class="wp-block-paragraph">Just download it from the link above and run it.</p>



<h2 class="wp-block-heading">Download geckodriver</h2>



<p class="wp-block-paragraph">Download geckodriver from the link above and put in the /usr/bin/ folder in Bash for Windows.</p>



<h2 class="wp-block-heading">Running Selenium</h2>



<p class="wp-block-paragraph">Here is a piece of sample Python code I used to setup the web browser. It will setup the browser, open Google, sit there for 10 seconds and then quit.&nbsp; Make sure to have Xming running otherwise the browser isn&#8217;t going to start.</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import time

from selenium import webdriver
from selenium.webdriver import DesiredCapabilities

def execute_with_retry(method, max_attempts):
    e = None
    for i in range(0, max_attempts):
        try:
            return method()
        except Exception as e:
            print(e)
            time.sleep(1)
    if e is not None:
        raise e

capabilities = DesiredCapabilities.FIREFOX
capabilities["marionette"] = True
firefox_bin = "/usr/bin/firefox"
browser = execute_with_retry(lambda: webdriver.Firefox(
    firefox_binary=firefox_bin, capabilities=capabilities), 10)

browser.get("https://www.google.com")

time.sleep(10)

browser.close()</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2017/06/18/running-selenium-webdriver-on-bash-for-windows/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2711</post-id>	</item>
		<item>
		<title>Migrating a WordPress blog from WordPress.com to WordPress.org</title>
		<link>https://blog.henrypoon.com/blog/2015/04/03/migrating-a-wordpress-blog-from-wordpress-com-to-wordpress-org/</link>
					<comments>https://blog.henrypoon.com/blog/2015/04/03/migrating-a-wordpress-blog-from-wordpress-com-to-wordpress-org/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Fri, 03 Apr 2015 20:44:57 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blog software]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Digital media]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[followers]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[Installation]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[Matt]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[Over]]></category>
		<category><![CDATA[Plug]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[site stats]]></category>
		<category><![CDATA[STR]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[tuna]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[URL redirection]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[World Wide Web]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[Z]]></category>
		<guid isPermaLink="false">https://www.henrypoon.com/blog/?p=2063</guid>

					<description><![CDATA[Since a few months ago, I migrated my blog from the previous free installation of WordPress that WordPress.com&#160;offered, to the self-hosted installation offered by WordPress.org&#160;(note that one is .org and the other is .com). &#160;Here are just a few of the key differences stated briefly: Self hosted installations allow greater control over what plugins the [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Since a few months ago, I migrated my blog from the previous free installation of WordPress that <a href="http://www.wordpress.com" target="_blank" rel="noopener noreferrer">WordPress.com</a>&nbsp;offered, to the self-hosted installation offered by <a href="http://www.wordpress.org" target="_blank" rel="noopener noreferrer">WordPress.org</a>&nbsp;(note that one is .org and the other is .com). &nbsp;Here are just a few of the key differences stated briefly:</p>
<ul>
<li>Self hosted installations allow greater control over what plugins the blog uses, what domain name to use, monetization, among other things</li>
<li>The cost is the added time required to tweak to do the setup and customisation</li>
</ul>
<p>After I chose to switch to the self-hosted installation, I faced the problem of having to migrate all of my content, site&nbsp;stats, and followers. &nbsp;I also had to set up proper URL redirection to the new website. &nbsp;Most of the guides I read did answer how to migrate content, and set up URL redirects, but it was not so clear as to how to migrate my site&nbsp;stats and followers.</p>
<h1>Content Migration</h1>
<p>For migrating content, the WordPress.com blog allows exporting blog content into a file to be imported into the new WordPress installation. &nbsp;Steps 1 to 3 in this guide illustrate the process:&nbsp;<a href="http://www.wpbeginner.com/wp-tutorials/how-to-properly-move-your-blog-from-wordpress-com-to-wordpress-org/" target="_blank" rel="noopener noreferrer">http://www.wpbeginner.com/wp-tutorials/how-to-properly-move-your-blog-from-wordpress-com-to-wordpress-org/</a></p>
<h1>Migrating Site&nbsp;Stats and Followers</h1>
<p>Migrating site stats and followers requires installing the <a href="https://wordpress.org/plugins/jetpack/" target="_blank" rel="noopener noreferrer">Jetpack</a>&nbsp;addon and linking it to the WordPress.com account (so that the self-hosted WP and the existing WP blog are connected). &nbsp;Afterward, a support thread has to be made on WordPress.com to ask WP staff to do the rest of the migration (there seems to be no other way). &nbsp;I found the information on how to do this at this site: <a href="http://wordpress.stackexchange.com/questions/161633/migrating-stats-from-wordpress-com-blog-to-self-hosted-wordpress-org-blog" target="_blank" rel="noopener noreferrer">http://wordpress.stackexchange.com/questions/161633/migrating-stats-from-wordpress-com-blog-to-self-hosted-wordpress-org-blog</a>. &nbsp;The post I made for my own site migration is <a href="https://en.forums.wordpress.com/topic/transferring-stats-and-subscribers-from-wordpresscom-to-self-hosted-wordpress?replies=8" target="_blank" rel="noopener noreferrer">here</a>.</p>
<h1>Setting Up URL Redirection</h1>
<p>This part costs money unfortunately. &nbsp;I paid ~$17 CAD for this so that my own URL would be redirected for the new one. &nbsp;If redirection isn&#8217;t required, then there is no need to buy anything. &nbsp;The setup is pretty straight forward. &nbsp;After buying the redirect, it is just a matter of setting the destination WordPress site to go to. &nbsp;Reference link here:&nbsp;<a href="https://en.support.wordpress.com/site-redirect/" target="_blank" rel="noopener noreferrer">https://en.support.wordpress.com/site-redirect/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2015/04/03/migrating-a-wordpress-blog-from-wordpress-com-to-wordpress-org/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2063</post-id>	</item>
		<item>
		<title>Deleted IME&#8217;s still appear in the list even though they have been removed in Ubuntu 14.04</title>
		<link>https://blog.henrypoon.com/blog/2015/02/15/deleted-imes-still-appear-in-the-list-even-though-they-have-been-removed-in-ubuntu-14-04/</link>
					<comments>https://blog.henrypoon.com/blog/2015/02/15/deleted-imes-still-appear-in-the-list-even-though-they-have-been-removed-in-ubuntu-14-04/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Mon, 16 Feb 2015 04:30:16 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Chinese input methods for computers]]></category>
		<category><![CDATA[Configuration management]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Dconf]]></category>
		<category><![CDATA[driving]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Japan]]></category>
		<category><![CDATA[Run]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[System software]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.henrypoon.com/blog/?p=2046</guid>

					<description><![CDATA[I had this weird problem when my Japanese and Chinese IME stayed in my IME list even though I had removed them. &#160;It was driving me nuts, but it turns out that they can be disabled through the dconf-editor First, run: Navigate to: Bold options are options that have been modified. &#160;The interesting one is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I had this weird problem when my Japanese and Chinese IME stayed in my IME list even though I had removed them. &nbsp;It was driving me nuts, but it turns out that they can be disabled through the dconf-editor</p>



<p class="wp-block-paragraph">First, run:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo apt-get install dconf-editor</code></pre>



<p class="wp-block-paragraph">Navigate to:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">org/gnome/desktop/applications/input-sources</code></pre>



<p class="wp-block-paragraph">Bold options are options that have been modified. &nbsp;The interesting one is the row labeled &#8220;sources&#8221;. &nbsp;Clear the entries of the IME&#8217;s that should not appear in the list and that should remove the IME&#8217;s that shouldn&#8217;t be appearing.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2015/02/15/deleted-imes-still-appear-in-the-list-even-though-they-have-been-removed-in-ubuntu-14-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2046</post-id>	</item>
		<item>
		<title>Setting Up Trac with Visual SVN Server</title>
		<link>https://blog.henrypoon.com/blog/2014/08/23/setting-up-trac-with-visual-svn-server/</link>
					<comments>https://blog.henrypoon.com/blog/2014/08/23/setting-up-trac-with-visual-svn-server/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Sun, 24 Aug 2014 05:11:37 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[Apache Subversion]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[PATH]]></category>
		<category><![CDATA[Plan]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Run]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[STR]]></category>
		<category><![CDATA[Struct]]></category>
		<category><![CDATA[Superuser]]></category>
		<category><![CDATA[Team]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[Visual SVN Server]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/setting-up-trac-with-visual-svn-server</guid>

					<description><![CDATA[Bug trackers are an important part of developing software as it allows teams to manage bugs, features, planning etc. &#160;There are a lot to choose from out there, but out of curiosity I decided to set up my own. &#160;I chose to use Trac for this purpose. &#160;Since I already use Visual SVN Server, I [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bug trackers are an important part of developing software as it allows teams to manage bugs, features, planning etc. &nbsp;There are a lot to choose from out there, but out of curiosity I decided to set up my own. &nbsp;I chose to use Trac for this purpose. &nbsp;Since I already use Visual SVN Server, I was able to set up Trac with Visual SVN. &nbsp;<strong>All instructions in this post use Windows.</strong></p>



<h1 class="wp-block-heading">Setup</h1>



<p class="wp-block-paragraph">I pretty much used the instructions here:&nbsp;http://www.visualsvn.com/server/trac/. &nbsp;I didn&#8217;t do step 8 written in the instructions, and it still worked for me. &nbsp;However, what&#8217;s not setup is the Trac administrator account. &nbsp;After the setup, I was able to access the Trac webapp and was also able to view the SVN logs, revisions, etc. &nbsp;I initially got a message about &#8220;no changesets&#8221;, but after a commit to the repo, everything showed up on the webapp.</p>



<h1 class="wp-block-heading">Setting up the admin account</h1>



<p class="wp-block-paragraph">While the above instructions allow you to login to Trac using the existing SVN credentials, that user is not considered an admin user.  All I had to do was run this command:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">trac-admin /path/to/projenv permission add bob TRAC_ADMIN</code></pre>



<p class="wp-block-paragraph">After restarting the server, the admin tab was available in Trac. &nbsp;Now Trac is available for use for bug tracking with an existing SVN repo!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2014/08/23/setting-up-trac-with-visual-svn-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1905</post-id>	</item>
		<item>
		<title>Disappearing Firefox Icons</title>
		<link>https://blog.henrypoon.com/blog/2011/06/20/disappearing-firefox-icons/</link>
					<comments>https://blog.henrypoon.com/blog/2011/06/20/disappearing-firefox-icons/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Mon, 20 Jun 2011 15:51:37 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[9]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Firefox version history]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Search]]></category>
		<category><![CDATA[Icon]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Laptop]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Page]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Vol]]></category>
		<category><![CDATA[Web browsers]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/disappearing-firefox-icons</guid>

					<description><![CDATA[Here&#8217;s a quick post about resolving an issue about the Firefox icon disappearing and showing a generic Windows icon. It came up while I set up my laptop, A quick Google search gave me a solution. It involves rebuilding the Windows 7 Icon Cache. Link: http://www.heerengandhi.com/2009/07/29/firefox-icon-went-missing-in-windows-7-heres-a-fix/comment-page-1/]]></description>
										<content:encoded><![CDATA[<p>Here&#8217;s a quick post about resolving an issue about the Firefox icon disappearing and showing a generic Windows icon.  It came up while I set up my laptop, A quick Google search gave me a solution.  It involves rebuilding the Windows 7 Icon Cache.</p>
<p>Link: <a href="http://www.heerengandhi.com/2009/07/29/firefox-icon-went-missing-in-windows-7-heres-a-fix/comment-page-1/" target="_blank" rel="noopener noreferrer">http://www.heerengandhi.com/2009/07/29/firefox-icon-went-missing-in-windows-7-heres-a-fix/comment-page-1/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2011/06/20/disappearing-firefox-icons/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1075</post-id>	</item>
		<item>
		<title>WordPress Proofreading Settings</title>
		<link>https://blog.henrypoon.com/blog/2010/02/18/wordpress-proofreading-settings/</link>
					<comments>https://blog.henrypoon.com/blog/2010/02/18/wordpress-proofreading-settings/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Thu, 18 Feb 2010 09:14:04 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Computing]]></category>
		<category><![CDATA[Content management systems]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Dashboard]]></category>
		<category><![CDATA[Digital technology]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Proofreading]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/wordpress-proofreading-settings</guid>

					<description><![CDATA[That WordPress proofreader has become very annoying. You can configure the proofreading feature by going to&#160;My Account -&#62;&#160;Edit Profile from the Dashboard.]]></description>
										<content:encoded><![CDATA[<p>That WordPress proofreader has become very annoying.</p>
<p>You can configure the proofreading feature by going to&nbsp;<strong>My Account</strong> -&gt;&nbsp;<strong>Edit Profile </strong>from the Dashboard.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2010/02/18/wordpress-proofreading-settings/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">244</post-id>	</item>
		<item>
		<title>Previous Posts have the Wrong Timezone</title>
		<link>https://blog.henrypoon.com/blog/2009/12/03/previous-posts-have-the-wrong-timezone/</link>
					<comments>https://blog.henrypoon.com/blog/2009/12/03/previous-posts-have-the-wrong-timezone/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Thu, 03 Dec 2009 19:00:51 +0000</pubDate>
				<category><![CDATA[random]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blog hosting services]]></category>
		<category><![CDATA[Blog software]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Digital media]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[World Wide Web]]></category>
		<category><![CDATA[Z]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/previous-posts-have-the-wrong-timezone</guid>

					<description><![CDATA[For some reason when I imported my Blogger posts into WordPress, the timezones changed.&#160; It must have been because I never changed the timezone of the WordPress blog before I imported.&#160; This issue affects all the posts before this one.&#160; The correct time should be whatever time it says on the post minus eight.&#160; This [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>For some reason when I imported my Blogger posts into WordPress, the timezones changed.&nbsp; It must have been because I never changed the timezone of the WordPress blog before I imported.&nbsp; This issue affects all the posts before this one.&nbsp; The correct time should be whatever time it says on the post minus eight.&nbsp; This time is also consistent with the timezone shift from GMT to Pacific Time.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2009/12/03/previous-posts-have-the-wrong-timezone/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">50</post-id>	</item>
		<item>
		<title>Another Day at Work + Japadogs</title>
		<link>https://blog.henrypoon.com/blog/2009/11/17/another-day-at-work-japadogs/</link>
					<comments>https://blog.henrypoon.com/blog/2009/11/17/another-day-at-work-japadogs/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Tue, 17 Nov 2009 00:20:00 +0000</pubDate>
				<category><![CDATA[food]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blog software]]></category>
		<category><![CDATA[Content management systems]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Digital media]]></category>
		<category><![CDATA[dog]]></category>
		<category><![CDATA[Dogs]]></category>
		<category><![CDATA[Final]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Japan]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/another-day-at-work-japadogs</guid>

					<description><![CDATA[Just another day at work.&#160; Slept in tutorial, surfed the Internet.&#160; What was different though was that we finally got an update on the CMS implementation.&#160; On the agenda now is setting up the wordpress blog and the new navigation system. Japadogs were at UBC today.&#160; After wrestling with my impulses I decided that I [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Just another day at work.&nbsp; Slept in tutorial, surfed the Internet.&nbsp; What was different though was that we finally got an update on the CMS implementation.&nbsp; On the agenda now is setting up the wordpress blog and the new navigation system.</p>
<p>Japadogs were at UBC today.&nbsp; After wrestling with my impulses I decided that I wouldn&#8217;t buy one.&nbsp; Even if they were incredibly good Japanese style hot dogs.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2009/11/17/another-day-at-work-japadogs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">12</post-id>	</item>
	</channel>
</rss>
