Logo

Its Day Break after a looooooooooooooong Dark Night........

about 1 year ago | Nikhil Rao: Nix Talk

I would like to open this note by expressing my deepest condolences to all lives lost in the Mumbai Terror attack and also wound want to salute all the forces who were instrumental in getting the situation under control.

29th November 2008 marked the end of another BLACK DAY in India's history. It was a very long day that started on the night of 26th November. YES..... Mumbai was held at ransom for a whole 59 hours. It hurts to say that India has always borne the brunt of terror strikes time and again. Thousands of innocents have been killed and hundreds maimed and devastated in terror strikes in India in the last six years. But no terror attack of this magnitude has ever been witnessed. (http://timesofindia.indiatimes.com/India/India_a_major_terror_target/articleshow/3761676.cms).

As we know every issue does open up a can of worms, this one did too. There were several unanswered questions that every Indian has always had but they are now being more vocal about it.

  • Why does India always prove to be a Soft target for the terroists?
  • Is an average Indian Citizen Secure in their country ?
  • Why is there a security lapse ?
  • Why do the Governing bodies not take any strict measures against terror?
  • Why does our legal system suck and have several loopholes?
  • And many more......

It is upto us to take account of all these questions and ensure that we fill in these gaps (whatever it takes to do so) before the incident is long forgotten and we find ourselves facing another such incident. Every citizen is responsible to do his bit and the Govt. of course. It is time we accept our shortcomings and work together to cover them up rather than reluctantly saying "Its not my JOB".

The Media here is doing a wonderful job in expressing Public regret. India needs a radical change and I only hope that this incident acts a silver lineing in bringing about this change.
Nothing can compensate the lives lost in this carnage but I only hope that these sacrifices are accounted for and the miscreants are brought to book by our govt. before the entire world to see. We should also take this opportunity to join hands with all nations in the fight against terrorism and put an end to it such that everbody can live in peace and harmony again........

United in Pain

about 1 year ago | Rohan Daxini: Rohan Daxini

After another day of my routine work in office, 26th Nov late evening 10.30 I reached home where I was welcomed by my wife. But this time her face was grieving with fear and a sense of agony in it. Immediately she pointed me to look at television. News were flashing about random firing on civilians, attacks near CST railway station, firing near Taj and Oberoi Hotel are being heard. We kept watching news and eyes were full of surprises to see within next 1 hr all the events getting converted into a saga of Terrorism. We saw live news being flashed about action by Mumbai police and within few mins Anti Terrorism Squad (ATS) chief Mr. Hemant Karkare arrived at the spot near CST station. We saw him on television wearing helmet and bulletproof jacket and being summoned by other police officials about the terror saga. He started his action to trap down terrorists who were freely roaming near CST station.

We kept on watching television during our dinner at 11:30 pm and suddenly news flashed - "ATS chief Mr. Hemant Karkare severly injured". Not even 15 mins were passed and to our shock another news flashed "ATS chief Mr. Karkare dead during the action with terrorists". Wasnt enough here and again in a min news flashed "Encounter specialist along with SP dead". The events within an hour turned into a full blown heneoius act of terrorism. We couldnt beleive the sudden turnaround of events and deaths of top police and ATS officials. A clear sense that the terrorist attack not a small one.

It was late night 1 am when news were flashing that terrorists have taken hostages in Taj and Oberoi Hotel. Army was called up immediately and by late night 2:30 we saw the army vehicles moving towards these Hotels. National Security Guard (NSG - black cat commandos specially trained to deal with terrorism and hostage situations) team was also immediately being asked to join operations in Mumbai.

Ofcourse no one can sleep when their City being attacked and challenged. We got several phone calls from loved ones and friends to check our wellbeing. We kept on watching TV entire night till morning 5:00 am and words cant describe the shock we were in.

Rest entire world knows now what all Mumbai went through for next 67 hrs of terrorist attack.
We felt sick while watching the TV images of a terrorised Mumbai. It was so shocking to see various locations in Mumbai is turned into warzone. We felt "Heartbroken, Helpless, Angry"
The toll in the worst-ever attacks in India mounted to 195 including 10 foreigners and 15 police personnel, 295 others wounded. During the operation, which went for almost 3 days, the country also lost 3 top officials of Mumbai police, One major from NSG and 2 commandos also died and a commando injured.

will continue this post later....

Mumbai hit by worst terror attack

about 1 year ago | Gourav Tiwari: easy_software = Agile.find(ruby_on_rails)

India's economy capital - Mumbai, faced world's worst terror attack. I was following the news channels for almost three days and every time, I heard a casualty of hostages, Cops or Commandos, it hurt me even more.

Then I thought, why can't we fight the terror in more organized way? Why these people who have no religion are killing us, the common man, like we do not exist and still, we are not able to take any step towards our security? I do not think that entire responsibility for security is on Government of India or on our brave Police officers or on Army. It's responsibility of every individual. System is there to help us but in turn even they need our helping hands to fight against this brutality.

While, speaking to one of my friend, I asked him all these quesions and he said, "What should we do?" and for my surprise, I did not have answer to that question on top of my head. I thought through it and got some ideas, though may be a waste, but that's what I can think of:

1. Since mostly these terrorists try to stay in colonies, so that they will become a part of public,
in a colony, people should unite and they should report any new person coming in their colony to Police.

2. Police should check the background of each person, even though this is done in most of the socities in mumbai, but again this should be done strictly.

3. People should try to keep an eye on new people, they should be polite with everyone but they have to verify each person in a way, that should not hurt the new person.This point is very important, this should not become a way to offend a person on racial or cast or religion basis.

4. These terrorists may stay in hotels, every hotel should be provided metal detectors, it may cost some bucks to Government. but it can help immensely.

5. Goverment should come ahead and set a deadline, by which each person in india should get some kind of Identity card. People without identity card, should get very limited benifits.

I am not saying this will kill terrorism, because these terror attacks happened in evry part of the world, no matter how secure the place is, but these ways will definately make some impact, rather than sitting idle. None of the steps I mentioned, will make india terror free in a day, but I hope gradually it will. And above all, it's responsibilty of individuals to secure themselves and people have to help each other.

Are you flocking yet?

about 1 year ago | Amar Phadke: Amar Phadke's weblog

This was about six months back. I was searching for a Linux based Flickr client that could mass upload my daughter’s birthday pictures. I came across something called ‘Flock‘. It turned out to be a full fledged browser based on Mozilla. There are a lot of things that you can “easily” do using this browser. Some [...]

Mumbai Update

about 1 year ago | Rajesh Rathod: Uncommon "Common Sense"!

It's been more than 24 hours since the Mumbai came under an unprecedented terrorist attack, the rescue operations are far from over. The visuals on TV are disturbing and situation is very very tensed out here.

I wish and pray that all your friends and families are safe. Fortunately, my friends, colleagues and relatives are safe here. Hope the situation becomes normal very soon.

It's holiday time in US. I wish all of you a very happy thanksgiving!

Bangalore's on Fire..

about 1 year ago | Suman Thareja: suman thareja

Check this out..

http://www.facebook.com/event.php?eid=60753648416&ref=mf

I hear Mumbai is working on theirs; will keep you posted.

Leadership styles... part 2

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Thank you for your comments Rajesh. The styles of directing, supporting and coaching are well known and I believe in different strokes for different folks too (see Rajesh's post)...

An interesting question that comes to mind is - At what frequency are these styles practiced and why?

I've noticed the frequency as: directing > supporting > coaching

Some leaders might reason that it is because of the level and distribution of talent and maturity in their team. It is true in various cases, but cannot be applied universally (more and more we're surrounded by talented professionals). Could the following be some reasons for it? Thoughts?

(a) the level of difficulty of these styles
directing < supporting < coaching

(b) leader's comfort factor
Most leaders started and grew in the organization as individual contributors and default to it (or achieving the goal itself) when faced with another question or goal

(c) how leaders are measured (what expectations are set for them)
You get what you measure... If you measure leader's output as tasks done, that's what they'll focus on and perhaps use directing more often to achieve those goals. On the other hand, if your measure is how they develop talent, they might flex their coaching muscle...



I'm trying to learn and practice coaching skills as well given the good talent pool in our organization. Please give me feedback on what has (has not) worked and feel free to suggest techniques that have worked well for you...

Interesting read on "WorkLight"

about 1 year ago | Rohan Daxini: Rohan Daxini

The organisation for which I work have recently partnered with WorkLight Inc.
The partnership is to provide companies, for the first time, the ability to securely engage customers, partners and employees through consumer Web 2.0 tools, such as Facebook, iGoogle, iPhone, apps, desktop gadgets, RSS and more. Enabling secure, personalised and enterprise-grade interactions beyond the portal, companies will gain real business edge and significant advantages while reaping increased value from their existing infrastructure.

WorkLight lets businesses embrace emerging Web 2.0 consumer technologies to do more business, securely. Worklight believes that by making popular Internet tools enterprise-grade, companies can vastly improve collaboration, increase worker productivity, streamline the sales and distribution chain, and enhance business process execution. Bottom line – WorkLight enables companies to be more successful.

WorkLight believes that employees, salespeople, channels, partners, and customers should have instant and secure access to the information they need, wherever they are. This information should be available using the same convenient tools they are already using at home to get their daily news and other important updates. The need to log into complex portals to find information and complete tasks is a thing of the past.

Situational Leadership

about 1 year ago | Rajesh Rathod: Uncommon "Common Sense"!

So often I find organization "culture" influencing the leadership style so much that just to align to the "culture" or style of the boss, people miss out on the common sense of leadership styles. I firmly believe that you need to have different strokes for different folks.

Paul Hersey and Ken Blanchard have done a phenomenal job of explaining this through 'Situational Leadership". Effectiveness of a leadership style - Directing, Coaching, Supporting or Delegating- depends on development level of the follower. Hersey and Blanchard use four development levels to explain the concept.

* D1 -“Enthusiastic Beginner”: Low Competence, High Commitment
* D2 - “Disillusioned Learner”: Some Competence, Low Commitment
* D3 - “Reluctant Contributor”: Moderate to High Competence, Variable Commitment
* D4 - “Peak Performer”: High Competence, High Commitment

Suggested leadership styles for each levels are:
* Directing for Enthusiastic Beginner
* Coaching for Disillusioned Learner
* Supporting for Reluctant Contributor
* Delegating for Peak Performer

There is a lot of literature available on this topic, but there is, unfortunately, a very few people / organizations practicing them:-(

So, which leadership style works for you?

Open Source Learning Management Systems

about 1 year ago | Lalatendu Das: Interpretations of Technorealism

Our experience with Enterprise LMS such as Saba (past) and Plateu (current) hasn't been great. Since I am involved in Application support, my group has been through many painstaking & frustrating hours of discussions with Platue support for getting desired technical support. That lead me to analyze the Open source trends around Learning Management systems.

The Open source LMS platforms are quickly maturing. Leading the pack is Moodle (www.moodle.org). It's modular in design and allows new modules/ plugins to be incorporated with core modules. Moodle has developed a significant user base among SMEs and educational institutes. It has currently around 36000 registered sites with 1.4 million courses. Available under GNU GPL and is OSI certified.

Other worthy competitors are

Blackboard WebCT
Sakai (www.sakaiproject.org)
Atutor (www.atutor.ca)
EFront (www.efrontlearning.net)

Checkout the eLearning Guild
Press Release for market leaders in LMS platforms.

http://www.elearningguild.com/content.cfm?selection=doc.769

Applications usually use their own data

about 1 year ago | Alex Rothenberg: Common Sense Software

I just read a very interesting post by Martin Fowler called Database Thaw. He talks about various database technologies and what the future might hold for object or relational databases but what caught my interest was his discussion of application and database integration patterns.

He says "For many organizations today, the primary pattern for integration is Shared Database Integration - where multiple applications are integrated by all using a common database." This is certainly true where I work. I've even heard it said that we have one gigantic application since all (or most) share the same underlying database so cannot be updated independently.

He also talks about Integration Databases which store data for multiple applications and Application Databases which are controlled and accessed by a single application.

Historically my company has moved toward the integration database pattern often building complex service layers to enable shared access to the data on the assumption that if you build it they will come the data would be reused if it was easy enough. However I believe that its only a very small subset of our data that is truly common and many applications want to use. For that small subset a shared database with a service layer is probably a good design. The vast majority is private to an application and by designing it into a separate application database can evolve to best meet the needs of the application without concern for a more general service that in our case is more hindrance than benefit.

One important thing to remember about an application database is that the data exists to meet the needs of the application so a design that allows the database to best meet the application's needs will be to everyone's benefit. Finally database technologies are very complex and do a lot so it is probably wise to have a good database developer on your team to make sure you're using the database appropriately but they should be a part of your team not on a separate database team as I've seen in the past - particularly on Java/Oracle projects I've been a part of.

Thoughts?

Applications usually use their own data

about 1 year ago | Alex Rothenberg: Common Sense Software

I just read a very interesting post by Martin Fowler called Database Thaw. He talks about various database technologies and what the future might hold for object or relational databases but what caught my interest was his discussion of application and database integration patterns.

He says "For many organizations today, the primary pattern for integration is Shared Database Integration - where multiple applications are integrated by all using a common database." This is certainly true where I work. I've even heard it said that we have one gigantic application since all (or most) share the same underlying database so cannot be updated independently.

He also talks about Integration Databases which store data for multiple applications and Application Databases which are controlled and accessed by a single application.

Historically my company has moved toward the integration database pattern often building complex service layers to enable shared access to the data on the assumption that if you build it they will come the data would be reused if it was easy enough. However I believe that its only a very small subset of our data that is truly common and many applications want to use. For that small subset a shared database with a service layer is probably a good design. The vast majority is private to an application and by designing it into a separate application database can evolve to best meet the needs of the application without concern for a more general service that in our case is more hindrance than benefit.

One important thing to remember about an application database is that the data exists to meet the needs of the application so a design that allows the database to best meet the application's needs will be to everyone's benefit. Finally database technologies are very complex and do a lot so it is probably wise to have a good database developer on your team to make sure you're using the database appropriately but they should be a part of your team not on a separate database team as I've seen in the past - particularly on Java/Oracle projects I've been a part of.

Thoughts?

Leadership styles

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Different leaders approach getting their teams to a solution differently. Here are some patterns I've observed and their effectiveness...

1) "Let me show you the way"- Leader's focus is to get a task done
- "I know, follow me" style

2) "We don't know, lets figure it out"
- Leader's focus is to let the team find a solution. Leader shepherds the team and is a coach, a facilitator in this case

3) "Let me help the team figure it out themselves"

