<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Timothy Gu</title>
    <description>The hub for all things Timothy Gu.</description>
    <link>https://timothygu.github.io/</link>
    <atom:link href="https://timothygu.github.io/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Junior Year</title>
        <description>&lt;p&gt;This semester, I have entered into the third year of my high school career. It
has been a very different experience compared to my last two years, and I think
it’s worthy of a blog post so that I don’t forget about this special year in
the future.&lt;/p&gt;

&lt;h2 id=&quot;ib--the-source-of-woe&quot;&gt;IB – The Source of Woe&lt;/h2&gt;

&lt;p&gt;My school offers a program called International Baccalaureate Diploma
Programme. For those of you who live in North America, this term may sound
pretty foreign. Basically, IB DP is a two-year program for academically
talented students during their last two years in high school. To get this
diploma, one has to take 6 college-level IB courses (similar to AP courses in
the U.S. and Canada), with at least 3 of them being two-year “Higher Level”
courses, write an extended essay during the second year of IB, and participate
in activities that demonstrate creativity, action, and service (“CAS”).&lt;/p&gt;

&lt;p&gt;Before signing up for the program, I’d heard of both compliments and criticisms
– usually the former around “preparations for college” and the latter around
“homework” – but I eventually decided to join since most of my friends are, and
because I believe I am academically capable of the IB workload.&lt;/p&gt;

&lt;p&gt;Unfortunately, the college-level courses are much more difficult than I
anticipated them to be: especially the humanity ones, which constitute the
majority of my four higher-level courses. I have never been an outstanding
writer, and this year’s IB English course (which corresponds roughly to AP
English Language) is much harder than last year’s, and places more emphasis on
writing. IB History (equivalent to AP US History) has driven me to sleep at 4am
on one occasion. IB Philosophy will be my second-ever non-A on my high school
report card at the end of this quarter (today).&lt;/p&gt;

&lt;p&gt;Sounds tough, doesn’t it…&lt;/p&gt;

&lt;p&gt;But never for a second did I regret making the choice of taking IB a few months
ago.&lt;/p&gt;

&lt;h2 id=&quot;ib--the-call-to-grow&quot;&gt;IB – The Call to Grow&lt;/h2&gt;

&lt;p&gt;There are a few things in which IB does very well on its mission to prepare us
for the next stage of life. I guess this transition will happen sooner or
later, and as with everything, better sooner than later.&lt;/p&gt;

&lt;p&gt;The first thing that comes to my mind is how IB forces me to organize my time
wisely. Students always face the choice between working and procrastinating,
and the Timothy of last year frequently chose the latter. Since there wasn’t
much homework anyway, I often got away with it. This year, the choice has
morphed beyond homework schedule, into “sleep” versus “no sleep.” I assume this
is how it’s like in a competitive college.&lt;/p&gt;

&lt;p&gt;Which brings my second point. IB knows what colleges are like, and the
Programme really prepares us for the hustle-bustle we will encounter in less
than two years. Not only is the workload something IB tries to imitate
colleges, but the format of the classes too. For example, I have to write
papers for IB math class that feels really college-y with proper fonts, format,
and such. For IB Physics, my other HL course, the way we calculate
uncertainties and errors will carry through into college, according to my
teacher at least.&lt;/p&gt;

&lt;p&gt;The extended essay we are going to write next year is a prime example of such
preparation IB emphasizes. I am not sure about the details of it yet, but I
have a feeling that it will be something I’ll be proud of, just like a college
student with his successfully defended thesis.&lt;/p&gt;

&lt;h2 id=&quot;ib--cas&quot;&gt;IB – CAS&lt;/h2&gt;

&lt;p&gt;The only piece of puzzle I’m not very sure of currently is the CAS
requirements. Basically the CAS requirement is composed of loggable hours of
different activities in the three categories of CAS: creativity, action, and
service.&lt;/p&gt;

