2010 momentum has been building since 2009. Ever since I did not get the lottery for 2010 NYC Half Marathon, that lead me to register the More Magazine half marathon. On an off chance, at a small presentation at work, I got an offer to run the ING free of charge and lottery.
I can’t say it’s always been a dream of mine, because it hasn’t. But life is mysterious in many ways and allows us to grow in ways unimaginable.
Running and training for this marathon has not just built up my physical fitness, (although I’m sad to report that I have not lost ANY weight), but rather it’s been more about mental toughness.
So I’m excited to see how it’ll all play out.
I’m so humbled and honored to have spent time with my family for my grandpa’s 90th birthday. It’s worth all the time flying to Beijing, only 3 weeks before my marathon. The monkey wrench isn’t what a first-timer marathoner needs but I toughed it out and was rewarded handsomely by the love of family.
Cognos 10 BI
IBM Cognos BI provides users with many options to access information. Each
option uses common functions and interfaces. Executives can take IBM Cognos
Active reports offline to keep working while out of the office. Information
consumers and executives can access reports, charts, and other business
intelligence objects using dashboards from IBM Cognos Business Insight. IBM
Cognos Advanced Business Users and Professional Report Authors can use
IBM Cognos Business Insight Advanced to create new IBM Cognos BI objects
and to analyze information from any source and from new perspectives. Users
familiar with office productivity tools can use IBM Cognos Analysis for MS Excel
to blend the power of IBM Cognos BI information with the personal workspace of
Excel. Users on the go can use IBM Cognos Mobile to stay connected to their
IBM Cognos BI information.
Stay connected I am going to expalin each feature in details ......
Face The Truth: IBM Cognos 10 Redbook link and new features detail...: "IBM Cognos 10 RedBook Link to the Book http://www.redbooks.ibm.com/redbooks/pdfs/sg247912.pdf Some of the Feature I like: New dynamic qu..."
IBM Cognos 10 RedBook
Link to the Book
http://www.redbooks.ibm.com/redbooks/pdfs/sg247912.pdf
Some of the Feature I like:
New dynamic query capability. Optimized caching, in-memory calculations, 3x faster query
Cognos admins can export all system metrics to a RDBMS and then analyze with Business Insight(new Dashboard tool integrated in COgnos 10).
The UI works very well and looks very well thought out.
Allows end user to manage their own login credentials reducing the load on IT.
we should more intensively use upgrade manager
Improved content manager performance through caching and faster olap in memory caching
New external data wizard for Cognos10 Report Studio. A feature that supports and encourages agile development
No more messy javascript to modify prompt object text - they are now modifiable properties in cognos10 (this is the best)
http://ow.ly/i/4UH1
Go! Search looks to be included in #Cognos10.
I have created a Facebook group (what is it?) named 'The Agilists'. As the name suggests, this forum is dedicated to foster collaboration among all agile practitioners (starting with those in my network).
If you are an agile practitioner or just interested to stay tuned, please feel free to join the group by clicking on the below link.
- Join 'The Agilists'
NOTE - Having a Facebook account is a prerequisite.
Business Insight provides an integrated business intelligence experience for business users. This webbased tool allows you to use IBM Cognos content to build sophisticated interactive dashboards that facilitate collaborative decision making. These dashboards can include traditional business intelligence assets, along with Real Time Monitoring information, TM1 Websheets and CubeViews, as well as external data.
I recently read 'Who will cry when you die?' book written by Robin Sharma - the author of the best seller 'The Monk who sold his Ferrari'. The book is a collection of 101 life lessons explained in a very short but succinct manner. Even if we practice only some of these lessons in our day to day life, it will certainly enrich the quality of our personal and professional life. Listing some of the lessons that I liked the most:-
- Start Your Day Well
- Talk to Yourself
- Remember, Genius Is 99 Percent Inspiration
- Get Up Early
- Laugh More
- Spend a Day Without Your Watch
- Take More Risks
- Live a Life
- Always Carry a Book with You
- Enjoy the Path, Not Just the Reward
- Get Good at Asking
- Connect with Nature
- Use Your Commute Time
- Get Serious About Setting Goals
- Walk in the Woods
- Listen to Music Daily
- Learn to Meditate
- Stop Complaining and Start Living
- See Your Day as Your Life
- Be Humble
- Don’t Finish Every Book You Start
- Sleep Less
- Learn How to Walk
- Plant a Tree
- Be an Adventurer
- Respect Your Instincts
- Love Your Work
Enjoy reading !
I confronted the error whenever I was trying to run, for my new rails 3.0 app in Windows 7
>> rake cucumber
The error looked like
>>uninitialized constant Win32 (NameError)
Solved by installing the following gem, adding the line in the gemfile
gem 'win32console'
Go to your app directory and execute >> bundle
That's it !! I am able to run the cucmber now :-)
Got the above error whenever I was executing rake for my new rails 3.0.0 app in Windows 7.
Comment out the following lines from the rbreadline.rb file under C:\Ruby187\lib\ruby\site_ruby\1.8
This is really a huge file, opening in Word and then adding line numbers in the document may help you in commenting line number 4404. Though it may sound silly but I am adding the steps to add the line numbers in word document too.
File -> Page Setup -> Layouts -> Click on line numbers --> continuous
Line no 4404
and the following one
if defined? ''.getbyte
@encoding = "X" # ruby 1.9.x or greater
# @encoding_name = Encoding.default_external.to_s
end
For details the following URLs are really helpful
http://trbhoang.blogspot.com/2010/05/issue-with-rspec-on-windows.html
http://tom.net.nz/2010/09/installing-diaspora-on-windows/
Just to be sure all the money was going to a good cause, I stopped by the HTS Foundation Beijing office to meet the special needs coordinator, Crystal, who is also interested in running.
I loved the office and and it is light and airy. The staffers welcomed me and we chatted about what it’s like working for a charity and the work they do. I enjoyed the afternoon which ended with a 90 minute yoga session in the office.
Who knew contributing to a good cause to charity is good for the mind, body and soul! :)
I would be speaking on one of my favourite topics "Engineering Practices" at Agile Tour 2010 in Pune India this Saturday i.e. 23rd Oct 2010. This is the first time Agile Tour conference is happening in India !
Am really excited to think about the event, and specially my presentation. Looking forward to hear new ideas, new thoughts to feed my mind.
Call me crazy, but I'm going to attack another another social software orthodoxy: the Grassroots Myth. The Grassroots Myth is my name for the notion that the most effective way to bring a new social software platform into an enterprise...
I must thank my friend Sudhir Bangera for sending this very nice story to begin with my day of work. It's actually a food of thought for all ... Sharing the same.
Two brothers grew up in an orphanage. The warden of the institution was a pesky fellow, who would often say terrible things to the children.
Years passed. The little boys grew up to become fine young men, and in time got married and had families of their own.
The elder brother grew up to become bad tempered and gave his family lot of grief. The younger brother, however, turned out to be a good parent and husband. He was successful both in his professional and personal life. People who knew them would express surprise over how the two brothers were so different from each other, in spite of facing the same circumstances while growing up.
The elder brother would say, “The warden, whom we all looked upon as almost a father, set us a bad example. I had no one to guide me, so I couldn’t help but turn out the way he was. It’s not my fault, I have become like him because of my circumstances.”
And, the younger brother would say, “The warden never taught me good values or behavior. But growing up, I made a promise to myself, to hold him as an example of what not to be and to make sure that I don’t to do the things he did.”
How many times have we blamed our failures over bad circumstances or rotten luck? True success and happiness comes from making the best out of a bad situation and looking at things with the right perspective. Look at the brighter side of situations ...
Have a thoughtful day ahead ! :-)
My recommended frameworks enabling engineering practices for android development:
Sharing some beautiful snaps of Naigara falls that I have tried to capture in my small camera... Enjoy !





