Logo

iPhone still with AT&T but 3G internet calls are allowed

7 months ago | Erika Santos: Santos on Technology and Life

We have all heard enough about iPad by now. So I will proceed to more exciting news. Apple is unlocking the ability for the iPhone (and iPad) to be used as web phones. Hurray! It updated the iPhone software development kit on Wednesday to allow internet phone apps to work on the 3G network.

Although this does not mean that iPhone users will be able to switch from AT&T at this very moment, it is certainly a sign of progress. A sign of a brighter future in which consumer will have more provider options, cheaper calls and eventually better service.

The quality of internet calls over 3G are still a little shaky, and would probably get worse with congestion before it gets better. It will probably be much more popular when telecom companies roll out their faster fourth-generation networks (aka Long Term Evolution).

Previously, the only way to use VOIP iPhone apps over 3G was by hacking the phone.

Apple and AT&T had a secret agreement to ban apps that would let iPhone users make phone calls using the 3G data connection to prevent cutting into AT&T’s profits. That agreement was revealed in summer of 2009 when the FCC asked Apple and AT&T to explain why Google’s Voice app was rejected from the iPhone store.

At the same time, Apple is not enabling true 3G openness, because most phones’ SIM cards won’t fit in the iPad micro SIM slot.

The move won’t necessarily change things for the famously rejected Google Voice app for the iPhone. Google Voice lets users channel all their calls through a single Google Voice number, which offers cheap international calls, free long-distance calls, free text messaging and voicemail transcription.


Source: Wired Magazine

Why Agile?

7 months ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Many organizations ask us, why we chose Agile. This post is an attempt to compile my thoughts on the answer.

For us, it was the need of the hour... Agile came as a perfect solution for the problems we were facing in software development (discussed below). These problems prompted introspection and Agile had common sense approach to a lot of those issues...

Problems we were facing in software development

1) knowing what to build
- fat documents, UML had all failed
"we wished we could just get the dev teams to talk to the sponsors/end users"

2) knowing when we'll be done
- upfront planning and estimations were bogus... always off...
"we wished we could update our estimates during the project lifecycle"

3) knowing exactly how we'll do it (at the finest level of detail)
- we spent countless hours in predicting our system design (Big Upfront Design) and always had surprises during development that forced us to change our design
"we wished we could design as we go"
Emergent design

4) development time was the shortest period in the project
- sponsor discussions, requirements elaboration, visual design, detailed design, syndication etc. took long time and that put pressure on development team to rollout ASAP
"we wished we started development from the first day IT was engaged with sponsors"

5) most of the work happened towards the end of the project
- 80-20 rule implemented in the wrong way :) 80% of the work was done in 20% of the time (towards the end of the project)
"we wished we could produce software in a rhythm throughout the project"

6) focus on process instead of product
- we had countless reviews to ensure proper artifacts were created and signed-off, prescribed process (waterfall and Unified Process) was followed
"we wished we could do just enough to start and do more as needed"
ceremony vs. essence

7) change management
- we used to finalize requirements before starting development and every small change started a long change management process that was wasteful and created negative energy between the development and sponsor teams
"sponsors wished they had infinite flexibility to change their minds at any time during the project"

8) our product launches were delayed and costed more
- no one trusted our detailed plan and always added 50 - 100% more time/$$ for delivery date/cost
"we wished we could be more accurate in our planning"
Predictability

9) our users/sponsors thought they knew exactly what they wanted
- by the time they saw what was developed, they always changed their minds
"we wished we could show the product early to them and co-design it with them"

10)


Agile gave us a "natural" way to build software that addressed these issues, a framework to build better products with simple common sense approach on process (e.g. helps us to know what to build, how to build, when will it be built).

Agile brought back the basics of good teamwork and collaboration. It enabled:
- good communication. After all "good software needs good communication"
- short feedback loops - which helps in reducing the risk of mistakes and misunderstandings
- rhythm in development
- predictability in estimations on cost/delivery
- focus in building the most valued features first 
- flexibility to change our minds on both functional and technical design to eventually build a better product
- focus on building the product (and not change management procedures, sign-off process, requirement documentation standards, etc.)



Is it time for you to adopt Agile?

Well,I think if you hear any of these words in your software development organization, its at least time for some introspection...

Change management
UML
Month long QA
25+ page Word documents for requirements or design
First product demo towards the end of the project
Detailed plan in Microsoft Project
...

Why Agile?

7 months ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Many organizations ask us, why we chose Agile. This post is an attempt to compile my thoughts on the answer.

For us, it was the need of the hour... Agile came as a perfect solution for the problems we were facing in software development (discussed below). These problems prompted introspection and Agile had common sense approach to a lot of those issues...

Problems we were facing in software development

1) knowing what to build
- fat documents, UML had all failed
"we wished we could just get the dev teams to talk to the sponsors/end users"

2) knowing when we'll be done
- upfront planning and estimations were bogus... always off...
"we wished we could update our estimates during the project lifecycle"

3) knowing exactly how we'll do it (at the finest level of detail)
- we spent countless hours in predicting our system design (Big Upfront Design) and always had surprises during development that forced us to change our design
"we wished we could design as we go"
Emergent design

4) development time was the shortest period in the project
- sponsor discussions, requirements elaboration, visual design, detailed design, syndication etc. took long time and that put pressure on development team to rollout ASAP
"we wished we started development from the first day IT was engaged with sponsors"

5) most of the work happened towards the end of the project
- 80-20 rule implemented in the wrong way :) 80% of the work was done in 20% of the time (towards the end of the project)
"we wished we could produce software in a rhythm throughout the project"

6) focus on process instead of product
- we had countless reviews to ensure proper artifacts were created and signed-off, prescribed process (waterfall and Unified Process) was followed
"we wished we could do just enough to start and do more as needed"
ceremony vs. essence

7) change management
- we used to finalize requirements before starting development and every small change started a long change management process that was wasteful and created negative energy between the development and sponsor teams
"sponsors wished they had infinite flexibility to change their minds at any time during the project"

8) our product launches were delayed and costed more
- no one trusted our detailed plan and always added 50 - 100% more time/$$ for delivery date/cost
"we wished we could be more accurate in our planning"
Predictability

9) our users/sponsors thought they knew exactly what they wanted
- by the time they saw what was developed, they always changed their minds
"we wished we could show the product early to them and co-design it with them"

10)


Agile gave us a "natural" way to build software that addressed these issues, a framework to build better products with simple common sense approach on process (e.g. helps us to know what to build, how to build, when will it be built).

Agile brought back the basics of good teamwork and collaboration. It enabled:
- good communication. After all "good software needs good communication"
- short feedback loops - which helps in reducing the risk of mistakes and misunderstandings
- rhythm in development
- predictability in estimations on cost/delivery
- focus in building the most valued features first 
- flexibility to change our minds on both functional and technical design to eventually build a better product
- focus on building the product (and not change management procedures, sign-off process, requirement documentation standards, etc.)



Is it time for you to adopt Agile?

Well,I think if you hear any of these words in your software development organization, its at least time for some introspection...

Change management
UML
Month long QA
25+ page Word documents for requirements or design
First product demo towards the end of the project
Detailed plan in Microsoft Project
...

Sorta healthy...kinda.

7 months ago | Megan Blocker: Queenie Takes Manhattan

Those Momofuku cookies I made meant buying some oatmeal, something I don't typically keep around the house. FreshDirect only had a giant size on offer, so now I have enough oatmeal to last me from now until the end of time. In the dual interests of a) not wasting food and b) satisfying my sweet tooth without resorting to snorting marshmallows, I decided to make some of that oatmeal into a dessert.

I cooked half a cup of oats in a cup of boiling water (I turned the heat to low and added a pinch of salt when I added the oats to the pot), stirring occasionally, for about five minutes. Then I plopped the oatmeal in a bowl, dotted it with unsalted butter, and topped things off with a sprinkling of dark brown sugar.

Believe me when I tell you that this is one of the most satisfying desserts I've had in a while - and it's rich in fiber, too. Not too shabby.

What to do when ActiveRecord thinks an Oracle key is a decimal

7 months ago | Alex Rothenberg: Common Sense Software

I recently created a model for an existing database table using the legacy_data gem and was confused when my primary key showed up in scientific notation. It turned out the issue was due to sloppiness in the table definition and could be easily fixed once I understood what ActiveRecord was doing.

I created a Person model connected to the people table


class Person < ActiveRecord::Base
end


but when I went into script/console the primary key showed up as a BigDecimal when I expected an integer.


$ script/console
Loading development environment (Rails 2.3.4)
>> Person.first.id
=> #


This wasn't what I wanted and would cause problems in my app when it tried to build a url with that id like http://localhost:3000/people/10024844425.0. The rails routing engine would see the .0, treat it as a format (like .xml or .json) and get confused. Let's look at why this is happening.