- Leader's focus is to grow the team
- Leader knows a solution but doesn't give it away to the team. He/she uses techniques like questioning to help focus the team directionally
- In this process, the team solution could be different from what the leader imagined but he/she is fine with it (a different answer/outcome isn't bad if it is directionally correct)

Need more "Real" Product Owners

about 1 year ago | Biju Bhaskar: Thoughts on enterprise application development...

As I have mentioned early, we are in the process of becoming an agile/Scrum organization. As you know PO is a very important role in Scrum. We need more "real" product owners (PO) to be a successful agile organization...

So far, we have been assigning POs at the beginning of each project, not for a product. They are usually BAs who are trying their best to represent business by playing the PO proxy role. Once the project is done, the ownership is passed to support organization, who are busy with supporting the application. No one is currently owning the entire product lifecycle.

To be an effective PO, you must either be from business, or be in a position to accurately represent the business. In our world, it is usually tough to have someone from business be the PO. So ideally... a PO should be owning the entire product lifecycle as following..

  • Conduct user research & interviews, drive product adoption, review support issues, review and understand usage patterns etc.
  • Maintain and prioritize Product Backlog & Roadmap
  • Work with Program Manager to create business case for a project
  • Work closely with Dev team to develop product increments; Continuously maintain & prioritize Backlog based on user feedback
  • Ensure delivery of incremental value to business


If they dont know the business, users, and the product how can they be an effective and real PO?

Also, I think.. POs would need a blend of the skills usually separated by traditional roles like BA,UX, PM etc. ...Jack of all trades. I will blog more about that later...

Need more "Real" Product Owners

about 1 year ago | Biju Bhaskar: Thoughts on enterprise application development...

As I have mentioned early, we are in the process of becoming an agile/Scrum organization. As you know PO is a very important role in Scrum. We need more "real" product owners (PO) to be a successful agile organization...

So far, we have been assigning POs at the beginning of each project, not for a product. They are usually BAs who are trying their best to represent business by playing the PO proxy role. Once the project is done, the ownership is passed to support organization, who are busy with supporting the application. No one is currently owning the entire product lifecycle.

To be an effective PO, you must either be from business, or be in a position to accurately represent the business. In our world, it is usually tough to have someone from business be the PO. So ideally... a PO should be owning the entire product lifecycle as following..

  • Conduct user research & interviews, drive product adoption, review support issues, review and understand usage patterns etc.
  • Maintain and prioritize Product Backlog & Roadmap
  • Work with Program Manager to create business case for a project
  • Work closely with Dev team to develop product increments; Continuously maintain & prioritize Backlog based on user feedback
  • Ensure delivery of incremental value to business


If they dont know the business, users, and the product how can they be an effective and real PO?

Also, I think.. POs would need a blend of the skills usually separated by traditional roles like BA,UX, PM etc. ...Jack of all trades. I will blog more about that later...

Happy

about 1 year ago | Surbhi Bhati: Clean Desk, Jammed drawers

So the poem below (you know…the collection of lines..in the previous blog, if you can call it a poem that is!!) is my perception of this in this city. It’s a reflection of the fact that you feel so tiny in the vastness of this giant place and don’t even realize how much deep are you immersed into the hustle-bustle.

By the way, somehow I am finding myself in a relatively happier mood nowdays. Don’t ask me the reason, as I am always so vague with reasoning..seriously..I am like, I contemplate in my mind for several long miniutes about a thing and then get to the most obvious reason for something that others get to in seconds.. and that too..very naturally!! Anyway, that’s not the point..the point is, I am happy..and the reason might be that I shopped for some rally funky stuff this month (though I still don’t know when and how am I going to utilize it..as I work in the boring software world where you have a proper guideline of what to wear and what not to wear!! Trust me!! It actually happens..Human Rights!!Anybody listening?? Pls HELP) whatever it is..its a nice feeling..i am up and unplugged..and I hope it stays longer..wohooooooooo

P.S-- And just now I realized, Italics irritate sooo much!! So I have chaged the style of my blog..hope it looks fine now.

Used Car Buying Tips - India :)

about 1 year ago | Riju Kansal: Riju's Thoughts Captured...

Questions to ask -- 
-Mumbai reg?
-Reason for selling?
-First owner?
-Battery?
-Tyres/Stepny?
-Dents/Scratches/Re-painted?
-Rust?
-Brakes?
-Leaks?
-Serviced on time? Have Records?
-Music System? Audio Cassette
-Kilometers?
-Who drives it?
-Price negotiable?

TDD Articles

about 1 year ago | Riju Kansal: Riju's Thoughts Captured...

http://blog.jtimothyking.com/2006/07/11/twelve-benefits-of-writing-unit-tests-first

http://msdn.microsoft.com/en-us/magazine/cc163665.aspx

http://www.aqris.com/pages/viewpage.action?pageId=5406779

Android Stock Quote Application

about 1 year ago | Amar Phadke: Amar Phadke's weblog

I got a chance to work some more on my pet project over the weekend (thanks to my wife and daughter). I started off with the idea of saving stock symbols to a portfolio. These would provide a high level picture of all stocks, their last traded price, change and movement (up/down) on one screen. [...]

Walking around Paris.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

By day.

And by night.

Paris, part two: marché de plein air.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

I landed in Paris at 8:30 on Saturday morning. They'd fed and watered me on the plane, and I'd managed to wash up in the tiny little bathroom (Where, it should be noted, Clarins products were on offer. Love Air France.). These were both good things, since my room was not ready when I turned up at the hotel about an hour later.

I dropped my luggage off at the hotel, grabbed my book and a Plan de Paris, and headed toward the Louvre. It was a brisk, slightly drizzly day, and I was bundled in my jacket, scarf and gloves (All black; after all, this is Paris, darling.). I passed the mairie (town hall) for the 4th arrondissement, and right there in its courtyard was an open-air market (en français: un marché de plein air).*

I'd avoided fresh fruit and vegetables in India (there's nothing worse than sitting through five days of meetings while simultaneously battling Delhi Belly), and so was immediately lured to the fruit stand. I bought three clementines and ate them, standing in the square, in quick succession. Once the fruit was safely in my tummy, I had time to explore.

There were vegetables of every variety, oysters, gorgeous fresh fish, cooked meats, wines, and even a boulanger. I spent twenty minutes wandering around, devising menus in my mind and fantasizing about having such a well-provisioned market as close to my apartment as this was to my hotel. And, of course, I snapped some photos for your enjoyment...here are a select few. The full set can be found over on Flickr!



*Obsessive internet research has revealed that the market I visited is the Marché Baudoyer, in Place Baudoyer, and is the rare Paris market open on Wednesdays as well as Saturdays.

Bare Necessities for Success in Production Support

about 1 year ago | Nikhil Rao: Nix Talk

After coming back to India of late, I have developed this interest to play Table Tennis at the recreation room of my work facility. I always land playing a game against the pros, at the end of which I end up loosing. On pondering over my loss, I concluded that these pros were playing “Table Tennis” while I was just trying to keep the ball back on the table, but without any strategy.

I would like to draw an analogy of this reference with Production Support Management for software applications.

Just as any player would concentrate on the game with a strategy behind his moves, we need to check if our support teams are simply solving issues as they get them (like I play table tennis) or are they really servicing the customer with a strategy to ensure that they do not get this issue again.

