<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>roowii.net</title>
	<atom:link href="http://roowii.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://roowii.net</link>
	<description></description>
	<lastBuildDate>Sun, 12 Feb 2012 22:13:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>My Take on Jeremy Lin</title>
		<link>http://roowii.net/blog/my-take-on-jeremy-lin/</link>
		<comments>http://roowii.net/blog/my-take-on-jeremy-lin/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 22:07:14 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Commentary]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=701</guid>
		<description><![CDATA[Danny Chau wrote a personal reflection on Jeremy Lin in an article referenced by ESPN today. Many props to ESPN for linking to a piece of writing not overtly about sports. In it he characterized Lin as the reconciliation of old-school Asian values and American individualism: Jeremy Lin has done this, and it’s why he’s [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_706" class="wp-caption alignnone" style="width: 341px"><br /><a href="http://roowii.net/wp-content/uploads/2012/02/5095553745_c930fb9faf.jpg"><img src="http://roowii.net/wp-content/uploads/2012/02/5095553745_c930fb9faf.jpg" alt="" title="Jeremy Lin" width="331" height="500" class="size-full wp-image-706" /></a><p class="wp-caption-text">From Kimberly N on Flickr</p></div>
<p>Danny Chau wrote <a href="http://www.hardwoodparoxysm.com/2012/02/what-i-see-in-jeremy-lin/" target="_blank">a personal reflection on Jeremy Lin</a> in an article referenced by ESPN<br />
today. Many props to ESPN for linking to a piece of writing not overtly about sports. In it he characterized Lin as the reconciliation of old-school Asian values and American individualism:</p>
<blockquote><p>Jeremy Lin has done this, and it’s why he’s so important. He proves there’s another way. Watching Lin knife into the lane and score over soaring giants, it’s impossible to imagine him doing anything else with his life. But it could have been so different. His entire basketball career prior to this remarkable week has been a cyclical routine of underappreciation and invisibility. He could have left it all. We know about his Harvard degree in economics. But he had the courage and resolve to stick to his dream. And that’s where the ethnocentrism melts away and the purity of his story emerges.</p></blockquote>
<p>I found it interesting and a bit disheartening to see how all the complexities of identity and culture can be so easily distilled into this convenient Ivy-League-application-essay worthy narrative about honoring tradition and finding your own route. Chau, in praising Lin for becoming the symbol for generations of Asian Americans, is covertly illuminating the hidden frustrations of an American subculture. So many of us have our hopes pinned on the success of a single underdog because we see in his struggles some semblance of our own trials in life as ethnic minorities. But to declare Lin&#8217;s triumphs as the model path to self-actualization is to caricature the diversity of culture amongst Asian Americans.</p>
<p>It is hard to dispute that much of the rhetoric around a Harvard underdog rising to the level of a NBA point guard adheres to, or at the very least, gives nod to the model minority stereotype (the way Chau&#8217;s piece does). Here is a Taiwanese-American Christian kid from Palo Alto who overcomes all this adversity and overt racism through hard work and determination to become an awesome baller. It may be that basketball is not a stereotypical &#8220;Asian&#8221; activity the way SAT-studying is but from the way media announcers have been talking about Lin, they seem to be one and the same. Not a day goes by without a sportscaster opining about the &#8220;court intelligence&#8221; that Lin has and the way he is a humble team player. The bit about him coming from Harvard gets talked about once every five minutes.</p>
<p>Call it a reflection of my inner insecurities but it sure feels like people are fitting Lin into the convenient guide to how minorities can succeed in America. If you want to succeed in something people of your color aren&#8217;t expected to succeed in: work hard, endure racist jeering (which would never be overly tolerated if used against an athlete of another color), deal with setbacks and underestimations of your ability at every level of competition, and wait for your big break when somebody finally notices you.</p>
<p>I am not railing against Jeremy. Part of me is immensely proud that an Asian American has finally broken through this artificial color-culture barrier in the NBA. Jeremy is his own man and he has every right to be proud of what he has done.</p>
<p>Yet, part of me wishes America&#8217;s renewed attention towards the Asian Amercians who live in its midst wouldn&#8217;t take on the tone of perpetuating age-old model-minority stereotypes. The dialogue has to move beyond &#8220;reconciling tradition and individualism&#8221; to become something more nuanced. Just as there are Asian Americans who live every day forced to confirm or abandon their traditions, there must be many more who delineate themselves along other spectrums of culture, be they political, religious, or economic. Jeremy Lin should be the start and not the end of a longer process of discovering the artists, writers, activists, and politicians who all have a hand in shaping our society in different ways.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/my-take-on-jeremy-lin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Never let me go</title>
		<link>http://roowii.net/blog/never-let-me-go/</link>
		<comments>http://roowii.net/blog/never-let-me-go/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 02:35:12 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=682</guid>
		<description><![CDATA[Cover photo from GoodReads.com I&#8217;ve been on a book-reading marathon lately&#8230; 3 books finished in a month. These are more books than I read in the months leading up to August. While the first two works of nonfiction (The Dirty Life, The Immortal Life of Henrietta Lacks) had been special in their own little ways, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://photo.goodreads.com/books/1165592008l/6334.jpg" alt="Never Let Me Go" /></p>
<p class="wp-caption-text">Cover photo from <a href="http://www.goodreads.com/" target="_blank">GoodReads.com</a></p>
<p>I&#8217;ve been on a book-reading marathon lately&#8230; 3 books finished in a month. These are more books than I read in the months leading up to August. While the first two works of nonfiction (<a href="http://www.amazon.com/Dirty-Life-Farming-Food-Love/dp/1416551603" target="_blank">The Dirty Life</a>, <a href="http://www.amazon.com/Immortal-Life-Henrietta-Lacks/dp/1400052181/ref=sr_1_1?s=books&#038;ie=UTF8&#038;qid=1315362110&#038;sr=1-1" target="_blank">The Immortal Life of Henrietta Lacks</a>) had been special in their own little ways, it has been a while since I&#8217;ve been so thoroughly engrossed and disturbed by a novel like <a href="http://www.amazon.com/Never-Movie-Tie--Vintage-International/dp/0307740994/ref=sr_1_1?s=books&#038;ie=UTF8&#038;qid=1315362190&#038;sr=1-1" target="_blank">Never Let Me Go</a>.</p>
<p>Be warned. I make no apologies here for spoiling the story for the lot of you who haven&#8217;t read the book. <strong>This entry isn&#8217;t supposed to be a review so much as a critical analysis.</strong> If you intend to read the novel at some point, don&#8217;t read what I have to say. Just head on over to the Kindle bookstore and download a copy. There&#8217;s no point in wasting time.</p>
<p>Disclaimer aside, I&#8217;d like to just give my thoughts on some of the themes and motifs of Kazuo Ishiguro&#8217;s little masterpiece.</p>
<h3>Our invisible boundaries of ignorance</h3>
<p>Margaret Atwood wrote in <a href="http://www.slate.com/id/2116040/" target="_blank">her review of the book</a> in Slate:</p>
<blockquote><p>One motif at the very core of Never Let Me Go is the treatment of out-groups, and the way out-groups form in-groups, even among themselves.</p></blockquote>
<p>One of Ishiguro&#8217;s most salient themes throughout the book came by the way he contrasted the microcosmic student universe of Hailsham with the wider world. Where the boarding school had its cliques and groups of outcasts, the greater society to which it barely belonged saw Hailsham itself as the place for outcasts.</p>
<p>Many reviewers asked why the Hailsham students didn&#8217;t run, so as to match the happy endings of other dystopian novels. This omission isn&#8217;t so much a mistake on Ishiguro&#8217;s part as much as deliberate commentary on the invisible bubble we all live in. The students did not run because they could not run&#8230; or rather, could not conceive of running. To them, the only freedom they had came by way of permission from the Madame, which was freedom granted, not taken. In this sense, Ishiguro makes the claim that though our reality is shaped by personal decision, those decisions cannot transgress the circumstances through which they have been informed.  </p>
<p>In the end, the students had been misled by lies to such a degree whereby even their hopes (to have life extended a few more years) come off as pathetic and inconsequential. Pondering this theme, I was reminded of the stories of China&#8217;s Yangtze River farmers who, faced with the destruction of their livelihoods and community, haggled with local officials over the money paid for relocation. As one commentator noted, by having the downtrodden focus on the inconsequential challenges of daily life, the authorities can avoid a revolution.</p>
<h3>Life is the journey, not the destination</h3>
<p>Miss Emily and Miss Lucy played to these dueling viewpoints. Miss Lucy, in all her desire to tell the students what they should&#8217;ve learned all long, represented the idea that life only has meaning if our fate (our destination) is free to choose. What was the point of living such bucolic, carefree childhoods if the students were to be <em>tricked</em> into donating their vital organs after leaving Hailsham? Was it moral to help the children avoid the greater truth of donations in order to give them a childhood?</p>
<p>Miss Emily seemed to think so. In a message reminiscent of carnivorous but humane animal rights activists promoting cage-free grazing for cows, Miss Emily believes that despite a shortened life, every minute of a clone&#8217;s life could be lived to the fullest. She claimed it was Hailsham who gave them a life worth living, even if it meant the truth had to be hidden for so long.</p>
<h3>Material possessions</h3>
<p>Many of the book&#8217;s passages describe the events surrounding Sales and Exchanges, the only places where students may acquire material possessions. On the other hand, there is little description of the characters&#8217; physical appearances&#8230; and even less about their bodies. This again, was not an accident.</p>
<p>Ishiguro drew focus to the books, cassettes, paintings, and puzzles as these were the only ways students could express themselves. They became attached to worldly objects, the inanimate trinkets which could survive when their own bodies couldn&#8217;t. Because the students did not really possess their bodies, objects were the only way they could maintain a tenuous bond to the world, even if the world they witnessed was but a shell of all that was hidden from them.</p>
<p>&#8211;</p>
<p>Needless to say, I really enjoyed Never Let Me Go. The prose was difficult and tedious to read at times. Yet when it was all over, the novel left behind so many questions to ponder. It is the mark of great science fiction to alter reality just enough so as to illuminate the fundamental parts of being human.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/never-let-me-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lessons from Ikea</title>
		<link>http://roowii.net/blog/lessons-ikea/</link>
		<comments>http://roowii.net/blog/lessons-ikea/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 02:14:42 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Commentary]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=669</guid>
		<description><![CDATA[Konie and I hit up the quintessential young adult furniture store last week: Ikea. If you&#8217;ve never been 20-something, cheap, and in need of furnishing a one-bedroom apartment, you&#8217;ve never been to Ikea. For the other 95% of us who&#8217;ve learned to work, sleep, and play on pulp-recycled wood, Ikea is a godsend. It is [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_675" class="wp-caption alignnone" style="width: 610px"><img src="http://roowii.net/wp-content/uploads/2011/08/freden.png" alt="" title="freden" width="600" height="229" class="size-full wp-image-675" /><p class="wp-caption-text">First page of Ikea&#039;s Freden assembly instructions</p></div>
<p>Konie and I hit up the quintessential young adult furniture store last week: Ikea. If you&#8217;ve never been 20-something, cheap, and in need of furnishing a one-bedroom apartment, you&#8217;ve never been to Ikea. For the other 95% of us who&#8217;ve learned to work, sleep, and play on pulp-recycled wood, Ikea is a godsend.</p>
<p>It is not every year a young couple goes to Ikea. Most of the time, unsoft, non-cushiony shit can be picked up from your friendly Craigslist neighbor. But for mattresses, couches, and chairs (basically anything you&#8217;d put part of your body on), how could you trust that the last owner wiped his ass clean and remembered to wash the sheets every month? You can&#8217;t.</p>
<p>Last Sunday, we rented out a Toyota Tacoma ZipCar for 24-hours and drove the 40 minutes to Ikea Stoughton. Stoughton is a furniture town in every sense of the word. It&#8217;s as if a cottage industry sprung up around Ikea so that whenever a shopper couldn&#8217;t find a piece in white, black, or dark brown, she&#8217;d just try again in one of the other dozen furniture stores.</p>
<p>At Ikea, we wandered up the down the aisles, lying on every mattress, opening every drawer, feeling the texture of every fabric before taking our long list of pencil-etched aisle/bin pairs down to the ground floor … where the hard work of loading up factory-packed cardboard boxes began.</p>
<p>Ikea is genius in that way. The 2nd and 3rd floors are purely aspirational. &#8220;Weww, you think that media center would go well with our bookcase?&#8221; Once you&#8217;re done touring and are ready to go, they lead you to the ground floor, which is as close to hell as you&#8217;d ever get in a furniture store. &#8220;Goddd, the media center comes in 4 large boxes … and we still have to put it together!&#8221;</p>
<p>At the end of our struggle picking up 10+ boxes filled with the appendages of a desk, a queen-sized bed, coffee tables, a money tree, and dozens of &#8220;necessities&#8221;, we realized even a pickup truck was not enough to carry all this plus a mattress and a sofa-bed. We&#8217;d have to make another trip.</p>
<p>We drove home, unloaded the ridiculously heavy boxes, argued about where to put them, drank some water, then drove back to Stoughton. At this point, both of us were exhausted and cranky. </p>
<p>It was 45 minutes before closing time when we got the mattress and started waiting on the sofa bed in the furniture pickup area. (reserved for special items) For the next hour, we sat there among screaming toddlers and impatient college kids and feasted on 50-cent hot dogs (how??), medium-sized soda, and pizza that tasted like it came out of an elementary school cafeteria. At the end of the hour, I was bewildered by how the employees could force us to wait so long for something that would&#8217;ve taken them 10 minutes to fetch.</p>
<p>When we finally got the piece, it came in 4 gigantic boxes piled up so high Yao Ming couldn&#8217;t see his way over the cart. I cried in despair.</p>
<p>Just then, the pickup area girl said that if I didn&#8217;t want to bring it home myself, delivery was only $59. I was like … are you screwing with me or do you just feel sorry for me? Neither. It turns out Ikea delivery is a flat $59 for unlimited items anywhere in the Boston metro area. </p>
<p>I felt as if a vengeful deity had been laughing at me all these years. For my last 3 apartments, I&#8217;ve rented trucks and UHauled all this shit by hand. Now they were telling me I could&#8217;ve paid less than the rental to have stronger men do it for me? Sigh … lesson learned.</p>
<p>Once I recover from the trauma of putting together all this furniture and getting my new place in shape, I&#8217;ll post some pictures.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/lessons-ikea/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>DC and Colonial Williamsburg</title>
		<link>http://roowii.net/blog/dc-and-williamsburg/</link>
		<comments>http://roowii.net/blog/dc-and-williamsburg/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 02:58:22 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=630</guid>
		<description><![CDATA[PHOTO GALLERY: DC and Colonial Williamsburg This is a long-overdue travel entry about my trip to Washington DC and Colonial Williamsburg back in April. Konie had a week off and I was in need of a break. So we decided to do something totally corny… like visit the nation&#8217;s capital and watch people live like [...]]]></description>
			<content:encoded><![CDATA[<div class="open-gallery" style="background: url(http://roowii.net/wp-content/uploads/2011/07/IMG_4345.jpg) no-repeat -20px -30px;">
<span>PHOTO GALLERY: DC and Colonial Williamsburg</span></p>
<div class="overlay" style="display: none;">
<a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4102.jpg" rel="prettyPhoto[dc]" caption="Guy (real name) met us at Nando for lunch. Tasty South African spiced grilled chicken. Highly recommended if you're in downtown DC."></a>
</div>
</div>
<div style="display: none;">
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4115.jpg" rel="prettyPhoto[dc]" caption="Konie in front of the Portrait Art Museum. Very boring sounding. Didn't go in."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4120.jpg" rel="prettyPhoto[dc]" caption="Chinatown has no Chinese people in it. They all left after race riots during the 1960s. In an attempt to bring back some of them, stores put up Chinese translations."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4137.jpg" rel="prettyPhoto[dc]" caption="DC was a very neat town. Clean and not too busy."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4148.jpg" rel="prettyPhoto[dc]" caption="The side of a building in the government center area. I don't know which it is. They're all built like this."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4154.jpg" rel="prettyPhoto[dc]" caption="Konie, in aviator shades and 80s style leather jacket."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4173-Edit.jpg" rel="prettyPhoto[dc]" caption="We took a nighttime tour of the monuments. Here's one of the Lincoln Memorial."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4176.jpg" rel="prettyPhoto[dc]" caption="The man looking solemn."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4192.jpg" rel="prettyPhoto[dc]" caption="The Iwo Jima war memorial."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4208-Edit.jpg" rel="prettyPhoto[dc]" caption="What you don't see here of 1600 Pennsylvania are all the protestors camped out across the street."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4222.jpg" rel="prettyPhoto[dc]" caption="We visited the postal museum. Did you know I used to collect stamps?"></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4240.jpg" rel="prettyPhoto[dc]" caption="A 3/4 view of the Congress building."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4242.jpg" rel="prettyPhoto[dc]" caption="In front of Congress."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4308.jpg" rel="prettyPhoto[dc]" caption="The latter part of our trip was spent in Colonial Williamsburg. Why this was so much cooler when I was 12 makes no sense."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4332.jpg" rel="prettyPhoto[dc]" caption="The Governor House's garden maze. After the Richardson Farm corn maze in Illinois, I dare not try another one."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4337.jpg" rel="prettyPhoto[dc]" caption="How did that f*cker get in the tree?"></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4345.jpg" rel="prettyPhoto[dc]" caption="Living replicas had a square dance in the street."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4350.jpg" rel="prettyPhoto[dc]" caption="Not too excited here."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4357.jpg" rel="prettyPhoto[dc]" caption="Williamsburg has a 2-hour long re-enactment of how the Revolutionary War started in Virginia every afternoon."></a></p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/IMG_4366-Edit.jpg" rel="prettyPhoto[dc]" caption="The Governor speaking to the masses."></a></p>
</div>
<p>This is a long-overdue travel entry about my trip to Washington DC and Colonial Williamsburg back in April. Konie had a week off and I was in need of a break. So we decided to do something totally corny… like visit the nation&#8217;s capital and watch people live like 18th-century farmers. Very schoolchildish. I know.</p>
<p>The trip ended up being quite pleasant. As much crap as people give DC for being poor and dangerous, we didn&#8217;t see much of that there. For one, the entire area which enclosed the federal government buildings (Congress, Supreme Court, Fed) were closed off to random cars. Only tour buses and people on foot were allowed to pass through. This made for a relaxing afternoon stroll through largely empty mile-long blocks of marble-columned buildings. Very neat and great for photos.</p>
<p>We stayed at a bed-and-breakfast in DC (<a href="http://www.dcinns.com/woodley.html" target="_blank">The Woodly Park Guest House</a>). It wasn&#8217;t really a B&#038;B as there was only toast, eggs, and coffee for breakfast. Nobody really tried cooking and I was sure the toast was Costco. But we did get to talk to a bunch of politically-oriented people at breakfast. There was apparently a local-government conference being hosted at the Mariott next door and everybody from lobbyists and small-town government administrators showed up. At our table was a small-town city guy who was previously a nuclear engineer. And as April was the month of the Japanese power plant meltdown, he gave us an in-depth analysis of what exactly went wrong.</p>
<p>We left the following morning for a 3 hour drive down to <a href="http://www.history.org/" target="_blank">Colonial Williamsburg</a>. Contrary to my original belief, people there didn&#8217;t all dress up like historical replicas and walk around speaking Old English. There was a yuppie-ish downtown area complete with toy shops, candy stores, and nice restaurants. We ate an exceptional meal at <a href="http://www.fatcanarywilliamsburg.com/" target="_blank">Fat Canary</a>, a somewhat upscale American place.</p>
<p>Watching historical replicas interact turned out to be not as much fun as I had imagined (or as I had remembered from my previous trip there in high school). We walked around farm trails, watched lumberjacks saw tree trunks, drank some homemade hot cider, listen to this lady talk about an imaginary dance for an hour, watched a bit of a historical re-enactment of the Revolutionary War, got bored and left.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/dc-and-williamsburg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Chrome Extension: Agile development with backend content scripts</title>
		<link>http://roowii.net/blog/backend-content-scripts/</link>
		<comments>http://roowii.net/blog/backend-content-scripts/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 01:38:07 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=615</guid>
		<description><![CDATA[Over the past few weeks working at Yesware, I&#8217;ve been developing and enhancing a new architecture for Javascript in Chrome extensions. Traditionally, any content scripts (functionality &#8220;injected&#8221; into a webpage) are packaged along with the other static files in an extension package (.crx or .zip). For the most part, this works fine as static files [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past few weeks working at <a href="http://www.yesware.com/" target="_blank">Yesware</a>, I&#8217;ve been developing and enhancing a new architecture for Javascript in Chrome extensions. Traditionally, any content scripts (functionality &#8220;injected&#8221; into a webpage) are packaged along with the other static files in an extension package (.crx or .zip). For the most part, this works fine as static files don&#8217;t need to change so often. Casual Chrome extensions are updated at most once every few weeks. And when they do, the Chrome Web Store handles updating client browsers automatically.</p>
<p>Where the release model breaks down is if the static code needs to be updated frequently in response to rapidly changing requirements and/or developers don&#8217;t have the luxury of the Chrome Web Store, being forced to package and distribute .crx files manually. This is often the case when the product targets an evolving and unpredictable platform and hasn&#8217;t been widely released to the public. This was exactly the challenge the Yesware chrome extension ran into over the course of 4 releases. We were finding that users abused the Gmail interface in ways we hadn&#8217;t expected but absolutely needed to respond to. We needed to be able to change the code according to differences in themes, installed 3rd party extensions, and Google Labs features quickly and without unnecessary disruption. Users were being willing participants of a beta test and it wasn&#8217;t reasonable for us to ask them to constantly download hotfixed and patched versions of the extension.</p>
<p>Our CTO and I devised an architecture to serve what would normally be packaged Javascript and CSS through a backend interface. The following is a schematic of the new design:</p>
<p><a href="http://roowii.net/wp-content/uploads/2011/07/Agiledevelopmentwithbackendcontentscripts-copy.png"><img src="http://roowii.net/wp-content/uploads/2011/07/Agiledevelopmentwithbackendcontentscripts-copy.png" alt="" title="Schematic" width="600" class="alignnone size-full wp-image-622" /></a></p>
<p><code>packed.css</code> and <code>packed.js</code> are combined and minified (possibly obfuscated) versions of all the styles and Javascript to be used by the frontend. The CSS, in particular, should have as few external references to images as possible. I&#8217;ve tried to base64 encode any small images so that users won&#8217;t have to wait for .pngs to load before seeing backgrounds and specialized borders. Using <a href="http://sass-lang.com/" target="_blank">Sass</a>, it was really easy to break out images into their own file, then use a single <code>master.scss</code> file to do the combination.</p>
<p>Both files are loaded using versioned URLs so that the extension can determine for itself when would be a good time to pull fresh files. In additional, as the <code>background.html</code> page is only loaded once when the browser and extension first load, there shouldn&#8217;t be much latency upon script injection. When new versions of <code>packed(.css/js)</code> get uploaded, the user will receive the updates when he restarts the browser.</p>
<p>Thus far, we&#8217;ve pushed one release using the new architecture and everything&#8217;s been going dandy. It cuts down on the stress of getting every feature perfect before pushing code since there&#8217;re usually cases we&#8217;ve missed during development testing. Furthermore, being able to get users the latest bug fixes and feature updates without waiting for a release deadline or asking users to download files is very empowering. Faster iterations, more helpful feedback, better product.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/backend-content-scripts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Joining the cult of Apple</title>
		<link>http://roowii.net/blog/cult-of-apple/</link>
		<comments>http://roowii.net/blog/cult-of-apple/#comments</comments>
		<pubDate>Mon, 30 May 2011 01:10:41 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Commentary]]></category>
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=593</guid>
		<description><![CDATA[After receiving my bonus in December, I made a very conscious choice to buy my first Mac. Granted, I&#8217;ve been an early adopter of some Apple products before (the first-gen iPod, the iPad). But to embrace the possibility of switching to Mac OS X for personal use was a step I had always refused to [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://roowii.net/wp-content/uploads/2011/05/macbook-air.png" alt="" title="MacBook Air" width="575" class="alignnone size-full wp-image-600" style="margin-bottom: 10px;" /></p>
<p>After receiving my bonus in December, I made a very conscious choice to buy my first Mac. Granted, I&#8217;ve been an early adopter of some Apple products before (the first-gen iPod, the iPad). But to embrace the possibility of switching to Mac OS X for personal use was a step I had always refused to take. In my mind, Apple Inc. was the symbol of opaque software development. They control the entire stack of components, from CPUs, to motherboards, monitors, operating systems, and app approval processes. In my mind, their methodologies ran counter to everything the rest of the industry was doing in terms of open sourcing software and making code more transparent. I philosophically opposed them and refused to buy more than the requisite products every young adult needed to be cool.</p>
<p>All this mental consumer-blocking gave way late last year as I was looking at hardware for my new laptop. It became obvious that the MacBook line was way ahead of the crap most consumer-PC manufacturers were turning out for a few hundred less. The 13&#8243; MacBook Air in particular, was a great bargain if you looked it objectively. The slimmest general purpose laptop on earth had a 1440&#215;900 LED display, a standard 128GB SSD, around 5 hours of battery life, and ran on an Intel Core2 Duo CPU. It was this last fact that hooked me. A MacBook running Intel was capable of running Windows 7 alongside Mac OS. Which meant that even if I didn&#8217;t quite agree with OS X, I&#8217;d always have Windows to fall back on. I would be buying the laptop for the hardware.</p>
<p>I started off using Windows 7 almost exclusively, relegating OS X to the role of freakish curiosity. When I felt adventurous, I would boot it up and type in a few Unix commands in the terminal, just to relive my Debian Linux days at Intel. After a while of this, I&#8217;d retreat back to the comfort of the Start Menu, .NET, and Visual Studio.</p>
<p>This all changed again when I began to learn Rails. The barriers to having Rails, Heroku, and Git play nice on Windows ended up being too high. Once I started using OS X however, I began to find better ways to adapt the interface to be more responsive and easier to navigate. I also started to look at email, Twitter, and Facebook equivalents of Windows apps. I found that many of the dev tools I relied on (WebStorm, RubyMine) were either cross-platform or ran better on Macs to begin with. It was also astounding how much respect I gained for the stuff developers wrote for the platform. Since OS X was developed to be sexier, the apps which came out for it turned out to be prettier, more refined, and simpler than the &#8220;diverse&#8221; library of Windows software.</p>
<p>Last weekend, I deleted the Windows partition on my MacBook to gain an extra 60GB of space to install more apps. I have officially become a member of the cult.</p>
<p>If you&#8217;re interested, here is a list of the tools and apps I&#8217;ve found most useful on Mac OS X. Most are free but the paid ones are definitely worth every penny.</p>
<p>&#8211;</p>
<p><a href="http://www.parallels.com/products/desktop/" target="_blank">Parallels Desktop 6</a> ($80) &#8211; The fastest virtual machine player on Mac OS X. Its Coherence mode allows you to run Windows apps as separate from the operating system. Truly unbelievable until you see it. Useful for testing webpages on XP, Vista, Windows 7.</p>
<p><a href="http://totalfinder.binaryage.com/" target="_blank">TotalFinder</a> (Lite version free) &#8211; A popup version of Finder. Features a tabbed interface and keyboard shortcuts.</p>
<p><a href="http://visor.binaryage.com/" target="_blank">Visor</a> (Free) &#8211; A popup version of the Terminal. Also features a tabbed interface. Really nice when you just need to restart a server or make Git commits.</p>
<p><a href="http://lightheadsw.com/caffeine/" target="_blank">Caffeine</a> (Free) &#8211; Nice obtrusive app whose only purpose is to prevent Mac OS X from dimming the screen or going to sleep. As easy to turn off as it is to turn on.</p>
<p><a href="http://irradiatedsoftware.com/sizeup/" target="_blank">SizeUp</a> ($13) &#8211; Replicates many of the Aero-snap features you find in Windows 7. Also has the ability to move windows between monitors and spaces. Indispensable if you&#8217;re migrating from Windows.</p>
<p><a href="http://mizage.com/divvy/#divvyMac" target="_blank">Divvy</a> ($14) &#8211;  A &#8220;sister&#8221; app to SizeUp that gives you fine control over the size of windows. Especially great if you want to divide a widescreen into thirds. Have to use it to understand it.</p>
<p><a href="http://netnewswireapp.com/" target="_blank">NetNewsWire</a> (Free) &#8211; A no-frills but totally functional RSS reader with sync for Google Reader. I use it to access password-protected Assembla feeds.</p>
<p><a href="http://www.sparrowmailapp.com/" target="_blank">Sparrow</a> (Lite version free) &#8211; Gmail integration. List of messages on the left panel. Message preview on the right panel. Compose, reply, and forward email from within the app. Pay $10 to remove ads and the &#8220;Sent with Sparrow&#8221; signature tag.</p>
<p><a href="http://amarsagoo.info/namely/" target="_blank">Namely</a> (Free) &#8211; By far my most used app. Use a keyboard-shortcut to bring up a &#8220;application-finder&#8221; textbox. Basically an intellisense-enabled search for apps.</p>
<p><a href="http://www.rdio.com/" target="_blank">Rdio</a> ($10 per month) &#8211; My new favorite subscription-based music service app. I&#8217;m pretty sure the app is just a Safari window surrounded by some native OS X controls. Best feature is its integration with play/pause, previous, and next controls on multimedia keyboards. Can also sniff out your existing iTunes songs and add them to your Rdio collection. Deviously brilliant.</p>
<p><a href="http://www.sublimetext.com/blog/articles/sublime-text-2-public-alpha" target="_blank">Sublime Text 2</a> (Free alpha) &#8211; The sexy Notepad++ replacement for people who don&#8217;t want to pay $70 for TextMate. Not nearly as capable as the popular editor but good enough for general config file editing.</p>
<p><a href="http://www.6wunderkinder.com/wunderlist/" target="_blank">wunderlist</a> (Free) &#8211; Cloud-backed todo-list. Everything you want and very little of what you don&#8217;t want. Slick interface. They have apps that work across Windows, Mac, Android, iPhone, and iPad. Built using <a href="http://www.appcelerator.com/" target="_blank">Titanium Appcelerator</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/cult-of-apple/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ContentEditable and Gmail</title>
		<link>http://roowii.net/blog/contenteditable/</link>
		<comments>http://roowii.net/blog/contenteditable/#comments</comments>
		<pubDate>Sun, 22 May 2011 20:48:14 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=584</guid>
		<description><![CDATA[Lately, I&#8217;ve been quite amazed by this one HTML attribute I&#8217;ve been ignoring all these years: ContentEditable. While it has been around for years as the preferred way of implementing WYSIWYG rich text editors, I&#8217;ve always stuck with the boring textarea. All this changed last week as I was coding a Chrome extension to do [...]]]></description>
			<content:encoded><![CDATA[<p>Lately, I&#8217;ve been quite amazed by this one HTML attribute I&#8217;ve been ignoring all these years: ContentEditable. While it has been around for years as the preferred way of implementing WYSIWYG rich text editors, I&#8217;ve always stuck with the boring textarea.</p>
<p>All this changed last week as I was coding a Chrome extension to do dynamic content insertion into the Gmail composition area. As textareas must contain well&#8230; text, there would be no way to decide on using images or hyperlinks anytime in the future if I restricted myself to ASCII. I ended up using a single fixed-dimension <code>&lt;div&gt;</code> with &#8220;contenteditable&#8221; set to true.</p>
<p>Working with ContentEditable is a whole new beast. I&#8217;m not sure yet whether all browsers implement the same standard tags for formatting but Chrome uses <code>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</code> for double-line breaks and wraps paragraphs in <code>&lt;div&gt;...&lt;/div&gt;</code>. Translating from plain text to this format meant I had do the parsing/splitting and tag insertion myself. The Gmail composition area formats its contents in a very specific way and I had to adhere to this standard.</p>
<p>Another thing about Gmail. Don&#8217;t bother trying to add classes and/or IDs to any of your inserted elements. Gmail strips them out. I found this out the hard way after saving and refreshing an email caused all my custom styles to be lost, despite the CSS being injected correctly. Now I understand the pain newsletter writers have to go through to get their content formatted and styled with inline-CSS. I haven&#8217;t had to write such ugly markup since 1997.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/contenteditable/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Microsoft MIX 2011 Wrapup</title>
		<link>http://roowii.net/blog/microsoft-mix-2011-wrapup/</link>
		<comments>http://roowii.net/blog/microsoft-mix-2011-wrapup/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 01:44:37 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=325</guid>
		<description><![CDATA[My work sent me to Microsoft MIX 2011 in Las Vegas this week. For those who don&#8217;t know, MIX is a conference for web developers who code on the .NET stack (ASP, WCF, OData). There were a number of interesting subjects covered over the course of 72 hours but on the whole, the conference was [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://roowii.net/wp-content/uploads/2011/04/mix-11.jpg" alt="" title="Microsoft MIX 2011" width="500" height="273" class="alignnone size-full wp-image-346 framed" /></p>
<p>My work sent me to <a href="http://www.microsoft.com/events/mix/" target="_blank">Microsoft MIX 2011</a> in Las Vegas this week. For those who don&#8217;t know, MIX is a conference for web developers who code on the .NET stack (ASP, WCF, OData). There were a number of interesting subjects covered over the course of 72 hours but on the whole, the conference was a mix (no pun intended) of strong-arm marketing and the occasional rebel idea. Here were a few themes I noticed:</p>
<h3>HTML5 is (almost) the future</h3>
<p>With the release of <a href="http://ie.microsoft.com/testdrive/" target="_blank">IE9</a>, Microsoft has finally upgraded to be more standards compliant and less IE-like. The business rationale behind promoting a free product here is clear. IE9 is great. IE9 only runs on Windows 7 (and not Mac OS or Linux). Thus, you must buy Windows 7 to enjoy IE9.</p>
<p>Aside from <a href="http://download.cnet.com/8301-2007_4-20046300-12.html" target="_blank">pinned sites</a>, IE9&#8242;s killer feature is HTML5 support and corresponding hardware acceleration for canvas. I attended <a href="http://channel9.msdn.com/Events/MIX/MIX11/CMP06" target="_blank">a session for HTML5 Canvas</a> where the presenter walked us through the game loop of <a href="http://gskinner.com/" target="_blank">Pirates Love Daisies</a>, a JS-only game featuring heavy use of Canvas. The fact that artists can exploit Canvas to draw cartoon characters, animate explosions, and make everything look like Flash is pretty cool. Support amongst the latest browsers is decent, although only IE9 has the hardware acceleration (on Win7 of course). If you&#8217;re interested in hacking on Canvas, check out <a href="http://easeljs.com/" target="_blank">EaselJS</a>.</p>
<p>The most intriguing session about HTML5 was about <a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM10" target="_blank">WebSockets</a>, the technology that is going to replace Comet and long-polling methods of getting updated information from the server. Desktop apps have had this advantage for many years with standard TCP/UDP sockets and it is about time for browsers to support something similar. The event-based callback model is a great idea and builds upon the understanding people have with AJAX already. I would be super excited about the technology but for the fact that even IE9 doesn&#8217;t have support (they demoed it with a Silverlight plugin). It&#8217;ll be a few years before the adoption % (ahem IE10) is high enough for mainstream web developers to start using it. Nettuts+ has a <a href="http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/" target="_blank">nice tutorial on using WebSockets with Javascript</a>.</p>
<h3>Event-driven IO servers everywhere</h3>
<p>Along with <a href="http://nodejs.org/" target="_blank">Node.js</a>, I encountered a number of event-driven web servers throughout the conference. The most interesting of these was <a href="http://jacksonh.tumblr.com/post/1159500924/manos-de-mono-the-manifesto" target="_blank">Manos de Mono</a>, a &#8220;scalable non-blocking HTTP server&#8221;. I witnessed Miguel de Icaza&#8217;s demo at the <a href="http://channel9.msdn.com/Events/MIX/MIX11/EXT03" target="_blank">Mono: State of the Union session</a> and that thing was just blazing. Very cool to have an alternative to IIS for .NET hosting.</p>
<h3>OData as a site&#8217;s data provider</h3>
<p>The most awe-inspiring session happened on the 3rd day, at <a href="http://channel9.msdn.com/Events/MIX/MIX11/FRM16" target="_blank">OData Roadmap: Exposing Any Data Source as an OData service</a>. Jonathan Carter went from scratch to having a MongoDB hooked up to a WCF OData provider, providing full query, filter, sorting, and CRUD support for the model objects in 1 hour. The demo led me to think whether it would be possible to compose web-apps in a way that we use a MVM (Model-View Model) pattern, with the frontend doing most of the hardcore business logic and only using OData as a retrieval/persistence layer. Any additional data manipulations beside the site can be done with worker processes. Doing so would do away with the standard Controller layer completely, which would actually be great for client-side developers like myself.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/microsoft-mix-2011-wrapup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-domain AJAX with basic authentication</title>
		<link>http://roowii.net/blog/ajax-basic-auth/</link>
		<comments>http://roowii.net/blog/ajax-basic-auth/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 03:26:44 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=310</guid>
		<description><![CDATA[I am working on a javascript library for Campfire&#8217;s JSON/XML API. Even before coding my first request/response path, I ran into the issue of authentication. Campfire uses basic authentication over https for security. The idea is that the combination of a user&#8217;s API key and his group&#8217;s Campfire url (person.campfirenow.com) would be enough for identification. [...]]]></description>
			<content:encoded><![CDATA[<p>I am working on a javascript library for <a href="http://developer.37signals.com/campfire/index" target="_blank">Campfire&#8217;s JSON/XML API</a>. Even before coding my first request/response path, I ran into the issue of authentication. Campfire uses <a href="http://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank">basic authentication</a> over https for security. The idea is that the combination of a user&#8217;s API key and his group&#8217;s Campfire url (person.campfirenow.com) would be enough for identification. All the examples on the API site use the <code>-u user:pass</code> option for <code>curl</code> to authenticate. This sets the <code>Authorization</code> header in the request, which is what basic auth checks.</p>
<p>Incidentally, jQuery&#8217;s <code><a href="http://api.jquery.com/jQuery.ajax/" target="_blank">$.ajax()</a></code> function takes <code>username</code> and <code>password</code> as parameters. The docs claim both are used for the response to an &#8220;HTTP access authentication request&#8221;. Unfortunately, as I was making a cross-domain request to Campfire&#8217;s API, I would be forced to use JSONP as the transport mechanism, which <a href="http://stackoverflow.com/questions/3571090/basic-authentication-with-jquery-ajax-request-and-jsonp" target="_blank">precludes any use of request headers</a>. For a while I was stuck.</p>
<p>At this point, I stumbled across <a href="http://support.github.com/discussions/api/24-how-to-jsonp-request-with-http-basic-auth" target="_blank">a discussion on using JSONP to access Github&#8217;s API</a>. The comment that intrigued me was support guy Rick&#8217;s suggestion to use <code>http://login:password@github.com/api/...</code> as another way of performing basic auth without setting headers. Guess what&#8230; It worked for Campfire as well. Here is the complete call ajax call:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
	url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;https://[apikey]:x@example.campfirenow.com/rooms.json&quot;</span><span style="color: #339933;">,</span>
	type<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;GET&quot;</span><span style="color: #339933;">,</span>
	dataType<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;jsonp&quot;</span><span style="color: #339933;">,</span>
	success<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">// callback</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	error<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">// error handling</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Note that the <code>x</code> is not a typo. Campfire endpoints only care for the api-key. <code>x</code> is just a dummy password.</p>
<h3>Update</h3>
<p>I&#8217;m posting this update at the risk of looking like a noob. It looks like Campfire doesn&#8217;t even support JSONP at this moment. Requests for JSONP support on the 37signals mailing list <a href="http://groups.google.com/group/37signals-api/browse_thread/thread/a9eaa66adc335a85" target="_blank">have gone unanswered for more than a half year</a>. The alternative, of course, is to set up a proxy server to pipe your requests through backend routes that work&#8230; but that kills the point of a Javascript library. Until the 37signals guys agree to support JSONP (<a href="http://groups.google.com/group/37signals-api/browse_thread/thread/71c3b644d1f20764" target="_blank">and I&#8217;ve re-requested it</a>), I&#8217;ll have to settle with no official cross-domain support. Luckily Chrome extensions <a href="http://code.google.com/chrome/extensions/xhr.html" target="_blank">do not have to abide by the same-origin rule</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/ajax-basic-auth/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Blown away by jLinq</title>
		<link>http://roowii.net/blog/jlinq/</link>
		<comments>http://roowii.net/blog/jlinq/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 07:38:23 +0000</pubDate>
		<dc:creator>Rui</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://roowii.net/?p=299</guid>
		<description><![CDATA[As people have tried experimenting with fluent interfaces for everything, it was only a matter of time before javascript followed suit. A few weeks ago I became impressed with Soapi.js, a fluent interface for Stack Exchange. Today, I was absolutely blown away by the promise of jLinq. jLinq is exactly what it sounds like: LINQ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="data:image/jpeg;base64,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" class="framed" /></p>
<p>As people have tried experimenting with fluent interfaces for everything, it was only a matter of time before javascript followed suit. A few weeks ago I became impressed with <a href="http://stackapps.com/questions/494/soapi-js-fluent-javascript-client-library-for-the-stack-exchange-api" target="_blank">Soapi.js</a>, a fluent interface for Stack Exchange. Today, I was absolutely blown away by the promise of jLinq.</p>
<p>jLinq is exactly what it sounds like: LINQ for javascript. Taking a few examples from the <a href="http://jlinq.hugoware.com/tryonline">jLinq website</a>, here are snippets to do filtering and joins on JS arrays.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jlinq.<span style="color: #660066;">from</span><span style="color: #009900;">&#40;</span>data.<span style="color: #660066;">users</span><span style="color: #009900;">&#41;</span>
     .<span style="color: #660066;">starts</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;first&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>
     .<span style="color: #660066;">select</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jlinq.<span style="color: #660066;">from</span><span style="color: #009900;">&#40;</span>data.<span style="color: #660066;">users</span><span style="color: #009900;">&#41;</span>
     .<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span>
          data.<span style="color: #660066;">orders</span><span style="color: #339933;">,</span>
          <span style="color: #3366CC;">&quot;orders&quot;</span><span style="color: #339933;">,</span>
          <span style="color: #3366CC;">&quot;id&quot;</span><span style="color: #339933;">,</span> 
          <span style="color: #3366CC;">&quot;ownerId&quot;</span>
     <span style="color: #009900;">&#41;</span>
     .<span style="color: #660066;">select</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>rec<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
               first<span style="color: #339933;">:</span>rec.<span style="color: #660066;">first</span><span style="color: #339933;">,</span>
	       total<span style="color: #339933;">:</span>rec.<span style="color: #660066;">orders</span>.<span style="color: #660066;">length</span>
     <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>jLinq also does the usual where-clause and supports <code>and</code>, <code>or</code>, and <code>not</code> operators. You can even do single and multi-field sorting. If jLinq&#8217;s performance matches its elegance, it would replace a number of jQuery functions. Things like <code><a href="http://api.jquery.com/filter/" target="_blank">filter()</a></code>, <code><a href="http://api.jquery.com/jQuery.grep/" target="_blank">grep()</a></code>, and <code><a href="http://api.jquery.com/jQuery.inArray/" target="_blank">inArray()</a></code> could all be replaced to a certain extent. jLinq has the potential to solve half of the problems developers typically write inefficient code for (filtering, sorting, merging).</p>
<p>It&#8217;s 1:36am. I have to get up in 5 hours to catch a plane. And I&#8217;m gushing about a javascript library. jLinq is a brilliant idea indeed.</p>
]]></content:encoded>
			<wfw:commentRss>http://roowii.net/blog/jlinq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