>> Person.columns_hash['id']
=> #
>> Person.columns_hash['id'].type
=> :decimal
>> Person.columns_hash['id'].sql_type
=> "NUMBER"


We see that ActiveRecord is treating this column as a :decimal because it's sql_type is NUMBER. It turns out this is correct because an Oracle number is a decimal unless you specify it to have 0 digits after the decimal point (scale of 0). Here's the documentation from Oracle (the last sentence is my bold)


NUMBER Datatype

The NUMBER datatype stores fixed and floating-point numbers. Numbers of virtually any magnitude can be stored and are guaranteed portable among different systems operating Oracle, up to 38 digits of precision.

The following numbers can be stored in a NUMBER column:

Positive numbers in the range 1 x 10-130 to 9.99...9 x 10125 with up to 38 significant digits

Negative numbers from -1 x 10-130 to 9.99...99 x 10125 with up to 38 significant digits

Zero

Positive and negative infinity (generated only by importing from an Oracle Version 5 database)

For numeric columns, you can specify the column as:

column_name NUMBER

Optionally, you can also specify a precision (total number of digits) and scale (number of digits to the right of the decimal point):

column_name NUMBER (precision, scale)

If a precision is not specified, the column stores values as given. If no scale is specified, the scale is zero.

Oracle guarantees portability of numbers with a precision equal to or less than 38 digits. You can specify a scale and no precision:

column_name NUMBER (*, scale)

In this case, the precision is 38, and the specified scale is maintained.

When you specify numeric fields, it is a good idea to specify the precision and scale. This provides extra integrity checking on input.


Let's look in my database and sure enough the ID is a number


$ sqlplus myusername/mypassword@localhost:1521/mydatabase.world

SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jan 27 09:15:09 2010

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Release 10.2.0.4.0 - Production

SQL> desc people;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(10)



If you are allowed to change your database you can create a migration like


$ script/generate migration change_person_id_to_integer
STUBBING MckinseyLDAP
exists db/migrate
create db/migrate/20100127145747_change_person_id_to_integer.rb


now edit the migration


class ChangePersonIdToInteger < ActiveRecord::Migration
def self.up
change_column(:people, :id, :integer)
end
def self.down
change_column(:people, :id, :decimal)
end
end


In my case there were other applications using this table and I was not allowed to change it so I implemented a fix in Ruby to tell my model to treat this column as an integer even though it was defined as a decimal in the database.


#config/initializers/legacy_data_type_coercion.rb
module LegacyDataTypeCoercion
def set_integer_columns *col_names
col_names.each do |col_name|
columns_hash[col_name.to_s].instance_eval do
@type = :integer
end
end
end
end
ActiveRecord::Base.extend(LegacyDataTypeCoercion)


#app/models/person.rb
class Person < ActiveRecord::Base
set_integer_columns :id
end


We defined a method set_integer_columns that will force ActiveRecord to treat the columns we specify as integers. In our Person model we declare :id is an integer column. Let's test it out!


$ script/console
Loading development environment (Rails 2.3.4)
>> Person.first.id
=> 10024844425
>> Person.columns_hash['id'].type
=> :integer


Just as expected id is now an integer and we can go ahead building the rest of our application.

This is not an issue with all Oracle tables as if the column was defined as NUMBER(10) (with a precision and implicit scale of 0) then ActiveRecord will interpret it as an integer automatically based on the parentheses in the data type - i.e NUMBER(10) ActiveRecord or Oracle Enhanced).

Project Natal: Where You Are Your Controller

7 months ago | Erika Santos: Santos on Technology and Life

Well, I already know what I want for Christmas!

Natal is Microsoft's “no-controller” control system for the Xbox. A 3-D camera recognition system turns your body movements into movements on the screen for your avatar.

The camera will “capture” real life items to use in the games and use voice recognition to start a movie playing.

In addition to a variety of games, Natal gives us Milo, a virtual friend who can recognize you and have a chat. Milo, is Cute, in a creepy kind of way (but my kids are still going on play dates with real people!).

Assuming Microsoft delivers everything it promises, X-Box just may overtake the Wii.

Amazing stuff.


Crisp and cold - and a new resolution.

7 months ago | Megan Blocker: Queenie Takes Manhattan

A couple weekends ago, during the early January cold snap that enveloped the Eastern states, I took a sunny and very chilly walk across Central Park. I started off near my friends Miya and Jordan's place, at 64th and Central Park West, and left the park at 72nd and 5th. Along the way, I saw the icy towers of Midtown rising above the park's trees (one of my favorite New York sights).

I also passed this statue of Mother Goose. She's pictured astride a goose, and her plinth is covered with carvings depicting scenes from her various tales, including Humpty Dumpty and Little Bo Peep. I love the look of wise glee on Mother Goose's face and the sense of movement she creates, with her cape flying out behind her as she rides the wind.

Behind Mother Goose, two (slightly creepy) children keep watch over the entrance to the Rumsey Playfield. To me, they looked like something out of a horror novel, the sort of imp that comes to life after we've all gone to sleep.

I don't walk through the park nearly as often as I should, and this walk reminded me of that. I've resolved, therefore, to make a weekly pilgrimage from one side to the other. I'll try to document these walks here; I think it'll be really fun to watch the park ebb and flow with the seasons, and I can't think of anything that makes me feel more connected to the city than drinking it in as it was intended: on foot.

Cookie monster.

7 months ago | Megan Blocker: Queenie Takes Manhattan

I'm sure many of you are sick and tired of hearing me sing the praises of David Chang's Momofuku mini-empire. But know this: if you skip this post, you'll miss out on some damn good cookies.

My friend Lorna Yee (fabulous food writer and cookbook author) lives in Seattle, far from the warm reaches of Momofuku pastry chef Christina Tosi's deliciously retro Milk Bar creations (I think of them as comfort goodies for those born in the 70s and early 80s.). She attended a New Year's brunch where the host had ordered some Milk Bar cookies online, and couldn't get enough of the chocolate chip, cornflake and marshmallow ones. Lorna was "besotted by their butterscotch-sweet and salty flavor, and their crunchy, cornflake texture," and so she set to experimenting with a copycat version.

I officially declare them a success. I made a batch last Friday, to bring on the road trip to Rhode Island, and my cousin Abby - who's had the original - didn't even realize that I'd made them until I told her about Lorna's quest. They're just as Lorna described: rich with butter, sweet with caramel flavors from the dark brown sugar, and crunchy from the cornflakes (of which, I will admit, I added an extra handful or two).

Mine didn't turn out quite as pretty as Lorna's, but, then, she has the golden touch when it comes to pastry. I'm ok with that, especially since I'm fairly confident that mine were just as tasty.

iPhone App Helps Man Survive Haiti Earthquake

7 months ago | Erika Santos: Santos on Technology and Life

Creating associations to existing data part 1: belongs_to scaffolding

7 months ago | Pat Shaughnessy: Pat Shaughnessy - Home

I decided it would be fun to look into various different types of Rails forms that allow you to create a new object that is associated with existing data. In my next few posts, I’ll explore different ways to select existing records, and also how to work with has_and_belongs_to_many and has_many, through relationships in a Rails form. It seems to me that these use cases are more common than the nested models form in the complex-form-examples sample app that creates new records but doesn't associate with existing ones.

To start with today, here’s the simplest such form I could think of – I call this a “belongs_to” form:

Here we can see a form for a new “shirt” record; along with the color and size the user can also select the person who owns the shirt. In this example, the shirt and person models have a has_many/belongs_to relationship. This form uses simple HTML <select> and <option> tags to display the list of people, and is generated by Rails ERB code that uses “collection_select” like this:

 1 <p>
 2   Person:<br />
 3   <%= f.collection_select(:person_id,
 4                           Person.all,
 5                           :id,
 6                           :name,
 7                           { :prompt => true })
 8   %>
 9 </p>

The parameters passed to collection_select here indicate that we want to display all of the people that exist, and set the value and label for each <option> tag to the id and name of each person respectively. When the form is submitted, the “person_id” field for this shirt is set to the “id” value of the selected person.

Belongs_to scaffolding with View Mapper

If you need a form like this in your app, you can use my View Mapper gem to generate it for your models as follows… first install it from gemcutter; you’ll need version 0.3.2 at least for this form:

$ gem sources -a http://gemcutter.org
http://gemcutter.org added to sources 
$ sudo gem install view_mapper
Successfully installed view_mapper-0.3.2

Then you can generate the belongs_to view scaffolding you see above like this:

$ ./script/generate view_for shirt --view belongs_to

View Mapper will open the specified model (“Shirt”), detect the associated model(s) that Shirt belongs to, and then generate the form using collection_select along with all of the other standard scaffolding files. You can also have View Mapper generate the new Shirt model and the view scaffolding code at the same time like this:

