<?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/"
  xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
  >
<channel>
  <title>Amir Malik</title>
  <atom:link href="http://amirmalik.net/news.xml" rel="self" type="application/rss+xml"/>
  <link>http://amirmalik.net/</link>
  <description>My ramblings about tech, stuff making, and more.</description>
  <language>en</language>
  <sy:updatePeriod>hourly</sy:updatePeriod>
  <sy:updateFrequency>1</sy:updateFrequency>
    <item>
    <title>CloudPlay: A Music Player for YouTube, etc.</title>
    <link>http://amirmalik.net/2012/08/09/cloudplay-a-music-player-for-youtube-etc</link>
    <guid isPermaLink="true">http://amirmalik.net/2012/08/09/cloudplay-a-music-player-for-youtube-etc</guid>
    <pubDate>Sun, 09 Sep 2012 07:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>Last year, I had an idea that seemed to improve every time I thought about it. What started out as a solution to fix the problem of quickly finding music on YouTube to play in the car, turned into a realization of how everything is shifting to the omniscient and omnipresent "cloud."</p>
<p>It's become clear in recent years that people want cross-platform access to their music. <a href="http://www.apple.com/itunes/itunes-match/">iTunes Match</a>, <a href="http://www.amazon.com/cloudplayer">Amazon Cloud Player</a>, and other music locker services have made manual syncing of music across different devices a thing of the past. At the same time, streaming services like <a href="http://www.spotify.com/">Spotify</a> and <a href="http://www.rdio.com/">Rdio</a> have obviated the need to actually "own" any music at all, with their all-you-can-eat monthly plans.</p>
<p>While these developments have been great for record labels, artists, and music lovers, there still remains a plethora of music that isn't released on these kinds of services. Some sites cater directly to helping independent artists promote their music, but a lot more is being uploaded to <a href="http://soundcloud.com/">SoundCloud</a> and <a href="http://www.youtube.com/">YouTube</a>, both officially and unofficially by fans. A record label might post a full-length track to promote download sales, or a DJ might unleash their latest remix to solicit feedback.</p>
<p>All these options make it difficult to find music without doing a lot of manual searching across different sites. And when you do find it, you can't add it to a playlist or like/favorite it with music from other sources. But many of these sites have great APIs that remain underused by music players.</p>
<p><img src="/2012/08/09/menubar.png" alt="CloudPlay running in the Mac OS X menu bar" title="" /></p>
<p><a href="http://cloudplay.fm/">CloudPlay</a>, inspired by the fantastically simple interface of <a href="http://en.wikipedia.org/wiki/Winamp#Winamp_2">Winamp</a>, is designed to stay out of your view as much as possible, by being a menu bar app. It's intended to be visually minimal, but functionally rich, with the goal of feeling more like a mobile app than a desktop app.</p>
<p>A web-based player often gets buried in a browser tab somewhere, making it impossible to seamlessly switch between songs on different sites. Desktop players  consume lots of screen real estate and have weak, if any, support for playing music from multiple online sources.</p>
<p>Playing music from your iTunes library (if you have one) is a given, but CloudPlay takes it to the next level by helping you search for music on YouTube, SoundCloud, <a href="http://ex.fm/">exfm</a>, <a href="http://www.bandsoup.com/">BandSoup</a>, and providing easy access to curated playlists on <a href="http://console.fm/">Console.fm</a>. It works basically the way <a href="http://en.wikipedia.org/wiki/Spotlight_(software)">Spotlight</a> does: type a few search terms, and results from all sources are displayed.</p>
<p><img src="/2012/08/09/screenshot.png" alt="CloudPlay showing search results" title="" /></p>
<p>Adding tracks to a playlist is as simple as clicking on a result and picking a playlist. Naturally, a playlist can contain tracks from any of the supported sources. And since it's a menubar app, it supports full keyboard navigation, making it easy to use the player while in another fullscreen app.</p>
<p>In the coming months, I'll be working on improving music discovery with artist profiles, recommendations, stations, and social thingamajigs, while striving to maintain a clutter-free user experience.</p>
<p>CloudPlay will be officially released in the Mac App Store in the next month. In the meantime, grab a free trial version at <a href="http://cloudplay.fm/">cloudplay.fm</a> and let me know what you think!</p>
<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/follow_button.html?screen_name=CloudPlayFM"></iframe>]]></description>
  </item>
    <item>
    <title>Introducing Dialoggs</title>
    <link>http://amirmalik.net/2012/04/27/introducing-dialoggs</link>
    <guid isPermaLink="true">http://amirmalik.net/2012/04/27/introducing-dialoggs</guid>
    <pubDate>Sun, 27 May 2012 07:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>This week my friend <a href="http://drewwilson.com/">Drew Wilson</a> and I launched <a href="http://dialog.gs/">Dialoggs</a> into private beta. Simply put, Dialoggs is what you get when you combine the social network of Twitter, a few privacy controls from Facebook, and the multimedia features of Tumblr.</p>