&lt;p&gt;This year, I have started a classical guitar club at my school. My vision of
the Classical Guitar Club of SM extends beyond just fulfilling the requirements
for CAS (as I hopefully will explain in another blog post if I have the time
for it), but I consider club leadership to be a form of creativity (and I hope
IB will too).&lt;/p&gt;

&lt;p&gt;For action, I am not 100% sure since I’m more of a sedentary person. I do enjoy
going outdoors but with me living at a host family, that is unfortunately not
always possible. I also used to run (not competitively), but with my schedule
overflowing I am having trouble finding time for that. Same goes for golf.&lt;/p&gt;

&lt;p&gt;The last one, service. I mean, I enjoy service to all kinds of things:
environment, children, elders; but the problem is that I can never find friends
with similar interests. Plus, my friends and I often have very different
schedules after school and during weekends, and it’s no fun to go somewhere on
my own just for fulfilling requirements, which is not the original intentions
of CAS anyway.&lt;/p&gt;

&lt;h2 id=&quot;other-classes&quot;&gt;Other Classes&lt;/h2&gt;

&lt;p&gt;Beyond the ones I just mentioned, I am taking AP Computer Science, which is my
easiest class right now because right now all we do is Java programming. No
computer science at all.&lt;/p&gt;

&lt;p&gt;Spanish is not a problem either because of our very slow pace through the
textbook, which miraculously we finished last year.&lt;/p&gt;

&lt;h2 id=&quot;classes-i-want-to-take&quot;&gt;Classes I Want to Take&lt;/h2&gt;

&lt;p&gt;I love science. I love math. I want to take EVERY SINGLE ONE OF SCIENCE CLASSES
offered by our school.&lt;/p&gt;

&lt;p&gt;But no, I can’t do that.&lt;/p&gt;

&lt;p&gt;Let’s do the math. Next year, I am certain about my 4 sets of HL classes; AP
Calculus, which is &lt;em&gt;de facto&lt;/em&gt; mandatory for engineering schools; Theory of
Knowledge as part of the IB requirements next year; and Spanish SL to fulfill
my IB requirement and four-year foreign language “recommendation” by colleges.
We can take 7 classes per year*, that leaves me to … guess what … &lt;strong&gt;0 empty
spots! This means that I will never be able to take a second college-level
science class.&lt;/strong&gt; NOOOOO!&lt;/p&gt;

&lt;p&gt;* Plus an optional college-level music class, which I tried to take this year,
but the school didn’t open that class because too few people want to take it.&lt;/p&gt;

&lt;h2 id=&quot;pixel&quot;&gt;PIxEL&lt;/h2&gt;

&lt;p&gt;Another source of fun (and work) originates from my role as the Director of
Technology at the PIxEL Foundation, a non-profit started by my friend
&lt;a href=&quot;https://ethanl.ee/&quot;&gt;Ethan Lee&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PIxEL stands for “programmers + innovators * entrepreneurs + leaders”. Last
year, PIxEL was just another club on campus where we taught our peers on how to
use HTML and CSS to MAKE SOMETHING on computer, and to more enlightened ones
bits and pieces of JavaScript. Unfortunately, the rest of what PIxEL tries to
be was not very much covered. But the relative success of the club kept us
going, and the long-time members of the club (including me) formed a more
close-knitted group.&lt;/p&gt;

&lt;p&gt;This year, we are shifting gears to become a more mature and sustainable
organization. First, we are officially a non-profit 501(c)3 corporation, thanks
to the great work from the Director of Finances Albert Lee* and his supportive
parents. On programming, we are trying to continue our tradition of
after-school club meetings, but we are going to expand to hosting more weekend
workshops and even hackathons for making an entire project. On our mission to
bring entrepreneurship to everybody, we are now also partnering with &lt;a href=&quot;http://www.mitlaunchclubs.com/&quot;&gt;MIT
Launch&lt;/a&gt;, which is an incubator of computer projects. We are also trying to
bring our love for computer science and the hope of entrepreneurship to younger
people (like middle schools) and the less fortunate (Title 1 schools).&lt;/p&gt;

&lt;p&gt;All in all, we are really taking off this year, and we have high hopes for
everything we are doing.&lt;/p&gt;

