<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mark Liu: Blog Posts</title><link>http://markliu.me/feeds/latest/</link><description>Latest entries posted to Mark's Blog</description><atom:link href="http://markliu.me/feeds/latest/" rel="self"></atom:link><language>en-us</language><lastBuildDate>Tue, 08 Jan 2013 18:33:06 -0600</lastBuildDate><item><title>How to find a good freelance developer
</title><link>http://markliu.me/2013/jan/08/how-to-find-a-good-freelance-developer/</link><description>&lt;p class="c2"&gt;&lt;span&gt;A bunch of people have asked me recently how to find good contract developers. I’ve done this quite a few times now and feel like I now have a pretty good system for selecting quality freelancers at good fixed prices.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;I can tell that this system works because on my last two contract projects I received an average of 100 bids per posting (spread across 3 different sites) and both hires ended up blowing me away with the quality, speed, and price of their work. I have viewed many friends’ postings that have received 10 or fewer bids, many of which were low quality. I’ll take you through what I do to give myself better developer options.&lt;/span&gt;&lt;/p&gt;&lt;p class="c2 c3"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 class="c2"&gt;&lt;a name="h.vh19kvvk7ccq"&gt;&lt;/a&gt;&lt;span&gt;Step 1&lt;/span&gt;&lt;/h3&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Write a great specification of the work you want done. There are a lot of reasons why this is important. &lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;First, the best freelance developers are more likely to place bids if they know the scope of the work. When they don’t know the scope of the work it becomes dangerous for them to place a fixed price bid because they might end up doing far more work than they had hoped. These developers care a lot about their aggregate ratings on these freelance sites and will make sure they do everything in their power to make their customer happy and get a top rating. If you lay out a detailed specification, they know exactly what it will take and are no longer scared that you have a list of features up your sleeve that you want them to implement as well.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Basically a great specification will tell the potential hire that you know what you’re doing and that you will be pleasant to work with.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Second, you will need to define all of these features at some point anyway so you might as well do it right up front in order to gain the benefit of finding the best possible developer. It’s a good exercise to fully define your product as you will find tricky parts you hadn’t thought of while simply thinking about your product at a high level. The earlier you think about and address these tricky bits, the less costly it will be to implement well.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Here’s an example of a spec I wrote recently that received 110 bids, at least 8 of which were very high quality: &lt;/span&gt;&lt;span class="c6"&gt;&lt;a class="c5" href="https://docs.google.com/document/d/15c6n6HAUoa5SDP7TlGU_sljpdIA_8doe3h2Kbi9VcoM/edit"&gt;https://docs.google.com/document/d/15c6n6HAUoa5SDP7TlGU_sljpdIA_8doe3h2Kbi9VcoM/edit&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 class="c2"&gt;&lt;a name="h.cdczkdyqp0qq"&gt;&lt;/a&gt;&lt;span&gt;Step 2&lt;/span&gt;&lt;/h3&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Post your spec to elance.com without setting a price. They allow you to not specify your budget or expected price. By posting it without a price you can wait for the bids to roll in and you’ll start to get a good idea of how much this job should cost.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 class="c2"&gt;&lt;a name="h.zaiu964zqe48"&gt;&lt;/a&gt;&lt;span&gt;Step 3 &lt;/span&gt;&lt;/h3&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Take the expected cost determined in step two and post the same spec to odesk and freelancer.com. There are plenty of other freelance sites out there so you are free to post to those as well. I have had great luck with those three sites (elance, odesk, and freelancer) and can confidently say there are some very high quality developers on each of these sites who will come out of the woodwork if your spec is good.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 class="c2"&gt;&lt;a name="h.z6xhafif1ddv"&gt;&lt;/a&gt;&lt;span&gt;Step 4&lt;/span&gt;&lt;/h3&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Wait. It’s tempting to hire the first competent person who submits a good bid, but you will get plenty more if you wait. Be patient and wait for the bids to start slowing down. 2-3 days should be enough.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 class="c2"&gt;&lt;a name="h.sviuznuypb5w"&gt;&lt;/a&gt;&lt;span&gt;Step 5&lt;/span&gt;&lt;/h3&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Narrow down the bids to find the right developer. This can seem overwhelming at first but if you do it systematically you can do it in about 2-4 hours. Here’s what I do:&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol class="c1" start="1"&gt;&lt;li class="c0"&gt;&lt;span&gt;Narrow down the field based on their bid price, their quantitative ratings, and the amount of work they’ve done in the past. After keeping only people with 4.9+ ratings, a significant amount of work, and a very good bid price the field usually narrows to about 10.&lt;/span&gt;&lt;/li&gt;&lt;li class="c0"&gt;&lt;span&gt;Briefly glance at each of the top 10 applicants’ portfolios and take a look at their communication skills in their messages with you or on their profile page. Eliminate all but the very best. Hopefully you’ll be down to your last 2-4 people now.&lt;/span&gt;&lt;/li&gt;&lt;li class="c0"&gt;&lt;span&gt;Choosing from these last few is the toughest step and for this I tend to choose the person I think would make the best long term hire. English speaking ability and the general vibe I get from the person play a big role here. Of course this is just a contract project, but while working with this person you will build up a relationship and if they produce high quality work the chances are you will want to hire them for work in the future as well.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 class="c2"&gt;&lt;a name="h.yolslrj8t2iy"&gt;&lt;/a&gt;&lt;span&gt;Final Note&lt;/span&gt;&lt;/h3&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;If your project is big you may want to break it up into small pieces. For instance you can write the spec for just a small part of your application so if you end up hiring someone who produces low quality work, you won't lose much because you haven't invested much. I view the first job I award someone as an interview to some extent. If you like that person you can always hire him/her for the rest of your project.&lt;/span&gt;&lt;/p&gt;&lt;p class="c3 c2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="c2"&gt;&lt;span&gt;Good luck!&lt;/span&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Tue, 08 Jan 2013 18:33:06 -0600</pubDate><guid>tag:markliu.me,2013-01-08:/2013/jan/08/how-to-find-a-good-freelance-developer/</guid><category>General</category><category>Technical</category><category>Web Development</category></item><item><title>Why are you doing this?
</title><link>http://markliu.me/2012/nov/01/why-are-you-doing-this/</link><description>One of the mentors at The Iron Yard this summer asked the question &amp;quot;Why are you doing this?&amp;quot;. I love this question because without a really good reason for doing this, building a company becomes infinitely harder. Recently I had one of my most grueling days since I started Leaguevine when I spent the entire day on the phone making sales to people who mostly didn&amp;#39;t give a crap. I don&amp;#39;t like sales. But I could force myself to work hard and get stuff done because I have a very clear end goal.&lt;p /&gt;&lt;div&gt;I want to have a huge, positive impact on the world through international development and to do so requires a large amount of money. This is at the top of my mind every day and has been sitting there for about two years.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;When I was devoting a vast majority of my energy to Engineers Without Borders from mid 2008 through 2010, my view on the world changed completely. Before EWB, I would have been content with a comfortable life where I was able to travel a lot and have some fun. I could work for a great employer, produce at a high level, get paid a lot, and do the things I wanted on nights and weekends. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;EWB killed this former dream life for me. I am certain that I would no longer be content with such a life. &lt;/div&gt;&lt;p /&gt;&lt;div&gt;After my first trip to Orongo, Kenya and seeing all of the challenges people have to go through every single day, I returned home grateful for running water. For a full year after that first trip I would think about how lucky I am to have running water every time I turned on a faucet. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;On my second trip I was given a grand tour of Kibera by one of its residents. Kibera is one of the largest slums in the world and I was walking through it shortly after it had rained. Walking through this town was excruciatingly difficult because all roads and pathways were dirt and because many of these pathways were steep and it had rained, it was really tough walking around. I remember Cartoon (my friend in Kibera) reaching down and extending me a hand to help me climb various pathways. Not surprisingly, I thought about Kibera at least once a day for the entire calendar year of 2009.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;By the fourth time I traveled to Orongo, Kenya I realized how much I loved doing this International Development work. Every day I was using my knowledge, connections, and hustle to make the most change I could in this charming little community. Despite loving this work, I realized how many parts of this system were broken. I don&amp;#39;t mean to say EWB or other NGOs are bad, but the entire state of International Development could use a heap of improvement. Because of this, I would not be content being a cog in this big International Development machine where I would likely have very little meaningful impact over a lifetime of hard work.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;At this point, because I was no longer content with a simple software developer&amp;#39;s life and I would not be content working for an NGO in this International Development space, the path to reaching my dreams started to become somewhat clear. I would have to do something that gave me a chance to make a huge amount of money which I could then use to instill my own vision into the International Development scene. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;I like to think of this as the Bill Gates model of doing good in the world. Step 1 is to make a lot of money, and step 2 is to use the money to do something incredible. Gates is doing far more than just donating his money to charity. He is aggressively attacking the world&amp;#39;s problems with the same gusto that he used to build Microsoft by defining his own well-rounded initiatives and finding the right partners to carry out his vision. He&amp;#39;s crushing it. He is not conforming to standard NGO models, and is willing to disrupt this space and do whatever it takes to improve the world. And for that he&amp;#39;s my idol.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;While it&amp;#39;s unrealistic to expect to make an amount of money and impact on the same order of magnitude that Gates did, this general model for living my life is well within the realm of possibility. This is what gets me fired up every morning. And more importantly, it&amp;#39;s what keeps me going at full speed when things look bleak.&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 01 Nov 2012 15:16:16 -0500</pubDate><guid>tag:markliu.me,2012-11-01:/2012/nov/01/why-are-you-doing-this/</guid><category>Engineers Without Borders</category><category>General</category><category>Non-Technical</category><category>Web Development</category></item><item><title>Fixing tech startup incorporation documents
</title><link>http://markliu.me/2012/aug/15/fixing-tech-startup-incorporation-documents/</link><description>A year ago I incorporated Leaguevine myself without using any lawyers. I &lt;a href="http://markliu.me/2011/sep/10/self-incorporating-a-tech-startup/"&gt;wrote about it here&lt;/a&gt; and heavily relied upon the &lt;a href="http://orrick.com/practices/corporate/emergingCompanies/startup/forms_technology_related.asp"&gt;Orrick company document templates&lt;/a&gt;. I realized back then that there was a good chance I would screw some stuff up and decided it would be better for Leaguevine to first get some funding or free access to lawyers and at that point revise anything I messed up.&lt;p /&gt;&lt;div&gt;Turns out this approach worked great.&lt;/div&gt;&lt;p /&gt;&lt;div&gt;I am currently attending &lt;a href="http://theironyard.com/labs/"&gt;The Iron Yard accelerator program&lt;/a&gt; in Greenville, SC and this program gave us not only funding and connections, but also free legal services from a quality law firm called &lt;a href="http://www.wyche.com/"&gt;Wyche&lt;/a&gt;. Our lawyer there took care of all the amendments where necessary for free and now we have a great set of documents. He told us that the templates that we used were excellent and far better than a lot of the templates he sees self-incorporators use. So I&amp;#39;m glad we used the Orrick templates and saved him a lot of work.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;I&amp;#39;m really happy I decided not to pay for legal services at the very start of this company.&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 15 Aug 2012 14:49:07 -0500</pubDate><guid>tag:markliu.me,2012-08-15:/2012/aug/15/fixing-tech-startup-incorporation-documents/</guid><category>Non-Technical</category></item><item><title>Python syntax highlighting in Django templates using Pygments
</title><link>http://markliu.me/2012/feb/05/python-syntax-highlighting-in-django-templates-us/</link><description>&lt;div&gt;Highlighting code to be placed on your site is a pretty common need that has been addressed nicely by a number of open source projects. &lt;a href="http://pygments.org/"&gt;Pygments&lt;/a&gt; is great, but on it&amp;#39;s own would take you a while to get set up. This guide is meant to get you set up with using pygments in your django templates in under 5 minutes.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;b&gt;Choose your syntax highlighting style&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;First, decide which pygments style you want to use by &lt;a href="http://pygments.org/demo/32411/?style=vs" target="_blank"&gt;trying them out on the pygments site&lt;/a&gt;.&lt;/div&gt; &lt;br /&gt;&lt;div&gt;&lt;b&gt;Install django-pygments&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;There&amp;#39;s a &lt;a href="https://github.com/odeoncg/django-pygments" target="_blank"&gt;nice project on github&lt;/a&gt; that gives you a couple template tags for using pygments.&lt;/div&gt; &lt;p /&gt;&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;div&gt;pip install -e git+git://&lt;a href="http://github.com/odeoncg/django-pygments.git" target="_blank"&gt;github.com/odeoncg/django-pygments.git&lt;/a&gt;&lt;/div&gt; &lt;/blockquote&gt; &lt;p /&gt;&lt;div&gt;&lt;b&gt;Create a pygments css file&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;Using whichever  style you liked from the pygments site, you can use the pygmentize command in your terminal to generate a CSS file for marking up your code.&lt;/div&gt; &lt;p /&gt;&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;div&gt;pygmentize -S vs -f html &amp;gt; vs.css&lt;/div&gt;&lt;/blockquote&gt;&lt;p /&gt;&lt;div&gt;&lt;b&gt;Mark up your django templates&lt;/b&gt;&lt;/div&gt; &lt;p /&gt;&lt;div&gt;You&amp;#39;re now ready to make the changes to your templates. Just import your css file, load the template tags, wrap your pre-formatted code with the pygment template tag, and then label the code as whatever language you use.&lt;/div&gt; &lt;p /&gt;&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;div&gt;&amp;lt;link href=&amp;quot;/media/css/pygments/vs.css&amp;quot; media=&amp;quot;screen&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;div&gt;{% load pygmentify %}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;{% pygment %}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;lt;pre lang=&amp;quot;python&amp;quot;&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;import simplejson&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;import urllib2&lt;/div&gt;&lt;/div&gt; &lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;div&gt;{% endpygment %}&lt;/div&gt;&lt;/blockquote&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sun, 05 Feb 2012 13:14:57 -0600</pubDate><guid>tag:markliu.me,2012-02-05:/2012/feb/05/python-syntax-highlighting-in-django-templates-us/</guid><category>Technical</category><category>Web Development</category></item><item><title>Almost 4 months in
</title><link>http://markliu.me/2011/nov/25/almost-4-months-in/</link><description>I&amp;#39;ve been working full time on &lt;a href="http://leaguevine.com"&gt;Leaguevine&lt;/a&gt; for almost 4 months now, and things are finally beginning to click for me. It&amp;#39;s a completely different lifestyle, and I&amp;#39;m finally accepting the fact that it takes a while to adapt to it. Things like self-motivation, prioritization, setting deadlines, and staying organized are all things that I never had to deal with before since school basically took care of all that for me. These tasks are becoming easier every day, and I wouldn&amp;#39;t trade this experience for anything at this point!&lt;p /&gt;&lt;div&gt;A couple nights ago I realized just how much I love what I&amp;#39;m doing. I was hanging out with friends who were back in town for Thanksgiving until 2:30am, and despite having a blast catching up with those guys, all I could think about on my drive home was how pumped I was to finish implementing our oauth2 server for our API. Indeed, I went right to work when I got home (don&amp;#39;t worry - I hadn&amp;#39;t been drinking with my friends) and worked until I was just too exhausted. I went to bed really happy.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;We have yet to release our core product to the world, and won&amp;#39;t do so for another few months, but I imagine once all our cool stuff goes live and we have more users, this experience will only get better. &lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Fri, 25 Nov 2011 12:40:18 -0600</pubDate><guid>tag:markliu.me,2011-11-25:/2011/nov/25/almost-4-months-in/</guid><category>General</category><category>Non-Technical</category></item><item><title>Reducing CrashPlan&amp;#39;s Disk Space Usage on OSX
</title><link>http://markliu.me/2011/nov/04/reducing-crashplans-disk-space-usage-on-osx/</link><description>&lt;p&gt;&lt;span&gt;I have&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.crashplan.com/" target="_blank"&gt;CrashPlan&lt;/a&gt;&lt;span&gt;&amp;nbsp;backing up almost every file on my&amp;nbsp;&lt;/span&gt;&lt;a href="../../../../2011/jan/14/my-recent-hackintoshwindowslinux-install/" target="_blank"&gt;Hackintosh&lt;/a&gt;&lt;span&gt;, and when CrashPlan runs, it caches a ton of data so it can run faster. However, they don't let you configure where that data is stored. In my case, I'm backing up around 1TB of data, and thus the cache is a whopping 8GB. 8GB might not seem like that much these days, but when it's sitting on your small SSD, it's quite annoying. Fixing this problem was pretty easy, and since plenty of people were complaining about this on their forums in different threads, I thought I'd post my simple solution here.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;First, you need to have a second drive connected to your system that you'd rather have hold the cache. If you have this, then this solution should work for you:&lt;/div&gt;
&lt;div&gt;1. Close CrashPlan, as you normally would.&lt;/div&gt;
&lt;div&gt;2. Stop CrashPlan's background service by typing:&amp;nbsp;&lt;/div&gt;
&lt;pre style="padding-left: 30px;"&gt;sudo launchctl unload /Library/LaunchDaemons/com.crashplan.engine.plist&lt;/pre&gt;
&lt;div&gt;3. Remove the Cache:&lt;/div&gt;
&lt;pre style="padding-left: 30px;"&gt;rm -r /Library/Caches/CrashPlan&lt;/pre&gt;
&lt;div&gt;4. Create a simlink:&amp;nbsp;&lt;/div&gt;
&lt;pre style="padding-left: 30px;"&gt;ln -s /Volumes/OtherDrive/path/to/new/cache/ /Library/Caches/CrashPlan&lt;/pre&gt;
&lt;div&gt;5. Start CrashPlan's background service:&amp;nbsp;&lt;/div&gt;
&lt;pre style="padding-left: 30px;"&gt;sudo launchctl load /Library/LaunchDaemons/com.crashplan.engine.plist&lt;/pre&gt;
&lt;p&gt;6. Restart CrashPlan&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;This should free up a whole bunch of space on your startup disk. Enjoy!&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Fri, 04 Nov 2011 13:48:35 -0500</pubDate><guid>tag:markliu.me,2011-11-04:/2011/nov/04/reducing-crashplans-disk-space-usage-on-osx/</guid><category>Technical</category></item><item><title>Django-Celery on Webfaction using RabbitMQ
</title><link>http://markliu.me/2011/sep/29/django-celery-on-webfaction-using-rabbitmq/</link><description>&lt;div&gt;This tutorial is meant to get you up and running from scratch with django-celery on Webfaction. Each of the steps is a bit of a hassle since you typically need to find different install steps for each individual part, so I just lumped up the whole experience in this guide.&lt;/div&gt;
&lt;h2&gt;Install Erlang&lt;/h2&gt;
&lt;div&gt;Erlang is needed for installing RabbitMQ which is the preferred message broker for Celery. Webfaction doesn't come with this installed, so you'll need to do it manually:&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Go to the webfaction control panel and create a new app -&amp;gt; Custom App, Listening on Port&lt;/li&gt;
&lt;li&gt;Download the&amp;nbsp;&lt;a href="http://www.erlang.org/doc/installation_guide/INSTALL.html#How-to-Build-and-Install-ErlangOTP" target="_blank"&gt;latest version of Erlang&lt;/a&gt;. You can just use the command:&amp;nbsp;wget&amp;nbsp;&lt;a href="http://www.erlang.org/download/otp_src_R14B03.tar.gz" target="_blank"&gt;http://www.erlang.org/download/otp_src_R14B03.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Unzip it:&amp;nbsp;gunzip -c otp_src_R14B03.tar.gz | tar xf -&lt;/li&gt;
&lt;li&gt;cd into the directory&lt;/li&gt;
&lt;li&gt;Configure the build:&amp;nbsp;./configure --prefix=/home/your_webfaction_username/&lt;/li&gt;
&lt;li&gt;Make it: make&lt;/li&gt;
&lt;li&gt;Install it: make install&lt;/li&gt;
&lt;li&gt;Run it on the port given to you when you created the new Erlang app: epmd -port 12345 -daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Install RabbitMQ&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Go to the webfaction control panel and create a new app -&amp;gt; Custom App, Listening on Port&lt;/li&gt;
&lt;li&gt;Download the&amp;nbsp;&lt;a href="http://www.rabbitmq.com/server.html" target="_blank"&gt;latest version of the RabbitMQ&amp;nbsp;server generic package&lt;/a&gt;. You can just use the command: wget&amp;nbsp;&lt;a href="http://www.rabbitmq.com/releases/rabbitmq-server/v2.6.1/rabbitmq-server-generic-unix-2.6.1.tar.gz" target="_blank"&gt;http://www.rabbitmq.com/releases/rabbitmq-server/v2.6.1/rabbitmq-server-generic-unix-2.6.1.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Unzip it:&amp;nbsp;gunzip -c rabbitmq-server-generic-unix-2.6.1.tar.gz | tar xf -&lt;/li&gt;
&lt;li&gt;Simlink rabbitmq to the erlang lib directory: cd ~/lib/erlang/lib/;&amp;nbsp;ln -s ../src/rabbitmq_server-2.6.1 rabbitmq_server-2.6.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;Next, you need to change the file ~/lib/rabbitmq/rabbitmq-server. I found some&amp;nbsp;&lt;a href="http://community.webfaction.com/questions/2366/can-i-use-rabbit-mq-on-the-shared-servers" target="_blank"&gt;information about this on the webfaction community forums&lt;/a&gt;. Open your text editor and change three lines to:&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;CONFIG_FILE=~/src/rabbitmq_server-2.6.1/sbin/&lt;/div&gt;
&lt;div&gt;LOG_BASE=~/logs/user/rabbitmq&lt;/div&gt;
&lt;div&gt;MNESIA_BASE=~/src/rabbitmq_server-2.6.1/sbin/&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;Added these lines to the rabbitmq-env file and use the ports you reserved for epmd and rabbitmq in your earlier steps:&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;export ERL_EPMD_PORT=12708&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;export RABBITMQ_NODE_PORT=35478&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;export ERL_INETRC=$HOME/.erl_inetrc&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;Added the file $HOME/hosts which looks like:&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;127.0.0.1 localhost.localdomain localhost&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;::1 &amp;nbsp; &amp;nbsp; &amp;nbsp;localhost6.localdomain6 localhost6&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;127.0.0.1 web160&amp;nbsp;&lt;a href="http://web160.webfaction.com/" target="_blank"&gt;web160.webfaction.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;Added the file $HOME/.erl_inetrc which looks like:&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;{hosts_file, "/home/&amp;lt;your_user_name&amp;gt;/hosts"}.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;{lookup, [file,native]}.&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;Run Rabbitmq and check that it is working:&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;./rabbitmq-server -detached&lt;/div&gt;
&lt;div&gt;./rabbitmqctl status&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;Finally, add a new user and vhost, and&lt;a href="http://www.rabbitmq.com/man/rabbitmqctl.1.man.html#User management"&gt;&amp;nbsp;configure it&lt;/a&gt;&amp;nbsp;so only your app will have access to it.&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;./rabbitmqctl add_user &amp;lt;username&amp;gt; &amp;lt;password&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;./rabbitmqctl set_user_tags &amp;lt;username&amp;gt; administrator&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;./rabbitmqctl add_vhost &amp;lt;vhostpath&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;./rabbitmqctl set_permissions -p &amp;lt;vhostpath&amp;gt; &amp;lt;username&amp;gt;&amp;nbsp;".*" ".*" ".*"&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;./rabbitmqctl clear_permissions -p &amp;lt;vhostpath&amp;gt; guest&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h2&gt;Install Celery and Django-Celery&lt;/h2&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;pip install django-celery&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;In your settings file, you will then need to add the lines:&lt;/div&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;BROKER_HOST = "localhost"&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;BROKER_PORT = 36784&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;BROKER_USER = "username"&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;BROKER_PASSWORD = "password"&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;BROKER_VHOST = "vhostpath"&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;CELERYD_CONCURRENCY = 1&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;CELERYD_NODES="w1"&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;CELERY_RESULT_BACKEND="amqp"&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;The reason we set the concurrency so low is because Celery takes up a good amount of memory, and you are likely limited with your memory consumption on webfaction. The minimum amount of memory Celery can take will be however much it needs to run the main process (consuming messages, sending tasks to workers, etc), and a worker tasks that actually does stuff. Each of these will take up about 20-30MB of memory depending on the size of your Django app.&lt;/div&gt;
&lt;div&gt;Add 'djcelery' to your installed apps.&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;Follow any other steps listed in their &lt;a href="http://ask.github.com/django-celery/introduction.html#installation"&gt;installation guide&lt;/a&gt;&amp;nbsp;that are relevant to your app. &amp;nbsp;If you are using mod_wsgi, add the following to your .wsgi module:&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;import os&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;os.environ["CELERY_LOADER"] = "django"&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h2&gt;Install a tool to create a Daemon&lt;/h2&gt;
&lt;div&gt;Celery&amp;nbsp;&lt;a href="http://docs.celeryq.org/en/latest/cookbook/daemonizing.html"&gt;does not daemonize itself&lt;/a&gt;, and thus you need to do this yourself. Creating a daemon is&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/958249/whats-the-difference-between-nohup-and-a-daemon"&gt;not exactly the same as simply running it in the background&lt;/a&gt;, so you should install a tool that can help you do this. Celery recommends a couple options. One of the easiest ways is to use a simple tool called&amp;nbsp;&lt;a href="https://github.com/rfk/django-supervisor"&gt;django-supervisor&lt;/a&gt;. To install this, just type:&amp;nbsp;&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;pip install django-supervisor&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;Add the file supervisord.conf in the same directory as manage.py, and add the content:&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;[program:celeryd]&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;command={{ PYTHON }} {{ PROJECT_DIR }}/manage.py celeryd -l info&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;[program:autoreload]&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;exclude=true&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;[program:runserver]&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;exclude=true&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;[program:celerybeat]&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;exclude=true&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;Every time you restart your webserver, you can restart celery by issuing the following commands:&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-color: initial; border-style: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;python manage.py supervisor --daemonize&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;python manage.py supervisor stop all&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;python manage.py supervisor start all&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;However, there is a downside with using django-supervisor in that it will run in the background and take up another 20-30MB of memory. A more memory efficient way would be to install a tool called &lt;a href="http://software.clapper.org/daemonize/"&gt;daemonize&lt;/a&gt;. This page has very easy installation instructions. Once you install it, just add an alias to it in your .bashrc or .profile and then run:&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;daemonize /&amp;lt;full_path_to_django_directory&amp;gt;/manage.py celeryd&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;Everything should then be up and running. Good luck!&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 29 Sep 2011 10:15:23 -0500</pubDate><guid>tag:markliu.me,2011-09-29:/2011/sep/29/django-celery-on-webfaction-using-rabbitmq/</guid><category>Technical</category><category>Web Development</category></item><item><title>Self-Incorporating a Tech Startup
</title><link>http://markliu.me/2011/sep/10/self-incorporating-a-tech-startup/</link><description>This is in response to my friend Ben&amp;#39;s recent post, &lt;a href="http://benleff.blogspot.com/2011/09/what-about-money-for-lawyer.html?spref=tw"&gt;What about money for a lawyer?&lt;/a&gt;&lt;p /&gt;&lt;div&gt;I spent a bit of time last month self-incorporating my tech startup and since this topic is very fresh on my mind, I thought I&amp;#39;d reflect on it for a moment.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;The first thing I&amp;#39;d like to reflect on is the actual decision about whether or not to do this myself or hire a lawyer. The decision here comes down to deciding whether or not the additional $1,200-$1,500 in fees is worth the peace of mind that your company is starting off on the right foot in the legal department. Since I am confident that I know what I&amp;#39;m doing and have free resources to monitor I&amp;#39;m not doing anything dumb, the decision to by-pass hiring an attorney was an easy one. And I believe any competent entrepreneur can do the same, if they are willing to give up some time and energy to educate themselves. The trick is to get to the point where you can be confident that you are doing it right without missing any steps. So that&amp;#39;s what I&amp;#39;ll focus on here.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;To figure out what all goes into forming your company, there are more than enough free, reliable, online resources to help educate you. Just use google to find legal articles on this stuff, and then study wikipedia to make sure you understand all of the legal terminology.  A few good blogs for learning about this stuff are &lt;a href="http://startuplawyer.com/startup-issues/if-i-launched-a-startup"&gt;Startuplawyer&lt;/a&gt;, &lt;a href="http://www.technologystartuplaw.com/"&gt;TechnologyStartupLaw&lt;/a&gt;,&lt;a href="http://www.startupcompanylawyer.com/"&gt; Startup Company Lawyer&lt;/a&gt;, &lt;a href="http://www.feld.com/wp/"&gt;Brad Feld&amp;#39;s Blog&lt;/a&gt;, and of course the &lt;a href="http://www.avc.com/a_vc/mba-mondays/"&gt;MBA Monday&amp;#39;s series on AVC&lt;/a&gt;. From reading these sites as well as learning from &lt;a href="http://quora.com"&gt;Quora&lt;/a&gt; and Stack Exchange&amp;#39;s &lt;a href="http://answers.onstartups.com/"&gt;Onstartups&lt;/a&gt;, it was clear to me exactly what details I wanted to bake into incorporating my company. I won&amp;#39;t talk about legal specifics here, and I&amp;#39;ll just talk about how I learned enough to incorporate everything myself.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;So knowing all of the details about type of entity, state of incorporation, par value, vesting agreements, IP rights, etc, is a good start, but the more intimidating part is actually going about drafting and filing the appropriate legal documents to put everything in place. The best way to do this, if possible, is to use free resources to legal assistance. You&amp;#39;d be shocked at how many people out there really want to help you. Two good options for this are:&lt;/div&gt; &lt;div&gt;&lt;ol&gt;&lt;li&gt;Free legal clinics. Tons of Universities with Law Schools have these now, and they are aimed at giving law students real world practice with startup law while being supervised by professionals. In Chicago, the top three are the program at &lt;a href="http://www.law.northwestern.edu/sboc/about/"&gt;Northwestern University&lt;/a&gt;, the &lt;a href="http://www.ij.org/clinicentrepreneurs"&gt;Institute for Justice Clinic&lt;/a&gt;, and the &lt;a href="http://www.luc.edu/law/academics/special/center/business/clinical.html"&gt;Loyola Law Clinic&lt;/a&gt;. A lot of these will have long wait times, so if it&amp;#39;s not urgent these could be a great free source of help.&lt;/li&gt; &lt;li&gt;Small Business Development Centers (SBDCs). These will often give you general business advice for free, and have connections to pro-bono legal help or Certified Public Accountants (CPAs) who are plenty knowledgeable about simple legal issues. I went into the &lt;a href="http://www.ildceo.net/dceo/Bureaus/Entrepreneurship+and+Small+Business/SBDC.htm"&gt;SBDC at UIC&lt;/a&gt; and was happy to get a lot of help from them. In fact, I still email the CPA now and then if I have a quick question and he always sends me back a clear response in an hour or two.&lt;/li&gt; &lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Once these two options for getting help with filing your documents have been explored, it is worth also checking with lawyers to make sure you are doing this right. Lawyers will all give you a free consultation half an hour or so to learn more about you and attempt to woo you into signing with their practice. I talked on the phone with about 8 lawyers for 30 minutes each, about setting up my corporate entity and drafting other legal documents. At first, I was embarrassed to say I was thinking about incorporating on my own without their help because I thought they would call me naive or say I shouldn&amp;#39;t do it. But after the 2nd interview, I realized that these lawyers were actually enthusiastic about the idea of me saving money for my company upfront and they were more than helpful to me in hopes that I would sign on with them when I had &amp;quot;real&amp;quot; legal needs that needed to be addressed such as raising a round of capital. These lawyers would all give me lists of legal documents I needed to file, tips on how to file them and what I should incorporate on them, and told me about any pitfalls or things to watch out for (such as &lt;a href="http://bendlawoffice.com/2011/06/13/what-is-an-83b-election-and-why-should-you-fil-an-83b-election/"&gt;making sure I file my 83(b)&lt;/a&gt; within &lt;a href="http://www.naffziger.net/blog/2008/12/27/making-an-irs-section-83b-election/"&gt;30 days of incorporation&lt;/a&gt;). They assured me that internal documents such as company by-laws can be amended later when you need to, so getting it perfect the first time will not make or break your company. Further, one lawyer even offered to inspect my documents for free after I drafted them to ensure I was doing things right.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;So I guess what I learned is that incorporating a business is not hard, and you can learn everything you need by just using Google, calling people, and asking the right questions. Since in my situation I have a lot of time but not a lot of money, this made sense. While all of this information was a bit overwhelming at first, I now feel infinitely more confident with my business since I know the ins and outs of my company&amp;#39;s legal structure.&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sat, 10 Sep 2011 22:53:51 -0500</pubDate><guid>tag:markliu.me,2011-09-10:/2011/sep/10/self-incorporating-a-tech-startup/</guid><category>Non-Technical</category></item><item><title>One month down
</title><link>http://markliu.me/2011/aug/31/one-month-down/</link><description>It&amp;#39;s been one month since I started working on Leaguevine full time, and it&amp;#39;s been a very interesting experience. After being in school for 20 straight years, being on my own has been quite a shock. I now set my own schedule and am accountable only to myself. As grand as all the blogs out there make that seem, it&amp;#39;s kind of weird actually being in the middle of it.&lt;p /&gt;&lt;div&gt;While I was in school, I would always have my side projects and activities that I actually cared about far more than school. While I spent most of my time on these outside activities, school has always had a constant presence. It has been an anchor and something that brings consistency to all the years of my life, even if my outside activities change. I&amp;#39;d become conditioned to working quickly and efficiently on my schoolwork so I could make time for my passion projects. For the last several months, I kept saying to myself how much I&amp;#39;d love to work solely on Leaguevine instead of having to also do relatively meaningless class work and research. But then August 1st rolled around and I didn&amp;#39;t get into the sprint I was hoping for.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;I found that during my first few weeks I often became overwhelmed into complacency. Instead of instantly working 80 hour weeks like I had planned, I was putting in 50-60 tops and couldn&amp;#39;t really bring myself to do anymore even though I had nothing else to work on. I would take long breaks to watch youtube or play Starcraft II. And it felt like a huge waste of my time. Mostly, I felt bad that I wasn&amp;#39;t giving the business my undivided attention.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;I was being overwhelmed by a number of different things. First, there were no &amp;quot;real&amp;quot; deadlines in sight anywhere. Every deadline was just lying on a piece of paper or my google calendar and I kew I wouldn&amp;#39;t be punished if I missed it by a few hours, days, or even weeks. Next, I had just come back from a fantastic trip to China, and had been living in &amp;quot;consumer&amp;quot; mode. I had to go back to the mindset of &amp;quot;what can I build today&amp;quot; rather than &amp;quot;what can I buy today&amp;quot;. I think the thing that had the biggest stress on me was incorporating my business. I talked to about 8 lawyers, a number of non-profit clinics, a CPA, my dad, and an SBDC about getting the company set up right, and all this talking on top of reading blogs about tech startups made me feel like I wasn&amp;#39;t getting anywhere. I was spending so much time working on the business plan and worrying about legal stuff, that I was barely writing any code. And this lack of progress on the web app just made me feel like I was falling farther behind and wasting my time.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;I&amp;#39;m not sure exactly what happened, but sometime in the last week or so a light went on and I&amp;#39;ve been fully focused on Leaguevine. I think it&amp;#39;s because I finally got back to coding. I&amp;#39;ve become okay with the notion that this is going to be a long process that will take time, and I&amp;#39;m finally focusing on what I can accomplish each day and just doing that. I&amp;#39;ve been working 12+ hours a day every day this past week and I&amp;#39;m loving a vast majority of it. Yes, there are times when I have to do some tedious stuff, but the percentage of time in a day where I am truly enjoying what I do is higher than it was while I was in school.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;I&amp;#39;m not sure exactly how much this has contributed to this productivity improvement, but since I had been the most lazy in the mornings, I came up with a little trick to make myself more productive right after waking up. Before going to sleep, I&amp;#39;d open up one of the source code files and begin adding a single line of code to it. I don&amp;#39;t finish the line, and it doesn&amp;#39;t even have to do anything useful, but I then turn off my monitor without even saving the file. As is typical with VI guys, I can&amp;#39;t stand files being opened and unsaved, so the first thing I do in the morning is delete that line of code or finish it. Just this one little 3 second action gets me in the mood to develop something cool, and immediately I&amp;#39;m working at full speed the moment I sit down at my computer. This tip goes back to the philosophy of beating procrastination by &lt;a href="http://zenhabits.net/tada/&lt;!--more--&gt;-8512"&gt;just &lt;i&gt;starting&lt;/i&gt; to do something&lt;/a&gt;.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;So as this first month comes to a close, I&amp;#39;m working at a productivity level higher than ever before and I&amp;#39;m excited to see how much I can build in September!&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 31 Aug 2011 19:50:09 -0500</pubDate><guid>tag:markliu.me,2011-08-31:/2011/aug/31/one-month-down/</guid><category>General</category><category>Non-Technical</category></item><item><title>Migrating a Django Postgres DB from Concrete Inheritance to Abstract Inheritance
</title><link>http://markliu.me/2011/aug/23/migrating-a-django-postgres-db-from-concrete-inhe/</link><description>Django comes with several ways of implementing &lt;a href="https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance"&gt;model inheritance&lt;/a&gt;, and specifying which one you would like to use takes only a line or two of code. Setting up your database for the very first time is extremely easy, but migrating between types after you have existing data in infinitely harder. I have a live site whose needs have changed since I built the database and the concrete inheritance I set up is no longer needed. In my case, the site &lt;a href="http://jacobian.org/writing/concrete-inheritance/"&gt;should be using Abstract Inheritance&lt;/a&gt;. &lt;p /&gt;&lt;div&gt;There are a number of gotchas in this process, and I will outline exactly how I navigated my way through this process. First, I should note that I use &lt;a href="http://south.aeracode.org/"&gt;django-south&lt;/a&gt; in my project and the migrations rely heavily on using this. &lt;a href="http://stackoverflow.com/questions/7108899/using-django-south-to-move-from-concrete-inheritance-to-abstract-inheritance/7135950#7135950"&gt;I asked for advice on Stackoverflow&lt;/a&gt;  and I&amp;#39;ll use a similar example here. This article will walk you through the process of migrating from the before to after schema while keeping all your data intact.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Before:&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;b&gt;app1/models.py:&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;    class Model1(base_app.models.BaseModel):&lt;/div&gt;&lt;div&gt;        field1 = models.CharField(max_length=1000)&lt;/div&gt; &lt;div&gt;        field2 = models.CharField(max_length=1000)&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;&lt;b&gt;app2/models.py:&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;    class Model2(base_app.models.BaseModel):&lt;/div&gt;&lt;div&gt;        field1 = models.CharField(max_length=1000)&lt;/div&gt; &lt;div&gt;        field2 = models.CharField(max_length=1000)&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;&lt;b&gt;base_app/models.py:&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;/div&gt;    class BaseModel(models.Model):&lt;br /&gt;        user1 = models.ForeignKey(User, related_name=&amp;quot;user1&amp;quot;)&lt;div&gt;         user2 = models.ForeignKey(User, related_name=&amp;quot;user2&amp;quot;)&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;        another_field = models.CharField(max_length=1000)&lt;/div&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;        objects = CustomManager()&lt;/div&gt; &lt;div&gt; &lt;p /&gt;&lt;div&gt;&lt;b&gt;After:&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;b&gt;app1/models.py:&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;    class Model1(base_app.models.BaseModel):&lt;/div&gt;&lt;div&gt;        field1 = models.CharField(max_length=1000)&lt;/div&gt; &lt;div&gt;        field2 = models.CharField(max_length=1000)&lt;/div&gt;&lt;p /&gt;&lt;div&gt;        objects = CustomManager()&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;&lt;b&gt;app2/models.py:&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;    class Model2(base_app.models.BaseModel):&lt;/div&gt; &lt;div&gt;        field1 = models.CharField(max_length=1000)&lt;/div&gt;&lt;div&gt;        field2 = models.CharField(max_length=1000)&lt;/div&gt;&lt;p /&gt;&lt;div&gt;        objects = CustomManager()&lt;/div&gt;&lt;p /&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;&lt;b&gt;base_app/models.py:&lt;/b&gt;&lt;/div&gt; &lt;p /&gt;&lt;div&gt;    class BaseModel(models.Model):&lt;/div&gt;&lt;div&gt;        user1 = models.ForeignKey(User, related_name=&amp;quot;%(class)s_user1&amp;quot;)&lt;/div&gt;&lt;div&gt;&lt;div&gt;        user2 = models.ForeignKey(User, related_name=&amp;quot;%(class)s_user2&amp;quot;)&lt;/div&gt; &lt;/div&gt;&lt;div&gt;        another_field = models.CharField(max_length=1000)&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;        class Meta:&lt;/div&gt;&lt;div&gt;            abstract = True&lt;/div&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;These are the models I will use to walk you through this migration process. Essentially what we are doing here is removing the one-to-one relationships between Model1/BaseModel and Model2/BaseModel and instead placing each of the fields of BaseModel into Model1 and Model2 so they actually reside in the tables for Model1 and Model2. The tricky part is migrating all your data while we work through this.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;b&gt;Make a Copy of BaseModel&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;When you add the &amp;quot;abstract = True&amp;quot; property to the BaseModel (don&amp;#39;t do this yet), south will delete the entire table BaseModel. If you don&amp;#39;t make a copy of the data in BaseModel, after you add the &amp;quot;abstract = True&amp;quot; property you will have no way of copying the fields in the old BaseModel to the respective new models. Making a copy isn&amp;#39;t bad:&lt;/div&gt; &lt;div&gt;&lt;ol&gt;&lt;li&gt;Add BaseModelCopy within base_app/models.py that has an identical schema to BaseModel.&lt;/li&gt;&lt;li&gt;Run a &lt;a href="http://south.aeracode.org/docs/tutorial/part1.html"&gt;schema migration&lt;/a&gt; (python manage.py schemamigration base_app --auto; python manage.py migrate base_app).&lt;/li&gt; &lt;li&gt;Run a&lt;a href="http://south.aeracode.org/docs/tutorial/part3.html"&gt; data migration&lt;/a&gt; to copy the existing objects in BaseModel to BaseModelCopy (python manage.py datamigration base_app copy_contents; (then edit the contents of the data migration); python manage.py migrate base_app).&lt;/li&gt; &lt;/ol&gt;&lt;div&gt;&lt;b&gt;Add a Field on the Child Classes to Store the ID&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;The way django deals with concrete inheritance is a little interesting when you look closely at it. The Child classes Model1 and Model2 do not have &amp;#39;id&amp;#39; columns in the database, and their primary_key is actually a column named &amp;quot;basemodel_ptr_id&amp;quot;. Thus, the unique id is stored in the corresponding BaseModel object. When you eventually add the &amp;quot;abstract = True&amp;quot; property, south will naturally delete this &amp;quot;basemodel_ptr_id&amp;quot; column and you will lose all references to the original BaseModel object. This is clearly very bad, and we would have no way of recovering those relationships if we did that. Thus, we need to add a field to Model1 and Model2 that stores the id of the corresponding BaseModel object so we can reference it in the data migrations after we move to abstract base classes. Doing this is also straightforward:&lt;/div&gt; &lt;div&gt;&lt;ol&gt;&lt;li&gt;Add a field &amp;quot;tmp_id = models.IntegerField()&amp;quot; on both Model1 and Model2.&lt;/li&gt;&lt;li&gt;Run a schema migration on app1 and app2&lt;/li&gt;&lt;li&gt;Run a data migration on app1 and app2 copying the id of the corresponding base model into the &amp;quot;tmp_id&amp;quot; field.&lt;/li&gt; &lt;/ol&gt;&lt;div&gt;&lt;b&gt;Prepare the BaseModel to be Abstract&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;There are two things you will need to change in your BaseModel class before you can add the &amp;quot;abstract = True&amp;quot; property. First, you will need to fix the related_name for every ForeignKey field in BaseModel. If you don&amp;#39;t do this, there will be multiple tables with ForeignKeys on the User object with the same related_name and &lt;a href="http://thedjangoforum.com/board/thread/417/reverse-query-name-for-field-clash/"&gt;this conflict will cause an error&lt;/a&gt;. Adding the name of the class to the related name as shown in the &amp;quot;after&amp;quot; state of the database will solve this issue.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;The second issue is that you will have to remove any managers on BaseModel. These managers will throw an error and instead need to be bound to the child classes.&lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;b&gt;Mark the BaseModel as Abstract and Create a New Primary Key&lt;/b&gt;&lt;/div&gt; &lt;p /&gt;&lt;div&gt;There is yet another gotcha with this step. When we add the property &amp;quot;abstract = True&amp;quot; to BaseModel, after django deletes this model, it will automatically add an &amp;quot;id&amp;quot; field to Model1 and Model2 and it will make this field a primary_key. This is fine if we have no data, but since we do have data, we have no way of specifying what to set these initial &amp;quot;id&amp;quot;s to, and since it is a primary_key and there can&amp;#39;t be any overlaps, we simply can&amp;#39;t do this. Conveniently, we have this &amp;quot;tmp_id&amp;quot; field full of unique values, and we can use this as our primary_key. We can specify this when we make our migration:&lt;/div&gt; &lt;div&gt;&lt;ol&gt;&lt;li&gt;Add the property &amp;quot;abstract = True&amp;quot; on BaseModel.&lt;/li&gt;&lt;li&gt;Add a field &amp;quot;id = models.IntegerField(primary_key=False)&amp;quot; on BaseModel&lt;/li&gt;&lt;li&gt;Change the &amp;quot;tmp_id = models.IntegerField()&amp;quot; on Model1 and Model2 to be &amp;quot;tmp_id = models.IntegerField(primary_key=True).&lt;/li&gt; &lt;li&gt;Run schema migrations on app1, app2, and base_app.&lt;/li&gt;&lt;li&gt;Run a datamigration that copies the relevant data from BaseModelCopy to every corresponding object in Model1 and Model2. To do this, just make use of the &amp;quot;tmp_id&amp;quot; field we created and the new BaseModelCopy class. Make sure this datamigration also copies the &amp;quot;id&amp;quot; field.&lt;/li&gt; &lt;/ol&gt;&lt;div&gt;&lt;b&gt;Remove all our Temporary Models and Fields&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;Our database should be near-perfect now and you should be able to run the development server to view your site. Inserts will not work yet because we have not specified a way to auto-increment the primary key of objects when we insert them, but we&amp;#39;ll get to that later. Right now, if we see all our data has migrated successfully, we are ready to remove all this temporary stuff we created.&lt;/div&gt; &lt;div&gt;&lt;ol&gt;&lt;li&gt;Remove the &amp;quot;tmp_id&amp;quot; columns from Model1 and Model2. &lt;/li&gt;&lt;li&gt;Change the &amp;quot;id&amp;quot; field on BaseModel to &amp;quot;id = models.IntegerField(primary_key=True)&amp;quot;.&lt;/li&gt;&lt;li&gt;Remove the model BaseModelCopy.&lt;/li&gt; &lt;li&gt;Run schema migrations on app1, app2, and base_app.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Build the AutoField Functionality on Your Primary Key&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;The final gotcha of this process is that Postgres handles the django field models.AutoField() a bit strangely. You can inspect this using pgadmin or whatever gui you have to look at how it adds a &amp;quot;serial&amp;quot; property to the field. Because of this peculiarity, south will not allow you to migrate from an IntegerField() to an AutoField() out of the box. &lt;a href="http://south.aeracode.org/ticket/407"&gt;There is a workaround for this migration&lt;/a&gt;, but if that seems to messy to you, you can simply &lt;a href="http://stackoverflow.com/questions/1065089/auto-increment-a-value-in-django-with-respect-to-the-previous-one"&gt;handle the auto-increment manually&lt;/a&gt;. Handling it manually only takes a couple of lines, but make sure you implement some sort of database locking to ensure you don&amp;#39;t run into race conditions.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;If you are not using Postgres, you may be able to completely skip this step and instead just change the id field on BaseModel to &amp;quot;id = models.AutoField(primary_key=True)&amp;quot; and run a migration, but I can&amp;#39;t confirm this.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;b&gt;Push Changes to your Production Server&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;I&amp;#39;m assuming you made all of these migrations on local servers and not a production server, so the final step is to make the jump to deploying the changes. We now have our new schema with all the data filled in, and it should be working nicely with our code base on our local server. However, our set of migrations poses some problems for when we migrate. We can see that each set of migrations we did in the steps above are reliant on the full set of migrations having been completed in the previous step. This means the migrations for one app are reliant on the migrations for another app so going through a full set of migrations for a single app would not work. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;To avoid this issue, we could have pushed each individual set of migrations along with the code to the production server right as we generated them. Alternately, we can simply clear out the migration history for each of our apps, dump the local datastore, and then rebuild the production database using these migrations. This is the method I used because I happened to be doing this at 4am when no one users were generating new data on the stie.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;So, these are the steps for how to do this:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;On your local server, remove all of the migrations from from migrations/ folder for app1, app2, and base_app. The history is no longer important to us because we did not specify a way to do backwards migrations anyway.&lt;/li&gt; &lt;li&gt;On your local server, create initial migrations using south for app1, app2, and base_app, clearing any ghost migrations (python manage.py schemamigration app1 --initial --delete-ghost-migrations).&lt;/li&gt;&lt;li&gt;On your local server, run the migrations. South will tell you that nothing needs to be changed. This is good.&lt;/li&gt; &lt;li&gt;Save all your changes to git or whatever you use.&lt;/li&gt;&lt;li&gt;Dump the local database (pg_dump --no-owner --no-acl -U username postgres_db_dev &amp;gt; postgres_db_dev_dump.psql).&lt;/li&gt;&lt;li&gt;Clone your working repository onto your production machine.&lt;/li&gt; &lt;li&gt;Copy your sql dump to your production machine.&lt;/li&gt;&lt;li&gt;Delete the production db (dropdb -U username postgres_db).&lt;/li&gt;&lt;li&gt;Re-create the db (createdb -U username postgres_db).&lt;/li&gt;&lt;li&gt;Load the new data (psql -U username postgres_db &amp;lt; postgres_db_dev_dump.psql)&lt;/li&gt; &lt;/ol&gt;&lt;div&gt;Now your production server should look identical to your local_server that you had a working version on. Now that they are synced, you can go back to using whatever regular deployment scripts you use and everything should be just fine.&lt;/div&gt; &lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;The methods used in this tutorial are useful if you have a live server with data you don&amp;#39;t want to lose, but also have a span of time where you can be confident that users will not be adding new data. If users had entered new data into the production site during this process, their data would be lost during the final deployment to the production server. My site has negligible traffic from 1am-7am when I did this, and the database is small (&amp;lt;50,000 objects of type BaseModel) so I could do this quickly. To overcome this on a medium-high traffic site that uses user generated data, you should really schedule some &amp;quot;read-only&amp;quot; downtime and alert your users of this to ensure they don&amp;#39;t enter data that gets overwritten.&lt;/div&gt; &lt;p /&gt;&lt;/div&gt;&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Tue, 23 Aug 2011 12:59:36 -0500</pubDate><guid>tag:markliu.me,2011-08-23:/2011/aug/23/migrating-a-django-postgres-db-from-concrete-inhe/</guid><category>Technical</category><category>Web Development</category></item><item><title>Installing libjpeg and PIL on OSX Snow Leopard with Python 2.7
</title><link>http://markliu.me/2011/aug/20/installing-libjpeg-and-pil-on-osx-snow-leopard-wi/</link><description>&lt;p&gt;If you found this article through a google search, you've probably already read through tons of articles and forums where people gave advice on how to do this. Here's some examples of what I'm talking about:&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.brantsteen.com/blog/python-27-libjpeg-pil-on-osx/"&gt;http://www.brantsteen.com/blog/python-27-libjpeg-pil-on-osx/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://proteus-tech.com/blog/cwt/install-pil-in-snow-leopard/"&gt;http://proteus-tech.com/blog/cwt/install-pil-in-snow-leopard/&lt;/a&gt;&lt;br /&gt; &lt;a href="http://www.thetoryparty.com/wp/2010/08/31/pil-on-snow-leopard-_jpeg_resync_to_restart-error/"&gt;http://www.thetoryparty.com/wp/2010/08/31/pil-on-snow-leopard-_jpeg_resync_to_restart-error/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.brambraakman.com/blog/comments/installing_pil_in_snow_leopard_jpeg_resync_to_restart_error/"&gt;http://www.brambraakman.com/blog/comments/installing_pil_in_snow_leopard_jpeg_resync_to_restart_error/&lt;/a&gt;&lt;br /&gt; &lt;a href="http://appelfreelance.com/2010/06/libjpeg-pil-snow-leopard-python2-6-_jpeg_resync_to_restart/"&gt;http://appelfreelance.com/2010/06/libjpeg-pil-snow-leopard-python2-6-_jpeg_resync_to_restart/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://djangodays.com/2008/09/03/django-imagefield-validation-error-caused-by-incorrect-pil-installation-on-mac/"&gt;http://djangodays.com/2008/09/03/django-imagefield-validation-error-caused-by-incorrect-pil-installation-on-mac/&lt;/a&gt;&lt;br /&gt; &lt;a href="http://colbypalmer.com/index.php?/colbyworld/blogEntry/install_libjpeg_and_pil_on_os_x_leopard/"&gt;http://colbypalmer.com/index.php?/colbyworld/blogEntry/install_libjpeg_and_pil_on_os_x_leopard/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt; It's clearly an annoying problem, and I'm guessing none of those worked for you. While this is clearly an annoying problem and I spent at least a couple hours of head banging myself, I believe most of peoples' issues can be solved by completed a thorough cleanup. If you tried one or more of those approaches above, you probably have libjpeg and PIL folders in all sorts of places on your system that are screwing up stuff.&amp;nbsp;&lt;br /&gt; To remove the libjpeg files, make sure you remove anything that looks like libjpeg* or jpeglib*. You'll also want to remove all your PIL directories. Some of the most common directories these might be living in are:
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;
&lt;div&gt;/usr/local/include&lt;/div&gt;
&lt;div&gt;/usr/local/lib&lt;/div&gt;
&lt;div&gt;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/&lt;/div&gt;
&lt;div&gt;/sw/lib&lt;/div&gt;
&lt;div&gt;/sw/include&lt;/div&gt;
&lt;div&gt;/opt/local/lib&lt;/div&gt;
&lt;div&gt;/opt/local/include&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;br /&gt;Be sure to do this between trying any different installation methods or you will end up wasting a lot of time.&amp;nbsp;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;For me, once I removed all these files, getting libjpeg and PIL to work was actually quite simple:&lt;/div&gt;
&lt;div&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="http://ethan.tira-thompson.com/Mac_OS_X_Ports.html"&gt;Download this combo installer&lt;/a&gt; and install it with the default settings.&lt;/li&gt;
&lt;li&gt;Run "pip install pil"&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;I hope this helps someone!&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Edit 1/7/2012&lt;/strong&gt;: It seems that PIL is broken. Some other people revived the project by creating "Pillow", so you can just change step two above to:&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div style="padding-left: 30px;"&gt;pip install pillow&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sat, 20 Aug 2011 11:58:29 -0500</pubDate><guid>tag:markliu.me,2011-08-20:/2011/aug/20/installing-libjpeg-and-pil-on-osx-snow-leopard-wi/</guid><category>Technical</category></item><item><title>Setting up my Hackintosh on my Toshiba Satellite M55-S329
</title><link>http://markliu.me/2011/aug/19/setting-up-my-hackintosh-on-my-toshiba-satellite-/</link><description>&lt;a href="/"&gt;&lt;/a&gt;I&amp;#39;ll go through the process of turning my 6 year old Toshiba Satellite into a brand new Hackintosh. So far it&amp;#39;s working great! Wifi and all! And best of all, it didn&amp;#39;t take much time at all to set up.&lt;p /&gt;&lt;div&gt;First, I have to give credits to the two best sources for this that I found:&lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;a href="http://www.insanelymac.com/forum/index.php?showtopic=167283"&gt;http://www.insanelymac.com/forum/index.php?showtopic=167283&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;a href="http://wiki.osx86project.org/wiki/index.php/HCL_10.5.2/Portables#Satellite_m55-s3293"&gt;http://wiki.osx86project.org/wiki/index.php/HCL_10.5.2/Portables#Satellite_m55-s3293&lt;/a&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;Not everything went totally smooth for me, though, so I&amp;#39;ll walk through each step in a bit more detail than in those links above.&lt;/div&gt; &lt;div&gt;&lt;ol&gt;&lt;li&gt;First, you should download &lt;a href="http://thepiratebay.org/torrent/4726660/iDeneb_v1.4_OSx86_ISO"&gt;iDeneb 1.4 via torrents&lt;/a&gt;. This is an iso image of an OSX installer that works phenomenally. &lt;/li&gt;&lt;li&gt;Burn this iso image onto a disk. If you&amp;#39;re already using OSX like me, use disk utility &lt;a href="http://hints.macworld.com/article.php?story=20060619181010389"&gt;as explained here&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Partition your harddrive. Since you probably already have windows installed on your Toshiba, you can download the &lt;a href="http://www.partitionwizard.com/"&gt;free Partition Wizard&lt;/a&gt; which works beautifully. You need to make a fairly large OSX partition. Since you&amp;#39;re in windows you won&amp;#39;t be able to format this partition as Mac OS Extended Journaled, but you need to create a blank partition and give it a drive name such as &amp;quot;D:\&amp;quot;.&lt;/li&gt; &lt;li&gt;Insert the iDeneb disk and restart the computer. Boot from the disk by hitting F12 at startup. &lt;/li&gt;&lt;li&gt;When you reach the first iDeneb install screen, it asks you to choose which drive you would like to install it on, but doesn&amp;#39;t show any drives to choose from. This is because you need to format your blank partition. Simply choose Disk Utility from the utilities drop down, select your blank partition, and erase that partition while choosing Mac OS Extended Journaled. You can then exit the Disk Utility and choose this new partition you created as the place to install osx.&lt;/li&gt; &lt;li&gt;At the screen where it prompts you to install, you need to first click on the &amp;quot;options&amp;quot; or &amp;quot;configuration&amp;quot; button to choose which drivers (kexts) you want installed. Choose exactly the options specified &lt;a href="http://www.insanelymac.com/forum/index.php?showtopic=167283"&gt;here&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Click install and wait a while. Then just go through the regular startup questionaire.&lt;/li&gt;&lt;li&gt;After it boots up, everything except wifi/ethernet should be working. Download the post-install files from &lt;a href="http://www.insanelymac.com/forum/index.php?showtopic=167283"&gt;this insanelymac thread&lt;/a&gt; using a computer with internet. Also download &lt;a href="http://projectcamphor.mercurysquad.com/downloads/"&gt;Intel PRO/Wireless 220BG driver&lt;/a&gt;. Place them on a flash drive, and open the folder on your Toshiba.&lt;/li&gt; &lt;li&gt;Install the AppleYukon kext, then the Seatbelt Kext, and finally the Intel Pro/Wireless driver kext that you downloaded from project: camphor. You can use &lt;a href="http://ihackintosh.blogspot.com/2008/09/how-to-install-kext-file-on-osx86.html"&gt;this guide for installing kexts&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;Reboot and cross your fingers!&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;The thing to note that I did differently than in those links above is that I used a different method for getting wifi up and working. I didn&amp;#39;t use the iwi installer, and instead used the camphor installer.&lt;/div&gt; &lt;/div&gt;&lt;p /&gt;&lt;div&gt;After using my new hackintosh for a little bit, the biggest shortcoming is that the wifi can connect only to unauthenticated or WEP encrypted networks, not WPA or WPA2. This is a bit inconvenient. Further, since this computer is so old, even though OSX is running smoothly, the hardware limitations make streaming video choppy, and of course the battery life kind of sucks. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;That being said, I now have a fully working hackintosh that I can use for development when I&amp;#39;m away from my desktop. Awesome.&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Fri, 19 Aug 2011 08:52:25 -0500</pubDate><guid>tag:markliu.me,2011-08-19:/2011/aug/19/setting-up-my-hackintosh-on-my-toshiba-satellite-/</guid><category>Technical</category></item><item><title>Scheduling Regular Backups on Webfaction
</title><link>http://markliu.me/2011/aug/14/scheduling-regular-backups-on-webfaction/</link><description>For &lt;a href="http://leaguevine.com"&gt;Leaguevine&lt;/a&gt;, we take backing up our information seriously and have deployed a custom backup system for our database. I figured I would share how we back up our databases here. Note that this sort of backup technique is certainly not a replacement for source control or backing up user uploads, but that&amp;#39;s a topic for another day.&lt;p /&gt;&lt;div&gt;First, we have to decide on a schedule for what copies of the database we want to keep, and how long we want to keep them for. For Leaguevine, we decided on the following scheme:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Hourly backups for the past week&lt;/li&gt; &lt;li&gt;Daily backups for the past month&lt;/li&gt;&lt;li&gt;Monthly backups indefinitely&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;After defining a schedule, creating these backups on webfaction is as easy as creating some folders and specifying commands to periodically dump the database information into those folders. Thus, we have directories for each the hourly, daily, and monthly backups. To dump the data into files within these directories and write the success/failure of these dumps to a log, we create new cron jobs. For example, if we open up our list of cron jobs, we can add a single command to do all this. It might look something like:&lt;/div&gt; &lt;p /&gt;&lt;/div&gt;&lt;blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;div&gt;&lt;div&gt;30 * * * * /usr/local/pgsql/bin/pg_dump -Ft -U db_username db_name &amp;gt; /path-to-backups/leaguevine/hourly/leaguevine-hourly-`date +\%a\%H`.tar 2&amp;gt;&amp;gt; /path-to-backups/leaguevine/hourly/backups.log &amp;amp;&amp;amp; echo &amp;quot;Database backup completed successfully on `date`&amp;quot; &amp;gt;&amp;gt; /path-to-backups/leaguevine/hourly/backups.log&lt;/div&gt; &lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;p /&gt;&lt;div&gt;There is a lot going on here. First, we notice that this job will run every hour on the half hour due to the way we defined the &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;cron job&lt;/a&gt;.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;Next, we specify the database name and username for the PostgreSQL database that Leaguevine uses. For this to run without needing to prompt the user for input, we need to set up the &lt;a href="http://wiki.postgresql.org/wiki/Pgpass"&gt;.pgpass&lt;/a&gt; file which just takes a second. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;The next thing this command does is specify the folder we want to dump the database to, along with the day of the week and the hour of the day. This works for us because the database dumps from previous weeks will get written over by files of the same name after a week passes. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;The command then writes any errors to a file called backups.log, but if there are no errors it writes a success message that has a date stamp on it to that file.&lt;/div&gt;&lt;p /&gt;&lt;div&gt;This single command will create all of the hourly backups for a week without needing any manual maintenance. However, this has the shortcoming of residing on the same server as the production database. Thus, if something happened and all of the data on that server were wiped out, all of the data would be lost. Thus, we need to additionally copy these backups to a different computer regularly. To do this, you can just install another cron job on a different machine as so:&lt;/div&gt; &lt;p /&gt;&lt;/div&gt;&lt;blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;&lt;div&gt;&lt;div&gt;40 * * * * . ~/.ssh-agent; scp -o PreferredAuthentications=publickey &lt;a href="mailto:username@web160.webfaction.com"&gt;username@web160.webfaction.com&lt;/a&gt;:/path-to-backups/leaguevine/hourly/leaguevine-hourly-`date +\%a\%H`.tar /local-path-to-backups/leaguevine/hourly/ 2&amp;gt;&amp;gt; /local-path-to-backups/leaguevine/hourly/backups.log &amp;amp;&amp;amp; echo &amp;quot;Database backup completed successfully on `date`&amp;quot; &amp;gt;&amp;gt; /local-path-to-backups/leaguevine/hourly/backups.log&lt;/div&gt; &lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;p /&gt;&lt;div&gt;This cron job is very similar to the previous one in some ways. First, it runs 10 minutes after every supposed backup should have happened. Next, it uses scp to grab the backup and store it on the local disk. And finally, it handles the logs the same way as before.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;The trick here is to set up your .ssh-agent so that scp can run without needing a login. This isn&amp;#39;t too hard, and webfaction has good docs for &lt;a href="http://docs.webfaction.com/user-guide/access.html#using-ssh-keys"&gt;how to use ssh keys&lt;/a&gt;.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;And that&amp;#39;s it! With just a few lines in your cron files, you can have customized automated backups of your important data.&lt;/div&gt;&lt;p /&gt;&lt;p /&gt;&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sun, 14 Aug 2011 10:30:31 -0500</pubDate><guid>tag:markliu.me,2011-08-14:/2011/aug/14/scheduling-regular-backups-on-webfaction/</guid><category>Technical</category><category>Web Development</category></item><item><title>Sanya Beaches and Relaxation
</title><link>http://markliu.me/2011/aug/04/sanya-beaches-and-relaxation/</link><description>After Yangshuo, we took a bus to Guilin where we again stayed at Liu Tao’s youth hostel for a night in preparation for our flight to Sanya. This time we paid for our room at the hostel because we would feel bad abusing his generosity towards Couchsurfers. We walked around the town that night, and enjoyed a beautiful atmosphere. Our guide book said Guilin would be overly crowded with tourists, but the city is big enough to hold a lot of people while giving everyone enough space to really enjoy it’s beauty. There were tons of mood lights all along the slow moving river and there were great paths to walk along it. We sat and watched an amazing violin player for a little while, which is probably why I remember the mood of the town being so serene and peaceful.&lt;p /&gt; The next day we flew down to Haikou, a city in Hainan. Hainan is an Island in the south of China that many equate to being “China’s Hawaii”. We flew into Haikou on the north shore of the Island because it was cheaper, but our destination was Sanya so we took a bullet train (cost about $10 each) that got us there in about 2 hours while going 250 km/hr! So cool.&lt;p /&gt; Once in Sanya, we took a couple of busses to try to get to our tiny little beach house where we booked an inexpensive room right on a beach. However, even though we got off at the right place, we couldn’t find the beach house by ourselves and no one there had ever heard of it. We asked the concierge at a resort where it was, and he helped us by talking to the owner of this beach house and she had us wait at the resort while she walked over to meet us. She walked us back to our rooms, and we were very pleased that we decided to stay there for two nights.&lt;p /&gt; I posted a photo from our awesome room in a previous post andmentioned that unfortunately, the beach we were on was not a swimming beach. On the second day of our stay which happened to be my birthday, we went to visit a couple of swimming beaches. The first, Yulong Bay, had gorgeous views and incredibly fine sand. It was exactly what Americans typically picture when they think of a beach in paradise. We splashed around in the big waves and threw a disc around for a while and there were very few people in the ocean. Unfortunately, the only reason this one was so clean and impeccably nice was that the entire coast line of the bay was owned by “6 and 7 star resorts”. We walked through a couple of resorts and one of them had something like 4 outdoor pools with water slides and the works. While these resorts are great for people who want to spend tons of money, they suck for people who are living in budget rooms like Rachael and I because they don’t let you hang out on their stretch of beach. Rachael and I sat down on the chairs of one of the resorts and read our books for a couple hours, not exactly sure what the policy of the resort was. After a while, someone from the resort came and asked us for our room key and then kicked us out. It’s too bad this beautiful beach is only really friendly towards the people who spend tons of money.&lt;p /&gt; Later that same day, we visited a less pretentious and highly recommended beach called Dadonghai. This one was totally free to the public, and the scenery and sand was just as nice as Yalong bay. However, it had none of the peacefulness that Yalong Bay had because it was jam packed with Chinese tourists. That being said, it was really fun playing in the giant waves with the masses of people who were all in great spirits and laughing all the time. At all times, there was another person within 3 meters of us, but I enjoyed the atmosphere here more than the stuffy one of Yalong Bay.&lt;br /&gt; &lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/IKHmgDpiqVuTO8GykRRoW6x4yUlOEmnyjHDoqAGdxN9Q0ZYgZ30q6ucO81RU/IMG_5155.jpg.scaled.1000.jpg"&gt;&lt;img alt="Img_5155" height="375" src="http://posterous.com/getfile/files.posterous.com/wiscospike/PKFNlcVsUCduCdmzqVdyHuActSDnZyEyVscX0CIs5vRUotjUZ8pVQbnR6DQB/IMG_5155.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p /&gt;&lt;br /&gt;After our two nights at the Papiluo Bluehouse, we decided to pack up and change our location to a youth hostel where the owner speaks English. As nice as our room was, we felt like we were a bit stuck and had no clue how to do anything except visit beaches. We checked into the Raintree Youth Hostel for a four night stay and this turned out to be a great decision.&lt;p /&gt; Soon after checking in, Rachael got sick and then remained very sick through the following day. The hostel was in an area where we could go downstairs and easily find food, and there was enough to do in the hostel that we could take a full day off and not be too bored. One of the staff helped us move a DVD player into our nice AC room where we proceeded to watch a couple movies and read for most of the day.&lt;p /&gt; Rachael felt better after the full day of rest and we went with Justin, the owner of the hostel, and a group of about 8 out to a remote bay for a day of water activities. The bay we went to had gorgeous, clean beaches and our group and one other were the only ones swimming in the entire bay. We swam, rode on a banana boat, tried standing on body boards being pulled by a speed boat, tried wake boarding, and snorkeled for a long time. Unlike my only other snorkeling experience, this one was actually good! I had very few problems with my facemask and I was able to see a ton of cool stuff under the water. This bay was quite undeveloped so we were able to see coral, sponges, anemones, crabs, hermit crabs, fish, urchins, sea cucumbers, and even several small jellyfish.&lt;p /&gt;&lt;div&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/qpNRN76ZtDZfVCEHsor9AZS2h0u0GaV5KnW4bEhnX1PdDiomb0yXYWW6Rd53/IMG_5186.jpg.scaled.1000.jpg"&gt;&lt;img alt="Img_5186" height="375" src="http://posterous.com/getfile/files.posterous.com/wiscospike/dfn95F0TcTk5nZAWGQ96wyF2QANDSgeDvBA0A9V4zWgwyG1vENGRkTrlAvzu/IMG_5186.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p /&gt;On our final full day in Sanya, we went to see the rainforest. It sounded very cool, but turned out to be a frustrating and disappointing experience. The place we went was excessively developed and felt like Disney world. There was no resemblance whatsoever to any U.S. state or national park. The only paths in the rainforest were perfectly well kept walkways. All of these walkways were completely packed with Chinese tourists and all of the sounds of nature were drowned out by the tour guide speakerphones coming from every direction. The largest animal we saw were some small bats hanging on a rock overhang under a nice wooden bridge. Rachael, myself, and one of our friends from the hostel ventured off the trail a couple times which was fun for a few minutes until we ran into another walkway or were scolded by tour guides to stay on the walkways.&lt;p /&gt; Despite the one disappointing day in the “rainforest”, our trip to Sanya was great and I’m glad we planned that into our vacation. We got to see a bunch of beaches, had fun playing in the water, and were able to relax a bunch more before what we knew would be a fast paced week with my family in Beijing and Shanghai.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/NEOvNBlp2VtmAsTyJGxRQaVpHSvTQFBeLEsnvfWuK5qeADUZWVp8L0UzrR4p/IMG_5236.jpg.scaled.1000.jpg"&gt;&lt;img alt="Img_5236" height="375" src="http://posterous.com/getfile/files.posterous.com/wiscospike/FqazSnnsnDDWlPSXQZf4rWwuMrC8cZcM1q0G64HIDkPtOAiipyctsHDh8UBr/IMG_5236.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 04 Aug 2011 20:31:03 -0500</pubDate><guid>tag:markliu.me,2011-08-04:/2011/aug/04/sanya-beaches-and-relaxation/</guid><category>General</category><category>Non-Technical</category></item><item><title>Looking back on our time in Yangshuo
</title><link>http://markliu.me/2011/aug/04/looking-back-on-our-time-in-yangshuo/</link><description>This final set of blog posts is coming extremely late, but I figure better late than never!&lt;p /&gt;We spent most of our second week (6 nights) in Yangshuo and this may have been our favorite location on our trip. Yangshuo has been different from every other city/town we’ve visited in that it is small, not too busy, and a surprising number of people speak English. There are only about 200,000 residents in the town and thus you can get absolutely anywhere you want on foot. After so many taxi rides during the first week, this was a great relief.&lt;p /&gt; Another huge plus of Yangshuo is that the tourism catered to Western tourists instead of Chinese tourists. The domestic tourism industry is ridiculously huge, and a big part of what they do is to make absolutely everything accessible to anyone. This means trams, cable cars, stone pathways, covered boats, AC busses, and refreshment stands everywhere you can look. The idea behind making the best sites accessible enough so people of any age can enjoy them is cool, but the downside is there are often unimaginable hoards of people crowding around these sites. What makes Chinese tourism less attractive to me (and probably other Western tourists) is that there is exactly one way to see each of the tourist sites and the tourism companies dictate what way that is. Exploring on your own, or getting off the beaten path is very difficult and sometimes impossible at tourists sites aimed at domestic tourism.&lt;p /&gt; Yangshuo was geared almost solely towards Western tourists. You could easily arrange your own outdoor activities such as bike riding, tubing, rafting, hiking, or exploring without having your trip being forced into doing exactly what a tourism company tells you to do.&lt;p /&gt; When we got to Yangshuo, it was late at night and we stopped by the English school we planned to volunteer at since we were told we would have a room there. Sadly, they did not have a room prepared for us so they directed us to an area with a number of youth hostels. On our walk there, an awesome Canadian couple started talking with us and then walked us all the way there even though they were staying somewhere else.&lt;p /&gt; We spent our first night at a wonderful hostel called the Showbiz Inn. It had a clean, comfortable room with AC, TV, Wi-Fi and a really nice rooftop bar with an English speaking staff. It cost less than $20/night for the room and we were all ready to book that room for the remainder of our stay, but we found out the next morning that they had already booked our room for the next night and there were none left, so we moved over to a place 30 meters away called Monkey Jane’s and booked our stay for 5 nights there (just $10/night for the same amenities but dirtier).&lt;p /&gt; Monkey Jane’s was a really unique place with the most lively and fun rooftop bar I’ve ever seen. They had a beer pong table that was always in use, extremely cheap beer, tons of couches, and a gorgeous view of the surrounding Karst pinnacles. It was always full of European tourists, and it felt weird being English speakers for the first time on our trip.&lt;p /&gt; On our first night in Yangshuo, we spent some of the evening in the Monkey Jane rooftop bar playing beer pong and some friends we made that night suggested we go tubing down the river with them the following day. So on our second day, we spent a good 3-4 hours sitting in giant inner tubes floating down the beautiful river. It was a ton of fun, and there were no rapids or anything dangerous. It was just a good relaxing time. A bunch of Chinese tourists on motorized bamboo rafts were passing us, waving, and taking photographs of us which was very entertaining. On the downside, our phone got wet and mostly ruined, and everyone on the rafting trip got terribly sunburned. My skin is still peeling from that trip which was about 4 weeks ago.&lt;p /&gt; That night, we participated in something called the English Corner at an English language school in Yangshuo. This turned out to be incredibly fun and was a great learning experience for both me and Rachael. All we were asked to do was sit in a small classroom of 8-10 students and talk with them for 2 hours in English. Of the 6 days we spent in Yangshuo, only two of those days had English corner scheduled, and we happily attended both of them. Most of our discussions were us learning about the Chinese culture and talking about life in America. We hung out with one of the students named Gunnar and some of his friends after class and we had a great conversation. Turns out he is a computer science guy like me, we’re the same age, and we have the same last name. Unfortunately, we only met him on our last day, because he offered to teach us Chinese which we would have gladly accepted.&lt;p /&gt; The highlight of the second full day was the bike trip I talked about in a previous blog post. The day after, we went exploring on foot because Rachael’s butt hurt from a terrible bike seat and a super long bike ride the day before. We decided we’d hike up to the top of a Karst pinnacle. We didn’t want to do a tour or anything, so we picked a fairly nearby pinnacle that was higher than the rest of them and had a TV tower sitting at the top. It’s safe to assume there is some pathway up to a peak where there is a TV tower. Thus, we started walking toward it and found our path blocked by solid rows of apartments. We kept taking small alleys between these apartments, and backtracked to find new alleys whenever our path ran into a dead end. Some residents also helped point us in the right direction because it was pretty clear where we were trying to go. After a lot of meandering, we found the entry to a very nice stone paved trail that let all the way to the top. The entire trek both up and down we didn’t see a single person, which was incredible. It was even more solitude than a hike in a national/state park in the U.S. The view from the top was a lot of fun, and the day was almost identical to a really fun day in 2008 when Tom and I managed to find our way to the peak of the “mountain” on the Island of Hydra in Greece.&lt;p /&gt; The rest of our stay in Yangshuo was spent relaxing and rejuvenating after an overly hectic and rushed first 10 days or so of our vacation. We bought a couple books at a bookstore, watched a movie, hung out with our Canadian friends Jonathan and Kristen, participated in English corner again, strolled around town, bought some cheap stuff, planned the rest of our trip, drank some beers at night, and ate a lot of fruit. Oh and we went to a cave where we took a mud bath that I talked about in a different blog post!&lt;p /&gt; Being able to relax for a few days was an amazing luxury, and we didn’t feel bad doing it because our vacation was so long. If our vacation were only for a week, we would feel guilty spending any of our time doing things that we could also do in the U.S., but since this was a full 5 week trip, we could really slow down and enjoy ourselves now and then.
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 04 Aug 2011 20:19:47 -0500</pubDate><guid>tag:markliu.me,2011-08-04:/2011/aug/04/looking-back-on-our-time-in-yangshuo/</guid><category>General</category><category>Non-Technical</category></item><item><title>First week of China - Beijing, Luoyang, Hua Shan, Xi&amp;#39;an, And Guilin
</title><link>http://markliu.me/2011/jul/11/first-week-of-china-beijing-luoyang-hua-shan-xian/</link><description>Blogging has been a bit sporadic over our first three weeks of this trip so I'm going to go back through the fun events of our first week here. I'll get to the stuff from the past 2 weeks soon! &lt;p /&gt; We didn't spend much time in Beijing since we will be doing a lot more of that when my family arrives. Our first impression was really nice, though. We stayed in a gorgeous Marriott room thanks to my dad's connections. That first night, my dad's friend Ying and her daughter Yuan treated us to an excellent meal of peking duck and showed us around a pretty park. In the morning, Rachael and I took a nice walk around, ate some cheap food, and then met up with Ying and Yuan again for a delicious lunch. After that we were off to Luoyang to meet oir friend Kevin. &lt;p /&gt; I believe I already touched on our experience in Luoyan in a previous post so I'll skip it here. The highlights of the two days there were seeing the Longmen grottoes, hanging out with some kids who wanted to practice thir English, meeting an awesome girl named Cassie who helped show us around town, and then having a loud and fun dinner with a guy we met on couhsurfing. From Luoyang we traveled to Hua Shan which is a town based almost solely around tourism for hiking a famous mountain. I wrote a blog post from an Internet cafe there and remember being tired an in a bad mood. The town wasn't a very friendly place since everyone was pushy and trying to get us tourists to buy stuff from them. But the mountain hike was fun. &lt;p /&gt; We started the hike at 6 in the morning, right after the sun came up. From the base to the top was more than 5000 vertical feet so we had to start early. The most common route was to take a cable car up the first 3000 feet and then hike the final stretch but there is also a trail to walk up this stretch and we opted to do that. It wasn't anything like a hike in a US national park. The entire trail on the mountain was paved with stones and phenomenally maintained. In my opinion, it seemed too easy and didn't feel like nature. However, I understand that their goal was to make it super accessible to everyone and indeed plenty of dressed up girls with high heels or flip flops were able to complete the hike. Rachael and I were super over dressed with our hiking boots :P. &lt;p /&gt; Despite the hoards of people, the hike was still fun and was really good exercise. It felt great to get outside for so long. The first part of the hike where we skipped the cable car had very few other hikers which was nice. Although every 50-100 meters all the way up there was a shop selling refreshments. The view was obscured by a dense fog so we didn't get any photos of what would probably have been an incredible mountainous landscape. &lt;p /&gt; After this hike, we took a bus over to Xi'an. Upon arriving it was pouring rain and we had to meet our couchsurfing friend Meng whose place we would stay at. We had a tough time finding each other at the train station but eventually she popped up with a huge smile on her face and led us to a local bus that cost us next to nothing. We took that for 45 minutes, an when w got off she bought some vegetables for dinner. We then took a taxi another 20 minutes to her home on the countryside. We trekked through some slick mud and finally made it into her home. Quite an adventure! &lt;p /&gt; Meng's home was so serene and nice. It had an open courtyard with no roof over it and under an awning her mom prepared us dinner with the vegetables Meng bought. Meng made up our beds and then served us a fantastic dinner with several tasty dishes. Despite how amazing this stay was, it was about 60 minutes from downtown Xi'an and Rachael and Kevin really wanted to spend the next night somewhere closer. I was a bit disappointed, but it worked out ok and Meng found us a room at a cheap but nice Inn that was close to a bunch of stuff. &lt;p /&gt; The next day, we checked into that inn and then went and saw the Terracotta Warriors which is one of China's most popular attractions. It was actually quite impressive and I think it lived up to the hype. After we got back, we went and explored Xi'an's snack street where there was an endless row of restaurants and snack shops. This street was just amazing! It's some of the best night life I've seen of all the places I've been in the world and the food was even better than the atmosphere. It was full of both locals and tourists but mostly just locals. It was loud but not excessively crowded and plenty of groups of happy youngsters had their tables covered with empty beer bottles as they played their Asian drinking games. Because of this street, I wish we had spent more time in Xi'an. Unfortunately, we already had our tickets booked for the following night down to Guilin. &lt;p /&gt; On the following day, we spent a couple hours biking on the old wall around Xi'an. Our guide book had this as one of the best things to do in China and I can see why. The 9km wall surrounded the entire old part of Xi'an and was maintained extremely well. Because there was an entrance fee to go up and bike on it, it was totally empty. We could see the sights of the old town while also seeing the endless line of huge buildings just on the outside of the wall. I couldn't believe how huge this city was and it was truly a sight to see. It felt so much bigger than Chicago. &lt;p /&gt; That night we flew to Guilin. We were just using Guilin as a convenient entry point to get to Yangshuo so our stay there was for less than 24 hours. We met up with a couchsurfer who runs a youth hostel and he gave us a room for no charge. He also spent a good 30-45 minutes talking to us and telling us what there was to do in the area. Liu Tao, this couchsurfer, is an avid rock climber, cyclist and outdoorsman so it was great to hear his advice. After these conversations and a breakfast at a local noodle place that cost $0.60 each, we headed to Yangshuo. We spent a bunch of time in Yangshuo and I only talked about a little of it so I'll write another post about it soon!
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Mon, 11 Jul 2011 01:36:04 -0500</pubDate><guid>tag:markliu.me,2011-07-11:/2011/jul/11/first-week-of-china-beijing-luoyang-hua-shan-xian/</guid><category>General</category><category>Non-Technical</category></item><item><title>First day in Hainan
</title><link>http://markliu.me/2011/jul/06/first-day-in-hainan/</link><description>Today's my birthday and to celebrate, Rachael and I are going to go to a white sand beach and do nothing all day! We're staying at a cheap little place that is off the beaten path that sits right on the beach. I'm posting a photo from bed since I still am laying in it. Although the view is nice, it has AC and WiFi, the beach is not a goof beach for swimming so we'll probably change locations tomorrow. It's the offseason here and one super lavish 5 star place we looked at had it's two cheapest rooms (usually $300 &amp; $450/night) heavily discounted (down to $90 &amp; $115/night). I hope we find some good deals along a better swimming beach!&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/8u7dnJxZGX3OXA0eX5FMhSmy4G3GyKcLiAe6t0GpNkmiuJbNd11d5jVsxmQQ/photo.jpg.scaled.1000.jpg"&gt;&lt;img alt="Photo" height="667" src="http://posterous.com/getfile/files.posterous.com/wiscospike/zwvtw6VyxA8Cn05nhfdUQZzfRRs7CSF6jqaxlsC4jzWQ7wgfPXPYNI9XvccW/photo.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 06 Jul 2011 19:53:50 -0500</pubDate><guid>tag:markliu.me,2011-07-06:/2011/jul/06/first-day-in-hainan/</guid><category>General</category><category>Non-Technical</category></item><item><title>Mud cave!
</title><link>http://markliu.me/2011/jul/04/mud-cave/</link><description>Sorry I still haven't given any updates on last week's adventures and I probably won't for another few days at least, but I wanted to post this photo after a fun afternoon. We took a tour to a mud cave right outside Yangshuo today and it was exactly how it sounded. It was a huge cave that we took a boat into to start. After that, we walked much farther into the cave and wore some cheap helmets because the ceilings were low and we were all constantly bumping our heads. After a while, we arrived at a designated area where we could jump into the super muddy water and splash around for a while! &lt;p /&gt; It was kind of gross and cold at first, but it turned out to be a lot of fun. I really liked floating on the surface because the mud made us so buoyant. Our guide took a photo which we bought and I am attaching a copy of it I took with my iPhone. Fun! &lt;p /&gt; After the mud bath, we bathed in some natural hot springs in the cave which was awesome. The whole adventure was pretty short and lasted less than 3 hours, but was certainly worth the tiny entry fee. &lt;p /&gt; We then came back and had lunch at our favorite restaurant in town for under $2 each. Now we have to figure out a way to get our clothes cleaned up before leaving for Guilin tomorrow! From Guilin, we're catching a flight to Hainan, China's southern island with tons of beaches where we'll spend almost a full week. We're really excited and booked a fairly inexpensive room ($35/night) supposedly on a quiet beach with big windows looking out at the water. Laying around on the fine sand there sounds like a great way to spend my birthday! Rachael and I will probably write more updates after we get settled in and have soaked up the sun for a while. Zaijian!&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/5YGYtQJUxcVns2zNwTD2umsp9C0t7GsM8ZWK73U3gaNQoKrN2bHMNNLBn3tj/photo.jpg.scaled.1000.jpg"&gt;&lt;img alt="Photo" height="667" src="http://posterous.com/getfile/files.posterous.com/wiscospike/U3pSDcWBgwY4KvY38oXglt725bwLTNhiwoUFCBxMI8F8oWPYVdGQAaGmEXHq/photo.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Mon, 04 Jul 2011 02:16:22 -0500</pubDate><guid>tag:markliu.me,2011-07-04:/2011/jul/04/mud-cave/</guid><category>General</category><category>Non-Technical</category></item><item><title>The Yangshuo Countryside
</title><link>http://markliu.me/2011/jul/01/the-yangshuo-countryside/</link><description>It's been many days since I last posted, and have since trekked 6000 feet up Hua Shan mountain, stopped in Xi'an to see the terra-cotta warriors, flew to Guilin where we relaxed a bit, and have spent the last 2.5 days here in Yangshuo. I'll talk about those other places soon, but just wanted to give a brief update on today's awesome journey! I apologize for being brief, but I am typing this from my iPhone (this cheap hostel has wi-fi!). &lt;p /&gt; Today was the first day Rachael and I were able to escape the tourists. We woke up and had a leisurely morning where we dropped off our laundry that really needed to be done and then grabbed breakfast/lunch at a surprisingly not-so-touristy restaurant which is a rarity in this town. We then rented nice mountain bikes for $5 each and started on a long and gorgeous journey. &lt;p /&gt; We biked out of town on the main roads which took us a good 45 minutes. Thankfully, the shoulders here are all very wide and the drivers are incredibly respectful to bicyclists. Drivers often honk their horns just to let you know they're coming and tend to drive as far away from the shoulder as possible, even when there is oncoming traffic. &lt;p /&gt; Once we made it out of town, we veered off onto a smaller one lane road that hugged the less traveled Yulong river. There were still a bunch of tour busses taking travelers to their resorts along the river, so the first 30 minutes weren't that much fun. However, the traffic died down and the scenery became incredible. We were surrounded by mountains on both sides, biking along a slow moving winding river that was surrounded by rice paddies. I really enjoy countrysides and seeing these farming communities, so this was incredible. &lt;p /&gt; We often veered away from the main road to get some more peace and quiet and see the countryside better. The people in the villages were really friendly, and we often had brief exchanges where we'd try to speak Mandarin and they'd try to speak English. At best, we learned each others names and figured how far away we were from things. One of my favorite parts was when Rachael thought we should turn one way when actually it led to a dead end at the river. When we began going that way I could see a Chinese man looking at us with an expression of 'why are those white people going that way?'. After a few minutes we reached a very remote stretch of river where a woman was preparing some vegetables. No one else was within shouting distance. The river was really pretty, so we hung out in the shade for a few minutes and laughed with the other woman who was really happy and trying to tell us stuff we couldn't really understand. &lt;p /&gt; After continuing up the river a long ways, we reached a place where there was a bridge with people jumping off it into the water. A bunch of tourists also made it out here because there was a direct road from town, and everyone was swimming. Rachael and I grabbed some ice cream and put our feet in while watching tons of Chinese men in tighty whiteys jump off the bridge. We then crossed the bridge and followed a much more remote path along the river and through a series of small farming communities. There were no other tourists here, which helped add to it's beauty. It was a tougher bike ride since we were often riding on one food wide dirt paths that were wining between rice paddies, and we had to walk our bikes for a few minutes because I wad afraid of falling off the elevated path and into one of the paddies. When a local 12 year old boy on a giant bike came by riding through this like a pro, we of course hopped back on ours and became a bit braver. We ran into 2 local women going the same way as us and they helped lead us to the dragon bridge (our final destination) and kept us from getting lost. We actually passed the bridge and one of them came flying down the path after us yelling to us that we passed it! The stretch of the bike ride on this side of the river took about an hour, but would have taken much longer if she hadn't helped us! &lt;p /&gt; After this really long ride, we decided to take a direct route back to town. We rode on the shoulder of a highway (again with huge shoulders and courteous drivers) and returned our bikes an hour later. &lt;p /&gt; Today was incredibly fun and refreshing because we were able to escape the hoards of tourists as well as the ever-present crowds and traffic of Chinese cities. The Yangshuo countryside is incredibly beautiful and the karst mountain landscape is just as nice as it looks in the photos.
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Fri, 01 Jul 2011 05:39:12 -0500</pubDate><guid>tag:markliu.me,2011-07-01:/2011/jul/01/the-yangshuo-countryside/</guid><category>General</category><category>Non-Technical</category></item><item><title>We&amp;#39;re in China!
</title><link>http://markliu.me/2011/jun/25/were-in-china/</link><description>&lt;div&gt;Rachael and I arrived in China about 3 days ago and the time has flown so far. We&amp;#39;ve both been really jet lagged, and have probably been trying to pack too many things into too little time to start this trip. However, we&amp;#39;ve already done some very fun things and have a lot more to look forward to!&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;We started in Beijing for just a day where my dad&amp;#39;s friend Ying and her daughter Yuan met us and treated us to a fantastic feast. We had Peking duck that first night, they gave us a driving tour of Beijing, and we walked through a park until Rachael and I were falling asleep. We stayed in a super nice hotel, and then walked around that area the next morning where Rachael and I tried mystery food from a bunch of different street vendors. All of it was delicious, by the way. Ying and Yuan took us out to lunch where we had a fancy meal of authentic Beijing food. The restaurant we went to was famous for its cow stomache, but Rachael was definitely not a fan. Ying and Yuan were extremely gracious hosts, and helped us out with tons of stuff including buying us a sim card and our train tickets to Luoyang.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;On Thursday we spent 8 hours in the train to Luoyang and enjoyed a nice nap in our sleeper car, further prolonging our jetlag. We then stayed at a hostel that a couchsurfer recommended. That night we went out and ate a bunch more food from street vendors in a lively area that stayed up well into the night. It was really fun to be in Luoyang because it is clearly a city without much tourism. &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Yesterday we met up with Kevin and went to a place just outside Luoyang called the Longmen grottoes where there a bunch of giant Buddhist statues carved into the rocks. What was really fun about this adventure was that a couple of 10 year old kids came up to us to practice their English. Soon after, a Chinese college student named Cassie also started talking to us, and from that point these three were our English speaking tour guides for the grottoes. Cassie then took us around to neighboring places where we saw a really old temple, ate a nice lunch, and then walked around a park in Luoyang. She then had to go home, but not before recommending Luoyang&amp;#39;s most popular restaurant to us for dinner. After she took us there, we met up with our couch surfing friend who goes by the name Lovelush and he was a blast. He read us the entire menu like a story book, explaining every dish and even describing how some of them are cooked. He was extremely enthusiastic about everything and was a ton of fun to be around. After our 3 hours at the restaurant, he took us to a massage parlor that he said he visits every day. We got some inexpensive massages and then called it a day. Lovelush was the first couchsurfer that we met, and so far we&amp;#39;re really glad we joined that community!&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Today we took a train from Luoyang to Hua Shan because we are going to hike up a mountain here. We arrived at about 2pm, but Kevin was pretty exhausted from trying to bargain prices and make sure we did not get ripped off. One taxi driver was clearly breaking our agreement with him to try and squeeze 10 extra yuan out of us and by refusing to pay him that, we wasted at least an hour and added a lot of stress to our journey. Personally, I would rather get ripped off $0.50 each to save that time, energy, and headache, but I can see where Kevin is coming from in terms of principles. Anyway, we arrived here a bit tired and frustrated, and largely because of this we decided to book a room at a hostel and just hike the mountain tomorrow instead of today. So tomorrow we&amp;#39;re going to wake up really early, climb to the top for about 6 hours, and then decide if we want to hike back down or just take the cable car down. We&amp;#39;ll then move onto Xi&amp;#39;an tomorrow night where we&amp;#39;ll meet up with our second couch surfing friend!&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;It&amp;#39;s nice to be on this vacation right now, but it feels really weird not working. The week before I left, I was getting 4 hours of sleep a night, finalizing my thesis/research, preparing for &amp;amp; helping run the Wisconsin Swiss Ultimate tournament, finishing up some things with EWB, preparing to move, and preparing for this trip. So now I feel really lazy. I&amp;#39;m sure this will be just like the Kenya trips where it just takes me a few days to get into the mindset of moving slowly and not worrying about anything. Once I get to that point, I know this trip will be very theraputic, and will be a great transition between finishing grad school and starting up a business in August.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;I&amp;#39;m a bit tired and thus didn&amp;#39;t go into many details, but Rachael is currently writing a much longer email to friends &amp;amp; family that I might post to this blog as well. She doesn&amp;#39;t feel very comfortable with the world seeing all her thoughts, so it might not happen. Regardless, I&amp;#39;ll be sure to write a lot more as the trip progresses.&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Lastly, I should note that Twitter and Facebook are blocked here, along with a bunch of other services I usually use like Google Docs and Posterous. Thus, these blog posts will likely be my only media outlet over the next month. I can&amp;#39;t see posterous right now so I can&amp;#39;t tell if comments are enabled. If they are, your comments show up in my email, but if they aren&amp;#39;t you&amp;#39;ll have to email me to get ahold of me. I hope everything is going well for you all in the U.S.!&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;-Mark&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sat, 25 Jun 2011 03:12:11 -0500</pubDate><guid>tag:markliu.me,2011-06-25:/2011/jun/25/were-in-china/</guid><category>General</category><category>Non-Technical</category></item><item><title>Backing up my Hackintosh
</title><link>http://markliu.me/2011/jun/16/backing-up-my-hackintosh/</link><description>&lt;p&gt;I am moving soon and every time I have to physically transport a desktop computer I worry the jolting will mess up a hard drive. Because this Hackintosh took me the better part of a day to set up, I decided it would be wise to make a bootable clone of my OSX partition. I didn't want to just back up my files, but instead want a copy of the operating system so if my current boot drive dies, I am back up and running in at most a few minutes. Backing up files is easy, and to do that, just use &lt;a href="http://mozy.com/"&gt;Mozy&lt;/a&gt;, &lt;a href="http://www.carbonite.com/en/default"&gt;Carbonite&lt;/a&gt; or &lt;a href="http://www.crashplan.com/"&gt;Crash Plan&lt;/a&gt;&amp;nbsp;(I use Crash Plan and absolutely love it).&lt;/p&gt;
&lt;p&gt;I looked at some forums that pointed me in the right direction for a solution to creating this bootable clone, but didn't find detailed instructions for the best way to do this. Thus, I'm going to write down the whole process I used here. It was surprisingly easy and free! &amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;Add a new hard drive to your machine or create a paritition where the backup will sit. It must be equal to or larger than the size of your OSX boot partition.&lt;/li&gt;
&lt;li&gt;Format this new partition using Mac OS Extended (Journaled). You can use the OSX Disk Utility for this.&lt;/li&gt;
&lt;li&gt;Download &lt;a href="http://www.bombich.com/"&gt;Carbon Copy Cloner&lt;/a&gt;. It's totally free and is amazing.&lt;/li&gt;
&lt;li&gt;Open the Carbon Copy Cloner .dmg and follow the easy instructions to make a clone of your current boot partition to your new backup partition.&lt;/li&gt;
&lt;li&gt;Download &lt;a href="http://tonymacx86.blogspot.com/2010/04/iboot-multibeast-install-mac-os-x-on.html"&gt;iBoot&lt;/a&gt; and burn this to a CD. You probably already have a copy from your original Hackintosh install.&lt;/li&gt;
&lt;li&gt;Turn off your computer, unplug the cable to the original boot drive.&lt;/li&gt;
&lt;li&gt;Boot your computer and open up the bios to allow you to boot from the iBoot CD you created. It will show you your new cloned partition, and you can select it and boot from it!&amp;nbsp;&lt;/li&gt;
&lt;li&gt;You still need to install a boot loader if you don't want to always have to boot from a CD. Thus, download &lt;a href="http://tonymacx86.blogspot.com/2010/04/iboot-multibeast-install-mac-os-x-on.html"&gt;Multibeast&lt;/a&gt;&amp;nbsp;and run it. Select only the option to install the Chameleon Boot loader. All the rest of the options are already installed on your clone.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Eject your iBoot drive and restart your computer. It should boot up!&lt;/li&gt;
&lt;li&gt;You probably want to switch back to your original OSX partition for booting up, so just plug it back in, go into the bios to ensure it is higher on the HDD boot priority, and then restart your computer.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;I'm really happy about how easy this was to do, and now I have the peace of mind of knowing I won't have to go through the process of setting up a Hackintosh again if my current drive fails.&amp;nbsp;&lt;/div&gt;
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 16 Jun 2011 23:30:29 -0500</pubDate><guid>tag:markliu.me,2011-06-16:/2011/jun/16/backing-up-my-hackintosh/</guid><category>General</category><category>Technical</category></item><item><title>To do: Combine my blogs
</title><link>http://markliu.me/2011/jun/07/to-do-combine-my-blogs/</link><description>I have a new blog that I&amp;#39;ve been using at &lt;a href="http://markliu.me"&gt;http://markliu.me&lt;/a&gt; and I intend to keep using that. However, I just miss how easy it is to post to my Posterous blog! Posterous has a sweet API now, so in the near future, I&amp;#39;ll be writing some code to automatically take entries from this Posterous blog and import them onto my other one.&lt;p /&gt; I don&amp;#39;t have the time to do this right now, and since I&amp;#39;m leaving for China in less than 2 weeks I&amp;#39;ve decided I&amp;#39;ll end up using this Posterous blog during my travels. Nothing beats being able to write a blog post straight from email or even Twitter! &lt;p /&gt; It&amp;#39;s been a full year since my last international trip, so I&amp;#39;m really pumped to be going on such a long, relaxing 5 week excursion with Rachael. My blog post frequency probably won&amp;#39;t be too high since we&amp;#39;re not bringing a computer, but I&amp;#39;ll have a phone there and maybe I can hook it up to my Twitter account. I&amp;#39;m determined to log a really good amount of this trip because I&amp;#39;ve really enjoyed going back and reading about past adventures through my old blog posts. My memory isn&amp;#39;t the best, and I&amp;#39;ve never kept a journal, so blogging is definitely the right solution for me!
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Tue, 07 Jun 2011 13:31:35 -0500</pubDate><guid>tag:markliu.me,2011-06-07:/2011/jun/07/to-do-combine-my-blogs/</guid><category>Non-Technical</category></item><item><title>Connecting to a Mac from an iPhone over 3G
</title><link>http://markliu.me/2011/may/23/connecting-to-a-mac-from-an-iphone-over-3g/</link><description>&lt;p&gt;A couple hours ago I realized I may need to connect to my &lt;a href="../../../../2011/jan/14/my-recent-hackintoshwindowslinux-install/"&gt;Hackintosh&lt;/a&gt; this weekend while I'm out of town. Turns out, there are some really cool tools to do this securely for only $2! It took me a bit more than an hour to set up, so I thought I'd write an entry for future reference.&lt;/p&gt;
&lt;p&gt;In this tutorial, I'll be setting up both VNC and SSH on OSX 10.6 and connecting to it over 3G using an iPhone 3GS.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The first thing you need to do, is set up a VNC server. There are a number of free VNC servers for OSX that you can download, and I chose to go with &lt;a href="http://sourceforge.net/projects/osxvnc/"&gt;Vine Server&lt;/a&gt;. You can use the default configurations and simply start the server.&lt;/p&gt;
&lt;p&gt;Next, you'll need to open up a port on your router so that incoming requests won't be rejected. The standard port for SSH is 22. I followed &lt;a href="http://kb.realvnc.com/questions/1/How+do+I+use+VNC+to+connect+to+another+computer+over+the+internet%3F"&gt;this tutorial&lt;/a&gt; for opening up my port. Basically, all I had to do was:&lt;/p&gt;
&lt;p&gt;&lt;ol&gt;
&lt;li&gt;Open up my router's control panel by typing http://192.168.1.1/ into my address bar. If you don't know your router's default password like me, you can &lt;a href="http://portforward.com/default_username_password/redirect.cgi"&gt;look it up here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Find the section in the settings where you can add port forwarding, and for the port put 22 and for the IP address, use the internal IP address of your machine that the VNC server displays. This will be something like 192.168.1.101. If you can't find the settings for port forwarding,&lt;a href="http://portforward.com/english/routers/port_forwarding/routerindex.htm"&gt; this port forwarding tutorial site&lt;/a&gt; has good instructions for a number of routers.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;Now that the router is forwarding external requests to your Mac, you need to allow SSH access to your Mac. To do this, you can go into System Preferences and enable "Remote Login".&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Your Mac is now set up for accepting SSH connections on port 22, and someone who has tunnelled in can then connect to the VNC server on port 5900. Here is how to actually do this:&lt;/div&gt;
&lt;div&gt;&lt;ol&gt;
&lt;li&gt;Download an iPhone VNC client app such as &lt;a href="http://rafsoftware.com/rafsoftware/home/"&gt;Remoter VNC&lt;/a&gt;. This one costs $1 for basic VNC connections and has an additional $1 addon for SSH connections.&lt;/li&gt;
&lt;li&gt;For the SSH hostname, enter the IP address of your home computer. If you don't know this, just go to&amp;nbsp;&lt;a href="http://www.whatsmyip.org/"&gt;http://www.whatsmyip.org/&lt;/a&gt; and it will tell you.&lt;/li&gt;
&lt;li&gt;For the SSH username and password, use the username and password for your Mac.&lt;/li&gt;
&lt;li&gt;For the VNC hostname, enter the internal IP address of your home computer. This is the one that looks something like&amp;nbsp;192.168.1.101.&lt;/li&gt;
&lt;li&gt;For the VNC port, enter 5900.&lt;/li&gt;
&lt;li&gt;If you set up a VNC password, be sure to enter that as well.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;After all that, you should be able to have full access to your home computer through a secure connection no matter where you are! It's a big relief for me knowing I can access my stuff while I'm away this weekend.&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Mon, 23 May 2011 18:22:19 -0500</pubDate><guid>tag:markliu.me,2011-05-23:/2011/may/23/connecting-to-a-mac-from-an-iphone-over-3g/</guid><category>Technical</category></item><item><title>Webfaction Rocks!
</title><link>http://markliu.me/2011/apr/21/webfaction-rocks/</link><description>&lt;p&gt;About a year ago I began using &lt;a href="http://webfaction.com"&gt;Webfaction&lt;/a&gt;&amp;nbsp;shared hosting for this blog and a handful of webapps I'm running (2 Django apps, 1 Rails app, and a wiki). I have been blown away by the service they offer for the amazingly low price. I'll give you an example of what I'm talking about.&lt;/p&gt;
&lt;h2&gt;How they deal with bad neighbors&lt;/h2&gt;
&lt;p&gt;The first thing they do that's great is they don't overload their servers so you are not likely to see a performance drop because other people's misuse of the server.&lt;/p&gt;
&lt;p&gt;Second, they automatically send warnings to users if they go over what they pay for, and if the user does not fix the problem, they automatically terminate some of that user's processes to ensure the server stays healthy. How do I know they do this? I was recently a bad neighbor myself (on accident of course :P).&lt;/p&gt;
&lt;p&gt;My webapp, &lt;a href="http://leaguevine.com"&gt;Leaguevine&lt;/a&gt;, relies on fetching data from Twitter at regular intervals to keep a local copy of relevant Twitter information up to date. This had been working fine for many months. However, when Twitter went down for a bit, the app began building up an excessive amount of processes trying to fetch this Twitter information, and I neglected to build a way to systematically kill off these processes if Twitter was down for a while. I ended up going noticeably over my alotted memory usage.&lt;/p&gt;
&lt;p&gt;Here's my experience with webfaction when this happened:&lt;/p&gt;
&lt;p&gt;&lt;ol&gt;
&lt;li&gt;Webfaction contacts me with an automated and friendly worded email saying I went over the memory limit. This email is extremely helpful, and shows a list of processes and how much memory they are using. Further, it tells me how to reproduce the data that they showed me and gave me helpful links for how to reduce my memory usage.&lt;/li&gt;
&lt;li&gt;Webfaction sends me a second email a few hours later with the same basic information. I was away from my computer, so I didn't see the first one right away. This email, like the last, asks me to email them back to tell them if I was able to remedy the problem.&lt;/li&gt;
&lt;li&gt;I fix the problem by adding a single line in my crontab file.&lt;/li&gt;
&lt;li&gt;I send them a response to their email saying how I fix it, but wasn't overly specific since I honestly didn't expect them to read it.&lt;/li&gt;
&lt;li&gt;Webfaction emails me back, saying they appreciate that I fixed it, but they were concerned that my fix will hurt the performance of my webapp. This really showed that they cared about my site! Before this email, I had never experienced a hosting provider that cared about what I was actually hosting beyond simply ensuring that I didn't surpass the limits.&lt;/li&gt;
&lt;li&gt;I emailed them back, explaining the fix in more detail and why it wouldn't hurt my site's performance.&lt;/li&gt;
&lt;li&gt;Webfaction emails me back cheerfully, saying they think what I did was good.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;I'm sure that most hosting providers provide these automated messages and the first four steps of that experience would be identical even with a lesser hosting provider. However, that 5th step shows how far they go above and beyond the typical hosting service. Because of that, I'm sure I'll be recommending Webfaction to anyone who will listen for a long time to come.&lt;/div&gt;
&lt;h2&gt;Other things I love about them&lt;/h2&gt;
&lt;p&gt;Their &lt;a href="http://docs.webfaction.com/"&gt;documentation&lt;/a&gt; is absolutely amazing. They cover detailed step by step instructions for every reasonably popular web app, and a lot of less popular ones as well.&lt;/p&gt;
&lt;p&gt;For less popular web apps, they have tons of custom install scripts with step by step instructions, so you custom installation is a breeze.&lt;/p&gt;
&lt;p&gt;Finally, they have a &lt;a href="http://community.webfaction.com/"&gt;great community&lt;/a&gt; that will help you with basically any problem you're having. I've asked three questions, and two of the three times I've asked those questions I've gotten answers that solved my problem within an hour.&lt;/p&gt;
&lt;/p&gt;
&lt;h2&gt;Just use them! You won't regret it&lt;/h2&gt;
&lt;p&gt;I feel so strongly that you should use webfaction for shared hosting that I'm not even going to include a referral link here. I don't want you think that this entry was just a plug so that I could make a few bucks. I am honestly impressed with their service, and it has been far better than any other web hosting services I've tried in the past. If you browse the web for other reviews, I think they'll all say the same thing :)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 21 Apr 2011 10:14:08 -0500</pubDate><guid>tag:markliu.me,2011-04-21:/2011/apr/21/webfaction-rocks/</guid><category>Technical</category><category>Web Development</category></item><item><title>My Recent Hackintosh/Windows/Linux Install
</title><link>http://markliu.me/2011/jan/14/my-recent-hackintoshwindowslinux-install/</link><description>&lt;p&gt;I recently built my first Hackintosh and I am extremely pleased with it so I thought I would write about my experience. I needed a new computer and really like OSX, but I was not willing to pay the price for a new Macbook or iMac. Since a desktop is perfectly fine for my purposes and I already had the monitors for it, I figure I'd save some money and build an awesome machine running OSX. Thus, I bought everything on Newegg on black friday.&lt;/p&gt;
&lt;p&gt;Here are the specs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel Core i5-750 Lynnfield 2.66GHz LGA 1156 95W Quad-Core Processor&lt;/li&gt;
&lt;li&gt;OCZ Vertex 2 3.5" 90GB SATA II MLC Internal Solid State Drive (SSD)&lt;/li&gt;
&lt;li&gt;Antec Sonata III 500 Black 0.8mm cold rolled steel ATX Mid Tower Computer Case 500W Power Supply&lt;/li&gt;
&lt;li&gt;ASUS DRW-24B1ST/BLK/B/AS Black SATA 24X DVD Burner&lt;/li&gt;
&lt;li&gt;EVGA GeForce 9500 GT 1GB 128-bit DDR2 PCI Express 2.0 x16 HDCP Ready SLI Support Video Card&lt;/li&gt;
&lt;li&gt;SAMSUNG Spinpoint 2TB 5400 RPM SATA 3.0Gb/s 3.5" Internal Hard Drive -Bare Drive&lt;/li&gt;
&lt;li&gt;G.SKILL Ripjaws Series 8GB (2 x 4GB) 240-Pin DDR3 SDRAM DDR3 1333 (PC3 10666) Desktop Memory&amp;nbsp;&lt;/li&gt;
&lt;li&gt;GIGABYTE GA-P55-USB3 LGA 1156 Intel P55 USB 3.0 ATX Intel Motherboard&lt;/li&gt;
&lt;li&gt;Snow Leopard Install CD (the cheap $29 upgrade one that Apple sells)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of those, I learned the most important things you need to check for compatibility with are the motherboard, the processor, and the video card. In short, what I found after research was that Gigabyte boards seem the most well supported, basically everyone uses the i5-750 or i7-860 processor, and there are a ton of video cards that work if you're willing to put in the time to fiddle with it.&lt;/p&gt;
&lt;p&gt;To get going, I primarily used these four articles which I highly recommend reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lifehacker.com/5698205/how-to-triple-boot-your-hackintosh-with-windows-and-linux" target="_blank"&gt;http://lifehacker.com/5698205/how-to-triple-boot-your-hackintosh-with-windows-and-linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lifehacker.com/5672051/how-to-build-a-hackintosh-mac-and-install-os-x-in-eight-easy-steps" target="_blank"&gt;http://lifehacker.com/5672051/how-to-build-a-hackintosh-mac-and-install-os-x-in-eight-easy-steps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.semiaccurate.com/2010/02/19/how-p55-snow-leopard-hackintosh/" target="_blank"&gt;http://www.semiaccurate.com/2010/02/19/how-p55-snow-leopard-hackintosh/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tonymacx86.blogspot.com/2010/04/iboot-multibeast-install-mac-os-x-on.html" target="_blank"&gt;http://tonymacx86.blogspot.com/2010/04/iboot-multibeast-install-mac-os-x-on.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll now go through my experience. It was a bit more complicated because for some reason I wanted a triple boot OSX, Windows 7, and Ubuntu installation.&lt;/p&gt;
&lt;p&gt;First, I installed OSX (partitioning my hard drive into 3 partitions along the way), and updated the OS to 10.6.5 using the tonymac link above. I had no problems with this! Next, I jumped over to the first lifehacker tutorial and installed Windows 7, and had no problems there either. Finally, I installed Ubuntu 10.10 which I downloaded for free via bit torrent and didn't have any problems with that either. To get these working, I needed to play with some internals and get the chameleon boot loader working, as described on lifehacker. However, once I got the chameleon boot loader to work, OSX no longer worked for some reason... I never could figure out why.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;At this point the chameleon boot loader, the Windows 7 partition, and the Ubuntu partition all worked perfectly, but I had a dead OSX partition. I decided to wipe OSX clean and start with a fresh install. I booted using iBoot, and then put the OSX 10.6.3 install disk I bought from the store in. I updated the OS using the 10.6.5 combo update (1gb free download from apple). It is important to not restart the computer after completing this update!&lt;/p&gt;
&lt;p&gt;After doing this, my OSX partition worked, but there was no audio and the video resolution was terrible because it wasn't utilizing my video card at all. As a side note, even though OSX didn't "recognize" my video card, the display still worked even though I connected it to my video card. To get the video card and audio working, I installed Multibeast from tonymac with the following things selected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UserDSDT (placed the DSDT-GA-P55-USB3-2.0-F8.aml file on the desktop)&lt;/li&gt;
&lt;li&gt;System Utilities (all)&lt;/li&gt;
&lt;li&gt;Under advanced options:   
&lt;ul&gt;
&lt;li&gt;NO AUDIO&lt;/li&gt;
&lt;li&gt;NO DISK&lt;/li&gt;
&lt;li&gt;NVEnabler&lt;/li&gt;
&lt;li&gt;Realtek R1000SL&lt;/li&gt;
&lt;li&gt;FakeSMC&lt;/li&gt;
&lt;li&gt;64-bit-Apple Boot Screen&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After this completed, I restarted the computer. Next, I installed the realtek driver named RealtekRTL81xx-0_0_67.pkg located at http://lnx2mac.blogspot.com/p/realtekrtl81xx-osx-driver.html.&lt;/p&gt;
&lt;p&gt;I then restarted the computer again. Next I installed VoodooHDA.kext (version 0.2.56) by downloading it from http://nawcom.com/osx86/files/10.6/Audio/VoodooHDA/0.2.56/kexts/ and dragging onto something called kext Utility which I downloaded at some point.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Finally, after restarting my computer one final time, everything worked perfectly! And now I have a relatively inexpensive iMac thanks to about a day of work and Newegg's insane deals during black friday. Its XBench score is 273 in case you were curious.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Looking back on it, I don't think I needed to partition my hard drive 3 ways. It has been working for over a month now and I never touch Windows or Linux anymore. My OSX partition absolutely never crashes which is fantastic. For reference though, if something were to happen with the OSX partition, these partitions could access each others' file systems by using &lt;a href="http://www.lifehacker.com.au/2010/12/a-comprehensive-guide-to-sharing-your-data-across-multi-booting-windows-mac-and-linux-pcs/" target="_blank"&gt;this guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I hope this helps someone out there!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Fri, 14 Jan 2011 11:08:23 -0600</pubDate><guid>tag:markliu.me,2011-01-14:/2011/jan/14/my-recent-hackintoshwindowslinux-install/</guid><category>General</category><category>Technical</category></item><item><title>Where are all the Naysayers?
</title><link>http://markliu.me/2010/nov/09/where-are-all-the-naysayers/</link><description>&lt;p&gt;I must be surrounded by the best group of people alive, because I can't seem to find any negative feedback on Leaguevine from anyone. I'm not so much talking about whether or not my users are happy (which they certainly appear to be), but I'm talking about friends, family, colleagues, professors, and strangers I have talked about my ideas with.&lt;/p&gt;
&lt;p&gt;I can't tell you how many times over the past 2 months of business classes that I've been told "Don't let the naysayers slow your progress. People are going to tell you your idea sucks, but you can't let this get you down." Just tonight I was at an entrepreneurship dinner and the entrepreneur I was talking gave this same advice, saying how a lot of professors and colleagues on campus told him his idea was bad, but he had to fight through this and just kept on going.&lt;/p&gt;
&lt;p&gt;Why is no one telling me my idea stinks?&lt;/p&gt;
&lt;p&gt;Am I just lucky and happen to be running into only people who are super encouraging towards entrepreneurs? If this is the case, is this lucky? Could it be better to have some people shoot you down so you can learn what the opposition is thinking? Is there any way my idea really that good that everyone seems to like it?&lt;/p&gt;
&lt;p&gt;Or is it just that no one knows anything about Twitter or Ultimate Frisbee and they don't want to reject an idea in a realm they don't know anything about? Maybe that's it.&lt;/p&gt;
&lt;p&gt;Regardless of why, all I know is that I've had it extremely easy. These endless streams of encouragement only push me harder to produce my highest quality stuff.&lt;/p&gt;
&lt;p&gt;If anyone out there who pushed me forward is reading this, I'd just like to say thanks!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Tue, 09 Nov 2010 20:03:25 -0600</pubDate><guid>tag:markliu.me,2010-11-09:/2010/nov/09/where-are-all-the-naysayers/</guid><category>General</category><category>Non-Technical</category><category>Ultimate</category></item><item><title>Just Launched Leaguevine!
</title><link>http://markliu.me/2010/oct/21/just-launched-leaguevine/</link><description>&lt;p&gt;I've been working really hard over the past few months on getting &lt;a href="http://leaguevine.com" target="_blank"&gt;my ultimate site&lt;/a&gt; online. Over the past 2 weeks I've been fine tuning things and getting feedback from about 20-30 people. The site was actually live, but I just didn't tell anyone about it :)&lt;/p&gt;
&lt;p&gt;Over the last few days, I slowly introduced it to a few more by posting on the Madison Ultimate Frisbee Association forum, and something like 100 people went and looked at it and several who I knew gave me some more feedback. It gave me enough confidence that the site was ready to start really telling people about it!&lt;/p&gt;
&lt;p&gt;A few minutes ago I posted a link to it on RSD, the main Ultimate Frisbee forum in the U.S. and I'm having a blast sitting here watching where people are going through my site! I have a web analytics program called clicky analytics installed so I can see what pages are viewed most, how many people are online, and where they currently are in my site. Exciting!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 21 Oct 2010 11:53:25 -0500</pubDate><guid>tag:markliu.me,2010-10-21:/2010/oct/21/just-launched-leaguevine/</guid><category>General</category><category>Non-Technical</category><category>Ultimate</category><category>Web Development</category></item><item><title>Pictures and Recap of the Kenya Trip
</title><link>http://markliu.me/2010/oct/03/pictures-and-recap-of-the-kenya-trip/</link><description>&lt;p&gt;Just now I finally wrote up a recap of our recent trip to Kenya. &lt;a href="http://ewb-orongo.posterous.com/pictures-and-recap-of-our-august-2010-trip-to" target="_blank"&gt;Here is the blog post&lt;/a&gt;. I didn't even finish it because I'm so long winded and it was getting too long. I decided to just end it because I was running out of steam. Here are some publicly viewable facebook pictures of the trip!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.facebook.com/album.php?aid=2745079&amp;amp;id=2528030&amp;amp;l=4cf71633e7" target="_blank"&gt;First album of facebook pictures&lt;/a&gt;&lt;br /&gt; &lt;a href="http://www.facebook.com/album.php?aid=2745095&amp;amp;id=2528030&amp;amp;l=e67f9b4e43" target="_blank"&gt;Second album of facebook pictures&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sun, 03 Oct 2010 19:41:18 -0500</pubDate><guid>tag:markliu.me,2010-10-03:/2010/oct/03/pictures-and-recap-of-the-kenya-trip/</guid><category>Engineers Without Borders</category><category>Non-Technical</category></item><item><title>What is Your Proudest Achievement?
</title><link>http://markliu.me/2010/sep/09/what-is-your-proudest-achievement/</link><description>&lt;p&gt;This is the first week of another semester of classes, and I was recently filling out a standard student&amp;nbsp;questionnaire. I was flying through it without thinking, since the questions were the basic "why are you interested in this course" and "what are your hobbies outside of school" types of questions. However, one question came out of nowhere, and made me pause for a moment. It read:&lt;/p&gt;
&lt;p&gt;"What is your proudest achievement?"&lt;/p&gt;
&lt;p&gt;Within about 10 seconds I had written down "the Engineers Without Borders project that my friend Nate and I headed up". But the question stuck with me after I clicked submit.&lt;/p&gt;
&lt;p&gt;While I was walking over to a grant hearing for our EWB project (which we were successfully rewarded, btw!), this question resurfaced and I really thought hard to narrow this down a bit more. Why did I choose EWB over my academics? What about not-so-tangible things like relationships?&lt;/p&gt;
&lt;p&gt;When I began comparing this Engineers Without Borders project to my academics, there really was no comparison. My masters program in CS here at UW-Madison was outrageously easy and my undergrad experience at UCLA was actually much easier than my time at Naperville North High School. And since I didn't even finish in the top 10 at Naperville North (after trying really hard, I might add), I couldn't really call that a big success. So in terms of how challenging these things were, Engineers Without Borders was much tougher.&lt;/p&gt;
&lt;p&gt;Then I decided to rule out accomplishments like relationships because comparing those to tangible things is like comparing apples and oranges. So I am glad I put down "EWB project" on that survey and continued thinking about what made me proud about it.&lt;/p&gt;
&lt;p&gt;I realized that the moment I am proudest of in the entire time I have been working on this project came very recently. On Monday, August 23rd, 2010 to be precise. This day was the culmination of all the work Nate, myself, and several others poured into the project over the past 2 years. I am sad that Nate was not there on this trip with me to experience this, because I know that none of the other travelers were able to appreciate the magnitude of this event.&lt;/p&gt;
&lt;p&gt;On that Monday in Kenya, we held a long meeting that consisted of the farmers of Orongo, the chief, the assistant chief, the ministry of irrigation, the ministry of agriculture, and our hosts the Springs of Life. The meeting was called to announce and discuss the selected committee that was to oversee our new irrigation project in the village. Before this meeting happened, a combination of the officials in the community had chosen to select a committee instead of elect it and thus we all knew there would be a bit of resentment from the community in regards to who was chosen. The number one goal of this meeting was to discuss this new committee structure with the farmers and make sure that everyone was okay with it.&lt;/p&gt;
&lt;p&gt;The meeting was scheduled to start at 2pm, so naturally at 2:30pm there were about 10 farmers in attendance. We started around 3:30 once the chief arrived, and we ended up with over 100 in attendance. Our group had had a long day so we were pretty exhausted, and I could see it was a bit of a chore for all of our members to stay awake during some really long speeches. It was also very hot out and the meeting was conducted entirely in Luo so it was very hard for us to stay focused. What killed me though is that the meeting ran very late and several of our members had made prior engagements so almost all of our team left this meeting even before it finished.&lt;/p&gt;
&lt;p&gt;Because of these annoyances, not to mention the uncomfortable chairs or ticks falling from the trees onto us, I did not get the impression that any of our other travelers enjoyed the meeting. In fact, the &lt;a href="http://ewb-orongo.posterous.com/filters-goat-and-goodbyes"&gt;blog post that Caroline wrote&lt;/a&gt; did not even mention it! However, it was the highlight of my trip for so many reasons.&lt;/p&gt;
&lt;h2&gt;So... then what was so great about it?&lt;/h2&gt;
&lt;p&gt;The first reason was that the meeting truly gave the farmers of Orongo a forum to speak their mind and discuss the decisions made by the chiefs, ministries, and Springs of Life. Although the meeting was in Luo, I could still very obviously see lots of upset farmers at the beginning of the meeting sharing their opinions but then a lot of productive discussion following their comments. By the end of the meeting, everyone was happy and on the same page. The chief was smiling as she talked to the farmers, and the farmers were smiling and laughing when they added their final thoughts.&lt;/p&gt;
&lt;p&gt;The second reason I enjoyed this meeting was because I did not have to say a single word. This is not because I dislike public speaking - in fact, I am kind of fond of it now. Not having to say anything meant that this project is finally standing on its own two feet. As much progress as we made in our previous January 2010 trip, the progress still revolved around Nate being a great leader and motivational talker. Neither Nate or myself contributed at this meeting. Drew said a few words about us, but the meeting was led almost entirely by Chief Kosume.&lt;/p&gt;
&lt;p&gt;Since the very start of this project, Nate and I have been huge advocates of the phrase "this should be their project, not ours". I'm sure our mentor Dick Otis had a big hand in teaching us the fundamentals for sustainable development, so I think a lot of the credit should go to him. Despite knowing these fundamentals from the onset, we have faced incredible difficulties getting the community to take ownership of the project. Orongo is right outside of Kisumu which is filled to the brim with NGOs so they are not new to development work. The problems stem from the residents being very used to NGOs coming in, quickly doing a project (such as drilling a borehole or building latrines) and then leaving without any follow up. These projects that don't have any community involvement tend to be the ones that fail in the long run because no one in the community feels a sense of ownership in the project and thus no one is willing to maintain it and see that its benefits extend for many years. But the residents of Orongo like these types of projects. The residents are used to them, expect them, and prefer the small wages they get for constructing these projects over the benefits that a well thought out successful project might bring. Because of our difference in philosophies, getting everyone to buy into ours has taken 2 years, but it appears we have finally done it.&lt;/p&gt;
&lt;p&gt;When we met separately with the Springs of Life, the chiefs, and the ministries, we all decided it was best for these groups to work together to select the people who would be in charge of the irrigation project. This meant that Engineers Without Borders would not be in charge of deciding whether the committee should be created by selection or by election. These groups chose to select the committee and went about doing so entirely on their own, showing a significant amount of ownership in this project. They were merely guided by Engineers Without Borders to make sure they included equal representation between the different clans as well as equal gender representation. I am very proud that our group of students have developed enough credibility within the community so that these local leaders listened to what we had to say and eventually agreed with us.&lt;/p&gt;
&lt;p&gt;Lastly, the fact that this meeting happened at all was a huge accomplishment. Creating a committee for our project has been on our long term road map for a while, and it has been a challenge getting there. On a couple of occasions we were forced to weigh our options and figure out whether or not a project in Orongo was even possible for us, given the difficulties in politics and community mobilization we've been facing. In the end I am very proud of how we were able to grind it out during the hard times and remind ourselves that our goal is to make the biggest positive impact we can in this village. This meeting solidified our long term involvement in this Orongo irrigation project.&lt;/p&gt;
&lt;p&gt;I heard a tree metaphor while I was in Kenya and feel like it applies nicely to this event. If the start of our project, i.e. our first trip to Kenya, can be described as planting a seed, then this meeting was taking that seedling that has been growing and planting it in our yard where it will stay permanently. The project's roots are now taking hold.&lt;/p&gt;
&lt;p&gt;I am really proud of everyone who has been involved with this project to get it to this point.&amp;nbsp;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 09 Sep 2010 14:23:37 -0500</pubDate><guid>tag:markliu.me,2010-09-09:/2010/sep/09/what-is-your-proudest-achievement/</guid><category>Engineers Without Borders</category><category>Non-Technical</category></item><item><title>My 4th and possibly last trip to Kenya with Engineers Without Borders
</title><link>http://markliu.me/2010/aug/02/my-4th-and-possibly-last-trip-to-kenya-with-engin/</link><description>&lt;p&gt;In just a couple days I'll be heading out to Kenya again with EWB. I'm currently in a rush to take care of lots of little things before I go, but I'd like to step back and put my current thoughts down on paper so I have some documentation of this exciting time before I forget it the details.&lt;/p&gt;
&lt;h2&gt;Why this trip will be our best one yet&lt;/h2&gt;
&lt;p&gt;It took our group about 2 years to adapt to the Kenyan culture and their ways of doing things, but we are finally headed in the right direction. Our very first trip back in 2008 was purely an assessment trip where we did nothing but talk to people, so I can't say we did anything wrong there. But each of our next two trips, we went in with the mindset that we are going to get so much done and maximize every second of our time to help as many people as possible. While that sounds nice to our American ears, this was the totally wrong approach to take. We were moving too fast for our Kenyan friends, we weren't taking the time to build solid relationships with each individual in the community, and we were working so hard that the villagers began seeing the project as our project instead of theirs. In a nutshell, the villagers of Orongo began to let us do our own thing while passively watching the project unfold.&lt;/p&gt;
&lt;p&gt;Last trip, however, we began to figure things out. Instead of continuing our fast pace and trying so hard to push people to get a project off the ground, we made a concious effort to take a step back and slow down. We spread out and talked to as many people as we could, we sat and had tea with both officials and residents, and we did not rush the process despite our short three week trip. I remember one of our main friends Steve Obongo saying at the end of our trip, "Now you understand us. Now I truly believe this project will succeed."&lt;/p&gt;
&lt;p&gt;Indeed, by slowing down and focusing on building relationships instead of on building our project, we somehow got more done. Our main contacts are finally beginning to see this as their own project and are contributing time and effort to it.&lt;/p&gt;
&lt;p&gt;Our trips are only 3-4 weeks long, leaving 10 months of the year when we do not have students in Kenya. The most important thing we can do is to keep our contacts contributing enthusiastically to the development of our projects while we are gone. During these past 6 months, we have received several email correspondences from our contacts giving us status updates, something we struggled mightily with before.&lt;/p&gt;
&lt;p&gt;Now that we seem to have figured things out, I truly expect things to continue running this smoothly if not moreso.&lt;/p&gt;
&lt;h2&gt;Why it took 2 years to get to this point&lt;/h2&gt;
&lt;p&gt;It is hard to explain how difficult it was to buy into the slow pace  of things. People literally show up to important meetings 2 or 3 hours  late, or sometimes not at all. But the most shocking part is that if you  are the person being stood up, you are expected to not get the least  bit upset about it. The villagers joke that there are three meeting  times in the day: "morning", "mid-day", and "night". If we schedule a  meeting with someone for 3pm sharp, it is perfectly acceptable to arrive  any time between 3 and 6.&lt;/p&gt;
&lt;p&gt;I'll give an example of how much we  bought into the mindset of this during this last trip. We bumped into  Alex the assistant chief and scheduled a meeting at 5pm with him the  next day at his home. That next day, Nate and myself were helping  prepare dinner and looked at a clock and realized it was about 5:45 so  we then starting on the 25 minute walk over to Alex's home. Not  surprisingly, he wasn't there. We called him on his cell phone and he  said he was running late but he was on his way right now and should be  there in 20 minutes so we should wait for him. However, Nate and I were  getting hungry and there was not much light left, so we asked him if he  really would be there in 20 minutes. He hesitated, then admitted it  would take him much longer to arrive and that he would just stop by the  home in Orongo where we were staying. So we took the 25 minute walk back  to our home, ate dinner, and never heard from Alex that night.&lt;/p&gt;
&lt;p&gt;The  surpring part of this story is not that it happened (stuff like this  happens every day in Kenya), but that Nate and I were honestly not bothered by it  at all.&lt;/p&gt;
&lt;h2&gt;My goal for this trip&lt;/h2&gt;
&lt;p&gt;My goal for this tirp has very little to do with technical achievements or visible milestones. My goal is simply to pass on the knowledge that Nate and I gained during our first two years working on this project.&lt;/p&gt;
&lt;p&gt;Nate and I were the first two project managers after taken our first trip to Orongo, and very early on we learned that the people benefitting most from our project were the students. Our organization is not focused on relief where we immediately step in and save lives, and our organization is not big enough or well funded where we can quickly drop down one or more colossal projects that we can then leave and move onto the next village. Instead, we are focused on closely partnering with a single community for many years, learning as much as we can from each other, and incrementally improving the quality of life in the partnering village.&lt;/p&gt;
&lt;p&gt;I strongly feel that this partnership benefits the students at least as much as the village.&lt;/p&gt;
&lt;p&gt;These last two years have certainly changed both mine and Nate's lives in a positive way so I hope to use these next four weeks to inspire the same type of self-introspection. I feel that having new young members who truly care about this kind of work is the key to keeping this project thriving well after both Nate and I are gone (well, Nate is not a student anymore but he's still contributing a lot so maybe he'll be around for a while!).&lt;/p&gt;
&lt;h2&gt;It may be my last (for a little while)&lt;/h2&gt;
&lt;p&gt;I am really lucky to be able to go to Kenya 4 times with this project. However, after this trip, I feel like the project will be able to stand on its own two legs without either me or Nate doing anything. Thus, even though I'll be part of EWB for another year, it might be best if newer students are the ones traveling and learning and growing. Right now I feel like I've gotten more than my fair share of great opportunities and since I hopefully won't be needed in the future, I would like to share the wealth.&lt;/p&gt;
&lt;p&gt;There is still a very good chance I'll be going back on my own separately from Engineers Without Borders. One possibility for next summer is for Rachael and I to go to Africa to volunteer for a while before she takes off for medical school. Knowing this, I'm really not too bummed that this may be my last official EWB trip to Kenya.&lt;/p&gt;
&lt;p&gt;As a side note, if you want to read updates from this next trip, please check out our &lt;a href="http://ewb-orongo.posterous.com/" target="_blank"&gt;travel blog&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Mon, 02 Aug 2010 11:02:24 -0500</pubDate><guid>tag:markliu.me,2010-08-02:/2010/aug/02/my-4th-and-possibly-last-trip-to-kenya-with-engin/</guid><category>Engineers Without Borders</category><category>Non-Technical</category></item><item><title>So long for my Stall 9 name
</title><link>http://markliu.me/2010/jul/22/so-long-for-my-stall-9-name/</link><description>&lt;p&gt;Looks like sometime in the last few weeks, a new company sprang up and called themselves Stall 9 Ultimate. This was definitely a shocker to me. And because I'm not really the creative type, the prospect of having to come up with another suitable name ruined my night. I've done a lot of reading into what goes into a good name, and after spending several hours studying this practice and brainstorming words, I think I've come up with a new one. I'll let it sit in my head for a while first though, and decide if it really is what I want before sharing it with the world.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 22 Jul 2010 17:58:35 -0500</pubDate><guid>tag:markliu.me,2010-07-22:/2010/jul/22/so-long-for-my-stall-9-name/</guid><category>Non-Technical</category><category>Ultimate</category></item><item><title>Reflections on Creating Stall9
</title><link>http://markliu.me/2010/jul/21/reflections-on-creating-stall9/</link><description>&lt;p&gt;Okay, so Stall9 is not actually finished yet, but I thought I would still reflect on the journey so far. In case you haven't heard, I am building a website called Stall9 that will allow users to collaboratively update the ultimate frisbee community on what is currently going on. The premise of the site is that any person, regardless if he/she is a player, fan, or administrator, can update the information on stall9 to provide online followers with the most real time information possible. The goal is to make updating the site as easy and simple as possible, supporting already widely used technologies like twitter.&lt;/p&gt;
&lt;p&gt;I got the idea for this site last summer in India while on a bus daydreaming about ultimate and looking forward to playing with a Madison club team called "Test Tickle Me Elmo" in a couple months. Soon after I had this idea, I went on a 21 day backpacking trip in California (the &lt;a href="http://en.wikipedia.org/wiki/John_Muir_Trail" target="_blank"&gt;John Muir Trail&lt;/a&gt; if you were curious) and had just a ridiculous amount of quiet thinking time to flesh this idea out. I came back to Madison, WI to start my Master's program in September 2009 and hoped to finish this site before College Nationals came to Madison in May, 2010. However, I realized I knew nothing about programming real websites.&lt;/p&gt;
&lt;p&gt;I had dabbled with web programming for several years, but had always used pre-built content management systems and just hacked certain extra features in. For Stall 9, I knew I would need a much more robust user permissions system, and a very dynamic way for users to enter, modify, and moderate all sorts of information. To do this, I decided to learn Python web development and a web development framework called Django. I don't want this post to turn out technical, so I won't talk about any of those specifics.&lt;/p&gt;
&lt;p&gt;So that fall, I played around with creating a simple version of Stall 9, but was unable to get very far. I didn't put in nearly as much time as I wish I had, and instead ended up spending a lot of time getting acclimated with my new Master's program. Then I took 5 weeks off for winter break which included visiting family and a &lt;a href="http://ewb-orongo.posterous.com/" target="_blank"&gt;3 week trip to Kenya&lt;/a&gt; with &lt;a href="http://www.ewbuw.org"&gt;Engineers Without Borders&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By the time I got back, it was February and I still had made no progress on this site. However, by this time I had gotten comfortable with my Master's research to the point where I had enough free time to really put some good work into Stall 9. So I plugged away at it and put in a reasonable 200 hours over the next 2.5 months.&lt;/p&gt;
&lt;p&gt;Then I hit a wall.&lt;/p&gt;
&lt;p&gt;The code base for my site was enormous and if it wasn't already unmanageable, it was quickly become so. I took a step back and thought that there must be a better way to do this. I bought a couple programming books that were more advanced than my previous ones and learned about how to reduce redundancy and keep even the most complex projects manageable. After my first few hours of reading, I knew I still had a lot to learn.&lt;/p&gt;
&lt;p&gt;I then completely shut down development and spent about a month intensely reading up on best practices and learning from the experts in the community. It was towards the end of May 2010 that I decided I learned enough to get by.&lt;/p&gt;
&lt;p&gt;At this point, college Nationals in Madison was right around the corner and I was extremely disappointed I didn't have a site to show for all my hard work. I was second guessing myself for the first time in the process and wondering if I should continue on with the project. However, I was greeted with a really nice surprise that got me right back on my horse. USA Ultimate unveiled their &lt;a href="http://www.usaultimate.org/default.aspx" target="_blank"&gt;new website&lt;/a&gt; and shockingly it had no more functionality than their previous one. In fact, it seemed that most Americans were really annoyed by the fact that their new site did not really do much to address a fan's needs. What fans need are real time updates and easily navigable information. Since I saw a problem that needed to be fixed, it was easy for me to get back into the swing of things.&lt;/p&gt;
&lt;p&gt;First though, I needed to test my new found programming prowess. I built this site in about a week using the best practices I learned, and then deployed it so I could practice deploying a Django site.&lt;/p&gt;
&lt;p&gt;Finally, about a week into June, I began working from a clean slate on a new version of Stall 9. That old site will never see the light of day, but that's probably best for everyone :). Over the last 5 or 6 weeks, I am back to the point where I was with the first version of stall 9, but this time my code base is much more concie, robust, and manageable. Instead of my development slowing down because of the size of the code base like before, it is actually accelerating at an astonishing rate. At this pace, a somewhat unpolished version of Stall 9 will be ready for launch sometime in September! As a side note, I am lucky enough to be going to Kenya for 3.5 weeks again in August followed by a bachelor's party in New Orleans, so that is why Stall 9 won't be ready sooner!&lt;/p&gt;
&lt;p&gt;If you are interested in learning more about Stall9, please don't hesitate to contact me. I am building this site to fill a void in an ultimate fan's experience, and since I'm certainly not representative of all ultimate fans, I can always use more input from others.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 21 Jul 2010 12:40:10 -0500</pubDate><guid>tag:markliu.me,2010-07-21:/2010/jul/21/reflections-on-creating-stall9/</guid><category>Technical</category><category>Ultimate</category><category>Web Development</category></item><item><title>Code For This Site
</title><link>http://markliu.me/2010/jul/12/code-for-this-site/</link><description>&lt;p&gt;I've decided to make the source code for this site publicly available. You are welcome to download it, use it, modify it or do anything else you want with it. It is available &lt;a href="http://github.com/mliu7/personal-django-blog" target="_blank"&gt;here&lt;/a&gt;. I have also uploaded a rather detailed &lt;a href="http://github.com/mliu7/personal-django-blog/blob/master/README.rst" target="_blank"&gt;README&lt;/a&gt; that should get the site up and running for you if you do decide to play around with it.&lt;/p&gt;
&lt;p&gt;Getting this site up and running took a bit of time and during the process I was always wishing I could just see the full source code for some other django sites. This site uses the re-usable apps philosophy where the site itself is just a settings file and a url conf while all of the actual work is done by a number of reusable apps. While this philosophy makes perfect sense and seems like a great way to build a site, almost all of the django tutorials out there do not preach this view. Instead, they tend to show overly-simplified example sites that have a monolithic design. Thus, I hope my source code provides a useful reference to someone else out there who wants to adopt a reusable apps approach to their django site.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Mon, 12 Jul 2010 09:07:20 -0500</pubDate><guid>tag:markliu.me,2010-07-12:/2010/jul/12/code-for-this-site/</guid><category>Technical</category><category>Web Development</category></item><item><title>MySQL and Python on 32 bit Snow Leopard
</title><link>http://markliu.me/2010/jun/09/mysql-and-python-on-32-bit-snow-leopard/</link><description>&lt;p&gt;I am running Mac OSX 10.6 (Snow Leopard) on my home machine and had previously been chugging along just fine with my Python 2.5 and MySQL 5 setup. However, this morning I decided to try and get MySQL to play nicely with my Python 2.6 installation and I ran into all sorts of problems. I searched online for solutions and found that a ton of other people had problems as well, but none of their solutions worked for me. I did get mine working after a couple of hours of fussing and all of the problems ended up being the result of incompatible architectures.&lt;/p&gt;
&lt;p&gt;I'll outline the steps I would take to get this running again on my machine and why. Here is the target setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MySQL 5.1, 32 bit&lt;/li&gt;
&lt;li&gt;OSX 10.6.2, 32 bit&lt;/li&gt;
&lt;li&gt;Python 2.6, 32 bit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, I'm going to remove my previous MySQL installation. But even before that, we obviously need to back up our database. Here's how we would create a dump of it if we have the mysqladmin installed.&lt;/p&gt;
&lt;pre&gt;$ mysqldump -u username -p -v databasename &amp;gt; databasename.sql&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Next, we need to thoroughly uninstall MySQL:&lt;/p&gt;
&lt;pre&gt;$ sudo rm -rf /usr/local/mysql*&lt;br /&gt;$ sudo rm -rf /var/db/receipts/com.mysql.mysql&lt;br /&gt;$ sudo rm -rf /private/var/db/receipts/com.mysql.mysql*&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Now that we've removed our previous install, we'll go to MySQL's &lt;a href="http://dev.mysql.com/downloads/mysql/" target="_blank"&gt;download page&lt;/a&gt; and download the 32 bit .dmg package. Installing this is as easy as double clicking it after the download finishes.&lt;/p&gt;
&lt;p&gt;Once we have MySQL installed and working fine, we need to install the MySQL-Python bindings. We'll go to the &lt;a href="http://sourceforge.net/projects/mysql-python/" target="_blank"&gt;download page&lt;/a&gt;, and download the most recent version. Once you have this installed, cd into the directory and build it using the correct architecture flags.&lt;/p&gt;
&lt;pre&gt;$ ARCHFLAGS='-arch i386' python setup.py build&lt;br /&gt;$ sudo ARCHFLAGS='-arch i386' python setup.py install&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Finally, we need to ensure that we are using the 32-bit version of python. One way to tell if you are using the 32-bit or 64-bit version is if you enter your python interpreter and type:&lt;/p&gt;
&lt;pre&gt;import sys&lt;br /&gt;sys.maxint&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;If the output is 9223372036854775807 then you are using the 64-bit version of Python. If it is 2147483647 then you are using the 32-bit version.&lt;/p&gt;
&lt;p&gt;The way to force your system to use the 32-bit version is to use the command:&lt;/p&gt;
&lt;pre&gt;$ export VERSIONER_PYTHON_PREFER_32_BIT=yes&lt;/pre&gt;
&lt;p&gt;I added this to my .bashrc and then refreshed my terminal by typing:&lt;/p&gt;
&lt;pre&gt;$ source ~/.bashrc&lt;/pre&gt;
&lt;p&gt;Other alternatives to forcing the 32-bit Python are listed &lt;a href="http://stackoverflow.com/questions/2088569/how-do-i-force-python-to-be-32-bit-on-snow-leopard-and-other-32-bit-64-bit-questi" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Having done all that, you should be up and running! Hopefully this saves someone time, and if not, hopefully it will at least be a useful refresher for me next time I need to do something similar.&lt;/p&gt;
&lt;p&gt;UPDATE: It turns out this was not the end of my problems since I also am using &lt;a href="http://virtualenv.openplans.org/" target="_blank"&gt;virtualenv&lt;/a&gt; to isolate my &lt;a href="http://www.djangoproject.com/" target="_blank"&gt;Django&lt;/a&gt; project installations. With the default way virtualenv is set up, it inherits a python interpreter from somewhere that does not take into account the versioner flags we defined. Unfortunately, the default Snow Leopard installation comes with python in 64-bit mode, even if you are running OSX in 32-bit mode and thus, this is the python interpreter loaded into your virtual environment. After a lot of work and fiddling with things, I found the way to get around this is to do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install Python from a .dmg which you can download on the &lt;a href="http://www.python.org/download/" target="_blank"&gt;Python website&lt;/a&gt;. The .dmg package from the Python site is the 32-bit version so this is perfect for us in this case. Mine installed by default into the directory /Library/Frameworks/Python.framework/Versions/2.6/bin/python&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you create your virtual environment, specify which python interpreter you would like to use. For me, this was:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;$ cd /srv/python-environments/&lt;br /&gt;$ virtualenv --python=/Library/Frameworks/Python.framework/Versions/2.6/bin/python new-environment&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Also, if you&amp;nbsp; need to check on which version of python is being called at any given moment, the following two commands will give you useful output.&lt;/p&gt;