When I talk of a strategy to succeed in Production Support the five key ingredients that I can think of are:

  1. Fixing Issues at the Root.
  2. Proper Communication Channel (within teams)
  3. Support Artifacts
  4. Infrastructure & Monitoring
  5. Customer Satisfaction.

I am keeping “Customer satisfaction” at the bottom of my list because if we are able to force a compliance on the first four attributes then that would in turn ensure Customer Satisfaction as the end product.

1) Fixing Issues at the Root.

‘Every ticket that is hurled at the Production support team to look at, arises due to a cause behind the same’

Allow me to explain this with an example:

There was an instance when a monthly report execution failed, as there were multiple hung processes on the server executing these reports. The instinct to provide an immediate addressal to this issue would tell me to simply kill the hung processes and get going with the reports. However in doing so, I would miss the ‘big picture’ in understanding the activities on the server that led to hung processes.

Having given the above example I would like to highlight that it is equally important to understand the root cause behind any request and fix it at the origin (on priority). Doing this would avoid the resurgence of similar issues in future and would simultaneously improve the health of the application.

However to do so it is required to have proper development procedures in place, to take on the fixes arising due to root cause identification. This defined process in any organization needs to be flexible enough to absorb such adhoc development requests, as prioritizing these fixes can get chaotic at times. (May be I would comment more on this subject in my following Blog).

2) Communication

The support structure of an organization depends whether the software growth in that firm has been organic or inorganic. An inorganic growth will only add to multiple layers being identified in support with multiple teams supporting various modules of an application. However it would be ideal to flatten this structure. Multiple layers of hierarchy in support would only add to complications. This would lead to tickets bouncing back and forth between various support teams and in turn agonizing the end user.

I would say it is rather impossible to have a completely flat support structure in any organization. Given this fact, communication plays a major role for success stories in support. Below listed are a few pointers we need to consider wrt communication.

  • Communication between internal support teams to be complete and crisp.
  • All support TMs should have a list of who’s who in different support teams.
  • All teams should have the latest updates regarding scope of work of different support teams
  • List of SMEs pertaining to the application.
  • User should always be in loop in case of multiple teams handling an issue. Also the user should have a single point of contact in such cases.

3) Support Artifacts

What are the basic artifacts that a support team will need to run the daily show? This depends on the application complexity and the technologies involved. The right proportion of technical and functional documentation required should be a call of the support team. But what every support team could document is a FAQ Document or a learning document that would encrypt the procedure to resolve frequently occurring tickets of similar nature.

Apart from these, a support team should always have the list of Upstream and Downstream application wrt the system they support. The list of users tagged to the applications would prove to be an added bonus.

The support teams need to ensure that all documentation consumed by the team are stored at a central location accessible to other teams as well.

4) Infrastructure & Monitoring

Application monitoring by all means has to be proactive rather than reactive. This would help the support team to jump to issues and fix them even before the users get to know of them. A novel idea that I heard in one of the discussions was to have a dependency GRID for software products. A dependency grid illustrates which servers host which databases, and then which databases are used by which applications, and finally the names, numbers, and email groups of the business users that are affected by that server/database failure. If any of the components in the defined Grid fails then all corresponding impacted components turn RED. This will enable your team to proactively manage your customers expectations. There are tools available in the market that offer this kind of feature.

Apart from this infrastructure management plays a crucial role in the support structure of an organization. It would be advisable to have a dedicated team focus on the health (performance included) and maintenance of servers.

And as stated earlier, Customer Satisfaction which would be the to the success of any production support team can be achieved by effective blending of the 4 key attributes discussed earlier.

So, think about it…is your Software Production Support team playing table tennis as champions do (with strategy), or are they just trying to keep the ball back on the table?

Paris, an aside: L'Hôtel Caron de Beaumarchais.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

A quick note about L'Hôtel Caron de Beaumarchais, where I stayed for two nights during my visit to Paris. It's adorable, affordable, and in a perfect location. Just off the Rue de Rivoli, within walking distance of Île Saint-Louis, Île de la Cité, the Louvre, and the Bastille, and about two blocks from two different stops on the 1 line (Château de Vincennes-La Défense) of the tro, it was an excellent jumping-off point for all my weekend activities.

The bonus: it's in le Marais, an adorable neighborhood untouched by the Hausmann renovations of the 19th century. It's full of adorable shops, galleries, and fantastic bistros and bars. Most importantly: it's a real neighborhood, accessible and far less touristy than Montmartre, Place Vendôme, or St. Germain. In short, I've found my new Parisian base, and I highly recommend you check it out, too.

Paris, part one: Dehillerin.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

On my first day in Paris, I spent the morning walking all over the place, ending up at the Louvre for a couple of hours. Once I felt like I'd paid enough cultural homage, I headed north towards the Bourse du Commerce to pay a visit to my own personal Mecca, otherwise known as E. Dehillerin. I'd visited once before, back on my 2006 Europe trip (details here), so I knew what my targets were.

Ready to spring into action, I opened the door and was confronted by a teeming sea of Parisians (and a few American tourists). When Louisa and I stopped by in 2006, it was a Monday or Tuesday afternoon; this was Saturday afternoon at 1:00, and all bets were off. Nothing, though, could really bust through the very Zen I'm-in-Paris-so-everything-is-OK-by-me attitude I'd adopted since landing at Charles de Gaulle, so I just sat back, snapped a few pictures, then set about finding the salad servers, charlotte molds and top-secret holiday-related purchases from my list.

In what was to be the first of a couple of deja-vu moments, the first salesman to come up to me was the same one who waited on us two years ago; this time, instead of adorably belligerent, he was belligerently flirtatious, and seemed frustrated that I wasn't really in the mood to banter. He disappeared into the office a few minutes later, and didn't reemerge.

Dehillerin is a wonderland for people who like to cook or bake. Tart pans, springforms, copper cookware, crepe pans and whisks are stacked three and five deep on rickety shelves that stretch all the way up to the 15-foot ceilings. The glare cast by the bare bulbs overhead grows dim as you enter the rabbits' warren of the store's outer aisles, and the overall atmosphere is that of your crazy aunt's attic.

But the passion and enthusiasm of the staff for their products, and of the clientele for their chosen hobby (and, in many cases, profession), is palpable. This is no Williams-Sonoma, with gorgeous displays created to lure in unsuspecting customers who can't tell a saucier from a skillet. This is a store for serious cooks, where you have to know what you need to find what you want.

And what did I want? Well, I'd been entrusted with a mission to replace Louisa's gorgeous salad fork, which broke earlier this year. Check! And me? Well, I've been wanting small charlotte molds for my collection - I will use them to make individual cakes, sticky toffee puddings, and cups of chocolate mousse. Check!

Coming up...Paris, part two

Biggest Ruby on Rails Application in the world

about 1 year ago | Lalatendu Das: Interpretations of Technorealism

As a continuation from my earlier post, here is another thumbs up for 'Cloud Computing'. Checkout "Bumper sticker" application on Facebook. With above 1.4 million daily hits, this is the biggest Ruby on Rails application in the world (by amount of data exchange).

See the video below to find out how the Light Engineering development team in LinkedIn, used RoR scalability best practices along with cloud computing to build Bumpersticker.

http://www.joyent.com/a/scale-rails-to-1-billion-pageviews

SAP TechEd 2008 at Bangalore

about 1 year ago | Bhargav Gandhi: AGILE SOFTWARE DEVELOPMENT

I along with my team, attended the SAP TechEd at Bangalore. It was a 3 day technical event attended by many SAP folks from various IT companies. The theme was Connect, Collaborate and Co-Innovate!!

Being a green field in an SAP world, I had the first experience of the SAP community at the TechEd. Communities always helps its members, products and technologies. I had always associated communites with only open-source technologies. But I was wrong. May be due to my lack of knowledge :(. Even a company like SAP is promoting and focussing on the SAP community development.

It was an informative TechEd for me.

Who am I?

about 1 year ago | Nikhil Rao: Nix Talk

I am a software professional working with a leading IT Consulting Firm.

Having spent many years in the IT industry I have developed an aptitude to pick up challenges as they come along ones stride and master the same as I move along.

Of late, I have developed this habit of reading and responding to blogs. I find it a medium one to dump their thoughts and expressions on a web page. So here I am, introducing myself to the blogging community......

Sustaining communication with offshore teams

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck



Each visit to the offshore development center highlights the vast communication gap that exists between onshore and offshore. These teams don't fully understand each other's goals, issues etc. and don't have shared views on organizational priorities.

On a recent visit, I noticed two issues with this communication gap:

1) disconnect: lack of knowledge and/or understanding of each other's priorities. E.g. there are no common posters at onshore and offshore; technical priorities weren't known to the technologists offshore; onshore members doesn't realize/understand/appreciate the state of offshore - many advancements it has made in several areas...

2) lag: shifting priorities, goals were not well communicated and understood resulting in the offshore teams focusing on "old" priorities.

Geographical and time separation, project focus (narrow), not a priority for anyone are typical reasons why this has continued for several years.



This gap is counter-productive and slows down the speed at which the we can improve as a development organization.

To leap from the current state (ODC is at an inflection point), we've identified sustaining communication with offshore teams as a priority and want to make significant traction on it from now on. The guiding principles for the solution are:

1) establish something that we can sustain (not high activity for a few months that dies down later)