&lt;p&gt;* Despite their last name, Albert is not related to Ethan.&lt;/p&gt;

&lt;h2 id=&quot;moving-on&quot;&gt;Moving On&lt;/h2&gt;

&lt;p&gt;This year surely will be an unique and unforgettable experience for me. Surely
I don’t have everything planned out, and there will be some obstacles along the
road, but I’m sure with every experience I will learn and grow a bit, and be a
little more prepared for the future. And that’s what matters.&lt;/p&gt;
</description>
        <pubDate>Fri, 16 Oct 2015 00:00:00 +0000</pubDate>
        <link>https://timothygu.github.io/2015/10/16/junior-year/</link>
        <guid isPermaLink="true">https://timothygu.github.io/2015/10/16/junior-year/</guid>
      </item>
    
      <item>
        <title>Node.js</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Some time last semester, I first heard about &lt;a href=&quot;https://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; from
&lt;a href=&quot;http://ethanl.ee/&quot;&gt;a friend of mine&lt;/a&gt; who really likes doing web stuff. Our conversation were
something like:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;TG:&lt;/dt&gt;
&lt;dd&gt;Hey Ethan I am trying to rewrite the &lt;a href=&quot;http://fate.ffmpeg.org/&quot;&gt;
FFmpeg FATE website&lt;/a&gt; in something faster than
&lt;a href=&quot;https://github.com/ffmpeg/fateserver&quot;&gt;Perl CGI&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;EL:&lt;/dt&gt;
&lt;dd&gt;You should &lt;em&gt;really&lt;/em&gt; look into Node.js.&lt;/dd&gt;
&lt;dt&gt;TG:&lt;/dt&gt;
&lt;dd&gt;I've heard of it, but what the heck is that?&lt;/dd&gt;
&lt;dt&gt;EL:&lt;/dt&gt;
&lt;dd&gt;It's basically server-side JavaScript.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;There, I started on my journey learning JavaScript and Node.js.&lt;/p&gt;

&lt;h2 id=&quot;learning&quot;&gt;Learning&lt;/h2&gt;

&lt;p&gt;So I just Googled something like “learnign node.js” (with spelling errors),
and &lt;a href=&quot;http://nodeschool.io/index.html&quot;&gt;NodeSchool&lt;/a&gt; pops up. Nice yellow-themed website. And then there were
some so-called “workshoppers” that are “self-guided … lesson modules”. I
already knew JavaScript quite a bit, so I directly picked up on “learnyounode”.&lt;/p&gt;

&lt;p&gt;After wrestling with npm and Ubuntu &lt;code class=&quot;highlighter-rouge&quot;&gt;nodejs&lt;/code&gt; vs &lt;code class=&quot;highlighter-rouge&quot;&gt;node&lt;/code&gt; mess for an hour, there
it was, a fine workshop with atomic units that are, frankly, extremely
beginner-friendly. Node.js beginner-friendly, not JS beginner-friendly.&lt;/p&gt;

&lt;p&gt;So I thought, &lt;em&gt;nope, this doesn’t work at all&lt;/em&gt;, and went back to NodeSchool
for the “javascripting” workshopper. And I have to say, I &lt;em&gt;really&lt;/em&gt; enjoyed
learning JS while my teacher lectures in my math class.&lt;/p&gt;

&lt;p&gt;After finishing the two workshoppers I just mentioned, I started doing the
“expressworks” workshopper. And it was equally amazing.&lt;/p&gt;

&lt;p&gt;After about three day, I thought I was proficient enough to at least &lt;em&gt;port&lt;/em&gt;
the FATE CGI over. And to be honest, I almost was, but not proficient enough
to do all the caching stuff, optimization, etc..&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; To learning JavaScript, 3+ things should be enough: some NodeSchool
workshoppers, proficient Googling skills, and a learning spirit.&lt;/p&gt;

&lt;h2 id=&quot;fate&quot;&gt;FATE&lt;/h2&gt;