<p>Just like Twitter, you can follow other users on Dialoggs and they can follow you. You can send a private message to any user who follows you, much like a Twitter DM. If you see an interesting post, you can repost it to all of your followers (similar to a retweet). So far, nothing surprising.</p>
<p>If you use Twitter and follow a lot of people, it can be hard to keep track of conversations, whether they're in the form of replies or mentions to someone in the conversation. Thankfully, the grass really <em>is</em> greener on Dialoggs. Anyone can create a dialogg so people know the general theme or topic for posts. People can also follow dialoggs (of course, dialoggs can't follow anyone :). This means that whenever you make a post into a dialogg, anyone who follows the dialogg will see the post, even if they don't follow you.</p>
<p>In addition to mentioning other users, you can mention a dialogg using the @username/dialogg syntax. For example, if you mention <a href="http://dialog.gs/amir/new-music">@amir/new-music</a> then your post will show up in the mentions stream of all of the dialogg's members (including its creator, me) if the dialogg is invite-only (see below).</p>
<p>By default, a dialogg is public and allows anyone to post, but it can be set as invite-only so only specific users are allowed to make posts into it, but everyone can see them. You can allow those users to invite other users, so membership management (ie. posting privileges) can be shared.</p>
<p><img src="/2012/04/27/dialogg-permissions.png" alt="screenshot of dialogg permissions" title="screenshot of dialogg permissions" /></p>
<p>If you want something more controlled, you can create a private dialogg, which is always invite-only. All posts made into a private dialogg are not visible anywhere unless you're logged in and a member of that dialogg. Private dialoggs are great for internal team collaboration and anything that's confidential. Obviously, it's not possible to follow private dialoggs.</p>
<p>When creating a dialogg, it's possible to set the first post as "sticky," meaning the post will stay at the top in the stream of posts for the dialogg as the user scrolls through it.</p>
<p>Now that we're done discussing features, how about some real-world examples ("use cases" as some people say) of what you can do with Dialoggs:</p>
<ul>
<li><p><strong>A read-only blog, mailing list, or announcements</strong></p>
<p>Create a public dialogg and set it to invite-only. Invite anyone else you want to be able to make blog posts. Each post becomes an entry in your blog. This can be used generally for any one-way communication to a large group of people.</p>
<p>But <em>"wait Amir, why isn't your own blog running on Dialoggs then?"</em> you ask. Not to worry, third-party integration of Dialoggs data using an open API is in the works so you'll be able to embed posts on your own site.</p></li>
<li><p><strong>A comment stream for another blog</strong></p>
<p>Much like people use hosted blog comment platforms like Disqus, you can create a dialogg for every blog post, but don't set the opening post as sticky. Now all posts in the dialogg will effectively be comments. Set the website of the dialogg to point to your blog post URL so people that discover the dialogg on Dialoggs know what the posts are about.</p></li>
<li><p><strong>A blog with comments, or Q&amp;A</strong></p>
<p>For every blog entry, create a public dialogg and create an opening post that's sticky. This opening post will be the blog entry. Any subsequent posts in the dialogg are comments.</p></li>
<li><p><strong>A public or private chat room</strong></p>
<p>This should be obvious, but since Dialoggs is near real-time, any public or private dialogg can be used as a chat room, although there is no typing notification and there is approximately a 1-2 second delay for a new post to show up.</p></li>
</ul>
<p>I'm really excited about what we have planned for the next few months! Take a look at the <a href="http://dialog.gs/about">Dialoggs roadmap</a> to see what's brewing and don't forget to follow <a href="http://dialog.gs/amir">@amir</a> on Dialoggs!</p>]]></description>
  </item>
    <item>
    <title>Kauai, Hawaii</title>
    <link>http://amirmalik.net/2011/11/26/kauai-hawaii</link>
    <guid isPermaLink="true">http://amirmalik.net/2011/11/26/kauai-hawaii</guid>
    <pubDate>Mon, 26 Dec 2011 08:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>Relax. Slow down. Take it easy.</p>