2) create a "need" to communicate (optional doesn't stick/sustain)



Here are some ideas we've discussed so far (more to come). We need to evaluate these against the guiding principles (Can we sustain it? Will people do it?) to select the right ones to focus on...

Let everyone know its a priority


Build trust and understanding
- e.g. periodically conduct offshore week, where onshore teams we come in early so that offshore can leave on time (not at 9pm their time)


Make it someone's responsibility
- Assign the responsibility of information radiators (or making sure its happening) as someone's "day job"


Distribute the work of information radiators

- onshore members (technologists and some BA and PM) mentor/coach/connect with offshore members


Connect the champions at each location

- Each initiative onshore and offshore should have champions/radiators in the other location


Attend each other's events virtually

Offshore/onshore townhalls, monthly meetings, CoE discussions


Socialize virtually
- Hang out virtually
. Spend time without any agenda (water cooler conversation)


Use technology

- Newsletters/posters
- AppDev TV
- Internal Twitter anyone?

Silly site - Netdisaster ... Destroy the Web

about 1 year ago | Alex Rothenberg: Common Sense Software

My kids just showed me a silly site http://www.netdisaster.com/ I had to share.

Silly site - Netdisaster ... Destroy the Web

about 1 year ago | Alex Rothenberg: Common Sense Software

My kids just showed me a silly site http://www.netdisaster.com/ I had to share.

High performing teams

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Our IT leader discussed high performing teams with us today . Here's what I gathered...

What is a high performing team?
- A team whose output is much greater than what team members could achieve individually (whole is greater than the sum of its parts)

High performing teams are rare...

Their foundational qualities are:
- Unquestionable trust
- Respect and understanding of team member strengths (and weaknesses)
- Unquestioned commitment to task

Once they have the foundational qualities, high performing teams usually exhibit following behaviors...
- Cover for each other
- Personal achievements are secondary to team achievements
- Push project boundaries


Here are a few things we can do to help create high performing teams:
- Set expectations for commitment to task
- Send message that you trust team members
- Give team members chance for new beginnings (eliminate/minimize preconceptions). Consider each day as a fresh start for yourself and others too...
- ?


If you think about it, the foundational and behavioral requirements for high performing teams seem similar to Maslow's hierarchy of need for individuals. May be we can conceptualize high performing team requirements with "Maslow's hierarchy of need for teams".

Product customizations

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

After my recent post on vendor product usage scenarios, one of my colleagues asked me to elaborate what I meant by product customizations... Here's how I think about it. Please join this discussion to help define it...

Customization: You've customized a software product, when you've made a change in the product that the vendor doesn't provide a published and supported* mechanism for...

* The published and supported mechanism for change in a software's behavior are through configuration and API.

Tests to detect customizations:
- Did you use published and supported mechanisms (configuration, API) in the product to change product behavior?

- Will your changes be compatible with new product versions? I.e. will your changes work seamlessly after you've upgraded the software product to a newer version? (This test is necessary but not sufficient, as any changes to published and supported configuration and/or API can also make this test true)

- Does the vendor support your changes through its "regular" support or does it charge you extra?

- ?


Open question: How does this differ between Open Source Software and proprietary vendor software?

Little more Rambling!!

about 1 year ago | Surbhi Bhati: Clean Desk, Jammed drawers

The Wakeup call rings,

Brings in a Sigh,

Yet another day has begun

Just to pass by.

You set out yet again,

To make it an EXTRAordinary day,

You step out of your house,

And the EXTRA blows away.

However much you try,

You will always be part of a Rat Race,

Its become such a long queue,

Someone is gotto be ahead.

So why don’t you just take a pause,

to think, to take a break,

That it doesn’t matter how different you are,

But the difference that you make.


So, any clue what it means?? Ok, dont bother to answer that one..Even I dont know ;-))


Our ODC is at an inflection point...

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck



Earlier this month I visited our offshore development center (ODC) in India. Many of you have asked me about the current state of ODC. This post captures some of my thoughts...

This year, I noticed distinct improvements compared to last year. Although there are improvements each year but this year was special! Changes were not just incremental but a large step forward...

Given the passion, energy and excitement in the group there (~170 ) I felt like being in the middle of a college classroom. A place where people are learning, growing and having fun while doing it. The energy onsite is not even half of what I experienced there.

Some words/phrases, I've used to describe how I felt are -
- high energy
- passionate
- learning agility
- college classroom feel
- share successes
- share failures
- high performing team
- desire to do more
- desire to make an impact
- change agility


Our ODC is at an inflection point...

We need to create an environment, build a platform to help the ODC leap forward to become a higher performing team. If we fail to do this we will loose an opportunity and the ODC will continue on its regular growth path.

Over the next few weeks I'll think about the necessary conditions to create this environment,, meanwhile here are some factors that motivates them... Lets do more of it...
- direct interaction with onshore (sponsors/POs/CoEs)
- hear their ideas
- create transparency
- exciting work
- variety in work to learn new technologies/domains
- timely feedback (praise, development areas)
- play multiple roles (support, QA, development, BA, PM)
- celebrate success (project accomplishments)
- opportunity to become specialist (full coverage in an area like testing, quick starts)
- ?


And here are some things that kill their motivation... Lets do less of it...
- delays
- insufficient resource commitments
- no idea of roadmap,
- old technologies
- ?

The auto_complete plugin modified for repeated fields

about 1 year ago | Pat Shaughnessy: Pat Shaughnessy - Home

(Updated January 2009)

This version of auto_complete will support text fields that are repeated more than once on a complex form. It allows you to call text_field_with_auto_complete inside of fields_for or form_for.

Code: http://github.com/patshaughnessy/auto_complete

Install:

script/plugins install git://github.com/patshaughnessy/auto_complete.git

More information:

Note: my changes were previously in a separate plugin called “repeated_auto_complete,” but now I’ve merged the changes into this forked repository of auto_complete.

The auto_complete plugin refactored to support repeated fields and named scopes

about 1 year ago | Pat Shaughnessy: Pat Shaughnessy - Home

(Updated April 2009)

This version of auto_complete will support text fields that are repeated more than once on a complex form. It allows you to call text_field_with_auto_complete inside of fields_for or form_for.

It also supports the use of named scopes with auto_complete_for to generate custom filtered autocomplete lists.

Code: http://github.com/patshaughnessy/auto_complete

Install:

script/plugins install git://github.com/patshaughnessy/auto_complete.git

More information:

Note: my changes were previously in a separate plugin called “repeated_auto_complete,” but now I’ve merged the changes into this forked repository of auto_complete.

The auto_complete plugin refactored to support repeated fields and named scopes

about 1 year ago | Pat Shaughnessy: Pat Shaughnessy - Home

(Updated April 2009)

This version of auto_complete will support text fields that are repeated more than once on a complex form. It allows you to call text_field_with_auto_complete inside of fields_for or form_for.

It also supports the use of named scopes with auto_complete_for to generate custom filtered autocomplete lists.

Code: http://github.com/patshaughnessy/auto_complete

Install:

script/plugins install git://github.com/patshaughnessy/auto_complete.git

More information:

Note: my changes were previously in a separate plugin called “repeated_auto_complete,” but now I’ve merged the changes into this forked repository of auto_complete.

Je reviens!

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

I'm sitting in the Air France lounge at Charles de Gaulle, quietly weeping into my coffee. In just a few minutes, I'll board a plane (KLM through Amsterdam; merci beaucoup, les pilotes qui font la grève) and be on my way back to the states.

I can't wait to share my Parisian adventures with all of you; sadly, pictures will be limited, as my camera chose Saturday as its day to stage its own petite grève, and only behaved intermittently thereafter.

Regardless - we'll have glimpses of Île Saint-Louis, the Marais, the Louvre, and, best of all: Camille!

They're calling my flight now...a bientôt!

Buy services and Build websites

about 1 year ago | Alex Rothenberg: Common Sense Software

Where I work there's recently been a lot of talk about how to make the decision whether to buy or build software. I've recently concluded that while you can buy a commoditized service you can not buy a website!

What I've seen is people thinking we could "buy" (or download open source) a site but then realize they want to change the branding, adapt the terminology to match our business. combine it with another product or add one extra piece of functionality that the existing site doesn't have. Whatever the APIs provided by the product you're left with custom software written on top of the product you bought. I've seen this with big commercial products like Documentum and open source products like Drupal. I now believe that there's no such thing as "a little" customization and you can only buy a site if you want 0 customization (applying a skin or inserting your logos are acceptable).

This does not mean everyone should develop custom software from scratch. There are tons of opportunities to buy commoditized services and write just a little custom code to glue them together. This allows you to focus on the aspects of your site that are business differentiators (the branding, the terminology, your workflows, your business rules, etc) without fighting the vendor's idea of those things. You don't have to write too much code as what we continually revise upward what we consider a commoditized service (i.e. it used to be document storage and is becoming document management with workflow and security).

The process of creating a blog aggregator as I described in my last post I built a Blog Aggregator showed me how true this is. I used Atom and RSS parsing and generating service which left me just to build a small site with the UI, security and glue holding it all together. Its just a small example but as I look around github I'm struck that the most interesting packages are plugins and gems for others to use and the less interesting ones are complete sites. This may be a no brainer for the Open Source community but is something that I am just realizing and I think that enterprises and commercial vendors still need to learn.

Buy services and Build websites

about 1 year ago | Alex Rothenberg: Common Sense Software

Where I work there's recently been a lot of talk about how to make the decision whether to buy or build software. I've recently concluded that while you can buy a commoditized service you can not buy a website!

What I've seen is people thinking we could "buy" (or download open source) a site but then realize they want to change the branding, adapt the terminology to match our business. combine it with another product or add one extra piece of functionality that the existing site doesn't have. Whatever the APIs provided by the product you're left with custom software written on top of the product you bought. I've seen this with big commercial products like Documentum and open source products like Drupal. I now believe that there's no such thing as "a little" customization and you can only buy a site if you want 0 customization (applying a skin or inserting your logos are acceptable).

This does not mean everyone should develop custom software from scratch. There are tons of opportunities to buy commoditized services and write just a little custom code to glue them together. This allows you to focus on the aspects of your site that are business differentiators (the branding, the terminology, your workflows, your business rules, etc) without fighting the vendor's idea of those things. You don't have to write too much code as what we continually revise upward what we consider a commoditized service (i.e. it used to be document storage and is becoming document management with workflow and security).

The process of creating a blog aggregator as I described in my last post I built a Blog Aggregator showed me how true this is. I used Atom and RSS parsing and generating service which left me just to build a small site with the UI, security and glue holding it all together. Its just a small example but as I look around github I'm struck that the most interesting packages are plugins and gems for others to use and the less interesting ones are complete sites. This may be a no brainer for the Open Source community but is something that I am just realizing and I think that enterprises and commercial vendors still need to learn.

Testing is a lesson in humility

about 1 year ago | Pat Shaughnessy: Pat Shaughnessy - Home

I was working on a web site a few weeks ago and found that the auto_complete plugin didn’t work well when text fields were repeated on a form. Later I modified auto_complete to handle the case where text fields are repeated. I then refactored the code into a separate add-on plugin, but before I posted the code on github I decided to add a few tests just for the sake of completeness. I was confident that the text_field_with_auto_complete function I wrote last week was correct – after all, it was working inside my web site. I suppose you could call this method “Development Driven Testing:” write some code first, and then add a few tests after the fact to make yourself feel more confident that you have done your job correctly! Needless to say, I later realized this was a bad idea.

I wrote some simple test code similar to what Rails uses to test the FormHelper module: vendor/rails/actionpack/test/template/form_helper_test.rb. The idea behind my test was simple. As I explained last week, my code in text_field_with_auto_complete worked by insuring each generated <input> tag's id attribute was unique, and by using a name attribute taken from the surrounding call to fields_for, or form_for, instead of the standard name value “object[method].” (It also passes different values for the URL and “param_name” parameter into the Ajax code, but let’s skip that for now.) In other words, my code simply called into the original auto_complete plugin with some modified parameters. So to test this, I would just call the original and modified versions of text_field_with_auto_complete and compare the HTML after a search/replace for the desired changes. Here’s the test:

def test_auto_complete_fields_for_html
  standard_auto_complete_html =
    text_field_with_auto_complete :person,
                                  :name,
                                  {},
                                  { :param_name => 'person[name]' }
  _erbout = ''
  auto_complete_fields_for('group[person_attributes][]', @person) do |f|
    _erbout.concat f.text_field_with_auto_complete(:person, :name)
  end
  assert_dom_equal standard_auto_complete_html,
    _erbout.gsub(/group\[person_attributes\]\[\]/, 'person')
           .gsub(/person_[0-9]+_name/, 'person_name')
end