&lt;pre&gt;$ which python&lt;br /&gt;$ python --version&lt;br /&gt;&lt;/pre&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 09 Jun 2010 15:52:29 -0500</pubDate><guid>tag:markliu.me,2010-06-09:/2010/jun/09/mysql-and-python-on-32-bit-snow-leopard/</guid><category>Technical</category><category>Web Development</category></item><item><title>Single settings file for Django deployment on Webfaction
</title><link>http://markliu.me/2010/jun/05/single-settings-file-for-django-deployment-on-web/</link><description>&lt;p&gt;After only a few days of this blog being up, I already became annoyed with having to maintain separate settings files for development and production. Thankfully, fixing this problem was incredibly quick and easy and should save me some headaches in the future. All I did was determine what host the settings file resides on and then set the parts of the settings file that change between development and production. Here is what the relevant part of my Django settings file looks like:&lt;/p&gt;
&lt;script src="http://gist.github.com/426747.js"&gt;&lt;/script&gt;

&lt;p&gt;That's it!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sat, 05 Jun 2010 11:30:17 -0500</pubDate><guid>tag:markliu.me,2010-06-05:/2010/jun/05/single-settings-file-for-django-deployment-on-web/</guid><category>Technical</category><category>Web Development</category></item><item><title>I&amp;#39;m moving blogs again
</title><link>http://markliu.me/2010/may/27/im-moving-blogs-again/</link><description>&lt;p&gt;Hi everyone. Yesterday I finished building my own site which I will use for updates such as the ones I had provided here. I'm excited about this new site because its the first blog I've had where I actually programmed it myself! Feel free to check it out here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://markliu.me"&gt;http://markliu.me&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I hope you like it!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 27 May 2010 14:03:00 -0500</pubDate><guid>tag:markliu.me,2010-05-27:/2010/may/27/im-moving-blogs-again/</guid><category>Non-Technical</category></item><item><title>Kicking Off This Site
</title><link>http://markliu.me/2010/may/26/kicking-off-this-site/</link><description>&lt;p&gt;I'm really excited to be putting this new website up today! I had been using &lt;a href=" http://wiscospike.posterous.com/"&gt;this posterous blog&lt;/a&gt; for travel updates while I was in India and hiking the John Muir Trail last summer. And I was using a different blog for my &lt;a href="http://ewb-orongo.posterous.com/"&gt;recent trip to Kenya&lt;/a&gt;. However, I am infinitely more excited about this one.&lt;/p&gt;
&lt;p&gt;I have recently been working with Python and the &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; web development framework for an ultimate frisbee site I'm creating (I'm being a bit secretive about its details :P) and realized I missed a major step in the learning process. After learning a lot about the Django community, it seems that creating your own blog is something of a rite of passage in becoming a legit developer. Thus, I took a step back from my original project, and spent the last week or so coding this site. &lt;/p&gt;
&lt;p&gt;The time spent on this site was well worth it, and I learned plenty of things about both development and deployment. And now that I have this blog, I actually have a place where I can talk about useful things that I've learned! &lt;/p&gt;
&lt;p&gt;The code behind this site is fairly straightforward and after I clean it up and document it better, I'll be releasing it so you all can do whatever you want with it. Very few sites make their entire codebase open source (and there are plenty of good reasons for this!), so it would have been nice while I was writing this to be able to view the source for a full Django project like this. There are plenty of open source Django applications strewn about the web which are useful to both use and learn from, but full projects that included url confs and templates are of the most use to brand new users of the framework.&lt;/p&gt;
&lt;p&gt;I'd like to be able to tell you how often I'll be posting to this blog, but I really can't say. Probably around once a month? I do have an idea about what I'll be posting on at least. I'll share useful information when I see something that more people should know about, especially in regards to technology and programming. And I'll also use this blog to talk about fun experiences in my life such as ultimate, hiking, or traveling. Hopefully I'll become a better writer in the process!&lt;/p&gt;
&lt;p&gt;Thanks for stopping by!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 26 May 2010 21:46:12 -0500</pubDate><guid>tag:markliu.me,2010-05-26:/2010/may/26/kicking-off-this-site/</guid><category>Non-Technical</category></item><item><title>Trip to Kenya from 12/29/09 - 1/20/10
</title><link>http://markliu.me/2009/dec/26/trip-to-kenya-from-122909-12010/</link><description>&lt;p&gt;I will be traveling to Kenya for the third time in a few days, but instead of posting all about it here, I have instead set up a group blog so everyone on this trip can post. There are 7 of us so hopefully between us all we can give plenty of updates! This blog is located at:&lt;p /&gt; &lt;a href="http://ewb-orongo.posterous.com"&gt;http://ewb-orongo.posterous.com&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Sat, 26 Dec 2009 19:32:00 -0600</pubDate><guid>tag:markliu.me,2009-12-26:/2009/dec/26/trip-to-kenya-from-122909-12010/</guid><category>Engineers Without Borders</category><category>Non-Technical</category></item><item><title>Life has really calmed down
</title><link>http://markliu.me/2009/sep/28/life-has-really-calmed-down/</link><description>I&amp;#39;m now back into the regular groove of things at Madison after a lot of fun traveling this summer. The John Muir Trail was absolutely amazing and would take a very long time to tell about all of those experiences. I wish I had gotten cell phone reception more often during the trail, but as expected, I was out of service for the last 10 or so days so I couldn&amp;#39;t send updates. I do want to write about this trip eventually but I think Jon will be taking care of this for me! He is planning on making one of those personalized books for each of us hikers to have and I&amp;#39;ll definitely help him collaborate. I think this is a great idea for keeping these memories forever, especially since both Jon and I have relatively poor memories. I&amp;#39;m finally getting around to posting my photos from the trip on facebook (&lt;a href="http://www.facebook.com/mliu7"&gt;www.facebook.com/mliu7&lt;/a&gt;) and if I find myself bored at some point in this next week I may write more about this on this blog. If I don&amp;#39;t do it soon though I know it will never happen since my research is going to be getting into full swing really soon!&lt;p /&gt; I&amp;#39;m enjoying being settled down for a little while now but I know I&amp;#39;ll soon be itching to go somewhere interesting again. My next possible trip would be to Orongo, Kenya in January with Engineers Without Borders. A few days ago I was brought up to speed with what I missed on this project so I&amp;#39;m pumped to be back into the swing of things!
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Mon, 28 Sep 2009 13:01:28 -0500</pubDate><guid>tag:markliu.me,2009-09-28:/2009/sep/28/life-has-really-calmed-down/</guid><category>General</category><category>Non-Technical</category></item><item><title>At Muir Trail Ranch
</title><link>http://markliu.me/2009/aug/19/at-muir-trail-ranch/</link><description>Hey everyone. I&amp;#39;m still fine and well and am at Muir Trail Ranch right now, about 110 miles in. George and John are great companions and we&amp;#39;re all healthy. I just wanted to make sure we could get the meet up point right!&lt;p /&gt; For our resupply/meetup near independence, we will meet you guys at the junction of the bullfrog lake trail and the JMT (the place alyssa showed me on the map at elevation 10560) on Tuesday at 1pm. From there, George and John have decided to change their schedule to match ours and we can then be off the trail 3 days later. We&amp;#39;ll be at the summit of Whitney between noon and 1pm on Friday, and then exit that night. (To Rachael and Alyssa) I hope you guys can meet up with us from Independence! The last little bit is pretty tough (41 miles with a lot of ups and downs) after the meetup point, but I think we can do it in 4 days if you&amp;#39;re healthy. Anyway, I hope you&amp;#39;r having a good time enjoying california.&lt;p /&gt; -Mark
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 19 Aug 2009 16:00:45 -0500</pubDate><guid>tag:markliu.me,2009-08-19:/2009/aug/19/at-muir-trail-ranch/</guid><category>General</category><category>Non-Technical</category></item><item><title>In California, Preparing for the John Muir Trail
</title><link>http://markliu.me/2009/aug/06/in-california-preparing-for-the-john-muir-trail/</link><description>Rachael and I have made it safely back to the states and yesterday flew out here to San Luis Obispo, CA and are staying at Alyssa&amp;#39;s house. Its gorgeous out here and hope it stays this nice on the trail! We have been buying a ton of food and are dehydrating a lot of things. We&amp;#39;re almost ready to go. We&amp;#39;ll be driving up to Yosemite tomorrow to start the hike and are planning on spending about 20 days to complete it. &lt;p /&gt;&lt;div&gt;We&amp;#39;re shipping all of our food to the various food pick up points. It looks like we will go about 6 days before our first restock, 3 days before the next, 6-7 days until the next and then 3 days until we are finished. Most people don&amp;#39;t have the luxury of the last restocking point, but Alyssa&amp;#39;s parents are being really helpful and will be driving to a trailhead about 5 miles away from the intersection of the JMT and then hike out to meet us and give us the last 3 days worth of food! They will also meet us at Mount Whitney at the end of the hike which will be awesome.&lt;/div&gt;
&lt;p /&gt;&lt;div&gt;On a side note, I threw out my back yesterday but it looks like I will still be able to start the hike with Alyssa and Rachael at our planned time. They put me on some steroids and muscle relaxers and I&amp;#39;ve been doing some exercises and have been doing pretty well. Much better than the last time I threw out my back! If I keep improving at this rate I&amp;#39;ll definitely be ready to go with no problems.&lt;/div&gt;
&lt;p /&gt;&lt;div&gt;So excited!!&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 06 Aug 2009 10:21:34 -0500</pubDate><guid>tag:markliu.me,2009-08-06:/2009/aug/06/in-california-preparing-for-the-john-muir-trail/</guid><category>General</category><category>Non-Technical</category></item><item><title>Almost time to leave
</title><link>http://markliu.me/2009/jul/31/almost-time-to-leave/</link><description>&lt;p&gt;Everything is wrapping up here nicely and I'm having no problems moving out thankfully! It was sad saying bye to my ultimate friends I've made here since yesterday was the last time I would be playing with them. I will probably miss them the most along with Siva when I leave here. Rachael asked me the other day what I would miss most and after a long while of thinking the only two things I could think of were the new friends I made and having so extremely little to worry about. Even though there are infinitely many perks to living in the states over living here, having almost no pressures while still having a great group of friends is amazing.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Unrelated, but I apologize for the timebeing about being slow to respond to e-mails and such because the system here is having all sorts of problems with authenticating me on certain huge sites. I can't access gmail, facebook, or even my ewbuw site. Hopefully I'll have access soon!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tomorrow we are traveling to Mysore finally to explore a huge palace and see some extremely old temples. There is one that is 4000 years old! Then on Sunday I am leaving for the airport and will be back in Naperville Monday morning bright and early. Rachael and I then have two days to pack our bags, buy any extra camping supplies, and head out to California to meet Alyssa and get ready for the John Muir Trail. We'll be starting the actual hike one week from tomorrow!&amp;nbsp;I think I would be really sad about leaving here if it weren't for this hike.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Anna, Kyle, Rachael and I are going out to dinner with Rachael's labmates now so I have to go. I hope to get in touch with all of you soon!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Fri, 31 Jul 2009 06:00:39 -0500</pubDate><guid>tag:markliu.me,2009-07-31:/2009/jul/31/almost-time-to-leave/</guid><category>General</category><category>Non-Technical</category></item><item><title>A sad week
</title><link>http://markliu.me/2009/jul/24/a-sad-week/</link><description>Just wanted to give you all a quick update so you know I&amp;#39;m still alive. Its been a while since I&amp;#39;ve posted. Unfortunately on Monday, my grandpa passed away so I&amp;#39;ve been pretty bummed. Of all the people reading these posts, I got by far the most feedback from him so I&amp;#39;m glad I was at least able to keep in contact with him during these last few months despite being on the other side of the world... I&amp;#39;ll certainly miss him a lot.&lt;p /&gt;
This weekend I&amp;#39;m traveling to Siva&amp;#39;s home again near Salem in Tamil Nadu so I&amp;#39;ll be out of contact for a few more days. Once I&amp;#39;m back, I have less than a week before heading home to Chicago and then after spending 2 days there I&amp;#39;ll be headed out to California for hiking the John Muir Trail with Rachael and Alyssa. Despite a fun summer I&amp;#39;m really excited to leave here to go hiking for 3+ weeks. Alyssa and I have been committed to taking this trip for over a year now :)&lt;p /&gt;
Last weekend at Pondicherry was fantastic and I&amp;#39;ll have to post about that soon. Just not quite in the mood this week to write a gushing review of possibly the best weekend here so far. :/ Soon though.
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Fri, 24 Jul 2009 01:36:19 -0500</pubDate><guid>tag:markliu.me,2009-07-24:/2009/jul/24/a-sad-week/</guid><category>General</category><category>Non-Technical</category></item><item><title>More birthday festivities
</title><link>http://markliu.me/2009/jul/15/more-birthday-festivities/</link><description>Today has already started out really fun and looks to only get better. Kyle slept over in my room last night so we could go to play ultimate at 6:30am. As always it was a ton of fun and also good to have another friend there!&lt;p /&gt;&lt;div&gt;Tonight though, we&amp;#39;re celebrating Anna&amp;#39;s birthday! Somehow someway it coincided exactly with the premier of the Harry Potter movie which she has been dying to see. So tonight we are going to go to a waffle and ice cream place for dinner and then go see Harry Potter. Fun times!&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 15 Jul 2009 21:46:35 -0500</pubDate><guid>tag:markliu.me,2009-07-15:/2009/jul/15/more-birthday-festivities/</guid><category>General</category><category>Non-Technical</category><category>Ultimate</category></item><item><title>Last weekend in Kerala
</title><link>http://markliu.me/2009/jul/15/last-weekend-in-kerala/</link><description>&lt;span style="font-family: Times New Roman; font-size: 16px;"&gt;&lt;div style=""&gt;
This past weekend Rachael, Anna, Kyle and I visited Kerala on many people&amp;#39;s recommendations. Conveniently for us, Siva&amp;#39;s friend Sandeep planned out a whole trip for us so all we had to do was follow along and have a good time! Siva was unfortunately unable to come, but I had met Sandeep before and knew he was a good guy so we didn&amp;#39;t have to worry. There were 10 of us in the group total and we couldn&amp;#39;t have had a better group to travel with. The 6 of them were extremely fun and joking around the entire time. They of course knew each other really well so often those 6 would sit at one table during dinner and talk in Hindi while we were at our own table. But the entire time they made us feel welcome and they never made us feel at all like we were imposing or hindering the trip.&lt;p /&gt;&lt;div&gt;Kerala is the nicest in the monsoon season which is right now. Luckily though, it was cool the entire time but never rainy! It was absolutely gorgeous. If you are curious where exactly we went, we went to some hill stations between Munnar and Thekkady and stayed at a guest house at the cadimum (sp?) agricultural research institute. Where we stayed was not touristy at all, and Siva&amp;#39;s friend Murugan works there and graciously hosted us for the weekend. &lt;/div&gt;
&lt;p /&gt;&lt;div&gt;To get there, we took a 30 minute autorickshaw to the train station, an 8 hour train ride to dindigul in Tamil Nadu, then a 3 hour taxi ride to Kambam, then a 1 hour jeep ride up to the agricultural research institute. It always takes so long to travel here! Especially to non-touristy places. We did get out of the jeep and walk around to see some nice scenery.&lt;/div&gt;
&lt;p /&gt;&lt;div&gt;&lt;img title="IMG_0992.JPG" src="http://mail.google.com/mail/?ui=2&amp;amp;ik=b704d8345b&amp;amp;view=att&amp;amp;th=1227d378a931d154&amp;amp;attid=0.1&amp;amp;disp=attd&amp;amp;realattid=ii_1227d29377ca69a8&amp;amp;zw" height="314" alt="IMG_0992.JPG" width="420" /&gt;&lt;/div&gt;
&lt;p /&gt;&lt;div&gt;On Saturday we went hiking to the top of a hill which was fantastic. We could see mountain ranges all around us, wind farms in the distance, dams along the mountain sides. It was the first time we&amp;#39;ve been able to get out into nature here in India. Almost no trash! &lt;/div&gt;
&lt;p /&gt;&lt;div&gt;Staying that night at the guest house was interesting though! The rooms weren&amp;#39;t quite the cushy accomodations of Goa... One of the beds was covered in rat poop when we arrived and when we later opened the room, a rat scurried away! Speaking of which, a rat got into most of my food while traveling on the train, and then that night another rat got into the rest of it. There were also massive spiders in the girls&amp;#39; bathroom and Kyle said three of those giant flying ants flew into his ear during the night! Tent camping was sounding extremely luxurious at this point!&lt;/div&gt;
&lt;p /&gt;&lt;div&gt;On Sunday we went to the peak of another really large hill and that was amazing as well. The weather was beautiful and we could see tons of the Kerala countryside. &lt;/div&gt;&lt;p /&gt;&lt;div&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/TsnOJYyA3bvOyDVpHimm3SQJHoTaOHtl0BG6PeBYHQ0CBZrVq3F8Ps86ZxHd/IMG_1116.jpg.scaled.1000.jpg"&gt;&lt;img alt="Img_1116" height="667" src="http://posterous.com/getfile/files.posterous.com/wiscospike/9kAWyTfN1qdQGEM7ja2ZUBP4DPwAGCg4g57AaEvt7pNt8EqsgO68AZRKdMpf/IMG_1116.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;p /&gt;&lt;div&gt;The group we were with was really goofy and we had many long photo shoots with fun shots. We got involved too so when I get a chance I&amp;#39;ll post some fun stuff to facebook!&lt;/div&gt;&lt;p /&gt;
&lt;div&gt;The trip back wasn&amp;#39;t quite as easy because the train was all booked up. We took a 9 seater van all the way back instead. Unfortunately, these were actual seats instead of benches and there were 10 of us so Sandeep volunteered himself to lay on the floor. Thanks to him, the rest of us were quite comfortable! Both Sandeep and Murugan were amazing hosts. Right before we left, they recommended we buy some food just in case we didn&amp;#39;t like what we found for dinner and Sandeep and Murugan were actually arguing between each other who should pay for the food we wanted to buy! Recall here that we didn&amp;#39;t know them until this past weekend! In fact, Murugan didn&amp;#39;t know any of the 10 people who went on this trip. To give an analogy, this is pretty much the same thing as a friend in LA calling me up to say he has 10 foreign friends who I&amp;#39;ve never met who have plane tickets to Milwaukee and nothing else and then expecting me to drive over there, arrange for rides, food, housing, and entertainment for a full 2 days. Whats more is Murugan was so happy about hosting us and seemed to have a great time himself! It was hospitality at its finest.&lt;/div&gt;
&lt;/div&gt;&lt;/span&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 15 Jul 2009 00:25:15 -0500</pubDate><guid>tag:markliu.me,2009-07-15:/2009/jul/15/last-weekend-in-kerala/</guid><category>General</category><category>Non-Technical</category></item><item><title>Some Pictures of Indian Food
</title><link>http://markliu.me/2009/jul/09/some-pictures-of-indian-food/</link><description>&lt;p&gt;One of the biggest differences between living here and at home is definitely the food. Apparently some foreigners at NCBS can't deal with it and end up eating a lot of cookies and bread. Luckily I find most of it quite good (except the food at B mess which I do not need to eat anymore!). One thing that is still difficult to get used to though, is eating with my hands! Some things like chappathi or pastries are of course easy to eat with your hands, but most things are not. For instance, today at lunch I ate Rice, Chappathi, Yoghurt, an Egg in a bowl of sauce, and masala. And boy was it messy. No one looked at me funny when my right hand was covered in sauce and rice because they were all doing it too! In fact, they are still slightly more messy than me because at the end of all their meals, they pour buttermilk on their remaining rice, mix it up really well, and eat the soupy concoction with just their right hand. Kind of unsightly to watch, but they do it with unbelievable efficiency!&lt;p /&gt; Anyway, here is an example of some Tamil food we had on one of our trips there:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[Edit]&lt;/strong&gt; The image did not load correctly. Here is a link to someone else's picture of pretty much the same meal: &lt;a href="http://www.chennaitransit.com/ChennaiTransit/Gimages//chennaimeal1.jpg"&gt;http://www.chennaitransit.com/ChennaiTransit/Gimages//chennaimeal1.jpg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That green thing is a banana leaf. Some guy with three tins of different sauce walks around and continues to scoop more onto your leaf as you eat until you fold the thing closed. It was quite tasty actually, even though I'm not a big fan of their rice here.&lt;p /&gt; What I am a big fan of though, is their desert. This little guy is soooo delicious. Don't know what its called though. I think it starts with a J. My other favorite desert is Mysorepak and I'll be sure to bring a bunch home with me.&lt;p /&gt; &lt;img title="IMG_0620.JPG" src="http://mail.google.com/mail/?ui=2&amp;amp;ik=b704d8345b&amp;amp;view=att&amp;amp;th=1225ef30587114bd&amp;amp;attid=0.2&amp;amp;disp=attd&amp;amp;realattid=ii_1225ef186d6612a5&amp;amp;zw" height="314" alt="IMG_0620.JPG" width="420" /&gt;&lt;p /&gt; &lt;br /&gt;And I should definitely post a picture of that way too spicy Gobi Manchurian. Haven't gotten the courage to try it again but it'll happen since its probably the tastiest food I've had here.&lt;p /&gt;&lt;img title="IMG_0869.JPG" src="http://mail.google.com/mail/?ui=2&amp;amp;ik=b704d8345b&amp;amp;view=att&amp;amp;th=1225ef449c5a179a&amp;amp;attid=0.2&amp;amp;disp=attd&amp;amp;realattid=ii_1225ef3b83a74cd4&amp;amp;zw" height="315" alt="IMG_0869.JPG" width="420" /&gt;&lt;p /&gt; And this is a typical breakfast over at NCBS. Tea and Dosa with sauce. At IISc we usually have these doughnuts that are spicy instead of sweet called vada with some spicy white sauce.&lt;p /&gt;&lt;img title="IMG_0793.JPG" src="http://mail.google.com/mail/?ui=2&amp;amp;ik=b704d8345b&amp;amp;view=att&amp;amp;th=1225efc8c45be508&amp;amp;attid=0.0.2&amp;amp;disp=attd&amp;amp;realattid=ii_1225ef629d968f0f&amp;amp;zw" height="314" alt="IMG_0793.JPG" width="420" /&gt;&lt;p /&gt; And then you have the desert that everyone here seems to prefer:&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/STYKhDXUj2VEQilf0dNAlXwzYLH6PLdhPh9kOqjTNtSkw5bk18zwLnYXJ3HM/IMG_0773.jpg.scaled.1000.jpg"&gt;&lt;img alt="Img_0773" height="667" src="http://posterous.com/getfile/files.posterous.com/wiscospike/D6xOi5tWQGE3Mxg6Fm5ZxEF4ppKZf2xSgdQW9Z7coFqZpkWxACJlbNT3RfOL/IMG_0773.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;a href="http://posterous.com/getfile/files.posterous.com/wiscospike/zZyrz0PeT2LRQx0CJgZHnYNNUswqH06rYGTr4JXOFsY0C9UuaZvxBdr54Mxf/IMG_0774.jpg.scaled.1000.jpg"&gt;&lt;img alt="Img_0774" height="667" src="http://posterous.com/getfile/files.posterous.com/wiscospike/aN0UXPd92OAegwFBIORZpx3A8kOl19AQMFDIXyC4c0qmwOLIdkMskCe9EiNv/IMG_0774.jpg.scaled.500.jpg" width="500" /&gt;&lt;/a&gt;
&lt;div class='p_see_full_gallery'&gt;&lt;a href="http://wiscospike.posterous.com/some-pictures-of-indian-food"&gt;See the full gallery on Posterous&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 09 Jul 2009 03:15:00 -0500</pubDate><guid>tag:markliu.me,2009-07-09:/2009/jul/09/some-pictures-of-indian-food/</guid><category>General</category><category>Non-Technical</category></item><item><title>I had a great birthday
</title><link>http://markliu.me/2009/jul/07/i-had-a-great-birthday/</link><description>Thanks to Rachael, Kyle, Anna, and Siva, I had a really great birthday. They took me to a nice Chinese restaurant called Red Bamboo Shoots and brought me a bunch of fun presents! Also, they got me the coolest cake ever. The text on it was:&lt;p /&gt;
IT IS YOUR BIRTHDAY.&lt;p /&gt;hahaha if you get that reference you are probably awesome.
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Tue, 07 Jul 2009 22:06:13 -0500</pubDate><guid>tag:markliu.me,2009-07-07:/2009/jul/07/i-had-a-great-birthday/</guid><category>General</category><category>Non-Technical</category></item><item><title>July 4th Weekend in Goa
</title><link>http://markliu.me/2009/jul/07/july-4th-weekend-in-goa/</link><description>&lt;p&gt;This past weekend was quite fun. A little too short though... On Friday Anna, Kyle, Rachael, and I took a 14 hour overnight bus ride from Bangalore to Goa and arrived at about 10am. The busses had AC set to extremely cold but luckily Rachael brought a jacket and I brought a sweatshirt which we put over our faces and it was tolerable. Poor Anna and Kyle though... There were not sheets on the bus and both of them had only short sleeves and shorts. Anna claimed this was colder than the time we wandered London for 4 hours in January without jackets on so I couldn't even imagine their pain! She lost her voice completely from that AC. One good part of the busride though was that when Rachael woke up at night really having to pee (there were no bathrooms on the bus), we walked up to the driver and he stopped so we could go pee on the side of the road. They only stopped 1 or 2 times during the whole 14 hour ride. I guess Indians can just hold it in better than us Americans!&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Img_0917" height="245" src="http://posterous.com/getfile/files.posterous.com/wiscospike/eAX3q3yBEfVDQdND7MMXyLjh0QUYDQrN2sbFGd4wnkqYYbbHCwQahdy4fhui/IMG_0917.jpg" width="327" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Goa was really pretty and had tons of really lush forrests amidst a ton of rice fields. It was clearly a place for tourists, as the accomodations were quite nice and had a lot of white people there. We stayed at Anjuna beach at a place called Villa Anjuna in these rooms right outside a nice swimming pool. At this place there was also a cafe that served tons of western foods! Actually, the whole time we were there we ate almost all western food which was fantastic.&lt;/p&gt;
&lt;p&gt;Unfortunately it was the monsoon season so we couldn't really lay out on the beach. It was always drizzling and the waves were just massive. It was plenty warm though so we walked along the sand and rocks for a while. Kyle and Anna got adventurous and walked onto the rocks to see the wildlife in the tide pools. While they did get to see a whole bunch of crabs, a wave knocked them down and since the rocks were really jagged, they got a bunch of small cuts on their feet and arms. They're fine now though.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Other than that, we didn't do too much there except just relax. And it really was as relaxed as I've been here in India. The trip home though was not quite as much! We took a slower bus home, 16 hours, and it only stopped for a bathroom break once! We realized how little these busses stop so we were sure to drink as little as possible in the hours leading up to it, but Anna still had to pee really badly about 4 or 5 hours in. So we decided all to try to go alongside the road and went up to the bus driver and the conductor to ask them to pee. And the conductor told us to go away. We kept pleading to him that it was an emergency and he just told us to go back and sit down and was kicking at Anna's shoe to get her to move away! So we went back and Anna survived another couple hours until we stopped. What was so surprising though, was that at the last stop when we were getting off and getting our bags, the conductor kept saying "Hello friend! Can you give me a tip? 50 rupees." I don't understand... haha&lt;/p&gt;
&lt;p&gt;This is the bus I keep talking about: &lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Img_0932" height="368" src="http://posterous.com/getfile/files.posterous.com/wiscospike/hagQd3IJvrXkG8BrUFrUlteoeP2k56LVPORo9JAF2C2vYzChqDFtkjaxAScC/IMG_0932.jpg" width="490" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The bus on the way back was also extremely bumpy and difficult to sleep on, so I ended up sleeping 11 hours last night to make up for it! That was sure enjoyable. Tonight us 4 plus Siva are going out to find some Chinese food for my bday which I'm sure looking forward to! Oh, and speaking of awesome luck with food, I got switched by default yesterday from B Mess to C mess because B mess all of the sudden closed for the month for some unknown reason. I had been trying to switch for over a month because the food at C mess was ten times better but they wouldn't let me because their paper book keeping system is so complex/old fashioned you can't really change things so easily. So as of today I have good food for all my meals!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Img_0925" height="368" src="http://posterous.com/getfile/files.posterous.com/wiscospike/OIuKku1aJrREvy5IgopVrfK0xH6JwKgM5i6UEGuQ3WJcVexgHZO3eevVrYPk/IMG_0925.jpg" width="490" /&gt;
&lt;img alt="Img_0924" height="368" src="http://posterous.com/getfile/files.posterous.com/wiscospike/RixcDGKb4G7rLPd8PWZvORJm7AmRLik7wHkNWC04auNSpPULz6aFr2yjgE0d/IMG_0924.jpg" width="490" /&gt;
&lt;div class='p_see_full_gallery'&gt;&lt;a href="http://wiscospike.posterous.com/4th-of-july-weekend-in-goa"&gt;See the full gallery on Posterous&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Tue, 07 Jul 2009 04:12:00 -0500</pubDate><guid>tag:markliu.me,2009-07-07:/2009/jul/07/july-4th-weekend-in-goa/</guid><category>General</category><category>Non-Technical</category></item><item><title>On first impression, Posterous is cooler than Tumblr
</title><link>http://markliu.me/2009/jul/02/on-first-impression-posterous-is-cooler-than-tumb/</link><description>&lt;p&gt;It has no way to set custom themes or make things look pretty, but its &lt;br /&gt;functionality is really fun! And it is faster and much easier to use &lt;br /&gt;than Tumblr after playing with it for only minutes. I thin this will be my main blogging platform for now. If you are curious about the tumbler blog I tried out for a few days it was located at:&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://wiscospike.tumblr.com/"&gt;http://wiscospike.tumblr.com/&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Thu, 02 Jul 2009 03:23:00 -0500</pubDate><guid>tag:markliu.me,2009-07-02:/2009/jul/02/on-first-impression-posterous-is-cooler-than-tumb/</guid><category>Non-Technical</category></item><item><title>4th update from India
</title><link>http://markliu.me/2009/jul/01/4th-update-from-india/</link><description>&lt;p&gt;So this is my first ever blog entry on my first ever blog&amp;#8230; I feel so behind the times that I thought I would give this a shot and see what its like! There is a good chance you&amp;#8217;ll see future blog posts from different blogging sites while I get a feel for things. I guess what made me change to updates on blogging sites instead of those mass e-mails is I&amp;#8217;ve been quite interested in web development recently and since I&amp;#8217;m doing all this research about the new trends in social media, I should really start participating as well!&lt;/p&gt;