<p>That’s what I had in mind when I decided on a vacation in Kauai, the oldest Hawaiian island. Also known as the <em>Garden Isle</em>, Kauai has fewer than 70,000 inhabitants, and a rich history including being the first landing site of James Cook, and the last island in the archipelago to join the Kingdom of Hawaii.</p>
<p>When you land at <a href="http://hawaii.gov/lih">Lihue Airport</a> it becomes apparent why you’re on the <em>Garden Isle</em>. There’s green everywhere, contrasted by the  mountains to the west of the island. The second thing you’ll notice is metal that is exposed to the elements shows signs of rusting. The salty air combined with the small size of the island means that most cars (except rentals for tourists) are a decade or more old. One highway (33 miles in length, max 50 mph limit) doesn’t exactly make your odometer spin.</p>
<p>I’m not a speed freak (anymore), so I was content with the lower speed limits. For example, on the highway, as you approach a town, it’ll go from 50 to 45 to 35 to 25 while in town and gradually back up. Much of it is one lane in each direction (except small stretches in major towns or for passing). Some locals and tourists always seem to be in some kind of hurry, though.</p>
<p>You don’t go to Kauai for the night life (there isn’t any), but there’s so much more to do. Most of it is exploring quaint little towns and taking in the nature. Then there’s the beach, too. The <a href="http://www.explorekauai.com/">Kauai Underground Guide</a> (free PDF) is awesome.</p>
<p>I strived to eat a lot of fresh fish with hopefully less mercury than back home. Ono, another name for wahoo, is a great fish when grilled or inside a sandwich. Honestly, I wouldn’t have tried it if they had called it wahoo; bad experience at Wahoo’s Fish Tacos, I guess. We found a traditional place where only locals eat and everyone seemed to be having either fried or laulau-style meat and poultry, with a side of rice. It was cheap and basic fare, but I think KFC does it better.</p>
<p>A better option is to try one of the fish markets where you can get sashimi-grade fish and other seafood in taco, sandwich, or fried form. Of course, it would be illegal not to serve fried chicken, too. We splurged a bit on touristy restaurants at <a href="http://kukuiula.com/theresturants/">Kukui’ula Village</a>. Be sure to ask for the free focaccia and curry muffins at <a href="http://josselins.com/">Josselin’s Tapas Bar and Grill</a>. It’s a foodie type joint, but damn tasty. And finally, <a href="http://www.bubbaburger.com/">Bubba’s</a> is a must; it’s the Kauai equivalent of California’s In-N-Out.  <a href="http://www.brenneckes.com/">Brennecke’s Beach Broiler</a> has the best Mai Tai you can enjoy in between snorkeling and beachin’.</p>
<p>Kayaking up the Wailua River to bathe in the Wailua Falls is not to be missed. Our guide was awesome. He pointed out red honeysuckle, purple flowers that taste like mushrooms, and found a rare mango that we all shared. The 5+ hour roundtrip trek is worth every moment, considering it also prepares you to hike the muddy Hanakapi’ai Trail. Best educational kayak/hike combo ever.</p>
<p>Kauai is mostly an explorer’s paradise and a sense of adventure is required. I’d feel guilty if all I did was lounge on the beach. Here are some of my favorite memories from around the island.</p>
<p>Enjoy!</p>
<h3 id="spoutinghorn">Spouting Horn</h3>
<p><a href="/2011/11/26/2011-11-15_15-08-24_0574.jpg"><img src="/2011/11/26/2011-11-15_15-08-24_0574_400px.jpg" alt="Spouting Horn" title="Spouting Horn" /></a></p>
<p>A blowhole near the end of Lawa‛i Road that bursts as water rushes under the lava shelf. It’s supposed to be more spectacular in the evening as the sun sets so you see sparkles of the rainbow, but it didn’t occur to me. Best to go there when the sea is rough.</p>
<h3 id="hoaibeach">Ho’ai Beach</h3>
<p><a href="/2011/11/26/2011-11-16_11-33-33_0604.jpg"><img src="/2011/11/26/2011-11-16_11-33-33_0604_400px.jpg" alt="Ho’ai Beach" title="Ho’ai Beach" /></a></p>
<p>Waking up to this sight every morning was wonderful. So much that snorkelers seemed to prefer the rocky beach here in Ho’ai Bay more than the sandy Ho’ona Beach down the road.</p>
<h3 id="kilauealighthouse">Kilauea Lighthouse</h3>
<p><a href="/2011/11/26/2011-11-16_14-19-22_0624.jpg"><img src="/2011/11/26/2011-11-16_14-19-22_0624_400px.jpg" alt="Kilauea Lighthouse" title="Kilauea Lighthouse" /></a></p>
<p>This is the northernmost point of the Hawaiian Islands. Replaced in the 1970’s with a light beacon (behind it), there’s some restoration work going on to make it more functioning, but they’re taking their sweet time in completing the work.</p>
<h3 id="mokuaeaeislet">Moku‛ae‛ae Islet</h3>
<p><a href="/2011/11/26/2011-11-16_14-26-16_0657.jpg"><img src="/2011/11/26/2011-11-16_14-26-16_0657_400px.jpg" alt="Moku‛ae‛ae Islet" title="Moku‛ae‛ae Islet" /></a></p>
<p>A bird sanctuary just offshore from the Kilauea Lighthouse.</p>
<h3 id="kilaueapointnationalwildliferefuge">Kilauea Point National Wildlife Refuge</h3>
<p><a href="/2011/11/26/2011-11-16_14-34-15_0672.jpg"><img src="/2011/11/26/2011-11-16_14-34-15_0672_400px.jpg" alt="Kilauea Point National Wildlife Refuge" title="Kilauea Point National Wildlife Refuge" /></a></p>
<p>Yes, all those white dots are birds relaxing. You can also see a small boat exploring the rocky mountain side.</p>
<h3 id="kalihiwaibeach">Kalihiwai Beach</h3>
<p><a href="/2011/11/26/2011-11-16_15-51-11_0701.jpg"><img src="/2011/11/26/2011-11-16_15-51-11_0701_400px.jpg" alt="Kalihiwai Beach" title="Kalihiwai Beach" /></a></p>
<p>Drive a little north of the Kilauea Lighthouse and you’ll get to this beach. It’s situated in what seems like someone’s giant backyard.</p>
<h3 id="hanaleivalley">Hanalei Valley</h3>
<p><a href="/2011/11/26/2011-11-16_17-24-24_0704.jpg"><img src="/2011/11/26/2011-11-16_17-24-24_0704_400px.jpg" alt="Hanalei Valley" title="Hanalei Valley" /></a></p>
<p>A typical shot of what a lush valley agricultural valley looks like.</p>
<h3 id="coconutshrimp">Coconut Shrimp</h3>
<p><a href="/2011/11/26/2011-11-17_11-48-33_0710.jpg"><img src="/2011/11/26/2011-11-17_11-48-33_0710_400px.jpg" alt="Coconut Shrimp" title="Coconut Shrimp" /></a></p>
<p>On a hot day, a quick fix at the Shrimp Station is all you need. Beer-battered shrimp in the background.</p>
<h3 id="mailboxonwaimeacanyondrive">Mailbox on Waimea Canyon Drive</h3>
<p><a href="/2011/11/26/2011-11-17_12-27-55_0715.jpg"><img src="/2011/11/26/2011-11-17_12-27-55_0715_400px.jpg" alt="Mailbox on Waimea Canyon Drive" title="Mailbox on Waimea Canyon Drive" /></a></p>
<p>On the drive up to Waimea Canyon, I spotted this mailbox. Makes you almost want to commit a federal crime and deliver the mail to its owner to find out where he lives!</p>
<h3 id="overlookingwaimeacanyontotheeast">Overlooking Waimea Canyon to the East</h3>
<p><a href="/2011/11/26/2011-11-17_12-28-09_0016.jpg"><img src="/2011/11/26/2011-11-17_12-28-09_0016_400px.jpg" alt="Overlooking Waimea Canyon to the East" title="Overlooking Waimea Canyon to the East" /></a></p>
<p>A narrow opening across the eastern end of the Waimea Canyon. Volcanic red dirt is everywhere here, fantastically nutrient rich.</p>
<h3 id="waimeariver">Waimea River</h3>
<p><a href="/2011/11/26/2011-11-17_12-42-36_0732.jpg"><img src="/2011/11/26/2011-11-17_12-42-36_0732_400px.jpg" alt="Waimea River" title="Waimea River" /></a></p>
<p>The Waimea River snakes through the Waimea Canyon on its way out to the Pacific Ocean.</p>
<h3 id="streamalongwaimeacanyondrive">Stream along Waimea Canyon Drive</h3>
<p><a href="/2011/11/26/2011-11-17_13-01-30_0760.jpg"><img src="/2011/11/26/2011-11-17_13-01-30_0760_400px.jpg" alt="Stream along Waimea Canyon Drive" title="Stream along Waimea Canyon Drive" /></a></p>
<p>Rivers seem to flow everywhere on the canyon. Someone will find this and confuse it for what Mars looked like with waterfalls.</p>
<h3 id="waimeacanyon">Waimea Canyon</h3>
<p><a href="/2011/11/26/2011-11-17_13-38-19_0766.jpg"><img src="/2011/11/26/2011-11-17_13-38-19_0766_400px.jpg" alt="Waimea Canyon" title="Waimea Canyon" /></a></p>
<p>The Grand Canyon of the Pacific. The lines on the walls are caused by lava flows and rivers that flowed from Mount Waiʻaleʻale thousands of years ago.</p>
<h3 id="prayeratwaimeacanyon">Prayer at Waimea Canyon</h3>
<p><a href="/2011/11/26/2011-11-17_13-38-55_0768.jpg"><img src="/2011/11/26/2011-11-17_13-38-55_0768_400px.jpg" alt="Prayer at Waimea Canyon" title="Prayer at Waimea Canyon" /></a></p>
<p>Paying respects to the canyon.</p>
<h3 id="clifftrail">Cliff Trail</h3>
<p><a href="/2011/11/26/2011-11-17_14-26-25_0784.jpg"><img src="/2011/11/26/2011-11-17_14-26-25_0784_400px.jpg" alt="Cliff Trail" title="Cliff Trail" /></a></p>
<p>The first trail of Kokeʻe State Park, leading to a different viewpoint of the canyon.</p>
<h3 id="treesontheclifftrail">Trees on the Cliff Trail</h3>
<p><a href="/2011/11/26/2011-11-17_14-33-18_0787.jpg"><img src="/2011/11/26/2011-11-17_14-33-18_0787_400px.jpg" alt="Trees on the Cliff Trail" title="Trees on the Cliff Trail" /></a></p>
<h3 id="cliffviewpointwaimeacanyon">Cliff Viewpoint, Waimea Canyon</h3>
<p><a href="/2011/11/26/2011-11-17_14-37-22_0792.jpg"><img src="/2011/11/26/2011-11-17_14-37-22_0792_400px.jpg" alt="Cliff Viewpoint, Waimea Canyon" title="Cliff Viewpoint, Waimea Canyon" /></a></p>
<p>The end of the Cliff Trail. Overlooks the Canyon Trail, which goes through Waipoʻo Falls.</p>
<h3 id="waimeacanyondrive">Waimea Canyon Drive</h3>
<p><a href="/2011/11/26/2011-11-17_15-54-25_0859.jpg"><img src="/2011/11/26/2011-11-17_15-54-25_0859_400px.jpg" alt="Waimea Canyon Drive" title="Waimea Canyon Drive" /></a></p>
<p>The entire road is covered in a red volcanic film. And I guess people like to shoot signs that tell them what to do.</p>
<h3 id="russianfortelizabeth">Russian Fort Elizabeth</h3>
<p><a href="/2011/11/26/2011-11-17_16-30-27_0865.jpg"><img src="/2011/11/26/2011-11-17_16-30-27_0865_400px.jpg" alt="Russian Fort Elizabeth" title="Russian Fort Elizabeth" /></a></p>
<p>A dismantled Russian forth near the mouth of the Waimea River. Very near James Cook’s landing; his original flag seems to also still be installed.</p>
<h3 id="sunriseatkuhioshores">Sunrise at Kuhio Shores</h3>
<p><a href="/2011/11/26/2011-11-18_06-58-41_0878.jpg"><img src="/2011/11/26/2011-11-18_06-58-41_0878_400px.jpg" alt="Sunrise at Kuhio Shores" title="Sunrise at Kuhio Shores" /></a></p>
<h3 id="footstepsatmahaulepubeach">Footsteps at Maha‛ulepu Beach</h3>
<p><a href="/2011/11/26/2011-11-19_11-50-42_0893.jpg"><img src="/2011/11/26/2011-11-19_11-50-42_0893_400px.jpg" alt="Footsteps at Maha‛ulepu Beach" title="Footsteps at Maha‛ulepu Beach" /></a></p>
<p>In the winter, you’ll see mostly windsurfers and seasoned surfers attempting anything in these waters.</p>
<h3 id="wavesatmahaulepubeach">Waves at Maha‛ulepu Beach</h3>
<iframe width="640" height="360" src="http://www.youtube.com/embed/ul_oVGy2X0M?rel=0" frameborder="0" allowfullscreen></iframe>
<h3 id="mahaulepubeach">Maha‛ulepu Beach</h3>
<p><a href="/2011/11/26/2011-11-19_11-57-16_0896.jpg"><img src="/2011/11/26/2011-11-19_11-57-16_0896_400px.jpg" alt="Maha‛ulepu Beach" title="Maha‛ulepu Beach" /></a></p>
<p>Strong winds limit enjoyment on this side of the beach. There are few trees to protect you from sandstorms.</p>
<h3 id="makauwahicave">Makauwahi Cave</h3>
<p><a href="/2011/11/26/2011-11-20_10-59-47_0911.jpg"><img src="/2011/11/26/2011-11-20_10-59-47_0911_400px.jpg" alt="Makauwahi Cave" title="Makauwahi Cave" /></a></p>
<p>An active archeological dig with 10,000 years of preserved fossils found. The entrance requires crouching and head bumping is an initiation injury.</p>
<h3 id="pilaspoint">Pila’s Point</h3>
<p><a href="/2011/11/26/2011-11-20_11-03-57_0912.jpg"><img src="/2011/11/26/2011-11-20_11-03-57_0912_400px.jpg" alt="Pila’s Point" title="Pila’s Point" /></a></p>
<p>Overlooking the Maha‛ulepu area. Sugar company land.</p>
<h3 id="bridgetomakauwahicavereserve">Bridge to Makauwahi Cave Reserve</h3>
<p><a href="/2011/11/26/2011-11-20_11-29-43_0938.jpg"><img src="/2011/11/26/2011-11-20_11-29-43_0938_400px.jpg" alt="Bridge to Makauwahi Cave Reserve" title="Bridge to Makauwahi Cave Reserve" /></a></p>
<h3 id="makauwahitreestump">Makauwahi Tree Stump</h3>
<p><a href="/2011/11/26/2011-11-20_11-37-43_0953.jpg"><img src="/2011/11/26/2011-11-20_11-37-43_0953_400px.jpg" alt="Makauwahi Tree Stump" title="Makauwahi Tree Stump" /></a></p>
<h3 id="makauwahicave">Makauwahi Cave</h3>
<p><a href="/2011/11/26/2011-11-20_12-16-08_0962.jpg"><img src="/2011/11/26/2011-11-20_12-16-08_0962_400px.jpg" alt="Makauwahi Cave" title="Makauwahi Cave" /></a></p>
<p>A view of the open-air cave from the entrance.</p>
<h3 id="kilohanaplantationrailway">Kilohana Plantation Railway</h3>
<p><a href="/2011/11/26/2011-11-20_14-25-24_1019.jpg"><img src="/2011/11/26/2011-11-20_14-25-24_1019_400px.jpg" alt="Kilohana Plantation Railway" title="Kilohana Plantation Railway" /></a></p>
<h3 id="mcbrydegardenatnationaltropicalbotanicalgarden">McBryde Garden at National Tropical Botanical Garden</h3>
<p><a href="/2011/11/26/2011-11-21_10-57-17_1109.jpg"><img src="/2011/11/26/2011-11-21_10-57-17_1109_400px.jpg" alt="McBryde Garden at National Tropical Botanical Garden" title="McBryde Garden at National Tropical Botanical Garden" /></a></p>
<h3 id="deadtreeatkalalaulookout">Dead Tree at Kalalau Lookout</h3>
<p><a href="/2011/11/26/2011-11-21_14-31-33_1228.jpg"><img src="/2011/11/26/2011-11-21_14-31-33_1228_400px.jpg" alt="Dead Tree at Kalalau Lookout" title="Dead Tree at Kalalau Lookout" /></a></p>
<p>At higher altitudes, you’ll often find isolated patches of dead vegetation, like this tree stump. I’m not sure why, but I’d like to think a spray of lava killed it!</p>
<h3 id="puuokilalookout">Pu‛u o Kila Lookout</h3>
<p><a href="/2011/11/26/2011-11-21_15-24-37_1272.jpg"><img src="/2011/11/26/2011-11-21_15-24-37_1272_400px.jpg" alt="Pu‛u o Kila Lookout" title="Pu‛u o Kila Lookout" /></a></p>
<p>Overlooking the northern end of the Kalalau Valley, on the Na Pali Kona Forest Reserve Pihea Trail.</p>
<h3 id="scenearoundthepuuokilalookout">Scene around the Pu‛u o Kila Lookout</h3>
<iframe width="480" height="360" src="http://www.youtube.com/embed/-RkZ5S0nMNs?rel=0" frameborder="0" allowfullscreen></iframe>
<h3 id="napalikonaforestreservepiheatrail">Na Pali Kona Forest Reserve Pihea Trail</h3>
<p><a href="/2011/11/26/2011-11-21_16-18-56_1286.jpg"><img src="/2011/11/26/2011-11-21_16-18-56_1286_400px.jpg" alt="Na Pali Kona Forest Reserve Pihea Trail" title="Na Pali Kona Forest Reserve Pihea Trail" /></a></p>
<h3 id="sunsetatkekahabeach">Sunset at Kekaha Beach</h3>
<p><a href="/2011/11/26/2011-11-21_17-49-31_1298.jpg"><img src="/2011/11/26/2011-11-21_17-49-31_1298_400px.jpg" alt="Sunset at Kekaha Beach" title="Sunset at Kekaha Beach" /></a></p>
<h3 id="turquoisewatersonthehanakapiaitrail">Turquoise Waters on the Hanakapi’ai Trail</h3>
<p><a href="/2011/11/26/2011-11-22_12-57-30_1363.jpg"><img src="/2011/11/26/2011-11-22_12-57-30_1363_400px.jpg" alt="Turquoise Waters on the Hanakapi’ai Trail" title="Turquoise Waters on the Hanakapi’ai Trail" /></a></p>
<h3 id="napalicoastfromthehanakapiaitrail">Na Pali Coast from the Hanakapi’ai Trail</h3>
<p><a href="/2011/11/26/2011-11-22_13-00-16_1366.jpg"><img src="/2011/11/26/2011-11-22_13-00-16_1366_400px.jpg" alt="Na Pali Coast from the Hanakapi’ai Trail" title="Na Pali Coast from the Hanakapi’ai Trail" /></a></p>
<p>The Hanakapi’ai Trail is a very rewarding hike, but beware of the conditions. We went when it was muddy and it took 1 hour 40 minutes to get to Hanakapi’ai Beach (3.25 miles). We arrived at 2pm, but ideally it would be best to arrive around noon, since the beach gets a bit dark sooner due to the tall surrounding mountains. On the way back, if you’re lucky, there’ll be a guy with a machete slicing open fresh coconuts.</p>
<h3 id="smallstreamonthehanakapiaitrail">Small Stream on the Hanakapi’ai Trail</h3>
<p><a href="/2011/11/26/2011-11-22_13-17-55_1375.jpg"><img src="/2011/11/26/2011-11-22_13-17-55_1375_400px.jpg" alt="Small Stream on the Hanakapi’ai Trail" title="Small Stream on the Hanakapi’ai Trail" /></a></p>
<h3 id="hanakapiaibeach">Hanakapi’ai Beach</h3>
<p><a href="/2011/11/26/2011-11-22_15-33-48_1428.jpg"><img src="/2011/11/26/2011-11-22_15-33-48_1428_400px.jpg" alt="Hanakapi’ai Beach" title="Hanakapi’ai Beach" /></a></p>
<p>The last river you cross to get to the beach. It’s waist deep and moves quite fast in the middle. Another option is to walk on the rocks toward the beach and cross a shallower stream there.</p>
<h3 id="highestpointonthehanakapiaitrail">Highest Point on the Hanakapi’ai Trail</h3>
<p><a href="/2011/11/26/2011-11-22_15-59-52_1433.jpg"><img src="/2011/11/26/2011-11-22_15-59-52_1433_400px.jpg" alt="Highest Point on the Hanakapi’ai Trail" title="Highest Point on the Hanakapi’ai Trail" /></a></p>
<p>The portion of the trail to the beach snakes around the mountains and is really a sight to behold. After rains, most of the trail is muddy, with patches of dry dirt where directly exposed to the sun.</p>
<h3 id="riverathanakapiaibeach">River at Hanakapi’ai Beach</h3>
<iframe width="640" height="360" src="http://www.youtube.com/embed/GNVU5sGT89Y?rel=0" frameborder="0" allowfullscreen></iframe>
<p>To enter or exit this beach, you need to cross this river. You can do it here or further downstream, closer to the beach. You still need to do some rock hopping afterwards.</p>
<h3 id="nightskyinkoloa">Night Sky in Koloa</h3>
<p><a href="/2011/11/26/2011-11-22_21-13-01_1454.jpg"><img src="/2011/11/26/2011-11-22_21-13-01_1454_400px.jpg" alt="Night Sky in Koloa" title="Night Sky in Koloa" /></a></p>
<p>It’s a pity that I can’t enjoy dark skies like these at home. Stargazing next to rolling ocean waves is heaven on clear nights! This is a 13 second exposure at f/2.8, ISO 1600 of a part of the eastern sky (<a href="/2011/11/26/2011-11-22_21-13-01_1454_full.jpg">full size</a>). As far as I’m concerned, I’ll be using Jupiter instead of the North Star for navigation.</p>]]></description>
  </item>
    <item>
    <title>RESTalytics — our Node Knockout entry</title>
    <link>http://amirmalik.net/2011/08/29/restalytics-our-node-knockout-entry</link>
    <guid isPermaLink="true">http://amirmalik.net/2011/08/29/restalytics-our-node-knockout-entry</guid>
    <pubDate>Thu, 29 Sep 2011 07:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>This past weekend I took part in <a href="http://nodeknockout.com/">Node Knockout</a>, a 48-hour coding competition where teams have to build an app in <a href="http://nodejs.org/">node.js</a> from scratch. On the team were <a href="http://drewwilson.com/">Drew Wilson</a> (design), <a href="http://kevinthompson.info/">Kevin Thompson</a> (frontend), and <a href="http://aashay.com/">Aashay Desai</a> and myself on the backend. Our entry, <a href="http://restalytics.com/">RESTalytics</a>, is a sweet-looking analytics dashboard for monitoring REST API usage. We also developed a drop-in library (<a href="https://github.com/ammmir/node-restalytics">node-restalytics</a>) to be used with any node.js app to add analytics tracking in one line of code.</p>