./script/generate scaffold_for_view shirt color:string size:integer
                                    --view belongs_to:person

Here you’ve specified the desired attributes for the new shirt model, along with the fact that you want it to belong to a person.

To make the generated view code simple and concise, View Mapper makes a couple of assumptions about your models:

  • It assumes the parent model (“Person” in this example) has an attribute or method called “name.” This is used to display the list of people.
  • It also assumes the child model (“Shirt”) has a method to display the name of the parent model it belongs to (“person_name” in this example).

I decided not to make the View Mapper command line more complex than it already is by providing a way to pass the “name” attribute as another parameter. Instead you can just edit the scaffolding code it produces as desired.

Detailed example and code review

Let’s create a sample app now together using View Mapper, and then review how this “belongs_to view” works. First, create a new Rails app:

$ rails belongs_to
      create  
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      etc...

And now let’s create the Person model with first and last name attributes; I’ll also use the console to create a few Person records so we have some existing data to work with:

$ cd belongs_to
$ ./script/generate model person first_name:string last_name:string
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/person.rb
      create  test/unit/person_test.rb
      create  test/fixtures/people.yml
      create  db/migrate
      create  db/migrate/20100124120247_create_people.rb
$ rake db:migrate
(in /Users/pat/rails-apps/belongs_to)
==  CreatePeople: migrating ===================================================
-- create_table(:people)
   -> 0.0030s
==  CreatePeople: migrated (0.0032s) ==========================================
 $ ./script/console 
Loading development environment (Rails 2.3.5)
>> Person.create :first_name => 'Barack', :last_name => 'Obama'
>> Person.create :first_name => 'George', :last_name => 'Bush'
>> Person.create :first_name => 'Bill',   :last_name => 'Clinton'

Now let’s go ahead and run View Mapper to create the form…

$ ./script/generate scaffold_for_view shirt color:string size:integer
                                      --view belongs_to:person
     warning  Model Person does not contain a has_many association for Shirt.

Here View Mapper is warning us that we haven’t called “has_many :shirts” in the Person model yet; let’s edit person.rb and enter that code:

1 class Person < ActiveRecord::Base
2   has_many :shirts
3 end

Now we can try again:

$ ./script/generate scaffold_for_view shirt color:string size:integer
                                      --view belongs_to:person
     warning  Model Person does not have a name attribute.

Above I mentioned that View Mapper assumes the parent model has a “name” attribute or method. This is required to know how to display each person record in the <select> drop down box on the form. Remember in the call to collection_select we passed in the symbol “:name” – this tells Rails to call the name method for the label of each <option> tag. So let’s create a name method in the Person model that displays the first and last name attributes together:

1 class Person &lt; ActiveRecord::Base
2   has_many :shirts
3 def name 4 "#{first_name} #{last_name}" 5 end
6 end

The highlighted code returns the first and last names concatenated together as a single name. Now View Mapper won’t complain and we can go ahead and create our new form:

$ ./script/generate scaffold_for_view shirt color:string size:integer
                                      --view belongs_to:person
      exists  app/models/
      exists  app/controllers/
… etc …

create app/views/shirts/_form.html.erb
… etc … exists test/fixtures/ create app/models/shirt.rb create db/migrate/20100124121032_create_shirts.rb

Note the output here looks just like what you get from the standard Rails scaffold generator, except for the one additional line I highlighted above. If you run your app now, you’ll be able to see scaffolding for the Shirts model at http://localhost:3000/shirts, and you’ll see the person select box on the new and edit forms.

Let me take a few more minutes to point out a couple of interesting details about the belongs_to scaffolding… first I’ve moved the form fields into a partial shared among the new and edit views; this is the new _form.html.erb file highlighted above in the generator output. If you look at new.html.erb, you’ll see a call to render :partial:

 1 <h1>New shirt</h1>
 2 
 3 <% form_for(@shirt) do |f| %>
4 <%= render :partial => 'form', :locals => { :f => f } %>
5 <p> 6 <%= f.submit 'Create' %> 7 </p> 8 <% end %> 9 10 <%= link_to 'Back', shirts_path %>

The edit.html.erb file looks similar. The actual call to collection_select is in _form.html.erb; that way if you need to display the list of people differently, for example to use a method other than “name” for each person or possibly to use a filtered list of people instead of Person.all, then you just need to make your changes in one place.

And one more interesting detail: if you open up the new Shirts model that View Mapper generated you’ll see this:

1 class Shirt < ActiveRecord::Base
2   belongs_to :person
3 def person_name 4 person.name if person 5 end
6 end

The person_name method I highlighted above returns the person each shirt belongs to; it also checks if person is nil for that shirt. This simplifies the code in index.html.erb and show.html.erb; take a look at show.html.erb for example:

 1 <p>
 2   <b>Color:</b>
 3   <%=h @shirt.color %>
 4 </p>
 5 
 6 <p>
 7   <b>Size:</b>
 8   <%=h @shirt.size %>
 9 </p>
10 
11 <p> 12 <b>Person:</b> 13 <%=h @shirt.person_name %> 14 </p>
15 16 <%= link_to 'Edit', edit_shirt_path(@shirt) %> | 17 <%= link_to 'Back', shirts_path %>

Here the Person field looks just like any other field from the Shirt model. There’s no need to repeat the check for person == nil in the view, and if you ever need to use a Person attribute other than name or if you needed to find the associated person in some more complex way, you’ll only need to make the change to the model and not in each view file.

Again, if you run View Mapper on two has_many/belongs_to models that you’ve already written in your app, you will first need to provide:

  • A “name” method in the parent model, if it’s not already an attribute, and
  • A “[parent_model]_name” method in the child model

If these two methods don’t exist, View Mapper will display warning messages and not proceed; this avoids the confusion you would run into when the scaffolding view code didn’t work.

Next time, I’ll repeat this example but use type ahead/auto_complete to select the person instead...

Queenie's Treasury

7 months ago | Megan Blocker: Queenie Takes Manhattan

Happy Saturday. everyone, and welcome to the latest edition of the Treasury! It's a gorgeous, sunny day here in New York, and I'm heading out this afternoon to Chinatown for some spicy noodles and serious window shopping. But before I go...

As you all know, I am a big fan of re-usable shopping bags, right down to the mesh produce bags I use at the Greenmarket. So I was really excited to see the London shop Unpackaged featured on the humanitarian design blog, GOOD. Unpackaged sells everything loose - spices, produce, nuts, grains - and you bring your own packaging (or buy your own at the store). The store itself is just beautiful, and I can't help but be won over by the concept.

Over on Serious Eats, they're talking about claypot cooking. Rice, sausage, and a crispy crust? I need to try this, stat.

The New York Times has added a regular coffee feature (entitled Ristretto) to its T Magazine blog line-up. Authored by Oliver Strand, one of the paper's $25-and-under columnists and staff food writers, it's a great look at coffee in the city, and coffee preparation in general. Speaking of which, I think a cup of espresso would hit the spot right now.

"Next Generation Collaborative Enterprise"

7 months ago | Biju Bhaskar: Thoughts on enterprise application development...

There is a great article posted by the CTO of Cisco, Padmasree Warrior, about the next generation collaborative enterprise...


It made me think about how our organization will look in a few years time. I think we have all the right characteristics to be ahead of the curve and get there soon (right people, collaborative culture, agile mindset etc.).

Specially I liked her comment about the real meaning of collaboration... "It is important to point out that collaboration must not be confused with consensus or teamwork. Collaboration does not mean everyone must agree before any decision is made. Nor does it suggest that there is no room for individual creativity"

Makes total sense..


Cold weather treat.

7 months ago | Megan Blocker: Queenie Takes Manhattan

Much to my delight and chagrin, FreshDirect is finally carrying Mallomars. This will be my downfall.

I remember trying to order these last year (Mallomars, you see, have a season - their delicate chocolate shells can't survive harsh Northeastern summers.), but with no luck. But just last week I thought it was worth searching FreshDirect's site for them - and there they were!

For those of you who've never experienced their awesomeness, Mallomars consist of a graham cookie topped with marshmallow and covered in a thin, dark chocolate shell. They are, to say the least, delicious. (They're also famous, having made their big screen debut in When Harry Met Sally.) They're also vastly more popular in New York than anywhere else; according to Nabisco, who manufacture the cookies, more than 70% of all Mallomars are sold in the New York-New Jersey-Connecticut Tri-State area.

For the most part, I believe in making cookies, and not buying them - particularly not when they're mass-produced. But Mallomars are where I make an exception, because there's just nothing quite like them.

Now excuse me while I go try to forget that I still have half a box left.

Five Ways to Guarantee Your Failure as a Web Professional !!