On October 2, 2010, my wife and I visited Mount Washington (New Hampshire) along with my friends. Mt. Washington is the highest peak in the Northeastern United States. (6288 ft). It was a wonderful experience that can not be expressed in the words. I have tried to capture the nature's beauty in my camera! Sharing some photos...




http://sixrevisions.com/usabilityaccessibility/10-usability-tips-based-on-research-studies/
Following up on my earlier post on User experience, I learnt about three highly cohesive parameters of Usability. Concentrating on just one of these aspect does not assure success of the product and it is necessary to have all of them to work in harmony.
Lets take a hypothetical scenario with a customer Liz to understand it :-
Liz is browsing an e-commerce site to purchase a credit card wallet. Like any other customer, she has multiple questions in her mind and wants to be assured about
the product before making the transaction. Now with the information available on the site, let's see if she buys the wallet or leaves the site after being frustrated.
Liz is looking at the design pages on the site, but can find only the outer portion view of the wallet. She liked the outer design, but is not able to see the back of the product. She wants to make sure that it would also store small changes with a zippered pocket. But due to a limited visual view, she is not able to make this judgement. The next option, in this case could be to look at the product description, but the description is at the bottom of the page under many unrelated selling items and Liz might not scroll to the bottom of the page. Moreover the description section has many irrelevant facts, like how the wallet is constructed from durable leather and a silk blend and is perfect to store all of our daily essentials. Yet it doesn't answer a simple question of whether it can carry loose changes or not.
Next strategy that comes in Liz's mind is "Maybe, if there is a return policy, I'd buy it. Then, if I don't like it, I could return it". Not a bad approach !
But this would help,only if she could find the return policy in the site, which she couldn't. There was no link to it on the product page. That's when she tried searching. Typing "Return Policy" into the Search box produced the error message, stating no results found. Poking around on the site did uncover a link labeled "Help" which produced an unordered Frequently-Asked Questions list. However, apparently returning a credit card wallet is not something frequently asked, because there is no helpful information on that topic.
Liz is frustrated and leaves the site. The sale is lost.
So what did we observe here ?
There is a three-way failure to communicate what the shopper needed to make her purchase. It was a simultaneous failure of the site's visual design, the information architecture, and the content design.
When Liz couldn't easily see the design of the product and she didn't locate the product description, she encountered visual design issues. When she couldn't find the page with the return policy, she bumped into an information architecture issue. And the inadequate product description and unclear policy issues were the content design issues.
Fixing just one of these would not help as the real solution comes from the interplay of these three areas and it is worth giving a thought.
Usually when you select an item from a search results list you only need to pass the id in the url and that's enough to lookup the rest of the details when processing the response. Recently I had a case where I couldn't lookup the item from the id because it wasn't in my database. I'm going to describe how I passed several pieces of information in a single url and what I did to ensure users could not be manipulate them independently.
My application was searching and displaying a list of companies then keeping track of which one the user selects.