<p><a href="http://restalytics.com/"><img src="/2011/08/29/restalytics-1.png" alt="RESTalytics dashboard" title="" /></a></p>
<p>Unsurprisingly, the initial idea started out with a huge scope. We wanted to track users as they moved through a site, drill down into GET/POST parameters, including any JSON received or sent by an API, track uptime, slowest API endpoints, and more. Fortunately, we trimmed it down to just the basics: monitoring requests in real-time, tracking average response time, and counting the number of requests.</p>
<p>In 48 hours, a great deal was accomplished, but in the end it turned out that just getting a nice real-time graph working with the proper backend architecture in place took some time. Due to last-minute issues, we weren't able to show the most popular endpoints or top sources in the dashboard, but hopefully the general idea of the service is clear.</p>
<p>On the third-party API server side, a developer only needs to install the restalytics node module (<code>npm install restalytics</code>), and include this line of code in their main server-side script:</p>
<pre><code>require('restalytics').apiKey('_YOUR API KEY HERE'_);
</code></pre>
<p>The restalytics module is able to track incoming HTTP requests (to any server subclassed from http.Server) as well as responses. The graph on the main dashboard shows requests on the horizontal axis and response time as their height. The response time is the time required to handle an incoming HTTP request (after it arrives) and send the first HTTP response header. It's purely the request processing time, not data transfer time.</p>
<p>The restalytics node module, by default, flushes the collected statistics every 5 seconds to the RESTalytics API server. This allows you to see a near real-time view of requests to your server. In case the RESTalytics API ever goes down, the node module is designed to retry. If the API is down is for an extended period of time, the module will drop older statistics to conserve RAM.</p>
<p>The module sends each batch of data points as a POST request to /api/data.  Each batch is asynchronously processed by adding each data point into an incoming queue (stored in Redis). A worker process processes each data point, calculates daily and 5 minute averages by storing them into keys in Redis for each type of statistic required (number of requests, average response time, slowest endpoint, etc.). Finally, the actual data point is stored for safekeeping into MongoDB.</p>
<p>MongoDB also contains the different sites (APIs) that a user account may have, as well as all detected URI endpoints. By storing the raw data points in Mongo and issuing dashboard queries directly to Redis, we're able to maintain acceptable performance with little datastore overhead.</p>
<p>Future improvements:</p>
<ul>
<li>Historical graphs</li>
<li>Browse individual requests (Logs tab)</li>
<li>Find requests by filtering on query string parameters or request data</li>
</ul>
<p>To find out more, check out <a href="http://restalytics.com/">RESTalytics</a> or <a href="https://twitter.com/ammmir">follow me on Twitter</a> and I'll keep you updated.</p>]]></description>
  </item>
    <item>
    <title>Compass + Sassy CSS = giddiness</title>
    <link>http://amirmalik.net/2011/05/01/compass-sassy-css-giddiness</link>
    <guid isPermaLink="true">http://amirmalik.net/2011/05/01/compass-sassy-css-giddiness</guid>
    <pubDate>Wed, 01 Jun 2011 07:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>The designer in me has been wanting to break out for some time, and since going back to freelancing, I've found some extra time and ran out of excuses to brush up on CSS. In the spirit of <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a>, I've discovered <a href="http://compass-style.org/">Compass</a>, a CSS framework that makes it easier to write cleaner HTML and make CSS a bit more "programmable." For me, defining variables and abstracting cross-browser CSS are the biggest benefits so far.</p>