&lt;p&gt;Not much to say here, except when I tried to add some caching some race
conditions occurred. So I used a rwlock. Yes, rwlock, in JavaScript. I don’t
even have any experiences for mutexes in C (and that shows my level of C…)
and I do now in JS.&lt;/p&gt;

&lt;p&gt;I also chose to use &lt;a href=&quot;https://github.com/tj/ejs&quot;&gt;EJS&lt;/a&gt; because:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;it is what’s used in the first blog post regarding Express.js on Google&lt;/li&gt;
  &lt;li&gt;it’s &lt;em&gt;fast&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But nevertheless, my friend told me about &lt;a href=&quot;http://jade-lang.com/&quot;&gt;Jade&lt;/a&gt;. So I looked that up.
&lt;em&gt;Wow,&lt;/em&gt; said me in the past thought, &lt;em&gt;it’s so cool … and clean …&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Until I &lt;strong&gt;ported my entire project over&lt;/strong&gt; and benchmarked it. Without caching
it was something like 7x slower than EJS and slower than the Perl CGI version.
Even with caching it had only ⅔ of the performance of EJS. So, I reverted
my 500-line change and cried for 10 minutes, and moved on.&lt;/p&gt;

&lt;h2 id=&quot;jade&quot;&gt;Jade&lt;/h2&gt;

&lt;h3 id=&quot;gaining-maintainer-status&quot;&gt;Gaining maintainer status&lt;/h3&gt;
&lt;p&gt;Interestingly, I started sending PRs fixing broken links on the website of
Jade, even when I am not using Jade. After my
&lt;a href=&quot;https://github.com/jadejs/jade/pull/1709#issuecomment-61475378&quot;&gt;second very trivial PR to Jade&lt;/a&gt;, the wonderful @ForbesLindesay added me
to the Jade maintainers team. I was genuinely surprised, as I had literally
less than a week of real JS experiences, and now I am on the maintainer team
of a module that is &lt;a href=&quot;https://www.npmjs.com/package/jade&quot;&gt;installed over 70,000 times per day&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;all-the-easy-stuff&quot;&gt;All the easy stuff&lt;/h3&gt;

&lt;p&gt;Back to the story. I continued contributing to Jade in some documentation
stuff and some trivial deprecation stuff. But gradually, I became more
familiar with the code base, and more comfortable with working with JS, which
frankly is a bastard language, but a bastardly (assuming that’s a word) easy-
to-write language.&lt;/p&gt;

&lt;h3 id=&quot;harder-stuff&quot;&gt;Harder stuff&lt;/h3&gt;

&lt;p&gt;One of my most recent commits to Jade was &lt;a href=&quot;https://github.com/jadejs/jade/pull/1808&quot;&gt;adding tests for caching&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jadejs/jade/pull/1805&quot;&gt;the CLI&lt;/a&gt;, including CLI watching mode where the output is recompiled
whenever you modify the source file. The async nature of caching and process
spawning were extremely challenging even now as I recall it. I am still fairly
proud of myself for being able to figure out a way to do that.&lt;/p&gt;

&lt;h3 id=&quot;now-and-beyond&quot;&gt;Now and beyond&lt;/h3&gt;

&lt;p&gt;Now I am the person with the &lt;a href=&quot;https://github.com/jadejs/jade/graphs/contributors&quot;&gt;third most commits&lt;/a&gt; in Jade, plus I gained a
whole lot more experiences with working with a mature Node.js project and
@ForbesLindesay. Huge shoutout to everybody who helped me in the process!&lt;/p&gt;

&lt;p&gt;I still haven’t gotten to study the Jade parser and lexer, the two &lt;em&gt;beasts&lt;/em&gt; TJ
wrote a long time ago and are starting to show some age. Forbes said he is
going to split them to new repos in the Jade v2 rewrite, so for now let’s wait
until a roadmap to v2 is established.&lt;/p&gt;

&lt;h2 id=&quot;ejs&quot;&gt;EJS&lt;/h2&gt;