&lt;p&gt;Anyway, I am posting this now because I&amp;#8217;m in such a good mood right now. Today is just going amazingly. I played ultimate for the first time in India and it was as much fun as I had hoped. Ultimate people are just really cool. They are really new to the game so its not quite like playing in the states, but the players were all really friendly. One of the guys gave me a ride most of the way back and gave me his number so I can ask him questions about where to stay this weekend in Goa. Even though they play at 6:30 am, I&amp;#8217;m pretty sure I&amp;#8217;ll be going to 2 games a week from now on! The only problem with playing there was all of the cricket games going on around us which meant there were always about 5-10 people running around our field at all times which we had to dodge. There were also a group of 4 people just standing around in the middle of our field talking and when one of our players asked them to move they said that we don&amp;#8217;t own this ground&amp;#8230; That would definitely not fly in the states. First off, no one in their right mind would stand on an obvious playing field just because they can, and second, if they were asked to move, 99.9% of people in the states would get off the field. I still find that behavior shocking.&lt;/p&gt;

&lt;p&gt;Anyway, on the way back to IISc this morning after the ultimate guy dropped me off, I took an autorickshaw the rest of the way back and he didn&amp;#8217;t try to rip me off! He tried to get his meter working but when it was obviously broken, I suggested 20 rupees which is probably what a meter would have cost and he didn&amp;#8217;t argue. We then had to go farther than I originally thought to a back entrance and almost got into 2 accidents while I was giving directions to him and he still didn&amp;#8217;t complain about the price. I ended up giving him more than that anyway just because he didn&amp;#8217;t try to rip me off. haha, I probably ended up paying the same amount as I would pay an ordinary rickshaw driver who haggled the price with me, only at least this guy knows he was doing honest business.&lt;/p&gt;