When someone clicks on a company name it would save the company's id and display a nice message "Thanks for selecting Google Inc." Since the companies came from a slow external service I didn't want to call again, I passed both the id and name in the url.
I built a couple of simple haml files to show my company list. Each row had a link to display the company name and passed both the name and id in the url.
# search_results.html.haml
%table
%tr
%th Company Name
%th Location
= render @companies
# _company.html.haml partial
%tr
%td= link_to company.name, company_path(:id=>company.id, :name=>company.name)
%td= company.location
The controller code was also pretty straightforward.
class CompaniesController
def show
company = Company.new(:id=>params[:id], :name => params[:name])
current_user.update_selected_company = company
end
end
This worked great and worked, but then we started looking at the urls in our browser and noticed they looked like http://my.site.com/companies/60902413&name=Google+Inc..
Hmm ... What would happen if someone changed the name in the url? We tried loading http://my.site.com/companies/60902413&name=Some+Silly+Name. Uh-oh, our database now stored the selected company Some Silly Name with id #60902413. This could be confusing or worse a security risk where a clever (or malicious) user could store inaccurate information in our database.
Our solution was to combine the two fields into a single query parameter that was resistant to user tampering and is passed as a single unit. Fortunately Rails passes the session back and forth in a cookie with just that requirement. The session is a hash of many different key-value pairs that need to be encoded as a single cookie, it also contains sensitive information that should be resistant to tampering (and unreadable) and, most importantly it turns out to be something we could reuse.
Starting from the outside in what we wanted to do was rewrite our _company.html.haml partial view to put the single encrypted form of the company on the url.
%tr
%td= link_to company.name, company_path(:id=>company.to_encrypted_s)
%td= company.location
and parse that in the controller
class CompaniesController
def action
company = Company.from_encrypted_s(params[:id])
current_user.update_selected_company = company
end
end
Ok, but what do those to_encrypted_s and from_encrypted_s methods do?
class Company
def to_encrypted_s
Encryption.new.encrypt(:company_name=>company_name, :duns=>duns)
end
def self.from_encrypted_s encrypted_data
Company.new Encryption.new.decrypt(encrypted_data)
end
end
I still haven't told you how they work, we're just working down from the outside-in figuring out what other classes we'll need. So what does the Encryption class look like?
class Encryption
def initialize
secret = (Rails.version > '3.0') ?
Rails.application.config.cookie_secret :
ActionController::Base.session_options[:secret]
@verifier = ActiveSupport::MessageVerifier.new(secret, 'SHA1')
end
def encrypt message
@verifier.generate message
end
def decrypt encrypted
@verifier.verify encrypted
end
end
We make use of the ActiveSupport::MessageVerifier class which as the documentation says "makes it easy to generate and verify messages which are signed to prevent tampering".
Now when we select a company we get a url with a crazy long id like http://my.site.com/company/BAh7BzoJZHVuc2kDE%2BAUOhFjb21wYW55X25hbWUiMEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24%3D--9027b2c449c0b4a1aea375cb1722fa9db8e56066. If someone were to try and change the really long id in the url the application will throw an ActiveSupport::MessageVerifier::InvalidSignature exception instead of saving bad data.
We've given up readability in the url but in exchange we're guaranteed the id and name we get in the controller go with each other.
Usually when you select an item from a search results list you only need to pass the id in the url and that's enough to lookup the rest of the details when processing the response. Recently I had a case where I couldn't lookup the item from the id because it wasn't in my database. I'm going to describe how I passed several pieces of information in a single url and what I did to ensure users could not be manipulate them independently.
My application was searching and displaying a list of companies then keeping track of which one the user selects.