7 months ago | Lalita Chandel: Emotional Intelligence

I found this interesting !!

http://sixrevisions.com/project-management/five-ways-to-guarantee-your-failure-as-a-web-professional/

Resolution: kept!

7 months ago | Megan Blocker: Queenie Takes Manhattan

About a year ago, I resolved to bring my lunch to work at least three days a week, and with very few exceptions, I've done it! One of the ways I manage it is to make something on Sunday that will see me through a lunch or two. Braised dishes and stews are fantastic for this, since they not only keep well, but actually get better after a couple of days in the fridge.

(A quick aside: I highly recommend bringing your lunch to work. Not only do you save money, you also eat so much more nutritiously and consciously. It's made a huge difference to my working style, too - since I don't have to run out for fifteen or twenty minutes in the middle of every day, I can more easily meet with people over lunch or run out to do errands at 3:00, when the stores are empty. I love it.)

I've made chicken with barley and a (somewhat) traditional coq au vin, but one of my favorite braised chicken dishes is one I've adapted from a recipe I first made during my eGullet days. My friend Susan created this recipe, and I've loved it from the very first bite. She makes hers with fresh plum tomatoes and creme fraiche; I sub in half-and-half, since it's what I keep in the fridge for my coffee, and during the winter I use canned tomatoes - but, in spirit, it's still the same dish.

And I'll be damned if it isn't delicious. It's substantial from the vegetables, creamy from the cooking time and the half-and-half, and tangy from the vinegar. During the summer, I use basil and parsley to season things, but this time of year I keep it wintry with a little woodsy thyme. Most of the time, I eat it by itself, but it's also fantastic with buttered noodles or some mashed potatoes. Really, anything goes. Anything at all.

Susan's Braised Chicken with Tomatoes & Vinegar

1 tbs. canola oil
Dark meat of one chicken (two legs, two thighs, two wings)
1/2 white onion, cut into a 1/4-inch dice
2 cloves garlic, thinly sliced
1 small carrot, peeled and cut into a 1/4-inch dice
1 stalk celery, cut into a 1/4-inch dice
1 tbs. fresh thyme leaves
1/8 cup white wine or champagne vinegar
1/2 cup white wine
14 oz. whole canned plum tomatoes in puree, crushed with your hands
1 or 2 tbs. half-and-half, milk, creme fraiche or cream
Salt and freshly ground pepper

In a 3-quart, heavy-bottomed pot (enameled cast iron is ideal), heat the canola oil over high heat. In the meantime, season the skin side of the chicken pieces with salt and pepper. Once the oil is hot enough (a droplet of water should sizzle and skitter across the surface), place half the chicken pieces in the pot, skin side down, and turn the heat to medium high. Cook until the chicken is well-browned on one side, then flip and cook for a few more minutes. Using tongs, remove the cooked chicken to a plate and repeat with the rest of the chicken.

Pour off all but 1 tbs. of the fat from the bottom of the pot and return to the heat. Add the onion and saute for a few minutes until softened and a little browned. Add the garlic and saute for a minute or two more, until the garlic is fragrant and slightly golden. Add the carrots, celery, thyme and a pinch of salt; saute until the vegetables soften, about five minutes.

Deglaze the pan with the vinegar, then add the wine. Simmer for a couple of minutes and then add the tomatoes (with their puree). Stir to combine evenly, then add the chicken back to the pot, nestling the pieces in the vegetable mixture. sprinkle with a bit more salt and some pepper, then turn the heat to low, cover and simmer (Do NOT boil!) for 25 to 30 minutes.

Once the chicken is cooked through and the sauce has turned a bit creamy-looking, remove the chicken to a plate and stir the sauce. Add the half-and-half and stir to combine. If you're planning to store the stew overnight (or longer), add the chicken back to the pot and let things cool down a bit on the stovetop. Once the pot is no longer hot to the touch, place in the fridge. The dish keeps for five or six days, easily.

If you plan to serve immediately, taste and adjust for seasoning, then place a piece or two of chicken on each plate and top with plenty of sauce.

Serves three.

Ruby's block_proc_lamda_method

7 months ago | Niranjan Sarade: InLoveWithNature

I went through a couple of articles on ruby's blocks, procs, lambda & method and found those really good and interesting. Sharing those articles :

http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

http://www.neeraj.name/blog/articles/589-block-vs-lambda-vs-proc

Road trip!

7 months ago | Megan Blocker: Queenie Takes Manhattan

This past Saturday, I drove up to Rhode Island to visit my aunt and uncle in Bristol. They were hosting a 30th birthday party for my cousin Kate, who's been one of my closest friends pretty much since time began. (See the photo below for evidence.) We had a fantastic time - my Aunt Cathi cooked up a storm, including some of the most delicious chicken Marsala of all time (the secret is roasting the mushrooms and onions separately and with lots of balsamic vinegar).

Yesterday, on the way back to the city, my cousin Jason, his wife Abby and I stopped at a McDonald's in northern Connecticut for a road trip fix. I only indulge in Mickey D's a couple of times a year, and always when traveling. It's my airport and highway rest stop food of choice, and I wouldn't have it any other way.

Chicken nuggets, fries and Sweet & Sour sauce: pure, salty perfection. Yum.

Six hat thinking !!

7 months ago | Lalita Chandel: Emotional Intelligence

The main difficulty of thinking is confusion. We try to do too many things at once and it is really not possible to think in different directions at the same time. Emotions, information, logic, hope and concept all crowd in on us and It is like juggling with too many things at the same time.
After reading Six hat thinking by Edward de Bono, I realized that there is a very simple concept which allows a thinker to do one thing at a time. There are five distinct states in which the brain can be sensitised. In each of these states the brain identifies certain aspects of issues being considered (e.g. emotional view, pessimistic judgement, neutral facts). In order to make it easier to work with these states, the use of coloured hats as metaphors for them is used and putting on any one of these hats defines a certain type of thinking.
The best part of this method is that, we can separate emotion from logic , creativity from information and so on.

Here is a brief description of each of the hats and the thinking processes that they represent :-
1.White (Facts & Information): White is neutral and objective. It is concered with objective facts and figures.
2.Red (Feelings & Emotions): Red suggests anger, rage and emotions. It gives our emotional view.
3.Black (Critical Judgment): Black is sombre and serious. It is cautious and points out the weaknesses in an idea.
4.Yellow (Positive): Yellow is optimistic and covers hope and positive thinking. It is exactly opposite of black hat and looks for the reasons in favour of something.
5.Green (Creativity ): Green indicates new ideas. It is based around the idea of provocation and thinking for the sake of identifying new possibilities.
6.Blue (Control): Blue hat is concerned with control, organization of the thinking process and use of the other hats. This is the hat under which all participants discuss the thinking process.

Possibilities

7 months ago | Amy Grandov: Technology for Social Innovation

When I picked my son up from kindergarten on Friday, he was wide eyed and excited about Martin Luther King day. He told me "Can you believe there used to be 'Whites Only' signs?! Blacks didn't even get paid the same as whites at their jobs. Dr. King fought to help people. Why would someone want to kill him?"

Yikes. I'd honestly been thinking about what to make for dinner, and now this? I struggled to explain a mindset that I don't understand myself. What is an adequate answer to the question "why?"

I can understand my son's bewilderment at descriptions of American life before the civil rights movement. Very young kids are learning everything for the first time without pre-conceived expectations; our fuss over "firsts" don't always make sense to them. In the last presidential election, my kids had fun taking sides in a highly unusual primary race between a woman and an African American man. (My son rooted for Clinton because Grandma liked her. My 2 year old liked Obama because it was fun to say his name.) And then there was that female VP candidate who almost stole the show. A homogeneous government would seem strange and out of place to them now. At the movie "The Princess and the Frog" this weekend, Disney's first African American princess similarly failed to surprise. Growing up in a multicultural community with a high population of immigrants, my kids simply expect diversity in all areas of life.

If dreams are powerful, expectations are even more so. The Wright Brothers' first airplane flight in 1903 only lasted 12 seconds and covered 120 feet. More important than how far they flew that day, they had redefined forever what was possible. There was still far to go before we had the Concord and space travel, and expected commercial airplanes to take us to any corner of the globe we wished to visit, but progress was unstoppable.

Martin Luther King famously had a dream that sparked many "firsts" and changed the country in fundamental ways. I'm sad to see my son's innocence fade as he grows up and learns not just about King's dream but also the work left undone, even today. For now, I emphasize the positive. I tell him if he sees injustice in the world, he has the power to do something about it, and change it. We know what is possible.

See:
2010 MLK Day Technology Challenge at www.serve.gov

Queenie's Treasury

7 months ago | Megan Blocker: Queenie Takes Manhattan