&lt;h3 id=&quot;discovery-of-ejs-v2&quot;&gt;Discovery of EJS v2&lt;/h3&gt;

&lt;p&gt;A few weeks ago, when tracking dependencies of fateserver on &lt;a href=&quot;https://david-dm.org/TimothyGu/fateserver-node&quot;&gt;David&lt;/a&gt;, I
saw EJS 2.0.2 was just published. As any good project maintainer would do, I
went to the tj/ejs GitHub repo, and saw a huge deprecation notice there,
saying that EJS v2 is now maintained in mde/ejs. After tinkering around a
little bit, I found out that mde/ejs was basically a reimplementation of TJ’s
EJS, originally called “Geddy JavaScript Web development framework”.
Interestingly, all (well, most, but now it’s all thanks to me ;) of the EJS
v1 APIs were there, but were
&lt;a href=&quot;https://github.com/mde/ejs/compare/08158fba446b09fc82116a3dcd6fc8abddda5163...v2.0.1&quot;&gt;ported to v2 in the last minute&lt;/a&gt;.
(Matthew is a really fast programmer).&lt;/p&gt;

&lt;h3 id=&quot;contributing&quot;&gt;Contributing&lt;/h3&gt;

&lt;p&gt;While trying to port my app over, I saw that quite a bit was missing from the
new implementation. One of those was the &lt;code class=&quot;highlighter-rouge&quot;&gt;_with&lt;/code&gt; option I depend upon for
enhanced performance. So I opened a &lt;a href=&quot;https://github.com/mde/ejs/pull/6&quot;&gt;PR&lt;/a&gt; for that.&lt;/p&gt;

&lt;p&gt;Similar to my experiences in Jade, as one of the first contributors to EJS
v2, @mde quickly gave me the maintainer permission to EJS as well. And then
I started &lt;a href=&quot;https://github.com/mde/ejs/commits/master?author=TimothyGu&quot;&gt;fixing a lot of things&lt;/a&gt; in EJS v2, making it almost completely
compatible to v1 (else than the filter stuff, which noone uses).&lt;/p&gt;

&lt;h3 id=&quot;performance-issues&quot;&gt;Performance issues&lt;/h3&gt;

&lt;p&gt;When benchmarking my app, I notice that the performance of it has
&lt;strong&gt;significantly&lt;/strong&gt; declined from EJS v1 (by ~70%). So I started optimizing it.
In EJS v2.2.1, two changes of mine made the template functions almost 4x
faster in some conditions. But still, it was slower than EJS v1 in more
complex apps, both in compilation and compiled functions (though not as much
as compilation).&lt;/p&gt;

&lt;h3 id=&quot;forking&quot;&gt;Forking&lt;/h3&gt;

&lt;p&gt;At last I pinned the slower performance in compilation to the overuse of
regexes and OOP in the new implementation, two issues to which there are no
good fixes. Without a second choice, I forked tj/ejs’s repo and started
backporting features in EJS v2 to that.&lt;/p&gt;

&lt;p&gt;I have to say that my backport worked fairly well. For compilation it is 1.1x
faster than EJS v1 and 3.52x than EJS v2. For template functions, it is almost
1.36x faster than EJS v2 in regular mode and 1.26x faster in &lt;code class=&quot;highlighter-rouge&quot;&gt;!_with&lt;/code&gt; mode,
albeit 32% slower than EJS v1 in extreme cases in regular mode.&lt;/p&gt;

&lt;p&gt;So I was hoping I could merge my branch to EJS v2, but @mde said (in private):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’m really not a fan of the dense, acrobatic code in TJ’s repo. If it’s
hard for me to figure out, it would also make it hard for people in the
community.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So no, we ain’t gonna merge it. Do note that what he said is 100% true. TJ’s
code is, for a lack of a better word, godly, both godly fast and godly
spaghetti. But for me, at least, @mde’s implementation basically splits &lt;em&gt;one&lt;/em&gt;
function in TJ’s implementation to something like 7 plus an enum, most of as
simple as heck, but the 3 most important functions no less spaghetti IMO as
TJ’s. True, TJ’s &lt;code class=&quot;highlighter-rouge&quot;&gt;parse()&lt;/code&gt; is &lt;em&gt;long&lt;/em&gt;, but that doesn’t mean it’s harder to
read. Rather, it is easier for me because you don’t need to jump back and
forth to look at the three functions doing some very procedural things.&lt;/p&gt;