<p>Compass is pretty awesome to work with. You write your style rules in a <a href="http://sass-lang.com/">Sassy</a> CSS (SCSS), a superset of CSS. While developing, I run the "compass watch" command, which automatically monitors the file system and compiles .scss files to .css on any change. Being too lazy to reload the page on every change, I employ <a href="http://nv.github.com/css_auto-reload/">CSS auto-reload</a> to dynamically reload CSS stylesheets as they change without requiring a full page refresh. This is a huge plus during development for a CSS novice like me. Experimenting with layouts to achieve pixel perfection become realistic, much faster than playing with WebKit Developer Tools.</p>
<p>Compass and Sassy have been web development fun again for me, so much that I went crazy and designed this blog theme from scratch. Call me cliche, but I couldn't resist border-radius and shadows!</p>]]></description>
  </item>
    <item>
    <title>Speak It, Baby!</title>
    <link>http://amirmalik.net/2011/01/31/speak-it-baby</link>
    <guid isPermaLink="true">http://amirmalik.net/2011/01/31/speak-it-baby</guid>
    <pubDate>Thu, 03 Mar 2011 08:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>This past weekend, I attended <a href="https://twitter.com/semanticseed">Semantic Seed</a>'s <a href="http://san-jose.startupcamper.com/">StartUp Camp (Mobile Edition) Bay Area</a> in Santa Clara. On Friday night, I pitched an idea about a notification platform that calls people when certain things happen. The first use case would be to build a Twitter client using purely old-school audio telephony, so that even someone with a landline phone could use Twitter.</p>
