tag:blogger.com,1999:blog-350573252024-02-20T23:26:56.475-06:00recursorrandom samplingskeerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.comBlogger65125tag:blogger.com,1999:blog-35057325.post-83259048117414681922011-07-03T19:13:00.000-05:002011-07-03T19:13:19.439-05:00Adios blogger<div dir="ltr" style="text-align: left;" trbidi="on">I'm moving. I'll be at <a href="http://recursed.org/">recursed.org</a> from now on. </div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-39361110148944152522011-06-21T23:55:00.000-05:002011-06-21T23:55:11.204-05:00Software Stabilization for Video!<div dir="ltr" style="text-align: left;" trbidi="on"><br />
Via <a href="http://googleresearch.blogspot.com/" target="_blank">Google Research</a>:<br />
<br />
<blockquote>Casually shot videos captured by handheld or mobile cameras suffer from significant amount of shake... Our goal was to devise a completely automatic method for converting casual shaky footage into more pleasant and professional looking videos.</blockquote><br />
Eschewing the promo video, I decided to try and run the technique on a video I'd shot from a moving golf cart, that was moving, while climbing a hill, after I'd had a beverage or few. I've added the software stabilized, and the original videos below. Really quite incredible:<br />
<br />
Video Stabilized:<br />
<iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/V9jAYvfw6Ec" width="425"></iframe><br />
<br />
Original:<br />
<iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/323KgT2cSLw" width="425"></iframe><br />
</div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com1tag:blogger.com,1999:blog-35057325.post-37429890800544266202011-06-14T22:58:00.000-05:002011-06-14T22:58:11.440-05:00Tim Bray on the Android Ecosystem<div dir="ltr" style="text-align: left;" trbidi="on"><br />
<div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-size: 14px; font-style: normal; font: normal normal normal 13px/19px Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 1.6em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 380px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Went to a presentation by <a _mce_href="http://en.wikipedia.org/wiki/Tim_Bray" href="http://en.wikipedia.org/wiki/Tim_Bray" target="_blank" title="Tim Bray @ Wikipedia">Tim Bray</a>. Here are my notes:</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Indication of the state of the Economy:</span><br />
<blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Who's looking to hire people? Who's looking for a job? Stand up and talk to each other afterward.</span></blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Explains his role: I'm an advocate, not an evangelist. Tell me about your experiences so I can take them back to the product group.</span><br />
<ul><li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">More than 4BB mobile phones in the world today.</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Only 1BB PCs</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Only 5 years to get to 225MM users for iOS</span></li>
</ul><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Presents a bunch of various choices for presentations and asks for the group to hum based on desire to hear them. That was really funny. Someone really wanted to hear about native versus web app based applications.</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Vast majority of developers don't seem to be making any money. In general, here are the various ways to make money:</span><br />
<ul><li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">App sales</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">App upgrades (Oracle is great at this)</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">In-app advertising (this is a substantial driver of revenue for a lot of developers, banging the Google drum)</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">In-app sales (this is a big deal)</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Subscriptions (trip-it for example, leverages server side platform. 37-signals)</span></li>
</ul><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Who are you selling to?</span><br />
<blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">The mobile industry wants you to think you're selling to a young urban hipster. Too many mobile apps are aimed at solving first-world problems. This is not just not-smart, but immoral. Note that the population in the third world for mobile phones is exploding. Don't scope your demographic too narrowly to just the US.</span></blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Who's buying and installing apps: US is the biggest, next up Japan, next up Korea, next Germany and Britain.</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Multiple APK support: Can now provide multiple APKs that target different segments. Question from audience: Can you ship an app per carrier? Not sure.</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Fixing the insane app count:</span><br />
<blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Two hundred thousand apps and counting. Featured apps get a 25x to 50x spike in downloads. Adding in badges: Editor's Choice, Top Developer, Top Grossing etc. Should help distinguish apps.</span></blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Question from audience: black-listing? Not a bad-idea.</span><br />
<blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Uninstalls for apps are very high value signals when it comes to rating an app.</span></blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Frustrated question from audience: Why so many ways to rate things? No answer.</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Direct Carrier Billing is 50% of revenue: "put it on my phone bill". Transparent to the developer. Didn't take with T-Mobile, but now going nuts in Asia. Every carrier wants this, but it won't happen quickly (two problems):</span><br />
<blockquote><ol><li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Carriers have billing from the 1950s, so its a fierce engineering challenge</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">When you do carrier billing, they show up with 3 engineers and 11 lawyers</span></li>
</ol></blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Some complaints from audience about FUD around DCB and latency to app deployment:</span><br />
<blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Google's core competence never really included communication. But we're talking about things.</span></blockquote><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">What's coming in 3.0 and 3.1 (Ice cream sandwich.. no 'J' yet)</span><br />
<ul><li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">new 'Holo' theme</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">the Palm guy is the UI Czar</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Fragments: widgets that have a lifecycle within an activity. Helps during rotation.</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Really slick notification interface (ribbing at Apple)</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Menu bar is always on, but you can put it in "lights out mode", which blacks it out</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">New Action Bar on the top: like a menu bar on a pc app, and its contextual based on your app</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Renderscript: C like syntax that will exec on the GPU, and runs on LLVM under the covers</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Much better animation</span></li>
<li><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">HTTP Live Streaming (data rate sensitive with backoff)</span></li>
</ul><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Web vs Native: Shows the TripIt app (which implements native, mobile website and full website) through a set of phases.Not obvious. Choices for why native versus web typically hinge on "I know Java (for native)", vs "I know HTML and Javascript (for web)".</span><br />
<div style="font-family: georgia, times, serif;"><br />
</div></div></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-1449580168444179482011-06-04T19:47:00.001-05:002011-06-04T19:49:52.791-05:00Visualizing ten months of work in under two minutes<div dir="ltr" style="text-align: left;" trbidi="on"><br />
Since <a href="http://wordsinmedia.com/">wordsinmedia.com</a> was written using Subversion as its version control system, I was able to run the wonderful <a href="http://code.google.com/p/gource/">gource</a> visualizer on the version control logs. Here's the end result:<br />
<br />
<div style="text-align: center;"><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/7NV_8XzwwY4?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/7NV_8XzwwY4?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></div><br />
</div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-67778949714939070862011-06-04T17:39:00.000-05:002011-06-04T17:39:12.835-05:00A view from the Oyster Dome<div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-hrkxTOPgAFzERzrn7z1lKJ9N6ptBsZ7IjEVJ1Uotduee7RhLPmpsOaRYVSfd0pZBPM9uqXqsIZxlAf2ERMby6KprnoVeusBrUCmfyID4ltuRzDsPt3_mhY4uY8G7XBIUvdWKQQ/s1600/run1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-hrkxTOPgAFzERzrn7z1lKJ9N6ptBsZ7IjEVJ1Uotduee7RhLPmpsOaRYVSfd0pZBPM9uqXqsIZxlAf2ERMby6KprnoVeusBrUCmfyID4ltuRzDsPt3_mhY4uY8G7XBIUvdWKQQ/s400/run1.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;">Mid way to the top of the Oyster Dome last weekend with the Ogden's. Four images stitched with Hugin. Click image to expand to a much higher resolution PNG.</div><div style="text-align: center;"><br />
</div><div style="text-align: center;"><br />
</div><div style="text-align: center;"><iframe frameborder="0" height="300" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=oyster+dome,+bellingham&aq=&sll=37.0625,-95.677068&sspn=62.355813,123.486328&ie=UTF8&hq=oyster+dome,&hnear=Bellingham,+Whatcom,+Washington&t=p&ll=48.614981,-122.448807&spn=0.068093,0.102997&z=12&output=embed" width="300"></iframe></div><div style="text-align: center;"><small><a href="http://maps.google.com/maps?f=q&source=embed&hl=en&geocode=&q=oyster+dome,+bellingham&aq=&sll=37.0625,-95.677068&sspn=62.355813,123.486328&ie=UTF8&hq=oyster+dome,&hnear=Bellingham,+Whatcom,+Washington&t=p&ll=48.614981,-122.448807&spn=0.068093,0.102997&z=12" style="color: blue; text-align: left;">View Larger Map</a></small></div><div style="text-align: center;"><br />
</div></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-75896565791054398282011-04-24T11:15:00.000-05:002011-04-24T11:15:32.445-05:00Masters in CS: worth it after professional experience?<div dir="ltr" style="text-align: left;" trbidi="on">I'll be defending my Master's thesis on May 6th, and if all goes well I'll be graduating with full pomp and circumstance a few weeks thereafter. Hoping that these notes on going back to school to get a Master's in CS after working for many years may prove useful to someone else, I figured it should be captured before I (hopefully, fingers crossed) graduate.<br />
<br />
<span class="Apple-style-span" style="font-size: large;">Quick Context</span><br />
I'd been working for an organization that had treated me well for about six years. Things were good- I'd started out as a developer, almost fresh out of college. Over the years I got various other responsibilities. Eventually, I landed up leading a team that built and maintained a lot of software integral to the organization. This was 7 years after finishing my bachelor's degree.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT7kQdH9iidNa7c0J34YU3KkdWW4efYOFg-BMBa43Jv6fhjTET3_IzujhsbcoMOPHGjWcNHevWjddG0ltn7GGRi05Yh66HsimK0e5pzb6_cskw929c_bJc4nIOKdhaWA8AcwkYgg/s1600/station_large.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="134" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT7kQdH9iidNa7c0J34YU3KkdWW4efYOFg-BMBa43Jv6fhjTET3_IzujhsbcoMOPHGjWcNHevWjddG0ltn7GGRi05Yh66HsimK0e5pzb6_cskw929c_bJc4nIOKdhaWA8AcwkYgg/s200/station_large.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><a href="http://recursor.blogspot.com/2008/04/pulling-data-out-of-air.html">Making weather stations</a></td></tr>
</tbody></table><b>Learning on my own</b><br />
I used to busy myself with various projects outside of work. I'd build weather stations (which got hit by lightning sporadically), write my own Android apps, try and build strange home automation tools, and sometimes try to instrument my pets (never really worked).<br />
<br />
<b>Learning on the job</b><br />
Put delicately, work had stopped challenging me as much as I would have liked it to. Problems existed that needed to be solved, but they seemed to follow similar patterns. The ones that scared me had been solved, or weren't solutions the organization needed to invest in anymore.<br />
<br />
Between work and my own tinkering, I just didn't have the commitment to dig in and try and learn a whole bunch of things in a thorough way. I'd read up a lot, but there wasn't any accountability to really understand things in a way that was truly beneficial. Most of my reading/tinkering made me feel like I was a spectator to what was going on, where I really wanted to be a part of it.<br />
<br />
<span class="Apple-style-span" style="font-size: large;">Finding an institution</span><br />
Seeing that most formal education offers a grounding in a wide array of topics, I felt that a Master's would be a good idea. I started to scour websites of various colleges and universities for information and details on admissions. My undergrad performance left a lot to be desired; my second year's grades read like output from a loop over Random.nextDouble(). But I hoped that my professional experience might offset that disaster. I started to contact various admissions departments for more information on programs, and for queries on admissions requirements. This proved to be really frustrating.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.openclipart.org/image/800px/svg_to_png/money_11.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="200" src="http://www.openclipart.org/image/800px/svg_to_png/money_11.png" width="185" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hand it over.</td></tr>
</tbody></table><br />
<b>Tangential vent: who's the customer?</b><br />
Someone who wants to go to a higher learning establishment is (reasonably speaking) in economic terms: a client. They pay the institution for a service: education. Yet most non-academic (ie: admissions, payments, records etc) departments at every university/college I dealt with treated me horribly- no returned calls, no real information, and never any emails with substance (if replied to at all). This was very disheartening. You're supposed to make a commitment of many tens of thousands of dollars* over two years to people you can't get straightforward and thorough details from about what their program has to offer?!<br />
<br />
<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b>The Academic Departments know what's up</b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">The best way to learn more about a program, to understand how it functions, and to get details on admissions etc. is to contact the Chairperson for the CS department (<i>CC their assistant if they have one too</i>). In general, they're very pragmatic- and will make considerations if you weren't a rockstar during undergrad but have had good working experience. Also, they're going to be the ones to eventually decide whether they want you in their program, so getting a relationship with them up front can't hurt. </div><b><br />
</b><br />
<b>Distance learning?</b><br />
Since my local options had run dry, or were just painful to deal with, I decided to expand my search to universities that provided distance learning. Not surprisingly, any college that provides distance learning also does a pretty good job of communicating with potential applicants via email**. I landed up getting admitted into <a href="http://www.hofstra.edu/">Hofstra</a> after learning more about their <a href="http://www.hofstra.edu/Academics/Colleges/HCLAS/CMPSCI/ONLINEMS/">CS program</a>.<br />
<br />
<b>Not easy, but rewarding</b><br />
About 90% of my courses were really good. In general, the amount gained from a course was proportional to the amount invested by the professor. Surprisingly, I think that all parties (educators and students) have to put in a lot more effort in a distance learning setting than they would in a traditional classroom setting. Consider that your average course taught over distance learning requires that the professor create a video, slides, notes and provide references to various supplementary materials as part of a single lecture. Instead of office hours, you have discussion boards where everyone participates and sometimes the professor throws down a specific discussion point.<br />
<br />
The net result is that you have a much higher bandwidth with your professor- you're in email contact with them often. Frequently, professors will provide their IM handle so you can IM them anytime too. You get to watch the lectures on your time: evenings, weekends or whatever works.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEFjMLpufcy6J74j91sE5kuC_I3omA8TGOGQ8kKiDddRu4JWYiQ3mToMwFsAHU50CkODqZ3hCuF8YaJUJH2ITc9NufIxefJfh9yM9Fczm0Y11RhVFmKim1vo51Dz6kNu3C4uOkPw/s1600/HomeworkFromHotel.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEFjMLpufcy6J74j91sE5kuC_I3omA8TGOGQ8kKiDddRu4JWYiQ3mToMwFsAHU50CkODqZ3hCuF8YaJUJH2ITc9NufIxefJfh9yM9Fczm0Y11RhVFmKim1vo51Dz6kNu3C4uOkPw/s1600/HomeworkFromHotel.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Homework on the road</td></tr>
</tbody></table>I landed up spending weekend after weekend on school for about two years. Most evenings in the week had me hunched over my laptop listening to lectures or answering questions. It isn't easy, but distance learning makes it possible if you have a job that's demanding. You have to develop the discipline to context switch completely though. I kept my "school" laptop on me at all times so that I could power up and watch a lecture or answer a homework assignment if I had any free time***.<br />
<br />
<b>Was it worth it?</b><br />
Yes. Its been a really rewarding process. I've had a bunch of classes of which my favorites were:<br />
<ul style="text-align: left;"><li><u>Algorithm design and analysis</u>: going all the way down to fundamentals and approaching each data structure from an implementation standpoint and analyzing them for every possible operation. Order of magnitude is my best friend.</li>
<li><u>Programming Language Concepts</u>: All I'd had any real experience with were imperative languages, so this was a real mind expander. It exposed me to the fundamentals of functional languages from a theoretical standpoint and then I got to play with them too. <i>(I had to write code in ML and see the most sensible compiler output ever)</i>. This class alone made the whole gig worth it. </li>
<li><u>Security</u>: which makes a lot more sense after you've had to deal with it in a corporate setting. I got to understand asymmetric key generation, encryption, and decryption by hand (and <a href="http://wolframalpha.com/">wolframalpha.com</a>). Not to mention getting familiar with Kerberos and all sorts of other network based authentication systems that make you chuckle when you get a sales pitch about SSO from a vendor. </li>
<li><u>Operating Systems</u>: Based on Andrew Tanenbaum's<a href="http://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/0136006639/ref=ntt_at_ep_dpi_3"> Modern Operating Systems</a>. Deep dives into processes and threads, memory (everything you ever wanted to know about managing memory, algorithms to do so, and tradeoffs), and file system design.</li>
<li><u>Databases</u>: Really understanding how they're built. This proved immensely valuable at work- I took all the theory and was able to apply it back in practice. </li>
<li><u>Advanced Data Structures</u>: Implement every data structure possible with a different one. Get familiar enough with Huffman to create tables and then compress boring documents during a meeting for fun, on paper. </li>
</ul>Most of these taught me things I was able to put to use immediately at work, or in my own tinkering. In many cases, I felt like the framework provided gave me a much better footing for theoretical and design discussions.<br />
<br />
<b>Timing</b><br />
I'm glad I waited to do my Master's after I had a bunch of work experience behind me. Encountering problems in real life (and sometimes solving them in a <a href="http://en.wikipedia.org/wiki/Rube_goldberg">rube-goldberg</a> fashion) allowed me to gain a lot more from school than I would have had I not encountered the problems before hand. I think you get a lot more 'ah-ha!' moments..<br />
<br />
<b>Consequences</b><br />
My primary rationale for going to school was because I felt like I needed to be challenged with problems that I hadn't encountered before. This I got in spades.. And then then there was the <i>character building </i>from the volumes of homework, assignments, papers and such. But it also became glaringly apparent that this would be a finite engagement. Eventually you graduate (you hope!). I wanted to continue this education/masochism. To some degree then, this whole experience helped me realize that I needed to find a different job: where I would have to face a whole bunch of problems that would make me nervous and would have to learn a lot on the fly. And so, I started job hunting. But that's a different story..<br />
<br />
And now, enough procrastinating and back to wrapping up my thesis so I can try and graduate...<br />
<br />
<br />
<u>Footnotes:</u><br />
* Be prepared to invest between $20K to $40K for a good good distance learning program. Plan on getting a laptop that you'll use for the entire program too.<br />
** <a href="http://drexel.edu/"><span id="goog_99823303"></span>Drexel<span id="goog_99823304"></span></a> and <a href="http://www.hofstra.edu/">Hofstra</a> were two that did particularly well.<br />
*** The amount of energy you have to put in is a lot. Plan on getting hit for no less than 15 to 20 hours a week. Recovering once you fall behind is really hard, since the homework and discussion board posts all start to add up and create a huge backlog. </div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-17641914809775672712011-04-03T22:56:00.000-05:002011-04-03T22:56:55.377-05:00Joint != Separate Combined<div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNU46yAXDNQvG_05byLamg9XDpk-ngG9UDoO3FViasRt3eIiNvkRA6lXSQTwZ3rqYu8VDTUHuoisdqMuVvyIiEq2uIPEzhZwsj-W3RqNT2zEaiMfyA-2QLJ0qpOzZqSqiqcn-NpA/s1600/ChooseTaxes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNU46yAXDNQvG_05byLamg9XDpk-ngG9UDoO3FViasRt3eIiNvkRA6lXSQTwZ3rqYu8VDTUHuoisdqMuVvyIiEq2uIPEzhZwsj-W3RqNT2zEaiMfyA-2QLJ0qpOzZqSqiqcn-NpA/s1600/ChooseTaxes.png" /></a></div>Every year, I walk through an online interview to fill out our taxes and this question never fails to amaze me. <br />
<br />
</div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-10004595309413688822011-03-27T15:46:00.000-05:002011-03-27T15:46:11.822-05:00More juice<div dir="ltr" style="text-align: left;" trbidi="on">Recently, I discovered a problem with <a href="http://wordsinmedia.com/">wordsinmedia.com</a>.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIEwM4HEzcFggxVL5MeijTIATGiGtpCImQ4exjDhxc1_ZoiTmPQssZno5oJ0abq4XBHWsN6-cdB3KXRk4Up7uSEioainSd-s8TCwbPW-UuHbxzHIASytaQiXDamNoV1InaJuKJPg/s1600/increasing.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIEwM4HEzcFggxVL5MeijTIATGiGtpCImQ4exjDhxc1_ZoiTmPQssZno5oJ0abq4XBHWsN6-cdB3KXRk4Up7uSEioainSd-s8TCwbPW-UuHbxzHIASytaQiXDamNoV1InaJuKJPg/s1600/increasing.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Week 11 was not fun.</td></tr>
</tbody></table><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">There are three main parts to this system:</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div><ul style="text-align: left;"><li>a database that stores stuff</li>
<li>a set of perl programs that acquire and process the news and store them in the database</li>
<li>and, a website that sits on top of the database whose backend executes within <a href="http://www.eclipse.org/jetty/">Jetty</a></li>
</ul>A recent change I made that increased the number of news sources that were being polled and analyzed, caused a significant spike in resource utilization.<br />
<br />
The additional processing on the perl side is CPU intensive, and with more news to process more cpu was being burned. With more data from the perl side, the MySQL instance had changed its growth rate: queries that dealt with hundreds of rows earlier were now dealing with tens of thousands, causing an increased load on the database. Collectively, everything had added up nicely to swamp the whole system leaving the any queries from the website to become dog slow- rendering the website in a very non-responsive state. And yes, it all lives together- this was nothing more than an experiment that grew incrementally, so...</div><div><br />
All of my hardware is virtually provisioned, and lives within a cloud. I'm biased toward a specific one, but anyway...<br />
<br />
As a first step, I figured I should isolate the various parts to see if that helps things along- there was just too much CPU being contended on to adequately isolate components to make a deterministic call on what was going on. I figured I'd separate the perl processing from the database/web server first. Fairly simple to do:<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMYxflq8hs1j3O2dN4k4Pu0bAu67h7r1-QQcTsjMmmcza1y7LuaWgw6dj_weJoScd6rw-4nvxnE6zMHvQW-dujzUzuYtquFtgDi_Mz8ssnDJgsWnfOg4hjNJSsrXYECLoU0okJbQ/s1600/MontgomeryScott.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMYxflq8hs1j3O2dN4k4Pu0bAu67h7r1-QQcTsjMmmcza1y7LuaWgw6dj_weJoScd6rw-4nvxnE6zMHvQW-dujzUzuYtquFtgDi_Mz8ssnDJgsWnfOg4hjNJSsrXYECLoU0okJbQ/s320/MontgomeryScott.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Need more power?</td></tr>
</tbody></table><br />
<b>Provision a new node</b><br />
Extraordinarily easy, and in many cases, free if you want a small amount of horsepower. Get an OS booted up on it and call it good.<br />
<br />
<b>Addressing</b><br />
Since there's going to be node to node addressing for the perl programs to talk to the database node, you need a way to maintain address lookups. In my case, I rely on Elastic IPs which while public visible also provide internal IPs when used within a security group.<br />
<br />
Fortunately, I only needed to make one change: point the perl programs to the elastic IP instead of pointing to localhost.<br />
<br />
That's it. Asynchronous news acquisition and analysis is on one node, while the database and web server are elsewhere. As evident, separating those two would be trivial too- just get another node, place the war in a web server there, futz with addressing and call it good. If it doesn't work, scrap it- you lost nothing other than the time it took to run your experiment.<br />
<br />
There's no rocket science in any of this. But its heart warming that in reality it really only takes a couple of hours (to the un-initiated like me) to get this done. Contrast that with trying to do this if you had to work with your own hardware- you'd either have to buy some, or hope there's some lying around, or make a case with your hardware team. Then you'd have to hope that this pans out well- since if it doesn't you just sank your investment in hardware.<br />
<br />
This is, admittedly an almost contrived example of why on-demand virtual provisioning is awesome. But I think I got lucky in that my components were so inherently separable. My initial tendency might have been to do something horrible like have the news acquisition/processing live within the scope of the same war that powered the web-end. One deployment/logs/build to worry about right?<br />
<br />
I've been part of many decisions where I suggested or was persuaded to accept that it was ok to stuff yet another component into an already large ball of yarn. Invariably, all of these would get knit together and thus become one inseparable bundle of pain.<br />
<br />
With virtualization being so easy and cheap, I wonder how much easier it might be to consider spinning up fresh instances for every new component you consider? Granted- its a pendulum swing, and might not always be appropriate. But, if you used that premise as a baseline assumption- how would that change the end quality of what you build, how it can scale, and how easy it is to maintain?<br />
<br />
</div></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-88456015292504009232011-03-23T11:18:00.001-05:002011-03-23T11:18:02.553-05:00The interior on the exterior<div><br/><img src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN-CPgYl4qC92r-aP1ohWtWXegODRypJrPHZjx5PHY2kKEtfgNt_Dc1Da-v_C4W9Yce01dMilQk0AbXo3elka8pk9E131U6EgEc7MUzpHb2pjZ_f3cWGdQUX4gJtxXFvht_KzDyw/' /></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0Cascade Children&apos;s Corner, 214 Minor Avenue North, Seattle, WA, United States47.620168 -122.332619tag:blogger.com,1999:blog-35057325.post-65360647707874196192011-03-23T10:56:00.001-05:002011-03-23T10:56:02.934-05:00Funky signage<div><p>Anyone know what this is about? Looks like a Gorilla crossing, perhaps?</p>
<br/><img src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5qS7DBAEqFQ0eNVdJz4LbR3FisGjZT3-mb8W_dRkWOMu-8Ulg-0Ugo2pZXCt6XDFUx7mrdG1XfpRQkckkraGoqyh6y4VnV_Mv0ThsT3bpALiy7YZ9yhcdY4s8FK8KDMXixQHZw/' /></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com2tag:blogger.com,1999:blog-35057325.post-55688399268717902202010-12-14T23:10:00.004-06:002010-12-15T00:52:03.430-06:00chronicling something strangeI've been trying to get to Google Maps but keep getting flipped to Yahoo Maps. Trying to capture what happened in case others have experienced this in the past or are experiencing this now.<br /><br />First off, this looks odd:<br /><br /><span class="Apple-style-span">$ traceroute maps.google.com<br />traceroute to maps.l.google.com (98.136.42.132), 64 hops max, 52 byte packets<br />1 192.168.1.1 (192.168.1.1) 10.414 ms 0.979 ms 1.009 ms<br />2 73.220.38.1 (73.220.38.1) 8.990 ms 8.228 ms 7.975 ms<br />3 ge-4-13-ur01.seattle.wa.seattle.comcast.net (68.87.207.65) 8.295 ms 7.303 ms 8.122 ms<br />4 be-70-ar01.burien.wa.seattle.comcast.net (68.85.240.101) 9.642 ms 11.061 ms 8.976 ms<br />5 be-40-ar01.seattle.wa.seattle.comcast.net (68.85.240.94) 10.064 ms 10.512 ms 9.978 ms<br />6 pos-0-0-0-0-cr01.portland.or.ibone.comcast.net (68.86.93.105) 14.582 ms<br />68.86.95.185 (68.86.95.185) 18.711 ms<br />pos-0-1-0-0-cr01.portland.or.ibone.comcast.net (68.86.93.109) 14.648 ms<br />7 pos-1-7-0-0-cr01.seattle.wa.ibone.comcast.net (68.86.85.109) 14.971 ms 13.591 ms 13.087 ms<br />8 te-3-2.car1.seattle1.level3.net (4.79.104.105) 14.353 ms 14.662 ms 14.563 ms<br />9 ae-31-51.ebr1.seattle1.level3.net (4.68.105.30) 25.328 ms 20.115 ms 17.439 ms<br />10 ae-7-7.ebr3.sanjose1.level3.net (4.69.132.49) 37.199 ms 38.963 ms 35.658 ms<br />11 ae-73-73.csw2.sanjose1.level3.net (4.69.134.230) 35.853 ms 41.441 ms 35.956 ms<br />12 ae-33-89.car3.sanjose1.level3.net (4.68.18.133) 32.992 ms 35.116 ms 34.360 ms<br /><b>13 yahoo-inc.car3.sanjose1.level3.net (4.71.112.14) 33.677 ms 35.309 ms 35.993 ms<br />14 ae-0-d161.msr1.sp1.yahoo.com (216.115.107.59) 33.408 ms<br />ae-0-d171.msr2.sp1.yahoo.com (216.115.107.83) 80.014 ms<br />ae-1-d161.msr1.sp1.yahoo.com (216.115.107.63) 34.297 ms<br />15 et-17-1.fab3-1-gdc.sp2.yahoo.com (67.195.128.73) 37.080 ms<br />et-17-1.fab4-1-gdc.sp2.yahoo.com (67.195.128.77) 35.420 ms<br />et-17-25.fab3-1-gdc.sp2.yahoo.com (98.136.16.27) 35.792 ms<br />16 te-8-1.bas-c1.sp1.yahoo.com (67.195.130.112) 36.362 ms<br />te-9-1.bas-c1.sp1.yahoo.com (67.195.130.116) 34.918 ms<br />te-8-1.bas-c1.sp1.yahoo.com (67.195.130.112) 34.479 ms<br /></b></span><br /><div><br /></div><div>Here's what an HTTP request looks like:</div><div><br /></div><div><div><span class="Apple-style-span">$ telnet maps.google.com 80</span></div><div><span class="Apple-style-span">Trying 98.136.42.132...</span></div><div><span class="Apple-style-span">Connected to maps.l.google.com.</span></div><div><span class="Apple-style-span">Escape character is '^]'.</span></div><div><span class="Apple-style-span">GET / HTTP/1.1</span></div><div><span class="Apple-style-span"><b>Host: maps.google.com</b></span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span">HTTP/1.1 200 OK</span></div><div><span class="Apple-style-span">Date: Wed, 15 Dec 2010 05:10:15 GMT</span></div><div><span class="Apple-style-span"><b>P3P: policyref="http://info.yahoo.com/w3c/p3p.xml"</b>, CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"</span></div><div><span class="Apple-style-span">Expires: Wed, 16 Mar 1966 12:00:00 GMT</span></div><div><span class="Apple-style-span">Cache-Control: must-revalidate</span></div><div><span class="Apple-style-span">Pragma: no-cache</span></div><div><span class="Apple-style-span"><b>Set-Cookie: _ygms=deleted; expires=Tue, 15-Dec-2009 05:10:14 GMT; path=/; domain=.maps.yahoo.com</b></span></div><div><span class="Apple-style-span">Vary: Accept-Encoding</span></div><div><span class="Apple-style-span">Connection: close</span></div><div><span class="Apple-style-span">Transfer-Encoding: chunked</span></div><div><span class="Apple-style-span">Content-Type: text/html; charset=UTF-8</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span">10dd </span></div><div><span class="Apple-style-span"><i>(html escaping by me)</i><b> HTML/HEAD/TITLE: Yahoo! Maps, Driving Directions, and Traffic.. </b>and the rest of the HTML...</span></div></div><div><span class="Apple-style-span"><br /></span></div><div><br /></div><div>Will keep digging.. Wonder if the DNS address is right from where I am, or if my DNS server has been rogered.</div><div><br /></div><div><div>$ nslookup</div><div>> maps.google.com</div><div>Server:<span class="Apple-tab-span" style="white-space:pre"> </span>192.168.1.1</div><div>Address:<span class="Apple-tab-span" style="white-space:pre"> </span>192.168.1.1#53</div><div><br /></div><div>Non-authoritative answer:</div><div>maps.google.com<span class="Apple-tab-span" style="white-space:pre"> </span>canonical name = maps.l.google.com.</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.104</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.106</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.103</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.99</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.105</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.147</div></div><div><br /></div><div>[Update- back to normal]</div><div><br /></div><div>nslookup says:</div><div><div>> maps.google.com</div><div>Server:<span class="Apple-tab-span" style="white-space:pre"> </span>192.168.1.1</div><div>Address:<span class="Apple-tab-span" style="white-space:pre"> </span>192.168.1.1#53</div><div><br /></div><div>Non-authoritative answer:</div><div><br /></div><div>maps.google.com<span class="Apple-tab-span" style="white-space:pre"> </span>canonical name = maps.l.google.com.</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.106</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.104</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.103</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.147</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.105</div><div>Name:<span class="Apple-tab-span" style="white-space:pre"> </span>maps.l.google.com</div><div>Address: 74.125.127.99</div></div><div><br /></div><div>which looks like the original nslookup. </div><div><br /></div><div>And now this works fine too:</div><div><br /></div><div><div>$ telnet maps.google.com 80</div><div><b>Trying 74.125.127.99...</b></div><div><b>Connected to maps.l.google.com.</b></div><div>Escape character is '^]'.</div><div>GET / HTTP/1.1</div><div>Host: maps.google.com</div><div><br /></div><div>HTTP/1.1 200 OK</div><div>Date: Wed, 15 Dec 2010 06:50:42 GMT</div><div>Expires: -1</div><div>Cache-Control: private, max-age=0</div><div>Content-Type: text/html; charset=ISO-8859-1</div><div>Set-Cookie: PREF=ID=0b3839d36a39775f:TM=1292395842:LM=1292395842:S=ogeImsmEEtA3UI9c; expires=Fri, 14-Dec-2012 06:50:42 GMT; path=/; domain=.google.com</div><div>X-Content-Type-Options: nosniff</div><div>Server: mfe</div><div>X-XSS-Protection: 1; mode=block</div><div>Transfer-Encoding: chunked</div><div><br /></div><div>1000</div></div><div><br /></div><div><br /></div><div>I wonder if I ran my nslookup query too late on the first sequence to catch the glitch. </div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-47803017376034984892010-11-25T16:01:00.004-06:002010-11-25T20:59:56.793-06:00onward<p>My job at <a href="http://www.gallup.com">Gallup</a> moved me to <a href="http://en.wikipedia.org/wiki/Omaha">Omaha</a> in 2003. Perhaps most importantly, I managed to find <a href="http://maximizealot.blogspot.com">my wife</a> here. My job treated me well. We found a great place to live: out away from everything, on a lake, with no neighbors, and 20 acres of wooded hills.</p><br /><br /><img src="https://7244713060206375207-a-1802744773732722657-s-sites.googlegroups.com/site/keerat/Home/moving.jpg"></img><br /><br /><p>Earlier this month, I resigned from my job and accepted one in Seattle. So, now we begin our move..</p><br /><br /><img src="http://upload.wikimedia.org/wikipedia/commons/7/7e/Seattle_07752.JPG" width="640px"></img>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-63048632236855222522010-08-09T15:09:00.002-05:002010-08-09T16:16:11.696-05:00I think I got it right..In my post "<a href="http://recursor.blogspot.com/2010/05/how-exactly-did-comcast-win.html">How exactly did Comcast win?</a>", I concluded with:<br /><br /><blockquote>It seems clear, from both the court ruling and the political stance, that the FCC is a operating from a position that needs to be revisited. Ironically, even Comcast seems to think so.<br /></blockquote><br /><br />From Google and Verizon's recent <a href="http://googlepublicpolicy.blogspot.com/2010/08/joint-policy-proposal-for-open-internet.html">joint policy proposal on an open internet</a>, there's a clear push to get the FCC to have the authority to do exactly what they could not do with Comcast:<br /><br /><blockquote>..because of the confusion about the FCC’s authority following the Comcast court decision, our proposal spells out the FCC’s role and authority in the broadband space. In addition to creating enforceable consumer protection and nondiscrimination standards that go beyond the FCC’s preexisting consumer safeguards, the proposal also provides for a new enforcement mechanism for the FCC to use. Specifically, the FCC would enforce these openness policies on a case-by-case basis, using a complaint-driven process. The FCC could move swiftly to stop a practice that violates these safeguards, and it could impose a penalty of up to $2 million on bad actors. </blockquote>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-35331381754033391732010-08-05T21:57:00.003-05:002010-08-05T22:01:42.648-05:00An (old) term paper regarding TorIf you value free speech, you should read about <a href="http://www.torproject.org/">Tor</a>. <div><br /></div><div>After becoming enamored with it, I <a href="https://sites.google.com/site/keerat/Home/Tor.pdf?attredirects=0&d=1">wrote an acceptable term paper</a> on the project.</div><div><br /></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-20618149800391555182010-07-15T19:43:00.000-05:002010-07-15T19:44:06.842-05:00Mailbox 2.0<div style="text-align:center;margin:0px auto 10px;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9dCuFyETOiN1W04OsG8TY9Hvz3s1tAlxOkUwU1EZgpYBhJgVHXIJwgwhZtfcAYYD43yBhbGoUFWYGT7NjWDH3mXjm4-1U-NPib8PPZIuQ1SdasdiIeyCt8gMERyZt1lz78cNDcQ/s1600/IMG_5182.JPG"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9dCuFyETOiN1W04OsG8TY9Hvz3s1tAlxOkUwU1EZgpYBhJgVHXIJwgwhZtfcAYYD43yBhbGoUFWYGT7NjWDH3mXjm4-1U-NPib8PPZIuQ1SdasdiIeyCt8gMERyZt1lz78cNDcQ/s320/IMG_5182.JPG" border="0" alt="" /></a> </div><div style="text-align:center;margin:0px auto 10px;"><br /></div>Our new (custom built) mailbox, replete with paint. And yes- its a leaping dog, all this courtesy of Bruce. <div><br /></div><div style='clear:both; text-align:CENTER'><a href='http://picasa.google.com/blogger/' target='ext'><img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /></a></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-62821296309851423052010-06-13T21:09:00.003-05:002010-06-13T21:20:48.483-05:00Panoramic Experiment<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNktN4eJm_Zat1GyCU7eKo8QPbVFPDxYVfTZjE9gyoeshpBK7YIU2zhBDsBZ6vqwe82NryNxDJ8aQ2XrkMoIme6aIUFzEXJncCYD2x1CRO85BQEmv7kfe1tCwPCX4zHolbRpjkhg/s1600/MediumPanoramaCropped.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 373px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNktN4eJm_Zat1GyCU7eKo8QPbVFPDxYVfTZjE9gyoeshpBK7YIU2zhBDsBZ6vqwe82NryNxDJ8aQ2XrkMoIme6aIUFzEXJncCYD2x1CRO85BQEmv7kfe1tCwPCX4zHolbRpjkhg/s400/MediumPanoramaCropped.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5482447257120744738" /></a><br />Six different pictures shot with a Canon XSi, and an EF 50mm prime lens. White balance set to 6000K (cloudy). Net result, stitched with <a href="http://hugin.sourceforge.net/">Hugin</a>. <div><br /></div><div>Organic things (like grass, and flowers and such) that tend to move here and there or have tiny edges that recast shadows in variant ways tend to cause a little bit of trouble, but Hugin does a great job in overcoming them. </div><div><br /></div><div><br /></div><div><div><br /></div><div><br /></div></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-59003563405748641712010-05-16T16:36:00.005-05:002010-05-16T20:33:48.529-05:00How exactly did Comcast win?<div><br /></div><div>On April 6th 2010, a US Court of Appeals found that Comcast could not be held accountable for a ruling made by the FCC. For some following the whole process, this seemed pretty odd. </div><div><br /></div><div>As a quick recap, here's how this began:</div><div><div></div><blockquote><div><i>Initial reports of users having trouble with BitTorrent connections began to circulate on discussion forums around May 2007. Those affected appeared to be Comcast subscribers, and observers began speculating about the causes. A Comcast subscriber named Robb Topolski ran a tool called a packet sniffer3 while attempting to "seed" (i.e., offer to others for download) files on BitTorrent and discovered unexpected TCP RST packets that were causing inbound connections to his computer to die.</i></div><div><br /></div><div><a href="http://www.eff.org/wp/packet-forgery-isps-report-comcast-affair">Packet Forgery By ISPs: A Report on the Comcast Affair</a></div><div></div></blockquote><div>The <a href="http://www.eff.org/">EFF</a> proved that Comcast was injecting packets into sockets that were crucial to BitTorrent traffic. If you've written code that worked over sockets, consider how much overhead you'd require to validate that the transport layer wasn't screwing you.<i> </i>The FCC got involved next:</div><div><br /></div><div></div><blockquote><div><i>The FCC determined that Comcast had violated the agency's Internet Policy Statement when it blocked certain applications on its network and that the practice at issue in this case was <b>not "reasonable network management."</b></i></div><div><br /></div><div><a href="http://opencrs.com/document/R40234/">http://opencrs.com/document/R40234/</a></div></blockquote><div>What happened next was quite interesting. Here's how Comcast came back (from the same Open CRS document above):</div><div><br /></div><div><div></div><blockquote><div><i>Comcast argues that the FCC does not have the authority to enforce its Network Management Principles and the Commission's order was invalid for that reason.</i></div><div></div></blockquote><div><br /></div><div>We now had the following scenario:</div><div><ol><li>The FCC called out a major ISP and said that they were in violation of reasonable network management practices</li><li>Comcast responded by saying that the FCC had no jurisdiction to make such a claim and appealed the ruling from the FCC</li></ol></div><div><br /></div><div>Here's what Comcast's PR machine signed off with as they went to court with the FCC:</div><div><br /></div><div><div><blockquote><i>It’s truly sad that the debate around “net neutrality,” or the need to regulate to “preserve an open Internet,” has been filled with so much rhetoric, vituperation, and confusion. That’s gone on long enough. It is time to move on, and for the FCC to decide, in a clear and reasoned way, whether and what rules are needed to “preserve an open Internet,” and to whom they should apply and how. In launching the rulemaking, the FCC said that greater clarity is required, and we agree. Comcast will join many other interested parties in making comments to the FCC this week regarding its proposed open Internet rules. Our goal is to move past the rhetoric and to provide thoughtful, constructive, and fact-based guidance as the FCC looks for a way forward that will be lawful and that will effectively balance all the important interests at stake.</i></blockquote><blockquote><a href="http://blog.comcast.com/2010/01/comcast-the-fcc-and-open-internet-rules-where-we-stand.html">Comcast, the FCC, and "Open Internet" Rules: Where We Stand</a></blockquote></div></div><div><br /></div><div>Nonetheless, this went to court, and a US Court of Appeals found that Comcast was indeed legitimate in its challenge:</div><div><br /></div><div><div><div></div><blockquote><div><i>..the Commission relies on</i><span class="Apple-style-span" style=" ;font-size:x-small;"><i> secti</i></span><span class="Apple-style-span" style="font-size:x-small;"><i>on 4(i) of</i></span><i> the Communications Act of 1934, which authorizes the Commission to “perform any and all acts, make such rules and regulations, and issue such orders, not inconsistent with this chapter, as may be necessary in the execution of its functions.” </i><span class="Apple-style-span" style="font-size:x-small;"><i>47 U.S.C. § 154(i)</i></span><i>. The Commission may exercise this “ancillary” authority only if it demonstrates that its action—here barring Comcast from interfering with its customers’ use of peer-to-peer networking applications—is “reasonably ancillary to the . . . effective performance of its statutorily mandated responsibilities.” </i><span class="Apple-style-span" style="font-size:x-small;"><i>Am. Library Ass’n v. FCC, 406 F.3d 689, 692 (D.C. Cir. 2005). </i></span><i>The Commission has failed to make that showing.</i></div><div><br /></div><div><a href="http://pacer.cadc.uscourts.gov/common/opinions/201004/08-1291-1238302.pdf">U.S. Court of Appeals for the D.C. Circuit Opinions [PDF]</a></div><div><br /></div><div></div></blockquote><div>It seems like a US Court just ruled that the FCC doesn't have the authority to tell an ISP not to tamper with subscriber traffic. I hope you're as stunned as I am. </div><div><br /></div><div>On May 6th, Congressman <a href="http://rockefeller.senate.gov/">Jay Rockerfeller</a> and Representative <a href="http://waxman.house.gov/">Henry Waxman</a> wrote to the FCC Chairman. Here's an excerpt from <a href="http://docs.house.gov/energycommerce/05052010/Genachowski.FCC.2010.05.05.pdf">their letter [PDF]</a> :</div><div><br /></div><div><div></div><blockquote><div><i>We believe that it is essential for the Commission to have oversight over these aspects of broadband policy, because they are vitally important to consumers and our growing digital economy. For this reason, in the near term, we want the agency to use all of its existing authority to protect consumers...</i></div><div><i><br /></i></div><div><i>To accomplish these objectives, the Commission should consider all viable options. This includes a change in classification, provided that doing so entails a light regulatory touch, with appropriate use of forbearance authority.</i></div><div><i><br /></i></div><div><i><b>In the long term, if there is a need to rewrite the law to provide consumers, the Commission, and industry with a new framework for telecommunications policy, we are committed as Committee Chairmen to doing so.</b></i></div></blockquote><div><br /></div><div>It seems clear, from both the court ruling and the political stance, that the FCC is a operating from a position that needs to be revisited. Ironically, even Comcast seems to think so. </div><div><br /></div><div>As a populace, it seems like a great opportunity for American citizens that care about their network (which is part of a bigger network) to write their political representatives. Consider for a minute how similar these two are:</div><div><ul><li>an ISP that has a monopoly on a subscriber base that chooses to manage traffic sending malicious packets down sockets to disrupt traffic</li><li>a country that chooses to regulate where your sockets can connect to</li></ul></div></div><div>A democracy is only as strong (and smart) as the people that participate in it. Now is the time to learn and take a stance on what you think broadband rights, net neutrality and the regulation of the internet should look like. Get educated, start talking about it, and write to your representatives. New laws are going to be made and you've got a ringside seat in being able to shape them. </div><div><br /></div></div></div></div></div>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-66465001182692946882009-10-22T14:20:00.003-05:002009-10-22T14:34:14.386-05:00Panoramas from Ljubljana and Dubrovnik<div style="text-align: left;">Dubrovnik Coast (4 images stitched in Hugin):<br /></div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZBpFayS0QuW4lbUT54slCJYpFsdzZ4Vam8AmLi3cQHONAXR2-rEInNEwNX0VKrJOdu9UiN7I-j8qATL20V03zhotV63frH_z9TU7wuDQxeLjMRNF3e-J8n-Getp5cgY-Uc4ugmQ/s1600-h/DubrovnikResized.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 71px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZBpFayS0QuW4lbUT54slCJYpFsdzZ4Vam8AmLi3cQHONAXR2-rEInNEwNX0VKrJOdu9UiN7I-j8qATL20V03zhotV63frH_z9TU7wuDQxeLjMRNF3e-J8n-Getp5cgY-Uc4ugmQ/s400/DubrovnikResized.png" alt="" id="BLOGGER_PHOTO_ID_5395508822383123714" border="0" /></a><br />Ljubljana, on the river (6 images stitched in Hugin):<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitoWyNYL7nw6i36R6LsHPUFcTwfVW0haBexzaJkiDtrFbQM79_SRLW5Oqzk-mYy_ZzjYu1essAyTTcjch9CZEM9gKCs3cBzdhyPUwbdAKtZPQGtl8lXI88myLUXOWCr5IK4Fm8Rg/s1600-h/LjubljanaSquareResized.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 139px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitoWyNYL7nw6i36R6LsHPUFcTwfVW0haBexzaJkiDtrFbQM79_SRLW5Oqzk-mYy_ZzjYu1essAyTTcjch9CZEM9gKCs3cBzdhyPUwbdAKtZPQGtl8lXI88myLUXOWCr5IK4Fm8Rg/s400/LjubljanaSquareResized.png" alt="" id="BLOGGER_PHOTO_ID_5395509201668786898" border="0" /></a>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-1695931513067319852009-10-01T15:56:00.006-05:002009-10-01T21:10:18.630-05:00Public/Private Key Math<p>Heavily sourced from: Cryptography and Network Security, Fourth Edition by <a href="http://williamstallings.com/">William Stallings</a>.</p><span style="font-weight: bold;">Key Generation</span><br /><br />Pick two prime numbers: p and q<br /><pre>p = 7<br />q = 13<br /></pre>Compute n=p.q<br /><pre>n=p.q<br />n=7 x 13<br />n=91<br /></pre>Compute the <a href="http://en.wikipedia.org/wiki/Euler_totient">Euler Totient</a> of n: Φ(n) = (p-1)(q-1)<br /><pre>Φ(n) = (7-1)(13-1)<br />Φ(n) = 6 x 12<br />Φ(n) = 72<br /></pre>Pick an integer e, such that the greatest common denominator between Φ(n) and e is 1, and e is greater than 1 but less than Φ(n)<br /><pre>gcd(Φ(n),e)=1 and e>1 and e<Φ(n) gcd(72,e)=1 Choosing e: 5 </pre>Determine the value of d using the formula:<br /><pre>de mod Φ(n) = 1<br />dx5 mod 72 = 1<br /><br />Possible values for dx5 need to be 72*(some integer) + 1:<br />73 (won't work)<br />145 (that will work)<br />145/5 = 29<br /><br />Plugging into:<br />dx5 mod 72 = 1<br />29x5 mod 72 = 1<br /><br />d = 29<br /></pre>With d, e, and n computed, we have our keys:<br /><pre>Public Key: KU = {e, n} = {5, 91}<br />Private Key: KR = {d, n} = {29, 91}<br /></pre><span style="font-weight: bold;">Encryption and Decryption</span><br /><br />Now, we're ready to encrypt. Assuming plaintext M, we compute ciphertext using the formula: C=(M^e)mod(n)<br /><pre>Assuming plaintext M=10<br />C = (M^e) mod(n)<br />C = (10^5) mod(91)<br />C = 82<br /></pre><a href="http://www.wolframalpha.com/input/?i=%2810%5E5%29+mod+91">Compute 10^5 mod 91 via wolframalpha</a>.<br /><br />Decryption uses the formula: M=(C^d)mod(n)<br /><pre>C = 82 (from above)<br />M = (C^29)mod(91)<br />M = (82^29)mod(91)<br />M = 10 (that worked!)<br /></pre><a href="http://www.wolframalpha.com/input/?i=%2882%5E29%29+mod+91">Compute 82^29 mod 91 via wolframalpha</a><br /><br />What's remarkable is how monstrous the math gets using relatively tiny prime numbers to start with. We started with 7, and 13 to create our keys, and our final computation (the decryption) required us to compute 82^29, which is:<br /><pre>31666620625027474232451213268613396669946986162166956032<br /></pre>Our keys, were of a really trivial bit-length {5,91}, and {29,91}. Consider that most asymmetric algorithms talk about keys that are of lengths greater than 1000 bits. Now consider what the size of the exponents may look like, and the corresponding products which need to be modulo divided.keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-2905768259534497072009-08-10T22:22:00.004-05:002009-08-10T22:31:53.590-05:00Dilbert meets Hobbes<p>Today (sadly), I was forced to use a laptop running Windows. </p><br /><br /><ul><br /> <li>I connected a mouse to it (using a USB port)</li><br /> <li>The hardware drivers kicked in and the mouse started to work</li><br /> <li>I used the mouse to move, and click on a window</li><br /> <li>Windows informed me that a mouse had been detected and installed (after I used the aforementioned mouse to move and click on something)</li><br /> <li>This <i>informative dialog</i> stole the focus from the application I was using, after I used the mouse it so eagerly wanted to let me know it had found</li><br /> <li> I have dogs that are better behaved, and far, far more intelligent</li><br /></ul><br /><br /><p><i>Sigh.</i> Pull my teeth out with rusted pliers and pour some salt on whatever is left. If you love eating shit, then.. </p>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com3tag:blogger.com,1999:blog-35057325.post-2914932541214776582009-06-08T20:02:00.005-05:002009-06-18T09:49:19.527-05:00Constant Time Add Operations<p>I had to write a paper recently, and I opted to analyze the seemingly trivial constant time add operations on two different Java list implementations. Guaranteed to bore you to death: <a href="http://sites.google.com/site/keerat/Home/ListAlgorithms.pdf">List Add Operations</a>.</p><br /><br /><p>Updated (18 June 2009) link above should work.</p>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com3tag:blogger.com,1999:blog-35057325.post-62421921725566566982009-04-05T19:45:00.006-05:002009-04-07T22:20:42.153-05:00insert performance variance<p>Disclaimer: I've done some research here based purely on measurement and assumed use cases. The performance discrepancies shown are on very large data volumes (1 million elements), so the findings may or may not be applicable.</p><br /><br /><p>Here's the premise under which I started searching for measurement:</p><br /><ul><br /> <li>I see Sorted collections, specifically TreeSet objects being used rampantly to maintain an ordered set of data</li><br /> <li>Typically, the ordering is comparison based (driven by the object implementing Comparable)<br /> <li>Often, the contents of the collection, once populated, are not tampered with</li><br /> <li>A frequent use of the contents of the collection is to iterate over it in sequence</li><br /></ul><br /><br /><p>Considering the above, it seems like we (I know I've done this) generally feel comfortable incurring some cost upon adding elements to a collection in order to be able to recover them in sorted fashion quickly. The specific cost of insert time is log(n) where n is the number of elements already in the Set. For a clean explanation about why the cost is log(n), read about <a href="http://en.wikipedia.org/wiki/Binary_search_tree">Binary Search Trees</a>.</p><br /><br /><p>Here's what my dilemma is though: add operations on lists cost very little (a constant for all practical purposes). And sorting on a list that can manage a swap operation quickly is likely to be very fast too. A simple <a href="http://en.wikipedia.org/wiki/Quicksort">QuickSort</a> should theoretically be able to accomplish n(log(n)) performance if the data is reasonably well distributed.</p><br /><br /><p>So the question that I wanted to tackle was: <b>For large enough data sets, would it be quicker to get a sorted collection by adding data to a simple list and then sorting it, or would it be quicker to work with a data structure that sorts with each insert?</b> I decided to play with the <a href="http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html">ArrayList</a> and <a href="http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html">TreeSet</a> to dig into this.</p> <br /><br /><p>Here's the ArrayList code:</p><br /><pre><br /> ArrayList<Long> arrayList = <span class="literal">new</span> ArrayList<Long>();<br /> Random r = <span class="literal">new</span> Random(<span class="string">1l</span>);<br /> <span class="literal">long</span> start = System.currentTimeMillis();<br /> <span class="ST0">for</span> (<span class="literal">int</span> x = <span class="string">0</span>; x < <span class="string">1000000</span>; x++) {<br /> <span class="literal">long</span> l = r.nextLong();<br /> arrayList.add(l);<br /> <span class="ST0">if</span> (arrayList.size() % <span class="string">10000</span> == <span class="string">0</span>) {<br /> <span class="literal">long</span> now = System.currentTimeMillis();<br /> System.out.println(now - start);<br /> }<br /> }<br /><br /></pre><br /><br /><p>Here's the TreeSet:</p><br /><pre><br /> TreeSet<Long> treeSet = <span class="literal">new</span> TreeSet<Long>();<br /> Random r = <span class="literal">new</span> Random(<span class="string">1l</span>);<br /> <span class="literal">long</span> start = System.currentTimeMillis();<br /> <span class="ST0">for</span> (<span class="literal">int</span> x=<span class="string">0</span>; x<<span class="string">1000000</span>; x++) {<br /> <span class="literal">long</span> l = r.nextLong();<br /> treeSet.add(l);<br /> <span class="ST0">if</span> (treeSet.size() %<span class="string">10000</span> == <span class="string">0</span>) {<br /> <span class="literal">long</span> now = System.currentTimeMillis();<br /> System.out.println(now - start);<br /> }<br /> }<br /><br /></pre><br /><br /><p>Here's a graph of the performance:</p><br /><br /><img src="http://keerat.googlepages.com/AddPerformance.png"/><br /><br /><p>Not surprisingly, the ArrayList is way quicker. Looking at the cumulative cost though, you get a better picture of the total time it takes to add a lot of data to a sorted vs unsorted collection:</p><br /><br /><img src="http://keerat.googlepages.com/CumulativeCost.png"/><br /><br /><p>Again, not terribly suprising. But, now let's try and equalize the game a bit. Let's transcribe the <a href="http://en.wikipedia.org/wiki/Quicksort#Algorithm">QuickSort Algorithm</a> to code, and then run it on the ArrayList after we've added everything to it. Here's the QuickSort:</p><br /><br /><pre><br /> <span class="literal">private</span> <span class="literal">void</span> sort(List<Long> arr, <span class="literal">int</span> start, <span class="literal">int</span> end, <span class="literal">int</span> d) {<br /> <span class="ST0">if</span> (start < end) {<br /> <span class="literal">int</span> pivot = start;<br /> <span class="literal">int</span> newPivot = partition(arr, pivot, start, end);<br /> sort(arr, start, newPivot - <span class="string">1</span>, ++d);<br /> sort(arr, newPivot + <span class="string">1</span>, end, ++d);<br /> }<br /> }<br /><br /><br /> <span class="literal">private</span> <span class="literal">int</span> partition(List<Long> arr, <span class="literal">int</span> pivot, <span class="literal">int</span> start, <span class="literal">int</span> end) {<br /> <span class="literal">long</span> pivotValue = arr.get(pivot);<br /> swap(arr, pivot, end);<br /> <span class="literal">int</span> newPivot = start;<br /> <span class="ST0">for</span> (<span class="literal">int</span> x = start; x < end; x++) {<br /> <span class="ST0">if</span> (arr.get(x) <= pivotValue) {<br /> swap(arr, x, newPivot);<br /> newPivot++;<br /> }<br /> }<br /> swap(arr, newPivot, end);<br /> <span class="ST0">return</span> newPivot;<br /> }<br /><br /> <span class="comment">/**</span><br /><br /><span class="comment"> * </span><span class="comment">Helper</span> <span class="comment">to</span> <span class="comment">manage</span> <span class="comment">a</span><span class="comment"> 3-</span><span class="comment">op</span> <span class="comment">swap</span><br /> <span class="comment">*/</span><br /><br /> <span class="literal">private</span> <span class="literal">void</span> swap(List<Long> arr, <span class="literal">int</span> from, <span class="literal">int</span> to) {<br /> <span class="literal">long</span> tmp = arr.get(from);<br /> arr.set(from, arr.get(to));<br /> arr.set(to, tmp);<br /> }<br /><br /> <span class="literal">public</span> <span class="literal">void</span> sort(List<Long> arr) {<br /> sort(arr, <span class="string">0</span>, arr.size() -<span class="string">1</span>, <span class="string">0</span>);<br /> }<br /><br /></pre><br /><br /><p>And, tweaking the ArrayList insert code to leverage the sort:</p><br /><pre><br /> ArrayList<Long> arrayList = <span class="literal">new</span> ArrayList<Long>();<br /> Random r = <span class="literal">new</span> Random(<span class="string">1l</span>);<br /> QuickSort qs = <span class="literal">new</span> QuickSort();<br /> <span class="literal">long</span> start = System.currentTimeMillis();<br /> <span class="ST0">for</span> (<span class="literal">int</span> x = <span class="string">0</span>; x < <span class="string">1000000</span>; x++) {<br /> <span class="literal">long</span> l = r.nextLong();<br /> arrayList.add(l);<br /> <span class="ST0">if</span> (arrayList.size() % <span class="string">10000</span> == <span class="string">0</span>) {<br /> <span class="literal">long</span> now = System.currentTimeMillis();<br /> System.out.println(now - start);<br /> }<br /> }<br /> qs.sort(arrayList);<br /> <span class="literal">long</span> now = System.currentTimeMillis();<br /> System.out.println(now - start);<br /><br /></pre><br /><br /><p>Our performance numbers are:</p><br /><img src="http://keerat.googlepages.com/CostWithSort.png"/><br /><p>Even with the separate sort, costing n(log(n)), the ArrayList won handsomely (a factor of approx 20%). Granted, the quicksort wasn't very general, but this does seem to raise a few questions. Perhaps for large volumes, this is a viable strategy?</p>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com2tag:blogger.com,1999:blog-35057325.post-81202802264488555202009-04-05T10:02:00.003-05:002009-04-05T10:16:22.703-05:00Mailboxes and Dogs<p>From a few weeks back:</p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2w2mj0vh85016rDOert-5rSthK70ISmQafy1Zbi5ZGC2I7vlImN_9QcAPlE2xD2SN4wEpnSPx4Nk7Vxk1GanmrgNQkoObJG1dt7M_d2pSoD3DE0F78kuo0cpf-Fx9bLyEFMYuFg/s1600-h/mailboxes.JPG"><img style="cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2w2mj0vh85016rDOert-5rSthK70ISmQafy1Zbi5ZGC2I7vlImN_9QcAPlE2xD2SN4wEpnSPx4Nk7Vxk1GanmrgNQkoObJG1dt7M_d2pSoD3DE0F78kuo0cpf-Fx9bLyEFMYuFg/s400/mailboxes.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5321223528058659266" /></a><br /><p>It appears that someone decided to drive over our mailbox. I'm not sure what the state of their vehicle is currently, but it can't be great. Bruce (our neighbor) has set about building a brand new mailbox (post included), and from what I can tell, there's no wood involved- just loads of metal.</p><br /><br /><p>Party on..</p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi67vN0WtnfFEHCGZ-Hu94rXmv_tZg-YdF2szWthzqqcPQHn3AystZYI_uOCWl4nEkQAfeymHwlh1JlfoCpkeMP0yrDp0UrdJ8PhlMAiTFaO-Sinp0QQO56OxTnhCoz6S5Se0Dvvg/s1600-h/party.JPG"><img style="cursor:pointer; cursor:hand;width: 390px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi67vN0WtnfFEHCGZ-Hu94rXmv_tZg-YdF2szWthzqqcPQHn3AystZYI_uOCWl4nEkQAfeymHwlh1JlfoCpkeMP0yrDp0UrdJ8PhlMAiTFaO-Sinp0QQO56OxTnhCoz6S5Se0Dvvg/s400/party.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5321225707633026642" /></a><br /><p>A few weeks back, when the weather was better, we had our neighbors over for brunch. Dogs are always welcome.</p>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com0tag:blogger.com,1999:blog-35057325.post-63642701356615541172009-01-12T17:48:00.004-06:002009-01-12T18:05:07.859-06:00Mowgli<p>Read this news article first: <a href="http://www.kmtv.com/Global/story.asp?S=9587582">Omaha Woman Rescues Dogs from Streets of Mumbai</a></p><br /><br /><p>Mowgli is one of the four puppies from the trash bag, and he now lives with us:</p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMBu8jFY5N8lsQSaa3rclmx5G5G6FplT1oJZLwi1jQH3u-ZkabYO2k6mFxIurEi5OPJX6c_0vWYUO4gxfhno8LCRG92z4KY0kU0PUIyCSCufl9WT0XFzInm0klMFBZKVObzwaalA/s1600-h/mowgli_walk.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMBu8jFY5N8lsQSaa3rclmx5G5G6FplT1oJZLwi1jQH3u-ZkabYO2k6mFxIurEi5OPJX6c_0vWYUO4gxfhno8LCRG92z4KY0kU0PUIyCSCufl9WT0XFzInm0klMFBZKVObzwaalA/s400/mowgli_walk.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290561259685585234" /></a>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com2tag:blogger.com,1999:blog-35057325.post-71163830886904958422008-08-06T22:25:00.006-05:002008-08-07T07:02:44.096-05:00Radiohead rules<p>Like many other people, I saw that <a href="http://www.radiohead.com/">Radiohead</a> had created an interesting music video for <i>House of Cards</i> with all <a href="http://code.google.com/creative/radiohead/">sorts of visualizations</a>. From what I read, they had sampled visual data using <a href="http://en.wikipedia.org/wiki/Lidar">Lidar</a>. Substantial portions of the data used in constructing the video are available (as is the music) to the general public. The <a href="http://www.youtube.com/group/houseofcards">House of Cards</a> group on YouTube showcases how a number of people have re-run the data through various visual engines. </p><br /><br /><p>As you may notice, most of the videos on YouTube use some form of 3D engine to visualize the data. The data is structured fairly simply in the CSV files with x, y, and z coordinates, as well as an intensity level for each point.</p><br /><br /><p>Problem: I'm not adept (at all) with anything 3D based. So, I decided to see if I could <a href="http://en.wikipedia.org/wiki/Kludge">kludge</a> my way into trying to create a visualization of my own using what I know. Er.. All I know is Java and Graphics2D.</p><br /><br /><p>For rendering data, I just used a simple linear scale to position the x and y points. Each point was merely a filled circle. I plotted all points in white. The intensity value on each point drove the alpha values on each point. Lastly, I used the z value to control the size of the point- closer z values got larger points. Here's what I got for starters:</p><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHF7wO8gm8UY2-K3YjoIGeNnY8734bwtlzOpOtRhb5zr-AN2El3Uj1upPdbRQiX_HtQCxQ0H0b9jdz4S7gMvtir12ky6pAZlKGX6Wa9O41YhQFGMORseG1Pu30qcT2tgACsq44GQ/s1600-h/1001-negative.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHF7wO8gm8UY2-K3YjoIGeNnY8734bwtlzOpOtRhb5zr-AN2El3Uj1upPdbRQiX_HtQCxQ0H0b9jdz4S7gMvtir12ky6pAZlKGX6Wa9O41YhQFGMORseG1Pu30qcT2tgACsq44GQ/s400/1001-negative.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5231617945970366914" /></a><br /><br /><p>Some tuning in point size, and changes in colors to prevent it from looking too scary:</p><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvoytiPXu6vKqaUuDATzZAP7PwXg_h23YsIg9hd_QuxvcKWX49SNdVDEwP0vbLBUtvDa6DJdDpEIw1FokHRNRNghLqTpAne4WBAEiX9xikLWpj-UFT-wYEWv1ntcgbzze7UzKX6g/s1600-h/1035-better.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvoytiPXu6vKqaUuDATzZAP7PwXg_h23YsIg9hd_QuxvcKWX49SNdVDEwP0vbLBUtvDa6DJdDpEIw1FokHRNRNghLqTpAne4WBAEiX9xikLWpj-UFT-wYEWv1ntcgbzze7UzKX6g/s400/1035-better.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5231618653581647570" /></a><br /><br /><p>Anyone know an easy way to sequence some 1000 images into a decent video? I can't seem to get iMovie to have a delay between images of less than .3s, and the actual frames need to be rendered out at 30 frames per second. </p><br /><br /><p>*Follow up:* Meant the attach a larger copy that shows the patterns generated by the circle size and alpha variations: </p><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ3HwLVwvqaKHGPPjtfyItv2cksykwSO6tE8Owtaiqo6tbyBolkU0VwSY9GhdbsgVInq0LK2780Phn797X06CL_gu80oxlMFt9gywJrCiQ8I5BEJ63h0fnY5a_dDwavYhHR8CiMA/s1600-h/1701.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ3HwLVwvqaKHGPPjtfyItv2cksykwSO6tE8Owtaiqo6tbyBolkU0VwSY9GhdbsgVInq0LK2780Phn797X06CL_gu80oxlMFt9gywJrCiQ8I5BEJ63h0fnY5a_dDwavYhHR8CiMA/s400/1701.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5231744958548391298" /></a>keerathttp://www.blogger.com/profile/16845883405937018808noreply@blogger.com3