&lt;p&gt;As a result, I officially forked the package, to a very creative name
&lt;a href=&quot;https://www.npmjs.com/package/ejs-tj&quot;&gt;ejs-tj&lt;/a&gt;. I will keep maintaining both forks though. For my fork, I
intend to keep compatibility with EJS v2 forever (within my lifespan and
mde/ejs’s), so I even decided to use the same version numbers as EJS v2’s.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Node.js is really a world of endless wonders, friendly developers, and
unlimited job opportunities. I shall continue in my journey to the mastery of
the JavaScript language and the environment of Node.js.&lt;/p&gt;

&lt;p&gt;EDIT: &lt;del&gt;why did I put the last sentence here?&lt;/del&gt; Removed&lt;/p&gt;

&lt;p&gt;EEDIT: copyedits&lt;/p&gt;
</description>
        <pubDate>Sat, 24 Jan 2015 00:00:00 +0000</pubDate>
        <link>https://timothygu.github.io/2015/01/24/node-js/</link>
        <guid isPermaLink="true">https://timothygu.github.io/2015/01/24/node-js/</guid>
      </item>
    
      <item>
        <title>Google Code-In 2014</title>
        <description>&lt;p&gt;&lt;a href=&quot;//developers.google.com/open-source/gci/&quot;&gt;Google Code-In 2014&lt;/a&gt; started a few weeks ago. It is basically a
competition open to all students in high school or lower, to contribute in
open-source projects. There are twelve OSS institutions who got picked my
Google this year, most of them were in last year’s GCI too:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Apertium&lt;/li&gt;
  &lt;li&gt;BRL-CAD&lt;/li&gt;
  &lt;li&gt;Copyleft Games&lt;/li&gt;
  &lt;li&gt;Drupal&lt;/li&gt;
  &lt;li&gt;FOSSASIA&lt;/li&gt;
  &lt;li&gt;Haiku&lt;/li&gt;
  &lt;li&gt;KDE&lt;/li&gt;
  &lt;li&gt;Mifos Initiative&lt;/li&gt;
  &lt;li&gt;OpenMRS&lt;/li&gt;
  &lt;li&gt;Sahana Foundation&lt;/li&gt;
  &lt;li&gt;Sugar Labs&lt;/li&gt;
  &lt;li&gt;Wikimedia Foundation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I myself started doing Google Code-In last year as a 9&lt;sup&gt;th&lt;/sup&gt; grader. To
be honest, when I started GCI last year, I only knew two of the organizations.
Yes, two: KDE and Wikimedia. They all seem to be fairly good-sized though, and
have a large support network for newcomers.&lt;/p&gt;

&lt;p&gt;The competition itself is organized into individual “tasks,” and the number of
tasks completed determines the prizes you can get (see next section).&lt;/p&gt;

&lt;h2 id=&quot;competition-details&quot;&gt;Competition Details&lt;/h2&gt;