Hello, kiddies! I'm back from hiatus and ready to rock. This week's Treasury is a little late, but it's still technically the weekend here in the States, so I'm ok with it. Here we go!

First up, some majorly impressive food styling and photography from the website of Helene Dujardin, a stylist based in South Carolina and author of the food blog Tartelette. Inspiration abounds on her site and her blog. Those pears make me want to buy some mascarpone and get creative with a pear-centric feast - or just eat slices smeared with the cheese. Either way.

Next, a new website dedicated to guiding you through the shopping riches offered by the UK. From Britain with Love launched earlier this month, and is already on fire! Their blog is fantastic, and they have some of the best gift ideas I've seen recently. And, for those of you in the UK, some excellent contests (Sadly, we foreigners are not eligible.).

Finally, a look at Marimekko's Oiva dinnerware line, which will be released later this year. I love all of it, especially the coffee cups. Being handle-free makes them all the more cozy (you have to literally cup them in your hands), and I can't get enough of their blobby-yet-geometrically-satisfying pattern.

Loving Lever House.

7 months ago | Megan Blocker: Queenie Takes Manhattan

Working in midtown Manhattan is, most of the time, kind of a pain in the butt. It's crowded, it's full of bad, over-priced food, and it's just not as good as working across the street from Madison Square Park (like I used to). It's not completely without its rewards, though, and one of those is the fantastic mid-century architecture that abounds in the East 50s.

I work at 52nd and Madison, which means I pass both Lever House and the Seagram Building on my way to the office. On a clear, sunny day, looking up at either of those towers and glass and steel fills me with a Mary Tyler Moore-esque swell of excitement. I realize where I am, and I get all tingly.

One of the cooler things about Lever House is their rotating collection of art on public display in their glass-walled lobby and open-air atrium. The current installation, by Richard Woods, is entitled Port Sunlight, and is just plain awesome. The pillars and benches inside and surrounding the lobby (and the floor of the lobby itself) have been printed with mosaic motifs, from feathers to black and white patterns with graphic punch.

Walking through the atrium makes me feel warm and cozy, like I'm strolling through a Caribbean plaza immersed in equatorial sun. If you're in New York - either as a resident or a tourist - I highly recommend a visit to 53rd and Park to check it out.

Photos courtesy of Richard Woods and This Week In New York.

I'm back, baby!

7 months ago | Megan Blocker: Queenie Takes Manhattan

Hello there, dear readers!

I'm so sorry to have missed you last week, and though the next few days promise to be just as nutty, I'm spending this blessedly obligation-free afternoon getting content ready for posting all week long.

Since we last spoke, I took a walk across Central Park in 20-degree weather, went on a road trip to Yale and Rhode Island, make some awesome cookies and rediscovered my love for Mallomars. More on all of that very, very soon.

Mwah!

Company

7 months ago | Niranjan Sarade: InLoveWithNature

Finding that cranes were destroying his newly sown corn, a farmer one evening set a net in his field to catch the destructive birds. When he went to examine the net next morning he found a number of cranes and also a stork.

"Release me, I beseech you," cried the stork, "for I have eaten none of your corn, nor have I done you any harm. I am a poor innocent stork, as you may see - a most dutiful bird, I honor my father and mother, I..."

But the farmer cut him short. "All this may be true enough, I dare say, but I have caught you with those were destroying my crops, and you must suffer with the company in which you are found."

Moral: People are judged by the company they keep.

Completed Standard Chartered Mumbai Marathon 2010 !!

7 months ago | Bhargav Gandhi: AGILE SOFTWARE DEVELOPMENT

Today, I completed my first Marathon :). It was a great run of 21 kms covering the new Bandra-Worli sea link. Here is the route map.

The Right Speech

7 months ago | Niranjan Sarade: InLoveWithNature

There is a Chinese saying which carries the meaning that "A speech will either prosper or ruin a nation." Many relationships break off because of wrong speech. When a couple is too close with each other,we always forget mutual respect and courtesy. We may say anything without considering if it would hurt the other party.

A friend and her millionaire husband visited their construction site. A worker who wore a helmet saw her and shouted,"Hi, Emily! Remember me? We used to date in the secondary school." On the way home, her millionaire husband teased her, "Luckily you married me.Otherwise you would have been the wife of a construction worker." She answered ,"You should appreciate that you married me. Otherwise, he would have been the millionaire and not you."

Ten questions every business should never stop asking

7 months ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Forbes has published a list of 10 questions that every business should never stop asking...

1. What is our purpose for existing?
2. Who is our target customer?
3. Why does anyone need what we're selling?
4. If there is a need, is it enough to support a profitable business?
5. What were our competitors up to?
6. Can you reduce expenses--without harming the product?
7. Do we have the right leadership?
8. Do we have the right employees?
9. How will we continue to drive revenue?
10. How are our employees holding up?

I wonder what are the equivalent questions for a service organization like an enterprise IT shop.

1. What is our purpose for existing?
2. Who is our target customer?
3. Why does anyone need what we're selling offering?
4. If there is a need, is it enough to support a profitable ??? business?
5. What were our competitors up to?
6. Can we reduce expenses--without harming the product?
7. Do we have the right leadership?
8. Do we have the right employees?
9. How will we continue to drive revenue ??? ?
10. How are our employees holding up?

Ten questions every business should never stop asking

7 months ago | Prasoon Sharma: Enterprise Software Does not Have to Suck

Forbes has published a list of 10 questions that every business should never stop asking...

1. What is our purpose for existing?
2. Who is our target customer?
3. Why does anyone need what we're selling?
4. If there is a need, is it enough to support a profitable business?
5. What were our competitors up to?
6. Can you reduce expenses--without harming the product?
7. Do we have the right leadership?
8. Do we have the right employees?
9. How will we continue to drive revenue?
10. How are our employees holding up?

I wonder what are the equivalent questions for a service organization like an enterprise IT shop.

1. What is our purpose for existing?
2. Who is our target customer?
3. Why does anyone need what we're selling offering?
4. If there is a need, is it enough to support a profitable ??? business?
5. What were our competitors up to?
6. Can we reduce expenses--without harming the product?
7. Do we have the right leadership?
8. Do we have the right employees?
9. How will we continue to drive revenue ??? ?
10. How are our employees holding up?

New Ways of Getting News and Giving Help

7 months ago | Amy Grandov: Technology for Social Innovation

With the terrible disaster in Haiti, mobile technology and new media is moving mainstream as a source of news and a method of collecting donations of aid. A friend's family in Haiti is on my mind today.

The BBC posted a news clip about how Twitter is being used to get information out. Mobile Active has a wealth of information on the role of mobile technology in responding to the disaster. In the United States, text HAITI to 90999 donate $10 to the Red Cross for Haiti efforts.

Public and Private Partnerships

7 months ago | Amy Grandov: Technology for Social Innovation

I was very lucky yesterday to spend the day exploring public art in New York City as part of Coro Leadership New York. Public art is exhibited across the city free of charge on public land, including parks and government buildings. It may be permanent or temporary, from small statues to enormous installations like the Waterfalls or The Gates.



In small teams, we interviewed government decision makers, private foundations, artists, and arts advocates for their perspectives on public art. We identified stakeholders who influence and select public art pieces, where art is placed, and what is acceptable to the community. We also considered who benefits, and possibly who may lose out. I had a chance to appreciate art in the city that I wasn't aware of, and gain insight into some of the process side of what is involved in exhibiting works of art on public property in the city.


The push for public art seems to come significantly from private donors and artists, while the government's role is to facilitate, providing access to public space with additional input from organized community groups. There doesn't seem to be a single grand vision for public art in NYC, yet there is a wealth of art on display. Even ongoing maintenance of public monuments depends on funding from private sources. Public art is a sort of democratic public/private partnership - a relationship which has its pros and cons.


The benefits of this partnership to the city and its residents are clear. The city can display an ever-changing array of free works of art while passing down a permanent installation to future generations. This improves quality of life for residents, softens and humanizes the harsh city landscape, and attracts tourist dollars, with minimal burden on taxpayers. Artists can be entrepreneurial and independent, rather than limited by the whims and preferences of politicians.



When the government is not directly funding public art, however, it is somewhat constrained in achieving broader social goals, such as ensuring that the art reaches outer boroughs, young people, and disadvantaged populations. In the absence of government authority, private money and personal relationships become key to realizing an artistic vision. There are inherent tensions between freedom of expression and service to the community, as well as between "high brow" or avant guard tastes and what appeals to the average New Yorker.


As I learn more about how government interacts with citizens, advocacy groups and other democratic organizations in New York, I'm impressed by a system that is full of contradictions: messy and seemingly inefficient yet functional; free yet not always "fair"; wide open to participation yet challenging to understand and navigate. I'm excited to learn more.



