<?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>Avishkar&#039;s Blog</title>
	<atom:link href="http://aautar.digital-radiation.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://aautar.digital-radiation.com/blog</link>
	<description></description>
	<lastBuildDate>Sun, 20 May 2012 05:57:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Baby duck syndrome</title>
		<link>http://aautar.digital-radiation.com/blog/?p=4074</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=4074#comments</comments>
		<pubDate>Tue, 15 May 2012 23:55:47 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[baby duck syndrome]]></category>
		<category><![CDATA[human-computer interaction]]></category>
		<category><![CDATA[imprinting]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=4074</guid>
		<description><![CDATA[Browsing Wikipedia and came across this interesting tidbit, In human–computer interaction, baby duck syndrome denotes the tendency for computer users to &#8220;imprint&#8221; on the first system they learn, then judge other systems by their similarity to that first system. The result is that &#8220;users generally prefer systems similar to those they learned on and dislike [...]]]></description>
			<content:encoded><![CDATA[<p>Browsing Wikipedia and came across <a href="http://en.wikipedia.org/wiki/Baby_duck_syndrome">this interesting tidbit</a>,</p>

<blockquote style="width:375px; margin-right:0; float:left;"><p>In human–computer interaction, <strong>baby duck syndrome</strong> denotes the tendency for computer users to &#8220;imprint&#8221; on the first system they learn, then judge other systems by their similarity to that first system. The result is that &#8220;users generally prefer systems similar to those they learned on and dislike unfamiliar systems.&#8221; The issue may present itself relatively early in a computer user&#8217;s experience, and has been observed to impede education of students in new software systems.</p></blockquote>

<p style="width:200px; float:left; margin-left:2px; margin-top:44px;"><img style="border:none;" src="http://aautar.digital-radiation.com/blog/uploaded_images/baby-duck.jpg" alt="baby duck" /></p>

<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=4074</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bridge in fog</title>
		<link>http://aautar.digital-radiation.com/blog/?p=4064</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=4064#comments</comments>
		<pubDate>Tue, 08 May 2012 04:41:19 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[bridge]]></category>
		<category><![CDATA[fog]]></category>
		<category><![CDATA[photo]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=4064</guid>
		<description><![CDATA[Bridge in Fog II by oriontrail,]]></description>
			<content:encoded><![CDATA[<p><a href="http://oriontrail.deviantart.com/art/Bridge-in-fog-II-144548118">Bridge in Fog II by oriontrail</a>,</p>

<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/oriontrail-bridge-in-fog-ii.jpg" alt="Bridge in fog II" /></p>
]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=4064</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What webOS did better&#8230;</title>
		<link>http://aautar.digital-radiation.com/blog/?p=4001</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=4001#comments</comments>
		<pubDate>Sat, 28 Apr 2012 23:41:02 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[webOS]]></category>
		<category><![CDATA[integrated contacts]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[multitasking]]></category>
		<category><![CDATA[notifications]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[user interface]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=4001</guid>
		<description><![CDATA[Having recently upgraded from a Palm Pixi to a iPhone 4S, leaving behind webOS for iOS, it&#8217;s easy to find many things that are vastly superior on iOS; not surprising, given the superior hardware on the iPhone and the relative maturity of iOS as a platform. However, I find myself missing a few things I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>Having recently upgraded from a Palm Pixi to a iPhone 4S, leaving behind webOS for iOS, it&#8217;s easy to find many things that are vastly superior on iOS; not surprising, given the superior hardware on the iPhone and the relative maturity of iOS as a platform. However, I find myself missing a few things I&#8217;ve become accustomed to with webOS; things I think webOS simply did a better job at.</p>


<p style="float:left; width:305px;"><strong>Notifications</strong><br/>While both platform alert you to events, webOS also kept notifications stacked on the bottom of the display until you chose to swipe them away.</p>
<p style="float:right;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/webos-notifications.png" alt="notifications" /></p>

<p style="clear:both; float:left; width:305px;"><strong>Integrated Contacts</strong><br/>webOS automatically imported and linked contacts from multiple sources (Facebook, Gmail, etc.) making it fairly simple to manage (or more accurately, <em>not have to manage</em>) an address book.</p>
<p style="float:right;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/webos-contacts.png" alt="integrated contacts" /></p>

<p style="clear:both; float:left; width:305px;"><strong>Multitasking</strong><br/>While iOS supports multitasking on a technical level, on a UI/UX level the focus is very much centered on <em>one app at a time</em>, as swapping between apps always requires a trip back to the home screen. The webOS process of sliding between cards was not only a slightly faster method to swap between apps but also fairly convenient when it came to glancing at something in another app and then getting back to what you were doing; the scenario that pops into my mind is texting something from a webpage but not remembering it exactly or entirely, and having to swap between the messaging app and the browser.<br /><br />Also, swiping a card up and off the screen was a fairly elegant way to close it. Exiting apps is perhaps not a big of a deal on an iPhone due to the larger memory pool, but when you do near the memory limit, I&#8217;m not sure double tapping the home button, pressing and holding the app icon, and hitting the remove icon is the easiest nor most intuitive action.</p>
<p><img style="float:right;" src="http://aautar.digital-radiation.com/blog/uploaded_images/webos-browser.png" alt="multitasking" /></p>

<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=4001</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subway relics</title>
		<link>http://aautar.digital-radiation.com/blog/?p=3991</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=3991#comments</comments>
		<pubDate>Sat, 21 Apr 2012 22:01:57 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[NYC]]></category>
		<category><![CDATA[payphone]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[subway]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=3991</guid>
		<description><![CDATA[Old, dirty, and one-third of them don&#8217;t work&#8230;]]></description>
			<content:encoded><![CDATA[<p>Old, dirty, and <a href="http://www.straphangers.org/phones11/">one-third of them don&#8217;t work</a>&#8230;</p>

<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/subway-payphone.jpg" alt="Subway Payphone" /></p>]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=3991</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementing a &#8220;did you mean&#8230;?&#8221; function</title>
		<link>http://aautar.digital-radiation.com/blog/?p=3946</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=3946#comments</comments>
		<pubDate>Sun, 08 Apr 2012 02:01:50 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[did-you-mean]]></category>
		<category><![CDATA[edit distance]]></category>
		<category><![CDATA[levenshtein distance]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[suggester]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=3946</guid>
		<description><![CDATA[A while ago I became interested in how one would go about implementing something akin to Google Search&#8217;s &#8220;did you mean&#8230;&#8221; function. This answer from StackOverflow provides a good overview of what Google does, which involves looking at a user&#8217;s incorrect entry as well as a subsequent correction provided by the user. Data mining both [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I became interested in how one would go about implementing something akin to Google Search&#8217;s &#8220;did you mean&#8230;&#8221; function. This <a href="http://stackoverflow.com/a/307344">answer from StackOverflow</a> provides a good overview of what Google does, which involves looking at a user&#8217;s incorrect entry as well as a subsequent correction provided by the user. Data mining both the incorrect entry and correction, for millions of users and billions (trillions?) of entries, Google Search can thus make an intelligent guess as to what a user really meant when an incorrect entry is submitted. While most applications can&#8217;t do this at Google Search&#8217;s scale or generality (which is a span of terms from across the entire web), I can certainly see this model working for smaller applications, which only need to deal with a smaller subset of terms (this blog for example only needs to handle terms that are in my posts). Remove the data capture aspect, providing a fixed database of terms from which to search, and implementation becomes even simpler!</p>

<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/did-you-mean-gooble-google.png" alt="did you mean google?" /></p>

<p>Digging deeper into implementation details, there&#8217;s the problem of figuring out how closely an input string (X) matches each string in a database of terms (T<sub>i</sub>). The closeness or distance here is the <strong>edit distance</strong> between the 2 strings, or the minimum number of edits it takes to turn one string into another. There are a number of edit distance algorithms, but the <a href="http://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein distance</a> seems to be a popular choice.</p>

<p>For a simple did-you-mean suggester, computing the edit distance is the crux of the method.</p>

<p>To test things out, I did a simple project in C++. Using a straightforward implementation of the Levenshtein distance and a vector of 112 chemical elements (up to copernicium), I wrote a program that would prompt the user for the name of an element, if the element was found it would output &#8220;ELEMENT FOUND&#8221;, if not it would suggest the name of an element based on the user&#8217;s input.</p>

<h3><strong>Includes</strong></h3>
<code style="white-space:pre;"><span style="color:#00F;">#include </span><span style="color:#A31515;">&lt;iostream&gt;<br /></span><span style="color:#00F;">#include </span><span style="color:#A31515;">&lt;string&gt;<br /></span><span style="color:#00F;">#include </span><span style="color:#A31515;">&lt;vector&gt;</span></code>

<h3><strong>Levenshtein distance implementation</strong></h3>
<code style="white-space:pre;"><span style="color:#00F;">int </span><span style="color:#000;">ld(</span><span style="color:#00F;">const </span><span style="color:#000;">std::string&amp; strA, </span><span style="color:#00F;">const </span><span style="color:#000;">std::string&amp; strB)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">int </span><span style="color:#000;">lenA = strA.length() + 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">int </span><span style="color:#000;">lenB = strB.length() + 1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">int</span><span style="color:#000;">** mat;<br />&nbsp;&nbsp;&nbsp;&nbsp;mat = </span><span style="color:#00F;">new int</span><span style="color:#000;">*[lenA];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">for</span><span style="color:#000;">(</span><span style="color:#00F;">int </span><span style="color:#000;">i=0; i&lt;lenA; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat[i] = </span><span style="color:#00F;">new int</span><span style="color:#000;">[lenB];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">for</span><span style="color:#000;">(</span><span style="color:#00F;">int </span><span style="color:#000;">i=0; i&lt;lenA; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat[i][0] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">for</span><span style="color:#000;">(</span><span style="color:#00F;">int </span><span style="color:#000;">j=0; j&lt;lenB; j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat[0][j] = j;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">for</span><span style="color:#000;">(</span><span style="color:#00F;">int </span><span style="color:#000;">i=1; i&lt;=lenA-1; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">for</span><span style="color:#000;">(</span><span style="color:#00F;">int </span><span style="color:#000;">j=1; j&lt;=lenB-1; j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">if</span><span style="color:#000;">(strA[i-1] == strB[j-1])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat[i][j] = mat[i-1][j-1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat[i][j] = std::min(mat[i-1][j-1]+1, std::min(mat[i-1][j] + 1, mat[i][j-1] + 1) );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">int </span><span style="color:#000;">ret = mat[lenA-1][lenB-1];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#008000;">// memory cleanup<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">for</span><span style="color:#000;">(</span><span style="color:#00F;">int </span><span style="color:#000;">i=0; i&lt;lenA; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">delete </span><span style="color:#000;">[] mat[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">delete </span><span style="color:#000;">[] mat;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">return </span><span style="color:#000;">ret;<br />}<br /></span></code>


<h3><strong>Function to construct std::vector<std::string> of chemical elements</strong></h3>
<code style="white-space:pre;"><span style="color:#000;">std::vector&lt;std::string&gt; make_elements_vector()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;std::string&gt; elements;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;hydrogen&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;helium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;lithium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;beryllium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;boron&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;carbon&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;nitrogen&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;oxygen&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;fluorine&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;neon&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;sodium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;magnesium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;aluminium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;silicon&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;phosphorus&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;sulfur&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;chlorine&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;argon&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;potassium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;calcium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;scandium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;titanium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;vanadium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;chromium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;manganese&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;iron&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;cobalt&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;nickel&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;copper&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;zinc&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;gallium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;germanium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;arsenic&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;selenium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;bromine&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;krypton&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;rubidium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;strontium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;yttrium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;zirconium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;niobium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;molybdenum&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;technetium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;ruthenium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;rhodium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;palladium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;silver&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;cadmium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;indium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;tin&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;antimony&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;tellurium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;iodine&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;xenon&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;caesium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;barium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;lanthanum&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;cerium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;praseodymium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;neodymium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;promethium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;samarium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;europium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;gadolinium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;terbium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;dysprosium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;holmium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;erbium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;thulium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;ytterbium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;lutetium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;hafnium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;tantalum&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;tungsten&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;rhenium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;osmium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;iridium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;platinum&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;gold&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;mercury&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;thallium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;lead&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;bismuth&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;polonium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;astatine&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;radon&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;francium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;radium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;actinium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;thorium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;protactinium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;uranium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;neptunium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;plutonium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;americium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;curium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;berkelium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;californium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;einsteinium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;fermium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;mendelevium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;nobelium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;lawrencium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;rutherfordium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;dubnium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;seaborgium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;bohrium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;hassium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;meitnerium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;darmstadtium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;roentgenium&quot;</span><span style="color:#000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;elements.push_back(</span><span style="color:#A31515;">&quot;copernicium&quot;</span><span style="color:#000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">return </span><span style="color:#000;">elements;<br />}<br /></span></code>

<h3><strong>Application Logic</strong></h3>
<code style="white-space:pre;"><span style="color:#00F;">int </span><span style="color:#000;">main(</span><span style="color:#00F;">int </span><span style="color:#000;">argc, </span><span style="color:#00F;">char</span><span style="color:#000;">* argv[])<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;std::string&gt; elements = make_elements_vector();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout &lt;&lt; </span><span style="color:#A31515;">&quot;What element are you attempting to find? &quot;</span><span style="color:#000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::string inputStr;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cin &gt;&gt; inputStr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;size_t minDistIndex = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">int </span><span style="color:#000;">minDist = INT_MAX;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">for</span><span style="color:#000;">(size_t i=0; i&lt;elements.size(); i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">int </span><span style="color:#000;">dist = ld(elements[i], inputStr);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">if</span><span style="color:#000;">(dist &lt; minDist)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minDist = dist;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minDistIndex = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">if</span><span style="color:#000;">(minDist == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout &lt;&lt; </span><span style="color:#A31515;">&quot;ELEMENT FOUND!&quot; </span><span style="color:#000;">&lt;&lt; std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">else<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::string dym = </span><span style="color:#A31515;">&quot;Did you mean &quot; </span><span style="color:#000;">+ elements[minDistIndex] + </span><span style="color:#A31515;">&quot;?&quot;</span><span style="color:#000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout &lt;&lt; dym &lt;&lt; std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#00F;">return </span><span style="color:#000;">0;<br />}</span></code>

<h3>Search for &#8220;hydrogen&#8221;</h3>
<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/ld-hydrogen-element-found.png" alt="hydrogen, element found" /></p>

<h3>Search for &#8220;tillium&#8221;</h3>
<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/ld-tillium-dym-gallium.png" alt="tillium, did you mean gallium?" /></p>

<p>This little demo works surprisingly well and suggestions are more-or-less inline with what you&#8217;d expect. There are obviously limitations as you think about applying this to other domains as language, context, etc. are not taken into consideration, but as a simple suggester it holds up pretty well and is perhaps a nice addition to a number of search methods in a variety of applications (the majority of which don&#8217;t seem to implement anything of the sort).</p>]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=3946</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mapping NYC subway stations</title>
		<link>http://aautar.digital-radiation.com/blog/?p=3902</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=3902#comments</comments>
		<pubDate>Sat, 21 Jan 2012 22:03:32 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[google maps api]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[nyc data mine]]></category>
		<category><![CDATA[nyc open data]]></category>
		<category><![CDATA[NYC subway stations]]></category>
		<category><![CDATA[subway]]></category>
		<category><![CDATA[subway lines]]></category>
		<category><![CDATA[subway stations]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=3902</guid>
		<description><![CDATA[I previously wrote about showing the transit layer with the Google Maps API, this is somewhat of a continuation, but narrower in scope; here I&#8217;ll talk about showing custom markers for New York City subway stations, making use of data from NYC Open Data (formerly the NYC Data Mine). The reason for doing this at [...]]]></description>
			<content:encoded><![CDATA[<p>I previously wrote about <a href="http://aautar.digital-radiation.com/blog/?p=3761">showing the transit layer with the Google Maps API</a>, this is somewhat of a continuation, but narrower in scope; here I&#8217;ll talk about showing custom markers for New York City subway stations, making use of data from <a href="http://nycopendata.socrata.com/">NYC Open Data</a> (formerly the NYC Data Mine).</p>

<p>The reason for doing this at all, given that a Google Map already shows subway stations, is that the default indicators are fairly inflexible:</p>

<ul>
<li>You can&#8217;t use a custom icon to change how they look</li>
<li>You can&#8217;t fire off custom event handlers when the user interacts with them</li>
</ul>

<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/google-maps-transit-subway-city-hall-styled-vm1.png" alt="NYC subway stations near city hall" /></p>

<p>(this is true for all of the <em>point of interest</em> indicators: parks, schools, etc.)</p>

<p>Replacing the point of interest indications with markers turned out to be fairly simple and the data from NYC Open Data was (relatively) clean and readily usable, a pleasant surprise given <a href="http://aautar.digital-radiation.com/blog/?p=3016">my previous experience</a>. For this little project, I exported the <a href="http://nycopendata.socrata.com/Transportation/Subway-Stations/arq3-7z49">Subway Stations dataset</a>; it can be exported in a number of formats, but JSON is probably the easiest to work client-side. With the data readily available as a JSON file, it can be loaded simply with an AJAX call to get the file and, once loaded, the subway stations can be plotted on the map by iterating through the list of stations in the JSON data.</p>

<p>It&#8217;s worth taking a look at the format of the JSON data, as the indexing of the nodes isn&#8217;t all that clear. There&#8217;s a meta element and data element at the root, the data element contains a zero-indexed array of subway stations, and each subway station contains a zero-indexed array of attributes, notably:</p>

<ul>
<li>10 = station name</li>
<li>12 = dash-delimited list of train lines</li>
<li>9 = <em>object</em> with latitude, longitude, and geometry field<br />(Note that these values are referenced by the field name, not a numeric index).</li>
</ul>

<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/nyc-open-data-subway-stations.png" alt="NYC Open Data, Subway Station, JSON format" /></p>

<p>The code to get the JSON data (using jQuery&#8217;s .ajax), iterate through the array of subway stations, extract the relevant pieces of information about the stations, and create map markers for them is shown below. A label is attached to the marker by making use of <a href="http://blog.mridey.com/2009/09/label-overlay-example-for-google-maps.html">Marc Ridey&#8217;s Label class</a>.</p>

<code style="white-space:pre;"><span style="color:#000;">$.ajax({<br />    url: </span><span style="color:#CE7B00;">'http://whatever.com/subway-stops.json'</span><span style="color:#000;">,<br />    success: </span><span style="color:#0000E6;">function </span><span style="color:#000;">(ret)<br />    {<br />        </span><span style="color:#0000E6;">for</span><span style="color:#000;">(</span><span style="color:#0000E6;">var </span><span style="color:#000;">i=0; i&lt;ret.data.length; i++)<br />        {<br />            </span><span style="color:#969696;">// extract station name, latitude, longitude, and dash-delimited list of train lines at station<br />            </span><span style="color:#0000E6;">var </span><span style="color:#000;">stationName = ret.data[i][10];<br />            </span><span style="color:#0000E6;">var </span><span style="color:#000;">lat = ret.data[i][9][</span><span style="color:#CE7B00;">'latitude'</span><span style="color:#000;">];<br />            </span><span style="color:#0000E6;">var </span><span style="color:#000;">lon = ret.data[i][9][</span><span style="color:#CE7B00;">'longitude'</span><span style="color:#000;">];<br />            </span><span style="color:#0000E6;">var </span><span style="color:#000;">trainLines = (ret.data[i][12]).split(</span><span style="color:#CE7B00;">'-'</span><span style="color:#000;">);<br /><br />            </span><span style="color:#969696;">// make comma-delimited list of train lines<br />            </span><span style="color:#0000E6;">var </span><span style="color:#000;">trainLinesLbl = </span><span style="color:#CE7B00;">''</span><span style="color:#000;">;<br />            </span><span style="color:#0000E6;">for</span><span style="color:#000;">(</span><span style="color:#0000E6;">var </span><span style="color:#000;">k=0; k&lt;trainLines.length; k++)<br />            {<br />                trainLinesLbl += trainLines[k];<br />                </span><span style="color:#0000E6;">if</span><span style="color:#000;">(k &lt; trainLines.length-1)<br />                {<br />                    trainLinesLbl += </span><span style="color:#CE7B00;">','</span><span style="color:#000;">;<br />                }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />            }<br /><br />            </span><span style="color:#969696;">// create marker<br />            </span><span style="color:#000;">marker = </span><span style="color:#0000E6;">new </span><span style="color:#000;">google.maps.Marker({<br />                </span><span style="color:#CE7B00;">&quot;position&quot;</span><span style="color:#000;">: </span><span style="color:#0000E6;">new </span><span style="color:#000;">google.maps.LatLng(lat, lon),<br />                </span><span style="color:#CE7B00;">&quot;map&quot;</span><span style="color:#000;">: map,<br />                </span><span style="color:#CE7B00;">&quot;title&quot;</span><span style="color:#000;">: stationName + </span><span style="color:#CE7B00;">&quot; [&quot; </span><span style="color:#000;">+ trainLinesLbl + </span><span style="color:#CE7B00;">&quot;]&quot;</span><span style="color:#000;">,<br />                </span><span style="color:#CE7B00;">&quot;icon&quot;</span><span style="color:#000;">: </span><span style="color:#CE7B00;">&quot;http://whatever.com/marker-subway.png&quot;<br />            </span><span style="color:#000;">});<br /><br />            </span><span style="color:#969696;">// create label for marker<br />            // uses Label created by Marc Ridey<br />            </span><span style="color:#0000E6;">var </span><span style="color:#000;">label = </span><span style="color:#0000E6;">new </span><span style="color:#000;">Label({ map: map });<br />            label.bindTo(</span><span style="color:#CE7B00;">'position'</span><span style="color:#000;">, marker, </span><span style="color:#CE7B00;">'position'</span><span style="color:#000;">);<br />            label.bindTo(</span><span style="color:#CE7B00;">'text'</span><span style="color:#000;">, marker, </span><span style="color:#CE7B00;">'title'</span><span style="color:#000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />        }<br />    }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />});</span></code>


<p>With some minor styling to the label and an icon from <a href="http://mapicons.nicolasmollet.com/">Map Icons Collection</a>, here&#8217;s my result:</p>
<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/nyc-subway-stations-custom-marker.png" alt="NYC subway stations with custom markers" /></p>
]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=3902</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arch Enemies</title>
		<link>http://aautar.digital-radiation.com/blog/?p=3892</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=3892#comments</comments>
		<pubDate>Tue, 03 Jan 2012 03:41:17 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[arch]]></category>
		<category><![CDATA[drawing]]></category>
		<category><![CDATA[enemies]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[illustration]]></category>
		<category><![CDATA[Jason Bergsieker]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=3892</guid>
		<description><![CDATA[Arch Enemies by Jason Bergsieker,]]></description>
			<content:encoded><![CDATA[<p>Arch Enemies by <a href="http://www.flickr.com/people/36022318@N05/">Jason Bergsieker</a>,</p>

<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/arch-enemies.jpg" alt="Arch Enemies" /></p>]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=3892</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Paintings @ Bright Lyons</title>
		<link>http://aautar.digital-radiation.com/blog/?p=3884</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=3884#comments</comments>
		<pubDate>Tue, 27 Dec 2011 03:44:53 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[bart]]></category>
		<category><![CDATA[bright lyons]]></category>
		<category><![CDATA[homer]]></category>
		<category><![CDATA[homer simpson]]></category>
		<category><![CDATA[painting]]></category>
		<category><![CDATA[photo]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=3884</guid>
		<description><![CDATA[Passed by Bright Lyons on Atlantic Avenue in Brooklyn and saw this awesomeness,]]></description>
			<content:encoded><![CDATA[<p>Passed by <a href="http://bright-lyons.blogspot.com/">Bright Lyons</a> on Atlantic Avenue in Brooklyn and saw this awesomeness,</p>

<p style="text-align:center;"><img src="http://aautar.digital-radiation.com/blog/uploaded_images/bright-lyons-homer-bart.png" alt="Bright Lyons, Homer and Bart" /></p>]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=3884</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Batching, a basis for optimization</title>
		<link>http://aautar.digital-radiation.com/blog/?p=1315</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=1315#comments</comments>
		<pubDate>Sun, 18 Dec 2011 07:21:00 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Application Design]]></category>
		<category><![CDATA[batching]]></category>
		<category><![CDATA[BitBlt]]></category>
		<category><![CDATA[GPU]]></category>
		<category><![CDATA[latency]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[relational database]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=1315</guid>
		<description><![CDATA[It&#8217;s interesting that in 3 distinct domains I&#8217;ve run across the same underlying basis for optimization: Graphics: Modern GPUs depend heavily on batching primitives, typically triangles. Instead of rendering triangles individually, you get much better performance by batching primitives together in a list, sending it to the GPU via a single call, then letting the [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s interesting that in 3 distinct domains I&#8217;ve run across the same underlying basis for optimization:</p>

<ul>
<li style="margin:35px 10px;"><strong>Graphics</strong>: Modern GPUs depend heavily on batching primitives, typically triangles. Instead of rendering triangles individually, you get much better performance by batching primitives together in a list, sending it to the GPU via a single call, then letting the GPU pipelines to do their thing.

<br / ><br />Even before modern GPUs, 2D pixel graphics exploited the embarrassingly parallel nature of computer graphics through operations like <a href="http://en.wikipedia.org/wiki/BitBlt">BitBlt</a> which, in essence, batched together blocks of pixels.</li>

<li style="margin:35px 10px;"><strong>Relational Databases</strong>: Issuing lots of small queries can kill performance. A better strategy is usually to make fewer queries, joining and returning as much data as possible with each query. Even if these queries becomes complex and costly, the cost of a complex query will usually still be less than the aggregate cost of numerous simpler queries.</li>

<li style="margin:35px 10px;"><strong>Networking</strong>: <a href="http://en.wikiquote.org/wiki/John_D._Carmack">The speed of light sucks</a>&#8230; server and packet switching latencies make things worse. I usually assume ~50ms baseline latency to send a request packet + get a reply packet back from an internet server (I use the term &#8220;packet&#8221; loosely, referring to programmer-defined, application-level &#8220;packets&#8221; or messages, or whatever you like to call them, not necessarily TCP/IP packets). Note that this baseline is regardless of the amount of information in a packet and is bound by the travel time between server and client.
<br /><br />So, to optimize communication and bandwidth, a good strategy is to transfer as much as possible per-packet instead of depending upon numerous requests/responses to/from a server, which would mean lots of packets and and lots of wasted time.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=1315</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi-faceted online identities</title>
		<link>http://aautar.digital-radiation.com/blog/?p=3745</link>
		<comments>http://aautar.digital-radiation.com/blog/?p=3745#comments</comments>
		<pubDate>Tue, 13 Dec 2011 03:53:51 +0000</pubDate>
		<dc:creator>Avishkar Autar</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[4chan]]></category>
		<category><![CDATA[anonymity]]></category>
		<category><![CDATA[Christopher Poole]]></category>
		<category><![CDATA[identity]]></category>
		<category><![CDATA[moot]]></category>
		<category><![CDATA[multi-faceted identity]]></category>

		<guid isPermaLink="false">http://aautar.digital-radiation.com/blog/?p=3745</guid>
		<description><![CDATA[Incredibly insightful insights by Christopher Poole (&#8220;moot&#8221;, founder of 4chan and Canvas) From SXSW earlier this year&#8230; Zuckerberg&#8217;s totally wrong on anonymity being total cowardice. Anonymity is authenticity. It allows you to share in an unvarnished, unfiltered, raw and real way. The cost of failure is really high when you&#8217;re contributing as yourself, to fail [...]]]></description>
			<content:encoded><![CDATA[<p>Incredibly insightful insights by Christopher Poole (&#8220;moot&#8221;, founder of <a href="http://www.4chan.org/">4chan</a> and <a href="https://canv.as/">Canvas</a>)</p>

<p>From <a href="http://www.guardian.co.uk/technology/2011/mar/13/christopher-poole-4chan-sxsw-keynote-speech">SXSW earlier this year</a>&#8230;</p>

<blockquote><p>Zuckerberg&#8217;s totally wrong on anonymity being total cowardice. Anonymity is authenticity. It allows you to share in an unvarnished, unfiltered, raw and real way.</p></blockquote>

<blockquote><p>The cost of failure is really high when you&#8217;re contributing as yourself, to fail in an environment where you&#8217;re contributing with your real name is costly.</p></blockquote>

<p>As for how anonymity connects to identity, <a href="http://articles.businessinsider.com/2011-10-17/tech/30288875_1_google-and-facebook-multiple-identities-users">he spoke to this at Web 2.0</a>&#8230;</p>

<blockquote><p><strong>It&#8217;s not who you share with, it&#8217;s who you share as</strong>&#8230; We all have multiple identities, it&#8217;s part of being human, identity is prismatic. Google and Facebook would have you believe you are a mirror, but in fact we&#8217;re more like diamonds, you can look at people from any angle and see something totally different and yet they&#8217;re still the same</p></blockquote>

<p style="text-align:center;"><iframe width="560" height="315" src="http://www.youtube.com/embed/e3Zs74IH0mc" frameborder="0" allowfullscreen></iframe></p>]]></content:encoded>
			<wfw:commentRss>http://aautar.digital-radiation.com/blog/?feed=rss2&#038;p=3745</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