<p>My idea received enough votes to be one of the dozen or so teams to start working. I, along with <a href="https://twitter.com/evanwolf">@evanwolf</a> and <a href="https://twitter.com/romil4you">@romil4you</a> started exploring the idea and what was doable within the 54-hour timeframe. My original idea was to use <a href="https://www.tropo.com/">Tropo</a> to allow people to call a number, transcribe a tweet, and post it on Twitter just by using their voice from any phone in the world. Technically, this would involve doing speech recognition to capture a transcript, play it back to the user (to ensure the recognition was accurate), and then post it. Since the Tropo speech recognition API isn't real-time, though, the user would need to wait at least 15 seconds before we could confirm the transcript.</p>
<p>So we decided to scrap the tweet sending feature and only allow people to receive tweets as a phone call. This means anytime someone @replies to you or directly messages you on Twitter, you'd get a phone call. To prevent multiple phone calls, tweets sent within a short period, are batched together and spoken in one phone call. For most people, this is fine. In the future, the plan is to add filtering, so that you only get calls when certain people (eg. in one of your lists) tweet you.</p>
<p>By presentation time (around 6:30 PM on Sunday) we had the basic product working, from signing up on the Speak It, Baby! web site to making phone calls with new tweets.</p>
<p>Due to the limited timeframe, we weren't able to get approved for the Twitter Streaming API, so we decided to drop the DM feature, and just focus on @replies until we get access to the API. As you can guess, the current way of detecting new tweets is to continuously poll <a href="http://search.twitter.com">search.twitter.com</a> with a list of interested users. (If your tweets are protected, you currently can't use the service.) Finally, incoming tweets are correlated to registered users and stored into a CouchDB database hosted on <a href="https://cloudant.com/">Cloudant</a>.</p>
<p>A <a href="http://nodejs.org/">node.js</a> server monitors the _changes stream from CouchDB and builds up a queue of tweets, for which phone calls need to be made. It uses the Tropo Sessions API to create new outgoing phone calls and manages any phrases the callee might say on the call.</p>
<p>Overall, it was a wonderful experience and I'd do it again. I consider myself a winner anyway since we pretty much launched something that users can start using right now :)  So <a href="http://speakitbaby.com/">sign up</a> today and wait for someone to @mention you, or tweet <a href="https://twitter.com/ammmir">@ammmir</a> and I'll be happy to oblige!</p>]]></description>
  </item>
    <item>
    <title>Continuous availability deployment of node.js apps</title>
    <link>http://amirmalik.net/2010/11/30/continuous-availability-deployment-of-nodejs</link>
    <guid isPermaLink="true">http://amirmalik.net/2010/11/30/continuous-availability-deployment-of-nodejs</guid>
    <pubDate>Thu, 30 Dec 2010 08:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>I've been thinking about the problem of highly available node.js applications and how to keep things running smoothly when deploying new code. Ideally, when deploying, you don't want to lose existing connections, and users should never see HTTP 502, 503, or 504 proxy errors. Although it's possible to perform hot-code replacement in node.js, it's not an approach I think is mature yet in handling all the little corner cases that may come up.</p>