See also:

New York City Department of Parks and Recreation

Model diagram generator plugin

7 months ago | Niranjan Sarade: InLoveWithNature

After my one of the last posts Shaping models in Rails, I got a chance to convert that piece of code into a Rails plugin.

It has been rolled out to Github.

Github Repository :- http://github.com/NiranjanSarade/model-diagram-generator

Installation :-
ruby script/plugin install http://github.com/NiranjanSarade/model-diagram-generator.git/

Usage :-
rake model_diagram:generate
It will generate diagramatic representation of the model relationship present in your rails app. The model_relationship.dot and model_relationship.png files will be generated at the application root folder.

It was a nice feeling with contributing something to the open source community !

Freezing a gem that has native extensions

7 months ago | Alex Rothenberg: Common Sense Software

I like to freeze all the gems I use as we run in a shared hosting environment and need to our apps isolated from each other. Deployments are also handled by an operational team that does not intimately understand our applications so keeping our deployments to a single capistrano command cap deploy:migrations has been a big win for us. Freezing most gems is pretty straightforward and has been built in since Rails 2.1. When dealing with a gem that requires native extensions to be built there's only one additional step to add to your Capfil.

Let's say we want to localize hpricot which does include native C extensions.

First tell Rails about your gem by adding a config.gem line to your environment.rb


Rails::Initializer.run do |config|
...
config.gem 'hpricot'
...
end


Now we can ask rails about its configured gems


$ rake gems
(in /Users/alexrothenberg/ruby/my_project)
- [I] hpricot

I = Installed
F = Frozen
R = Framework (loaded before rails starts)


The 'I' means its hpricot is installed on my system but not frozen in the application. If you see '[]' instead you need to run sudo gem install hpricot (add '--source http://gemcutter.org' if necessary). At this point you could write some code to use hpricot and your application will work. But if hpricot (or the version you're expecting) is not installed on your production server you'll be in trouble.

To freeze the gem into your vendor directory run rake gems:unpack (optionally you can add 'GEM=hpricot' if you just want to unpack one gem).


$ rake gems:unpack
(in /Users/alexrothenberg/ruby/my_project)
Unpacked gem: '/Users/alexrothenberg/ruby/my_project/vendor/gems/hpricot-0.8.2'


We can ask rails again...


$ rake gems
(in /Users/alexrothenberg/ruby/my_project)
The following gems have native components that need to be built
hpricot

You're running:
ruby 1.8.6.287 at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
rubygems 1.3.2 at /Users/alexrothenberg/.gem/ruby/1.8, /Library/Ruby/Gems/1.8, /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

Run `rake gems:build` to build the unbuilt gems.


Oops our vendored gem is missing hasn't built the native extensions. Not to worry the message tells us what to do and we run rake gems:build


$ rake gems:build
(in /Users/alexrothenberg/ruby/my_project)
Built gem: '/Users/alexrothenberg/ruby/mars-admin/vendor/gems/hpricot-0.8.2'
alex-rothenbergs:mars-admin alexrothenberg$ rake gems
(in /Users/alexrothenberg/ruby/my_project)
- [F] hpricot

I = Installed
F = Frozen
R = Framework (loaded before rails starts)


We can ask rails again to see that the gem is now frozen and also look in our vendor folder


$ rake gems
(in /Users/alexrothenberg/ruby/my_project)
- [F] hpricot

I = Installed
F = Frozen
R = Framework (loaded before rails starts)

$ ls vendor/gems/hpricot-0.8.2/
total 72
-rw-r--r-- 1 alexrothenberg staff 4672 Jan 13 12:33 CHANGELOG
-rw-r--r-- 1 alexrothenberg staff 1048 Jan 13 12:33 COPYING
-rw-r--r-- 1 alexrothenberg staff 9216 Jan 13 12:33 README
-rw-r--r-- 1 alexrothenberg staff 8242 Jan 13 12:33 Rakefile
drwxr-xr-x 4 alexrothenberg staff 136 Jan 13 12:33 ext/
drwxr-xr-x 3 alexrothenberg staff 102 Jan 13 12:33 extras/
drwxr-xr-x 6 alexrothenberg staff 204 Jan 13 12:39 lib/
drwxr-xr-x 11 alexrothenberg staff 374 Jan 13 12:33 test/


Everything looks good and you can check this into git and now have a frozen version of the hpricot gem stored with your application.
But if we stop here, when we deploy to our production server we'd be using the native extensions we built on your laptop which may not work on the server if you have one is 32bit and the other 64bit or you have different OS libraries installed or any number of other reasons.

To be safe, we need to rebuild the native extensions on the server when we deploy. This is not as hard as it sounds as rails gave us the rake task rake gems:build. We can ask capistrano to run that command on the server by adding the following to your Capfile.


after "deploy:finalize_update" do
# build the native extensions for hpricot gem
run "cd #{release_path} && #{rake} RAILS_ENV=#{rails_env} gems:build GEM=hpricot"
end


Now when capistrano deploys in with all the other messages you'll see something like


...
* executing "cd /opt/apps/my_project/releases/20100108185109 && rake RAILS_ENV=production gems:build"
servers: ["your.server.com"]
[your.server.com] executing command
** [out :: your.server.com] (in /opt/apps/my_project/releases/20100108185109)
** [out :: your.server.com] Built gem: '/opt/apps/my_project/releases/20100108185109/vendor/gems/hpricot-0.8.2'
command finished
...


So rails give us a few simple patterns to follow to freeze our gems in the vendor folder and with a few lines in you Capfile you can use this pattern to vendor a gem with native extensions.

Formatting rules of UseModWiki ...

7 months ago | Niranjan Sarade: InLoveWithNature

In continuation of my previous post Formatting Rules, you will find this link very useful :- http://www.usemod.com/cgi-bin/wiki.pl?TextFormattingRules

Radio silence.

7 months ago | Megan Blocker: Queenie Takes Manhattan

Hello, my lovelies! It's been a crazy few days chez Queenie, and promises to remain so for at least another day or two. That means I have to shy away a bit from my bloggerly duties this week. Rest assured I miss you all and will be back in full force later this week. In the meantime, I'll be doing my real job and dreaming of a getaway.

Hawaii? Paris? I can't decide! Which would you choose? (Never mind that it's a complete fantasy either way, at least until that tax rebate comes through.)

Android - Microwave & Laundry

7 months ago | Lalatendu Das: Interpretations of Technorealism

Touch Revolution has brought Android to home appliances. At CES Las Vegas, they showcased Nimble NIM1000 module, which allows OEMs to easily embed touch screen android into any home appliances.

Checkout..Android Microwave


Android Laundry:

30 must have RSS feed for web designers and developers

7 months ago | Lalita Chandel: Emotional Intelligence


http://www.webdeveloperjuice.com/2010/01/09/30-must-have-rss-feed-for-web-designers-and-developers-opml-file/

The decade in retrospect: Story of innovators, imitators and idiots

8 months ago | Lalatendu Das: Interpretations of Technorealism