When someone clicks on a company name it would save the company's id and display a nice message "Thanks for selecting Google Inc." Since the companies came from a slow external service I didn't want to call again, I passed both the id and name in the url.
I built a couple of simple haml files to show my company list. Each row had a link to display the company name and passed both the name and id in the url.
# search_results.html.haml
%table
%tr
%th Company Name
%th Location
= render @companies
# _company.html.haml partial
%tr
%td= link_to company.name, company_path(:id=>company.id, :name=>company.name)
%td= company.location
The controller code was also pretty straightforward.
class CompaniesController
def show
company = Company.new(:id=>params[:id], :name => params[:name])
current_user.update_selected_company = company
end
end
This worked great and worked, but then we started looking at the urls in our browser and noticed they looked like http://my.site.com/companies/60902413&name=Google+Inc..
Hmm ... What would happen if someone changed the name in the url? We tried loading http://my.site.com/companies/60902413&name=Some+Silly+Name. Uh-oh, our database now stored the selected company Some Silly Name with id #60902413. This could be confusing or worse a security risk where a clever (or malicious) user could store inaccurate information in our database.
Our solution was to combine the two fields into a single query parameter that was resistant to user tampering and is passed as a single unit. Fortunately Rails passes the session back and forth in a cookie with just that requirement. The session is a hash of many different key-value pairs that need to be encoded as a single cookie, it also contains sensitive information that should be resistant to tampering (and unreadable) and, most importantly it turns out to be something we could reuse.
Starting from the outside in what we wanted to do was rewrite our _company.html.haml partial view to put the single encrypted form of the company on the url.
%tr
%td= link_to company.name, company_path(:id=>company.to_encrypted_s)
%td= company.location
and parse that in the controller
class CompaniesController
def action
company = Company.from_encrypted_s(params[:id])
current_user.update_selected_company = company
end
end
Ok, but what do those to_encrypted_s and from_encrypted_s methods do?
class Company
def to_encrypted_s
Encryption.new.encrypt(:company_name=>company_name, :duns=>duns)
end
def self.from_encrypted_s encrypted_data
Company.new Encryption.new.decrypt(encrypted_data)
end
end
I still haven't told you how they work, we're just working down from the outside-in figuring out what other classes we'll need. So what does the Encryption class look like?
class Encryption
def initialize
secret = (Rails.version > '3.0') ?
Rails.application.config.cookie_secret :
ActionController::Base.session_options[:secret]
@verifier = ActiveSupport::MessageVerifier.new(secret, 'SHA1')
end
def encrypt message
@verifier.generate message
end
def decrypt encrypted
@verifier.verify encrypted
end
end
We make use of the ActiveSupport::MessageVerifier class which as the documentation says "makes it easy to generate and verify messages which are signed to prevent tampering".
Now when we select a company we get a url with a crazy long id like http://my.site.com/company/BAh7BzoJZHVuc2kDE%2BAUOhFjb21wYW55X25hbWUiMEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24%3D--9027b2c449c0b4a1aea375cb1722fa9db8e56066. If someone were to try and change the really long id in the url the application will throw an ActiveSupport::MessageVerifier::InvalidSignature exception instead of saving bad data.
We've given up readability in the url but in exchange we're guaranteed the id and name we get in the controller go with each other.
In my previous post we discussed usage of AlarmManager to schedule batch Jobs in Android Applications. In this post, we will dig dipper into design patterns specific to scheduled jobs executing resource intensive operations.
Any process having a Broadcast receiver object, is treated as foreground process and get's priority by Android Runtime. Consider a situation where you have a resource intensive process scheduled as a batch job. Let's say, the user has been playing a rich UI game (with significant frame changes/sec) when AlarmManager triggers your resource intensive job via the Broadcast Notification. Since BroadcastReceiver object gets priority in the order of execution, the user may experience slowness / lag in the application (i.e. the game in this case) running on the UI.
In order to circumvent this problem, it's recommended to design your batch job as a service within your application. Use AlarmManager to trigger the notification and let the BroadcastReciever start (or Bind to) the service to execute your job in the background. In this way, the user would not experience any impact on the application running on the UI. As with other components, don't forget to register the Service in the Manifest.
Sample code for registering a service in the AndroidManifest.xml
public class ScheduledPostService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
// initialize the scheduleTimer
Log.d(Const.TAG, "Scheduled Post Service created");
}
@Override
public void onStart(Intent intent, int startId) {
// get a PowerLock
// Retain the wake lock till this process completes
PowerManager pm = (PowerManager) getSystemService(getApplicationContext().POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "SMSPost Tag");
// Acquire lock
wl.acquire();
// perform your operation
// Release lock
wl.release();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(Const.TAG, "Scheduled Post Service destroyed");
}
}
Why do good companies do bad things to social software adoption? In my previous post, I listed 6 things that companies can do to stimulate adoption of enterpris e social software. This advice ain't exactly rocket science. Make it your...
I have been reading a lot about usability and user experience. Just trying to develop user's perspective about different system's.
The success ratio of any system majorly depends on its usage and that would be high only if the users find it efficient, effective, easy to learn, engaging and error tolerant. These are actually called the 5 E's of Usability.
User experience is all about how does a user feels about a system, which could be a product, service, application or combination of any of these. As soon as user interaction starts with the system, an experience is developed based on the perception and response that results from the interaction. Other definitions of user experience mention that it includes all the users' emotions, beliefs, preferences, perceptions, physical and psychological responses, behaviors and
accomplishments that occur before, during and after use.
A greater user experience means increased site success and here are the benefits, that we get with it
User Effectiveness
* increased success rate and reduced users errors
* improved ease of use and learning
* increased user productivity and user satisfaction
* reduced support and training costs
* increased user trust in the system
Development Costs
* reduced development costs and time
* reduced maintenance costs
Revenue
* increased product sales, revenue and market share
* increased site traffic and transactions/purchases
* attract and retain more customers
So how do we get started ? How do we get beyond "user friendly" to the true goal of all usability work i.e. to improve the final product.
The first step here is to define the problem statement with a clear objective of what we want to achieve. To be able to do that, we need to perform some user analysis using methods like user interviews, site visits , usability tests etc. Focus should be to learn about who our users are, what are their tasks and goals in using the product.
Using the 5E's to understand users:
For each of the five dimensions of usability (the 5Es), we think about how it is reflected in requirements for each of the user groups. The 5Es are:
Effective: How completely and accurately the work or experience is completed or goals reached ?
Efficient: How quickly this work can be completed ?
Engaging: How well the interface draws the user into the interaction and how pleasant and satisfying it is to use ?
Error Tolerant: How well the product prevents errors and can help the user recover from mistakes that do occur ?
Easy to Learn: How well the product supports both the initial orientation and continued learning throughout the complete lifetime of use ?
In my next blog , I will be sharing more about the techniques of implementing usability in new and already existing sites....