<?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>IOS &#8211; Henry Poon&#039;s Blog</title>
	<atom:link href="https://blog.henrypoon.com/blog/tag/ios/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.henrypoon.com</link>
	<description></description>
	<lastBuildDate>Wed, 05 Oct 2022 02:49:34 +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>&#8220;The Cyclist&#8217;s Training Bible&#8221; by Joe Friel &#8211; Chapter 2 summary &#8211; Physical performance</title>
		<link>https://blog.henrypoon.com/blog/2020/05/12/the-cyclists-training-bible-by-joe-friel-chapter-2-summary-physical-performance/</link>
					<comments>https://blog.henrypoon.com/blog/2020/05/12/the-cyclists-training-bible-by-joe-friel-chapter-2-summary-physical-performance/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Wed, 13 May 2020 04:26:39 +0000</pubDate>
				<category><![CDATA[books]]></category>
		<category><![CDATA[Aerobic exercise]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Branches of biology]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Cycling]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Dia]]></category>
		<category><![CDATA[Drive]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Economy]]></category>
		<category><![CDATA[Exercise]]></category>
		<category><![CDATA[Exercise physiology]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Joe Friel]]></category>
		<category><![CDATA[Lactate threshold]]></category>
		<category><![CDATA[Lie]]></category>
		<category><![CDATA[Over]]></category>
		<category><![CDATA[PATH]]></category>
		<category><![CDATA[Physical exercise]]></category>
		<category><![CDATA[Printer]]></category>
		<category><![CDATA[rain]]></category>
		<category><![CDATA[Respiratory physiology]]></category>
		<category><![CDATA[Sports]]></category>
		<category><![CDATA[STR]]></category>
		<category><![CDATA[Struct]]></category>
		<category><![CDATA[The Go]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[VO2 max]]></category>
		<category><![CDATA[Z]]></category>
		<guid isPermaLink="false">https://blog.henrypoon.com/?p=5900</guid>

					<description><![CDATA[This is summary of chapter 2 of Joe Friel&#8217;s &#8220;The Cyclist&#8217;s Training Bible&#8221;. This chapter discusses the physical component of high performance cycling. The right stuff There are three markers of endurance fitness: aerobic capacity, anaerobic threshold, and economy Aerobic capacity: AKA &#8220;VO2max&#8221;, is a measure of how much oxygen you are capable of using [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This is summary of chapter 2 of Joe Friel&#8217;s &#8220;The Cyclist&#8217;s Training Bible&#8221;. This chapter discusses the physical component of high performance cycling.</p>



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



<p class="wp-block-paragraph">There are three markers of endurance fitness: aerobic capacity, anaerobic threshold, and economy</p>



<ul class="wp-block-list"><li>Aerobic capacity: AKA &#8220;VO2max&#8221;, is a measure of how much oxygen you are capable of using when riding at a maximal effort for a few minutes</li><li>Anaerobic threshold: the percentage of your aerobic capacity that you are capable of sustaining for a long time, such as 40 to 70 minutes</li><li>Economy: tied to all metrics of performance in that it has to do with how much energy you waste while riding (e.g. physical structure, pedaling style, position on the bike, and bike-handling skills)</li></ul>



<h3 class="wp-block-heading">Power duration curve and phenotype</h3>



<p class="wp-block-paragraph">This is a huge generalization, but it shows that performance can be predicted from metrics</p>



<ul class="wp-block-list"><li>Climbers: can maintain high power outputs even over long durations. Best predictor of success is power to weight ratio</li><li>Sprinters: even higher power outputs with short bursts but drops off quickly over long durations</li><li>Time trialists: Best predictor of success is power at anaerobic threshold. Aerodynamic drag is the biggest obstacle since often courses are quite flat</li><li>All-rounders: someone who is pretty good at at least two of the above and they are often contenders when course conditions don&#8217;t favour the specialists</li></ul>



<h2 class="wp-block-heading">Training beliefs</h2>



<p class="wp-block-paragraph">The athlete must have faith that he is going down the right path for training, and follow the path beginning to end</p>



<p class="wp-block-paragraph">Some people respond quickly, while some slowly.  Some people have muscles made for endurance while others made for power, and it&#8217;s the rider&#8217;s job to adjust his training based on what he&#8217;s know about himself.</p>



<p class="wp-block-paragraph">Training is always a moving target &#8211; what worked last season may not produce the same results</p>



<h2 class="wp-block-heading">Four steps to training with a purpose</h2>



<p class="wp-block-paragraph">There is no one-size fits all way of training</p>



<ol class="wp-block-list"><li>Clear goal &#8211; well-defined goal drives training outcome.  Even workouts need to have a goal.  The combination of the workout goals ultimately point to the season&#8217;s goal</li><li>Expert instruction &#8211; e.g coach, mentor, training partner, or even yourself (i.e. by reading this book)</li><li>Specific practice &#8211; Everything done should follow the goal and the expert instruction.  Training alone is ideal as it allows control over all aspects of workout without accounting for someone else</li><li>Immediate feedback &#8211; Review data as the workout is happening or immediately after.  Need to stay mentally engaged with how one feels during workout</li></ol>



<p class="wp-block-paragraph">Previous: <a rel="noreferrer noopener" href="https://blog.henrypoon.com/blog/2020/05/02/the-cyclists-training-bible-by-joe-friel-chapter-1-summary-mental-performance" target="_blank">Chapter 1 – Mental performance</a><br>Chapter list: <a rel="noreferrer noopener" href="https://blog.henrypoon.com/blog/2020/05/02/the-cyclists-training-bible-by-joe-friel-chapter-summaries/" target="_blank">Chapter summaries</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2020/05/12/the-cyclists-training-bible-by-joe-friel-chapter-2-summary-physical-performance/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5900</post-id>	</item>
		<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>Singapore</title>
		<link>https://blog.henrypoon.com/blog/2018/01/04/singapore/</link>
					<comments>https://blog.henrypoon.com/blog/2018/01/04/singapore/#comments</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Fri, 05 Jan 2018 05:58:22 +0000</pubDate>
				<category><![CDATA[asia]]></category>
		<category><![CDATA[food]]></category>
		<category><![CDATA[Animals]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Aquarium]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[China]]></category>
		<category><![CDATA[Chinatown]]></category>
		<category><![CDATA[Coconut]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Const]]></category>
		<category><![CDATA[Cuisine]]></category>
		<category><![CDATA[Cuisine by country]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Dia]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Find]]></category>
		<category><![CDATA[fish]]></category>
		<category><![CDATA[Food and drink]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Hainanese chicken rice]]></category>
		<category><![CDATA[Hindu temple]]></category>
		<category><![CDATA[Hole]]></category>
		<category><![CDATA[Hong Kong]]></category>
		<category><![CDATA[Icon]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[india]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Laksa]]></category>
		<category><![CDATA[Lie]]></category>
		<category><![CDATA[Light]]></category>
		<category><![CDATA[Malay cuisine]]></category>
		<category><![CDATA[Mass]]></category>
		<category><![CDATA[Merlion]]></category>
		<category><![CDATA[National dishes]]></category>
		<category><![CDATA[Noodle]]></category>
		<category><![CDATA[noodles]]></category>
		<category><![CDATA[Perspective]]></category>
		<category><![CDATA[Philippine cuisine]]></category>
		<category><![CDATA[Pho]]></category>
		<category><![CDATA[Plan]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[rain]]></category>
		<category><![CDATA[Resort]]></category>
		<category><![CDATA[Ribs]]></category>
		<category><![CDATA[rice]]></category>
		<category><![CDATA[Rooms]]></category>
		<category><![CDATA[Sauce]]></category>
		<category><![CDATA[Singapore]]></category>
		<category><![CDATA[Singaporean cuisine]]></category>
		<category><![CDATA[Sleep]]></category>
		<category><![CDATA[soup]]></category>
		<category><![CDATA[spices]]></category>
		<category><![CDATA[STR]]></category>
		<category><![CDATA[Street food]]></category>
		<category><![CDATA[Temple]]></category>
		<category><![CDATA[Thai cuisine]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[universal studios]]></category>
		<category><![CDATA[Urge]]></category>
		<category><![CDATA[Vancouver]]></category>
		<category><![CDATA[Z]]></category>
		<category><![CDATA[Zoo]]></category>
		<guid isPermaLink="false">https://blog.henrypoon.com/?p=2861</guid>

					<description><![CDATA[I try to always go somewhere new, and this trip to Hong Kong presented an opportunity to visit Singapore. I heard many people rave about it, and had to go there for myself. After a mishap where the airline assigned the same seat to different people, my mom and I each got 3 seats at [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I try to always go somewhere new, and this trip to Hong Kong presented an opportunity to visit Singapore. I heard many people rave about it, and had to go there for myself. After a mishap where the airline assigned the same seat to different people, my mom and I each got 3 seats at the back of the plane to ourselves and for the first time, I got to lie down horizontally with my legs stretched out to sleep!</p>
<p>This is probably the most iconic area in Singapore &#8211; Marina Bay. Starting with the Merlion, we toured around the bay. I didn&#8217;t actually understand what a Merlion was until I saw the actual statue.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipNJjPVkpdE6-jD9zItQ1CthRgeTkyLxswBGZaMs" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/BbmjtNq47HVpLHncUAKP8CSUwklNHdjfX71vXZ0-cDhWFRxYIIjFYqSXPdYjtwD08-jiCaiOhChFozAyBraSUiiKFyucZ1S96OhYkR32uH22-XfM-Tani8uLZ1Tf4pJ-GImiyhxFWeLHoqpifTqdTOgk8fdEwHE0UIGuITDASAwWIap3RLz-D8A34ZLTBEm8eTQwnQwVDmSdkGTyYNKIWH87Qcb-EUTU4h-rH4ugnzSJj1J4LBiBtYoQBASvf-u_WpxN_CwqVxvQq_SUXhgicU3cCznAYdp7HD2B7ZM0xL2osOo9l5CjUeNwazfUKVeO0BLlZQDkShEoy2WNw54rtrqHLD2jkTrvsgtdFAIWGneO2X4lDVori1TuYyfI_FtJJERsDOEOtIGFSX1AwYPBCWEr3fraVHK_UX8YEwHo_Lu0EexLSe_28-5ED9XmKHg_w5IMUQowPVVbNDgp_JsDEYxDktpVnbxzL7wOjZK5iYIcUlDRRviz9Hg55C1r8TvkI-TP-RQhRBVyxELPGc8qxSyzKnJ3h6jt78cEzqmSmPySJgszBFpMYRAZMeYV0sLXAskW5PX9Uah_thbfLAP6O_zD7HG4-CWCiiIStvg5=w1680-h945-no" alt="" /></a></p>
<p>The placement of all the buildings and the water was so perfect for photos!! This area is a must-go.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipMs8y0_vQiBPI1IoNSK1VZYnNuqc6qsiiGAVTGd" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/3RGLGi80IeHV3z67gxfydltei8nMRGjgWYNsEYSdcjNaI92fzsQp3hBgh1b8nrnWAQWCl7jKqKiLLYW-t9y3J2ayZ08MOIsHqcoM-JxIGWLpN7I9aE_fS23ZVPTI1ahwiTWKoZHH3S0Y5GcNFcg_hamTdyo4Hv6CxqaSMF3xfqMJ4mM0L7iqRsbVJk2cr2N9F6Xcj4tT-IwDZ5M7ludfW8AC1U34-BtZbHF-X6K8nWAVfsrsn_DvwDe5e5hE4AMUi20wdzDwqjR1P4OZeX0584KhHEgV8LqqPFDX3bRf77WXvROcmeQNEKz3LX1l7GPI8zudArHK3DT8hc4VdhhdK5PMN4tp1iVSld9wOhss-O0P1fH8f-wNm-jevu155GLP1vsDMvbaWb87HYm_3qC2ex7t6WogsLVTM0nd6NfUCCiCWzgDE2wG3ZRA0K90vsr0haFkpHmEJaAlt2GGLClJkmTqfkSBuisM35-1WM6otTEg1EdjjrkRvQJVJd0z0rH1edC1nvGbCDtvgjZdIw1cK8V4Ju7aUwogPRTG154uHKHCCTW9jhecC-aELyDeE80eTel2h8r1a7GuJ7nTxtiAj-UAQ_KiDNPBnCz6y3ib=w1680-h945-no" alt="" /></a></p>
<p>There&#8217;s even a spot for an outdoor band to play.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipOoacmrYRElRyc7TCV2qfipifHutWL_BTMMWZ8q" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/xhjG9PYIt-x7yzE1-Xfjv6dNsCGHbCrcoib6cOT160KYCbowtVh9Z2sMpQUV6Kf9FUC1yxbWo1QKCL8wNx5_OxiwF_O2CM6yH-v3yhDZBeM6m_Dg25D_QJB-LkFr0wCxWyxzAzZltjKqnH65boQ-hQIQ2LGETGu1VAw6EM1w32WwLhWyTxiia8oe6hnwdwB44zHyq4LX2Kd_UL7LlkDCWPi859SSgZsvG4c_HA57uF5HEZKM2_kgjhu5Dz2dw62L6Q0eikNazKX7jYQib5nBYZEZDa4oW5IEQoXUlg3bKcj1ZJd54o9Im4shFqBv7fPy3kvRMASeAscMDtkUsm0XLojk1PzdnxIMR2x7iWF4d36fY3UHbrDK4T4V7pK-rEjXQeY2iHDJO2z27cCQxy7evhY7wHfQ8TBUA-UZx1xKz6FygVRCuY9HWHekQqH2nCZBVi3mlOmpciuz5uhia3FXEo8ErfdK-5vW23v4eYfQAhi_YFPJsOXNCH-Rka8rfoqoTNa2Alf6mXNazg3alSKJsy1yvBm9yZ2vmLTmO64YtZpzrzQ1xQd11g1zgnGtnmDpfL2-oPJgXGCdowqgmh94s0qltluTvNKLBwx5BUjp=w1680-h945-no" alt="" /></a></p>
<p>And an outdoor street food market.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipPqUSXQxW9hnlJrJUohyJ_yqSmLB1Rm3Y8x7Yn9" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/gOq3cocRFKjHPLTs_GAEWRwgVvfz7-OjopdXmAkCFjM98Ys20qbIRl4PxaJaQsQI_7tPL4mexQeSt5GnNgQ5B1lR21y2hHE2J4VntHoFpIfbw8VBOCUnnedGd2VOBrtJhY9OwH76fnk0W_SACdfeRSQsqM3DGmFvcDUhkIyUFWjDtt_yQeZA0hyAbFFZ81HZy1K7RyR2wlYaxLU-isaJhJUsYC-dYf_wsSCAhFikNqoMM4N3cbnRct-wLbzksrrq_UFHbIFpEnLN33sFOzUoqvKGeb6rZWdaAcatgUZMhdshC--KyxaGaoTULJ1kB5a65uCdqALHmdUFJXlYiIpc4HESJIq2iXQATvB3EHVaCNF9x2l0CKv6LPR2DREQplRwcCKId3wRA9ZOgW_oOO1yJBCTnoB3xTZAOh8JN-vjedN1HEqVpb-xTya4NRvTgS5yT6YipbhVqip-s_YFGxZ_WMuwhPiZ6nVG_2x6lMp6uwlJ6wNJl3Zp0bmtFnqTY0oTFHOuk-RBRoeISSn7l3WjBji7A_H-fX3eEjnJ0rvIaBrXdLaKRNTAMWfMK7bgFfC8Wbz_0QA4DnOTKhFgRD-n6K5teZIMiQJw4VxZvd1a=w1680-h945-no" alt="" /></a></p>
<p>I ate my very first stingray. Another one off the list.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipOtrA5kv8T0-tj5yXqLstJK2FlO05izQR3wgAAx" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/YUlFk1hu4427jVOZDRaOGkAP1fz-14qwmAtF4Q43LQ7e94wZd5hd5oca6Ln7p_WAnVpVivuMd7kfLAU5BMZv1sP5fi-aw3TQ1hQrinvg-y9YsJAUQgSeNMCxBzPH73U7q7PKZPJkcm6eT2jLGqkQlLbzA3feqE9hfVTAc0Bc8kC-4iASwnjj540RmedNyPHNJt2GGpBMmWy77TgSRKdLbDRd331_FOPKH-sFKoDSC7Z9frbIzLnnaR8PZvZEB742mV1Qt7U3emrBLLVZB73dycJN9WEEsuGPkTb3IdzDrCZQHZLIiPacjaY_Mnerf--EjNstQwca4kXVzSZEU6iUvOyFJH5lZJaFi_KhepLlpN-C-3jp--e4aWterxCId7QpKFZHvw19YtY0imHczsXcabVdSSYC257Z5DSvjJMBIsb7r4bMgujyBDMLy96QSFrdAb9GSTi7A1jDNQPWGn9APgI7TVZN17IZO3SSMdrE0M9GiQd4VO92KhjLb93Bj1pIZwFCzMM3-Hn-KV7wcrMHP99SqAGr5Fpdt1znQeUyalKs5b9sfXpT8jEasCa9Unir5arEC7q92cN3OypKQKEqyrEv0J55evVupjebalZG=w1680-h945-no" alt="" /></a></p>
<p>Another must-go destination in Singapore &#8211; The Supertrees! There is a whole grove of them and they constantly change colours. They&#8217;re powered by solar energy and capture rainwater for reuse.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipN8MJ1vaJpcQ_DNx4wSxHPf5tf_v3-4IxThY-0V" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/qGI0blMfyBIroBGrsHWcm9T2ACNqvBSByU_YCbod6DYpHGzSbKi8i-Yb-hUw9ZY_WsJJwlsx7ledPuuR7HXGfAJyErQe-iQt0M-i78-Iz1v5XYI5b_q15G3kb4NHGS05zmpcA94SiNCJ4O02jdNMvGmhdI8zQB6OulxGmYJjHoCjWIJajPBgqVBrXtKKhGAU9znLNBmPrkRegnhjBBJM26TUuYCWBwTbleFAJ2bo8u4Z4NmJvAsQfnCFy0kJAkOdmlmM11eOy2qPYnTlv5ehkNiF3_OsQFmWWLG0bjbrNojE9ZIyAPzvedhUlgoDleuSHtj6TS2shs__PiTpxuRUaLdsCcekXKWADhhGTjuNI6k4idjkyqd-uuz2XaayRJ2QnEexrWHsFYRYq5hcMdJHilpIb7qdgB9siKbtsiZYWCbE1neqvXhTdRuNSXQe3y1wdAPgS3vQewtEK0knk9P6r0KvMTGQSkZZBoh71_DxiRmCGknanu5X1yS2ewCujypP_WRwb9G9LtYKw5W2M4obkLWB9XWt-KnQcGb9nctQHi-wqvmlJ3A55qdCBZw4U7c_IqwtS2tLgRVdFHDBQFhXfZw4uaib4HF3WS229lcN=w534-h948-no" alt="" /></a></p>
<p>In Chinatown, there is a famous Michelin 1-star place located in Chinatown called Hong Kong Soya Sauce Chicken Rice &amp; Noodle. The lineup almost went out the door and it was next to impossible to find a seat.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipPpPBCoHoP_mB8YitjBAxW9nezcgw-EGco3RaBi" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/89o4aAXeqmb6qJH6EOCsfXxXJtfRu-_Bv1ng70CX5zsYi8RGO7dZ9nSBGPkajSiXPr60s1S2HdkWrr25vA_TeXw9C6OOf8sJ5CcNI0ovaqgwIDD5G8djrNtsu4jxB5qmOh2RVbf2EC3hdmw4yOtWekVVyMTmg_cHTMqEReJEs5Wi_cCHwQUBQXtHxP6kaJYS9kEz4sMDwjieaQKo6_eXbAoDOcNZrbh8D7bqVfz_jW1YqdDPsMM_QJ7JEo7L-2wa-Gw9qU_MoCUvBjtqloGMB0xrwAYJosTfyH6S4HuWNNR6owLMC7u7wMy9-KfMI7miidCYt4UeYlCsqYTTYNh4wyKVKhy-6TWYCumCDKWQYy4kcD6dQEvUHhWJo3W4LUlyAwPHxCMT_RlaA8QOX_qW8riYQ9jZc1yiM66YwfJAVt7n4DUkgyQisqFGJPNsW6h_hmBtrksXuSz4JrTNf0o4WCA0A5ZjzY0-nStbsuDeJN7b2l2tvCjtDuceiIdtYLpjftu0-J-UCBqorrrCTHV6ORYzOdA_0cMQ--GDGroshNFQubT-nsGFMEcaPU9IEPeLyPZ2Q4YllO7C93VSlt57HOc4LrCmtTCoY-U5ZiV0=w2048-h1152-no" alt="" /></a></p>
<p>The chicken was not dry at all, but rather juicy with all the flavours of the soy sauce, and every bite was tender.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipP7I8VTuCiWRrSdF4kP2PWPa2wZcp9RtZcqD3CP" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/Ivy4FUV6KwBy_BPz6H5tkGBw8-QTV_j5I3cyMfeeSwQkJpJ2iFh1I4Pocu0eemtmTeuaJhijq2M_SAvtfzs4KjZhWh8Fi_fWGsYNk3ZyBICY8N9eF9SlikdTQyjmNc4rPSLEn_K3a_vueAr1tfeWpCLjnzCr_JZDzBPAKvbcEN0gWzNaqVsKd17xLnMBh01C70ar-P7lt6WvEvptEWZYU7WgDdkz59ibCPEPTuM6BUg0adQyptC1nbE-Alryf5gaPht85Kw_mN6mUoyn_bDLl3B4N9QTzYVVxzQEQwYpsOjqhLlPzUDbgA4COewWTk4QatX_TlcPPRJBsGh2cAP_j2D9Jz0aaBcAAXkJvHfGg9b3U7686IckWCZeQ7mVNm1yGUGKODIlMjblxzZTajNQlFQhWz1R6GFJvdUoA4dYhoWvvX_vSKL6StYG5HgJDZmjwqyAT01oqyyzTVwfS1SKffejfqDjLHGPKotnNUsgu9cydNDIp-w2HhjBZ2GZlKqQwrhKnIYUWSTdWNTZWvUG9j8amClZD2uLJY9t87rt0aH0ZtaS_biSwIS12mWsHmxWap9urmk_WhNH4hw4dMzhZa9aQLR2gFUQMrpBoOeH=w2048-h1152-no" alt="" /></a></p>
<p>The chili crab is also worth trying if you&#8217;re willing to splurge.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipPELCn6077fujL8Nze907osd7_sGarKRBQEg4rI" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/NyAfogtlORJDyMpHN9p4eA7omHTMUw1Kn2LlH52D7Z5SY4h6SdgKsvAYMW_3icp0OlWSYwaTvyIN7vjUxcCOl741s3-SygsTltdeTPRTRYdJLA2bUahEbd0Hk534xVMz1K4IWtOTblM3ZDOu54rr-C5qz1QaaH8ZD9OroHq34yS0Do7JyCNp-mHIYGlm8aHN6oAJHY-gvwewMGeBrnaPnnBomrjEZrNQtLV-TfwDRVoOHTNgWivruoJGUhEZQZOu8C_aBs8rbIoJ_Y-tGhnFekuBX8xSmujRjewvLj7lVa7ABjchG0_CUuLEvVfSBjcDysRZmaK2RumAsuIqpop7DERQBLHlPOQkzeygm0t5jIc8pnIBAif4KZ1piK1exLhLQtEj_onzliQFffT3IyqlUFo6lqHt9bS5QmBFxMyIak8M_-OiHOvmIopoPAw5kQVJajbGHu2LOotFeVvEHlZNvP9u6B5KWsYGZNT8rK04A8ItVO1Tkhz5abP9tZ-nV4OQh8zZpaVmz5P4xJ1FEvtzU5kQIWHtuopO5OB3-xXewOdm0KB7bafpRNKXct28Z39Ec1aJb3SxwDEkUlErqRYweRSfAzRx8QEdPZ3aP1Sm=w1680-h945-no" alt="" /></a></p>
<p>In Maxwell Centre, Tian Tian is the best place to go for Hainanese Chicken Rice. If this place existed where I live, I&#8217;d go there all the time.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipPtfiCT_9bGYssnIL9R1-rSu62BlheR7prw-hL8" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/ixrkVvxDIB4k5v3QkHZH5p78OHTvjtf8k9CQZyd4YriHDEl9UivWaITEngRlCmN228J5OIVeuV57nj1lvtTH1ZgK7wE-IQ0wdWgIvOWZ9uzz1415oY8aeJ9CSM-BuOQ1JPyCPPOkG8Qv4Ondxx12u9okekI_-kYdNUypqEb7gLXQJ6rBQ7HbmBpE_6GAWnZcNApbdj_5azPUSmLzoF0SfTF3itcqmiSo5124WR8HW0VFPj3var7pI0S1q_ouwCY8L09_CsK-t-TwqHLFtQXxBhAtajUhij9KnjurlEvVAcO4rV8MDBVNRwuTvzxpVoTk0uaDv-9hCbNdIdNLNUcwFHZmDU86ojxnX5CSKatWRJRoQHYSL2PG0tx6QsXybQL6vLWzQcvKUIWiTMoqXapnMrUDluYbNQ6rn1_nwsMs-kJ331vtqtTdHaustFA1LaXN3G7lf69qD-oT1lFS3Vyw_ylc7IAmJLMe4MhKzLbH_UUxlH77KxO5958cF2x6fN61FnqfOHFOEgthX0dVyV3TfiJ-RC1ZgoVvrR_qaYIvRjLvQWz-pzj4_XRK2mewDff631Xi3xJZwX3EmnuREBP5HiQoQq14dhM1uZGHaK4l=w1680-h945-no" alt="" /></a></p>
<p>There&#8217;s also Song Fa Bak Kut Teh. They serve a ribs cooked in a flavoured soup. The ribs are super tender and fall easily off the bone, and the soup is a complex soup with lots of strong spices (kind of savoury and peppery). The shop even sells their own flavouring powder so people can make the soup at home!</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipNS67iY-dLFsG-oNWyozlNrRKEtyV2MNcHjdLDW" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/-5oLj73xzKrgVDlyBhby78X8vnBc10iwPxqQRO_COkrXGh7wM4NBauLRN_dbhss_UWKWQY-CPdsguglA84rbBa7FFnkGzuOntuurhtn9h0bkavZAJWbFHcQP6HEHweoLQJR0PCgmDusXEoZX6mFsxy_qaXW1KeNRbU28JKbefoItcSjAScWF06XRY_cVvOZtjgyg_pSmAJeALkkwfGkuhTfOXz2tm7N4noL1xKxwAi_atS5byUqMhcyLC9dm3L5jHvT3njsGUFDJeG9i-mNbTM-vOh4B6ElRX_HPVtUjl54kIUuDrp8MTWQpGCEkAKR4AoIgx6fsCdEKQ2fMe-EfWeFRTf7E04JSx4sdn5CWCeHUnKgnNz4MNbC_FShDfBTasaF_Z2u2bv129ohdvqqDX_d5wwvtg9f193OBIQ_OKJzgYrUthpq9Kz25g09wFwqn_8TvUtUWN85KgpI_FSN5rQcQhryO_H7P2uh0CuvI2Qorgfo4dcnubwDiOuY4AuAk7WS3Du4AlPXNyw6NUtTw82H1hlGvwwbrkX-FrTjPO0ssQv8hh9zDhWaSxr3phTtiVVIF-bXAEmE9UdFnL2xU9GT7lYDS4K1HVO-AASPI=w1680-h945-no" alt="" /></a></p>
<p>Chinatown is pretty much a place where tourists go and most of the street vendors are catering purely to tourists. But the food here, on the other hand, is terrific.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipNl6ANWWqSRFgfLIMdWbYNReZJW-u7m_3l-g0va" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/XDia3QKApGbqF5714UGwhQlgWXyKO__uXTs1ePbx_fT5w1iR6ju8aOS5_BvGHwbNylM8pABHH-W2JW1aRy3ZK_0rWc6BNrgWqfmZoUhCKbvo45bER3gRkbn7fgqVmW1FhfDp5Q_ezb9ordrRq84nlnpG-lPOk-m2rwinqgJdZPOR-056oldD29Z0mF3_0LHDNuc4i6oZo139CjYjerFth0ZD4skRbjyf6LgeBHajksy0k-o6ioPpwv3SpnuH-c2GUShMXdRT3yI_qJs7zSm2nDpW9xglMpaN-_tpuBt-SfVQ9SWhQjIx4y-LfUxia4LDwZgwvxxLgD0QFdUkslnAfN4ouSGm9wLsjzkgL9XGWlKmYvu5nkbgWmH4D7hm_-I8cBTWodJF3u-3KEtkf4tMHO_PRn3UffViSBenpkSN56h8bpCW2FB64iH6c4qBvQep_sEKWXP7l4FtY2Pq_SIJ1b0RbYHpNhqB_I45iCclkpMNgg6tuq6ffx55pQJv7k-kpTNIB2S2kR4W50AzJ_eJqxuB7TsTYRp2feET42766yXG4JYfM_xlqaZQZ4UVAACk7Dc5x786nQEw9G5_FaDcYhut4DpkHEK5d8cvwXC4=w2048-h1152-no" alt="" /></a></p>
<p>The Buddhist temple there looks incredible. Unlike the temples in Hong Kong, photography is allowed and look way cooler.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipPDEJPOfuEzoxyZeoM2mGKR5a4kj6MlsaaCJPxT" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/P2GJh9i0XvwtJIgt-KzTi_JpeCNxm9MUU4CYLnQFoEdHNpPHo4gjDIJi7ZMPl63k7lqR_G37x3_UrBNvkb1GgM4POynKlf-DN2z-ZV6H8lX0y77lfNcTBwtqck1auSnY9CK4joSXRBdBgXwfH57mJD382AQuYAu9_3GgoL4oP2t4j6msMQl-x2BzfyruwUpuYj0b2oVBbO2k_ywRss2w2ko1pB_nDRiLk67li5qJU5RpT6lpeB_76UwK2bYJ84aPu6W2XWFsN0-0ovbwwh5HYLa5K7OjGUT1erypWRJ6nuC-kTHVJ7XjRco_JrZA9I3GZClDzqnRS4cKq1gscZr4G_e7x-S5LxV8XLqW_fFyyTaVrSMemO6blaA6QfVHZwjrIPdMrZ6bunGg5pTaJHXMRNMokD6u-tIo37UbCwjj84nln14QS_sd-S9rmBlr3e8kxycb691MUhbP-Vans2Qlv9mYL32tSG_heh168dXoQeYrAPep49PrTUshRgD6j7UfJwaUHBMKVg9T2oKrhTZ_JQ_SBWP2SuOfHL7HAE5AySuubjqyFVMmzduc5ifOLqNLZXP5lVz_UireyEB0r_3k6z9E5tY6e4Z4jmAbPm6S=w2048-h1152-no" alt="" /></a></p>
<p>Next destination was Little India. It was amazing at how all of a sudden, the streets were no longer filled with Chinese Singaporeans, but rather Indian Singaporeans. Many shops sold fabric for saris, and jewelry.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipP3btgGinH1qeZ0TupJ2TX_P4uTPpaUrLSrG_r-" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/AB-0H3IZxcKItK0hXbO7WXxJaYYXB_IVubdDl4g98jA6p9iAx-WwYX_Lsg1mtsYx6xvOxkT3E4j1uvTb1zPiEazUDxRLFnd47fQGExKIfQIqW-6XwEkx4YKvVXlKRFK0-yRlFOcYy5lkptoJ4BVO1ynHgq5-O2XEvGteNl9OW0McLZ5kO_2Jnp3uXV0cJnSAgQL-fTF6WwPlHsNhTrwUJmvgkrZex9ynaOf327wyoPn8s6pKG5VInr_tKu8CLd9paGc6zIVWQroy-RYqkNbdpEZWPDOW2E8rm0_oi1KhZiyPtW3xNvd-3o7Bh3lbURFOjQxwMEvwkSE8Zj9P17o7akZ7WRJZgInLnmj-0JEjcteKWMZ3hR9bEtRWKt3BUzk8C12bSGMkYSOGaQ_G1v6dXZPa4xsd1jje9wMg6rdS8b-reW88bgXXtNsCbw9crhjjH7eEsAGFrGpXClEXy2Y6912AMOBs1TcTKFzrYO20qH3gMq_TEMom8aokuklt7msYQ5ar3vxrJVxY82aW1SMla3R1_-lGoNy7aeNOxTHLN7fsDZtNj_cmT5xh4yFGUPyIyAFPcdgN0eQWUbg32qN2LoiZLTkaGRyQxKRutKAJ=w2048-h1152-no" alt="" /></a></p>
<p>This was my first time visiting a Hindu temple.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipPHhX2QEPJM7ec8ASNsSDc1TVQRu3lKF7ZCUgeK" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/-IcR40M93JTb5GUCS7ybUB5yWTFsPndlUDFFPrPIlTaJJI6rZfipHczexTmgEYRQBLyHy3-83xZhH_kVi6QzrREH17ET-gXksL9s43e1UL8167JKGCKt-na3Lkt3J14R1cjYIWMqUyQSahCQ_aRR_nizmIPxr0HWl6JzCLRZuqaKRo56D1hIf8mDkBymOGJxy8djmlVAYkMjZEmJg43GwGfkcDMxT3NJU7UPcp5DHGQpeUPs2D28DVLFt4NoaP6lP0eoXvgUqBlUGPmOvajOEJP3vKNKw3WqJq9qKZnAlo2Moi_wgGrWV100IacnXIxSVA9JKsPD49ZGVenpSxP_l49xXEXp7BPAN9pdGUbZuGZ42VGWmLYju2wJjcN0Qs0gSbyYMLCgcUT_jKea089FlBnyFMwWB1xsJ5myl0MUVYDUovawQkpfWWXyoLhkIgz4CA0tx7j7naW9oU-IE-IyJOc0-LKkiQBsk-SAJQlK7uY3wymBHQ3m391rOT5cVv5ybAq7zGOaLZWb7vxN7-c_hCTqKtNImvRJHhQKmP5uAKA4cV3SimtMtIPMD0DuBajaLKAVEqx-FChlCEIG_tBNKkodVq9j9FqIuQMQtJ5K=w2048-h1152-no" alt="" /></a></p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipMMfI8HwWibAqI1LiTzQN7p-nl5oOrZqa964Ocg" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/h4DRsVRFseTttq7qE9AdAXf44cx8bQEDqDVcsbllX32QofKbLw5BZO2Z-7hmI0SjMFrP1kkOPrFTnfq52YGvK49upvSbrGROJ4DBZO0BHal8Vi6TAOFAVKJPVDyY0xPmZHe2qZv723S6BZRReZFyo3lB1XPcHXllaxR5V0iIz6-jtjTzbfvuApi5N1Hqwc1O3xjCUsV6yDQ6z3az22A8W9iwmuZIaUPBiHh09UYckeQZCy8mKgauemJI87cxFtymVByKvHSIC3E6qCEm1kZ7l2FMo_OWQhmxZK_7eU4W3yTgKuiRxriIfUhYY3BuM4HpVOk2lhkTUQgaZwOaDqwGl75lVBpPJGBEedJSVBo5Wg_4WaGJyOMfUEQDMMikhyUlZgACGwxt-5YtQWKxMPB2KYMmtS-Ke-ICrlpn-4-jCDG6aPbGM1xCmJHN6pTG0fwMRS9r1nYp9f5Zh2UjsQ-z3DxeJTbRoJwBxNCcLD6o-wuKdfZor8ZSgo0jEW_z8fQAbC4M5Jn7ECsXRvcjYiCjpF5QG_k70TygncSX5bkqVGOhAbfK92crtuKhVnVYMNdlHP71ww9E5OOmKapzXpIy7AUcuMbNYy_f4d3AwK-_=w2048-h1152-no" alt="" /></a></p>
<p>There&#8217;s also an Arab Quarter. It&#8217;s incredible how in one city there are so many visible ethnicities.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipMCxPI2DGHoIcJh-bhkxbmnhGcpjj_brhxbVAv2" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/J-BM1yPreTCwnTWiMNEWvzbS1RR_H-nEjCLFmtRJ3MwHTFibFZNoNItODKjCOjAjnIHJISTRR07uTjoSalm51bMxIMhLnJie-1g371cf8yP6FGGJaO9dA1h05qlP3J2hB8EvG0JflFxo_PZ31cjaiyjG40q9evK_NvvJRfWm64YvHDSueQFpeOa5URC6Zm6Cqs9HPoNmSLREbTCcmzwByboqPiq8W9BFp9pBbTgMfW_PH2gLmJ8rcPPzGNK1JZ7jRbIKnDUe-GeQAV4oYBLzp_TVtUMJ4zPnN17pQ6rk0ktGbnPopfZUarpvSRzCNhZ3thD1MkLwbCWf55OAtrE05RpsUYhuk1_YLYzieCit9DkD60rVP_boU1gY61jLbVsFerVmNS4doU5Jpr1fGMjKlmQFBnu-E2-Z-7mW7jGpnXs0VKSAlqMlVEvkYdN1QGXNWT-Nmv2LldRNuLvw_Rui03MQN9ymk6MbKsXY9nV9RNQEBuDlrEeeILsogVa-epd1uXGlqpvDjOO0hpPUbxxKcgFJoz-ZQjzYIk9WBUoXk5fJQw2uC2fMxEWEy2AQItf_9WFfAqgyL8OzNdTzEDo6tjjAYgJ0HCLS4h1mDidE=w1680-h945-no" alt="" /></a></p>
<p>Sentosa is another great place to visit. It&#8217;s the home of many resorts, Universal Studios Singapore, and the aquarium. It&#8217;s also the most southern point of continental Asia! I always thought the Vancouver aquarium was pretty amazing, but the one in Singapore is SO much better.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipNqL2LcWyYIIZ_xj0hPnIiNOZ_S2tFJOfSRqgpK" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/skEM5wAHbmxQYDRpUifXmdXaSc_Tr9OqqGbpjGbgHtkRORjS2mqH4qXHkPGVvBYnGtViimlsGMrdW-RRxteeYponkQMi5jZ-ZqlJJXLy7S9zLhnub8-EbKq04ZirJXEyobN0mBGkVCZ16r8GpXcEmz6O6mCg5F1hU58-lhrEMYTfkjdC75gGxnfQu2fGuhYkpTMLnlnazKGnQmJjcdHR5bbRpf7SgBpLsMNu3GixiV_tHZcqfrUvTwEcHoFRLKrtDfi12YHYOVYji-27wtOu5BvwgwfTEKVRxjtjM0kL-HcmDyBLMxdac00ag7j71rKyOpA-QtVk58Te8JlbjaT0pqk433GPBejq7npzp42W4SiFKIxnAOvZPv5ZAH64I5DYpTmPAPBivkLiSbpLZ1ZK3mQBOfSTWYgrr0Qy8ynQTjoA3sV-rTg7wWTNVe6QNjFrGsalY_pleyyOg04ITPCPE8gdI1pbPGFgQ6Omu78DVrn5s1li722TGrnW0zNPiJohQmUYrBkN8qKW7u2cZkv0D0oBeGjWIc8pWGslZ2I1etG_37yUCmELaoz1wv7ZIi4zWmAGAmHmwOzUFZAndHwn_xsBTFhd66NMJxS7F4xM=w1680-h945-no" alt="" /></a></p>
<p>This was the most impressive aquarium display I had ever seen. The picture doesn&#8217;t capture how absolutely massive this room was. The window itself has a thickness of 70cm!!</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipOUZd5mPCrzG5R3Q4o0U50iN9J5T6C5HohxRuGP" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/T0KXdI0ZX5Mnf20AYz9p8pLPr6AP-biKGwm7Wt-zvs97WTai9i3kZwbyMSrWQJd20ffsmcQ_g71dS9Y_6zsb_ST42KCw8-dbWWjlv1rZ3hokXTIdBDdT9uGJ-VJXwN1XDKRrL_dnHCnznycYVqvksBSQmy77XTW46aMyqE1uEbfBn5rMM_tRC6ETk4nW4o__ZHLNSkXoiSK8tVqA_bcsD2NOvGXAPzY7a4V8QBmugq7QWEU8NOyfv2CzJJcFr0NF6IAVnAuPtP9B2BdF5aeASflFoZVW35T8_JS6BGyR5W3sSH4XxMVGXJJgPBkzl8xLW9DTqer3MJJR51OuMfMiB0T91rX6rLuHq0XMPvDytVlf-fmW2trmfkZ0BGkJmoGzwSbA7AHINz_S6WL-isQ4Aox2YGfdggptzbASKbLQDE5he9JXeNKz_NoRC0KLEUvV4S1waw9aDz7r4kOGN8axebbXvCUj1ZJfMyZ2uol6Gf5Z3sYjUZI88qBelvjyorDA5k7IloPMc31xLxlRSeQPp42gIGuZ6z8uhg97lp7X7T8CB0cK743e-3f9RSOTDB_UaZ1q1niMOIxAcieCScbd89v05vgbewLL7AHUouLC=w1680-h945-no" alt="" /></a></p>
<p>Singapore also has a world class zoo &#8211; except this one is open at night, just to show off nocturnal animals.</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipObLgg8yebYwZtZpmeTpwpMULr2hFlXNOEsjvjx" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/g1yqwwsxbBLuybeR3bmD85j7ZrP0ZXrd4i_2Ul1T1CARspNrp4NfgGH4gzW6Avsy1HRHuw3Js7Nt6C6YIP1A9RZSkJJZoGoTu24_aTNauxxeo55K9vfCrHNBtYbCx_f6XMO6_lYu4JUWUpjMjtDPWpEUd4Xu1ZFINBEPqqQQ8kxYgIAdHWM9ZlraQc4i-AIJR54GvB9ct0eNd0b5ds-Xrga5xbRwZVdE6PStBtNgF_69HROa_jrBJ-wor0judZ4bpsW5FcW38DF9oe7Lc6QRvunbrOOtz5ur9W1VDc3MYVWKkr21Wk7nqKg7r5jbTFT-P-I6XFZoVUE1_9JkuMOb8HFsKohG4-WmCbJ2Il-trq6c1fRhxMdTPQ7sdqsHrgnZCCdKNPcOCeVbvOBA7QrggdRYZEmttzHHq6-o0bItdjAw6AXnN7T8r9PK9TknC5w3puFczp2spB0iW90P8F02-Gfh7rz2UBxKbqL4En8YGqNI4chUebKD3sJwAZmXL78jZZljMX4ZHzM77Bj9urzn5A7MtplQzIEUnf6BT62a9esqjlF6ezIa4q8iw-2ZTcQebLA3elYtcEyIvSFCLYh4d-MM1Uj8_yPMrq7QwC5e=w1680-h945-no" alt="" /></a></p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipOKQpfHeYS-aXoRE2lP5J_AFTLBR-G5mYQSN-j3" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/FQFjGFpVvFfWosO52a3RO6dG9gXGgqXXhxb5IlA8nAiO4xggn5nKiv_Aj_R89PADXyvJXXiHLZVB_-bNOc91nCWd0EV_U6b133652lJjA8oek3YbcI9W_ifL0GuUbufRSkuO37ksBUG9sCtsID52OyzqFdUlk-iKsf90lhUfwG6MQLzIF-t63Iwl24asSWRGcu5tCwcB_BIksu5VWXvBq_37MQ3DF-XQt0w-a5vjflhLb3unfIJPRIltPQeX24Xkhf40iJBOcQd3ZUgBdRSqjoG9AKQ1OR9O6MwH6KDA8sRekX-5BDI8pbxaDQJcpDO5kSudsUIXsIktvBBOCQXtna48hULr_DE5_q59EJNoMuNhew1lGEihPUTcCxaEMzZfKxD-MptOHadMsdDiLNvx5qZNJy8fJ_i7QrmwFQnMsobZJyTab12AvdRgxKEh0At8l3f5gDFwP-i_A0Gumqo6F9bQ5xdSucs3TeUmcEpfDgsz6hoQHXogqnhqWg9Pxwx3mz8H-Z-8c-RVLLbZgPga8gKQVTYfZkHfJbI2Oh33DGU9Q8qm4h0yYRE5ElVo3wA_BI0oe-jUzkw5n6iB3fk_uTqFyxtJOaITxaW2fp0d=w1680-h945-no" alt="" /></a></p>
<p>Gordon Ramsay recommends 328 Katong, for Singapore&#8217;s famous Laksa. The soup is slightly spicy and contains chili, coconut milk, and evaporated milk. THe fillings contain noodles, shrimp and mushrooms among other things. The other two dishes are Nasi Lemak, which is a rice dish with dried anchovies and a spicy sauce, while the other is Otah, which is a fish cake with spices inside (these two items were probably the only dishes I didn&#8217;t like).</p>
<p><a href="https://photos.google.com/album/AF1QipNZj_bOUKoaP3fdbvzETO68SF8lyKyM46NIGoOW/photo/AF1QipMdlGUlR-AW4jeoJGkhcVG2pxavIz6vPu9xf9le" target="_blank" rel="noopener noreferrer"><img decoding="async" class="aligncenter" src="https://lh3.googleusercontent.com/yd4omSMoF8mut-vXowZVgQp3SjluUi6Crtq6BFJv220Dc4QHxD6c1TPfCfv1asDybKvMChqbglWrtdJjgaWjkwIv3Qhj5YCKx9UoH4dYsJNtMKR0coofUljGmItVrjhBCS5ZAVMYqG2xhFiwuOwy4uxgLpEoQndi2-Czd3Byqo3FO3byPeoOWxVkJzvAzSTF1yj92f1Yy0ykdl-2hwBdh6UPgXAFKkiQdNYXFOWIi0S_zEyoNcBpKWzKW7FAj7qdnJRiokd8f3mk9-WhTnmBlPWoRhO8IlR54XPxGGxHuOA8H8nBKmHon9igIu5df5hH374BmjiyiTiBbImdIOCzd0I9JJsu9jyHevZx01Whh3sH2RSfTeItwwjL3FNWww9_YN9P-ajKHlFhQsHXybOaBS_RrKbYSGJe7_n7lgXPsyHKp3HlxefjHyRR30eyLb--haWl2eNvLh1FxpaQi6CwE3HhifN3sY81184QWeOQY281xwruQM3kXnz80lr27VD_7ziBOI0wrbRvIRjYKKt_HLr2aI5g1fCpG4zmixOFigywKNKEyInfRf9I5jDmjGUCio6yrH50Mb5TcbCOD4sbP05b08WFdh-dViofJFAG=w1680-h945-no" alt="" /></a></p>
<p>Pretty much all the restaurants and places I went came from recommendations from friends who either grew up in Singapore or lived there. Thanks to them, I got a bit of a local&#8217;s perspective on the most awesome places to go!</p>
<p>Photo album: <a href="https://photos.app.goo.gl/5XzzYHAOZonJ1py43" target="_blank" rel="noopener noreferrer">here</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2018/01/04/singapore/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2861</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>Universal Studios Japan</title>
		<link>https://blog.henrypoon.com/blog/2014/07/25/universal-studios-japan/</link>
					<comments>https://blog.henrypoon.com/blog/2014/07/25/universal-studios-japan/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Sat, 26 Jul 2014 01:24:45 +0000</pubDate>
				<category><![CDATA[asia]]></category>
		<category><![CDATA[Alley]]></category>
		<category><![CDATA[Amusement parks]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[back to the future]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[cyberdyne systems]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Dia]]></category>
		<category><![CDATA[Drive]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Films]]></category>
		<category><![CDATA[Films using computer-generated imagery]]></category>
		<category><![CDATA[fish]]></category>
		<category><![CDATA[fond memories]]></category>
		<category><![CDATA[future]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Gun]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Japan]]></category>
		<category><![CDATA[jaws]]></category>
		<category><![CDATA[jurassic park]]></category>
		<category><![CDATA[Light]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[osaka]]></category>
		<category><![CDATA[Outside]]></category>
		<category><![CDATA[Pho]]></category>
		<category><![CDATA[Recreation]]></category>
		<category><![CDATA[shark]]></category>
		<category><![CDATA[snoopy]]></category>
		<category><![CDATA[STR]]></category>
		<category><![CDATA[terminator]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[tuna]]></category>
		<category><![CDATA[universal studios]]></category>
		<category><![CDATA[universal studios japan]]></category>
		<category><![CDATA[USJ]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/universal-studios-japan</guid>

					<description><![CDATA[The last time I went to Universal Studios was in California when I was 12. It was nice coming back years later and seeing the same rides that I had such fond memories of as a child. Even though this one is in Osaka, it felt like it took the best rides from the one [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The last time I went to Universal Studios was in California when I was 12. It was nice coming back years later and seeing the same rides that I had such fond memories of as a child. Even though this one is in Osaka, it felt like it took the best rides from the one in California (at least from 10 years ago) and put them in Japan. <span style="color: red;">Warning: lot&#8217;s of spoilers for the rides!</span></p>



<p class="wp-block-paragraph">Back to the Future is definitely one of my favourite movies and since USJ had this ride there, I had to go (even if I saw it as a kid). It was a motion simulator ride where everyone sat in a Delorean that shook as the car traveled through time to places like Hill Valley in 2015 and eras like the time of the dinosaurs. Unfortunately, the dialogue was all in Japanese!</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipMAG76YYGwVXxnbhUw_7kPb0A2ug8DppwXzeZUo?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh4.googleusercontent.com/Uet6Rxns7--k_-4x3FdvRQ879OLgs2u2wPNAPjE1pkgu=w1358-h591-no" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">The Delorean outside the ride definitely attracted a lot of attention too.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipNyQiT5QrIb1YNfNdf2UzIGfNznqiVxUcJCEAQv?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh4.googleusercontent.com/jr6Kn9fj9m9PGj2xGI1XoF_aTHybPN-UI0Yb9rTCbo_c=w1358-h574-no" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">Parts of the park was designed to look like an American city, but with one big difference: the streets are much cleaner in Japan. Part of this pseudo-American town was a recreation of Fisherman&#8217;s Wharf in San Francisco.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipOvZwitu8TO5fr3xyv7RCPHMIg4Li34qpmxAy-K?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh4.googleusercontent.com/S2mpbWkHA1XaxN-xV7dw8JHr31BsIx0YKCvkMcFCbONP=w1358-h764-no" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">The big gate into Jurassic park with the vegetation was a really nice touch too.</p>



<figure class="wp-block-image"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipPcvBqNg18nby2rI72yXeNfy5i8OwIgEq_mMQ0L?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh5.googleusercontent.com/4V7vdruZrNmvoiXuM3i_MLp2aw4PnBIZEQT9dVqepG07=w1358-h521-no" alt=""/></a></figure>



<p class="wp-block-paragraph">They really did a good job in making people feel like they were actually there &#8211; complete with a 10,000V electric fence, a broken jeep and raptors.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipMkXAsVU5l3xeD_G_Jc755goxzmxANgxH7zNwzD?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh5.googleusercontent.com/KQmHVozt6haJ67i1Wd5leD0G-aRNHfFR_-W4T9Ice2NN=w1357-h599-no" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">The Jurassic Park ride was really awesome too. As the roller coaster passes the destroyed gate and electric fence, dinosaurs begin to appear, and they are screaming and roaring. The acid spraying dinosaurs spray water at the visitors, and of course at the end, the almighty T-Rex appears as the roller coaster goes through a steep drop into the water, making a huge splash. I was soaked at the end of the ride.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipOe1zhsjY3qYL1PF_jsCNjMsJ_znlxguUwXsmwf?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh6.googleusercontent.com/GJB9nb2vEYubrsmYYScZrlj_pb8910QhaIa2xchO3PCw=w1358-h645-no" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">I forgot how awesome Terminator 3D was when I was a kid. It was cool to see Terminators at the side of the theatre light up and start shooting things. Even cooler was when the screen showed Arnold riding a motorcycle and then having a real motorcycle come out of the screen and appear on stage fighting another actor playing T-1000.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipNBstM8wWKj_EjnYWHBRQ-0UQASGSVeLlGYQy9r?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh3.googleusercontent.com/tOd78Y-y-HiVrc_GaPoAAj_6kOKNIZCJ86xmqwCeJaRS=w1358-h687-no" alt=""/></a></figure>
</div>


<p class="has-text-align-center wp-block-paragraph"></p>



<p class="wp-block-paragraph">At the Jaws ride, naturally there&#8217;d be a large shark on display right outside of it. The ride took visitors on a boat ride as the shark attacks. The boat driver, wielding a shotgun, begins to defend the passengers. Lots of splashing, with a fiery ending.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipMS78uJzgNhqUoz3JukaEM9tJ1DjuyQ8Q_b4o2a?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/lh6.googleusercontent.com/-f5WawLJrN9w/U7blEVvXKVI/AAAAAAAAVvU/k1L_Q8YgKyk/w620-h826-no/IMG_0733.JPG?w=1280&#038;ssl=1" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">Because it is Japan, there has to be cute stuff and that is Snoopy. There aren&#8217;t many things cooler than flying Snoopy&#8217;s.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipPE0Iib0OWIE4PRkfOxu_mbiItj4Dme18OTWUKX?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh3.googleusercontent.com/uorFk50TyCL5KvoV2Ads9_EEHp0W8kWoQNZo04Z-VGiZ=w1358-h586-no" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">If people like old school American-style diners, they have that here too!</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA/photo/AF1QipO6p2nanZpgaBAC83yFE8E4F0DmEY1BYZefcKVC?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://lh3.googleusercontent.com/K4ZX07pRykelhcjPeng16rItUs039BVZcSqFf5RTknY6=w1357-h619-no" alt=""/></a></figure>
</div>


<p class="wp-block-paragraph">Definitely worth a visit if one is willing to spend 7000 yen. I certainly enjoyed reliving the same things I saw when I was a kid as an adult and it gave me quite a huge feeling of nostalgia.</p>



<p class="wp-block-paragraph">Links to more photos: <a href="https://photos.google.com/share/AF1QipOz2Z3O9tarZmBXLL56hAnpMDc0kdOnivFLZt8EE6G-7GmxjL-xu6805YUaGCa0HA?key=alVEVDhPT1RSVXlEb1k5WDBSaGR0MG0tUkJUTjlR" target="_blank" rel="noreferrer noopener">here</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2014/07/25/universal-studios-japan/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1889</post-id>	</item>
		<item>
		<title>Proof of the Farthest-in-Future Optimal Caching Algorithm</title>
		<link>https://blog.henrypoon.com/blog/2014/02/02/proof-of-the-farthest-in-future-optimal-caching-algorithm/</link>
					<comments>https://blog.henrypoon.com/blog/2014/02/02/proof-of-the-farthest-in-future-optimal-caching-algorithm/#comments</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Sun, 02 Feb 2014 23:19:13 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[All That]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Cache replacement policies]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Computer architecture]]></category>
		<category><![CDATA[Computing]]></category>
		<category><![CDATA[Contents]]></category>
		<category><![CDATA[CPU cache]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Digital technology]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[farthest-first]]></category>
		<category><![CDATA[future]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[greedy algorithms]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[optimal caching]]></category>
		<category><![CDATA[Outside]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[tuna]]></category>
		<category><![CDATA[Z]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/proof-of-the-farthest-in-future-optimal-caching-algorithm</guid>

					<description><![CDATA[This topic came up in one of my lectures and I found it a little challenging to understand the proof so I thought I&#8217;d write it down as best as I could explain it so that I could understand it better and possibly help other people understand it better. &#160;Feel free to comment/ask questions/correct me, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>This topic came up in one of my lectures and I found it a little challenging to understand the proof so I thought I&#8217;d write it down as best as I could explain it so that I could understand it better and possibly help other people understand it better. &nbsp;Feel free to comment/ask questions/correct me, etc.</p>
<p>In a computer, there are various methods of storing information. &nbsp;Information can be stored in the processor cache, RAM, hard disk, etc. &nbsp;It can be faster to request information from a storage medium that is smaller. &nbsp;However, this smaller storage medium cannot fit all the possible information that can be requested. &nbsp;So the idea is to insert a portion of the data into the faster, smaller medium (the <strong>cache</strong>) and the rest into the slower, larger medium (<strong>main memory)</strong>.</p>
<p>If a request is made and the data is not available in the faster, smaller medium first, then the data will be read from the slower, larger medium &#8211; this is what is known as a <strong>cache miss</strong>.</p>
<p>Given that all the data cannot possibly live in the cache, there must be a way to minimize the amount of times that the data must be read from the main memory.</p>
<h1>Optimal Caching &#8211; Farthest-in-Future</h1>
<h2>The Algorithm</h2>
<p>The idea is that there is an algorithm that minimizes the amount of cache misses that occur for a set of requests. &nbsp;The <em>Farthest-in-Future Algorithm&nbsp;</em>evicts the item in the cache that is not requested until the farthest in the future. &nbsp;For example, given the following cache with items &#8220;a&#8221; through &#8220;f&#8221;.</p>
<table>
<tbody>
<tr>
<td>Cache Items</td>
<td>a b c d e f</td>
</tr>
<tr>
<td>Future Queries</td>
<td>g a b c e d a b b f</td>
</tr>
</tbody>
</table>
<p><span style="line-height:1.5em;">It is clear that &#8220;g&#8221; does not exist in the set of cache items and so when &#8220;g&#8221; is requested, a cache miss will result. An item will be evicted because &#8220;g&#8221; is not in the cache. &nbsp;According to the </span><em style="line-height:1.5em;">Farthest-in-Future Algorithm</em><span style="line-height:1.5em;">, element &#8220;f&#8221; will be evicted since it is the one that will be used furthest in the future.</span></p>
<h2>Definitions</h2>
<p><strong>Cache Miss</strong> &#8211; Occurs when it is necessary to bring in an item from the main memory into the cache</p>
<p><strong>Schedule</strong>&nbsp;&#8211; A list that contains, for each, request, which item is brought into the cache, and which item is evicted</p>
<p><strong>Reduced Schedule</strong> &#8211; a schedule that only brings in an item when there is a request for that item &#8211; so a non-reduced schedule would bring an item into the cache outside of a request for that item</p>
<h2>Theorem</h2>
<p>To be shown:</p>
<blockquote><p><em>Farthest-in-Future</em> is the optimal algorithm that minimizes the number of cache misses.</p></blockquote>
<p>To prove this, let&#8217;s say there is a schedule SFF&nbsp;that follows the&nbsp;<em>Farthest-in-Future Algorithm</em>&nbsp;and that there is a schedule optimal S<sup><em></sup>&nbsp;that has a minimum number of cache misses. It can be shown that it is possible to transform&nbsp;S<sup></em></sup>&nbsp;into SFF&nbsp;by performing a series of evictions without increasing the number of cache misses. &nbsp;Since&nbsp;S<sup>*</sup>&nbsp;is already optimal, and the number of cache misses did not increase, then SFF&nbsp;must be optimal.</p>
<p>To perform one transformation, the statement below can be used. &nbsp;Right now, it isn&#8217;t all that clear why this is necessary, but it should become clearer further on.</p>
<blockquote><p>Let S&nbsp;be a reduced schedule that is the same as SFF&nbsp;for the first j requests, then there is a reduced schedule S&#8217;&nbsp;that is the same as SFF&nbsp;for the first j+1 requests, and incurs no more misses than S</p></blockquote>
<h2>Proof</h2>
<p>Let&#8217;s say the cache at the start looks like this. &nbsp;S and SFF&nbsp;have the exact same contents (this is what was defined in the previous section).</p>
<table>
<tbody>
<tr>
<td>S</td>
<td>a b c d</td>
</tr>
<tr>
<td>SFF</td>
<td>a b c d</td>
</tr>
</tbody>
</table>
<p><span style="line-height:1.5em;">Given a schedule S, it can be shown that any request can be made, and the resulting schedule would be equal to the ideal algorithm and does not increase the number of cache misses. &nbsp;Essentially, we want S = S&#8217; = SFF&nbsp;after a request is made and that the number of cache misses have not increased. &nbsp;If this can be shown for all different scenarios that items are requested, then&nbsp;</span><em style="line-height:1.5em;">Farthest-in-Future</em><span style="line-height:1.5em;"> is the ideal algorithm.</span></p>
<h3>Case 1: Item Is Already in the Cache</h3>
<p>Now let&#8217;s say the next item to be requested is item &#8220;d&#8221;. &nbsp;It is clear that this item exists in both caches and no evictions are necessary. &nbsp;Since no evictions are necessary, SFF&nbsp;does not change. &nbsp;It was specified in a prior section that there is a schedule S&#8217; that equals SFF, which incurs no more misses than S.</p>
<table>
<tbody>
<tr>
<td>SFF</td>
<td>a b c d</td>
<td>Read&nbsp;d</td>
</tr>
<tr>
<td>S</td>
<td>a b c d</td>
<td>Read&nbsp;d</td>
</tr>
<tr>
<td>S&#8217;</td>
<td>a b c d</td>
<td>Read&nbsp;d</td>
</tr>
</tbody>
</table>
<p>Here, S = S&#8217; because no changes had to be made to the cache and there were no cache misses. &nbsp;After the request for item &#8220;d&#8221;, S = S&#8217;, each with zero cache misses, which is a valid outcome.</p>
<h3>Case 2: Item Is Not in the Cache, S and SFF&nbsp;Evict the Same Item</h3>
<p>Let&#8217;s say the next item to be requested is item &#8220;e&#8221;. &nbsp;Neither cache has this item, so an eviction will have to be made. &nbsp;Let&#8217;s also say SFF&nbsp;and S both choose to evict item &#8220;a&#8221; to make room for &#8220;e&#8221;. &nbsp;It was specified in a prior section that there is a schedule S&#8217; that equals SFF, which incurs no more misses than S.</p>
<table>
<tbody>
<tr>
<td>SFF</td>
<td>b c d e</td>
<td>Evict a; Read e</td>
</tr>
<tr>
<td>S</td>
<td>b c d e</td>
<td>Evict a; Read e</td>
</tr>
<tr>
<td>S&#8217;</td>
<td>b c d e</td>
<td>Evict a; Read e</td>
</tr>
</tbody>
</table>
<p>Here S = S&#8217; because S and SFF&nbsp;both evicted the same item. &nbsp;Both S and S&#8217; each have one cache miss (no increase relative to one another), which is a valid outcome.</p>
<h3>Case 3: Item Is Not in the Cache, S and SFF&nbsp;Each Evict A Different Item</h3>
<p>This is where the proof can become more confusing (as if it isn&#8217;t already). &nbsp;Let&#8217;s say the next item to be requested is &#8220;e&#8221;. &nbsp;Let&#8217;s also say that the ideal algorithm, SFF, evicts &#8220;a&#8221; and S evicts &#8220;b&#8221;.&nbsp;It was specified in a prior section that there is a schedule S&#8217; that equals SFF, which incurs no more misses than S. This means that in order to get S&#8217; = SFF, S&#8217; should evict &#8220;a&#8221; in order to match with SFF.</p>
<table>
<tbody>
<tr>
<td>SFF</td>
<td>b c d e</td>
<td>Evict a; Insert&nbsp;e</td>
</tr>
<tr>
<td>S</td>
<td>a c d e</td>
<td>Evict b; Insert&nbsp;e</td>
</tr>
<tr>
<td>S&#8217;</td>
<td>b c d e</td>
<td>Evict a; Insert&nbsp;e</td>
</tr>
</tbody>
</table>
<p>Here, S does not agree with&nbsp;S&#8217; = SFF. &nbsp;Essentially, these two schedules behave the same, so long as future requests do not request items &#8220;a&#8221; or &#8220;b&#8221;. &nbsp;This shows that there is a schedule S&#8217; that equals SFF, but it is not known whether or not S&#8217; has no more cache misses than S, since &#8220;a&#8221; or &#8220;b&#8221; can be requested in the future, which can determine whether S or S&#8217; has more cache misses. &nbsp;From this point onward, S and S&#8217; behave the same until one of the following happens:</p>
<h4>Case 3a: Item Is in SFF, But Not S; S Evicts &#8220;a&#8221;</h4>
<p>Let&#8217;s say eventually item &#8220;b&#8221; gets requested. &nbsp;In this case, S&#8217; and SFF do not need to change. &nbsp;All S has to do is evict &#8220;a&#8221; to make room for &#8220;b&#8221;. &nbsp;In this case, S has two total cache misses (from request &#8220;e&#8221; and &#8220;b&#8221;), while SFF and S&#8217; each have only one cache miss, thus fulfilling the cache miss requirement.</p>
<table>
<tbody>
<tr>
<td>SFF</td>
<td>b c d e</td>
<td>Insert&nbsp;b</td>
</tr>
<tr>
<td>S</td>
<td>b c d e</td>
<td>Evict a; Insert&nbsp;b</td>
</tr>
<tr>
<td>S&#8217;</td>
<td>b c d e</td>
<td>Insert&nbsp;b</td>
</tr>
</tbody>
</table>
<h4>Case 3b: Item Is Neither in SFF Nor S</h4>
<p>Let&#8217;s say eventually item &#8220;f&#8221; gets requested. &nbsp;S&#8217;, SFF, and S all need to make an eviction. S&#8217; and SFF can evict &#8220;b&#8221; to make room for &#8220;f&#8221;, and S can evict &#8220;a&#8221; to make room for &#8220;f&#8221;. &nbsp;In this case, each schedule as two cache misses, thus fulfilling the cache miss requirement.</p>
<table>
<tbody>
<tr>
<td>SFF</td>
<td>c d e f</td>
<td>Evict b; Insert&nbsp;f</td>
</tr>
<tr>
<td>S</td>
<td>c d e f</td>
<td>Evict a; Insert&nbsp;f</td>
</tr>
<tr>
<td>S&#8217;</td>
<td>c d e f</td>
<td>Evict b; Insert&nbsp;f</td>
</tr>
</tbody>
</table>
<h4>Case 3c: Item Is in SFF, But Not S; S Evicts Item Not Equal to &#8220;a&#8221;</h4>
<p>Let&#8217;s say eventually item &#8220;b&#8221; gets requested and S evicts an item that isn&#8217;t &#8220;a&#8221;, say &#8220;c&#8221;. &nbsp;Now, SFF and S&#8217; both already have &#8220;b&#8221; in the cache. &nbsp;In order to synchronize S and S&#8217; to make them comparable to see how many cache misses each have, S&#8217; and SFF will evict &#8220;c&#8221; to make room for &#8220;a&#8221;.</p>
<table>
<tbody>
<tr>
<td>SFF</td>
<td>a b d e</td>
<td>Evict c; Insert a</td>
</tr>
<tr>
<td>S</td>
<td>a b d e</td>
<td>Evict c; Insert&nbsp;b</td>
</tr>
<tr>
<td>S&#8217;</td>
<td>a b d e</td>
<td>Evict c; Insert&nbsp;a</td>
</tr>
</tbody>
</table>
<p>Since &#8220;a&#8221; is being brought into the cache without a request for &#8220;a&#8221;, this makes S&#8217; and SFF no longer a reduced schedule. &nbsp;However, the proof calls for S&#8217; and SFF being a reduced schedule. &nbsp;Fortunately, it is possible to transform an unreduced schedule into a reduced one. &nbsp;In this case, each schedule has two cache misses, thus fulfilling the cache miss requirement.</p>
<h4>Case 3d: Item Is Not in SFF, But in S</h4>
<p>The only item that is in S and not SFF is item &#8220;a&#8221;. &nbsp;SFF had evicted it initially at the beginning of Case 3. &nbsp;Since SFF had evicted it, it must have been the item that would be requested furthest into the future. &nbsp;Therefore, it is not possible for item &#8220;a&#8221; to be requested before other items.</p>
<p>&nbsp;</p>
<p>After going through all possible eviction decisions that the schedules can do, it was shown that for each scenario, there was indeed a schedule S&#8217; = SFF, where the cache misses incurred in S&#8217; no more than S.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2014/02/02/proof-of-the-farthest-in-future-optimal-caching-algorithm/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1799</post-id>	</item>
		<item>
		<title>The Current State of Counter-Strike 1.6</title>
		<link>https://blog.henrypoon.com/blog/2011/11/13/the-current-state-of-counter-strike-1-6/</link>
					<comments>https://blog.henrypoon.com/blog/2011/11/13/the-current-state-of-counter-strike-1-6/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Sun, 13 Nov 2011 09:21:33 +0000</pubDate>
				<category><![CDATA[gaming]]></category>
		<category><![CDATA[9]]></category>
		<category><![CDATA[Battlefield]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[Club Penguin]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Complexity Gaming]]></category>
		<category><![CDATA[Const]]></category>
		<category><![CDATA[Counter-Strike]]></category>
		<category><![CDATA[Countries]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Day of Defeat]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Esports]]></category>
		<category><![CDATA[Find]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Human]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Lag]]></category>
		<category><![CDATA[Linux games]]></category>
		<category><![CDATA[Lost]]></category>
		<category><![CDATA[Mass]]></category>
		<category><![CDATA[Microsoft games]]></category>
		<category><![CDATA[Multiplayer online games]]></category>
		<category><![CDATA[Multiplayer video games]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[Over]]></category>
		<category><![CDATA[Paris]]></category>
		<category><![CDATA[Run]]></category>
		<category><![CDATA[SK Gaming]]></category>
		<category><![CDATA[STR]]></category>
		<category><![CDATA[Team]]></category>
		<category><![CDATA[Team Fortress Classic]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[Unreal]]></category>
		<category><![CDATA[Unreal Tournament 2003]]></category>
		<category><![CDATA[Video gaming]]></category>
		<category><![CDATA[Windows games]]></category>
		<category><![CDATA[World Opponent Network]]></category>
		<category><![CDATA[Z]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/the-current-state-of-counter-strike-1-6</guid>

					<description><![CDATA[At one point, Counter-Strike 1.6 was the most popular game on the Internet.  Released in 1999, it was one of the most popular games of its day, surpassing even the Battlefield series, Unreal Tournament 2003 and Quake 3.  It was the most popular Half-Life mod.  As game developers released the next generation of games, Counter-Strike [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">At one point, Counter-Strike 1.6 was the most popular game on the Internet.  Released in 1999, it was one of the most popular games of its day, surpassing even the <a href="http://en.wikipedia.org/wiki/Battlefield_%28series%29" target="_blank" rel="noreferrer noopener">Battlefield series</a>, Unreal Tournament 2003 and Quake 3.  It was the most popular Half-Life mod.  As game developers released the next generation of games, Counter-Strike began to lose popularity despite the massive gaming culture surrounding it.  The game had less and less casual players and more and more league players (CAL, CPL, CEVO, CEGL, WCG, OGL, etc.).  In 2004, Valve released Counter-Strike: Source, which introduced more casual players to the game, while the seasoned veterans still stayed with Counter-Strike 1.6 and they saw it as the better game.  Over time, new players of Counter-Strike: Source improved their game, while some CS1.6 veterans migrated over.  Many stopped playing simply due to the fact that they played this game for a long time and just lost interest.  A lot of professional teams such as Team3D, compLexity, SK Gaming, and others migrated over to source.  As more and more teams migrated over, the popularity of CS1.6 waned.  Do people still play Counter-Strike 1.6?</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/11/de_dust20014.jpg?ssl=1" target="_blank" rel="noreferrer noopener"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/11/de_dust20014_thumb.jpg?w=1280&#038;ssl=1" alt="de_dust20014" title="de_dust20014"/></a></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter"><a href="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/11/de_dust20018.jpg?ssl=1" target="_blank" rel="noreferrer noopener"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/11/de_dust20018_thumb.jpg?w=1280&#038;ssl=1" alt="de_dust20018" title="de_dust20018"/></a></figure>
</div>


<p class="has-text-align-center wp-block-paragraph"> I felt a little bit of nostalgia toward the game, so I opened it up to play a little bit.  I played this game for about 8 years on and off (2001 to 2008 inclusive) and participated in a couple leagues such as CAL, CEVO, and CEGL. The last time I played, the community was still pretty strong – I could find a game pretty quickly and play.  Not anymore.</p>



<p class="wp-block-paragraph">Public servers are almost extinct.&nbsp; Most public servers that remain are Romanian.&nbsp; Not that there is anything wrong with that, but there is no point in joining any of these games.&nbsp; They are filled with bots.&nbsp; I looked at the detailed game information and it shows 19 players that all “magically” joined the server at the same time and have been playing for some ridiculous amount of time.&nbsp; Playing 306 hours of Counter-Strike and earning a score of 10000+ is not possible for a human.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/11/csservers1.png?ssl=1" target="_blank" rel="noreferrer noopener"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/11/csservers_thumb1.png?w=1280&#038;ssl=1" alt="CSServers" title="CSServers"/></a></figure>
</div>


<p class="wp-block-paragraph">Out of curiosity, I joined one of these Romanian servers.&nbsp; It turns out that these servers just redirect me to an actual server where people play.&nbsp; The downside is that these servers are actually in Romania, which means I that pinged &gt; 200 to the server.&nbsp; A minute later I am kicked for going over their ping limit.&nbsp; I still can’t play.&nbsp; At least there still is a community for CS1.6.</p>



<p class="wp-block-paragraph">Playing pubs seemed out of the option.&nbsp; The next thing I looked at were pugs.&nbsp; I looked at #findscrim and #findringer.&nbsp; I remember people posting in these channels constantly to organize matches.&nbsp; Not anymore.&nbsp; The frequency of posts has definitely decreased dramatically.&nbsp; It was hard enough for me to find a match on the west coast.&nbsp; People living on the east coast and west coast both post in these channels and of course there would be more east coast games happening simply because more people lived there.&nbsp; Now, with less people playing, it is even harder to find a match on the west coast.</p>



<p class="wp-block-paragraph">Of course, it is normal for a game to reach a peak in popularity and then lose it over time, but I expected Counter-Strike to have a strong player base.&nbsp; In comparison to other games similarly old, such as Day of Defeat (released in 2000) and Team Fortress Classic (released in 1999), they seemed to suffer a similar fate.&nbsp; These games have been reduced to just servers that redirect people to different countries.&nbsp; Why run these servers at all if people will lag on them anyway?&nbsp; If a game is unpopular anymore, it would just have no servers at all.&nbsp; Despite all of that, Counter-Strike was one of the most popular games ever made and it definitely left a mark for many gamers of this generation.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2011/11/13/the-current-state-of-counter-strike-1-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1259</post-id>	</item>
		<item>
		<title>Serial Communication in Java with Example Program</title>
		<link>https://blog.henrypoon.com/blog/2011/01/01/serial-communication-in-java-with-example-program/</link>
					<comments>https://blog.henrypoon.com/blog/2011/01/01/serial-communication-in-java-with-example-program/#comments</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Sun, 02 Jan 2011 01:46:37 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[9]]></category>
		<category><![CDATA[All That]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Books]]></category>
		<category><![CDATA[Chan]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Computer languages]]></category>
		<category><![CDATA[Const]]></category>
		<category><![CDATA[Cookbook]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Data types]]></category>
		<category><![CDATA[Dia]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[Drive]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Final]]></category>
		<category><![CDATA[Find]]></category>
		<category><![CDATA[Flag]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hole]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IME]]></category>
		<category><![CDATA[Introduction]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[ise]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Lag]]></category>
		<category><![CDATA[Lie]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[Object]]></category>
		<category><![CDATA[Object-oriented programming languages]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Over]]></category>
		<category><![CDATA[Page]]></category>
		<category><![CDATA[Parameter]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Plan]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Programming languages]]></category>
		<category><![CDATA[RAR]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Rolling]]></category>
		<category><![CDATA[Run]]></category>
		<category><![CDATA[Serial]]></category>
		<category><![CDATA[Serial communication]]></category>
		<category><![CDATA[Software design patterns]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Speed]]></category>
		<category><![CDATA[STR]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[Struct]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[Thou]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[UNC]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[Variable]]></category>
		<category><![CDATA[Vol]]></category>
		<category><![CDATA[Wiki]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[Writing]]></category>
		<category><![CDATA[XBee]]></category>
		<category><![CDATA[Z]]></category>
		<category><![CDATA[Zip]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/serial-communication-in-java-with-example-program</guid>

					<description><![CDATA[This is more of a follow-up to my previous post about serial programming in Java (here) and how to install the RXTX libraries (here).&#160; This post also assumes that Java is already properly set up with RXTX. Generally, communication with serial ports involves these steps (in no particular order): Searching for serial ports Connecting to [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This is more of a follow-up to my previous post about serial programming in Java (<a title="Java Serial&nbsp;Programming" href="http://henrypoon.wordpress.com/2010/10/11/java-serial-programming/" target="_blank" rel="noopener">here</a>) and how to install the RXTX libraries (<a title="Installing RXTX for Serial Communication with&nbsp;Java" href="http://henrypoon.wordpress.com/2010/12/25/installing-rxtx-for-serial-communication-with-java/" target="_blank" rel="noopener">here</a>).&nbsp; This post also assumes that Java is already properly set up with RXTX.</p>



<p class="wp-block-paragraph">Generally, communication with serial ports involves these steps (in no particular order):</p>



<ul class="wp-block-list"><li>Searching for serial ports</li><li>Connecting to the serial port</li><li>Starting the input output streams</li><li>Adding an event listener to listen for incoming data</li><li>Disconnecting from the serial port</li><li>Sending Data</li><li>Receiving Data</li></ul>



<p class="wp-block-paragraph">I wrote an example program that includes all of those steps in it and are each in their own separate method within the class, but first I will go through my hardware set up.</p>



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



<p class="wp-block-paragraph">My current hardware setup is as follows:</p>



<ul class="wp-block-list"><li>PC connected to an XBee</li><li>Arduino connected to an XBee</li></ul>



<p class="wp-block-paragraph">User input is given from the PC through the a Java GUI that contains code for serial communication, which is the code presented here.</p>



<p class="wp-block-paragraph">The Arduino is responsible for reading this data.&nbsp; This set up is pretty much using my computer as a remote control for whatever device is on the Arduino end.&nbsp; It could be a motor control, on-off switch, etc.</p>



<h1 class="wp-block-heading">Existing Code</h1>



<p class="wp-block-paragraph">The purpose of this post is to discuss serial programming in Java, and not GUI’s.&nbsp; However, I did create a GUI for testing purposes.&nbsp; See the Code Downloads section for the actual files.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" decoding="async" width="300" height="136" src="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/03/javagui.png?resize=300%2C136&#038;ssl=1" alt="" class="wp-image-933" srcset="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/03/javagui.png?resize=300%2C136&amp;ssl=1 300w, https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2011/03/javagui.png?w=640&amp;ssl=1 640w" sizes="(max-width: 300px) 100vw, 300px" /></figure>
</div>


<p class="wp-block-paragraph">Above is the picture of the GUI complete with the buttons that I use to interact with the program.&nbsp; I also added key bindings which I can use to control the throttle.</p>



<p class="wp-block-paragraph">When the program is first started, none of the GUI elements will work except for the combo box and the connect button.&nbsp; Once a successful connection is made the controls are enabled.&nbsp; This is done through the use of the <em>setConnected(true)</em> and the <em>toggleControls()</em> methods shown in the example code that follows.</p>



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



<p class="wp-block-paragraph">The imports i used for this program were as follows:</p>



<pre class="wp-block-code"><code lang="java" class="language-java">import gnu.io.*;
import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.TooManyListenersException;</code></pre>



<p class="wp-block-paragraph">Depending on the Java IDE it might already know to tell you to use these imports except for the first one.&nbsp; That first import is specific to RXTX, and all its library methods/classes are in there.</p>



<h1 class="wp-block-heading">Class Declaration</h1>



<p class="wp-block-paragraph">The code here reads:</p>



<pre class="wp-block-code"><code lang="java" class="language-java">public class Communicator implements SerialPortEventListener</code></pre>



<p class="wp-block-paragraph">I named my class <em>Communicator</em>, but the name is really up to the programmer.&nbsp; The name pretty much reflects its intended use.</p>



<p class="wp-block-paragraph">The class should also <em>implement</em> the <em>SerialPortEventListener</em> class.&nbsp; This is a class in RXTX and is required in order to receive incoming data.</p>



<p class="wp-block-paragraph">On some IDE’s this may generate a public void method called <em>serialEvent()</em>.&nbsp; This method will be defined later.</p>



<h1 class="wp-block-heading">Class Variables and Constants</h1>



<p class="wp-block-paragraph">Below are the variables and constants that I defined in my class.&nbsp; What the variables are for is in the comments but a more detailed explanation will follow.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">    //passed from main GUI
    GUI window = null;

    //for containing the ports that will be found
    private Enumeration ports = null;
    //map the port names to CommPortIdentifiers
    private HashMap portMap = new HashMap();

    //this is the object that contains the opened port
    private CommPortIdentifier selectedPortIdentifier = null;</code></pre>



<p class="wp-block-paragraph">I could have easily put the variable definitions in the constructor but it wouldn’t change anything.</p>



<p class="wp-block-paragraph">The <em>GUI</em> object is another class that I wrote separate from this one that contains all the GUI elements.&nbsp; The GUI class extends <em>javax.swing.JFrame</em>.</p>



<p class="wp-block-paragraph">The <em>HashMap</em> is for mapping each of the ports’ names to the actual object. What that means is that I can associate (<em>put()</em> method) the name of a serial port, say a string that says COM1, to an object in the code.&nbsp; Later, I can access the name COM1 from the <em>HashMap</em> by using the <em>get()</em> method and it will return the object that it was associated with previously.</p>



<p class="wp-block-paragraph">The <em>CommPortIdentifiers</em> object is needed to gather the list of ports that are available for connection. by using its <em>getPortIdentifiers()</em> method.</p>



<p class="wp-block-paragraph">The <em>SerialPort</em> object is for storing the data for the port once a successful connection is made.</p>



<p class="wp-block-paragraph">The <em>InputStream</em> and <em>OutputStream</em> is the object that is required for sending and receiving data.</p>



<p class="wp-block-paragraph">The Boolean variable <em>bConnected</em> is just a flag that I use for enabling and disabling elements on the GUI.</p>



<p class="wp-block-paragraph">The constant <em>TIMEOUT</em> is a number required when opening the port so that it knows how long to try for before stopping.</p>



<p class="wp-block-paragraph">The constants for the ASCII values are some values that I use to send through the output stream that act as delimiters for data.</p>



<p class="wp-block-paragraph">The string <em>logText</em> is basically what the comment says.&nbsp; When stuff happens in the program, the program stores a string in this variable and it will be appended to a text area in the GUI.</p>



<h1 class="wp-block-heading">Searching for Available Serial Ports</h1>



<p class="wp-block-paragraph">The method below is for searching for available serial ports on the computer.&nbsp; Code adapted from Discovering Available Comm Ports from the Reference Material.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">    //search for all the serial ports
    //pre style="font-size: 11px;": none
    //post: adds all the found ports to a combo box on the GUI
    void searchForPorts()
    {
        ports = CommPortIdentifier.getPortIdentifiers();

        &lt;span style="color: blue;"&gt;while (ports.hasMoreElements())
        {
            CommPortIdentifier curPort = (CommPortIdentifier)ports.nextElement();

            //get only serial ports
            &lt;span style="color: blue;"&gt;if (curPort.getPortType() == CommPortIdentifier.PORT_SERIAL)
            {
                window.cboxPorts.addItem(curPort.getName());
                portMap.put(curPort.getName(), curPort);
            }
        }
    }</code></pre>



<p class="wp-block-paragraph">The method <em>getPortIdentifiers()</em> returns an Enumeration of all the comm ports on the computer.&nbsp; The code can iterate through each element inside the Enumeration and determine whether or not it is a serial port.&nbsp; The method <em>getPortType()</em> can identify what kind of port it is.&nbsp; If it is a serial port, then the code will add its name to a combo box in the GUI (so that users can pick what port to connect to).&nbsp; The serial port that is found should also be mapped to the HashMap so we can identify the object later.&nbsp; This is helpful because the names listed in the combo box are the actual names of the object (COM1, COM2, etc), and so we can use these names to identify the actual object they are tied to.</p>



<h1 class="wp-block-heading">Connecting to the Serial Port</h1>



<p class="wp-block-paragraph">The method below is for connecting to the serial port once they have been found (see previous section).&nbsp; See How to Open A Serial Port in the Reference Material for more information.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">
    //connect to the selected port in the combo box
    //ports are already found by using the searchForPorts
    //method
    //post: the connected comm port is stored in commPort, otherwise,
    //an exception is generated
    public void connect()
    {
        String selectedPort = (String)window.cboxPorts.getSelectedItem();
        selectedPortIdentifier = (CommPortIdentifier)portMap.get(selectedPort);

        CommPort commPort = null;

        try
        {
            //the method below returns an object of type CommPort
            commPort = selectedPortIdentifier.open("TigerControlPanel", TIMEOUT);
            //the CommPort object can be casted to a SerialPort object
            serialPort = (SerialPort)commPort;

            //for controlling GUI elements
            setConnected(true);

            //logging
            logText = selectedPort + " opened successfully.";
            window.txtLog.setForeground(Color.black);
            window.txtLog.append(logText + "n");

            //CODE ON SETTING BAUD RATE ETC OMITTED
            //XBEE PAIR ASSUMED TO HAVE SAME SETTINGS ALREADY

            //enables the controls on the GUI if a successful connection is made
            window.keybindingController.toggleControls();
        }
        catch (PortInUseException e)
        {
            logText = selectedPort + " is in use. (" + e.toString() + ")";

            window.txtLog.setForeground(Color.RED);
            window.txtLog.append(logText + "n");
        }
        catch (Exception e)
        {
            logText = "Failed to open " + selectedPort + "(" + e.toString() + ")";
            window.txtLog.append(logText + "n");
            window.txtLog.setForeground(Color.RED);
        }
    }</code></pre>



<p class="wp-block-paragraph">Using the <em>HashMap</em> we can retrieve the <em>CommPortIdentifier</em> object from the string that was mapped earlier.&nbsp; This is achieved through the <em>HashMap’s</em> <em>get()</em> method.&nbsp; The object must also be casted as a <em>CommPortIdentifier</em> because the <em>get()</em> method has a return type of <em>Object</em>.</p>



<p class="wp-block-paragraph">The <em>setConnected </em>method just changes a boolean flag so that the program can store whether or not it is connected to a serial port or not.</p>



<p class="wp-block-paragraph">The <em>CommPort</em> must also be initialized because the port object will be stored here once a successful connection is made.</p>



<p class="wp-block-paragraph">The main method of interest here is the <em>open()</em> method.&nbsp; This instructs the program to open the port, and this method will return the object for the opened port, which I store in in the previously initialized <em>CommPort </em>object.&nbsp; I then cast this object as a <em>SerialPort</em> and store it as well.&nbsp; This is helpful for accessing the methods and variables specific to the <em>SerialPort</em> class.</p>



<p class="wp-block-paragraph">It should also be noted that the <em>open()</em> method requires the use of a try-catch block.&nbsp; So applying that, I catch two different exceptions.&nbsp; The <em>PortInUseException</em> is what the name says.&nbsp; If the port is in use, then this exception is thrown.&nbsp; The next catch block is just for the generic exceptions that occur.&nbsp; I never came across that during testing, nor do I know how to replicate that.</p>



<p class="wp-block-paragraph">I neglected to include any code for setting the baud rate and other settings on the XBee’s (see Hardware Configuration), because I already set those parameters previously using X-CTU (more on setting up XBee’s here).</p>



<h1 class="wp-block-heading">Initializing the Input and Output Streams</h1>



<p class="wp-block-paragraph">This method is pretty short and is pretty straightforward to read.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">    //open the input and output streams
    //pre style="font-size: 11px;": an open port
    //post: initialized input and output streams for use to communicate data
    public boolean initIOStream()
    {
        //return value for whether opening the streams is successful or not
        boolean successful = false;

        try {
            //
            input = serialPort.getInputStream();
            output = serialPort.getOutputStream();
            writeData(0, 0);

            successful = true;
            return successful;
        }
        catch (IOException e) {
            logText = "I/O Streams failed to open. (" + e.toString() + ")";
            window.txtLog.setForeground(Color.red);
            window.txtLog.append(logText + "n");
            return successful;
        }
    }</code></pre>



<p class="wp-block-paragraph">The streams are initialized by returning the input and output streams of the open serial port.&nbsp; In order for the serial port object to not be null, it must store the object for the open serial port.</p>



<p class="wp-block-paragraph">The <em>getInputStream()</em> and <em>getOutputStream()</em> methods both require a try-catch block.&nbsp; The important exception to catch here is the <em>IOException</em> to signify whether the streams failed to open or not.&nbsp; For more information see How to Open A Serial Port in the Reference Material.</p>



<p class="wp-block-paragraph">I also call a method called <em>writeData(0, 0)</em>.&nbsp; This is the method that encapsulates the code required to write serial data.&nbsp; More on that later.&nbsp; Right now it is just used to set variables on the microcontroller side to zero.</p>



<h1 class="wp-block-heading">Setting Up Event Listeners to Read Data</h1>



<p class="wp-block-paragraph">Once the port is open, the serial port must know whenever there is data to be read.&nbsp; This approach is event driven rather than by polling.&nbsp; When the event is hit, a special block of code will run.&nbsp; This is advantageous to polling because polling requires constantly asking if data is available.&nbsp; The code for the event driven approach is below.&nbsp; See Event Based Two Way Communication for more information.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">    //starts the event listener that knows whenever data is available to be read
    //pre style="font-size: 11px;": an open serial port
    //post: an event listener for the serial port that knows when data is received
    public void initListener()
    {
        try
        {
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        }
        catch (TooManyListenersException e)
        {
            logText = "Too many listeners. (" + e.toString() + ")";
            window.txtLog.setForeground(Color.red);
            window.txtLog.append(logText + "n");
        }
    }</code></pre>



<p class="wp-block-paragraph">The code here is pretty much the whole reason why this class implements <em>SerialPortEventListener</em>.&nbsp; The parameter for adding the event listener is just the object itself.&nbsp; The base class has a method called <em>serialEvent(event)</em> that should be overridden before the event code will work.&nbsp; Overriding that method defines what happens when the event is hit.</p>



<p class="wp-block-paragraph">The method <em>addEventListener(this)</em> is the event that is always checking for <em>SerialEvents</em>.&nbsp; It isn’t really important to know what the events actually are, just that the one we’re interested in is the one that tells us whenever data is received.&nbsp; Adding the event listener is complemented by the method <em>notifyOnDataAvailable(true)</em>, which definitely helps us achieve what I mentioned previously.</p>



<p class="wp-block-paragraph">This code requires a try-catch box.&nbsp; The exception here is that there may be too many event listeners.&nbsp; I only use one in the code, so this exception should never be hit.</p>



<h1 class="wp-block-heading">Disconnecting from the Serial Port</h1>



<p class="wp-block-paragraph">Once all the communication is completed, the serial port must be disconnected.&nbsp; In some instances, some ports stay stuck open, which isn’t exactly a good thing.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">    //disconnect the serial port
    //pre style="font-size: 11px;": an open serial port
    //post: closed serial port
    public void disconnect()
    {
        //close the serial port
        try
        {
            writeData(0, 0);

            serialPort.removeEventListener();
            serialPort.close();
            input.close();
            output.close();
            setConnected(false);
            window.keybindingController.toggleControls();

            logText = "Disconnected.";
            window.txtLog.setForeground(Color.red);
            window.txtLog.append(logText + "n");
        }
        catch (Exception e)
        {
            logText = "Failed to close " + serialPort.getName()
                              + "(" + e.toString() + ")";
            window.txtLog.setForeground(Color.red);
            window.txtLog.append(logText + "n");
        }
    }</code></pre>



<p class="wp-block-paragraph">The code here requires a try-catch block so there it is.&nbsp; The exception to catch here is pretty generic.</p>



<p class="wp-block-paragraph">Before closing the port, I reset the data on the microcontroller.&nbsp; That step is optional depending on the application.&nbsp; For example, if the value sent to the microcontroller is controlling the speed of a motor, I’d want the motor to turn off if I turn off the remote control.</p>



<p class="wp-block-paragraph">The event listener should be removed as it is no longer needed.</p>



<p class="wp-block-paragraph">The method to close the port is the <em>close()</em> method.</p>



<p class="wp-block-paragraph">The input and output streams should also be closed via the same method as above.</p>



<p class="wp-block-paragraph">See How to Close A Serial Port in the Reference section for more information.</p>



<h1 class="wp-block-heading">Reading Data – The <em>serialEvent</em> Method</h1>



<p class="wp-block-paragraph">This is a follow-up to the section on preparing to Read Data.&nbsp; It has information on how to process the data that the program reads.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">    //what happens when data is received
    //pre style="font-size: 11px;": serial event is triggered
    //post: processing on the data it reads
    public void serialEvent(SerialPortEvent evt) {
        if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE)
        {
            try
            {
                byte singleData = (byte)input.read();

                if (singleData != NEW_LINE_ASCII)
                {
                    logText = new String(new byte[] {singleData});
                    window.txtLog.append(logText);
                }
                else
                {
                    window.txtLog.append("n");
                }
            }
            catch (Exception e)
            {
                logText = "Failed to read data. (" + e.toString() + ")";
                window.txtLog.setForeground(Color.red);
                window.txtLog.append(logText + "n");
            }
        }
    }</code></pre>



<p class="wp-block-paragraph">Since we only want to read data if it exists, we test the condition in the if statement above.&nbsp; This could be redundant because we wouldn’t be in this method if the event never got triggered.</p>



<p class="wp-block-paragraph">Reading the data requires a try-catch block.&nbsp; The <em>read()</em> method returns an integer, but the value in it is actually a byte value so this is casted to a byte, in which I store in a variable called <em>singleData</em>.&nbsp; When I was testing this code before, I noticed that the data being read would always have random new line characters in it, and I never knew why this happened.&nbsp; I never wrote any new line characters.&nbsp; Since I don’t want these, I add an if condition saying that if it encounters that, don’t display that data on the screen.</p>



<p class="wp-block-paragraph">Java also has a nice way of converting bytes to a string.  A byte array can be used as a parameter when initializing a string, which is what I’ve done when I assign a value to <em>logText</em>.</p>



<p class="wp-block-paragraph">The exception here is just the usual generic one.</p>



<h1 class="wp-block-heading">Writing Data</h1>



<p class="wp-block-paragraph">Here is the method for writing data.&nbsp; In my application, I am writing two integers sequentially to my microcontroller.&nbsp; Data that is sent to the MCU can be used for such things such as controlling motor speeds, which is what I am trying to do here.&nbsp; I hope to use the data sent do control the PWM duty cycle of the motor for speed control.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">    //method that can be called to send data
    //pre style="font-size: 11px;": open serial port
    //post: data sent to the other device
    public void writeData(int leftThrottle, int rightThrottle)
    {
        try
        {
            output.write(leftThrottle);
            output.flush();
            //this is a delimiter for the data
            output.write(DASH_ASCII);
            output.flush();

            output.write(rightThrottle);
            output.flush();
            //will be read as a byte so it is a space key
            output.write(SPACE_ASCII);
            output.flush();
        }
        catch (Exception e)
        {
            logText = "Failed to write data. (" + e.toString() + ")";
            window.txtLog.setForeground(Color.red);
            window.txtLog.append(logText + "n");
        }
    }</code></pre>



<p class="wp-block-paragraph">The <em>write() </em>method here requires a try-catch block just like many of the other methods used for serial communication.&nbsp; Using the output stream, I call that method to write an integer value.&nbsp; I also write a dash and a space to separate the actual data being read.&nbsp; See the ASCII Table for the values of what these characters should be.&nbsp; This helps me differentiate the sets of data that is sent back and forth.&nbsp; The dash separates the two integers being sent and the space separates the entire set.&nbsp; On the Arduino end, four called to <em>read()</em> can separate the data without mixing things up.&nbsp; Example of that later.</p>



<h1 class="wp-block-heading">Putting All the Java Code Together</h1>



<p class="wp-block-paragraph">Once all these methods are setup, they need to be called somewhere in the program so we can put them to use.&nbsp; When the program starts, the code for searching for serial ports will run so that it can populate the combo box on the GUI.&nbsp; The GUI buttons also need to be disabled to reflect the fact they should be disabled when there is no connection to a port.&nbsp; When the connect button is pressed, the input and output streams are started and the event listener is added.&nbsp; The code for that is shown below.</p>



<pre class="wp-block-code"><code lang="java" class="language-java">        private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {
            communicator.connect();
            if (communicator.getConnected() == true)
            {
                if (communicator.initIOStream() == true)
                {
                    communicator.initListener();
                }
            }
        }</code></pre>



<p class="wp-block-paragraph">The if statement is needed such that the code will not run if a successful connection was not made.&nbsp; This is the precondition for the <em>initIOStream() </em>and the <em>initLIstener() </em>methods.</p>



<p class="wp-block-paragraph">When the user decides to disconnect from the serial port, the user only needs to call the <em>disconnect()</em> method when the disconnect button is pressed.</p>



<p class="wp-block-paragraph">The up/down arrows on my GUI are set to write data to the serial port when they are pressed.&nbsp; When data is written to the Arduino, the MCU will send the data back to the Java program, which will signal the event listener to display that data back to the screen.</p>



<h1 class="wp-block-heading">Arduino Code</h1>



<p class="wp-block-paragraph">The Arduino code is pretty straight forward.&nbsp; There are just a few calls to the <em>read()</em> method.</p>



<p class="wp-block-paragraph">Update 6 May 2012: the syntax for the Arduino code has updated since the writing of this article. &nbsp;Apparently, the lines</p>



<pre class="wp-block-code"><code lang="c" class="language-c">Serial.print(separator, BYTE);
Serial.print(space, BYTE);</code></pre>



<p class="wp-block-paragraph">are no longer valid and have since been replaced by the following:</p>



<pre class="wp-block-code"><code lang="c" class="language-c">Serial.write(byte(separator));
Serial.write(byte(space));</code></pre>



<p class="wp-block-paragraph">The code below hasn&#8217;t been edited with this change, but basically the code required for writing a byte value through serial communication has changed.</p>



<pre class="wp-block-code"><code lang="c" class="language-c">
// this is where we will put our data
int left = 0;
int right = 0;
byte space = 0;
byte separator = 0;

void setup(){
  // Start up our serial port, we configured our XBEE devices for 38400 bps. 
  Serial.begin(9200);
}

void loop(){
  // handle serial data, if any
  if (Serial.available() &amp;gt;= 4){
    left = Serial.read();
    separator = Serial.read();
    right = Serial.read();
    space = Serial.read();
    Serial.flush();

    Serial.print(left);
    Serial.print(separator, BYTE);
    Serial.print(right);
    Serial.print(space, BYTE);
    Serial.print("n");
  }
}</code></pre>



<p class="wp-block-paragraph">I first declare four variables to reflect the fact that I’m writing four different variables to the serial port.</p>



<p class="wp-block-paragraph">In the loop method, I added a condition which will check whether there are four pieces of data available before reading them.&nbsp; This again reflects the fact I’m writing four values.</p>



<p class="wp-block-paragraph">The four variables initially declared store the values in the order that they are written, and then are just printed to the screen.</p>



<p class="wp-block-paragraph">The <em>print()</em> method is able to convert the byte value to an actual character by adding a second parameter called <em>BYTE</em>.&nbsp; The left and right variables don’t need it because the values written were integers to begin with, however, the dash and space characters were written as ASCII values.</p>



<p class="wp-block-paragraph">For more information about Arduino and Java, and Arduino’s Serial library, please refer to those in the Reference Section.</p>



<h1 class="wp-block-heading">Code Downloads</h1>



<p class="wp-block-paragraph">Here are the code downloads for the GUI, key bindings and the serial communication.&nbsp; WordPress doesn’t allow uploads of zip or java files so I uploaded it all to Megaupload.</p>



<p class="wp-block-paragraph">Link to download:&nbsp;<a href="http://www.mediafire.com/?z2l26ncypmzn20z" target="_blank" rel="noopener">http://www.mediafire.com/?z2l26ncypmzn20z</a></p>



<h1 class="wp-block-heading">Other Examples</h1>



<p class="wp-block-paragraph">There are also other sites I looked at which had example code for serial port communication in Java.&nbsp; The sites are Programming Serial and Parallel Ports and Serial Port Access Using RXTX in Java, which are both in the Reference section.</p>



<h1 class="wp-block-heading">Reference Material</h1>



<p class="wp-block-paragraph">Below are a bunch of links to reference sites that I used to find some of the information written here.&nbsp; I mostly referred to bits and pieces of each article to understand the serial code and to come up with the example I present here.&nbsp; The list is in the order that I referenced them.</p>



<h2 class="wp-block-heading">Discovering Available Comm Ports</h2>



<p class="wp-block-paragraph"><a href="http://rxtx.qbang.org/wiki/index.php/Discovering_available_comm_ports" target="_blank" rel="noopener">http://rxtx.qbang.org/wiki/index.php/Discovering_available_comm_ports</a></p>



<p class="wp-block-paragraph">The code on this page is pretty specific to the title of this heading, and the code is pretty easy to follow.</p>



<h2 class="wp-block-heading">How to Open A Serial Port</h2>



<p class="wp-block-paragraph"><a target="_blank" rel="noopener">http://embeddedfreak.wordpress.com/2008/08/08/how-to-open-serial-port-using-rxtx/</a></p>



<p class="wp-block-paragraph">This page provides a very concise and detailed explanation on what each line of code does in order to get a serial port open.&nbsp; Definitely work a look if you’re trying to understand the code.</p>



<h2 class="wp-block-heading">Event Based Two Way Communication</h2>



<p class="wp-block-paragraph"><a href="http://rxtx.qbang.org/wiki/index.php/Event_Based_Two_Way_Communication" target="_blank" rel="noopener">http://rxtx.qbang.org/wiki/index.php/Event_Based_Two_Way_Communication</a></p>



<p class="wp-block-paragraph">This page has example code on how to connect to a serial port and how to interact with it.&nbsp; The code here uses events, rather than polling, to send data back and forth, which means that whenever data is received, the event code is triggered.</p>



<h2 class="wp-block-heading">How to Close A Serial Port</h2>



<p class="wp-block-paragraph"><a target="_blank" rel="noopener">http://embeddedfreak.wordpress.com/2008/08/08/how-to-close-serial-port-in-rxtx/</a></p>



<p class="wp-block-paragraph">This article is written by the same author who wrote the article on how to open serial ports.  Good example code here.</p>



<h2 class="wp-block-heading">ASCII Table</h2>



<p class="wp-block-paragraph"><a href="http://www.asciitable.com/" target="_blank" rel="noopener">http://www.asciitable.com/</a></p>



<p class="wp-block-paragraph">Having the ASCII Table is quite handy for serial data because data being sent and written are bytes, so being able to know what byte values correspond to what character really helps.</p>



<h2 class="wp-block-heading">Arduino and Java</h2>



<p class="wp-block-paragraph"><a href="http://www.arduino.cc/playground/Interfacing/Java" target="_blank" rel="noopener">http://www.arduino.cc/playground/Interfacing/Java</a></p>



<p class="wp-block-paragraph">This article discusses how to use the serial port communication with Java and Arduino, which is exactly what I am after.&nbsp; It has example code on pretty much the entire process of serial port communication, but it may be too much to read since there is little explanation about the code.</p>



<h2 class="wp-block-heading">Arduino Serial Class</h2>



<p class="wp-block-paragraph"><a href="http://arduino.cc/en/Reference/Serial" target="_blank" rel="noopener">http://arduino.cc/en/Reference/Serial</a></p>



<p class="wp-block-paragraph">A good reference for Arduino’s Serial class methods.&nbsp; Also has example code to look at.</p>



<h2 class="wp-block-heading">Programming Serial and Parallel Ports</h2>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://docs.google.com/viewer?url=http%3A%2F%2Fjava.sun.com%2Fdeveloper%2FBooks%2Fjavaprogramming%2Fcookbook%2F11.pdf
</div></figure>



<p class="wp-block-paragraph">This article provides a brief introduction to programming serial ports and has information on the steps required to talk to the serial port.&nbsp; However, the code examples in there may be hard to follow for someone new to serial programming.</p>



<h2 class="wp-block-heading">Serial Port Access Using RXTX in Java</h2>



<p class="wp-block-paragraph"><a href="http://gomultidomain.blogspot.com/2008/06/serial-port-access-using-rxtx-in-java.html" target="_blank" rel="noopener">http://gomultidomain.blogspot.com/2008/06/serial-port-access-using-rxtx-in-java.html</a></p>



<p class="wp-block-paragraph">This page also has complete code for serial communication in Java, but what I was looking for here was how to use the write method to send serial data from Java.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2011/01/01/serial-communication-in-java-with-example-program/feed/</wfw:commentRss>
			<slash:comments>144</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">566</post-id>	</item>
		<item>
		<title>Infinite Loop</title>
		<link>https://blog.henrypoon.com/blog/2010/01/12/infinite-loop/</link>
					<comments>https://blog.henrypoon.com/blog/2010/01/12/infinite-loop/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Wed, 13 Jan 2010 06:06:40 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[Assumption]]></category>
		<category><![CDATA[Computer programming]]></category>
		<category><![CDATA[Control flow]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[For loop]]></category>
		<category><![CDATA[Infinite loop]]></category>
		<category><![CDATA[Infinity]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Recursion]]></category>
		<category><![CDATA[Repeat loop]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[STR]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/infinite-loop</guid>

					<description><![CDATA[Apparently this gives an infinite loop: [code]#include &#38;lt;iostream&#38;gt; using namespace std; int main() { int i = 0; for ( ; ; ) { cout &#38;lt;&#38;lt; i++; cout &#38;lt;&#38;lt; &#34;n&#34;; } return 0; }[/code]]]></description>
										<content:encoded><![CDATA[<p>Apparently this gives an infinite loop:</p>
<p>[code]#include &amp;lt;iostream&amp;gt;<br />
using namespace std;</p>
<p>int main() {<br />
int i = 0;<br />
for ( ; ; ) {<br />
cout &amp;lt;&amp;lt; i++;<br />
cout &amp;lt;&amp;lt; &quot;n&quot;;<br />
}<br />
return 0;<br />
}[/code]</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2010/01/12/infinite-loop/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">169</post-id>	</item>
		<item>
		<title>Notes on Computer from A-Link</title>
		<link>https://blog.henrypoon.com/blog/2009/11/22/notes-on-computer-from-a-link/</link>
					<comments>https://blog.henrypoon.com/blog/2009/11/22/notes-on-computer-from-a-link/#respond</comments>
		
		<dc:creator><![CDATA[hp]]></dc:creator>
		<pubDate>Sun, 22 Nov 2009 03:22:00 +0000</pubDate>
				<category><![CDATA[computer stuff]]></category>
		<category><![CDATA[9]]></category>
		<category><![CDATA[BIOS]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Computer architecture]]></category>
		<category><![CDATA[Computer buses]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Drive]]></category>
		<category><![CDATA[Electrical connectors]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[IBM PC compatibles]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[ise]]></category>
		<category><![CDATA[It]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[Motherboard]]></category>
		<category><![CDATA[Nonvolatile BIOS memory]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[Over]]></category>
		<category><![CDATA[Parallel ATA]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Prompt]]></category>
		<category><![CDATA[RAID]]></category>
		<category><![CDATA[Run]]></category>
		<category><![CDATA[Serial ATA]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows XP]]></category>
		<guid isPermaLink="false">http://henrypoon.mooo.com/blog/notes-on-computer-from-a-link</guid>

					<description><![CDATA[When installing a hard drive on this computer, do not use the VIA RAID Controller.&#160; Do not use the set of SATA ports on the motherboard that are associated with it.&#160; They are broken. The computer only operates when the BIOS setting is set to &#8220;IDE Operating Mode&#8221;.&#160; It should be under the &#8220;Chipset&#8221; section [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">When installing a hard drive on this computer, do not use the VIA RAID Controller.&nbsp; Do not use the set of SATA ports on the motherboard that are associated with it.&nbsp; They are broken.</p>



<p class="wp-block-paragraph">The computer only operates when the BIOS setting is set to &#8220;IDE Operating Mode&#8221;.&nbsp; It should be under the &#8220;Chipset&#8221; section in the BIOS.</p>



<p class="wp-block-paragraph">Installing Windows XP requires SATA drivers.&nbsp; Press F6 when prompted and insert the floppy disk that says &#8220;SATA 378 Promise Controller Drivers&#8221;.</p>



<p class="wp-block-paragraph">There seems to have been a piece that broke off from one of the computer components.&nbsp; It most likely is from the motherboard.&nbsp; I don&#8217;t know what its significance is.&nbsp; I&#8217;ve seen a component exactly like this elsewhere on the motherboard, but I don&#8217;t know where it goes.</p>



<p class="wp-block-paragraph">UPDATE: It looks like the jumper that can be used to reset the CMOS. &nbsp;By putting this over the two jumper pins, the CMOS is shorted and reset.</p>



<figure class="wp-block-image"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2009/12/dsc00010.jpg?w=1280" alt=""/></figure>



<figure class="wp-block-image"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/blog.henrypoon.com/wp-content/uploads/2009/12/dsc00014.jpg?w=1280" alt=""/></figure>



<p class="wp-block-paragraph">Currently running on 1 stick of 512 MB RAM.&nbsp; The other stick of RAM has an error on it.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Memtest Data:<br>Test 8<br>Pass 12<br>Failing address: 000274931C &#8211; 628.1 MB<br>Good: ffffffff<br>Bad: fffffff7<br>Err-bits: 00000008<br>Count: 1<br>Char: &#8211;</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.henrypoon.com/blog/2009/11/22/notes-on-computer-from-a-link/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29</post-id>	</item>
	</channel>
</rss>