As we closed on a momentous decade, I wonder what impact the events of the decade will have on our future. In retrospect, I can summarize the decade (borrowing from Warren Buffet: http://tinyurl.com/3pwx7m) as the story of three I's..that of Innovators, Imitators and Idiots.

The decade started with the waning euphoria of new dot-com economy and ended with probably the greatest recession seen since the great depression of 30's. On hindsight the great financial disasters (dot-com bubble or the sub prime crisis) are marked by some great innovations.

Analyzing the dot-com bubble, Innovators in Netscape, AOL, Google, Yahoo and Amazon redefined the way internet was perceived. Traditional heavy-weights like Microsoft, Cisco and Time-Warner realized the potential of the new economy started imitating to a great extent. However things go awry when the idiots arrived, whose avarice undid the very innovation they were trying to use to get rich. Easy money flowing in from IPOs, venture capital funds were spent on massive advertising campaigns without giving any thoughts to the long term commercial viability of the product at hand.

The decade also saw, some of the greatest financial product innovation from the traditional investment banking firms of Wall street. In the process the world economy got intertwined as never before. The world economy grew at a scorching pace in the later half of the decade till..the over indulgence tool over. Early warnings were overlooked and we saw some high-risk transactions on already high leveraged market. When reality caught on..the fall was steeper than anything in recent memory.

Both the above mentioned events have a lasting impact on the ways of doing business. As we look forward to a new decade, I am sure there would still be innovators. There would still be smart imitators who would be willing to cash on the innovations as they happen. However it would be interesting to see what the idiots learnt from the previous decade.

Queenie's Treasury

8 months ago | Megan Blocker: Queenie Takes Manhattan

It's a cold, clear Saturday here in New York, and I spent my afternoon hanging out with my friends Jordan and Miya and their adorable daughter, Emi. We ate eggs in purgatory (delicious) and drank copious amounts of coffee. After lunch, I walked home across Central Park and just generally enjoyed the crisp glory that is New York in winter.

And then I realized - hey, I need to write a Treasury post! So here I am, and here we go.

First up, a craving-inducing Flickr group from the folks at A Hamburger Today. A whole photo pool full of mouthwatering burger shots. And more burger shots. I die, truly. I warn you - do not click through if you're not ready to give in and have a burger for dinner.

Next, a potentially exciting development in the world of unctuous goodness: could chicken skin be the next bacon? As a major fan of Kasadela's grilled chicken skin on a stick, I applaud this potential shift, especially it's tip-to-tail sensibility. Bring on the crispy skin, I say.
Finally, something that makes your brain happy, as opposed to just your tummy. Some gorgeous, fun pieces from pop pop portraits, one of my favorite Etsy sellers. I just love Helena's fashion-oriented, nostalgic aesthetic. I wouldn't mind having her paint my portrait, so long as she helps me choose the outfit as well. (Discovered these a while ago, but was reminded of them by PVE Design!)

Truncate string in ruby

8 months ago | Gourav Tiwari: easy_software = Agile.find(ruby_on_rails)

I was looking for a ruby method in my Ruby on Rails project which can truncate a string, say after 50 characters.

I found 'truncate' method, which is a rails api method for truncating string in views.
So if have string
str = "Hi, this is Gourav Tiwari, how are you??" # total 40 characters
the truncate method can be used in the ciew like this:
truncate(str, :length => 25, :ommision => " - - -")
and the result would be :
"Hi, this is Gourav Tiwari, - - -"

In ruby I can accomplish same by slice and concatenation:
myproject>ruby script\console
>> str = "Hi, this is Gourav Tiwari, how are you??"
=> "Hi, this is Gourav Tiwari, how are you??"
>> str.slice(0..25)
=> "Hi, this is Gourav Tiwari,"
>> str.slice(0..25) + " - - -"
=> "Hi, this is Gourav Tiwari, - - -"

Very simple!

There is more to leading a self-organizing team than buying pizza and getting out of the way....

8 months ago | Biju Bhaskar: Thoughts on enterprise application development...

 Leaders influence teams in subtle and indirect ways. Great post from Mike Cohn...

http://bit.ly/6iRRqh

Have seen many of our Scrum Masters/ leaders struggle achieving this subtle balance between command and influence Mike is talking about. This is a great skill to have.

Having said that, occasionally one will have to consciously let the team fail, as long as they learn from it and the impact is minimal.

Practice, practice, practice....learning this skill will take you a long way.

McKQ: Good Boss, Bad Times

8 months ago | Erika Santos: Santos on Technology and Life

Great insight from Robert Sutton, author and Stanford management professor, on how to be a good boss in today's difficult climate.

http://www.mckinseyquarterly.com/App_Themes/v2.0/swf/external_player.swf

Fixing invisible pages in JQGrid

8 months ago | Gourav Tiwari: easy_software = Agile.find(ruby_on_rails)

Playing more on JQgrid plugin from 2dconcept, I faced a strange issue. Sometimes it skips some pages.

For example if you have total 15 pages, and you navigate till 6th page and then you hit next page button on the grid, it will not show you the 7th page! you have to click next page button once more to see the 8th page. So where the 7th page is gone?


No, it's not invisible, it's all hidden in json response.

When I saw the response for page 7 (using firbug), it was coming well, but the grid was not showing the 7th page at all. I dug into the library file more and figured out that, if in the response you have a double quote, it will not display that page.

Say you have this json response:
{"page":"1","total":1,"records":"1","rows":[{"id":"7","cell":["gourav tiwari hel"lo!","this","should","be right!"]}]}
 

See the double quote in the response.
 

I tried using to_json library method, but it actually removes all the double quotes, even the necessary ones as well. So not a good idea. I extended to_jqgrid_json method like this:
module JqgridJson
def to_jqgrid_json(attributes, current_page, per_page, total)
json = %Q({"page":"#{current_page}","total":#{total/per_page.to_i+1},"records":"#{total}")
if total > 0
json << %Q(,"rows":[)
each do |elem|
elem.id ||= index(elem)
json << %Q({"id":"#{elem.id}","cell":[)
couples = elem.attributes.symbolize_keys
attributes.each do |atr|
value = get_atr_value(elem, atr, couples)
value = value.is_a?(String) ? value.gsub(/"/, '\"') : value # added this line
json << %Q("#{value}",)
end
json.chop! << "]},"
end
json.chop! << "]}"
else
json << "}"
end
end
end

And the response become this:
{"page":"1","total":1,"records":"1","rows":[{"id":"7","cell":["gourav tiwari hel\"lo!","this","should","be right!"]}]}

 
No invisible page in JQGrid anymore!

Introducing...3D TVs!

8 months ago | Erika Santos: Santos on Technology and Life

Brrrrr!

8 months ago | Megan Blocker: Queenie Takes Manhattan

It's freaking freezing in New York this week, and what better excuse for copious amounts of hot chocolate and cozy couch time than frigid weather?

In that spirit, I direct your attention to this vintage Queenie post, which contains the best recipe for hot chocolate I've found yet. It comes to us courtesy of pastry genius Pierre Hermé, and is the closest thing to Prague hot chocolate around. (That's high praise, as far as I'm concerned.)

Enjoy, and stay warm!

Engaging externally - Kudos to the team!

8 months ago | Biju Bhaskar: Thoughts on enterprise application development...

 2009 was a great year for us when it came to engaging with external world. We were more porous than previous years. It facilitated two way learning....as we learned from the external world, and external world learned from us. Great job team!

Some highlights....

- We hosted our own first Application Development conference
- Our folks presented at major industry conferences (like Agile 2009 and RailsConf)
- We continued to engage with great external coaches and other thoughtleaders in the industry (some on pro bono basis)
- Many of us have continued, or started blogging externally
- Our developers contributed code to opensource
- Our folks took lead in starting new meetup groups, and also contributed to many
- Outside firms (including non-profits) continued to reach out to us to learn about our agile transition success story

...and many more.

Considering that our budget situation did not allow our folks to attend any conferences, or bring in external experts in '09 .... that is an awesome start... miles to go though...

Pomodoro

8 months ago | Riju Kansal: Riju's Thoughts Captured...

I just started using a useful time management technique and would like to record some details about the same for sharing and future reference.

The Pomodoro Technique™ is a way to get the most out of time management. Turn time into a valuable ally to accomplish what we want to do and chart continuous improvement in the way we do it.

The basic unit of work in the Pomodoro Technique™ can be split in five simple steps:

  1. Choose a task to be accomplished
  2. Set the Pomodoro to 25 minutes (the Pomodoro is the timer)
  3. Work on the task until the Pomodoro rings, then put a check on your sheet of paper
  4. Take a short break (5 minutes is OK)
  5. Every 4 Pomodoros take a longer break

http://www.pomodorotechnique.com/resources.html

Try it!!!

On the Road Less Travelled

8 months ago | Amy Grandov: Technology for Social Innovation

It's January again - the start of a new year, and now a new decade. Between celebrating the holidays and catching up with friends and family, I had some downtime to reflect on 2009. One particular highlight of the year put me back in touch with the joy of taking a chance and venturing into unfamiliar territory, and has me thinking of ways to take more risks in 2010.

Last September, I started Coro's Leadership New York program, joining a cohort of 51 New York City professionals from the public, private and nonprofit sectors to learn how to lead change for the public good. A core component of this part-time program requires participants to form self-directed subteams and plan and facilitate an "Issue Day" workshop. Each month, an Issue Day takes us across the city and into the boroughs to meet with influencers and decision makers and explore a public policy issue.

Planning my Issue Day was a definite highlight for 2009. At Coro's kickoff meeting, I signed up for the first Issue Day team available. With the smallest team and the least time to prepare, we had our work cut out for us - but the challenge was part of the attraction. I lucked into an amazing group of 5 people who were willing to pass over a laundry list of good, safer options to choose Major Depression as our public health/social services issue to explore.

We were initially surprised to see that recognizing and treating Depression was a top 10 public health priority for New York City, alongside reducing smoking and preventing HIV. We struggled to get our arms around a definition of Depression that we all agreed with, how to approach it as a public issue, and how to build and engaging and interactive day around a heavy topic. There was something about the topic that compelled us to stay with it, though, in a way the more straightforward options did not.

We debated how to accomplish two important but competing goals: drawing out honest, diverse, and potentially controversial viewpoints about mental illness while creating a safe space from stigma. What started as policy analysis expanded to involve an exercise in structuring difficult conversations that can be productive and respectful.

The day itself went smoothly and we received positive feedback from participants. But what I will remember most fondly in future years will be that our team of strangers took a chance and followed the less certain path.

So part of my goal for 2010 is to be more open to seeing opportunity in uncertainty.

"I shall be telling this with a sigh
Somewhere ages and ages hence:
Two roads diverged in a wood, and I—
I took the one less traveled by,
And that has made all the difference."
The Road Not Taken - Robert Frost


See also:
http://www.fountainhouse.org/
http://www.bringchange2mind.org/
http://www.nyc.gov/html/doh/html/tcny/index.shtml

Google's Nexus One On Sale

8 months ago | Erika Santos: Santos on Technology and Life



Today, Google unveiled its much anticipated Nexus One smart phone. Woohoo!!

It has a 3.7-inch touchscreen, 5-megapixel camera, wi-fi connectivity, accelerometer, compass, and more. The phone runs on the latest version of Android OS, Android 2.1, also made by Google.

But perhaps the most exciting news is that Nexus One will be able to run on any telephone service provider. T-Mobile is the initial service provider, selling you the phone for $179 with a two-year contract. You can buy the same phone unlocked for $529.

Source: CNNTech

Happy New Year!

8 months ago | Biju Bhaskar: Thoughts on enterprise application development...

Happy new year everyone!

Easy-peasy.

8 months ago | Megan Blocker: Queenie Takes Manhattan

My friend Cristin came over for a cheese & chocolate-filled dinner on New Year's Eve. After the marathon of cooking that comprised the week of Christmas, I wasn't quite ready to do a full-scale four-course dinner, so I decided on something a bit simpler. I left out the meat course, and instead settled on a browned-butter butternut squash risotto (recipe to follow shortly), molten chocolate cakes, and an oozy, champagne-friendly Brillat-Savarin to finish.

I promise details on the risotto and the cheese, but first, the cakes. These cakes, based on Jean-Georges Vongerichten's iconic version (What dessert better defines the 1990s?), are pretty much the easiest dessert in the history of the world. You melt chocolate and add it to eggs beaten with sugar, then spike it with a bit of vanilla and espresso. Oh, and, there are two teaspoons of flour in there, too. Yes, just two teaspoons.

The cakes bake at a high temperature (450°F) for just a couple of minutes, and then they're ready to go. They're best when served with some lightly whipped cream, but they do pretty well on their own, too. And since they take about 15 minutes total to whip up, they work as a mid-week treat as well as a dinner party finale.

Molten Chocolate Cakes
Adapted from Jean-Georges Vongerichten & Mark Bittman

You can use any kind of custard cup, ramekin or mold for these cakes; my favorite cookware for these are the fluted brioche molds I picked up in Paris last year!

8 tablespoons (1 stick) unsalted butter, plus more for molds
2 teaspoons all-purpose flour, plus more for dusting molds
4 ounces very good bittersweet chocolate
2 large whole eggs
2 large egg yolks
1/4 cup sugar
2 teaspoons instant espresso powder
1 teaspoon vanilla extract

Butter and lightly flour four 4-ounce molds, ramekins, or custard cups. Tap out excess flour; butter and flour them again, and set aside. (Don't skimp on this - you definitely need to double-grease and flour these.

Gently melt the butter and chocolate together in the top of a double boiler (You can fashion one yourself using a heatproof bowl and a pan of simmering water.). Heat until the chocolate has almost completely melted, then stir to combine evenly. Cool slightly.

In the bowl of an electric mixer fitted with the paddle attachment (or using a hand-held mixer and a medium bowl), beat together eggs, yolks, and sugar until light and thick. Add melted chocolate mixture, and beat to combine. Quickly beat in flour, espresso powder and vanilla until just combined. Divide batter evenly among the molds.

(At this point, you can refrigerate the cakes until an hour before you're ready to bake them off. Just cover with plastic wrap and store in the refrigerator for up to a day. Remove from the fridge about an hour before you're ready to bake them.)


Preheat oven to 450 degrees. Place filled molds on a rimmed baking sheet, and bake until the sides have set but the centers remain soft, 4 to 6 minutes.


Invert each mold onto a plate, and let rest 10 seconds. Unmold by lifting up one corner of the mold; the cake will fall out easily onto the plate. Serve immediately.


Serves four; easily divides to feed fewer or multiplies to feed more.

Lean principles

8 months ago | Riju Kansal: Riju's Thoughts Captured...

While going thru a book on Lean Principles by Mary & Tom Poppendieck, I want to preserve quick notes, which form the essence of the lean approach to software development.

1. Eliminate waste - Whatever gets in the way of rapidly satisfying a customer need is waste
2. Amplify Learning - Encourage learning and discovery instead of first time perfect approach.
3. Decide as late as possible - In an evolving market, keeping design options open is more valuable than committing early.
4. Deliver as fast as possible - Design, implement, feedback, improve. The shorter these cycles are, the more can be learned.
5. Empower the team - Involving developers in the details of technical decisions is fundamental to achieving excellence.
6. Build integrity in - integrity comes from wise leadership, relevant expertise, effective communication, and healthy discipline; processes, procedures, and measurements are not adequate substitutes.
7. See the whole - When individuals or organizations are measured on their specialized contribution rather than overall performance, suboptimization is likely to result.

Reference: http://www.poppendieck.com/ld.htm

Ryan's_Video_Railscasts.to_s

8 months ago | Niranjan Sarade: InLoveWithNature

ASCIIcasts are text versions of each Railscast developed by Ryan Bate, each with a link to the original video. So if we want to refer the text version of the railscasts, just refer this link :-

http://asciicasts.com/

Ruby/Rails Tool Box

8 months ago | Niranjan Sarade: InLoveWithNature

Here is a good link for Ruby/Rails tool box which has collection of many utilities/tools to address different development life cycle concerns like deployment, testing, code metrics, continuous integration, project management and many more ...

http://www.ruby-toolbox.com/

My Doughnut Plant obsession endures.

8 months ago | Megan Blocker: Queenie Takes Manhattan

Remember how I swore I'd never try a Doughnut Plant doughnut away from the place of origin ever again? Well, that was until I showed up at Joe The Art of Coffee super-hungry (no breakfast, no lunch) one day last week. On offer? One of Doughnut Plant's seasonal cake doughnut flavors: pomegranate.

Oh. My. Gah.

This doughnut was absolutely delicious. A combination of almost-savory cake and a sweet, pomegranate seed-studded glaze. Just - wow.

I stand corrected.

Oh, and the cappuccino was darn good, too.

Droid vs Nexus One

8 months ago | Lalatendu Das: Interpretations of Technorealism

Queenie's Treasury

8 months ago | Megan Blocker: Queenie Takes Manhattan

Welcome to the first Treasury of 2010, guys! I hope you enjoy the tidbits I've gathered here for you today. I'm spending most of my day cleaning the apartment, packing up the decorations and generally getting ready to go back to work on Monday after two crazy weeks off. At some point, I have to do laundry. Sigh. But, in the meantime...

This week the New York Times had a fun story on the resurgence of the bar cart. Driven in equal parts by the cocktail revival and the vintage obsession fueled by Mad Men, it's one of the best decor comebacks ever, in my opinion. I'm on the lookout for a small version, preferably no more than 20 inches wide, to tuck in next to my Expedit bookcase. Any ideas?

Asian Jewish Deli, one of my favorite foodblogs (not least for the incredible photography) recently spent a week cooking from the new Momofuku cookbook. Ramen, banh mi, pork buns, Fuji apple salad...all tackled, and all gorgeous. If you're curious about how the book measures up, you must read this series of posts.

Finally, a little shelter blog action for you. The Little Big House is a blog about three sisters (one of them an architect, one a photographer) who've bought a Greek Revival fixer-upper in the Catskills. It's a renovation blog, yes, but also features great style and decor tips along with stories of plaster and sheetrock. As someone who's been eyeing property upstate herself, I have to say I'm hooked!

Ring in the new year with a riot of color.

8 months ago | Megan Blocker: Queenie Takes Manhattan

Happy New Year!

If you're at all like me today, you're getting off to a late and slightly shaky start, and are looking for excuses to curl up cozily for the remainder of the day. That's where this next bit comes in...

If you haven't been reading Maira Kalman's And the Pursuit of Happiness blog in the New York Times, now's the time to check it out. The last installment was published today, and you can read the whole set over here.

The pieces are a set of musings on the history and meaning of the United States. What does it mean to be American, and what does it mean, this "pursuit of happiness?" It's a beautiful series, full of Kalman's signature swirling illustrations, saturated with color and full of energy and life. She visits Mount Vernon, explores the locavore & organic movements with Alice Waters and discusses the life of Benjamin Franklin. For starters.

The blog will be turned into a book, to be published in October of this year (Yes, 2010 - this year!). I, for one, can't wait.