“Standard_auto_complete_html” contains the HTML the original auto_complete plugin generates. Then I call auto_complete_fields_for and my version of text_field_with_auto_complete, simulating a real ERB template, and write the HTML into _erbout. Finally we test that after search/replace on the expected changes the modified HTML is the same as the standard HTML. After the usual syntax errors and typos I ran the test again and completely expected it to work…

Of course, it failed! I couldn’t even discover what the error was until I wrote the HTML out on the console and took a close look at what was generated. Here’s the <input> tag the original auto_complete plugin generates:

<input id="person_name"
       name="person[name]"
       size="30"
       type="text"
       value="Someone Important" />

And here’s what my code generated before the search and replace:

<input id="person_15961340_name"
       name="group[person_attributes][][name]"
       size="30"
       type="text" />

Here we can see the expected changes to the id and name attributes, but the “value” attribute is missing from my HTML! I had no idea this was happening even when I used my plugin in a web site. I had noticed earlier that some values were missing in my site’s text fields in the browser but I had assumed this was normal behavior from auto_complete and simply added the values explicitly in the ERB.

Lesson learned: not only do tests insure your code works, but the process of writing the tests forces you to think much more deeply and carefully about what your code is really doing. Of course, once you start writing tests first the same thing applies to your design: you think much more carefully about what you are trying to do, and how to design a solution.

I went on to quickly fix the text_field_with_auto_complete function by passing in the original object and method parameters, so that Rails would get the proper value for me, and explicitly setting the id attribute with a unique number as follows:

