<?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>matthewphiong blog</title>
	<atom:link href="https://matthewphiong.com/feed" rel="self" type="application/rss+xml" />
	<link>https://matthewphiong.com</link>
	<description>Programming, UI/UX, startup, entrepreneurship and random notes.</description>
	<lastBuildDate>Thu, 13 Jun 2019 06:03:31 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>

<image>
	<url>https://matthewphiong.com/wp-content/uploads/2017/04/cropped-mattvatar-500-32x32.png</url>
	<title>matthewphiong blog</title>
	<link>https://matthewphiong.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Debugging React Native App on a Xiaomi Phone</title>
		<link>https://matthewphiong.com/debugging-react-native-app-on-a-xiaomi-phone</link>
		<comments>https://matthewphiong.com/debugging-react-native-app-on-a-xiaomi-phone#comments</comments>
		<pubDate>Thu, 20 Apr 2017 18:22:18 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[react native]]></category>
		<category><![CDATA[xiaomi]]></category>

		<guid isPermaLink="false">http://matthewphiong.com/?p=320</guid>
		<description><![CDATA[<p>How to configure Xiaomi phone for React Native debugging.</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/debugging-react-native-app-on-a-xiaomi-phone">Debugging React Native App on a Xiaomi Phone</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>If you’re like me who is using a Xiaomi phone and at the same time developing a <a href="https://facebook.github.io/react-native/" target="_blank" rel="noopener noreferrer">React Native</a> App, you will at some point want to test your app on a real device. But since the device is a Xiaomi phone, you might run into a bit of a trouble.</p>
<h3>Problem #1: Unable to install APK ‘app-debug.apk’ on device.</h3>
<p>Basically, uploading the debug APK to the phone failed. There are some suggestions that you should upgrade or downgrade Gradle to a certain version but before you do that, do this:</p>
<p>Go to <strong>Settings &gt; Additional settings &gt; Developer options</strong>, scroll to the very bottom and <strong>turn off “Turn on MIUI optimization”</strong>. Wait for your phone to reboot and try again.</p>
<p>In my case, I’m able to get it running after turning off MIUI optimization in development mode. If this doesn’t work, you might want to consider looking into other options.</p>
<h3>Problem #2: In-app developer menu not showing.</h3>
<p>So far so good… until you want to access the developer menu. You might be shaking your phone violently hoping the menu will pop up. No luck! At one point I thought my phone’s accelerometer is not working but it turns out, yet again MIUI is the culprit.</p>
<p>The developer menu is blocked by MIUI by default. To fix this:</p>
<p>Go to <strong>Settings &gt; Installed apps &gt; [Your App Name] &gt; Permission manager</strong>, and <strong>enable “Display pop-up window”</strong>.</p>
<p>Shake again. The developer menu should pop up as expected with just a little shaking. If not, most likely there is a hardware problem. You can test your accelerometer using the Compass app that comes with MIUI.</p>
<hr />
<p>MIUI might be friendly and easy to use for normal users but not so friendly to developers. Not saying MIUI is bad, just that it’s not that straightforward for developers. IMHO, MIUI is one of the best Android ROMs out there, especially if you’re coming from iOS world.</p>
<p><em>Note that the settings might be a little different depending on the version of MIUI. My Xiaomi phone is a Mi 4i running Android Lollipop (5.0.2) and MIUI 8.2 (Global).</em></p>
<p>&nbsp;</p>
<p>Happy debugging!</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/debugging-react-native-app-on-a-xiaomi-phone">Debugging React Native App on a Xiaomi Phone</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/debugging-react-native-app-on-a-xiaomi-phone/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linode vs Digital Ocean</title>
		<link>https://matthewphiong.com/linode-vs-digital-ocean</link>
		<comments>https://matthewphiong.com/linode-vs-digital-ocean#respond</comments>
		<pubDate>Fri, 12 Apr 2013 18:49:29 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Notes]]></category>

		<guid isPermaLink="false">http://matthewphiong.com/?p=252</guid>
		<description><![CDATA[<p>Digital Ocean* is relatively new in the cloud hosting industry but is getting a lot of serious attention as of late mainly because of its price and SSD hard drives. There are also a lot of stuff going on at Linode* lately where they are upgrading their hardware, double the RAM and faster network. Let&#8217;s [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/linode-vs-digital-ocean">Linode vs Digital Ocean</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="https://www.digitalocean.com/?refcode=f2ed1018e4cb" target="_blank">Digital Ocean</a>* is relatively new in the cloud hosting industry but is getting a lot of serious attention as of late mainly because of its price and SSD hard drives. There are also a lot of stuff going on at <a href="https://www.linode.com/?r=e56a449fc9162a39264176a70f30e659d5754d5f" target="_blank">Linode</a>* lately where they are upgrading their hardware, double the RAM and faster network. Let&#8217;s take a closer look between them in terms of resources/price.</p>
<p>For comparison, we will use Linode 1GB plan and Digital Ocean 1GB Droplet.</p>
<h2>Pricing (Updated)</h2>
<p>Linode:</p>
<ul>
<li>CPU: 1 Core</li>
<li>RAM: 1GB</li>
<li>Storage: 24GB SSD</li>
<li>Bandwidth: 2TB</li>
<li>Pricing: $10.00</li>
</ul>
<div>
<p>Digital Ocean:</p>
<ul>
<li>CPU: 1 Core</li>
<li>RAM: 1GB</li>
<li>Storage: 30GB SSD</li>
<li>Bandwidth: 2TB</li>
<li>Pricing: $10.00</li>
</ul>
</div>
<p>Pricing/specs wise, both of them are identical, except Do offers 6GB more storage.</p>
<h2>Performance</h2>
<p>There is a detailed performance benchmarking between Linode and Digital Ocean by <a href="http://jasonormand.com/2013/02/08/linode-vs-digitalocean-performance-benchmarks/" target="_blank">Jason Ormand</a> and also bits and pieces can be found on Hacker News.</p>
<ul>
<li>Network: Linode has better network connectivity compared to DO as mentioned here on <a href="https://news.ycombinator.com/item?id=5211109">Hacker News</a>. Currently, there is no internal network for DO droplets but is <a href="https://twitter.com/digitalocean/status/321650732703023105" target="_blank">coming soon</a>.</li>
<li>CPU: All Linode&#8217;s plans come with 8 cores so Linode clearly has an upper hand in terms of CPU performance.</li>
<li>I/O: All DO&#8217;s plans come with SSD storage so it&#8217;s blazing fast. DO wins hands down.</li>
<li>RAM: DO is slightly better in RAM speed compared to Linode.</li>
</ul>
<p>If CPU performance is important for your app or if your servers need to communicate internally (e.g. separate app and db server), you should go with Linode. Otherwise, DO gets my vote.</p>
<h2>Others</h2>
<ul>
<li>Data center: Linode has more options compared to DO. Linode: Newark, Atlanta, Fremont, Dallas, London and Tokyo. DO: New York, San Francisco, Amsterdam and Singapore.</li>
<li>iPhone app: Linode has one and it&#8217;s really convenient to manage your servers on the go.</li>
</ul>
<h2>Support</h2>
<p>I can&#8217;t speak on behalf of DO as I&#8217;m not one of their customers yet but I can speak highly for Linode. I&#8217;ve been with Linode for more than 4 years and their support is second to none. Their response time is usually less than 3 minutes and their support staff know what they are doing.</p>
<h2>Benchmark</h2>
<p>Here is a nice <a href="http://remcobron.com/cloud-server-review-and-comparison-amazon-aws-ec2-vs-linode-vs-digitalocean/" target="_blank">post</a> written by Remco Bron comparing EC2 vs Linode vs Digital Ocean. For $20/month, Linode clearly gives you a better performance thanks to their 8 cores CPU but I expect Digital Ocean to catch up very soon.</p>
<h2>Conclusion</h2>
<p><a href="https://twitter.com/intent/tweet?text=I+still+think+%28as+of+writing%29+Linode+is+more+suited+for+production+while+Digital+Ocean+is+great+for+development&url=https%3A%2F%2Fmatthewphiong.com%2Flinode-vs-digital-ocean&hashtags=&related="
                            target="_blank"
                            class="click-and-tweet-inline right"
                            >I still think (as of writing) Linode is more suited for production while Digital Ocean is great for development<span class="click-and-tweet-twitter-logo">
                            <span class="call-to-action-text">Click & Tweet!</span>
                        </span></a>. Feel free to chip in in the comments below, especially you have experienced both Linode and Digital Ocean.</p>
<p>Update: DO has <a href="http://trends.netcraft.com/www.digitalocean.com" target="_blank">grown a lot</a> over the past years and being used by many for production. I think both are great, but my inexperience with DO and as a Linode customer for many years, I would still go with Linode&#8230; but DO&#8217;s $5 plan is a killer. Super handy for development or some light hosting that doesn&#8217;t require lots of RAM and CPU.</p>
<p><em>*Note: My referral link. Sign-up using my link if you think this post is useful, I would appreciate the <em>referral.</em></em></p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/linode-vs-digital-ocean">Linode vs Digital Ocean</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/linode-vs-digital-ocean/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sublime CodeIntel Configuration for virtualenv</title>
		<link>https://matthewphiong.com/sublime-codeintel-configuration-for-virtualenv</link>
		<comments>https://matthewphiong.com/sublime-codeintel-configuration-for-virtualenv#comments</comments>
		<pubDate>Sun, 13 Nov 2011 07:13:40 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://matthewphiong.com/?p=224</guid>
		<description><![CDATA[<p>If you are using Sublime Text 2, Sublime CodeIntel is a must have plugin. It provides code intelligence for languages ranging from Python to Javascript with features like code autocomplete and jump to symbol definition. Working with virtualenv It supports Python default installation out of the box but if you are working with virtualenv, then [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/sublime-codeintel-configuration-for-virtualenv">Sublime CodeIntel Configuration for virtualenv</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>If you are using Sublime Text 2, <a href="https://github.com/Kronuz/SublimeCodeIntel" target="_blank">Sublime CodeIntel</a> is a must have plugin. It provides code intelligence for languages ranging from Python to Javascript with features like code autocomplete and jump to symbol definition.</p>
<h2>Working with virtualenv</h2>
<p>It supports Python default installation out of the box but if you are working with <a href="http://www.virtualenv.org/en/latest/index.html" target="_blank">virtualenv</a>, then you will need to manually configure CodeIntel to pick up your virtual environment.</p>
<p>Configuration files are located at <code>~/.codeintel/config</code> or <code>project_root/.codeintel/config</code> (you might need to create this yourself). Change the config file like so:</p>
<script src="https://gist.github.com/1361735.js"></script><noscript><pre><code class="language- ">{
    &quot;Python&quot;: {
        &quot;python&quot;: '~/.virtualenvs/your_env/bin/python',
        &quot;pythonExtraPaths&quot;: ['~/.virtualenvs/your_env/lib/python2.6/site-packages',
        ]
    },
}</code></pre></noscript>
<p>The example above is based on my virtualenv setup, yours might be different. So, please change accordingly.</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/sublime-codeintel-configuration-for-virtualenv">Sublime CodeIntel Configuration for virtualenv</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/sublime-codeintel-configuration-for-virtualenv/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Managing Django Static Files on Heroku</title>
		<link>https://matthewphiong.com/managing-django-static-files-on-heroku</link>
		<comments>https://matthewphiong.com/managing-django-static-files-on-heroku#comments</comments>
		<pubDate>Thu, 10 Nov 2011 07:59:38 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[collectstatic]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[heroku]]></category>

		<guid isPermaLink="false">http://matthewphiong.com/?p=207</guid>
		<description><![CDATA[<p>Deploying and running Django apps on Heroku is really a no-brainer, except for one thing — serving static files via collectstatic. I run collectstatic as usual, using heroku run command just like how I did it for syncdb. It worked but I&#8217;m getting 404 error when serving static files. It turns out that running collectstatic via [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/managing-django-static-files-on-heroku">Managing Django Static Files on Heroku</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Deploying and running <a href="http://devcenter.heroku.com/articles/django" target="_blank">Django apps on Heroku</a> is really a no-brainer, except for one thing — serving static files via <code><strong>collectstatic</strong></code>.</p>
<p>I run <code><strong>collectstatic</strong></code> as usual, using <code><strong>heroku run</strong></code> command just like how I did it for <code><strong>syncdb</strong></code>. It worked but I&#8217;m getting 404 error when serving static files.</p>
<p>It turns out that running <code><strong>collectstatic</strong></code> via <code><strong>heroku run</strong></code> spins up a new dyno and <code><strong>collectstatic</strong></code> is running in an isolated environment. So, all the collected static files are deployed to that location and only for this new dyno and the dyno attached to our Django app can&#8217;t access that. — <em>Heroku support staff</em></p>
<h2>Solution</h2>
<p>The dead simple solution would be to run <code><strong>collectstatic</strong></code> as part of the Procfile before starting the app. We need to &#8220;chain&#8221; together our Procfile commands for the web process, like so:</p>
<script src="https://gist.github.com/1352347.js"></script><noscript><pre><code class="language- ">web: python my_django_app/manage.py collectstatic --noinput; bin/gunicorn_django --workers=4 --bind=0.0.0.0:$PORT my_django_app/settings.py </code></pre></noscript>
<p>OK there you go, no more 404 error when serving static files from your Django app on Heroku. Plus, every time you deploy your app, newly added static files will be collected automatically.</p>
<h2><strong>Update</strong></h2>
<p>There are a lot of questions about the configurations. Cross check with my settings.py here <a href="http://pastebin.com/H43gRKsJ" target="_blank">http://pastebin.com/H43gRKsJ</a></p>
<p>Important thing here is your STATICFILES_DIRS. Make sure to include your project_name/app_name/static here. In my case, I have project_name/staticfiles for the STATIC_ROOT. Change STATIC_URL = &#8216;/static/&#8217; if you want to serve from Heroku, same goes to ADMIN_MEDIA_PREFIX = &#8216;/static/admin/&#8217;</p>
<p>Finally add this to your urls.py in order to serve from Heroku.</p>
<pre>urlpatterns += patterns('',
 (r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
 )</pre>
<p>Files could be access as such:</p>
<pre>/app/project_name/staticfiles/style.css &gt; <a href="http://flaming-fire-999.herokuapp.com/static/style.css" target="_blank">http://flaming-fire-999.<wbr />herokuapp.com/static/style.css</a></pre>
<pre>/app/lib/python2.7/site-<wbr />packages/django/contrib/admin/<wbr />media/css/login.css &gt; <a href="http://flaming-fire-999.herokuapp.com/static/admin/css/login.css" target="_blank">http://flaming-fire-999.<wbr />herokuapp.com/static/admin/<wbr />css/login.css</a></pre>
<p>Please note that this is not the best way to serve static files but it works. One last thing, you still need to go through all these things if you are using django storages and django compressor to serve static files via Amazon S3 because django compressor needs a temp file system cache on Heroku.</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/managing-django-static-files-on-heroku">Managing Django Static Files on Heroku</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/managing-django-static-files-on-heroku/feed</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>Start-Up Chile: Want to Make The Cut? Here Are Some Advice</title>
		<link>https://matthewphiong.com/start-up-chile-want-to-make-the-cut-here-are-some-advice</link>
		<comments>https://matthewphiong.com/start-up-chile-want-to-make-the-cut-here-are-some-advice#comments</comments>
		<pubDate>Sat, 22 Oct 2011 16:03:41 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Startup]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[startup chile]]></category>

		<guid isPermaLink="false">http://matthewphiong.com/?p=189</guid>
		<description><![CDATA[<p>The 3rd and final round of Start-Up Chile 2011 application is now open. If your startup is still in &#8220;alpha/beta&#8221; mode, you are highly encouraged to apply (even your startup is not, do apply). My startup, Flvrd (still in beta mode) was one of 154 startups around that get selected in the previous round. If [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/start-up-chile-want-to-make-the-cut-here-are-some-advice">Start-Up Chile: Want to Make The Cut? Here Are Some Advice</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>The 3rd and final round of <a href="http://www.startupchile.org/" target="_blank">Start-Up Chile</a> 2011 application is now open. If your startup is still in &#8220;alpha/beta&#8221; mode, you are highly encouraged to <a href="http://www.startupchile.org/about/apply/" target="_blank">apply</a> (even your startup is not, do apply). My startup, <a href="http://flvrd.com/" target="_blank">Flvrd</a> (still in beta mode) was one of 154 startups around that get selected in the previous round.</p>
<p>If you are applying or think to apply, one of the questions that usually goes through your mind is: &#8220;<strong>Is it hard to get into Start-Up Chile?</strong>&#8221;</p>
<p>Well, honestly I don&#8217;t think it is hard based on Flvrd&#8217;s application but it is getting tougher from round to round because more and more startups are applying. FYI, Round 1 (329 applications, 110 startups selected) and Round 2 (650+ applications, 154 startups selected).</p>
<p>But there are a few important areas that I think you need to really focus on. So lets go through those (together with my personal advice) by looking into the judging criteria.</p>
<ol>
<li>Human Capital (weight: 33%): quality of the talent and commitment of the founding team members.</li>
<li>Project (weight: 34% – composite): Strategy, differentiation, and innovation factors of the product/service purported:</li>
<ul>
<li>Product/Service (weight: 17%)</li>
<li>Market (weight: 17%)</li>
</ul>
<li>Environment (weight: 33%): Value of the founding team’s networks for the Chilean entrepreneurship ecosystem.</li>
</ol>
<h2><strong>Human Capital</strong></h2>
<p>They are looking for an awesome team. All startup incubators are looking for the best team and not the best idea. So make sure you have an awesome team — good chemistry, work well together, complementary skill sets and some impressive stats about the team members.</p>
<p>In brief, the Flvrd Team: Flvrd has two co-founders (<a href="http://blog.koekoecrunch.com">Koekoe</a> and I) with complementary skill sets. We have known each other for more than 3 years and we work together on projects and group assignments during our time in university. We have also participated and won in a number of international tech and entrepreneurship competitions while in university. Bonus: we are a couple.</p>
<p>How about a single founder? Well, to my knowledge there are a number of single founder startups that got accepted. So if you are alone, your Start-Up Chile dream is not dead, never. There are other factors which are more important than this. So don&#8217;t worry.<strong></strong></p>
<h2><strong>Project</strong></h2>
<p>This is all about your idea/product and they are looking for globally scalable ideas/products. If your idea is super local and could not be replicated in other countries, you might want to rethink your idea.</p>
<p>I don&#8217;t know how well Flvrd scores under this section but if you don&#8217;t have a world changing idea/product — I don&#8217;t think this will put you in a disadvantaged position. FYI, Flvrd is neither a world changing idea nor follows the blue ocean strategy. We just do things differently.</p>
<p>But It is important to have a working prototype. It shows your commitment and also your execution. Remember the popular saying? &#8220;An idea is nothing without execution&#8221;. So having a real product where you and your team have been working on for some time is a huge plus.</p>
<p>A pitch video is also important in the case where the judges didn&#8217;t get the picture of what you are doing, a <a href="http://en.wikipedia.org/wiki/KISS_principle" target="_blank">KISS</a> video will help you explain your idea/product. FYI, we spent more than a week working on the pitch video but well worth it.</p>
<p>You are also required to answer questions related to your startup&#8217;s execution and business plan. So, make sure you know what you are doing, what is your plan, the market, competitors, etc. You have to do some basic research to answer these questions well — don&#8217;t assume!</p>
<p>Side note: The best way to keep up with your market and competitors is to follow tech and startup blogs like TechCrunch, Mashable, ReadWriteWeb, The Next Web, VentureBeat, etc.<strong></strong></p>
<h2><strong>Environment</strong></h2>
<p>This is where they want to know how you can contribute to the Chilean entrepreneurship ecosystem by leveraging on your skills, experiences and your networks. So, it is good to have an established network back home so that you can link them to Start-Up Chile and Chilean entrepreneurship culture/ecosystem as a whole.</p>
<p><strong>Bonus:</strong> Make your application stands out and the best way to do it is through video.</p>
<p>So, there you go some tips and advice for startups applying for Start-Up Chile. Feel free to ping me if you have any questions.</p>
<p><em>Reminder: You have until <strong>October 27th 2011</strong> to make the cut. Act now!</em></p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/start-up-chile-want-to-make-the-cut-here-are-some-advice">Start-Up Chile: Want to Make The Cut? Here Are Some Advice</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/start-up-chile-want-to-make-the-cut-here-are-some-advice/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django &#8220;Global&#8221; Template Variable</title>
		<link>https://matthewphiong.com/django-global-template-variable</link>
		<comments>https://matthewphiong.com/django-global-template-variable#comments</comments>
		<pubDate>Tue, 02 Aug 2011 07:07:00 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[context processor]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://mphiong.wordpress.com/2011/08/02/django-global-template-variable</guid>
		<description><![CDATA[<p>Depending on the project you are working on, you might want to access one or more template variables across all your templates like the User object. If you are making news or blog project, one example would be navigation bar item, say a category list. You might be tempted to pass the category list from [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/django-global-template-variable">Django &#8220;Global&#8221; Template Variable</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Depending on the project you are working on, you might want to access one or more template variables across all your templates like the User object. If you are making news or blog project, one example would be navigation bar item, say a category list.</p>
<p>You might be tempted to pass the category list from your views or create a template tag for that; but that just violate the Django&#8217;s <a href="https://docs.djangoproject.com/en/dev/misc/design-philosophies/?from=olddocs#don-t-repeat-yourself-dry" target="_blank">DRY principle</a>. So the best way would be through <a href="https://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors" target="_blank">custom context processor</a>. Writing your own is actually very easy.</p>
<h2>1. Writing the context processor function.</h2>
<p>You can put this function anywhere in your project. My preference is to place this code inside a context_processors.py file under the related app.<br />
<script src="https://gist.github.com/1130193.js"></script><noscript><pre><code class="language-python python"># The context processor function
def categories(request):
    all_categories = Category.objects.all()

    return {
        'categories': all_categories,
    }</code></pre></noscript><br />
Note: Each context processor must return a dictionary and takes only one arguement, <tt>HttpRequest</tt> object.</p>
<h2>2. Point it to your TEMPLATE_CONTEXT_PROCESSORS in your settings.py file.</h2>
<p><script src="https://gist.github.com/1130194.js"></script><noscript><pre><code class="language-python python">TEMPLATE_CONTEXT_PROCESSORS = (
    &quot;django.contrib.auth.context_processors.auth&quot;,
    &quot;django.core.context_processors.debug&quot;,
    &quot;django.core.context_processors.i18n&quot;,
    &quot;django.core.context_processors.media&quot;,
    &quot;django.core.context_processors.request&quot;,
    # ...
    &quot;yourapp.context_processors.categories&quot;
)</code></pre></noscript><br />
Now categories is available for use in all your templates.</p>
<p>Done!</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/django-global-template-variable">Django &#8220;Global&#8221; Template Variable</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/django-global-template-variable/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Announcing: Fryday App</title>
		<link>https://matthewphiong.com/announcing-fryday-app</link>
		<comments>https://matthewphiong.com/announcing-fryday-app#respond</comments>
		<pubDate>Fri, 01 Apr 2011 00:06:00 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[april fools]]></category>
		<category><![CDATA[fryday]]></category>

		<guid isPermaLink="false">http://mphiong.wordpress.com/2011/04/01/announcing-fryday-app</guid>
		<description><![CDATA[<p>Today, I&#8217;m happy and proud to announce the launch of Fryday an experimental project by @koekoecrunch and me, @matthewphiong. Fryday What? Fryday is a web app that let you express your anger, frustration, hatred, outrage or whatever negative on Friday. Yes, just on Friday. It allows you to post your messages, pictures, videos or voice [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/announcing-fryday-app">Announcing: Fryday App</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Today, I&#8217;m happy and proud to announce the launch of <a href="http://localhost"><strong>Fryday</strong></a> an experimental project by <a href="http://www.twitter.com/koekoecrunch" target="_blank">@koekoecrunch</a> and me, <a href="http://www.twitter.com/matthewphiong" target="_blank">@matthewphiong</a>.<strong></strong></p>
<h2>Fryday What?</h2>
<figure id="attachment_79" style="width: 407px" class="wp-caption aligncenter"><a href="http://matthewphiong.com/wp-content/uploads/2011/04/fryday.png"><img class="size-full wp-image-79" title="Fryday Logo" src="http://matthewphiong.com/wp-content/uploads/2011/04/fryday.png" alt="" width="407" height="407" srcset="https://matthewphiong.com/wp-content/uploads/2011/04/fryday.png 407w, https://matthewphiong.com/wp-content/uploads/2011/04/fryday-150x150.png 150w, https://matthewphiong.com/wp-content/uploads/2011/04/fryday-300x300.png 300w" sizes="(max-width: 407px) 100vw, 407px" /></a><figcaption class="wp-caption-text">Fryday Logo</figcaption></figure>
<p>Fryday is a web app that let you express your anger, frustration, hatred, outrage or whatever negative on Friday. Yes, just on Friday. It allows you to post your messages, pictures, videos or voice screams securely (secured with bank-level data encryption). You&#8217;ll be able to share with your friends, your selected friends and have a good laugh about it.</p>
<p>One common use of Fryday is to take a picture of your boss, doodle on it (uhmm&#8230; like <em>&#8220;Stop throwing me work you bitch! It&#8217;s Friday, Friday, gotta get lost on Friday&#8221;</em>) to release your anger and then upload it to Fryday. You can select which friends to share with and have a LMFAO!</p>
<h2>Why Fryday?</h2>
<p>As we all know, Friday is the most tense and frustrating day of the week. This very day that is all about work, work and work and deadline, deadline and deadline. When we are all excited and planning our weekend, Friday will come and spoil it. So, we really can&#8217;t stand Friday and because of that we really want to <strong>FRY</strong> it! Hence Fryday was born.</p>
<p>Oh BTW, Fryday (the name) is highly inspired by Rebecca Black&#8217;s <a target="_blank">Friday</a>. Thanks Rebecca! We ♥ your Friday.</p>
<h2>Fryday FYI</h2>
<p>We have been working on this on and off for more than 6 months now. Here are some unbelievable and shocking stats (even we are shocked!)</p>
<ul>
<li>1000 litres of sweat drained.</li>
<li>100 kilograms of caffeine consumed.</li>
<li>500 SMS sent.</li>
<li>250 papers wasted.</li>
<li>25 Fridays wasted.</li>
<li>500 kilograms of chocolate strawberry cakes consumed.</li>
<li>And most recently&#8230; 100 hours of Rebecca Black&#8217;s Friday!</li>
</ul>
<p>Excuse us if Fryday is not as good as it sounds or hyped. FYI I&#8217;m learning Django and Koekoe is learning Illustrator while building this app, we are still very noob. We hope this app will make you feel as good as having a delicious chocolate strawberry cake on Friday. Anyway, we hope you don&#8217;t hate it <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>P.S. Happy 1st of April <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>KTHXBAI,<br />
matt &amp; koekoe<br />
<a href="mailto:ireallyhatefriday@gmail.com">ireallyhatefriday@gmail.com</a></p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/announcing-fryday-app">Announcing: Fryday App</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/announcing-fryday-app/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Price War: Linode vs Amazon EC2 vs Rackspace Cloud Servers vs Windows Azure Virtual Machines</title>
		<link>https://matthewphiong.com/price-war-linode-vs-slicehost-vs-amazon-ec2-vs-rackspace-cloud-servers</link>
		<comments>https://matthewphiong.com/price-war-linode-vs-slicehost-vs-amazon-ec2-vs-rackspace-cloud-servers#comments</comments>
		<pubDate>Wed, 05 Jan 2011 04:27:00 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[amazon ec2]]></category>
		<category><![CDATA[linode]]></category>
		<category><![CDATA[rackspace cloud]]></category>
		<category><![CDATA[slicehost]]></category>
		<category><![CDATA[windows azure]]></category>

		<guid isPermaLink="false">http://mphiong.wordpress.com/2011/01/05/price-war-linode-vs-slicehost-vs-amazon-ec2-vs-rackspace-cloud-servers</guid>
		<description><![CDATA[<p>Updated:&#160; 18 September 2012. Slicehost is now Rackspace Cloud Servers and added Windows Azure. 31 October 2012. New EC2 price. 10 April 2013. Linode NextGen specs. It&#8217;s time for a &#8220;cloud&#8221; war but on the pricing side. So what is the real price per month between the four most popular cloud/VPS hosting providers? Which one [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/price-war-linode-vs-slicehost-vs-amazon-ec2-vs-rackspace-cloud-servers">Price War: Linode vs Amazon EC2 vs Rackspace Cloud Servers vs Windows Azure Virtual Machines</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><em><strong>Updated:</strong>&nbsp;</em></p>
<ul>
<li><em>18 September 2012. Slicehost is now Rackspace Cloud Servers and added Windows Azure.</em></li>
<li><em>31 October 2012. New EC2 price.</em></li>
<li><em>10 April 2013. Linode NextGen specs.</em></li>
</ul>
<p>It&#8217;s time for a &#8220;cloud&#8221; war but on the pricing side. So what is the<em> real </em>price per month between the four most popular cloud/VPS hosting providers? Which one has the best value for money? Let&#8217;s find out with a simple resource/price comparison below.</p>
<p>Again, the contenders are:</p>
<ul>
<li><a href="https://www.linode.com/?r=e56a449fc9162a39264176a70f30e659d5754d5f">Linode</a>* (VPS)</li>
<li><a href="http://aws.amazon.com/ec2/">Amazon EC2</a> (Cloud)</li>
<li><a href="http://www.rackspacecloud.com/cloud_hosting_products/servers/">Rackspace Cloud Servers</a> (Cloud)</li>
<li><a href="https://www.windowsazure.com/en-us/home/features/virtual-machines/" target="_blank">Windows Azure Virtual Machines</a> (Cloud)</li>
</ul>
<p>I&#8217;m currently hosting a few blogs and websites on a Linode 1024 plan (1024MB RAM). The incoming and outgoing bandwidth are approx. 70GB and 140GB respectively/month. So I&#8217;ll use these data in the calculation for EC2, Cloud Servers and Azure Virtual Machines and assumes 730 hours of service/month.</p>
<h2>The Numbers</h2>
<p>For Linode, the price is fixed with preallocated storage and transfer with free incoming traffic.</p>
<p><strong>Linode 1024 Plan</strong></p>
<ul>
<li>CPU: 8 Cores</li>
<li>RAM: 1024MB</li>
<li>Storage: 24GB</li>
<li>Transfer: In (Free), Out (2048GB/2TB)</li>
</ul>
<p>Price/month: $20.00</p>
<p>Note: Linode has upgraded all of their plans with better hardware, network and double the RAM for the same price (actually it is $0.05 more for all plans). You can read more about their NextGen of Linode on their blog:&nbsp;<a href="http://blog.linode.com/2013/03/07/linode-nextgen-the-network/" target="_blank">Network</a>,&nbsp;<a href="http://blog.linode.com/2013/03/18/linode-nextgen-the-hardware/" target="_blank">Hardware</a>,&nbsp;<a href="http://blog.linode.com/2013/04/09/linode-nextgen-ram-upgrade/" target="_blank">RAM</a>.</p>
<p><strong>Amazon EC2 Micro Instance</strong></p>
<p>Price varies between regions, we&#8217;ll use the cheapest one.</p>
<ul>
<li>Instance/hour: $0.02</li>
<li>CPU: 1 Core</li>
<li>RAM: 613MB**</li>
<li>Storage: EBS storage only ($0.10/GB), say we use 20GB</li>
<li>Transfer: In (Free), Out (First 1GB is free, subsequent GB up to 10TB is $0.12/GB)</li>
</ul>
<p>Note: EC2 Micro instance doesn&#8217;t come with instance storage, that is why we need to use&nbsp;Amazon EBS.</p>
<p>Instance/month: $14.60<br />
Storage/month: $2.00<br />
Transfer (In)/month: $0<br />
Transfer (Out)/month:&nbsp;$16.68</p>
<p>Price/month: $33.28</p>
<p><strong>Rackspace Cloud Servers</strong></p>
<ul>
<li>Instance/hour: $0.06</li>
<li>CPU: 1 Core</li>
<li>RAM: 1024MB</li>
<li>Storage: 40GB allocated</li>
<li>Transfer: In (Free), Out ($0.12/GB)</li>
</ul>
<p>Instance/month: $43.80<br />
Storage/month: $0<br />
Transfer (In)/month: $0<br />
Transfer (Out)/month: $16.80</p>
<p>Price/month: $60.60</p>
<p><strong>Windows Azure Virtual Machine XS</strong></p>
<ul>
<li>Instance/hour: $0.013</li>
<li>CPU: Shared</li>
<li>RAM: 768MB**</li>
<li>Storage: Locally redundant storage ($0.095/GB), say we use 20GB</li>
<li>Transfer: In (Free), Out (First 5GB is free, subsequent GB up to 10TB is $0.12/GB)</li>
</ul>
<p>Note: The free first 5GB outgoing transfer only valid until 30 June 2013. More <a href="http://www.windowsazure.com/en-us/pricing/details/#header-11" target="_blank">here</a>.</p>
<p>Instance/month: $9.49<br />
Storage/month: $1.90<br />
Transfer (In)/month: $0<br />
Transfer (Out)/month: $12</p>
<p>Price/month: $23.39</p>
<p>So we have it: Linode ($20.00), EC2 ($33.28), Cloud Servers ($60.60) and Azure VMs ($23.39)</p>
<p>Here, the clear &#8220;winner&#8221; is&nbsp;<strong><a href="https://www.linode.com/?r=e56a449fc9162a39264176a70f30e659d5754d5f">Linode</a></strong>*. But again, this is not really an apple-to-apple comparison because the VM&#8217;s performance is not taken into&nbsp;consideration. But in terms of specs and resources, Linode came out top. Linode is more superior in terms of hardware with 8 cores of CPU and very generous with their outgoing bandwidth, 2TB. But please take not that having more cores doesn&#8217;t mean more processing power.</p>
<h2>Conclusion</h2>
<p>As noted <a href="http://stackoverflow.com/questions/1703052/need-some-help-choosing-between-amazon-ec2-and-vps/1703132#1703132" target="_blank">here</a>, go for cloud if you want to run your stuff for a short period of time (few hours or days. You can still use Linode and get credited for the unused time for the rest of the month), CPU intensive stuff or web apps that have unpredictable load and need to scale up and down easily and quickly. If you want to host a blog or website (long-term) go for VPS. I would recommend <a href="https://www.linode.com/?r=e56a449fc9162a39264176a70f30e659d5754d5f">Linode</a>* over the rest. It&#8217;s really hard to argue when comes to hardware and price/resources. It&#8217;s simply the best bang for the buck. I&#8217;ve been with them for many years now, great support (usually less than 3 mins response) and <a href="http://uggedal.com/journal/vps-performance-comparison/" target="_blank">great performance</a>.</p>
<p><em>*Note: My referral link. Sign-up using my link if you think this post is useful, I would appreciate the <em>referral. </em>Otherwise, just hit linode.com in your address bar.</em></p>
<p><em>**Closest available RAM option to 1GB.</em></p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/price-war-linode-vs-slicehost-vs-amazon-ec2-vs-rackspace-cloud-servers">Price War: Linode vs Amazon EC2 vs Rackspace Cloud Servers vs Windows Azure Virtual Machines</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/price-war-linode-vs-slicehost-vs-amazon-ec2-vs-rackspace-cloud-servers/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Facebook OAuth 2.0 for Canvas App Explained</title>
		<link>https://matthewphiong.com/facebook-oauth-2-0-for-canvas-app-explained</link>
		<comments>https://matthewphiong.com/facebook-oauth-2-0-for-canvas-app-explained#comments</comments>
		<pubDate>Wed, 15 Sep 2010 04:57:00 +0000</pubDate>
		<dc:creator><![CDATA[Matthew Phiong]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[canvas app]]></category>
		<category><![CDATA[facebook app]]></category>
		<category><![CDATA[facebook oauth]]></category>

		<guid isPermaLink="false">http://mphiong.wordpress.com/2010/09/15/facebook-oauth-2-0-for-canvas-app-explained</guid>
		<description><![CDATA[<p>Facebook is getting better in providing OAuth 2.0 support for its canvas app, that is apps on facebook.com. But one thing that drives people nuts is the documentation. A lot of people getting stuck while trying to adopt the new OAuth authentication method and the Graph API because lack of proper documentation for developers. This [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/facebook-oauth-2-0-for-canvas-app-explained">Facebook OAuth 2.0 for Canvas App Explained</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Facebook is getting better in providing OAuth 2.0 support for its <a href="http://developers.facebook.com/docs/authentication/canvas"> canvas app</a>, that is apps on <a href="http://facebook.com" target="_blank">facebook.com</a>. But one thing that drives people nuts is the documentation. A lot of people getting stuck while trying to adopt the new OAuth authentication method and the Graph API because lack of proper documentation for developers.</p>
<p>This post will explain how simple actually getting OAuth to work with canvas app (both FBML and iFrame). There are two references you need:</p>
<ol>
<li><a href="http://developers.facebook.com/docs/authentication/" target="_blank">http://developers.facebook.com/docs/authentication/</a></li>
<li><a href="http://developers.facebook.com/docs/authentication/canvas" target="_blank">http://developers.facebook.com/docs/authentication/canvas</a></li>
</ol>
<h2>Authenticating User</h2>
<p>The docs on <a href="http://developers.facebook.com/docs/authentication/" target="_blank">authentication</a> explains that you need to perform two steps to obtain the access_token that is:</p>
<ol>
<li>Redirect the user to <a href="https://graph.facebook.com/oauth/authorize" target="_blank">https://graph.facebook.com/oauth/authorize</a>  with your client_id and the URL the user should be redirected back to after the authorization process (redirect_uri)</li>
<li>Exchange it for an access token by fetching <a href="https://graph.facebook.com/oauth/access_token" target="_blank">https://graph.facebook.com/oauth/access_token</a>. Pass the exact same redirect_uri as in the previous step (1).</li>
</ol>
<p>For canvas app, it is much more simpler. You do not need to perform step 2. What you need is just step 1, the authorization process. See code below:<code></code></p>
<script src="https://gist.github.com/1291073.js"></script><noscript><pre><code class="language-text text">https://graph.facebook.com/oauth/authorize?
    client_id=...&amp;
    redirect_uri=http://apps.facebook.com/yoursuperduperapp/</code></pre></noscript>
<p>After this process, you can parse the signed_request (see below) to get the access_token.</p>
<h2>The signed_request</h2>
<p>All canvas apps will have this signed_request parameter attached to the callback URL that contains the user_id, oauth_token, expires and profile_id. You need to parse the signed_request to get these info. Example codes can be found here: <a href="http://developers.facebook.com/docs/authentication/canvas" target="_blank">PHP</a>, <a href="http://codepaste.net/gq1s2m" target="_blank">.NET (C#)</a>, <a href="http://github.com/patrys/pyfacebook/blob/master/facebook/__init__.py#L449" target="_blank">Python</a>, <a href="http://www.hammersoft.de/blog/?p=87" target="_blank">Java</a>.</p>
<p>So, now you are able to parse and get those info, and yes you will get the oauth_token directly. If you get nothing returned (no user_id, oauth_token, etc), don&#8217;t freak out. This means the user has not authorize your app yet. So, just perform the authorization process above and you are good to go!</p>
<h2>The Good and Bad</h2>
<p>The good thing is, it much more simpler &#8212; you no longer need to request for a new access_code/access_token when it expires, back and forth. Just parse the signed_request to get the access_token (oauth_token).</p>
<p>The bad thing is, the authorization process doesn&#8217;t work well with iFrame-based canvas app. You will get a <em>Facebook inside Facebook effect</em>, that is a Facebook page loaded inside the Facebook frame.</p>
<h2>The Workaround for iFrame</h2>
<p>The current workaround is using Javascript to load the authorization URL on top:</p>
<script src="https://gist.github.com/1291077.js"></script><noscript><pre><code class="language-html html">&lt;script type='text/javascript'&gt;top.location.href = '&lt;theurl&gt;';&lt;/script&gt;</code></pre></noscript>
<p>This will solve part of the problem. After the user authorized your app, Facebook will redirect back to your site specified by the redirect_uri. You will get the problem again (you will see a Facebook logo with a &#8216;Go to Facebook.com&#8217; link). After much <em>hack</em>-around, I found out that by adding type=&#8217;user_agent&#8217; and display=&#8217;page&#8217; to the authorization URL, the problem is fixed. See the modified URL below:<code></code></p>
<script src="https://gist.github.com/1291078.js"></script><noscript><pre><code class="language-text text">https://graph.facebook.com/oauth/authorize?
    client_id=...&amp;
    redirect_uri=http://apps.facebook.com/yoursuperduperapp/&amp;
    type=user_agent&amp;
    display=page</code></pre></noscript>
<p>There you go.</p>
<p>The post <a rel="nofollow" href="https://matthewphiong.com/facebook-oauth-2-0-for-canvas-app-explained">Facebook OAuth 2.0 for Canvas App Explained</a> appeared first on <a rel="nofollow" href="https://matthewphiong.com">matthewphiong blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://matthewphiong.com/facebook-oauth-2-0-for-canvas-app-explained/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: https://www.w3-edge.com/products/

Object Caching 1352/1401 objects using redis
Page Caching using redis (SSL caching disabled)
Database Caching using redis

 Served from: matthewphiong.com @ 2021-03-27 00:06:01 by W3 Total Cache -->