<p>A more general way to tackle this is by taking advantage of load balancing.  Let's take the simple scenario of one reverse proxy (nginx) sitting in front of one node.js instance. You have nginx configured to to talk to the live production instance (version 1) or to the pre-live instance (version 2). When you want to deploy version 2, the code will be uploaded to the server, and the v2 node instance started. Now, at this point, traffic is still going to the v1 instance. We must let nginx know that for all future requests, route requests to v2, but let in-flight requests continue to talk to v1. This will keep things like WebSocket connections and long-poll sessions humming along until you retire v1.</p>
<p>So now we have two versions in production, but eventually, v1 can be shut down organically (when all requests finish) or it can be forced to shutdown after some specified amount of time. In the latter case, the web app or whatever thing is talking to your node application, should be designed to reestablish connections transparently. That way you can deploy during peak traffic without user complaints.</p>
<p>In this nginx configuration snippet, two upstreams are defined with one server each. You can add more if you like, since node.js doesn't currently support worker processes out of the box. I'm using UNIX domain sockets because they're represented as files and we can use mv to "atomically" switch versions on the fly.</p>
<script src="https://gist.github.com/721313.js"></script>
<p>Initially we have v1 deployed and listening on <code>/tmp/myapp-new.sock</code> and myapp-old.sock doesn't exist yet. Now we bring up v2 and have it listen on some other unique socket, <code>/tmp/myapp-v2.sock</code>. First, we need to free up myapp-new.sock so we move it to myapp-old.sock. To the outside world, nothing has changed, but nginx is now proxying requests to a new socket. Finally, we move myapp-v2.sock to myapp-new.sock.</p>
<script src="https://gist.github.com/721328.js"></script>
<p>Done.</p>
<p>And the best part? The only change to your app is the line that calls <code>server.listen()</code>: instead of specifying a port number, use an absolute path to a UNIX socket.</p>]]></description>
  </item>
    <item>
    <title>How to share Backbone.js models with node.js</title>
    <link>http://amirmalik.net/2010/11/27/how-to-share-backbonejs-models-with-nodejs</link>
    <guid isPermaLink="true">http://amirmalik.net/2010/11/27/how-to-share-backbonejs-models-with-nodejs</guid>
    <pubDate>Mon, 27 Dec 2010 08:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>I've been building a <a href="http://nodejs.org/">node.js</a> app for a project for a while now, and I just redesigned the architecture of the client (a single-page HTML5 app) to use <a href="http://documentcloud.github.com/backbone/">Backbone.js</a>.  The problem that I needed to solve was the ability to reuse common data models and business logic both on the client and the server, so that I wouldn't have to have two different representations of the same model. I like to have all my parsing and serialization logic "nearby" so if the over-the-wire format changes, there's no hunting involved.</p>
