<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-32549658</id><updated>2012-01-27T15:02:52.647-08:00</updated><category term='mobile'/><category term='linux'/><category term='setup'/><category term='yahoo'/><category term='visualization'/><category term='mysql'/><category term='ec2'/><category term='howto'/><category term='HCI'/><category term='free'/><category term='tutorial'/><category term='information'/><category term='search engine'/><category term='interface'/><category term='web usability design'/><category term='user interface'/><category term='laszlo'/><category term='search'/><category term='design'/><category term='vpn'/><category term='article'/><category term='ubuntu'/><category term='mobile interface design'/><category term='web silverlight flex adobe surface'/><category term='replication'/><category term='google'/><title type='text'>RUMINATIONS</title><subtitle type='html'>Life, Universe and Everything...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32549658.post-2473182037991207643</id><published>2012-01-27T15:01:00.000-08:00</published><updated>2012-01-27T15:02:52.657-08:00</updated><title type='text'>getting mysql-python installed on MAMP</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I wanted to try out selenium to setup some test automation scripts. So i proceeded to get a python virtual environment setup where i could monkey around a bit. Its a brilliant idea to use this to test out something before deploying or deciding to implement it company wide.&lt;br /&gt;&lt;br /&gt;install virtualenv ( http://pypi.python.org/pypi/virtualenv ). its just a single file.&lt;br /&gt;So I setup a virtual environment for testing selenium :-&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; python virtualenv.py testselenium&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cd testselenium&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; source ./bin/activate&lt;/div&gt;&lt;br /&gt;gives you a similar looking prompt by default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (testselenium)Ajoy:testselenium ajoy$&lt;br /&gt;&lt;br /&gt;now install selenium through pip:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; pip install selenium&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;this should usually go thru smoothly&lt;br /&gt;In case, i also wanted to connect to mysql to pull in db stuff,&lt;br /&gt;So I needed to install mysql-python:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; pip install mysql-python&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;but it complained that it cannot find 'mysql_config'... grr .... need to setup the paths&lt;br /&gt;&lt;br /&gt;in my case, it was installed in : /Applications/MAMP/Library/bin/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;export PATH=/Applications/MAMP/Library/bin/:$PATH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;try again :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;pip install mysql-python&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;now it complained that "ld: library not found for -lmysqlclient_r" .... Grrrr....&lt;br /&gt;&lt;br /&gt;need to find where the mysql libraries were installed,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; export PATH=/Applications/MAMP/Library/lib/mysql/:$PATH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and setup &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DYLD_LIBRARY_PATH&lt;/span&gt;&lt;br /&gt;macports mysql debug client libraries:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;export DYLD_LIBRARY_PATH=/opt/local/lib/mysql5/mysql/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;it still did not work, then i came across this blog (&amp;nbsp;&lt;a href="http://www.techsmog.com/index.php/2011/05/04/fixing-ld-library-not-found-for-lmysqlclient_r-during-gem-install-mysql2-on-osx-w-mamp/"&gt;fixing-ld-library-not-found-for-lmysqlclient_r-during-gem-install-mysql2-on-osx-w-mamp&lt;/a&gt; ).&lt;br /&gt;&lt;br /&gt;so now i created symbolic links as adviced on the site :-&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;pre style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px;"&gt;   cd&amp;nbsp;/Applications/MAMP/Library/lib/mysql/&lt;br /&gt;   ln -s &amp;nbsp;ibmysqlclient.la ibmysqlclient.a&lt;br /&gt;   ln -s libmysqlclient_r.la libmysqlclient_r.a&lt;br /&gt;   ln -s libndbclient.la libndbclient.a&lt;/pre&gt;&lt;br /&gt;now, everything worked fine :) *phew*&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-2473182037991207643?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/2473182037991207643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=2473182037991207643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/2473182037991207643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/2473182037991207643'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2012/01/getting-mysql-python-installed-on-mamp.html' title='getting mysql-python installed on MAMP'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-2104206801308121303</id><published>2011-11-01T22:34:00.000-07:00</published><updated>2011-11-02T00:03:09.431-07:00</updated><title type='text'>Google Analytics Gotchas</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&amp;nbsp; Having built quite a number of websites over my career, there is one feature that I always end up implementing right at the very beginning, ... Web Analytics.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; There is are several ways of going about it. Analysing apache logs, capturing session data are all low level ways of looking at the data. But when it comes to ease of use and powerful reports, nothing beats google analytics for the right combination of price (Free!) and features. With the gradual rollout of real-time analytics, it becomes even more powerful.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Google Analytics is a wonderful free tool every website owner should use. Getting setup with google analytics is incredibly easy. The official google analytics site has very clear and succinct instructions:- &lt;a href="http://code.google.com/apis/analytics/docs/tracking/asyncTracking.html"&gt;http://code.google.com/apis/analytics/docs/tracking/asyncTracking.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; This basic setup should give you reports about visits and pageviews and track your site's popularity over time. Other interesting metrics to look for is bounce rates, pages getting the most pageviews and how the users are landing on your site ( also known as referrals). That's a good place to start on how to optimize your site.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; You might find that having a distinct URL for each specific page on your site helps with tracking its usage seperately. This will be tricky to do if your main page is being reloaded with new content using Ajax. There are two ways to solve this - Virtual PageViews and Event Tracking.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Virtual Pageviews&lt;/span&gt; &lt;br /&gt;&amp;nbsp; Virtual Pageviews are very simple. You force google analytics into thinking that a pageview has occured using a similar snippet of code :-&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: white; border-color: rgb(187, 187, 187); border-style: solid; border-width: 1px; color: #007000; font-family: monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 15px; margin: 1em 0px 0px; orphans: 2; overflow: auto; padding: 0.99em; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; word-wrap: break-word;"&gt;&lt;span class="pln" style="color: black;"&gt;_gaq&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;push&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;([&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;'_trackPageview'&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;'/module/specific_page'&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;]); &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will be added as a pageview in your report.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Event Tracking&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Event tracking is a more versatile solution. The code tells google analytics that a particular event has occured. It is upto us to interpret and provide attributes of that event. Snippet of code :-&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; color: #007000; font-family: monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; orphans: 2; overflow-x: auto; overflow-y: auto; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; text-align: -webkit-auto; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; word-wrap: break-word;"&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;a onclick&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"_gaq.push(['&lt;/span&gt;&lt;a href="http://code.google.com/apis/analytics/docs/gaJS/gaJSApiEventTracking.html#_gat.GA_EventTracker_._trackEvent" style="color: #551a8b;"&gt;&lt;span class="str" style="color: #008800;"&gt;_trackEvent&lt;/span&gt;&lt;/a&gt;&lt;span class="str" style="color: #008800;"&gt;', 'category', 'action', 'opt_label', opt_value]);"&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;click me&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&lt;!--&lt;/span--&gt;&lt;span class="pln" style="color: black;"&gt;a&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp; The number of times each event occured and pages in which it occured can each be tallied in the report.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Event tracking also allows us to capture more intricate details of a pageview. It is normally used to capture user interactions on the page that may or may not result in new content. Very useful when it comes to determine whether that button that you added, how often is it being used. Or is it just a distraction for the user.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Website Profiles and Filters&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-2104206801308121303?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/2104206801308121303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=2104206801308121303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/2104206801308121303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/2104206801308121303'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2011/11/google-analytics-gotchas.html' title='Google Analytics Gotchas'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-5296421851402893460</id><published>2011-06-06T12:38:00.000-07:00</published><updated>2011-06-06T15:32:55.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>MySQL Replication on EC2</title><content type='html'>I am not a DBA, but being in a 3-person start-up makes you a lot of things, at least temporarily. I am not a writer either, but I am hoping that I can share what I have learned and hope somebody else finds it useful.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;While running a commercial web application, two things are of at-most importance, reliability and performance. For these two very important parameters, the most common bottleneck tends to be the database. This leads me to the topic of MySQL Replication.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-OJkiv3nb91c/Te0zJuNEdoI/AAAAAAAAAv8/Mv3vUSmFABY/s1600/Screen%2Bshot%2B2011-06-06%2Bat%2B1.00.07%2BPM.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Assuming you have two machines running MySQL Database servers, MySQL&lt;/span&gt; replication can be done in two ways, Master-Slave and Master-Master combinations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Master-Slave&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Master-slave combination is used usually for performance reasons. The writes go to the master db server, which are then replicated on the slave db server. The slave can then be used for slower queries and reads, freeing the master for m&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;ore important work.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Master-Master&lt;/span&gt;&lt;br /&gt;Master-Master combination in addition to performance, are also used for reliability reasons. The writes generally go to one of the masters, also known as the primary master (which is pre-determined), and is replicated to the secondary master. The secondary master serves as a stand-by, in case something goes wrong with the primary master. The secondary master can then pick-up the writes (thus becoming the primary), which are then replicated to the old primary master, (now the secondary) when it is brought back up. This provides redundancy. But there are some important caveats to keep in mind, which I will come to later. Since this setup is more complex, I will take you through this below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;EC2&lt;/span&gt;&lt;br /&gt;Setting up this replication on EC2 is a little bit tricky. But I will guide you along so that you know exactly what to do. There are quite a number of steps, but each one is fairly easy to do, just need to be careful.&lt;br /&gt;Machines on EC2 have what are known as a public DNS and a private DNS. if you have logged in to the machines, then you have most definitely used their primary DNS. You can obtain these names from the aws console.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-C1rZy-XkvbY/Te0yfPT4nLI/AAAAAAAAAv0/UjxPtxwHOhs/s1600/Screen%2Bshot%2B2011-06-06%2Bat%2B1.00.07%2BPM.png"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a href="http://2.bp.blogspot.com/-OJkiv3nb91c/Te0zJuNEdoI/AAAAAAAAAv8/Mv3vUSmFABY/s1600/Screen%2Bshot%2B2011-06-06%2Bat%2B1.00.07%2BPM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 60px;" src="http://2.bp.blogspot.com/-OJkiv3nb91c/Te0zJuNEdoI/AAAAAAAAAv8/Mv3vUSmFABY/s400/Screen%2Bshot%2B2011-06-06%2Bat%2B1.00.07%2BPM.png" alt="" id="BLOGGER_PHOTO_ID_5615200552515565186" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;For MySQL replication purposes, we will need the &lt;span style="font-weight: bold;"&gt;private DNS&lt;/span&gt;/private IP Address.&lt;br /&gt;&lt;br /&gt;Here is the setup that I had :-&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Two 'm1.large' ec2 instances&lt;/li&gt;&lt;li&gt;Ubuntu 10.6&lt;/li&gt;&lt;li&gt;MySql 5.1&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style=" font-weight: bold;font-family:trebuchet ms;" &gt;Detailed Steps&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Now login to one of the instances, which is your primary ( hereby called server P ). It doesn't matter which one is primary, but if you have already been using one of them, then that is your primary. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Now login to the MySQL database instance and create a new user. This user will be used by the secondary master ( hereby called server S ) to connect and obtain updates. :-&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="font-family:courier new;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0);   font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; background-color: rgb(216, 236, 254);font-size:100%;" &gt;&lt;span class="command" style=" "&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;span style="font-family:courier new;"&gt;&amp;gt; USE mysql;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;gt; INSERT INTO user (Host, User, Password, Select_priv, Reload_priv, Super_priv, Repl_slave_priv) VALUES ('%', 'slave_username', password('slave_password'), 'Y', 'Y', 'Y', 'Y');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;gt; FLUSH PRIVILEGES;&lt;/span&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Find out where your mysql configuration file is located ( my.cnf ). In my case, it was located at /etc/mysql/my.cnf. There should be a '&lt;span style="font-weight: bold;"&gt;conf.d&lt;/span&gt;' folder in the same level.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Create a new file called &lt;span style="font-weight: bold;"&gt;replicate.cnf&lt;/span&gt; in &lt;span style="font-weight: bold;"&gt;/etc/mysql/conf.d/&lt;/span&gt; folder. This file will contain the customizations for replications, such that we don't disturb 'my.cnf' for now.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Insert the following :-&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;blockquote  style="font-family:courier new;"&gt;[mysqld]&lt;br /&gt;server-id = 1 &lt;span style="font-weight: bold;"&gt;# for server P&lt;/span&gt;&lt;br /&gt;replicate-same-server-id = 0&lt;br /&gt;auto-increment-increment = 2&lt;br /&gt;auto-increment-offset = 1 # set differently for server S&lt;br /&gt;&lt;br /&gt;master-host = ip-11-111-1-111.us-west-1.compute.internal &lt;span style="font-weight: bold;"&gt;# private DNS of server S&lt;/span&gt;&lt;br /&gt;master-user = slave_username&lt;br /&gt;master-password = password_for_slave_user&lt;br /&gt;master-connect-retry = 60&lt;br /&gt;replicate-do-db = database_to_replicate&lt;br /&gt;&lt;br /&gt;log-bin = /var/log/mysql/mysql-bin.log&lt;br /&gt;binlog-do-db = database_to_replicate&lt;br /&gt;binlog-ignore-db=mysql&lt;br /&gt;log = /var/lib/mysql/mysql.log&lt;br /&gt;&lt;br /&gt;relay-log = /var/log/mysql/mysql-relay-bin&lt;br /&gt;relay-log-index = /var/log/mysql/mysql-relay-bin.index&lt;br /&gt;relay-log-info-file = /var/log/mysql/mysql-relay-log.info&lt;/blockquote&gt;&lt;/li&gt;&lt;li style="font-family:trebuchet ms;"&gt;Repeat steps 2 - 7 for server S.&lt;/li&gt;&lt;li  style="font-family:trebuchet ms;"&gt;For the replicate.cnf for server S, insert the following :-&lt;/li&gt;&lt;li&gt;&lt;blockquote  style="font-family:courier new;"&gt;[mysqld]&lt;br /&gt;server-id = 2 &lt;span style="font-weight: bold;"&gt;# for server S&lt;/span&gt;&lt;br /&gt;replicate-same-server-id = 0&lt;br /&gt;auto-increment-increment = 2&lt;br /&gt;auto-increment-offset = 2 # set differently for server P&lt;br /&gt;&lt;br /&gt;master-host = ip-22-222-2-222.us-west-1.compute.internal &lt;span style="font-weight: bold;"&gt;# private DNS of server P&lt;/span&gt;&lt;br /&gt;master-user = slave_username&lt;br /&gt;master-password = password_for_slave_user&lt;br /&gt;master-connect-retry = 60&lt;br /&gt;replicate-do-db = database_to_replicate&lt;br /&gt;&lt;br /&gt;log-bin = /var/log/mysql/mysql-bin.log&lt;br /&gt;binlog-do-db = database_to_replicate&lt;br /&gt;binlog-ignore-db=mysql&lt;br /&gt;log = /var/lib/mysql/mysql.log&lt;br /&gt;&lt;br /&gt;relay-log = /var/log/mysql/mysql-relay-bin&lt;br /&gt;relay-log-index = /var/log/mysql/mysql-relay-bin.index&lt;br /&gt;relay-log-info-file = /var/log/mysql/mysql-relay-log.info&lt;/blockquote&gt;&lt;/li&gt;&lt;li style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;W&lt;span style="font-size:100%;"&gt;ith me so far? Ok. Make sure '&lt;span style="font-family: courier new;"&gt;/var/log/mysql/mysql&lt;/span&gt;' specified in the cnf actually exists. For the initial stage, you need to manually make sure the data is in synch. This can be done by doing a mysqldump of the database on the primary, and ( scp ) copying the resultant file over to the secondary and running it there. Here is a &lt;a href="http://www.thegeekstuff.com/2008/09/backup-and-restore-mysql-database-using-mysqldump/"&gt;link&lt;/a&gt; to help you out.&lt;/span&gt;&lt;/li&gt;&lt;li face="trebuchet ms"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: trebuchet ms;"&gt;The mysql default configuration prevents the database from being accessed from different machines. Copy the default my.cnf into my.cnf.bak. Then edit the &lt;span style="font-family: courier new;"&gt;/etc/mysql/my.cnf&lt;/span&gt; file on both servers, and comment out the &lt;span style="font-family: courier new;"&gt;&lt;br /&gt;#bind-address           = 127.0.0.1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: trebuchet ms;"&gt;The last thing needed to set up replication is the synchronization of the servers. On the mysql command-line on server P, enter the following :-&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:courier new;"&gt;mysql&amp;gt; show master status;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:85%;"  &gt;+------------------+----------+--------------+------------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;| File                                                | Position | Binlog_Do_DB | Binlog_Ignore_DB |&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:85%;"  &gt;+------------------+----------+--------------+------------+&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:85%;"  &gt;| mysql-bin.000006 |      106           | fitz                         | mysql                                  |&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:85%;"  &gt;+------------------+----------+--------------+------------+&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Keep track of those values as you need this on server S.&lt;br /&gt;On server S, mysql command-line:-&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mysql&amp;gt; stop;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mysql&amp;gt; CHANGE MASTER TO MASTER_HOST='&lt;/span&gt;&lt;private_dns_serverp&gt;&lt;span style="font-family:courier new;"&gt;&lt;private_dns_serverp&gt;', MASTER_USER='&lt;/private_dns_serverp&gt;&lt;/span&gt;&lt;slave user=""&gt;&lt;span style="font-family:courier new;"&gt;&lt;slave_username&gt;', MASTER_PASSWORD='&lt;slave_password&gt;&lt;/slave_password&gt;&lt;/slave_username&gt;&lt;/span&gt;&lt;slave password=""&gt;&lt;span style="font-family:courier new;"&gt;', MASTER_LOG_FILE='&lt;/span&gt;&lt;master's log="" file="" name="" 000006=""&gt;&lt;/master's&gt;&lt;/slave&gt;&lt;/slave&gt;&lt;/private_dns_serverp&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;&amp;lt; Eg. mysql-bin.000006 &amp;gt;&lt;/span&gt;&lt;private_dns_serverp&gt;&lt;slave user=""&gt;&lt;slave password=""&gt;&lt;master's log="" file="" name="" 000006=""&gt;&lt;span style="font-family:courier new;"&gt;', MASTER_LOG_POS=&lt;/span&gt;&lt;master's log="" file="" position="" 106=""&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt; Eg. &lt;/span&gt;&lt;/master's&gt;&lt;/master's&gt;&lt;/slave&gt;&lt;/slave&gt;&lt;/private_dns_serverp&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;    106 &amp;gt; &lt;/span&gt;&lt;private_dns_serverp&gt;&lt;slave user=""&gt;&lt;slave password=""&gt;&lt;master's log="" file="" name="" 000006=""&gt;&lt;master's log="" file="" position="" 106=""&gt;&lt;span style="font-family:courier new;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mysql&amp;gt; slave start;&lt;br /&gt;mysql&amp;gt; show slave status;&lt;br /&gt;&lt;br /&gt;This should show that the slave is running or waiting for event from master.&lt;/span&gt;&lt;/master's&gt;&lt;/master's&gt;&lt;/slave&gt;&lt;/slave&gt;&lt;/private_dns_serverp&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0);   font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); font-family:'Arial Rounded', Helvetica, Arial, sans-serif;font-size:16px;"  &gt;&lt;/span&gt;&lt;br /&gt;&lt;private_dns_serverp&gt;&lt;slave user=""&gt;&lt;slave password=""&gt;&lt;master's log="" file="" name="" 000006=""&gt;&lt;master's log="" file="" position="" 106=""&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;15. Repeat step 14 for server P, make sure you plugin all the right values.&lt;br /&gt;&lt;br /&gt;Thats it!&lt;br /&gt;Test to make sure the changes made on one database is being propagated to the other. You can also do a tail on the logs :-&lt;br /&gt;&lt;br /&gt;&lt;/master's&gt;&lt;/master's&gt;&lt;/slave&gt;&lt;/slave&gt;&lt;/private_dns_serverp&gt;&lt;span style="font-family:courier new;"&gt;tail -f /var/lib/mysql/mysql.log&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;private_dns_serverp&gt;&lt;slave user=""&gt;&lt;slave password=""&gt;&lt;master's log="" file="" name="" 000006=""&gt;&lt;master's log="" file="" position="" 106=""&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/master's&gt;&lt;/master's&gt;&lt;/slave&gt;&lt;/slave&gt;&lt;/private_dns_serverp&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-5296421851402893460?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/5296421851402893460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=5296421851402893460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/5296421851402893460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/5296421851402893460'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2011/06/mysql-replication-on-ec2.html' title='MySQL Replication on EC2'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-OJkiv3nb91c/Te0zJuNEdoI/AAAAAAAAAv8/Mv3vUSmFABY/s72-c/Screen%2Bshot%2B2011-06-06%2Bat%2B1.00.07%2BPM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-6937848052741032080</id><published>2010-09-30T21:03:00.000-07:00</published><updated>2011-07-31T00:20:44.906-07:00</updated><title type='text'>As a manager, how do you motivate your employees?</title><content type='html'>Some people refuse to be a manager. They are scared that managing others places a huge responsibility on their shoulders and distracts them from work that they need to get done.&lt;br /&gt;As a recent manager, I can see where that fear comes from. At the same time if done properly, it is rewarding as well. Working as a team, you can accomplish a lot more than what you can get done as an individual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-6937848052741032080?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/6937848052741032080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=6937848052741032080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/6937848052741032080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/6937848052741032080'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2010/09/as-manager-how-do-you-motivate-your.html' title='As a manager, how do you motivate your employees?'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-6620145971929973501</id><published>2009-02-26T13:13:00.000-08:00</published><updated>2009-02-26T21:19:32.169-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='vpn'/><category scheme='http://www.blogger.com/atom/ns#' term='article'/><category scheme='http://www.blogger.com/atom/ns#' term='setup'/><title type='text'>Setting up OpenVPN (windows client, linux server)</title><content type='html'>I was working on certain pet projects of mine and I realized that i might have to access my server machine from remote locations. I could always ssh by opening up a port, but I felt VPN would be more secure, with the added benefit of more security over free wireless points in cafes or other public locations. I have to warn you that the following texts are a bit lengthy and detailed, but when you start doing it, its fairly easy.&lt;br /&gt;&lt;br /&gt;The free and seemingly well regarded option for vpn was &lt;a href="http://www.openVPN.net"&gt;openVPN&lt;/a&gt;.&lt;br /&gt;I had installed xubuntu on my desktop/server box. You need to have openssh and openssl installed before attempting to install openVPN.&lt;br /&gt;&lt;br /&gt;installing openVPN on ubuntu was fairly easy&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;sudo apt-get install openvpn&lt;/span&gt;&lt;/blockquote&gt;I installed the stable version openVPN 2. The main configuration files are located in &lt;blockquote&gt;/usr/share/doc/openvpn&lt;/blockquote&gt;The "easy-rsa" folder was under the "examples" folder here. I followed the instructions as specified in the "&lt;a href="http://openvpn.net/index.php/documentation/howto.html#vpntype"&gt;openVPN Howto&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;There are 2 types of VPNs you can setup :- Ethernet Bridge and Router based. Ethernet bridge is used when you want the client machine to be a part of the private subnet and allows for multi-casting (which is required by most LAN games). At the same time, routing is recommended for other purposes, so went with the router-based option.&lt;br /&gt;&lt;br /&gt;Copy over the "easy-rsa" folder over to &lt;blockquote&gt;/etc/openvpn/&lt;/blockquote&gt;Edit the "&lt;span style="font-weight:bold;"&gt;vars&lt;/span&gt;" file in the easy-rsa folder. &lt;br /&gt;Make the following changes :-&lt;blockquote&gt;export D=/etc/openvpn/easy-rsa/2.0&lt;br /&gt;&lt;br /&gt;export KEY_COUNTRY=US&lt;br /&gt;export KEY_PROVINCE=CA&lt;br /&gt;export KEY_CITY=SanFrancisco&lt;br /&gt;export KEY_ORG="My-OpenVPN"&lt;br /&gt;export KEY_EMAIL="mine@example.com&lt;/blockquote&gt;&lt;br /&gt;Now run&lt;br /&gt;&lt;blockquote&gt;. ./vars &lt;span style="font-style:italic;"&gt; or &lt;/span&gt;source ./vars&lt;/blockquote&gt; then &lt;blockquote&gt;./clean-all&lt;/blockquote&gt;The next command creates your certificate authority (CA) using the parameters you just set, you should just add Common Name, I used &lt;span style="font-style:italic;"&gt;OpenVPN-CA&lt;/span&gt;. For this step you'll need OpenSSL.&lt;br /&gt;&lt;br /&gt;Now we need to create the certificate :- &lt;blockquote&gt;./build-ca&lt;/blockquote&gt; Now let's create the keys, first the server:&lt;blockquote&gt;./build-key-server server&lt;/blockquote&gt; This is important. When build-key-server asks for Common Name write &lt;span style="font-weight:bold;"&gt;server&lt;/span&gt;, the same parameter you provided to the command. Also you'll need to answer &lt;span style="font-weight:bold;"&gt;yes&lt;/span&gt; to these two questions: &lt;span style="font-style:italic;"&gt;Sign the certificate? [y/n] &lt;/span&gt;and &lt;span style="font-style:italic;"&gt;1 out of 1 certificate requests certified, commit? [y/n]&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Now the key for the client: &lt;blockquote&gt;./build-key &lt;span style="font-style:italic;"&gt;client1&lt;/span&gt;&lt;/blockquote&gt; Use &lt;span style="font-weight:bold;"&gt;client1 &lt;/span&gt;as Common Name, the same parameter you used above for build-key.&lt;br /&gt;&lt;br /&gt;Now let's create Diffie Hellman parameters:&lt;blockquote&gt;./build-dh&lt;/blockquote&gt;There you are! Now you should have a new directory with your certificates and keys: /etc/openvpn/easy-rsa/keys. To configure your first client copy these files from server to client:&lt;br /&gt;&lt;br /&gt;ca.crt (required for all clients)&lt;br /&gt;client1.crt (specific to each client)&lt;br /&gt;client1.key (specific to each client)&lt;br /&gt;&lt;br /&gt;Now that the keys are set, modify the server openvpn config file as specified in the &lt;a href="http://openvpn.net/index.php/documentation/howto.html#config"&gt;openVPN Howto&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For the client, i had used a windows Vista machine. Download the windows installer exe from the openVPN.net site and install everything.&lt;br /&gt;Create a "&lt;span style="font-weight:bold;"&gt;keys&lt;/span&gt;" folder under "C:\Program Files\OpenVPN\easy-rsa". Copy over the client specific files over from the server where you had generated them (FYI: this is has to be done securely!).&lt;br /&gt;&lt;br /&gt;Copy the &lt;span style="font-weight:bold;"&gt;client.ovpn &lt;/span&gt;file from C:\Program Files\OpenVPN\sample-config into the "keys" folder.&lt;br /&gt;&lt;br /&gt;Modify the "client.ovpn" file to be consistent with the server. Modify the following directives:-&lt;br /&gt;&lt;br /&gt;"dev-node" (&lt;span style="font-style:italic;"&gt;name of the TAP Win32 Adapter&lt;/span&gt;)&lt;br /&gt;"remote"&lt;br /&gt;"ca"&lt;br /&gt;"crt"&lt;br /&gt;"key"&lt;br /&gt;"ns-cert-type server" ( &lt;span style="font-style:italic;"&gt;i enabled this, since it helps prevent certain kinds of attacks&lt;/span&gt;)&lt;br /&gt;"tls-auth" (if you had created this key on the server earlier, read "Hardening OpenVPN Security" in the &lt;a href="http://openvpn.net/index.php/documentation/howto.html#security"&gt;openVPN Howto&lt;/a&gt; section).&lt;br /&gt;&lt;br /&gt;Now, you are ready to run the VPNs :-)&lt;br /&gt;&lt;br /&gt;Start by running the server. it can be invoked as :-&lt;br /&gt;&lt;blockquote&gt;openvpn server.conf ( i did this on the linux box )&lt;/blockquote&gt;&lt;br /&gt;it should throw up a bunch of messages ending in "&lt;span style="font-style:italic;"&gt;Initialization Sequence Completed&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Run the client also from the command prompt ( i didnt install the GUI ) in a similar fashion:-&lt;blockquote&gt;openvpn client.ovpn&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-6620145971929973501?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/6620145971929973501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=6620145971929973501' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/6620145971929973501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/6620145971929973501'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2009/02/setting-up-openvpn-windows-client-linux.html' title='Setting up OpenVPN (windows client, linux server)'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-3550971984645431293</id><published>2008-06-12T23:35:00.000-07:00</published><updated>2008-12-12T02:35:58.713-08:00</updated><title type='text'>Visualizing Data using a Heat Map</title><content type='html'>A very common data visualization problem that most analysts come across is how to show variations in an attribute across two dimensions.&lt;br /&gt;&lt;br /&gt;For Example, say you own an internet commerce site. After you have crossed the threshold of a few hundred users an hour, you think... hmmm... maybe i should show some featured products/good deals that i want new users to see. You start to show products that you think appeals to your audience. Great. Things are working out, but after a while, your site has again hit a plateau. &lt;br /&gt;&lt;br /&gt;You start to wonder. How else to improve the site? The most important thing to do is to make sure that the site has sufficient tracking code embedded in it, so that everything and anything a user does on the site can be recorded and analyzed later. This information is invaluable. Otherwise it is very hard to do any sort of optimization. Once you have the data. you could analyze the buying patterns of my users. Look at what gets sold when, or what is the geographical distribution of products bought. There are lots of ways, the data can be analyzed.&lt;br /&gt;&lt;br /&gt;The problem these days is not that there is no data, there is too much of it and making sense of it can be made easier with good visualization techniques. Tracking a parameter across two dimensions is quite easy using a simple 2D graph:-&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_S0p-T7TfqmU/SFWcBe61r3I/AAAAAAAAABE/AST4wK7j0Cw/s1600-h/2D.GIF"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_S0p-T7TfqmU/SFWcBe61r3I/AAAAAAAAABE/AST4wK7j0Cw/s320/2D.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5212243693044871026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Tracking an attribute across two dimensions when there is two sets (or series) of data is also possible and common:-&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_S0p-T7TfqmU/SFWcpxL8tEI/AAAAAAAAABM/r9aB21MSGlE/s1600-h/2DMultiple.GIF"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_S0p-T7TfqmU/SFWcpxL8tEI/AAAAAAAAABM/r9aB21MSGlE/s320/2DMultiple.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5212244385143239746" /&gt;&lt;/a&gt;&lt;br /&gt;Here we are using color to distinguish the variations of the attribute between the two dimensions with two series.  &lt;br /&gt;But what if instead of two series, you need need to track 20 or 30 series, it can quickly become quite overwhelming and the visualization is useless in this format. The different series form a dimension of their adding a third dimension to the fray.&lt;br /&gt;For example, take a look at this graph:-&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_S0p-T7TfqmU/SFWeic780DI/AAAAAAAAABU/CYQEuSFoYXA/s1600-h/2DMultiple7.GIF"&gt;&lt;img style="margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_S0p-T7TfqmU/SFWeic780DI/AAAAAAAAABU/CYQEuSFoYXA/s320/2DMultiple7.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5212246458471600178" /&gt;&lt;/a&gt;&lt;br /&gt;Even with 7 series, the graph is confusing. So imagine 20 or more. One option might be to draw a 3d graph or surface, but you need the dimensions to be continuous and numerical. If one of the dimensions are discrete and categorical, the 3D graph won't make much sense.&lt;br /&gt;&lt;br /&gt;Thats were the heat map comes in. It allows the presentation of variations of an attribute across two discrete categorical dimensions. If as in the example presented earlier, you are tracking the sales of products during the time of day across different categories of products. The heat map allows you to present the variation in sales as different gradations of colors. The categories can be presented along the x-axis and the time of day along the y-axis or vice-versa. The sales for each intersection of the dimensions can be used to determine the color of the cell.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_S0p-T7TfqmU/SFWh-qTE6uI/AAAAAAAAABc/SR9QCkbrPX8/s1600-h/2DHeat.GIF"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_S0p-T7TfqmU/SFWh-qTE6uI/AAAAAAAAABc/SR9QCkbrPX8/s320/2DHeat.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5212250241629481698" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-3550971984645431293?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/3550971984645431293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=3550971984645431293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/3550971984645431293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/3550971984645431293'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2008/06/visualization-using-heat-map.html' title='Visualizing Data using a Heat Map'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_S0p-T7TfqmU/SFWcBe61r3I/AAAAAAAAABE/AST4wK7j0Cw/s72-c/2D.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-1558159529957572402</id><published>2008-01-23T22:37:00.000-08:00</published><updated>2008-06-16T19:52:34.307-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web usability design'/><title type='text'>Stupid, Smart and then there is too Smart!</title><content type='html'>There is such a thing as being too smart. Everybody knows that. When someone gives a smart-Alec remark, you accuse the person as being too smart. As there are people who can to be too smart, so does software.&lt;br /&gt;&lt;br /&gt;Developers start to make their software too smart usually when they run out of ideas for new features. Sometimes "it" also happens when developers think they are smarter than their software users. Researchers love this stuff, it has optimization and machine-learning written all over it, countless papers in conferences can be churned out, to the eventual detriment of the product.&lt;br /&gt;&lt;br /&gt;Let me give you an example of what i mean by being too smart.&lt;br /&gt;&lt;br /&gt;Say, I went to the local appliances stoer and bought the top-of-the-line, hyper-expensive, super-hyped coffee making machine, that brews the coffee, pours creamers and sugar as needed, and out comes your steaming cup of coffee just right as you always love it, .... or do you....&lt;br /&gt;&lt;br /&gt;Assuming that I figured out how to operate the machine, I drink my first coffee with dark-roast coffee beans, 1 tablespoon of cream and 1 tablespoon of sugar. It turns out perfect. I love it! Second time, I do the same thing. I keep doing the exact same thing for a few weeks. Now this is a smart machine, after a while it learns, ...yes, it learns what I like, after all its smart. So next time I start the machine, it "thinks" it knows what I need and automatically makes the coffee that I always made. This is fine and dandy, until one fine day, i felt like having coffee without the creamer. But whatever I press, out comes coffee with 1 tablespoon of cream and 1 tablespoon of sugar!  Hmmm, let me look at that manual again.....&lt;br /&gt;&lt;br /&gt;Now the machine has become too smart.&lt;br /&gt;&lt;br /&gt;Usability experts will tell you that users like to have a sense of control. You might have the smartest algorithm that can read people's minds, but unless you want people to be intimidated by your product, you have to provide them a sense of control. This can be done in a number of ways.  In the coffee machine above, provide instant feedback on the choices its made and easy ways to correct it if needed.&lt;br /&gt;&lt;br /&gt;The same principles apply to software that interacts with users.&lt;br /&gt;Jacob Nielsen lists the "Ten Heuristics for User Interface Design":-&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Visibility of system status&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    The system should always keep users informed about what is going on, through appropriate feedback within reasonable time. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Match between system and the real world&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    The system should speak the users' language, with words, phrases and concepts familiar to the user, rather than system-oriented terms. Follow real-world conventions, making information appear in a natural and logical order. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;User control and freedom&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Users often choose system functions by mistake and will need a clearly marked "emergency exit" to leave the unwanted state without having to go through an extended dialogue. Support undo and redo. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Consistency and standards&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Users should not have to wonder whether different words, situations, or actions mean the same thing. Follow platform conventions. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Error prevention&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Even better than good error messages is a careful design which prevents a problem from occurring in the first place. Either eliminate error-prone conditions or check for them and present users with a confirmation option before they commit to the action. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Recognition rather than recall&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Minimize the user's memory load by making objects, actions, and options visible. The user should not have to remember information from one part of the dialogue to another. Instructions for use of the system should be visible or easily retrievable whenever appropriate. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Flexibility and efficiency of use&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Accelerators -- unseen by the novice user -- may often speed up the interaction for the expert user such that the system can cater to both inexperienced and experienced users. Allow users to tailor frequent actions. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Aesthetic and minimalist design&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Dialogues should not contain information which is irrelevant or rarely needed. Every extra unit of information in a dialogue competes with the relevant units of information and diminishes their relative visibility. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Help users recognize, diagnose, and recover from errors&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Error messages should be expressed in plain language (no codes), precisely indicate the problem, and constructively suggest a solution. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Help and documentation&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Even though it is better if the system can be used without documentation, it may be necessary to provide help and documentation. Any such information should be easy to search, focused on the user's task, list concrete steps to be carried out, and not be too large.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-1558159529957572402?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/1558159529957572402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=1558159529957572402' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/1558159529957572402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/1558159529957572402'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2008/01/stupid-smart-and-then-there-is-too.html' title='Stupid, Smart and then there is too Smart!'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-9154685247059205617</id><published>2007-06-02T17:52:00.000-07:00</published><updated>2007-06-02T20:10:07.916-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web silverlight flex adobe surface'/><title type='text'>Web UI - "Light"s and "Flex"ibility</title><content type='html'>&lt;span style='margin-left:30px'&gt;A&lt;/span&gt; lot of new stuff is happening in the web UI field. Microsoft's recently introduced &lt;a href="http://www.microsoft.com/silverlight/default01.aspx"&gt;"Silverlight"&lt;/a&gt; and Adobe's recently open-sourced &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt; has generated some excitement in the field. Though Adobe's Flash technology remains the overall leader in highly interactive apps, they are slow to load and Adobe's software has become very expensive. After reading recent comments by their CEO, mentioned in a &lt;a href="http://www.downloadsquad.com/2007/05/23/dear-adobe-what-the-hell-happened-to-you/"&gt;blog&lt;/a&gt;: "our customer is not typically price sensitive", I dont feel comfortable investing in a technology that can later hold me hostage.&lt;br /&gt;&lt;br /&gt;&lt;span style='margin-left:30px'&gt;For&lt;/span&gt; this reason alone, i am thankful to microsoft for their Silverlight technology. Competition is what Adobe needs. As many of Front-End Engineers might know, getting the javascript and DHTML to work as you want on all the myriad browsers is a nightmare. Each browser has its own quirks in the way they have implemented the javascript and CSS, which turns the design of the front-end into a shamble of code hacked to get around various bugs.&lt;br /&gt;&lt;br /&gt;&lt;span style='margin-left:30px'&gt;There&lt;/span&gt; are two ways programmers have got around this problem. One way is to use various javascript libraries, which hide the incompatibilities within the library, and expose a standard API. The most prominent of which are the Yahoo! &lt;a href="http://developer.yahoo.com/yui/"&gt;UI library&lt;/a&gt; and &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt;. Each library has its strengths and weaknesses..... the alternative was to use Flash. A third option I did briefly look at, is an open source solution known as &lt;a href="http://www.openlaszlo.org/"&gt;open lazslo&lt;/a&gt;. The idea was right, but it still didnt work like i wanted to. Open Lazslo allowed you to define your interface and interactions using a combination of xml and javascript. It then generates Flash or in the latest version, DHTML, depending on the browser agent.&lt;br /&gt;&lt;br /&gt;&lt;span style='margin-left:30px'&gt;Both&lt;/span&gt; Adobe and Microsoft are trying to expand their reach, in opposite directions. Microsoft trying to move into the online universe while Adobe, with their &lt;a href="http://labs.adobe.com/wiki/index.php/Apollo"&gt;Apollo&lt;/a&gt; platform and media player trying to move into the desktop space. &lt;br /&gt;&lt;br /&gt;&lt;span style='margin-left:30px'&gt;Oh&lt;/span&gt;, by the way, i am really excited about &lt;a href="http://www.microsoft.com/surface/"&gt;Microsoft surface&lt;/a&gt; :-)  &lt;br /&gt;Refer to a link in my earlier post ( &lt;a href="http://www.ted.com/tedtalks/tedtalksplayer.cfm?key=j_han"&gt;ted talk&lt;/a&gt; ), a demo of a multi-touch point screen, which is pressure-sensitive, while microsoft's technology uses 5 cameras, and is visually sensitive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-9154685247059205617?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/9154685247059205617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=9154685247059205617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/9154685247059205617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/9154685247059205617'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2007/06/web-ui-lights-and-flexibility.html' title='Web UI - &quot;Light&quot;s and &quot;Flex&quot;ibility'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-2124693132957363323</id><published>2007-01-25T00:37:00.000-08:00</published><updated>2007-01-27T11:36:11.855-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile interface design'/><title type='text'>Mobile Phone Interfaces</title><content type='html'>Speaking of Mobile phone interfaces, saw this recently among the many CES technologies that were showcased recently :-&lt;br /&gt;&lt;a href="http://news.com.com/1606-2-6150139.html?tag=st.rb"&gt;http://news.com.com/1606-2-6150139.html?tag=st.rb&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is an innovative way to solve the problem of having to press a key multiple times to cycle through 1 of 3 alphabets in a normal phone key.&lt;br /&gt;&lt;br /&gt;its simple, and thats why i think its a good design.&lt;br /&gt;&lt;br /&gt;The Apple iPhone has been creating waves with its new multi-touch point interface. It will be a while before it hits mainstream computer interfaces. But the technology already existed a while back and will revolutionize our interaction with the computer.&lt;br /&gt;&lt;br /&gt;Other than the one tom cruise uses in minority report, i can live with this :-&lt;br /&gt;     &lt;a href="http://www.ted.com/tedtalks/tedtalksplayer.cfm?key=j_han"&gt;http://www.ted.com/tedtalks/tedtalksplayer.cfm?key=j_han&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wish i had one of these :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-2124693132957363323?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/2124693132957363323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=2124693132957363323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/2124693132957363323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/2124693132957363323'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2007/01/mobile-phone-interfaces.html' title='Mobile Phone Interfaces'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-1081989123478200241</id><published>2006-12-06T00:06:00.000-08:00</published><updated>2008-12-12T02:35:58.948-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='interface'/><title type='text'>My Experiences with Mobile Technology</title><content type='html'>I read articles recently about how the new windows Vista Operating System, will make the PC the center of everything in your homes. In American homes out-fitted with 7.1 home theatre systems, with hi-def video content and almost infinite broadband, that might be a reasonable assumption. But i made a recent trip to India, and lets say.... er... things are different.&lt;br /&gt;&lt;br /&gt;Indian cities are crowded and noisy; Traffic is insane and computers and broadband are still way beyond most indian homes. India is known as the IT hub of the world, and everybody on the street knows somebody who works in the IT industry. But wherever I went, there was one ubiquitous device making its presense felt :- the Mobile Phone. Almost everybody had one. I know people who dont have electricity in their homes, but yet carry a cellphone! At present India and China have the largest growth rates of cellular subscribers in the world. The availability of Prepaid or pay as you go services, where the subscriber does not have to commit to a long term contract, has helped fuel this growth on a monumental scale. Of course, as a percentage of total population, the numbers are nowhere near the developed countries.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_S0p-T7TfqmU/RXdxlFSs7oI/AAAAAAAAAAM/mY1UyAC8DAk/s1600-h/Mobile_phone_use_world2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_S0p-T7TfqmU/RXdxlFSs7oI/AAAAAAAAAAM/mY1UyAC8DAk/s320/Mobile_phone_use_world2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5005594392735313538" /&gt;&lt;/a&gt;&lt;br /&gt;India tops the world in online population growth, but only 20 million users are online, which is approximately 8 percent of the population.&lt;br /&gt;&lt;br /&gt;Ring-tones, especially recent "bollywood" tunes were the craze, and the tendency of the recently "cell-phone rich" to show-off. I was travelling in the local train, a few people immediately wiped out their cellphones and started SMS-ing. One of my co-passengers received a phone-call, and the phone dutifully announced the event, with a very loud rendition of a hindi song. The recipient reluctantly answered the phone after waiting what seemed like an eternity to me! His intent was clear. &lt;br /&gt;&lt;br /&gt;On the roads, travelling by car (driven by somebody else of course, i would be insane to drive there), with two-wheeler bikes zipping around, to my amazement, there was one bike-rider even talking on the cellphone while driving!! Incredible feats of recklessness. Mobile Phone company ads litter the side of the roadways. I saw a huge Yahoo! Go Billboard Ad inviting people to surf using their phones while stuck in traffic. &lt;br /&gt;&lt;br /&gt;In India, over 80,000 persons die in the traffic crashes annually. While in the US, its roughly 44,000. The population of india is over 1 billion and of the US is roughly 300 million. So as a percentage of the population India has less traffic-related fatalities than the US, but travelling in india, you cannot but wonder how they manage to not kill themselves. That interesting statistics aside, back to cell-phones. &lt;br /&gt;&lt;br /&gt;In India, SMS is the craze. Its free, unlike the US. From old aunts and uncles to young school kids, all of them know how to SMS. They get an incredible amount of talking done using the 11 or 12 keys available to press on a normal cell-phone. The user-interface of a phone is not ideal for such an interaction. Some analysts predict that voice-recognition will take over, instead of typing. But its not a very attractive solution for the young crowd, who use SMS as a diversion during class or as a tool for Romance. Some phone software allow for predictive word completion, but it can only do so much. &lt;br /&gt;&lt;br /&gt;Using "Search" on phones is a different story. Piper Jaffray projects the global mobile search revenues will generate $11 billion by 2008. I think Voice Recognition can play a big role there. Even if the user-interface for data entry is improved and optimised, the form factor is still small, and so not very efficient. There are some start-ups that are moving in this direction, including &lt;a href="http://gigaom.com/2006/04/02/promptu-for-mobile-voice-search/"&gt;PromptU&lt;/a&gt; and San-Diego based &lt;a href="http://www.v-enable.com/ctia/"&gt;V-Enable&lt;/a&gt;. Google has already filed a patent for voice-based search - &lt;a href="http://patft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&amp;Sect2=HITOFF&amp;d=PALL&amp;p=1&amp;u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&amp;r=1&amp;f=G&amp;l=50&amp;s1=7,027,987.PN.&amp;OS=PN/7,027,987&amp;RS=PN/7,027,987"&gt;Voice interface for a Search Engine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Battle for Search is far from over, and there is room for a lot of improvement. It is an exciting future that i can foresee.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-1081989123478200241?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/1081989123478200241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=1081989123478200241' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/1081989123478200241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/1081989123478200241'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2006/12/my-experiences-with-mobile-technology.html' title='My Experiences with Mobile Technology'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_S0p-T7TfqmU/RXdxlFSs7oI/AAAAAAAAAAM/mY1UyAC8DAk/s72-c/Mobile_phone_use_world2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-4176687107876140375</id><published>2006-10-24T22:40:00.000-07:00</published><updated>2006-10-24T23:51:17.624-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='search engine'/><title type='text'>Create your own search engine or MyWeb?</title><content type='html'>The date October 23rd, 2006. Google releases to the press their latest work. "Create your own search engine" the button says. The articles boast: "Dont have to have a PhD or a Masters to create your own search engine!". So i decided to check it out.&lt;br /&gt;&lt;br /&gt;The site where its located is sort of vague :- &lt;a href="http://google.com/coop/cse/"&gt;http://google.com/coop/cse/&lt;/a&gt; . After logging in using my google account, i had to find a name for my search engine, a description, submit tags to what the search engine was about, and submit sites that i wanted part of my search engine. The creation page also had a choice to search only those sites or to include the general web as well, and also allow other people to add sites to my search engine. To test it out, i added this blog site to the list of places to search. &lt;br /&gt;&lt;br /&gt;The search didnt exactly work as i expected. I searched for "tufte", which i have obviously mentioned in my earlier blogs. It turned out zero results! That dissappointment aside, I think Google have set this up in a creative way. It allows users to customize their search engine page, allows it to be embedded in other webpages, and here is the best part : Allows you to make money (AdSense) if users click on Ads shown thru searching thru your search engine!!&lt;br /&gt;&lt;br /&gt;But having used Yahoo!s MyWeb before, i couldnt help noticing certain similarities. Y! had released the original myweb in 2005 and in the summer of 2006 revamped the interface: &lt;a href="http://myweb.yahoo.com "&gt;http://myweb.yahoo.com &lt;/a&gt;. MyWeb also allows you to submit sites and tag them. If you are logged in to your yahoo account, a general search also searches your tagged sites, but only based on the tag. Contacts of yours can also see results and search the tags you have setup. With the y! toolbar, its a snap adding a new page to ur MyWeb. &lt;br /&gt;&lt;br /&gt;The search battle continues. I have to agree that the way google is positioning their product, has gotten them a lot of press. Calling it "create your search engine" helps as well :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-4176687107876140375?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/4176687107876140375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=4176687107876140375' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/4176687107876140375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/4176687107876140375'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2006/10/create-your-own-search-engine-or-myweb.html' title='Create your own search engine or MyWeb?'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-7798286233918260117</id><published>2006-09-09T23:03:00.000-07:00</published><updated>2006-09-09T23:32:49.530-07:00</updated><title type='text'>Whats in a name?</title><content type='html'>Whats in a name?  The famous cliched phrase.  In my opinion, a lot!! While discussing the stock market over the regular afternoon caffeine shots with my colleagues, a particular conversation got me thinking. How do companies choose names?&lt;br /&gt;   &lt;br /&gt;   So many Web sites and businesses have laid claim to English, Spanish and French terms that few words are left. Thats why some companies have resorted to making up their own names. Accenture, Agilent, Altria and Verizon are just a few recent examples. &lt;br /&gt;&lt;br /&gt;   Companies spent millions trying to come up the right name. There are consultancies that help other companies with names. Terry Heckler, founder of Seattle-based Heckler Associates, which helped name Starbucks, Cinnabon, Loudeye and Panera Bread, said companies have limited options these days. Another company called NameBase does naming consultancy, and have big-names on the payroll.&lt;br /&gt;&lt;br /&gt;   Creating names with unique sounds is something of a science. Memorability, alliteration and vowel harmony are extremely important. Picking a name that grows along with the business and effectively describes what services the company provides still remains a challenge. Here is a nice &lt;a href="http://www.erikjheels.com/how-to-choose-names.html"&gt;how-to&lt;/a&gt; I found on the web.&lt;br /&gt;&lt;br /&gt;   I took the effort to check the names of companies listed on the NASDAQ and the first letter of the name. It is an interesting statistic. As of today, here is the distribution for the starting letter frequency :-&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger2/2842/3973/1600/freq.0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/2842/3973/400/freq.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Over 10% start with the letter C, and an almost equal percentage start with A. There seems to be an overwhelming predilection to use names starting with A or C.&lt;br /&gt;&lt;br /&gt;   Meanwhile, the letter frequency of the most common first letters in an english word is of the following order (highest to lowest) :-&lt;br /&gt;  &lt;blockquote&gt;t o a w b c d s f m r h i y e g l n o u j k &lt;/blockquote&gt;The letter Frequency of the most common last letter in a word is of the following order :&lt;br /&gt;  &lt;blockquote&gt;e s t d n r y f l o g h a k m p u w &lt;/blockquote&gt;(Interested in trivia like that? This &lt;a href="http://letterfrequency.org/index.html#first-letters"&gt;article&lt;/a&gt; may be to your liking)&lt;br /&gt;&lt;br /&gt;   There are even identifiable patterns in what experts think comprises a good-sounding company name. One blogger refers it as the &lt;a href="http://feeds.feedburner.com/typepad/louismg/asypta"&gt;ASYPTA pattern&lt;/a&gt;. According to this pattern, the name is of this format :- A, consonant, vowel, consonant, A (perfect example :- Ariba). Wonder what MicroSoft was thinking? Who wants a company associated with micro &amp; soft?? To its credit, the company is now beyond its name. It has become the antonym of what its name suggests.&lt;br /&gt;&lt;br /&gt;Please suggest company names that you think are good in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-7798286233918260117?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/7798286233918260117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=7798286233918260117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/7798286233918260117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/7798286233918260117'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2006/09/whats-in-name.html' title='Whats in a name?'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-115770230595853261</id><published>2006-09-08T00:46:00.000-07:00</published><updated>2006-11-10T23:34:15.313-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='laszlo'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><title type='text'>User Interface Languages</title><content type='html'>It is an undisputed fact that user-interfaces for software took a quantum leap with the Apple Macintosh computer. &lt;a href="http://photos1.blogger.com/blogger2/2842/3973/1600/macintosh.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/2842/3973/320/macintosh.jpg" border="0" alt="" /&gt;&lt;/a&gt; Before that we were squinting at green phosphorous elements as each character appeared on the CRT. Ambitious developers tried to make the best use of it by using various ASCII characters to represent boxes and buttons. As user interfaces improved, and most applications started having buttons and windows and forms (except grocery counter software, and maybe bank applications), developers started finding themselves using similar constructs to specify UI elements. Most developers now understand the meaning of terms like dialog boxes, buttons, lists, checkbox, editboxes and the like. For a nice history of the GUI, read this article - &lt;a href="http://www.guidebookgallery.org/articles/ofmiceandmenus"&gt;Of Mice &amp; Menus&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If one looks at the development of computer languages, we can see a similar trend towards abstraction. Assembly language gave way to higher level languages like C++, which allowed developers to abstract commonalities to build more complex applications. As UI-based Apps became more complex, developers were desperately looking for ways to decouple presentation code from logic. It started with the MVC Architecture, mainly in Desktop Apps. In the case of UI, the common elements were standardized and abstracted, and languages were developed to specify those UI elements. With the rise of internet, Internet-based UI apps are starting to take off. CSS or Cascading Style Sheets is an excellent step in that direction. Rich Internet Applications or RIA, as they are known, came to life with the ubiquitous XMLHTTPRequest object, google maps and the birth of AJAX. &lt;br /&gt;&lt;br /&gt;Standardization is everywhere. Look at IM (Instant Messenger) conversations: brb, lol, asap, afaik, ttyl have all been sort of standardized. Its no wonder that developers tried to standardize UI elements, and developed languages to abstract it. Though it started with a few, now there is a barrage of language specs claiming to describe User-Interface Elements. One such language is XUL. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/XUL"&gt;XUL&lt;/a&gt; or XML User-interface Language is sponsored by mozilla. It uses XML syntax to describe UI elements, and allows embedded scripts to define behaviours. Microsoft is trying something similar with &lt;a href="http://en.wikipedia.org/wiki/XAML"&gt;XAML&lt;/a&gt;. They have grander schemes of using it as an application markup language. &lt;br /&gt;&lt;br /&gt;Here is a brief &lt;a href="http://en.wikipedia.org/wiki/List_of_user_interface_markup_languages"&gt;list&lt;/a&gt; of user interface languages. One of them particularly sparked my interest... Laszlo. It is a weird name. Originally developed by a privately held company called Laszlo Systems, headquartered in San Mateo, California. It was made into an Open Source Development recently at http://www.openlaszlo.org. IBM also supported it and were crucial in the initial development of IDELaszlo, an eclipse plugin. The product requires a Laszlos server, which compiles the laszlo script into flash or limited support of DHTML, and SVG coming soon.&lt;br /&gt;&lt;br /&gt;Speaking of SVG....wonder whats holding it back? Flash seems to be so popular, but then its just feeding money into Adobe, and their plan for world domination. Its even supported by the W3C, but so far only FF and maybe Opera, support it natively for now. SVG is a technology i look forward to, once it becomes a standard on all browsers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-115770230595853261?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/115770230595853261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=115770230595853261' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/115770230595853261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/115770230595853261'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2006/09/user-interface-languages.html' title='User Interface Languages'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-115527779809750804</id><published>2006-08-10T23:20:00.000-07:00</published><updated>2006-11-10T23:34:56.659-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='information'/><category scheme='http://www.blogger.com/atom/ns#' term='HCI'/><title type='text'>Visualization of Information</title><content type='html'>I recently felt that a mouse is getting obsolete. It is not that the mouse itself has not seen any innovation. It has. The dirty and inaccurate ball has been replaced with a laser light, trackballs, graphic tablets. But it still creates carpel tunnel syndrome and fatigues the arm. We still find it hard to move that pointer to the exact "X" on the window ,and if by chance we missed the "X", something bad happens. It is embarassing that the most advanced species on earth needs to communicate with the most amazing inventions on earth through a small rodent! A new interface needs to be developed.&lt;br /&gt;&lt;br /&gt;Anyways, one thing lead to another, and i started reading "&lt;a href="http://www.amazon.com/gp/product/0961392118/sr=8-1/qid=1155277153/ref=pd_bbs_1/002-8401159-3678403?ie=UTF8"&gt;Envisioning Information&lt;/a&gt;" from Edward R. Tufte. An interesting book, its about how humans have captured various data and tried to share that data with others by representing in various forms on paper. &lt;br /&gt;&lt;br /&gt;Tufte's books include &lt;em&gt;The Visual Display of Quantitative Information&lt;/em&gt;, &lt;em&gt;Envisioning Information&lt;/em&gt;, and &lt;em&gt;Visual Explanations: Images and Quantities, Evidence and Narrative. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The problem with presenting information, as explained by Tufte, is simple -- the world is high-dimensional, but our displays are not. To address this basic problem, Tufte offered five principles of information design: &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Quantitative thinking comes down to one question: Compared to what? &lt;br /&gt;&lt;li&gt;Try very hard to show cause and effect. &lt;br /&gt;&lt;li&gt;Don't break up evidence by accidents of means of production. &lt;br /&gt;&lt;li&gt;The world is multivariant, so the display should be high-dimensional. &lt;br /&gt;&lt;li&gt;The presentation stands and falls on the quality, relevance, and integrity of the content. &lt;br /&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;The book also shows how Galileo mapped sunspots on a circular disk and recorded the same over many years, which helped him see a trend. It shows how the japanese used train maps on paper to show multi-variate data. Take a look at how the train map was created:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/60/3560/1600/visualinfo.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/60/3560/320/visualinfo.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How many variables are captured in that diagram? I am sure we could be more clever and add more dimensions to it. But it can quickly be overwhelming.&lt;br /&gt;&lt;br /&gt;People have come up with ingenious methods of solving the problem of showing multi-dimensional data on two-dimensional screen/paper (Flatlands).&lt;br /&gt;&lt;br /&gt;Here is an &lt;a href="http://www.ercb.com/feature/feature.0008.1.html"&gt;interesting article&lt;/a&gt; about a talk given by Tufte.&lt;br /&gt;&lt;br /&gt;The latest book by Tufte is called "&lt;a href="http://www.amazon.com/gp/product/0961392177/ref=pd_sim_b_5/002-8401159-3678403?ie=UTF8"&gt;Beautiful Evidence&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;More later.&lt;br /&gt;&lt;br /&gt;Popularity of my blog overtime :-&lt;br /&gt;&lt;img src="http://www.dappit.com/dapplications/BlogPlot/http://aj0y.blogspot.com&amp;timeframe=inf " &gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-115527779809750804?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/115527779809750804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=115527779809750804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/115527779809750804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/115527779809750804'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2006/08/visualization-of-information.html' title='Visualization of Information'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32549658.post-115527626952429852</id><published>2006-08-10T23:04:00.000-07:00</published><updated>2006-08-10T23:04:29.533-07:00</updated><title type='text'>Beginning of the Beginning</title><content type='html'>First Post&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32549658-115527626952429852?l=aj0y.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aj0y.blogspot.com/feeds/115527626952429852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32549658&amp;postID=115527626952429852' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/115527626952429852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32549658/posts/default/115527626952429852'/><link rel='alternate' type='text/html' href='http://aj0y.blogspot.com/2006/08/beginning-of-beginning.html' title='Beginning of the Beginning'/><author><name>Ajoy</name><uri>http://www.blogger.com/profile/01461218276316050932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