&lt;p&gt;So  recently I traveled to Kanyakumari on the southern tip of India. Siva took us there on a 14 hour train ride. The ride there was really nice. It was an air conditioned sleeper car with reasonably comfortable mats, only 2 levels of beds, and came with sheets, blankets, a pillow, and a curtain for privacy. So that was really sweet. The way back though wasn&amp;#8217;t nearly as nice&amp;#8230; There was no AC which meant a lot more bugs, there were 3 layers of beds which meant a lot less space, no curtains so there was exactly zero privacy, much less comfortable mats, and no blankets, sheets, or pillows. Somehow I still got a great sleep though!&lt;/p&gt;

&lt;p&gt;While Rachael and I were at Siva&amp;#8217;s in law&amp;#8217;s place at Monday Market (about 20 minutes from Kanyakumari) we were treated really well. They gave us the upstairs guest room which was actually a really nice accomodation. We had our own western style bathroom with hot water for showers too. His mother in law cooked us 2-3 meals a day. Eating there was a little awkward though. Because we were the guests, we were supposed to eat first before everyone else. We would sit at a table with just food in front of Rachael and I and Siva, his Father in law, his mother in law, his brother in law, and sister in law would all be there watching us eat (sometimes not all of them since they would also do other things). His mother in law would stand literally 5-10 feet away and wait for our plates to start getting empty and whenever they reached a certain point she would come over and scoop us some more. So that was sure an interesting experience.&lt;/p&gt;

