<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>The Infinite Loop</title><link>http://rageshkrishna.com:80/blog</link><description>The Infinite Loop</description><item><title>Plain-text passwords: Will it ever end?</title><link>http://rageshkrishna.com:80/blog/plain-text-passwords-will-it-ever-end</link><description>&lt;p&gt;Sometimes you just have to wonder how long computer security professionals will have to keep screaming “Don’t store passwords in plain-text” before people take notice. Getting an email like this from MasterCard really freaks me out:&lt;/p&gt; &lt;p&gt;&lt;a href="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/How-long-is-this-going-to-take_11A55/MasterCard_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MasterCard" border="0" alt="MasterCard" src="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/How-long-is-this-going-to-take_11A55/MasterCard_thumb.png" width="650" height="415"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I wonder if they store PINs in plain-text, too. It’s just sad when a credit card company’s policies allow something like this to get pushed in to production.&lt;/p&gt;</description><pubDate>Sat, 24 Mar 2012 18:31:39 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/plain-text-passwords-will-it-ever-end</guid></item><item><title>Yes, SIM Cards Must Die</title><link>http://rageshkrishna.com:80/blog/yes-sim-cards-must-die</link><description>&lt;p&gt;I like this idea. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://ilyabirman.net/meanwhile/2012/03/23/1/"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ilyabirman.net" border="0" alt="ilyabirman.net" src="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/SIM-Cards-Must-Die_11779/ilyabirman.net_3.jpg" width="420" height="540"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The author thinks carriers won’t support it because it will prevent them from locking in customers. I think they should support it because it also prevents &lt;em&gt;competitors&lt;/em&gt; from locking in customers.&lt;/p&gt; &lt;p&gt;Read the original post at &lt;a title="http://ilyabirman.net/meanwhile/2012/03/23/1/" href="http://ilyabirman.net/meanwhile/2012/03/23/1/"&gt;http://ilyabirman.net/meanwhile/2012/03/23/1/&lt;/a&gt;&lt;/p&gt;</description><pubDate>Fri, 23 Mar 2012 14:26:48 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/yes-sim-cards-must-die</guid></item><item><title>Opening hours</title><link>http://rageshkrishna.com:80/blog/opening-hours</link><description>&lt;p&gt;I really wonder why the Indian Railways, arguably one of the most active e-commerce sites in the country, needs to be offline for an hour every day.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.rageshkrishna.com/Media/Default/Windows-Live-Writer/Opening-hours_14E5A/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.rageshkrishna.com/Media/Default/Windows-Live-Writer/Opening-hours_14E5A/image_thumb.png" width="644" height="289"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Seriously!?&lt;/p&gt; &lt;p&gt;I run a few web apps of my own and I’ve had only 50 minutes of downtime in an entire month. Yes, I know my app is nowhere near as complex as a railway reservation system. And yes, I know, those of you that are measuring up time in &lt;a href="http://en.wikipedia.org/wiki/Five_nines"&gt;5 nines&lt;/a&gt; are laughing at me, but give me a break – my services are in beta. Still, why does the IRCTC need an hour off &lt;em&gt;every single day&lt;/em&gt;? Sure, as a customer, I’m somewhat inconvenienced, but as a developer I’m really curious as to what they’re doing in that hour.&lt;/p&gt;</description><pubDate>Sun, 15 Jan 2012 18:26:36 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/opening-hours</guid></item><item><title>Turn off the complication!</title><link>http://rageshkrishna.com:80/blog/turn-off-the-complication</link><description>&lt;p&gt;Surely, we’d all be better off if we would just turn off “&lt;em&gt;complications&lt;/em&gt;” in our system settings.&lt;/p&gt; &lt;p&gt;&lt;a href="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/be0b4382ebdf_94A3/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/be0b4382ebdf_94A3/image_thumb.png" width="726" height="200"&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sun, 08 Jan 2012 05:06:40 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/turn-off-the-complication</guid></item><item><title>Priority #1 for 2012: Exercise</title><link>http://rageshkrishna.com:80/blog/priority-1-for-2012-exercise</link><description>&lt;p&gt;2011 has been a very interesting year for me. It’s the year I found out that my body is in far better shape than I give it credit for. The fact that I’ve done almost nothing to aid that over the last 30 years is, however, somewhat troubling. So, for 2012, I’ve decided that the biggest priority for me is to get more exercise.&lt;/p&gt; &lt;p&gt;The funny thing about exercise is that you don’t really need to do a lot of it to start experiencing the benefits. And, you don’t really need to splurge on a gym, either. Just go take a walk. It really is that simple. If you’re getting absolutely no exercise right now, stepping up to nothing more than a brisk 30 minute walk every day will do wonders for your body. Assuming you’re already eating in a relatively healthy manner, a regular walk is all you really need to start burning off fat, increase your energy levels and generally feel better every day.&lt;/p&gt; &lt;p&gt;Walking for half an hour isn’t difficult. What’s difficult is making it a habit. This video is what got me to finally turn this into a real priority for 2012. I hope it does the trick for you, too.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3bd9f2eb-f42d-4b2b-9223-488b02ff9bd0" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;object width="448" height="252"&gt;&lt;param name="movie" value="http://www.youtube.com/v/aUaInS6HIGo?hl=en&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/aUaInS6HIGo?hl=en&amp;amp;hd=1" type="application/x-shockwave-flash" width="448" height="252"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em"&gt;23 and 1/2 hours: What is the single best thing we can do for our health?&lt;/div&gt;&lt;/div&gt;</description><pubDate>Wed, 04 Jan 2012 10:42:38 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/priority-1-for-2012-exercise</guid></item><item><title>Perspective</title><link>http://rageshkrishna.com:80/blog/perspective</link><description>&lt;blockquote&gt; &lt;p&gt;When Windows 95 shipped, my primary machine was a 486/DX50 with 8MB of RAM. My test machine was a 386 with 4MB of RAM. The combined computing power and storage capacity of all the machines in my office is now exceeded by your cell phone.&lt;/p&gt; &lt;p&gt;-- Raymond Chen, Microsoft.&lt;/p&gt;&lt;/blockquote&gt;</description><pubDate>Tue, 03 Jan 2012 04:23:32 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/perspective</guid></item><item><title>Interesting stuff I read last week #2</title><link>http://rageshkrishna.com:80/blog/interesting-stuff-i-read-last-week-2</link><description>&lt;h3&gt;Programming/technology&lt;/h3&gt; &lt;p&gt;&lt;a href="http://programmers.stackexchange.com/questions/114819/are-9-to-5-programmers-looked-down-upon"&gt;Are 9 to 5 programmers looked down upon?&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.gamedev.net/blog/355/entry-2250790-there-are-many-kinds-of-ugly/"&gt;There are many kinds of ugly&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://security.stackexchange.com/questions/7911/what-kind-of-attacks-against-home-routers-nat-do-exist"&gt;What kind of attacks against home router’s NAT do exist?&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://programmers.stackexchange.com/questions/114530/what-were-the-reasons-why-windows-never-had-a-decent-shell"&gt;What were the reasons why Windows never had a decent shell?&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://usabilitygeek.com/official-usability-user-experience-user-interface-guidelines-from-companies/"&gt;Official Usability, User Experience and User Interface Guidelines from companies&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.barracudalabs.com/wordpress/index.php/2011/07/21/google-gets-a-1-for-browser-security-3/"&gt;&lt;strong&gt;Google+ gets a +1 for browser security&lt;/strong&gt;&lt;/a&gt; &amp;lt;—Good checklist for web projects&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.red-team-design.com/just-another-awesome-css3-buttons"&gt;Just some other awesome CSS3 buttons&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://coding.smashingmagazine.com/2011/10/11/essential-jquery-plugin-patterns/"&gt;Essential jQuery plugin patterns&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://news.ycombinator.com/item?id=3134363"&gt;Ask HN: Open-source alternatives of Gmail?&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://listjs.com/"&gt;List.js: Sortable, searchable HTML lists&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://arstechnica.com/gadgets/news/2011/10/lytros-new-light-field-camera-lets-you-focus-after-you-take-a-picture.ars"&gt;&lt;strong&gt;Lytro camera&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;lt;—Wow, I want one of these&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.asp.net/bleroy/archive/2011/10/22/state-of-net-image-resizing-how-does-imageresizer-do.aspx"&gt;State of .NET image resizing&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Startups&lt;/h3&gt; &lt;p&gt;&lt;a href="http://steveblank.com/2011/09/22/how-to-build-a-web-startup-lean-launchpad-edition/"&gt;How to build a web startup – lean launchpad edition&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://security.stackexchange.com/questions/8164/why-are-hand-written-signatures-still-so-commonly-used"&gt;Why are hand-written signatures still so commonly used?&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://thestartuptoolkit.com/blog/The_coffeeshop_fallacy/"&gt;&lt;strong&gt;The coffee shop fallacy&lt;/strong&gt;&lt;/a&gt; &amp;lt;—”Enjoying the product is the luxury of the customer, not the producer.”&lt;/p&gt; &lt;p&gt;&lt;a href="http://excid3.com/blog/want-something-make-it-too-easy-to-say-yes/"&gt;Want something? Make it easy to say yes&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sun, 23 Oct 2011 14:38:55 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/interesting-stuff-i-read-last-week-2</guid></item><item><title>Beautiful vs. Usable</title><link>http://rageshkrishna.com:80/blog/beautiful-vs.-usable</link><description>&lt;p&gt;I like Chrome. I really do. It’s a lovely browser. Fast, clean, minimal. But every so often I run into minor irritations like this, which is why I still use Firefox as my main browser.&lt;/p&gt; &lt;p&gt;Take a look at what Chrome’s tabs look like once you have a lot of stuff going on:&lt;/p&gt; &lt;p&gt;&lt;a href="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/Its-the-little-things_DBD3/chrome.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="chrome" border="0" alt="chrome" src="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/Its-the-little-things_DBD3/chrome_thumb.png" width="858" height="146"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now compare that to Firefox:&lt;/p&gt; &lt;p&gt;&lt;a href="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/Its-the-little-things_DBD3/firefox.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="firefox" border="0" alt="firefox" src="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/Its-the-little-things_DBD3/firefox_thumb.png" width="856" height="162"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The way I see it, at this point Chrome’s tabs are as useless as they are beautiful. Firefox shows you less tabs in one go, but at least I can use what I see and I can scroll through the tabs with my mouse’s scroll wheel. &lt;/p&gt;</description><pubDate>Mon, 17 Oct 2011 12:23:27 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/beautiful-vs.-usable</guid></item><item><title>Interesting stuff I read last week</title><link>http://rageshkrishna.com:80/blog/interesting-stuff-i-read-last-week</link><description>&lt;p&gt;Here are some of the more interesting things I&amp;rsquo;ve read over the past week.&lt;/p&gt;
&lt;h3&gt;Programming/technology&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.theatlantic.com/magazine/archive/2011/11/hacked/8673/1/"&gt;&lt;strong&gt;Hacked!&lt;/strong&gt;&lt;/a&gt; &amp;lt;&amp;mdash; &lt;strong&gt;Important stuff&lt;/strong&gt;. Turn on two-factor authentication in gmail if you haven&amp;rsquo;t done it already.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/113295/when-to-use-c-over-c-and-c-over-c"&gt;When to use C over C++, and C++ over C?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://superuser.com/questions/344704/can-touching-any-hardware-inside-a-running-pc-be-dangerous-for-you"&gt;Can touching any hardware inside a running PC be dangerous for you?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thice.nl/hide-your-data-in-plain-sight-usb-hardware-hiding/"&gt;Hiding your data in plain sight &amp;ndash; USB hardware hiding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ultrapico.com/Expresso.htm"&gt;Expresso 3.0 -- The premier regular expression development tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ux.stackexchange.com/questions/12629/undo-history-why-limit-it"&gt;Undo History - Why limit it?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://superuser.com/questions/346856/why-is-not-all-internet-traffic-encrypted"&gt;&lt;strong&gt;Why is not all internet traffic encrypted?&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.thoughtcrime.org/ssl-and-the-future-of-authenticity"&gt;SSL And The Future Of Authenticity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/114481/how-do-mashups-work-with-same-orgin-policy"&gt;How do mashups work with same-orgin policy?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/112218872649456413744/posts/dfydM2Cnepe"&gt;Dizzying but invisible depth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hanselman.com/blog/ThereIsOnlyOneCloudIconInTheEntireUniverse.aspx"&gt;There is only one Cloud Icon in the Entire Universe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Health/medicine&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://zenhabits.net/tired/"&gt;Tired of Being Tired&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://well.blogs.nytimes.com/2011/10/12/what-parkinsons-teaches-us-about-the-brain/?src=me&amp;amp;ref=general&amp;amp;gwh=E4BF7E8ADDE0D4187FA2C07FE7836D88"&gt;What Parkinson&amp;rsquo;s Teaches Us About the Brain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theatlantic.com/life/archive/2011/10/all-work-and-no-play-why-your-kids-are-more-anxious-depressed/246422/"&gt;All Work and No Play: Why Your Kids Are More Anxious, Depressed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Miscellaneous&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://okvivi.com/?p=55"&gt;What does &amp;ldquo;it&amp;rsquo;s a good start&amp;rdquo; really mean&lt;/a&gt;&lt;!--EndFragment--&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theatlantic.com/business/archive/2011/10/the-declining-hotness-of-flight-attendants/246610/"&gt;The Declining Hotness of Flight Attendants&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Sun, 16 Oct 2011 13:38:35 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/interesting-stuff-i-read-last-week</guid></item><item><title>Disconnect, Disable and De-stress: How I'm learning to sit down, think clearly and get stuff done</title><link>http://rageshkrishna.com:80/blog/disconnect-disable-and-de-stress-how-i-m-learning-to-sit-down-think-clearly-and-get-stuff-done</link><description>&lt;p&gt;The &lt;a href="http://www.theonion.com/articles/last-american-who-knew-what-the-fuck-he-was-doing,26268/"&gt;recent Onion article on the death of Steve Jobs&lt;/a&gt; really struck a chord with me:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Jobs will be remembered both for the life-changing products he created and for the fact that &lt;strong&gt;he was able to sit down, think clearly, and execute his ideas&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;If you really think about, that's a superhero power – the ability to&lt;em&gt; sit down, think clearly and execute&lt;/em&gt;. I've always known that I have trouble finishing things. For as long as I can remember, I've always been a starter. I love the rush of embarking on a new project. The initial brainstorming and roughing out the first prototypes really give me a high. Unfortunately, after that I just fizzle out. The actual process of moving things from prototype to real world product always seems to bore me. Somewhere along the way, I generally lose interest and shelve things. As a result, I now have around 10,327 half-finished &lt;em&gt;things&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;That sucks.&lt;/p&gt; &lt;p&gt;Reading that piece on The Onion, however, made me take a good hard look at myself and I decided to make a few changes. One of the things I quickly noticed during my introspection was that I'm distracted very easily. Whether I'm writing code, watching television, reading a book or even trying to fall asleep, my mind is always buzzing with a million different thoughts. I'm not quite sure when that started happening, but now I find that it takes a serious effort for me to focus on a single train of thought for an extended period of time.&lt;/p&gt; &lt;p&gt;There are just too many distractions. Too many devices crying for attention. Too many emails to process. Too many blogs to read. And the worst thing is that the default on every device or app is to let you know instantly when something happens. The list is just endless:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Email&lt;/li&gt; &lt;li&gt;RSS&lt;/li&gt; &lt;li&gt;Twitter&lt;/li&gt; &lt;li&gt;Facebook&lt;/li&gt; &lt;li&gt;Hacker News&lt;/li&gt; &lt;li&gt;etc., etc., etc.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This stuff is &lt;a href="http://en.wikipedia.org/wiki/Kryptonite"&gt;Kryptonite&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So, as the first step to regaining my superpowers, I've now decided to turn off every notification on every device or app that I own. That's right, &lt;em&gt;everything&lt;/em&gt;. Hell, even my phone now makes noises only for incoming calls. No more "you've got mail", twitter alerts, Facebook messages or blog alerts to get in my way. Zero alerts. Period. No exceptions. Nada. Not on the phone, laptop or desktop.&lt;/p&gt; &lt;p&gt;And you know what? The world suddenly seems like a more peaceful place. It's only been two days since I started doing this and already I can feel my thought process improving. Not only am I getting more work done, but I'm doing a better job at it than before.&lt;/p&gt; &lt;p&gt;Try it, people. Turn off the notifications. There's important stuff to be done. Don't let a new tweet or email take your eyes off the ball.&lt;/p&gt;</description><pubDate>Tue, 11 Oct 2011 18:21:28 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/disconnect-disable-and-de-stress-how-i-m-learning-to-sit-down-think-clearly-and-get-stuff-done</guid></item><item><title>Essential Geek Skills: Automating incremental snapshot backups on Windows with rsync</title><link>http://rageshkrishna.com:80/blog/essential-geek-skills-automating-incremental-snapshot-backups-on-windows-with-rsync</link><description>&lt;p&gt;I just finished setting up a fully automated incremental snapshot backup regime on my Windows 7 machine. Every night, my script creates an exact replica of my data and retains 3 days of snapshots. This means that I can go &amp;ldquo;back in time&amp;rdquo; for three days in case I need to recover something quickly. More importantly, the data isn&amp;rsquo;t hidden away in some obscure, proprietary file format &amp;ndash; it&amp;rsquo;s sitting there just like a bunch of normal files. This makes it really easy to recover from a catastrophic failure of my main drive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The process I&amp;rsquo;m about to describe is for geeks only. If you&amp;rsquo;re not a geek, maybe you should just buy a decent backup application and save yourself the trouble of doing this manually. If, on the other hand, you&amp;rsquo;ve got an hour to spare and you&amp;rsquo;re OK with dealing with things like Cygwin, ntrights and the Task Scheduler, read on!&lt;/p&gt;
&lt;p&gt;The core idea is to use rsync to make a backup of your data and use hardlinks to create the snapshots, as described by &lt;a href="http://www.mikerubel.org/computers/rsync_snapshots/#Incremental" title="Easy Automated Snapshot-Style Backups with Linux and Rsync"&gt;Mike Rubel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What you&amp;rsquo;ll need:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt;&amp;nbsp;(we&amp;rsquo;ll be using rsync to make the backups)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;amp;DisplayLang=en"&gt;Windows 2003 Resource Kit&lt;/a&gt;&amp;nbsp;(We need a copy of ntrights.exe to do this on Windows 7 Home Premium)&lt;/li&gt;
&lt;li&gt;A spare hard disk that&amp;rsquo;s at least the same size as the drive you want to backup&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Step 1: Install Cygwin&lt;/h3&gt;
&lt;p&gt;Get the installer from the Cygwin site. Be sure to install the rsync package by selecting it from the installer:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/2d025113febd_B218/image_2.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/2d025113febd_B218/image_thumb.png" width="665" height="403" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Step 2: Prepare your backup disk&lt;/h3&gt;
&lt;p&gt;Format your disk and create the following files:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) backup.sh&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This file creates the actual backup and manages moving around the snapshots. Just be sure to replace &lt;strong&gt;/cygdrive/d/*&lt;/strong&gt; with your source (the location with the data you want to backup) and &lt;strong&gt;/cygdrive/e&lt;/strong&gt; in the following script to point to your backup drive.&lt;/p&gt;
&lt;pre class="brush: bash; toolbar: false;"&gt;rm -rf /cygdrive/e/backup.3
mv /cygdrive/e/backup.2 /cygdrive/e/backup.3
mv /cygdrive/e/backup.1 /cygdrive/e/backup.2
cp -al /cygdrive/e/backup.0 /cygdrive/e/backup.1
rsync -a /cygdrive/d/*  /cygdrive/e/backup.0/&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) cygrun.bat&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the file that will startup a bash shell and run our backup script. We&amp;rsquo;ll be calling this from a scheduled task. The credit goes to &lt;a href="http://zenovations.com/blog/2009/06/how-to-run-a-cygwin-command-from-windows-scheduler-scheduled-tasks/"&gt;Zenovations.com&lt;/a&gt; for this script:&lt;/p&gt;
&lt;pre class="brush: bash; toolbar: false;"&gt;@echo off
rem set HOME=c:\
if "%DEF_PATH%"=="" set DEF_PATH=%PATH%
set PATH=c:\cygwin\bin;%DEF_PATH%
set myargs=%*
if "%myargs%" == "" goto noarg
rem echo %myargs%
bash --rcfile "%HOME%/.bashrc" -i -c "%myargs%"
c:
rem pause
sleep 1
goto exit
:noarg

rxvt -e /usr/bin/bash --login -i

:exit
exit
&lt;/pre&gt;
&lt;h3&gt;Step 3: Create a scheduled task&lt;/h3&gt;
&lt;p&gt;Nothing special about this, just set up a standard scheduled task. I&amp;rsquo;ve set mine to trigger at 4:00 AM every day. The action should look like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/2d025113febd_B218/image_4.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://rageshkrishna.com/Media/Default/Windows-Live-Writer/2d025113febd_B218/image_thumb_1.png" width="472" height="510" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Step 4: Making it work on Windows 7 Home Premium&lt;/h3&gt;
&lt;p&gt;If you choose to run this task as a non-administrator user, you will need to ensure that your user account has the &amp;ldquo;Logon as a batch job&amp;rdquo; privilege. Unfortunately, Windows 7 Home Premium doesn&amp;rsquo;t give you an easy way to do this. So get yourself the Windows 2003 Resource Kit and use the &lt;strong&gt;ntrights.exe&lt;/strong&gt; tool that comes with it to assign the privilege from the command line. Credits to &lt;a href="http://toblogornottoblog.co.uk/blog/misc-it/1/how-to-grant--log-on-as-batch-job--in-windows-7-home-premium.php?blog=159&amp;amp;page=1&amp;amp;order=d&amp;amp;mode=h"&gt;Daniel&lt;/a&gt; for this tip.&lt;/p&gt;
&lt;pre class="brush: bash; toolbar: false;"&gt;ntrights -u COMPUTER\User +r SeBatchLogonRight&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And that, my dear readers, should be it. You should (hopefully) have a fully automated, scheduled, incremental snapshot backup running of your important data.&lt;/p&gt;</description><pubDate>Sun, 09 Oct 2011 10:40:07 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/essential-geek-skills-automating-incremental-snapshot-backups-on-windows-with-rsync</guid></item><item><title>FileSystemWatcher is (almost) always a bad idea</title><link>http://rageshkrishna.com:80/blog/filesystemwatcher-is-almost-always-a-bad-idea</link><description>&lt;p&gt;Using the FileSystemWatcher to watch a folder for changes usually turns out to be a bad idea. From missing notifications to IOExceptions when trying to copy files, I’ve just given up on using FileSystemWatcher to do anything useful. I find that using &lt;a href="http://quartznet.sourceforge.net/"&gt;Quartz.NET&lt;/a&gt; to set up a simple scheduled task that polls the folder occasionally is a more reliable and robust solution. Just remember to use &lt;a href="http://quartznet.sourceforge.net/tutorial/lesson_3.html"&gt;stateful jobs&lt;/a&gt; to ensure your tasks don’t overlap.&lt;/p&gt;</description><pubDate>Thu, 29 Sep 2011 08:08:01 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/filesystemwatcher-is-almost-always-a-bad-idea</guid></item><item><title>Adding custom log levels to log4net</title><link>http://rageshkrishna.com:80/blog/2011/01/21/AddingCustomLogLevelsToLog4net.aspx</link><description>&lt;p&gt;Logging is a critical piece of infrastructure for any application. On most of my projects, I use &lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt; because it’s a tried and tested framework that does exactly what it says on the box and stays out of your way. Today, I wanted to start logging security events in an application I’m building. By security events, I mean things like users logging in and out, changing passwords, and so on.&lt;/p&gt;  &lt;p&gt;I’m currently using text files to hold all my logs because I think logging infrastructure should be as simple as possible. For all the benefits of using a database to hold logs, I think it adds too many points where things could go wrong, potentially resulting in lost or missing log data. Now, when you’re keeping your logs in plain-text, you need to be careful to structure the log output so you can parse the data easily. The most straightforward way to do this without having to pepper your log data itself with magic strings is to use appropriate log levels.&lt;/p&gt;  &lt;p&gt;Out of the box, log4net provides five different log levels:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Debug &lt;/li&gt;    &lt;li&gt;Error &lt;/li&gt;    &lt;li&gt;Fatal &lt;/li&gt;    &lt;li&gt;Info &lt;/li&gt;    &lt;li&gt;Warn &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I wanted to add things like “Login” and “Logout” to this list. It turns out that this is relatively straightforward to accomplish with log4net.&lt;/p&gt;  &lt;p&gt;The first thing you need to do is to create and register your new levels with the LogManager like this:&lt;/p&gt;  &lt;pre class="brush: csharp; toolbar: false;"&gt;log4net.Core.Level authLevel = new log4net.Core.Level(50000, &amp;quot;Auth&amp;quot;);
log4net.LogManager.GetRepository().LevelMap.Add(authLevel);
&lt;/pre&gt;

&lt;p&gt;It’s important that you do this &lt;em&gt;before&lt;/em&gt; configuring log4net.&lt;/p&gt;

&lt;p&gt;Adding some &lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx"&gt;extension methods&lt;/a&gt; makes it dead simple to start using the new log levels:&lt;/p&gt;

&lt;pre class="brush: csharp; toolbar: false;"&gt;public static class SecurityExtensions
{
    static readonly log4net.Core.Level authLevel = new log4net.Core.Level(50000, &amp;quot;Auth&amp;quot;);

    public static void Auth(this ILog log, string message)
    {
        log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, 
            authLevel, message, null);
    }

    public static void AuthFormat(this ILog log, string message, params object[] args)
    {
        string formattedMessage = string.Format(message, args);
        log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType,
            authLevel, formattedMessage, null);
    }

}&lt;/pre&gt;

&lt;p&gt;And that’s it – now I can start using my new “Auth” logging level on any instance of ILog like this:&lt;/p&gt;

&lt;pre class="brush: csharp; toolbar: false;"&gt;SecurityLogger.AuthFormat(&amp;quot;User logged in with id {0} from IP address {1}&amp;quot;, id, Request.UserHostAddress);&lt;/pre&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2011/01/21/AddingCustomLogLevelsToLog4net.aspx</guid></item><item><title>Getting the latest MVCContrib, NHibernate and Castle to play nicely</title><link>http://rageshkrishna.com:80/blog/2011/01/05/GettingTheLatestMVCContribNHibernateAndCastleToPlayNicely.aspx</link><description>&lt;p&gt;I’m using the latest versions of NHibernate (3.0.0), MVCContrib (2.0.96) and Castle Windsor (2.5.1) in a new project I’ve just started. Sometimes when you’re playing with the cutting edge releases of open source products, things don’t always work well together.&lt;/p&gt;  &lt;p&gt;After putting everything together, ASP.NET gave me a Yellow Screen of Death:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/loaderror_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="loaderror" border="0" alt="loaderror" src="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/loaderror_thumb.png" width="660" height="158" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is the framework trying to tell you that one of your dependencies is looking for a specific version of a library and the runtime is unable to find that particular version.&lt;/p&gt;  &lt;p&gt;Quick Tip #1: How do I figure out what the dependencies are?&lt;/p&gt;  &lt;p&gt;Use ildasm to open up the assembly and take a look at the assembly manifest. This will tell you exactly what the dependencies of an assembly are. Looking at the dump for the latest release of MVCContrib.Castle tells us that it needs an old version of Castle:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/image_thumb.png" width="644" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ordinarily, you would resolve this by doing what’s called an &lt;a href="http://msdn.microsoft.com/en-us/library/2fc472t2%28VS.71%29.aspx"&gt;Assembly Binding Redirection&lt;/a&gt; by sprinkling some magic dust that looks like this in the &lt;strong&gt;&amp;lt;runtime&amp;gt;&lt;/strong&gt; section of your application configuration file:&lt;/p&gt;  &lt;pre class="brush: xml; toolbar: false;"&gt;&amp;lt;assemblyBinding xmlns=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&amp;gt;
  &amp;lt;dependentAssembly&amp;gt;
    &amp;lt;assemblyIdentity name=&amp;quot;Castle.Windsor&amp;quot; publicKeyToken=&amp;quot;407dd0808d44fbdc&amp;quot; culture=&amp;quot;neutral&amp;quot; /&amp;gt;
    &amp;lt;bindingRedirect oldVersion=&amp;quot;2.1.0.0&amp;quot; newVersion=&amp;quot;2.5.1.0&amp;quot; /&amp;gt;
  &amp;lt;/dependentAssembly&amp;gt;
&amp;lt;/assemblyBinding&amp;gt;
&amp;lt;assemblyBinding xmlns=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&amp;gt;
  &amp;lt;dependentAssembly&amp;gt;
    &amp;lt;assemblyIdentity name=&amp;quot;Castle.Core&amp;quot; publicKeyToken=&amp;quot;407dd0808d44fbdc&amp;quot; culture=&amp;quot;neutral&amp;quot; /&amp;gt;
    &amp;lt;bindingRedirect oldVersion=&amp;quot;1.2.0.0&amp;quot; newVersion=&amp;quot;2.5.1.0&amp;quot; /&amp;gt;
  &amp;lt;/dependentAssembly&amp;gt;
&amp;lt;/assemblyBinding&amp;gt;&lt;/pre&gt;

&lt;p&gt;With this in your config file, the framework will now force dependencies to use the newer version of the library.&lt;/p&gt;

&lt;p&gt;Unfortunately, in this particular case, using this workaround only leads to another Yellow Screen:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/MethodNotFound.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="MethodNotFound" border="0" alt="MethodNotFound" src="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/MethodNotFound_thumb.png" width="660" height="271" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you haven’t figured it out yet – now you’re really in trouble.&lt;/p&gt;

&lt;p&gt;This message is telling me that MVCContrib is using a method that is no longer available in the newer release of Castle Windsor. At this point, you have three options:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Don’t use the latest versions of everything. Go back to earlier releases of all your dependencies until you find a sweet spot where everything works well with everything else. &lt;/li&gt;

  &lt;li&gt;Wait for all the libraries you’re dependent on to catch up with each other and use the official releases &lt;/li&gt;

  &lt;li&gt;Tweak the code and roll your own release &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of course, I went with option three.&lt;/p&gt;

&lt;p&gt;I got the latest code from the MVCContrib Mercurial repository. A quick look at the project tells me that the problem is in the WindsorExtensions.cs file in the MVCContrib.Castle project. I also notice that the MVCContrib.Castle project is dependent on a couple of other Castle components:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/image_6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/6a0e4f7f3a1d_A45C/image_thumb_2.png" width="244" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I downloaded these off of the Castle website and copied over the framework 3.5 binaries to the bin folder in the MVCContrib source tree. I did a recompile at this point and the build was broken. This is a good thing because it means it’s picking up the new files that I just copied.&lt;/p&gt;

&lt;p&gt;The project was broken in two places – one was &lt;strong&gt;WindsorExtensions&lt;/strong&gt;, which is what I want to fix. The other was &lt;strong&gt;WindsorModelBinder&lt;/strong&gt;. I have no use for this, so I just took it out of the project and went back to fixing WindsorExtensions. A quick update to the &lt;strong&gt;RegisterControllers&lt;/strong&gt; method got everything to compile again:&lt;/p&gt;

&lt;pre class="brush: csharp; toolbar: false;"&gt;public static IWindsorContainer RegisterControllers(this IWindsorContainer container, params Type[] controllerTypes) 
{ 
  foreach(var type in controllerTypes) 
  { 
    if(ControllerExtensions.IsController(type)) 
    { 
      container.Register(Component.For(type). 
          Named(type.FullName.ToLower()). 
          LifeStyle.Is(LifestyleType.Transient)); 
    } 
  }

  return container; 
}&lt;/pre&gt;

&lt;p&gt;Now I took the new binary, popped it into my project’s dependencies folder, crossed my fingers, and ran the project. Everything works! So, after an hour of digging through the dirt I now have a project that uses the latest versions of MVCContrib, NHibernate and Castle to work with each other.&lt;/p&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2011/01/05/GettingTheLatestMVCContribNHibernateAndCastleToPlayNicely.aspx</guid></item><item><title>Adobe Kuler</title><link>http://rageshkrishna.com:80/blog/2010/12/29/AdobeKuler.aspx</link><description>&lt;p&gt;&lt;img style="margin: 0px 0px 0px 10px; display: inline; float: right" title="Adobe Kuler" alt="Adobe Kuler" align="right" src="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/Adobe-Kuler_E337/image_3.png" width="183" height="240" /&gt;&lt;a title="Adobe Kuler" href="http://kuler.adobe.com"&gt;Adobe Kuler&lt;/a&gt; is a really great app to have in your toolkit if you spend any time designing. It's a simple service where you can contribute, rate and share colour schemes. It's a brilliant source of inspiration for design.&lt;/p&gt;  &lt;p&gt;In fact, the entire redesign of my blog's theme started off after I saw the &lt;a title="Wintery Casual colour scheme on Adobe Kuler" href="http://kuler.adobe.com/#themeID/1146937"&gt;Wintery Casual&lt;/a&gt; colour scheme on Kuler.&lt;/p&gt;  &lt;p&gt;You can use it on the web, or download it as an AIR app.&lt;/p&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2010/12/29/AdobeKuler.aspx</guid></item><item><title>Whose data is it anyway?</title><link>http://rageshkrishna.com:80/blog/2010/12/27/WhoseDataIsItAnyway.aspx</link><description>&lt;p&gt;Last week, Yahoo! put &lt;a href="http://delicious.com"&gt;Delicious&lt;/a&gt; on the chopping board. Delicious, if you haven’t ever heard of it, is a social bookmarking service that more or less brought on the whole idea of tagging stuff mainstream.&lt;/p&gt;  &lt;p&gt;Delicious has always been an instrumental part of my web browsing experience. Even if I never really used it to discover new content or to do any research, I’ve always valued the ability to have my bookmarks accessible from anywhere. I’ve been using the service for years now and I have a stack of interesting links saved up from over the years. Many of those links are probably not even active anymore, but it’s still nice to have an “Internet memory” of sorts. The thought of losing that data made me sick.&lt;/p&gt;  &lt;p&gt;Needless to say, when I saw the first tweets about Yahoo’s decision my first instinct was to export the data from their servers.&lt;/p&gt;  &lt;p&gt;When companies pitch customers about the benefits of cloud computing, one of the really strong points they make is about the safety of your data – that it’s reliably backed up, redundant and always accessible. Until the provider goes out of service or decides to cut you off, that is.&amp;#160; This got me thinking about the various other online services that I depend on and I started wondering how I would move on if they ever disappeared.&lt;/p&gt;  &lt;p&gt;I evaluated three things about each service:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;What are the alternatives?&lt;/strong&gt;&amp;#160; &lt;br /&gt;Are there any other services that could give me the same functionality at the same price range? Is there an open source product that I can host myself? Will existing tools work with the new solution?       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;How easy is it to backup all my data?&lt;/strong&gt;       &lt;br /&gt;Does the service give you any way to export all of the data that you own?       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Is the data portable?&lt;/strong&gt;       &lt;br /&gt;Will it be easy to transition the data to another service? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Email&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I have three email accounts that I use daily – one work account, one personal account, and a generic Gmail account. The work account and personal account are using Google Apps for Domains. The email addresses are on my own domain. &lt;strong&gt;This gives you a lot of options&lt;/strong&gt;. If Google were to deny me service, or even go out of business (yeah, yeah, I know you’re rolling your eyes now, but just remember that stranger things have happened), I can easily maintain the continuity of my email. I could run an email server at home, or even rent a virtual machine online and run a server there. Sure, I would miss the awesome Gmail user interface, but I would still have an active email account and, for the most part, life would be the same.&lt;/p&gt;  &lt;p&gt;The Gmail account is a whole other story. I don’t control the gmail.com domain, which gives me exactly &lt;em&gt;zero &lt;/em&gt;options&lt;strong&gt; &lt;/strong&gt;with that email address. &lt;strong&gt;This is a bad thing&lt;/strong&gt;. If your primary email account is on a domain that you don’t control, you should be be very, very scared. With services like Google Apps and Microsoft Office Live, there really isn’t any reason why you shouldn’t be owning your own domain and email accounts.&lt;/p&gt;  &lt;p&gt;Continuing the email service is one thing, but what about the emails themselves? It’s pretty easy to keep a full backup of your data in your own hands. Just configure an good old email client like Mozilla Thunderbird, Microsoft Outlook or Windows Live Mail to sync your email and keep it offline.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Alternatives&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Many&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Portability&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Excellent&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Data backup&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Very easy&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p align="left"&gt;&lt;strong&gt;Blog&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This blog is already self hosted, so I don’t have much to worry about here. If you’re using a blogging service like WordPress, Blogger or something else, you should take a good look at your options for importing and exporting your posts and comments.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Alternatives&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Many&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Portability&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Good&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Data backup&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Very easy with the popular services like Blogger and WordPress&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Bookmarks&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’ve been using Delicious to handle all my bookmarking needs. There are a few alternatives out there, but I’ve been considering rolling something of my own to do this instead. After all, I’ve never really used any of the “social” aspects of Delicious anyway so this would be an ideal candidate for a wholly self hosted solution. Thankfully, Delicious makes it very easy to export data.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Alternatives&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Few&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Portability&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Not obvious&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Data backup&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Very easy&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Facebook&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Facebook is the real elephant in the room when it comes to data portability. How do I export my messages, status updates and “likes”? I’m not even sure it’s possible. Even if I could export all of this data, there’s no alternative social network I can move to with it anyway. Even so, the walled garden that is Facebook worries me.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="402"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Alternatives&lt;/td&gt;        &lt;td valign="top" width="200"&gt;None&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Portability&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Irrelevant&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Data backup&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Impossible / very hard&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’ve been sharing some useful links and quips on Twitter. I’m not really too concerned about backing up my tweets at this point, but it’s comforting to know that there are ways to do this if I wanted to. My biggest gripe here is that Twitter doesn’t have a straightforward “export my data” option but there are ways to do this with the API and a whole bunch of third party services have cropped up to fill the void.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="402"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Alternatives&lt;/td&gt;        &lt;td valign="top" width="200"&gt;None&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Portability&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Irrelevant&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Data backup&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Easy&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;StackOverflow&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Arguably the best backup option of all the services listed here, because they give you a sanitized database dump of the entire site on a regular basis. Doesn’t get much easier than this.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="402"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Alternatives&lt;/td&gt;        &lt;td valign="top" width="200"&gt;None&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Portability&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Irrelevant&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;Data backup&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Very easy&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The bottom line is this&amp;#160; – there’s always an inherent risk when you decide to keep your data on somebody else’s servers. The lesson I’ve learned from the Delicious episode is that for any service where I’m creating content, I’ll now be paying close attention to how easy the service makes it to get my data out of their servers.&lt;/p&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2010/12/27/WhoseDataIsItAnyway.aspx</guid></item><item><title>Nice footer</title><link>http://rageshkrishna.com:80/blog/2010/12/20/NiceFooter.aspx</link><description>&lt;p&gt;I really like the look of this footer from &lt;a href="http://www.good.is/"&gt;good.is&lt;/a&gt;. Very clean, organized, and excellent use of colour.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/a2874e203af8_8CA5/image_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://rageshkrishna.com/blog/content/binary/Windows-Live-Writer/a2874e203af8_8CA5/image_thumb.png" width="644" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2010/12/20/NiceFooter.aspx</guid></item><item><title>Blog reboot</title><link>http://rageshkrishna.com:80/blog/2010/12/15/BlogReboot.aspx</link><description>&lt;p&gt;I think I've neglected blogging for too long. This is something I used to enjoy doing and somewhere along the way I completely forgot about it. So last week I decided to get back to it and started designing the new theme that you see here. I upgraded my blog engine (&lt;a href="http://www.dasblog.info/"&gt;dasBlog&lt;/a&gt;) to a newer version that I downloaded and compiled. &lt;/p&gt;  &lt;p&gt;You'll notice that some of the content has disappeared. That's because I cherry picked the content while migrating. I've retained all posts that had comments or some level of traffic.&lt;/p&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2010/12/15/BlogReboot.aspx</guid></item><item><title>A company is born</title><link>http://rageshkrishna.com:80/blog/2009/09/18/ACompanyIsBorn.aspx</link><description>&lt;p&gt;Why did we do it? Subroto Bagchi explained it best in his book, &lt;a href="http://www.amazon.com/gp/product/0670999180?ie=UTF8&amp;amp;tag=ragekris-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0670999180"&gt;The High Performance Entrepreneur: Golden Rules for Success in Today's World&lt;/a&gt;:
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;"… starting a company is like deciding to have a baby. Ask most women and they will tell you that there can never be a rational enough reason to get into the problems of bearing a baby. It is a very difficult task, full of discomforts and sacrifices. Yet, when the time comes, a woman would give up everything in the world to bear her child. No pain, no discomfort, no change in lifestyle daunts her from becoming a mother.
&lt;/p&gt;&lt;p&gt;Starting your own enterprise is a little like motherhood. You know it when the time has come and you waive all caution and comfort to embrace the little sign of life deep inside you and you would do everything – &lt;i&gt;everything &lt;/i&gt;– to bring it to the world."
&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;On the 31&lt;sup&gt;st&lt;/sup&gt; of August, 2009, I, along with a few good friends, brought &lt;a href="http://www.tetrastorm.com"&gt;TetraStorm Technologies&lt;/a&gt; Private Limited to life. There's an inexplicable sense of accomplishment that I get every time I see my name in the list of directors in the Memorandum and Articles of Association. Yes, I know this is just the beginning and there's a lot of hard work ahead of us. 
&lt;/p&gt;&lt;p&gt;But you know what? We're a bunch of explorers with backpacks. We've got a map that we think will lead us to a pot of gold. We've got a heart full of passion and an ounce of skills. We've got vision and we're stubbornly determined. We have our eyes set on the horizon and our feet firmly on the ground. How can we be so sure of success? We're too young and too foolish to even imagine that failure is a possibility. And did I mention we have a map?&lt;/p&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2009/09/18/ACompanyIsBorn.aspx</guid></item><item><title>Implementing ActiveX events that can be used in JavaScript</title><link>http://rageshkrishna.com:80/blog/2008/05/14/ImplementingActiveXEventsThatCanBeUsedInJavaScript.aspx</link><description>&lt;p&gt;Recently I came across a requirement to create an ATL ActiveX control that could be used from JavaScript in the following manner:&lt;/p&gt;  &lt;pre class="brush: js"&gt;o = new ActiveXObject("Test.MyControl");
o.OnStateChanged = MyEventHandler;
&lt;/pre&gt;
&lt;p&gt;I figured this would be pretty simple -- just implement an ActiveX control with connection points. Unfortunately, it doesn't work. Internet Explorer complains thus:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://rageshkrishna.com/blog/content/binary/WindowsLiveWriter/ImplementingActiveXeventsthatcanbeusedin_D3C8/ie7_object_error.png"&gt;&lt;img style="border-width: 0px;" alt="ie7_object_error" src="http://rageshkrishna.com/blog/content/binary/WindowsLiveWriter/ImplementingActiveXeventsthatcanbeusedin_D3C8/ie7_object_error_thumb.png" border="0" height="130" width="193"/&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left"&gt;This is because JavaScript can't sink COM events. This seemed odd to me, because the same approach works when you try to use the XMLHttpRequest object. As it turns out, &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3078973&amp;amp;SiteID=1"&gt;XMLHttpRequest doesn't implement "events" as COM events at all&lt;/a&gt;. They're actually properties that accept IDispatch pointers. JavaScript functions are marshalled to ActiveX as objects that implement IDispatch and having a method named "call". &lt;/p&gt;  &lt;p align="left"&gt;Simply put, this is what we need to do to enable ActiveX events to be handled by JavaScript using the syntax shown above:&lt;/p&gt;  &lt;p align="left"&gt;1) Implement a property in the ActiveX control that accepts an IDispatch pointer.&lt;/p&gt;  

&lt;pre class="brush: cpp"&gt;STDMETHODIMP CTestCtrl::putref_OnStateChanged(IDispatch* newVal)
STDMETHODIMP CTestCtrl::get_OnStateChanged(IDispatch** pVal)
&lt;/pre&gt;

&lt;p align="left"&gt;2) Get the DISPID of the "call" method by calling GetIDsOfNames like so:&lt;/p&gt;  
&lt;pre class="brush: cpp"&gt;newVal-&amp;gt;GetIDsOfNames(IID_NULL, &amp;amp;szMember, 1, LOCALE_SYSTEM_DEFAULT, pDispId))&lt;/pre&gt;
&lt;p&gt;
3) When you want to invoke the event, construct a VARIANTARG containing the parameters you want to pass to the event in reverse order. Add a pointer to your own IDispatch implementation as the last element in the array.&lt;/p&gt;  


&lt;pre class="brush: cpp"&gt;DISPPARAMS dispParams;
VARIANTARG args[2];

VariantInit(&amp;amp;args[0]);
args[0].vt = VT_BSTR;
args[0].bstrVal = ::SysAllocString(L"The event says hello!");

IDispatch* pDisp;
HRESULT hRes = this-&amp;gt;QueryInterface(IID_IDispatch, (void**)&amp;amp;pDisp);

VariantInit(&amp;amp;args[1]);
args[1].vt = VT_DISPATCH;
args[1].pdispVal= pDisp;

memset(&amp;amp;dispParams, 0, sizeof(dispParams));
dispParams.rgvarg = args;
dispParams.cArgs = sizeof(args)/sizeof(args[0]);

EXCEPINFO excepinfo; 
UINT uArgErr;

pEventHandler-&amp;gt;Invoke(*pDispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
    DISPATCH_METHOD, &amp;amp;dispParams, NULL, &amp;amp;excepinfo, &amp;amp;uArgErr);
&lt;/pre&gt;

&lt;p&gt;4) Clean up when you're done by calling VariantClear on both elements of the args array.&lt;/p&gt;</description><pubDate>Wed, 28 Sep 2011 18:38:17 GMT</pubDate><guid isPermaLink="true">http://rageshkrishna.com:80/blog/2008/05/14/ImplementingActiveXEventsThatCanBeUsedInJavaScript.aspx</guid></item></channel></rss>