&lt;p&gt;Table time.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;# of tasks completed&lt;/th&gt;
      &lt;th&gt;Prize&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;Nothing&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;Student&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;A certificate (~$2&lt;sup&gt;***&lt;/sup&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;Participant&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;A T-shirt (~$14 &lt;sup&gt;***&lt;/sup&gt;)&lt;/td&gt;
      &lt;td&gt;Ditto&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;em&gt;x&lt;/em&gt;&lt;sup&gt;*&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;A sweatshirt (~$35 &lt;sup&gt;***&lt;/sup&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;Finalist&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;em&gt;y&lt;/em&gt;&lt;sup&gt;**&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;A trip to Mountain View, CA&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;Grand Prize Winner&lt;/em&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt;:  a moderately large natural number, always greater than 3.
Always equal to the number of tasks completed by the fifth most productive
student of a project.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;**&lt;/sup&gt;: a very large natural number, almost always greater than &lt;em&gt;x&lt;/em&gt;.
Always equal to the number of tasks completed by the second most productive
student of a project.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;***&lt;/sup&gt;: estimated by &lt;a href=&quot;https://developers.google.com/open-source/gci/resources/contest-rules&quot;&gt;Google&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;last-year&quot;&gt;Last Year&lt;/h2&gt;
&lt;p&gt;Last year, I participated in the event as well, getting a certificate and a
T-shirt:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://timothygu.github.ioimages/2014-12-29-google-code-in-2014/gci-2013-tshirt.jpg&quot; alt=&quot;GCI 2013 T-shirt&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Guess the number of tasks I did: 3. Just enough to get the shirt and brag
about it (I didn’t actually brag about it to be honest).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;How the heck can you do only 3 tasks????? You are Timothy!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because I:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;was sick,&lt;/li&gt;
  &lt;li&gt;had to do homework for the finals (I was in a different high school then),
and&lt;/li&gt;
  &lt;li&gt;had a trip.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;this-year&quot;&gt;This Year&lt;/h2&gt;

&lt;h3 id=&quot;beginning&quot;&gt;Beginning&lt;/h3&gt;

&lt;p&gt;This year, I;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;don’t have a trip,&lt;/li&gt;
  &lt;li&gt;have finals &lt;em&gt;during&lt;/em&gt; GCI, which is a good thing as I don’t study for finals
unless someone forces me to, and there is no such person &lt;em&gt;during&lt;/em&gt; the
finals, and&lt;/li&gt;
  &lt;li&gt;am not sick.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I registered very early, asked my mom to sign the permission slip, and got
ready to actually do something this year. Last year, you have to wait until
you are verified in order to do &lt;em&gt;any&lt;/em&gt; task, but this year, Google improved
their technique and says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;* Note: Your forms will be reviewed and verified after you complete your
first task.&lt;/strong&gt; Please do not wait to claim a task until your forms are
verified, Program Administrators will not review a student’s forms until the
student has completed their first task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thing is, I didn’t see this passage. So for about 2 weeks I was waiting for
Google to verify my high school credentials. Finally a righteous soul on
&lt;a href=&quot;irc://irc.freenode.net/#gsoc&quot;&gt;irc://irc.freenode.net/#gsoc&lt;/a&gt; told me that they changed the policies.&lt;/p&gt;

&lt;p&gt;Major oops.&lt;/p&gt;

&lt;h3 id=&quot;tasks&quot;&gt;Tasks&lt;/h3&gt;

&lt;p&gt;As my first task, I just picked a &lt;a href=&quot;//www.google-melange.com/gci/task/view/google/gci2014/5340702611341312&quot;&gt;random one&lt;/a&gt; regarding packaging, and it
turned out to be from Haiku, a free operating system reimplementing the
&lt;a href=&quot;//upload.wikimedia.org/wikipedia/en/a/ae/BeOS_Desktop.png&quot;&gt;BeOS&lt;/a&gt;, a pretty, simple and fast OS (compared to Windows 2000/ME, that
is). Because of my background in Debian packaging (I used to ran an Ubuntu PPA
– until I stopped maintaining it) and my involvement in &lt;a href=&quot;http://mxe.cc&quot;&gt;MXE&lt;/a&gt;, the task
was pretty simple for me.&lt;/p&gt;

&lt;p&gt;I spent an entire afternoon trying to set up the operating system correctly in
VirtualBox. So here’s what I did, in a Timothy-style list:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Download latest release of Haiku&lt;/li&gt;
  &lt;li&gt;Set up a new VM&lt;/li&gt;
  &lt;li&gt;Boot&lt;/li&gt;
  &lt;li&gt;Do steps on the package managers’ website to set up a packaging toolchain&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;mkdir&lt;/code&gt; a missing dir&lt;/li&gt;
  &lt;li&gt;Adding the &lt;code class=&quot;highlighter-rouge&quot;&gt;PATH&lt;/code&gt; to my &lt;code class=&quot;highlighter-rouge&quot;&gt;.bashrc&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Found out the packager doesn’t work on the alpha release&lt;/li&gt;
  &lt;li&gt;Download latest nightly build of Haiku&lt;/li&gt;
  &lt;li&gt;Same as #2&lt;/li&gt;
  &lt;li&gt;Same as #3&lt;/li&gt;
  &lt;li&gt;Same as #4&lt;/li&gt;
  &lt;li&gt;Kernel debugger appears, random error messages appear&lt;/li&gt;
  &lt;li&gt;Found out they were complaining about my disk being full&lt;/li&gt;
  &lt;li&gt;Try to adjust the VB disk size&lt;/li&gt;
  &lt;li&gt;Same as #3&lt;/li&gt;
  &lt;li&gt;Find Haiku doesn’t recognize the additional space (they weren’t formatted)&lt;/li&gt;
  &lt;li&gt;Repeat 14-16 for about 3 times&lt;/li&gt;
  &lt;li&gt;Give up&lt;/li&gt;
  &lt;li&gt;Found out an &lt;a href=&quot;//www.haiku-os.org/guides/virtualizing/virtualbox&quot;&gt;article&lt;/a&gt; &lt;strong&gt;WRITTEN SPECIFICALLY FOR THIS&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Hit myself in the head&lt;/li&gt;
  &lt;li&gt;Do the steps in the article:
a. Same as #8 –&amp;gt; #2
b. Add additional disk
c. Format &amp;amp; mount additional disk
d. Do stuff with &lt;code class=&quot;highlighter-rouge&quot;&gt;cp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Ready-to-use OS (after ~6 hours)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Then&lt;/strong&gt; I started actually doing the task.&lt;/p&gt;

&lt;p&gt;After I finished this first one I saw there are some so-called &lt;em&gt;beginner
tasks&lt;/em&gt; that are designed to help beginners (&lt;em&gt;me&lt;/em&gt;) set up their VMs.&lt;/p&gt;

&lt;p&gt;&amp;lt;ol start=107&amp;gt;&lt;/p&gt;
&lt;li&gt;Same as #20&lt;/li&gt;
&lt;p&gt;&amp;lt;/ol&amp;gt;&lt;/p&gt;

&lt;h3 id=&quot;looking-forward&quot;&gt;Looking Forward&lt;/h3&gt;

&lt;p&gt;Judging plainly from the &lt;a href=&quot;http://ematirov.tk/&quot;&gt;Unofficial GCI Leaderboard&lt;/a&gt;, it is not likely
that I would be able to be one of the top two – the grand prize winners. But
I will try to keep myself in the first five of the Haiku project though. A
sweatshirt is always better than a T-shirt, &lt;em&gt;对不?&lt;/em&gt; ;)&lt;/p&gt;

</description>
        <pubDate>Mon, 29 Dec 2014 00:00:00 +0000</pubDate>
        <link>https://timothygu.github.io/2014/12/29/google-code-in-2014/</link>
        <guid isPermaLink="true">https://timothygu.github.io/2014/12/29/google-code-in-2014/</guid>
      </item>
    
      <item>
        <title>Website</title>
        <description>&lt;p&gt;Finally, I decided to make myself a website on GitHub Pages. After browsing
through &lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;a repo full of themes&lt;/a&gt;, I decided to
pick this one by &lt;a href=&quot;https://github.com/johnotander&quot;&gt;@johnotander&lt;/a&gt;. I hope
I’ll find some time to add more stuff to it, but for now, hope you like it!&lt;/p&gt;
</description>
        <pubDate>Sun, 14 Dec 2014 00:00:00 +0000</pubDate>
        <link>https://timothygu.github.io/2014/12/14/website/</link>
        <guid isPermaLink="true">https://timothygu.github.io/2014/12/14/website/</guid>
      </item>
    
  </channel>
</rss>