&lt;p&gt;Probably the most shocking experience there was the early morning church. This was a Christian community and there was a very nearby church that held service every morning at 5am-6am. Simillar to the Kenyan churches I experienced last summer, this church had incredibly loud speakers pointed away from the church so everyone in the community could hear every word loudly and clearly. In our room it was significantly louder than sitting right in front of a TV set to normal listening volume. Needless to say we didn&amp;#8217;t get much sleep for that hour either morning. The crazy thing is that that church service happens every single morning and the residents don&amp;#8217;t seem to mind! And speaking of things similar to Kenya, we found out that Siva&amp;#8217;s in law&amp;#8217;s move at a speed comparable to our Kenyan friends! Friday night we were asked to be ready to go by 8:30 saturday morning so we were up and ready at that time. We ended up sitting around playing with Siva&amp;#8217;s newphew, talking, and really doing almost nothing until leaving at about 11&amp;#8230; So then Saturday night they apologized for leaving so late and said we should sleep in until 11 Sunday morning. But then Siva&amp;#8217;s mother in law said breakfast would be ready at 9:30 and that we should be ready to eat then and we would leave right after breakfast. So sure enough we wake up and get down there at 9:30 to eat breakfast. But we end up sitting around waiting for people to shower, play with Siva&amp;#8217;s nephew some more and don&amp;#8217;t leave until after 12! haha its kind of ridiculous, but at least I&amp;#8217;m used to it so it doesn&amp;#8217;t make me think less of such a welcoming family.&lt;/p&gt;