@template.text_field_with_auto_complete(
      object,
      method,
      { :name => "#{@object_name}[#{method}]",
        :id => "#{object}_#{Object.new.object_id}_#{method}"
etc…

This got my test to pass! Relieved, I went on to write another test. This second test insures that the id attributes generated by the plugin are all unique:

def test_two_auto_complete_fields_have_different_ids
  id_attribute_pattern = /id=\"[^\"]*\"/i
  _erbout = ''
  _erbout2 = ''
  auto_complete_fields_for('group[person_attributes][]', @person) do |f|
    _erbout.concat f.text_field_with_auto_complete(:person, :name)
    _erbout2.concat f.text_field_with_auto_complete(:person, :name)
  end
  assert_equal
    [],
    _erbout.scan(id_attribute_pattern) & _erbout2.scan(id_attribute_pattern)
end

I call the text_field_with_auto_complete function twice and check that all of the <input> tags have unique id=”” attributes by scanning for the attributes and checking that the two arrays of matches have an empty intersection set. Sounds simple, right? Surely it will pass…

Getting surprised and humiliated by one unit test was bad enough… but the second test surprised me yet again! What happened here was that all of the <div> tags, also generated by text_field_with_auto_complete, had the same id attributes! I had written the test above to look for <input id=””> attributes but fortunately the code also matched <div id=””>, like this:

<div class="auto_complete" id="person_name_auto_complete"></div>

Since these id's were not unique, my test failed:

<[]> expected but was
<["id=\"person_name_auto_complete\""]>.
2 tests, 2 assertions, 1 failures, 0 errors

I finally solved the problem and got both of my tests to pass using this code:

def text_field_with_auto_complete(object, method,
                                  tag_options = {}, completion_options = {})
    object_value =
      ActionView::Helpers::InstanceTag.value_before_type_cast(@object,
                                                              method.to_s)
    @template.text_field_with_auto_complete(
      "#{object}_#{Object.new.object_id}",
      method,
      { :name => "#{@object_name}[#{method}]",
        :value => object_value
      }.update(tag_options),
      { :param_name => "#{object}[#{method}]",
        :url => { :action => "auto_complete_for_#{object}_#{method}" }
      }.update(completion_options)
    )
  end

To completely understand why the value attribute was missing and how to get it back I took a look at how the FormHelper module in Rails worked. A long story short: I get the object’s value by carefully using the same code that the FormHelper module does by calling InstanceTag.value_before_type_cast, and then pass the value in as a parameter to text_field_with_auto_complete. I was sure to obtain the proper object’s value by using “@object” from the FormBuilder base class. And now the <div id="">'s are unique since we pass in the modified object name into the original text_field_with_auto_complete.

Testing is a lesson in humility

about 1 year ago | Pat Shaughnessy: Pat Shaughnessy - Home

I was working on a web site a few weeks ago and found that the auto_complete plugin didn’t work well when text fields were repeated on a form. Later I modified auto_complete to handle the case where text fields are repeated. I then refactored the code into a separate add-on plugin, but before I posted the code on github I decided to add a few tests just for the sake of completeness. I was confident that the text_field_with_auto_complete function I wrote last week was correct – after all, it was working inside my web site. I suppose you could call this method “Development Driven Testing:” write some code first, and then add a few tests after the fact to make yourself feel more confident that you have done your job correctly! Needless to say, I later realized this was a bad idea.

I wrote some simple test code similar to what Rails uses to test the FormHelper module: vendor/rails/actionpack/test/template/form_helper_test.rb. The idea behind my test was simple. As I explained last week, my code in text_field_with_auto_complete worked by insuring each generated <input> tag's id attribute was unique, and by using a name attribute taken from the surrounding call to fields_for, or form_for, instead of the standard name value “object[method].” (It also passes different values for the URL and “param_name” parameter into the Ajax code, but let’s skip that for now.) In other words, my code simply called into the original auto_complete plugin with some modified parameters. So to test this, I would just call the original and modified versions of text_field_with_auto_complete and compare the HTML after a search/replace for the desired changes. Here’s the test:

def test_auto_complete_fields_for_html
  standard_auto_complete_html =
    text_field_with_auto_complete :person,
                                  :name,
                                  {},
                                  { :param_name => 'person[name]' }
  _erbout = ''
  auto_complete_fields_for('group[person_attributes][]', @person) do |f|
    _erbout.concat f.text_field_with_auto_complete(:person, :name)
  end
  assert_dom_equal standard_auto_complete_html,
    _erbout.gsub(/group\[person_attributes\]\[\]/, 'person')
           .gsub(/person_[0-9]+_name/, 'person_name')
end

“Standard_auto_complete_html” contains the HTML the original auto_complete plugin generates. Then I call auto_complete_fields_for and my version of text_field_with_auto_complete, simulating a real ERB template, and write the HTML into _erbout. Finally we test that after search/replace on the expected changes the modified HTML is the same as the standard HTML. After the usual syntax errors and typos I ran the test again and completely expected it to work…

Of course, it failed! I couldn’t even discover what the error was until I wrote the HTML out on the console and took a close look at what was generated. Here’s the <input> tag the original auto_complete plugin generates:

<input id="person_name"
       name="person[name]"
       size="30"
       type="text"
       value="Someone Important" />

And here’s what my code generated before the search and replace:

<input id="person_15961340_name"
       name="group[person_attributes][][name]"
       size="30"
       type="text" />

Here we can see the expected changes to the id and name attributes, but the “value” attribute is missing from my HTML! I had no idea this was happening even when I used my plugin in a web site. I had noticed earlier that some values were missing in my site’s text fields in the browser but I had assumed this was normal behavior from auto_complete and simply added the values explicitly in the ERB.

Lesson learned: not only do tests insure your code works, but the process of writing the tests forces you to think much more deeply and carefully about what your code is really doing. Of course, once you start writing tests first the same thing applies to your design: you think much more carefully about what you are trying to do, and how to design a solution.

I went on to quickly fix the text_field_with_auto_complete function by passing in the original object and method parameters, so that Rails would get the proper value for me, and explicitly setting the id attribute with a unique number as follows:

@template.text_field_with_auto_complete(
      object,
      method,
      { :name => "#{@object_name}[#{method}]",
        :id => "#{object}_#{Object.new.object_id}_#{method}"
etc…

This got my test to pass! Relieved, I went on to write another test. This second test insures that the id attributes generated by the plugin are all unique:

def test_two_auto_complete_fields_have_different_ids
  id_attribute_pattern = /id=\"[^\"]*\"/i
  _erbout = ''
  _erbout2 = ''
  auto_complete_fields_for('group[person_attributes][]', @person) do |f|
    _erbout.concat f.text_field_with_auto_complete(:person, :name)
    _erbout2.concat f.text_field_with_auto_complete(:person, :name)
  end
  assert_equal
    [],
    _erbout.scan(id_attribute_pattern) & _erbout2.scan(id_attribute_pattern)
end

I call the text_field_with_auto_complete function twice and check that all of the <input> tags have unique id=”” attributes by scanning for the attributes and checking that the two arrays of matches have an empty intersection set. Sounds simple, right? Surely it will pass…

Getting surprised and humiliated by one unit test was bad enough… but the second test surprised me yet again! What happened here was that all of the <div> tags, also generated by text_field_with_auto_complete, had the same id attributes! I had written the test above to look for <input id=””> attributes but fortunately the code also matched <div id=””>, like this:

<div class="auto_complete" id="person_name_auto_complete"></div>

Since these id's were not unique, my test failed:

<[]> expected but was
<["id=\"person_name_auto_complete\""]>.
2 tests, 2 assertions, 1 failures, 0 errors

I finally solved the problem and got both of my tests to pass using this code:

def text_field_with_auto_complete(object, method,
                                  tag_options = {}, completion_options = {})
    object_value =
      ActionView::Helpers::InstanceTag.value_before_type_cast(@object,
                                                              method.to_s)
    @template.text_field_with_auto_complete(
      "#{object}_#{Object.new.object_id}",
      method,
      { :name => "#{@object_name}[#{method}]",
        :value => object_value
      }.update(tag_options),
      { :param_name => "#{object}[#{method}]",
        :url => { :action => "auto_complete_for_#{object}_#{method}" }
      }.update(completion_options)
    )
  end

To completely understand why the value attribute was missing and how to get it back I took a look at how the FormHelper module in Rails worked. A long story short: I get the object’s value by carefully using the same code that the FormHelper module does by calling InstanceTag.value_before_type_cast, and then pass the value in as a parameter to text_field_with_auto_complete. I was sure to obtain the proper object’s value by using “@object” from the FormBuilder base class. And now the <div id="">'s are unique since we pass in the modified object name into the original text_field_with_auto_complete.

Enterprise Software - Getting Archaic?

about 1 year ago | Lalatendu Das: Interpretations of Technorealism

With advent of Web 2.0, we are seeing an evolution in Information technology. As the web turning out to be a platform, Applications are being more agile, thin & continuously evolving. The usage patter of IT is slowly but steadily shifting from being Enterprise driven to be more consumer driven. The days of huge custom built enterprise software, with a whole lot of speculative design seems to be passée.

Now some facts to corroborate my hypothesis..

The Global IP traffic data (In a recently published report by Cisco), makes an interesting revelation – the Consumer IP traffic has been growing at 58% CAGR since 2005 and expected to surpass Enterprise IP traffic by end of 2008. Also it’s predicted that Consumer IP traffic will reach 1.5 times the Enterprise IP traffic by year 2011.

As Douglas Merrill (Former CIO Google) put’s it “Fifteen years ago, enterprise technology was of higher quality and consumer technology. That’s not true anymore. It used to be that you need enterprise technology because you wanted uptime, security and speed. None of these are as good in Enterprise software any more as they are in some consumer software”

In the age of globalization, more and more employees are on move. Enterprise IT for people constantly on move is a costly affair and not always easy to use. Further the cost of maintaining huge data centres and with a large number of in house IT staff is adversely impacting the bottom-line of large enterprises. More and more large enterprises are realizing that apart from a few key business processes, rest all IT requirements doesn’t need large enterprise applications, rather they can be delivered to users over the internet as Consumer IT by Software as Service (SaaS) offerings / smart applications on mobile devices procured by other organizations.

Let’s looks at some of the technology trends, which can eventually replace majority of Enterprise IT spending

- Data centers moving to SaaS model with use of Cloud computing
- Improved storage/ computing capabilities of mobile handset
- Web as a platform - Market leader Google - Spreadsheets, word processors etc
- Cloud Computing - examples
o Amazon.Com – Simple Storage Service (S3) – Provides a simple web service interface which can be used to store/ retrieve any amount of data, at any time, from anywhere.
o Amazon.com – Elastic Compute Cloud (EC2) - Provides resizable computing capacity in the cloud, with users paying only for capacity they actually use

Hence it's time for Enterprise architects to revisit the technology stack and to see how we all can go lean..any thoughts?

Rails Plugin for Mimicking SSL requests and responses

about 1 year ago | Ryan Kinderman: kinderman.net :

The Short

I've written a plugin for Ruby on Rails that allows you to test SSL-dependent application behavior that is driven by the ssl_requirement plugin without the need to install and configure a web server with SSL.

Learn more

The Long

A while back, I wanted the Selenium tests for a Ruby on Rails app I was working on to cover the SSL requirements and allowances of certain controller actions in the system, as defined using functionality provided by the ssl_requirement plugin. I also wanted this SSL-dependent behavior to occur when I was running the application on my local development machines. I had two options:

  1. Get a web server configured with SSL running on my development machines, as well as on the build server.

  2. Patch the logic used by the system to determine if a request is under SSL or not, as well as the logic for constructing a URL under SSL, so that the system can essentially mimic an SSL request without a server configured for SSL.

Since I had multiple Selenium builds on the build server, setting up an SSL server involved adding a host name to the loopback for each build, so that Apache could switch between virtual hosts for the different server ports. I also occasionally ran web servers on my development machines on ports other than the default 3000, as did everyone else on the team, so that we'd all have to go through the setup process for multiple servers on those machines as well. We would need to do all of this work in order to test application logic that, strictly speaking, didn't even require the use of an actual SSL server. Given that the only thing that I was interested in testing was that the requests to certain actions either redirected or didn't, depending on their SSL requirements, all I really needed was to make the application mimic an SSL request.

To mimic an SSL request in conjunction with using the ssl_requirement plugin without an SSL server consisted of patching four things:

  1. ActionController::UrlRewriter#rewrite_url - Provides logic for constructing a URL from options and route parameters

    If provided, the :protocol option normally serves as the part before the :// in the constructed URL.

    The method was patched so that the constructed URL always starts with "http://". If :protocol is equal to "https", this causes an "ssl" key to be added to the query string of the constructed URL, with a value of "1".

  2. ActionController::AbstractRequest#protocol - Provides the protocol used for the request.

    The normal value is one of "http" or "https", depending on whether the request was made under SSL or not.

    The method was patched so that it always returns "http".

  3. ActionController::AbstractRequest#ssl? - Indicates whether or not the request was made under SSL.

    The normal value is determined by checking if request header HTTPS is equal to "on" or HTTP\_X\_FORWARDED_PROTO is equal to "https".

    The method was patched so that it checks for a query parameter of "ssl" equal to "1".

  4. SslRequirement#ensure\_proper\_protocol - Used as the before\_filter on a controller that includes the ssl_requirement plugin module, which causes the redirection to an SSL or non-SSL URL to occur, depending on the requirements defined by the controller.

    This method was patched so that, instead of replacing the protocol used on the URL with "http" or "https", it either adds or removes the "ssl" query parameter.

For more information, installation instructions, and so on, please refer to the plugin directly at:

http://github.com/ryankinderman/mimic_ssl

Ignite Bangalore

about 1 year ago | Suman Thareja: suman thareja

I had a wonderful experience organizing and hosting India's first Ignite in Bangalore. Judging by responses on the facebook event wall others enjoyed it too.

Wanted to give a huge thanks to the fantastic speakers.



For pictures of the evening check out flickr; videos coming soon..:)

I hear rumors about Bangalore Ignite II coming soon. I'll post here if when I have more info.

God's own country

about 1 year ago | Suman Thareja: suman thareja

Had a chance to spend 4 days in Kerela..was impressed by the state's 100% literacy rate...and a school on every corner.

Took lots of pictures, here's one of my favorites...

Usage scenarios for vendor products

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Often a vendor software package we buy doesn't exactly meet our needs, so we want to alter it's behavior. This can be done in following ways with these advantages/disadvantages and preference...



OUT-OF-BOX FEATURES (functionality provided in vendor's base product as-is or with configuration changes)

Effort required: None

Vendor support:
Yes

Maintenance costs:
None

Preference:
High

Comments
- Simple product upgrades
- Applications bolted onto the vendor product pose lower migration costs than customizations to the vendor product itself

BUILD CUSTOM FUNCTIONALITY USING VENDOR PRODUCT API (extend product functionality using vendor published and supported API)

Effort required: Low - Medium

Vendor support:
Yes (API)

Maintenance costs:
Medium

Preference:
Medium

Comments

- Simple product upgrades (upgrades don't impact enhancements as vendor APIs don't change, hence custom code written using vendor API works with product upgrade. So no need to change our code as functionality won't break)
- Customizations outside of the system source code pose limited migration costs because minimal development is required with every upgrade

CUSTOMIZE VENDOR PRODUCT (outside API) i.e. change in vendor's base product

Effort required: High

Vendor support:
No

Maintenance costs:
High

Preference: None, as vendor product customizations lead to -
(1) against our core design principles
(2) long-term issues with support and maintenance
(3) incompatibility with vendor upgrades
(4) potential delays in releasing the product due to unforeseen issues with custom code and standard code integration

Comments
- Risky/time consuming product upgrades because customizations can break
- Requires significant analysis and testing and potentially recoding to upgrade
- Support issues due to non-standard nature of the product
- Customizations don't work properly with upgrades -Once product code is changed (even slightly) the product no longer can be upgraded without losing those customizations. So we might face a no-win choice: If we want to upgrade, we have to forgo all the customizations that made the product fit our specific needs. Thus customizations leave our systems badly compromised

Why vendor product customizations are bad and how to avoid them?

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Often our sponsors ask us to bite the bullet and customize a vendor product to meet their specific requirement(s) rather than changing their business process around the vendor product.

Here's a template we've used for our discussions with sponsors if they insist on product customizations...

Does the business benefit of *** doing blah *** offset the cost and impact of customizing *** this vendor product ***?

E.g. Does the business benefit of pushing staffing data in Time System offset the cost and impact of customizing the vendor time management product?

Why vendor product customizations are bad?

UPFRONT AND MAINTENANCE COSTS
  • upfront costs/effort/time
    • development (customization)
    • testing
    • deployment
  • maintenance costs/effort/time with product upgrade (typically every 12 - 18 months)
    • analysis (impact of upgrade on customizations)
    • development (redeploy customization)
    • testing
    • deployment

OPPORTUNITY COST

  • Cannot use new features or new product releases as upgrading to new product version becomes harder (i.e., more time consuming, more risky) with customizations

SUPPORT ISSUES

  • If vendor agrees to support customizations, the vendor would need to ensure:
    • redundancy in resources knowledgeable of the customizations
    • the customizations are thoroughly documented
    • knowledge transfer of customizations as vendor resources knowledgeable of the customizations can move out of your IT account at the vendor
  • The above items pose a support risk because our IT department cannot be certain that these things happen effectively, thus putting service levels at risk
  • If vendor does not agree to support customizations then our IT department needs to bear the cost and risk of documenting and supporting customizations on an ongoing basis

RESOURCING

  • In cases where we own the customization, we may not be able to access the engineers who customized the product leading to resource constraints. This is often because we don't have enough work to keep that engineer busy/allocated full-time. This often results in a big lead time to source the proper expertise

TIMING


Buy or Build

about 1 year ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

For a particular IT requirement how do you decide when to buy and when to build?

Here are some considerations... How do you think about it?

  • If your objectives are strategic, it often makes sense to build to your needs, so that you can further enhance the product to meet your changing needs.

  • If your objectives fall into a commodotized IT domain, then it makes sense to buy a product if it meets your current and anticipated needs (you really don't want to customize a vendor product. This is where open source products become attractive...). In such cases, requirements are fairly well understood and even if you've found a product that meets your requirements, following need to be true before you decide to procure it:

    - good integration capabilities/API for data access, messaging etc.
    - ?

Getting hands dirty on TDD

about 1 year ago | Rohan Daxini: Rohan Daxini

In my experience on Test Driven Development (TDD), while developing a small application from scratch in .NET, it requires PnP - "Patience and Practice" to adapt to this "Test-First" way of coding. I would rather term it as "code to test the code" methodology which doesn't require so much of mental change or paradigms shift but rather patience to try out new and better way to write quality, easy to read, finer code.

Along this journey of TDD, which I have recently started and still on my way, have learnt
simplicity. TDD, if followed religiously, by itself brings out simplicity in your design and code.

The key advantage that i felt TDD gives you is feedback. You write a failing test case, make it pass, and then you formulate the next test case. The wonderful thing is that when you get to that next test case, you have the feedback from getting the first one to pass to draw upon. Often that feedback will lead you to formulate the next test case in a different way. It could even lead you to produce a different interface for the class you were writing.

I still have to try and get my hands dirty on enhancement application/project to learn and share more on experience using TDD in such scenarios.

.......(One of the comment posted on Weblogs Forum by Richard Jonas)
If you don't understand the requirements of the project at all, you need to have a way to get these under control first. Writing tests in advance is a good way to think about the requirements of the problem and establish the questions you need to ask others.
If you really understand a problem well and are sure exactly how you are going to do it (if it's well specified and something you've done lots of times before), a process with a lot of control such as TDD makes the development more reliable.

“Gully Cricket” Strategy

about 1 year ago | Rajesh Rathod: Uncommon "Common Sense"!

I have played Gully cricket a lot. It's a ball game played on street with whatever equipment you get and using any rules that you feel like.

Here is an observation of a gully cricket game and field setting strategy of a team (use the diagram if you are unfamiliar with the game):

  • When a batsman hits the ball over the top of bowler’s head, the captain immediately ensures that long on and long off fielders are in place to catch it next time
  • The next ball flies 2 meters right to the wicket-keeper and the captain immediately sets two fielders in sleep cordon
  • The batsman now pushes for a single run in "mid-off" area and the captain decides to bring "long off" fielder closer to stop the runs on next ball
  • Guess what, the next ball is hit over the head of "mid-off" fielder!
  • The fielders oblige to the captain, because the captain owns the bat and ball. Once he leaves, there is no cricket for that day:-)



[source: http://www.abcofcricket.com]

Well, there is a lot of common sense learning in this example that may sound very stupid, but not very unreal.

Do we observe somewhat similar behaviors at work?
  • Knee jerk reactions and stop-gap solutions to day-to-day problems
  • Temptation to solve all the problems and solve them NOW
  • Kick-off a new initiative without thinking through the aspects of sustainability, measurement and accountability
  • Not questioning the boss, because he/she is THE BOSS (he/she does my evaluation and decides my career progression)
  • Fighting battles hard and loosing wars

A common sense solution would be to answer following questions for any new initiatives / solutions that we implement:

  1. Is the problem really "the problem"? (Don’t take problem on face value. Identify root cause. Try to spot a pattern / trend)
  2. Do the stakeholders (project team, sponsors, customer service,...) affected by the problem acknowledge the problem and seek a solution? (Or we are giving them solution just because we have the solution, time and money. What are the pain-points that we are trying to address?)
  3. Do we need to solve it now? (How does it align to our vision? Would it create more distraction for the team than benefit them? Is there a pressing need to solve it now? Don’t you think constrains bring more creativity?)
  4. How do we sustain the solution? (If solution is to do monthly assessment of project, how do you put it in the workflow of project life-cycle to ensure that it gets done every month in right spirit? Who will own it?)
  5. How do we communicate the solution and its benefit?
  6. How would we measure success of the solution?
  7. How would we collect feedback and make improvements in the solution?

Does it make sense? How do you solve such problems?

Improving application support

about 1 year ago | Mark Mintz: Mark Mintz

We have a standard 3 level support model with the first and second level being part of a general support organization and third level being a part of a separate development organization. In this model support requests come in and are assigned by a Day Manager to the appropriate group for that application. From there requests get escalated through the levels if the lower level cannot address the issue or satisfy the request. We have had this model for quite some time and now we are facing some issues that are impacting the quality of service we are providing to our end users. The two biggest issues that we are encountering are:

  1. lack of ownership for end-to-end support: as requests bounce around from level to level and organization to organization there is not clear ownership for getting issues resolved. Finding out when issues will be addressed requires emails back and forth between teams which means delays and finger pointing which ultimately results in unhappy users.
  2. lack of commitment to knowledge building and continuous improvement: our focus has been mainly on fighting fires and there has not been enough focus on building the knowledge of team members and improving processes over time to be able to perform more effectively and efficiently.

Here is what we are doing to address these issues:

  1. lack of ownership for end-to-end support: we are going to be testing a new "touch and hold" support model. In this new model we plan to flatten out the three levels into individual groups: one for operational requests, one for issue resolution and one for requests for data and adhoc reports. Instead of requests escalating from one level to the next until it gets to somebody who can resolve it our goal is to get the request to the right person or group of people upon receipt with no need to escalate. By doing this the person that gets the request should be the right person to address the issue and therefore there is no need for escalation. If that person requires assistance there will be technical and functional advisers available to assist but the initial recipient of the request still owns the request and is responsible for coordinating a timely resolution with the advisers assistance. In this model support engineers that receive support requests are empowered to reach out to users for clarification and negotiate services and resolution times, especially for complex requests and issues
  2. lack of knowledge building and continuous improvement: each group in the new model should have a set of key metrics that indicate performance. I expect the groups might have some of the same metrics and some unique metrics individual to the group. For instance the operational group might have a metric based on average time to closure while the issue group might have a metric based on percentage of issues resolved or operationalized. The goal would be to use the metrics to ensure that each group is focusing on the right level of improvement and knowledge building. Additionally, we plan to build capacity into these groups for these tasks. Improvement and knowledge building take time so we need to accommodate for that time.

Focusing on these areas should result in more timely and accurate resolution of support requests resulting in more satisfied users and reduced support costs. I'm sure it will be an interesting experience as we progress through these changes.....I'll continue to blog about individual aspects as we move ahead. In the meantime if anybody has any experience with implementing a similar model please leave a comment and let us know how it went.

My First Android application

about 1 year ago | Amar Phadke: Amar Phadke's weblog

I started developing my first Android application last week. It is a Stock quote app that fetches real time stock quotes from www.webservicex.net . In it’s current form, it simply shows the quote information given a NYSE stock symbol. It’s hosted as an open source project on SourceForge at http://sourceforge.net/projects/androidstockquo/ I am planning to add new [...]

Would you map the current roles (PM, BA) to Scrum roles?

about 1 year ago | Biju Bhaskar: Thoughts on enterprise application development...

As I may have mentioned earlier, we are in the process of rolling out Scrum firm wide. Almost two years into the journey now. One question that we continue to struggle with answering as an organization is... whether we should map our current PM and BA roles to Scrum Master(SM) and Product Owner (PO) role respectively? For me, the answer is a big "NO".

Every project would need a Product Owner and a Scrum Master. Ideally for staffing someone, we should look at who is the right fit to play that role based on the skills required for that role, complexity/risks in the project, required functional/technical expertise, learning/development opportunity for the individual, etc. It does not matter if you are a BA or PM and for that matter even an Architect or Developer. But, why?

Let us take the case of a BA. She may be a great BA, but those skills do not mean that she can be a good PO. PO is much more than business analysis, it is more of understanding what users want, writing user stories, backlog management, prioritization, facilitation, getting continuous user feedback etc. Similarly SM is a big shift for lot of traditional PMs. SM is more of coach, servant leader and an impediment remover. There is no room for command and control anymore. So if we want our folks to be successful, we should staff them based on the skills that are required for playing the role, or based on the skills we want them to develop.

My guess is that only a very small percentage of BAs and PMs would be able to play the new roles successfully from day one. Most of them will be able to develop the required skills slowly and become successful. But there will be some who cannot, and don’t want to make the shift to the new roles and they will leave the firm as we have seen in my organization (very very small percentage though).

How have you approached this issue in your firm?

Would you map the current roles (PM, BA) to Scrum roles?

about 1 year ago | Biju Bhaskar: Thoughts on enterprise application development...

As I may have mentioned earlier, we are in the process of rolling out Scrum firm wide. Almost two years into the journey now. One question that we continue to struggle with answering as an organization is... whether we should map our current PM and BA roles to Scrum Master(SM) and Product Owner (PO) role respectively? For me, the answer is a big "NO".

Every project would need a Product Owner and a Scrum Master. Ideally for staffing someone, we should look at who is the right fit to play that role based on the skills required for that role, complexity/risks in the project, required functional/technical expertise, learning/development opportunity for the individual, etc. It does not matter if you are a BA or PM and for that matter even an Architect or Developer. But, why?

Let us take the case of a BA. She may be a great BA, but those skills do not mean that she can be a good PO. PO is much more than business analysis, it is more of understanding what users want, writing user stories, backlog management, prioritization, facilitation, getting continuous user feedback etc. Similarly SM is a big shift for lot of traditional PMs. SM is more of coach, servant leader and an impediment remover. There is no room for command and control anymore. So if we want our folks to be successful, we should staff them based on the skills that are required for playing the role, or based on the skills we want them to develop.

My guess is that only a very small percentage of BAs and PMs would be able to play the new roles successfully from day one. Most of them will be able to develop the required skills slowly and become successful. But there will be some who cannot, and don’t want to make the shift to the new roles and they will leave the firm as we have seen in my organization (very very small percentage though).

How have you approached this issue in your firm?

Obama proves the power of OpenSource

about 1 year ago | Biju Bhaskar: Thoughts on enterprise application development...

I was in a call with Michael Tiemann, VP for OpenSource Affairs at Red Hat as part of the OpenSource related project I am working on. He mentioned that he recently blogged about how Obama proved the power of OpenSource. Check this out..it is interesting.

Obama proves the power of OpenSource

about 1 year ago | Biju Bhaskar: Thoughts on enterprise application development...

I was in a call with Michael Tiemann, VP for OpenSource Affairs at Red Hat as part of the OpenSource related project I am working on. He mentioned that he recently blogged about how Obama proved the power of OpenSource. Check this out..it is interesting.

I built a blog aggregator - waywework.it

about 1 year ago | Alex Rothenberg: Common Sense Software

I've been spending some time recently putting together a blog aggregator site for some of the folks I work with. Its now up and running at http://waywework.it. I hope this will be an interesting place to share our public community and as one of my colleagues said "this keeps my Google Reader much neater".

Today I'd like to talk about the code running this site which is posted and available on github at http://github.com/alexrothenberg/waywework.

I started thinking I would use an existing aggregator site and just apply my skin but when I did a quick search on github I most of the hard work existed in atom and rss gems and plugins and I wanted to take advantage of the just released Rails 2.2 so I decided to build my own. This turned out to be not too much work. Today I'd like to talk about how I put this together.

First I created my project with some scaffolding for feeds which would have_many posts


class Feed < ActiveRecord::Base
has_many :posts, :dependent => :delete_all
end

class Post < ActiveRecord::Base
belongs_to :feed
end


I soon found the atom gem and rss parser built into ruby. Using them was a piece of cake as all I had to do was create a method to call each one in my Feed model

class Feed < ActiveRecord::Base
def get_posts_from_atom atom_xml
feed = Atom::Feed.new(atom_xml)
feed.entries.each { |entry|
link = entry.links.detect {|l| l.rel == 'alternate'}
create_post(:contents=>entry.content.value, :url=>link.href, :title=>entry.title, :published=>entry.published.to_s(:db), :updated=>entry.updated.to_s(:db))
}
return !feed.entries.blank?
end

def get_posts_from_rss rss_xml
rss = RSS::Parser.parse(rss_xml, false)
rss.items.each { |entry|
create_post(:contents=>entry.description, :url=>entry.link, :title=>entry.title, :published=>entry.date.to_formatted_s(:db), :updated=>entry.date.to_formatted_s(:db))
}
return !rss.items.blank?
end
end


Of course I had to create the glue wrapping it all together. A rake task to be call on a schedule

namespace :feeds do
desc "Load the feeds"
task :populate => :environment do
feeds = Feed.all
feeds.each do |feed|
feed.get_latest
end
end
end


and the logic to load the feed, parse it and update the posts.

class Feed < ActiveRecord::Base
def get_latest
puts "getting feed for #{name}"
xml = get_feed
got_atom_posts = get_posts_from_atom xml
get_posts_from_rss xml unless got_atom_posts
end

def get_feed
uri = URI.parse(feed_url)
uri.read
end

def create_post params
params.merge!(:feed_id=>id)
existing_post = Post.find_by_url(params[:url])
if existing_post
existing_post.update_attributes(params)
else
Post.create(params)
end
end
end


The next step was to publish an atom feed of my site. Again there was a plugin atom_feed_helperwaiting to help me. I installed the plugin and created a view builder

atom_feed(:url => atom_feed_url) do |feed|
feed.title("WayWeWork")
feed.updated(@posts.first.published)

for post in @posts
feed.entry(post, :url=>post.url, :published=>post.published, :updated=>post.updated) do |entry|
entry.title("#{post.feed.author}: #{post.title}")
entry.content(post.contents, :type => 'html')
end
end
end

This was all so easy I had hardly done anything other than glue these plugins together. Now I finished up with a few bells and whistles.

I added a who's talking and archive by date section to my homepage that I called from my controller like this

class PostsController < ApplicationController
@active_feeds = Feed.by_author
@activity_by_date = Post.activity_by_date
end


I added security to restrict who can administer feeds

class FeedsController < ApplicationController
before_filter :authenticate

protected
def authenticate
authenticate_or_request_with_http_basic do | user_name, password|
username = YAML::load_file(File.join(RAILS_ROOT, %w[config password.yml]))['username']
pwd = YAML::load_file(File.join(RAILS_ROOT, %w[config password.yml]))['password']
user_name == username && password == pwd
end
end
end


For the UI I am somewhat graphically challenged so got some help. For this github was very cool as I could add lessallan as a collaborator and he could check in his changes so they just appeared!

Finally a little work with capistrano (mostly just creating a Capfile) and I could deploy!

Overall I spent a few days and now have a site that does exactly what I want. Where most of the code I wrote is specific to my site and the general purpose plumbing was downloaded. I'm very pleased with the availability of plugins and gems and how easy it was to collaborate using github!

Now I just hope others find the site interesting to use!

I built a blog aggregator - waywework.it

about 1 year ago | Alex Rothenberg: Common Sense Software

I've been spending some time recently putting together a blog aggregator site for some of the folks I work with. Its now up and running at http://waywework.it. I hope this will be an interesting place to share our public community and as one of my colleagues said "this keeps my Google Reader much neater".

Today I'd like to talk about the code running this site which is posted and available on github at http://github.com/alexrothenberg/waywework.

I started thinking I would use an existing aggregator site and just apply my skin but when I did a quick search on github I most of the hard work existed in atom and rss gems and plugins and I wanted to take advantage of the just released Rails 2.2 so I decided to build my own. This turned out to be not too much work. Today I'd like to talk about how I put this together.

First I created my project with some scaffolding for feeds which would have_many posts


class Feed < ActiveRecord::Base
has_many :posts, :dependent => :delete_all
end

class Post < ActiveRecord::Base
belongs_to :feed
end


I soon found the atom gem and rss parser built into ruby. Using them was a piece of cake as all I had to do was create a method to call each one in my Feed model

class Feed < ActiveRecord::Base
def get_posts_from_atom atom_xml
feed = Atom::Feed.new(atom_xml)
feed.entries.each { |entry|
link = entry.links.detect {|l| l.rel == 'alternate'}
create_post(:contents=>entry.content.value, :url=>link.href, :title=>entry.title, :published=>entry.published.to_s(:db), :updated=>entry.updated.to_s(:db))
}
return !feed.entries.blank?
end

def get_posts_from_rss rss_xml
rss = RSS::Parser.parse(rss_xml, false)
rss.items.each { |entry|
create_post(:contents=>entry.description, :url=>entry.link, :title=>entry.title, :published=>entry.date.to_formatted_s(:db), :updated=>entry.date.to_formatted_s(:db))
}
return !rss.items.blank?
end
end


Of course I had to create the glue wrapping it all together. A rake task to be call on a schedule

namespace :feeds do
desc "Load the feeds"
task :populate => :environment do
feeds = Feed.all
feeds.each do |feed|
feed.get_latest
end
end
end


and the logic to load the feed, parse it and update the posts.

class Feed < ActiveRecord::Base
def get_latest
puts "getting feed for #{name}"
xml = get_feed
got_atom_posts = get_posts_from_atom xml
get_posts_from_rss xml unless got_atom_posts
end

def get_feed
uri = URI.parse(feed_url)
uri.read
end

def create_post params
params.merge!(:feed_id=>id)
existing_post = Post.find_by_url(params[:url])
if existing_post
existing_post.update_attributes(params)
else
Post.create(params)
end
end
end


The next step was to publish an atom feed of my site. Again there was a plugin atom_feed_helperwaiting to help me. I installed the plugin and created a view builder

atom_feed(:url => atom_feed_url) do |feed|
feed.title("WayWeWork")
feed.updated(@posts.first.published)

for post in @posts
feed.entry(post, :url=>post.url, :published=>post.published, :updated=>post.updated) do |entry|
entry.title("#{post.feed.author}: #{post.title}")
entry.content(post.contents, :type => 'html')
end
end
end

This was all so easy I had hardly done anything other than glue these plugins together. Now I finished up with a few bells and whistles.

I added a who's talking and archive by date section to my homepage that I called from my controller like this

class PostsController < ApplicationController
@active_feeds = Feed.by_author
@activity_by_date = Post.activity_by_date
end


I added security to restrict who can administer feeds

class FeedsController < ApplicationController
before_filter :authenticate

protected
def authenticate
authenticate_or_request_with_http_basic do | user_name, password|
username = YAML::load_file(File.join(RAILS_ROOT, %w[config password.yml]))['username']
pwd = YAML::load_file(File.join(RAILS_ROOT, %w[config password.yml]))['password']
user_name == username && password == pwd
end
end
end


For the UI I am somewhat graphically challenged so got some help. For this github was very cool as I could add lessallan as a collaborator and he could check in his changes so they just appeared!

Finally a little work with capistrano (mostly just creating a Capfile) and I could deploy!

Overall I spent a few days and now have a site that does exactly what I want. Where most of the code I wrote is specific to my site and the general purpose plumbing was downloaded. I'm very pleased with the availability of plugins and gems and how easy it was to collaborate using github!

Now I just hope others find the site interesting to use!

I almost forgot to ask.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

So, in addition to my vacation in Paris, I'm going on a business trip to Mumbai and Bangalore next week. It's my second trip to India (the pictures above are from my trip last March), but on my last one I was working about 20 hours a day, and didn't really get to explore a whole bunch.

Dear readers, I'm at your mercy. Any recommendations for some good dinner and/or drinking hotspots in Mumbai? Pleeeeeease?

We did it.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

I don't often go political on you - after all, this is a foodblog. But I just have to say: thank you, America, for having the courtesy to make next week's trip to Paris that much less awkward. My faith is restored (for now), and my spirits are high.

Oh, and thanks to Jason for the cocktails and Jeremy and Miriam for the champagne. And to the rest of you for the awesome, AWESOME voting. Well-played, America. Well-played.

J'arrive!

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

That's right, ladies and gents...in just eleven short days (made even shorter by the election and a business trip to India), I'll be back where I belong: France (and, more precisely, Paris). I am stopping over for just two days, staying in a cute little hotel in the Marais, and planning to have a wonderful, relaxing, romantically solitary time of it.

Dehillerin is already on the list, as is a stop into Pierre Hermé for some macarons (I'll be flying business class back to the States, so I figure they actually have a chance of surviving the flight intact.). I'll be dining at my favorite Paris bistro, Camille, both nights. But, other than that, my schedule is pretty open.

Since I'll only be in town for a couple of days, I want to stay in town (so day trips to Versailles or Giverny are out, as are the flea markets, since those require at least a half-day to do them justice).

I'm pondering a walking tour of the Marais, am thinking longingly of an afternoon drinking coffee and wine and reading a novel in a café somewhere in St. Germain, and a colleague has recommended the hot chocolate at Angelina's (just down the Rue de Rivoli from Pierre Hermé's new Rue Cambon boutique, so very convenient). I've never been to the Bar Hemingway, but am also drawn to this little wine bar near the hotel.

Any other suggestions?

Merci bien!

Photos above from the Paris visit during my 2006 trip to Prague, Strasbourg, Champagne and Paris. You can read all about the trip here (Prague only) and here (all of the France leg).

Autumnal goodies abound.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

My mom was in town this weekend, which seemed like a good excuse to cook dinner for her, my brother, and my sister-in-law. It also seemed like a good excuse to ring in the fall with some dishes I've been wanting to try out. I settled on a menu of arugula salad, roast chicken, brussels sprouts with bacon and cider, roast potatoes, and an apple galette for dessert. To keep things interesting, I decided to serve the galette (really just a free-form apple tart) with cheese-spiked whipped cream.

I set off for the Greenmarket around 9:30 on Saturday morning. Now that the weather has turned a bit more brisk, the crowds are thinner, so it's actually feasible to make a full circuit of the market, check out everything on offer, and then start your shopping. The summertime crowds make me way too antsy for that kind of lingering.

On my walk around, I spied several in-season goodies, including gourds and other fall squashes, cauliflower in a rainbow of colors, brussels sprouts on the stalk, and dried flowers and herbs. I also saw huge bunches of eucalyptus, which stuck me as odd. My high school gave out sprigs of eucalyptus at our baccalaureate service (mine is still pressed between the pages of my yearbook), and so I've always associated it with springtime!

Still available, to my surprise, were bunches and bunches of concord grapes. Dark blue with slightly cloudy peels, the grapes are so different from their red and green cousins, with soft, jellied flesh and an ambrosial flavor. And unlike with the tart, crisp grapes, you only need a few to feel satisfied - sort of like the difference between M&M's and a tiny piece of dark, luxurious chocolate.

Knoll Crest didn't have any chickens this weekend, so I bought our five-pounder from the wild game vendor. There were more varieties of apple on offer than I've ever seen before in my life, and I had trouble choosing. Ultimately, I settled on Rome and Granny Smith for the galette, and a few winesaps for munching. I grabbed a couple of pounds of brussels sprouts and some fingerling potatoes, and headed for the Ronnybrook stand to buy some heavy cream and farmer's cheese.

A full half-day of cooking and one overheated kitchen later, we sat down to dinner. The salad, served with a honey and sherry vinegar dressing, was tangy, peppery and cheesy, thanks to some parmesan curls showered on top of each plate. The brussels sprouts with cider weren't quite as apple-y as I would have liked, but man, the bacon was good. My brother, Jeremy, picked the chicken clean, which I took as a good sign.

The best part, though, really was dessert. I based the galette on this recipe from Epicurious, sizing it down a bit to serve just the four of us. The whipped cream with cheese (flavored with a bit of turbinado sugar and vanilla, since the cheese was a bit funkier than expected) paired really well, setting off the sweetness and tang of the apples and the rich, buttery pastry. All in all, a good day's work.

Queenie's Whipped Cream & Cheese

1 pint heavy cream
4-6 ounces soft cheese, preferably farmer's cheese or mascarpone dolce
1 1/2 tsp. good vanilla extract (none of that fake stuff - spring for this)
2 tbs. turbinado sugar

In a stand mixer fitted with the whisk attachment (or using a hand-held electric mixer with the beaters attached), whip the cream and the cheese together until it holds soft peaks. Stir in the vanilla and the sugar. Serve immediately, or cover with plastic wrap and store in the fridge for up to 48 hours. Let sit at room temperature for about 10 minutes before serving.

Serves 4-6 as an accompaniment to dessert.