<p>One of the real beauties of server-side JavaScript is that you're able to reuse business logic on the client. Mundane tasks like input validation, need to at least happen on the server. Traditional Web 1.0 apps did these entirely on the server, but modern web apps often need to do it both on the server and client since a web-based UI might not be the only consumer. If you're offering an API for third-party developers, then it's handy to offer single logic for validation to avoid inconsistencies.</p>
<p>Backbone.js requires <a href="http://documentcloud.github.com/underscore/">Underscore.js</a>, so both need to be made available to modules in the node.js environment. Luckily, both are CommonJS-aware, so adding the directory containing underscore.js to the require path as part of your bootstrapping process is a good idea:</p>
<pre><code>require.paths.unshift('../vendor/underscore');
</code></pre>
<p>The following code generates the client-side source from a model object that could contain both server and client-side logic. It looks for an <code>__exports__</code> property in the constructor. ClientModelFactory will only serialize properties defined by <code>__exports__</code> either through the exact name or a regular expression matching the constructor's own properties or those of its prototype.</p>
<script src="https://gist.github.com/717740.js"></script>
<p>To use this technique, you should include both Underscore.js and Backbone.js in your HTML page as usual. You'll also want to include the generated client-side model that is generated by calling ClientModelFactory.makeAll(). For development, you could have a URL handler at /js/models.js that calls this and returns the generated content. Obviously, for production, doing the generation offline and integrating it with part of your build process makes much more sense.</p>
<p>This approach blurs the line between client and server. In the war against cruft, this is a plus for me.</p>]]></description>
  </item>
    <item>
    <title>On my own</title>
    <link>http://amirmalik.net/2010/07/14/on-my-own</link>
    <guid isPermaLink="true">http://amirmalik.net/2010/07/14/on-my-own</guid>
    <pubDate>Sat, 14 Aug 2010 07:00:00 GMT</pubDate>
    <dc:creator>Amir Malik</dc:creator>
    <description><![CDATA[<p>It's been two months since I left my software engineering job at IBM to explore the world of consulting on my own. At first, consulting projects have excited me because of the freedom to choose what to work on and how to do it. Of course, with freedom comes great responsibility to make wise decisions that you have to stand by.</p>
<p>I've seen people create great things and I'm part of some now, but I'm starting to feel another startup itch of my own. I'm hoping to channel this itch into some really exciting things over the next few months. My biggest problem is always: there are too many ideas worth exploring, what to do first?</p>
<p>While doing my last "startup" I realized we had a great idea for a product users were begging us to release, but the business side didn't really make sense at the time. I've realized that it's important to just brainstorm ideas, wherever you are, or whatever they may be. And it's even more important to write them down somewhere for future reference, since there's bound to be an Aha! moment when you look at ideas from different angles.</p>
<p>I'm constantly asking myself "why does X suck so much?" -- it's my frustrations, sometimes hatred, with technology that really stimulates the most unique, often ridiculous, ideas!</p>]]></description>
  </item>
  </channel>
</rss>