&lt;p&gt;Speaking of inefficiencies, I still can&amp;#8217;t get a good grasp on whether or not Indians are fast paced or slow paced. Everyone is rushing around so fast on their mopeds and traffic is outrageously agressive. People are pushing and cutting in lines and always in such a hurry to get their food or any other kinds of service. But then they take these super long lunch and tea breaks every day and don&amp;#8217;t start work until about 10 or 11! Seems conflicting so I&amp;#8217;m still trying to understand it. haha, I saw one of the most ridiculous wastes of time the other day when I was taking water samples in a village on the border of Karnataka and Andrea Pradesh. Granted, it was not a huge village so life moves slower there but still. We needed samples from a tap and the taps weren&amp;#8217;t currently running because the pump had been turned off for the day (people get their water during a 1 or 2 hours of pumping time each day). So we needed to turn the pump back on to get water, but it takes 15 minutes for the water to start up. So we had to wait in the blazing sun for this. First of all, I thought it was incredibly inefficient and time wasteful that all 4 members of our group was standing around waiting for this water. But on top of that, 6 other adults and 5 children were standing around just &lt;i&gt;watching&lt;/i&gt; us wait for water to come out of the tap where we would put a bottle under it and be done. hahaha. Seriously, in the US, it would take one person to collect the samples, and during those 15 minutes of downtime (which wouldn&amp;#8217;t exist because our water sources are so awesome!) that person would go do something else instead of look at it. 15 people*15 minutes was almost 4 wasted man hours where everyone was bored, hot and doing nothing productive or amusing&amp;#8230; very odd.&lt;/p&gt;

&lt;p&gt;Yet on the complete opposite side of the spectrum is their unbelievably effecient food service! After taking those water samples we went for lunch at a busy restaurant where there were about 15 tables of 6 people each. Lunch lasted a total of 15-20 minutes from the time we walked in until the time we walked out. Absolutely unbelievable considering how this was a great sit down place. In those 15 minutes, we washed our hands, ordered, got our drinks, got an appetizer (massa vada which was delicious), got another appetizer (jammoon, also delicious), got our main course (mysore masasla dosa, both delicious and filling), got our first desert (curd with lots of sugar), got our second desert (ice cream), drank tea, paid for it all, and washed our hands again. Further, this cost about $1.50. Yes, I was eating about as fast as I possibly could to keep up with everyone, and took my tea so fast I scalded my tongue, but it I enjoyed having such a great meal without wasting a second!&lt;/p&gt;

&lt;p&gt;And speaking of food, I had the absolute best meal I&amp;#8217;ve had here yesterday. There is a small canteen here for people from outside the campus that I tried for the first time and I had buttered poori with gobi manjuri was that amaaazing. Juicy, crispy, spicy, sweet, flavorful. Sounds a little like panda express right? haha, probably as good as that which is saying a lot considering how much I love Panda. Only problem was, I am getting used to eating meals here with no water during the meals and only taking a drink afterwards. But this meal happened to be one of the two spiciest meals I&amp;#8217;ve had here (making it one of the three spiciest I&amp;#8217;ve had in my life!) so I was about to die by the end. My face was covered in sweat, my eyes were beginning to tear up, I was breathing heavily, and it was a chore just to talk and order water afterwards! haha, totally worth it though. I think I&amp;#8217;m going to get it again today but bring water with me.&lt;/p&gt;

&lt;p&gt;This first post is getting long I think. I am going to go now and book some tickets for this weekend. We have a full schedule of weekends lined up to finish off this India trip! This weekend we&amp;#8217;ll be going to Goa which is known for its beautiful beaches and almost no crowds during this monsoon season. The next weekend we&amp;#8217;ll be going to Kerala which is also known for its scenery and backwaters. The following weekend we&amp;#8217;ll be going to Pondicherry which is beautiful and hot this time of year and we can actually go swimming for the first time! And then the last weekend we&amp;#8217;ll be visiting Siva&amp;#8217;s house again. Hopefully we can also push our flight forward a couple of days to go see the Taj Mahal before we leave. I think I&amp;#8217;ll send shorter, more frequent updates from now on. I think I might also add random stuff to this blog in case you want to check it more often. There&amp;#8217;s lots of fun things on the web these days that are definitely worth sharing with anyone who cares!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mark Liu</dc:creator><pubDate>Wed, 01 Jul 2009 16:18:39 -0500</pubDate><guid>tag:markliu.me,2009-07-01:/2009/jul/01/4th-update-from-india/</guid><category>General</category><category>Non-Technical</category></item></channel></rss>