Logo

20 minutes to 4 seconds - Excel your excel's

about 1 year ago | Rohan Daxini: Rohan Daxini

SpreadsheetGear 2009 for .NET reduced the time to generate a critical Excel Report "from 20 minutes to 4 seconds" making his team "look like miracle workers" according to Luke Melia at Oxygen Media in New York. Microsoft chose "SpreadsheetGear"


With SpreadsheetGear controls, a 6,000 KB Excel workbook is loaded into the WorkbookView control in less than a second. This is over 100 times faster than other controls being tested so far.

Robbe Morris (Microsoft MVP - C# Co-founder of EggHeadCafe.com and former Gartner Sr. Software Engineer) says "ASP.NET and Microsoft Excel is a dangerous combination. ASP.NET and SpreadsheetGear is a match made in heaven. When you need your web or Windows app to interact with Excel files with lightening speed and no COM crashes, SpreadsheetGear for .NET is what you use. This product truly separates the men from the boys in the spreadsheet control marketplace."

With one safe managed assembly, SpreadsheetGear 2009 enables developers to easily add scalable ASP.NET Excel Reporting, dynamic Dashboards from Excel Charts and Ranges, powerfulWindows Forms Spreadsheet Controls, comprehensive Excel Compatible Charting, the fastest and most complete Excel Compatible Calculations and much more.

Simon Black (Software Architect, Nokia) says "SpreadsheetGear for .NET is a fantastically powerful spreadsheet component which is very easy to use and expand. We delivered our mandatory customer requirements well before time so we had plenty of time to implement the nice-to-have requirements nobody ever manages to deliver."

I will be evaluating SpreadsheetGear control this weekend so will post more details soon but initial feedback from top architects sounds very impressive.

Closer to home.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

There are some weekends that end up so jam-packed that I just don't have time to make it down to the Union Square Greenmarket. It might be work that needs catching up on, or laundry to be done before a trip, or just too many obligations all around. On those weekends, I'd always resigned myself to grocery store sourced produce - but no longer.

One recent weekend, I decided to check out the Greenmarket's Saturday outpost at 82nd and 1st. I was utterly convinced that there would be little on offer that could compare to the Union Square pickings, and I was wrong. Though the selection is notably smaller, the quality of the produce is just as good as what you can find at Union Sqaure.

When I visited, there were piles of eggplant, some lovely peaches, gorgeous peppers, and - of course - mountains of summer squash and zucchini.

The 82nd Street market is tucked behind St. Stephen's, a Franciscan church, and uses the church's parking lot to house its meat, bread and cheese vendors. Ardith Mae had a beautifully spare display - their chalkboard-and-bare-wood aesthetic screamed "CHEESE" to me. (Their website is great, too - check it out for cute pictures of their goats.)

I walked home laden with potatoes, peaches, tomatoes, peppers, cucumbers and onions - not bad for a two-block walk and no subway ride. I might be a convert!

Cloud Taxonomy

about 1 year ago | Lalatendu Das: Interpretations of Technorealism

'Cloud', probably is the most over used word in the IT Industry in 2009. Big enterprises to small start-ups alike are rushing in slew of cloud based products to rake in first mover advantage. The usage of the term 'cloud' is getting muddled in the process.

I was pleasantly surprised to see a Forrester research paper on a 'Proposed Cloud Taxonomy'. Sharing the excerpts to clarify confusion around what 'Cloud' really means.

The article proposes to map all cloud flavors in the following two dimensions:
- Level of Sharing: Extent of sharing infrastructure services or business applications with other companies and tenants
- Business Value: Complexity of business process



As the diagram suggests, most of today's existing software products and services can be positioned along a level-of-sharing axis and a business value axis. The illustration uses a cloud symbol for services that will resonate as cloud services, while a squared box represents other concepts that should not be simply relabeled as cloud services.

A classic.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

When I stepped off the bus in Rhode Island a few weeks back, Aunt Cathi declared that we would do some shopping for dinner, and then visit Al Forno for a pizza and cocktails.

I'd heard of Al Forno, but had never visited before. Legendary in New England for its thin-crust pizzas and n0-reservations policy, Al Forno has been central to Providence's dining scene since the day it opened in 1980. For years I listened to people on eGullet wax eloquent about Al Forno's superlative pizza - and now, finally, here was the chance to try for myself.

Since we arrived about five minutes after the restaurant opened at 5 o'clock, Cathi and I were able to snag a table in the arbor-covered garden, where we ordered a margherita pizza and two cosmopolitans.

The cosmos arrived first. Now, as you all know, I am much more a gin girl than a vodka girl - but these cosmos really were spectactular. They were what cosmos are supposed to be. The sickly, syrupy pink cocktails you saw on Sex And The City were a poor substitute for a good cosmopolitan. A proper cosmo should put you in mind of a slightly pink gimlet (made with fresh lime juice), not a CapriSun.

These were proper cosmos.

Then came the pizza. What can I say? It was delicious. The tomato sauce was rich with deep flavor, the two kinds of cheese (mozzarella and parmesan) contrasted fresh with rich, and the shaved scallions on top lent the pizza a fresh, peppery bite that I loved.

I see what all the fuss is about, and I'll definitely be back.

Google Doodle

about 1 year ago | Sarika Nagvekar: Chain Management



Google Doodle was on Google's 8th birthday

Student Syndrome-It

about 1 year ago | Sarika Nagvekar: Chain Management

Student Syndrome-It refers to the phenomenon that many people will start to fully apply themselves to a task just at the last possible moment before a deadline.

Queries on 2009-06-25

about 1 year ago | Sarika Nagvekar: Chain Management

Michael Jackson-related on Google was first interpreted as an attack on its service. The spike in queries began at about 2:45 p.m. PDT Thursday, and Google thought the traffic was an attack for about 25 minutes.

Enterprise 2.0: Skip the Pilot

about 1 year ago | Michael Idinopulos: Transparent Office

Get out your pitchforks, I'm about to commit Enterprise 2.0 heresy. There's an orthodoxy in Enterprise 2.0 circles about how you're supposed to run an implementation. The orthodoxy goes something like this: Start with small-scale pilots, define your business objectives,...

Client-side Technologies II: Cool things about HTML and upcoming features

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

I never realized that HTML is so powerful. With it's latest version HTML 4.0.1 released way back in 1999, it has several features, which makes HTML another important ingredient in Client-side Technologies.

HTML is a language, which is today understood by all browsers(rendering engine) and the rendering engine of browser converts this code in HTML in graphics.

A brief description of HTML and history can be find here

HTML version 4 is there for quite sometime and has several features (refer to http://htmlhelp.com/reference/html40/new.html): There are some new elements added like ABBR, IFRAME, BUTTON, OBJECT, SPAN, TBODY, etc now integral part of web page development.

Key Features:
1. Separation of Structure and Presentation: Now you can use same structure of web content and achieve different look and feel. This is important because you need different presentations on different devices of latest technologies, for exanple rails application on laptop and mobile needs different presentation.

2. Accessibility: With addition of elements like IFRAME, TBODY, SPAN, FIELDSET, etc, and the freedom from device/structure the web has now more clear outlook and have more bigger set of users (including users having low-vision, blindness, color-blindness with different browsing environments, large fonts, special colors, speech synthesizers, and Braille tactile feedback devices.

3. Internationalization: With rich Universal Character Set, HTML 4.0 supports almost all of the world's language.

4. Style Sheets: New hooks for CSS like ID, STYLE and CLASS help in attaching different styles. Also, MEDIA can be used to specify media and TYPE for style sheet language.

5. Client side scripting: SCRIPT element allow you to add client side scripting using LANGUAGE attribute. NOSCRIPT element also included in case any broser does not support the scripting or user disable the scripting in browser.

6. Frames: It gives developers a freedom to use multiple documents in a single window, i.e. multiple independent windows or subwindows in a single window(web page).
Multiple views offer designers a way to keep certain information visible, while other views are scrolled or replaced. For example, within the same window, one frame might display a static banner, a second a navigation menu, and a third the main document that can be scrolled through or replaced by navigating in the second frame.

7. Advanced Tables: You can group rows and columns together, i.e. by using row groups (THEAD, TFOOT, TBODY) you can render static header and footer rows with scrollable body rows.

And, HTML 5.0 Well not very near, if you believe on sources online it will take 10-12 years more to have a latest HTML version officially!

So, what's new in HTML 5.0? It will support various new elements and browsers like firefox, opera, safari, etc started supporting these elements now.
At the same time it will be backward compatible.

Several new APIs for better web application design:
* 2D drawing API which can be used with the new canvas element.
* API for playing of video and audio which can be used with the new video and audio elements.
* An API that enables offline Web applications.
* An API that allows a Web application to register itself for certain protocols or media types.
* Editing API in combination with a new global contenteditable attribute.
* Drag & drop API in combination with a draggable attribute.
* API that exposes the history and allows pages to add to it to prevent breaking the back button.
* Cross-document messaging.

New elements provide additional features, like ruby, rt and rp allow for marking up ruby annotations.

Here is a quick reference to find difference in HTML 5.0 and 4.0

Interesting features! Well I am not stopping here.. next will be XML.

Value in simplicity

about 1 year ago | Mark Mintz: Mark Mintz

In looking through my Twitter stream the other day I came upon an interesting tweet from Andrew McAfee pointing to an article in Wired titled The Good Enough Revolution: When Cheap and Simple Is Just Fine. It's an extremely insightful read, especially in light of the work I referenced in my recent posts around finding solutions to user problems. If I could sum up the article into a key takeaway it has to be the paragraph below:

The world has sped up, become more connected and a whole lot busier. As a result, what consumers want from the products and services they buy is fundamentally changing. We now favor flexibility over high fidelity, convenience over features, quick and dirty over slow and polished. Having it here and now is more important than having it perfect. These changes run so deep and wide, they're actually altering what we mean when we describe a product as "high-quality."
I believe this concept applies to enterprise IT products and projects as much as it applies to consumer products. IT projects can no longer be mega-projects that deliver overly complicated solutions that attempt to solve every conceivable problem, real or perceived. Instead we need to be quick to market and deliver focused solutions that solve a small number of the right problems. What I think is also important to note is the interpretation of "quick and dirty" and what is meant by "having it here and now is more important than having it perfect". To me, in the context of this article and enterprise IT, "quick and dirty" means a short time to market and delivering the simplest possible solution that solves the right problem, or at least the most important 80% of the right problem. Quick and dirty does not mean cutting corners or sacrificing technical quality (e.g, bugs, poor performance, poor code quality, etc.) to get products out the door. Similarly having it here and now rather than having it perfect does not refer to a lack technical quality but to the need for quick delivery of a product that targets a single or small number of the key problems in an extremely easy to use manner and does nothing more.

I recommend reading through the whole article and also Andrew's blog post on the same topic.

For me, these articles re-enforce the notion that we need to truly understand how our users work and the issues they face in day to day work so that we can solve the right problems and understand what quick and simple solutions could be.

Cognos 7.4 Transformer on UNIX Version

about 1 year ago | Abhishek Dharga: Face The Truth

Why Use Transformer on UNIX?
Transformer on UNIX offers additional capabilities to those available with Transformer on
Windows, including
• increased performance. Depending on the size of the server, Transformer on UNIX may be
able to generate models and cubes faster than local processing on a computer.
• easier integration of cube builds and data warehouse updates. It is easier to integrate these
processes if they both run under the same operating system.
• faster processing. If your database resides on the same UNIX server, processing performance
and build times may improve as a result of a reduction in network traffic.

The Client-Server Communications Process
When you use the Server menu to issue commands from Transformer on Windows to Transformer on UNIX, Transformer on Windows and Transformer on UNIX communicate according to the following process:
1. Using a Windows Sockets compliant TCP/IP connection, Transformer on Windows passes the
request to the network daemon (udanetd), the PowerGrid network daemon.
2. The network daemon receives the request, starts Transformer on UNIX (rsserver), and
connects it to Transformer on Windows. After that, Transformer on Windows and rsserver
communicate directly with each other via TCP/IP and library routines. The rsserver program
gets information in the form of Model Definition Language (MDL) verb statements from
Transformer on Windows. The rsserver program uses settings defined in the environment
where PowerGrid was started and searches for the Transformer preferences files (trnsfrmr.rc
and .trnsfrmr.rc) that provide additional operational settings.
3. Once started, Transformer on UNIX carries out the requests, such as generating categories for a model or creating cubes, on the server.
An important part of this communication process is synchronization.

Before you can create server models and cubes, you must ensure that
• both PowerGrid udanetd and Transformer on UNIX are installed and configured on the
computer where you will be creating server cubes.
• a local connection is defined on the Windows computer for the server where udanetd and
Transformer on UNIX are installed.
the server environment is set up so that Transformer on UNIX creates models and cubes
where and how you want them created.

Define a Client-Server Connection
Add a Connection Using NetInfo
NetInfo is a utility that enables you to add and test connections to PowerGrid on the server.

Steps to Create a Connection
1. Start NetInfo.
2. From the File menu, click Edit Connections.
3. Click New to add a new connection.
4. In the Network Type box, click Windows Sockets TCP/IP.
The entries shown depend on what is defined in your cogconnect.ini file. By default,
cogconnect.ini contains an entry for Windows Sockets. However, it may contain additional
entries if you are using other IBM Cognos products.
5. In the Host Name box, click or type the name of the server on which PowerGrid and
Transformer on UNIX are installed.
If NetInfo is able to find a Hosts file, it will provide you with a list of host names from that
file. If no Hosts file is found, you must type the name or the IP address of the server on which
PowerGrid and Transformer on UNIX are installed. If you don’t know the name of the server,
contact your network administrator.
6. In the Host Type box, click UNIX.
7. In the User Name box, type your login ID for the computer specified in the Host Name box.
Transformer uses this ID when connecting to the server.
Note: Under certain circumstances, you must click the Setup button to change the local
configuration for the connection you are creating. If the network port ID was not set to 1526
when PowerGrid was configured, you must change your local port setting to match the
network port ID. If it was set to 1526, you can skip steps 8 to 10 and proceed to step 11.
8. Click Setup.
9. Click Use Specific Port for This Connection, and type a number for the network port.
Your local port ID must match the network port. In the following example, the
cern/bin/netpgrc script on the server where PowerGrid is running shows the value 3125.
Therefore, you would type 3125 in the Use Specific Port for This Connection box.
# port number
NPNETD=3125
10. Click OK, and click Save.
11. In the Connection to be Saved box, type a name for your connection, click OK, and then click
Done.


Test a Connection Using NetInfo
Once you have defined a connection, and before you issue a command to Transformer on UNIX
for the first time, use NetInfo to test the connection. Using NetInfo is similar to using a ping utility when testing network connections; it verifies that messages are being sent to udanetd, and that udanetd is responding to them.
Steps to Test a Connection
1. Start NetInfo.
2. From the Network menu, click Test Connection.
3. In the Connection Name box, double-click the name of the connection you want to test.
NetInfo sends a test packet to udanetd via PowerGrid.
If the connection is working correctly, NetInfo shows a message that looks like this:
Network: Microsoft Windows Sockets Version n
The current address is ‘[142.80.66.251#0]’
---- Test ‘1’ ----
Reply received from udanetd owned by ‘root’ [PID=’818’]
If the connection is not working, verify that
• udanetd is running on the server
• the port number defined for your connection matches the one defined on the server


Transformer on UNIX Shell Scripts
When PowerGrid starts Transformer on UNIX, it does so using an entry in the cogconnect.ini file.
The entry looks like this:
[Service - Transformer Server]
NETWORK=rsserver.sh
PowerGrid udanetd uses the shell script rsserver.sh to start Transformer on UNIX when a request is issued from Transformer on Windows. Before you attempt to use Transformer on UNIX, ensure that the Transformer server service is defined in your cogconnect.ini file and that the shell script is in the search path when starting udanetd on the server. You can also edit your rsserver.sh file to set up environment variables, which Transformer on UNIX uses to generate models and create cubes.
Note: If the Transformer server service is not defined in the cogconnect.ini file, run the
Configuration Manager to apply Transformer configuration parameters.

Update a PowerCube Connection in Cognos 8

about 1 year ago | Abhishek Dharga: Face The Truth

Update a PowerCube Connection
If a PowerCube has been rebuilt, you can update the connection information without affecting
current users. To do this, you must first update the connection information to the rebuilt PowerCube, and then refresh the report servers to use the rebuilt PowerCube for new connections.
The updated PowerCube will be used for all new sessions referencing that data source. Any user
that has an active session against the data source may have to re-open their session. Old PowerCubes can be removed only after all sessions using that PowerCube have ended.
When you rebuild the cube, we recommend that you use a new name for the PowerCube, such as
including the current date in the new name. You can then store the rebuilt PowerCube in the same location as the old PowerCube. For convenience, Cognos provides the sample script cubeswap.bat or cubeswap.sh that is located in the c8_location/webapps/utilities/cubeSwap directory. You can get more information about the script syntax by running the script without any parameters.
Tip: You can automate this task using the Cognos 8 SDK to hot swap PowerCubes. For more
information, see the SDK Developer Guide.
For information about refreshing report service connections, see

Steps
1. In Cognos Connection, in the upper-right corner, click Launch, Cognos Administration.
2. On the Configuration tab, click Data Source Connections.
3. Click the data source representing the cube you want to update.
4. Click the set properties button for the connection you want to update.
5. Click the Connection tab.
6. Click the edit button for the connection string.
7. Change the file path and name to point to the rebuilt cube.
Tip: To test whether parameters are correct, click Test. If prompted, type a user ID and password
or select a signon, and then click OK.
8. Click Close, and Close again, then click OK, and OK again to return to the data sources page.
9. In the left pane, click Dispatchers and Services.
10. Click the refresh report service connections button .
Any new connections to the PowerCube will use the updated cube.

Refresh Report Service Connections

If a PowerCube has been rebuilt, you can update the connection information without affecting
current users. To do this, you must first update the connection information to the rebuilt PowerCube, and then refresh the report servers to use the rebuilt PowerCube for new connections.
Steps
1. Start Cognos Connection.
2. In the upper-right corner, click Launch, Cognos Administration.
3. On the Status tab, click System.
4. With all servers displayed, click the check box for the servers you want, and from the Toolbar
actions menu, click Refresh report service connections.

Tip: You can also do this from the Actions menu next to System, servers, and dispatchers. You
can also click the Configuration tab, and then click Dispatchers and Services, and then click
the Refresh Report Service Connections - Configuration button.
5. When the View the results page appears, ensure that the operation has been successful and then click Close.

Drill Through in IBM Cognos 8 Powerplay Cubes

about 1 year ago | Abhishek Dharga: Face The Truth

In IBM Cognos 8, drill-through targets are created in IBM Cognos Connection using package-based
(or model-based) drill-through definitions.
There are several benefits to authoring and storing the drill-through paths in IBM Cognos Connection
instead of in the Transformer model:
?The Transformer modeler does not need to specify any target reports or settings in the model
for the purposes of drill through.
? When changes to drill-through paths are required, the PowerCube does not have to be rebuilt
or updated.As a result, end users are less affected by cube rebuilds or updates.
? Drill-through paths can be defined by report or analysis users.
Because report or analysis users can define drill-through paths according to their needs, they
are less dependant on the Transformer modeler.

Note: In Transformer version 7.x, when the PowerCube was to be used in an IBM Cognos 8 drill throughdefinition, the Transformer modeler was required to enable the Allow drill through for this PowerCube check box on the Drill Through tab on the PowerCube property sheet. This ensured that the source value was passed as the business key during PowerCube to relational scenarios. In Transformer version 8.x, this is not required; the source value will always be passed as the business key to relational target reports.

What users really need

about 1 year ago | Mark Mintz: Mark Mintz

I came across this blog post entitled "What is User Experience Design" by Alla Zollers a PhD student at UCLA in the department of Information Studies. The post is the authors quick overview of user experience design. In reading through it I came to the following section that highlighted exactly what we are trying to achieve with the initiative I highlighted in my previous post, Where do solutions come from?:

... when Henry Ford built his first car, he was quoted as saying “If I’d asked my customers what they wanted, they’d have said a faster horse.” A company’s job is not to give users what they want, but to solve problems. The problems that companies are trying to solve are usually social, and so understanding people and how they interact with each other and their environment forms the key understanding and driving force of the product design and direction.

At the core, user experience advocates for the end-user and makes sure to bring the customer’s perspective into the decision making process. In order to achieve this user-centered approach, user experience designers engage in several activities:

  • Observe customers in their natural environment to understand how they are currently interacting with existing systems, as well as get insight into how users view the world (their mental models).
  • Build empathy and understanding of the customers within the entire product team
The rest of the post goes on to provide more insight into User Experience Design and it's business benefits, but it is the section above that I believe truly explains exactly what we are trying to do.

What Is the Difference Between Analysis Studio and PowerPlay Studio?

about 1 year ago | Abhishek Dharga: Face The Truth

You are a PowerPlay user and wonder how Analysis Studio differs from IBM Cognos Series 7 PowerPlay Web functionality. Analysis Studio provides deep comparative analysis, which IBM Cognos Series 7 PowerPlay Web does not offer. IBM Cognos Series 7 PowerPlay Web offers a rich exploration experience, whereas Analysis Studio provides guided exploration.
IBM Cognos 8 PowerPlay Studio brings the IBM Cognos Series 7 PowerPlay Web interface to IBM Cognos 8.
One of the biggest differences between Analysis Studio and IBM Cognos 8 PowerPlay Studio is that Analysis Studio enables analysis of information independent of where your data is stored. This means that you can analyze and report against both online analytical processing (OLAP) data sources and dimensionally-aware relational sources.
PowerPlay users who are familiar with PowerPlay Web functionality and exploration capabilities, and who expect the same functionality and exploration capabilities in IBM Cognos 8 should consider moving to IBM Cognos 8 PowerPlay Studio.
PowerPlay users who perform analysis, or deep comparative analysis, use unbalanced hierarchies, or use large data sets will find that Analysis Studio is well suited for their business needs. Consider migrating IBM Cognos Series 7 applications that would benefit from this functionality in Analysis Studio when the time is right for your business.
You can also migrate PowerPlay applications to IBM Cognos 8 PowerPlay Studio, afterward, users can choose to move from IBM Cognos 8 PowerPlay Studio to other IBM Cognos 8 studios.














Position of Calculated Categories
If a report contains calculated categories, the relative position of the rows or columns that show
the calculated categories may be different between PowerPlay and Analysis Studio. This formatting difference does not affect the data.
The following examples show the difference in the position of a calculated column, 2004 + 2005.
The first image shows the original PowerPlay report. The second image shows the same report after migration to Analysis Studio.

























































Charting of Summary Data
Analysis Studio does not show summary values in charts. If the original PowerPlay report included charts that showed summary values, this level of detail will not appear in the charts in Analysis Studio.




Default Display Format for Bar Charts
In PowerPlay, a simple bar chart can combine the components of a summary in one bar. Analysis Studio always shows a bar for each component of the summary.
The following examples show the differences in the display of bar charts. The first image shows
the original PowerPlay report. The second image shows the same report after migration to Analysis Studio.




Default View in Analysis Studio
You can change the default view for an analysis by changing the package configuration properties.
This allows you to create a default view similar to PowerPlay, where the order of dimensions and
measures determines the default rows, columns, and measure when you open the cube.


Hidden Child Levels
In PowerPlay reports, when all child levels of a parent level are hidden, the parent level is also hidden.
The parent level appears in reports migrated to Analysis Studio. For example, a PowerPlay report contains the levels Products and Outdoor Protection. Products is the parent of Outdoor Protection.
If you hide Outdoor Protection and all of its child levels, no data appears for Products or Outdoor
Protection. If you migrate this report to Analysis Studio, Products appears


Hidden Measures
In PowerPlay reports, you can hide measures. Analysis Studio does not support hiding measures.

a picture is worth a thousand words...

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

WWF Paper Conservation ad

Love this quote about JavaScript...

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

"What’s kind of funny about JavaScript is that if something can be done in another language, it probably should be done in that other language. "

Source: http://css-tricks.com/inapproprite-uses

Recommended Reading

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

Finally, I have been able to catch-up with my reading this summer. There are two books I liked the most and I would highly recommend...

  1. "Never Eat Alone: And Other Secrets to Success, One Relationship at a Time" by Keith Ferrazzi
  2. "Pragmatic Thinking and Learning: Refactor Your Wetware" by Andy Hunt

The first book is about the development of mutually beneficial relationships and the role they play in career and personal success. Ferrazzi is a master at networking and building relationships. His book is very practical and concise, explaining to the reader methods for improving current professional and social situations. It was full of insights and useful tips that one could surely pick up and put to use...

The second book was recommended by my boss. Another marvelous read. I think what I liked best about the book was it was focused on solving the hard to describe problems of organizing your thoughts, how to change the way you think to match the problem, and even how to manage your time / interruptions to get these things done. I have already started using some of his ideas by starting to use a personal/private wiki to organize my thoughts...

I love the Pragmatic Bookshelf series. Currently I am reading "Behind Closed Doors: Secrets of Great Management" by Johanna Rothman and Esther Derby...

Recommended Reading

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

Finally, I have been able to catch-up with my reading this summer. There are two books I liked the most and I would highly recommend...

  1. "Never Eat Alone: And Other Secrets to Success, One Relationship at a Time" by Keith Ferrazzi
  2. "Pragmatic Thinking and Learning: Refactor Your Wetware" by Andy Hunt

The first book is about the development of mutually beneficial relationships and the role they play in career and personal success. Ferrazzi is a master at networking and building relationships. His book is very practical and concise, explaining to the reader methods for improving current professional and social situations. It was full of insights and useful tips that one could surely pick up and put to use...

The second book was recommended by my boss. Another marvelous read. I think what I liked best about the book was it was focused on solving the hard to describe problems of organizing your thoughts, how to change the way you think to match the problem, and even how to manage your time / interruptions to get these things done. I have already started using some of his ideas by starting to use a personal/private wiki to organize my thoughts...

I love the Pragmatic Bookshelf series. Currently I am reading "Behind Closed Doors: Secrets of Great Management" by Johanna Rothman and Esther Derby...

What is IBM Cognos 8 PowerPlay?

about 1 year ago | Abhishek Dharga: Face The Truth

IBM Cognos 8 PowerPlay provides the data analysis and exploration capabilities that are familiar to IBM Cognos Series 7 PowerPlay report authors, analysts, and users in an IBM Cognos 8 environment.
By integrating with IBM Cognos 8, PowerPlay is able to take advantage of the IBM Cognos 8
architecture and features while preserving your existing PowerPlay applications and user experience.
IBM Cognos 8 PowerPlay brings the proven exploration and analysis capabilities of IBM Cognos
Series 7 PowerPlay into the IBM Cognos 8 environment. IBM Cognos 8 PowerPlay maintains the
familiar appearance and functionality of IBM Cognos Series 7 PowerPlay for report authors and
users, and also provides the enhanced server architecture and scalability of the IBM Cognos 8
environment.
The IBM Cognos 8 service-oriented architecture makes possible the integration of PowerPlay into the IBM Cognos 8 environment.
Among the benefits, this architecture

  • allows the PowerPlay service in the IBM Cognos 8 environment to continue to use the same
    query engine as in IBM Cognos Series 7.
    As a result, PowerPlay reports and other content, such as cubes, bookmarks, security policies,
    and Upfront hierarchies, migrate easily into the IBM Cognos 8 environment.
  • adds PowerPlay as an IBM Cognos 8 studio and allows PowerPlay to interact with other IBM Cognos 8 studios.
    For example, users can open PowerPlay reports in other studios that are available to them.
    Users can also drill through from PowerPlay to other studios. In IBM Cognos 8, making drill through available to users requires less involvement from modelers and administrators than in IBM Cognos Series 7.
  • maintains the data analysis and exploration capabilities of PowerPlay
    Report authors can continue to work with a familiar interface to produce reports, also leverage the features of other IBM Cognos 8 studios.
  • provides a single access point for all IBM Cognos 8 administration settings.
    IBM Cognos Administration is a zero-footprint Web-based interface that provides flexible
    access to administration settings.

Important Info For Migration of Cubes

about 1 year ago | Abhishek Dharga: Face The Truth

Transformer
You can use IBM Cognos PowerCubes and Transformer models that were generated by Transformer 7.3 or later directly in IBM Cognos 8. The cubes and models are upwards compatible and require no migration or upgrade tools. You can run reports and analyses in IBM Cognos 8 against the IBM Cognos PowerCubes.
If you want to use the integration features of Transformer with IBM Cognos 8, you can upgrade
IBM Cognos Series 7.x Transformer models to IBM Cognos 8 BI Transformer 8.3 or higher. This
allows you to use IBM Cognos 8 data sources (such as published packages), list reports authored
in Query Studio or Report Studio, authenticate using IBM Cognos 8 security, and publish directly to IBM Cognos Connection.
If the model was secured in IBM Cognos Series 7 you must configure the IBM Cognos Series 7
namespace in IBM Cognos 8 before you load the model. The name ID that you use to configure
the namespace in IBM Cognos 8 must match the name used in IBM Cognos Series 7.
For more information about upgrading IBM Cognos Series 7 secured PowerCubes, see the IBM
Cognos 8 Transformer User Guide.
For IBM Cognos Series 7 PowerCubes to be used in IBM Cognos 8, we recommend that you
optimize the cubes for use in IBM Cognos 8 by using the pcoptimizer utility, which is supplied with IBM Cognos 8. Otherwise, PowerCubes that were created with previous versions of Transformer may take too long to open in the IBM Cognos 8 Web studios. This optimization utility is suitable for older PowerCubes when the model no longer exists or the data used to build the PowerCube is no longer available. It is not necessary to run this command line utility for cubes created in IBM Cognos 8 Transformer. For more information about optimizing PowerCubes, see the Transformer User Guide.

You can publish single PowerCube data sources and packages to IBM Cognos Connection interactively in Transformer or in the command line. You can also publish silently using batch scripts after building a PowerCube. A user who has privileges to create data sources and packages in IBM Cognos Connection can publish PowerCubes in IBM Cognos Connection as well. The MDC file must be in a secured location that the IBM Cognos 8 dispatcher can access. Packages that use multiple PowerCubes or PowerCubes mixed with other data sources should be published using Framework Manager.
If you use an IBM Cognos Series 7 PowerCube as a data source, IBM Cognos 8 converts the cube
data from the encoding that was used on the system where the PowerCube was created. For a successful conversion, IBM Cognos Series 7 PowerCubes must be created with a system locale set to match the data in the PowerCube.

Learning CSS

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

Rob Morris has compiled an excellent list of resources to get smart on CSS...

I'm on 2nd step... positioning

Tutorial: How to write a Rails generator

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

I’ve been working on a generator called ViewMapper recently that allows you to create view scaffolding from an existing model. I found writing a Rails generator to be somewhat confusing and hard to do: Where do I need to put my generator class? What does it need to be called? How does it work? This article will show step by step how to write your own Rails generator from scratch – hopefully it will save you some time if you ever need to write your own.

First let's think of some sample Rails code that I might want to generate as an example. This is admittedly contrived, but it’s short and simple enough to show here while still interesting enough to illustrate how a generator would work. Let’s suppose my Capistrano deployment scripts wrote the last commit information from Git into a file called “version.txt” in a folder RAILS_ROOT/../build-info:

commit 217d9bd1d1d508a0f7f1e7afa2b489b130196e33
Author: Pat Shaughnessy <pat@patshaughnessy.net>
Date:   Wed Aug 5 07:45:01 2009 -0400

Now with a controller like this I could display the info, helping me keep track of what version is running on a given development development, QA or production server:

class VersionController < ApplicationController
  VERSION_FILE = '../build-info/version.txt'
  def display_version
    path = File.join(RAILS_ROOT, VERSION_FILE)
    render path
  end
end

If I add a route to this action like this in config/routes.rb:

map.version 'version', :controller => 'version', :action => 'display_version'

…then I’ll get the Git last commit info by just opening http://servername/version in my browser. Obviously it would be simpler to just put the version.txt file under the public folder… but let’s continue with this contrived example for now. Now let’s say I have 5 or 10 different Rails apps, and that I’d like to add the same controller and route to each one. Let’s write a simple Rails generator that would make this easy to do, called the “version” generator. Here’s how to do it…

<u>Step 1: A skeleton Rails generator</u>

All Rails generators are derived from a class called “Rails::Generator::Base.” You can find the source code for this file in vendor/rails/railties/lib/rails_generator/base.rb (link is to the Rails 2.3.3 version). Definately read the source code; there is helpful documentation in the comments and understanding the base class code is indispensible if you plan to use it for your generator.

Here’s an empty, skeleton Rails generator that we can use as a starting point:

class VersionGenerator < Rails::Generator::Base
  def manifest
    record do |m|
      # Do something
    end
  end
end

The name of the class is important: since we want a “version” generator we need to create a class called “VersionGenerator.” The other important detail here is where this class is located: we need to put it in lib/generators/version/version_generator.rb. The reason for all of this is that the code called by script/generate takes the generator name and looks for the corresponding generator class in this location. We can check that our class is being found by just running script/generate with no parameters, like this:

$ ./script/generate 
Usage: ./script/generate generator [options] [args]
…etc…
Installed Generators
  Lib: version
  Rubygems: cucumber, feature, install_rubigen_scripts, integration_spec, rspec, rspec_controller, rspec_model, rspec_scaffold, session
  Builtin: controller, helper, integration_test, mailer, metal, migration, model, observer, performance_test, plugin, resource, scaffold, session_migration

Note that our new “version” generator is listed as “Lib: version,” in bold above. The other generators found on my system were either part of Rails or else part of a gem or plugin. If you don’t see your generator in this list, or if it has the wrong name then double check your folder name: it should be lib/generators/XYZ or lib/generators/version in this example. After you finish developing your generator you'll want to move it into a plugin or gem so it can be reused in different apps on your machine; then "version" would appear in the "Rubygems" list for example.

If we try running our empty generator, we’ll get no output or changes; not a surprise:

$ ./script/generate version

If you see an error like this:

$ ./script/generate version
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:
in `gem_original_require': no such file to load --
/path/to/myapp/lib/generators/version/version_generator.rb (MissingSourceFile)

Then you have the wrong file name… it needs to be XYZ_generator.rb, or version_generator.rb in this example. Or if you see:

Missing VersionGenerator class in
  /path/to/myapp/lib/generators/version/version_generator.rb

… then you have the wrong class name inside this file. It needs to be XYZGenerator, or VersionGenerator in this example.

<u>Step 2: Creating code using an ERB template</u>

The way Rails generators work is by creating code using ERB, in just the same way that view code generates HTML for a Rails web site. To see how this works and to take the next step towards writing our version generator, let’s create a new template file for our version controller. Create a new text file called “controller.rb” and put it into this folder: lib/generators/version/templates/controller.rb; in other words, into a new subfolder under version called “templates.” Next, paste in the controller code from above:

class VersionController < ApplicationController
  VERSION_FILE = '../build-info/version.txt'
  def display_version
    path = File.join(RAILS_ROOT, VERSION_FILE)
    render path
  end
end

Now if we add this line to our manifest method back in the VersionGenerator class:

def manifest
  record do |m|
    m.template('controller.rb', 'app/controllers/version_controller.rb')
  end
end

… a new code file called version_controller.rb will be generated inside of the app/controllers folder in our app when we run the generator:

$ ./script/generate version
    create  app/controllers/version_controller.rb

If you take a look at this new version_controller.rb file, you’ll just see the code we pasted into the controller.rb template file. Here’s what happened when we ran script/generate version:

  • The Rails code called by script/generate looked for the “version” generator, by looking for a class called “VersionGenerator” in the lib/generators/version folder, among other places.
  • It called the “manifest” method in VersionGenerator. Using the “record” utility method, a series of actions are recorded that the Rails generator base classes will execute later. In our case, there’s only one action: “template.”
  • The template action indicates that the Rails generator code should run an ERB transformation to generate new code, using the “controller.rb” file. The generated code will then be copied to the app/controllers/version_controller.rb file.

To make our generator interesting, let’s provide a parameter to it that indicates the path of the file containing the version information, instead of hard coding “version.txt.” To do that we can take advantage of another Rails built in class called “Rails::Generator::NamedBase”. If we derive our VersionGenerator class from NamedBase instead of Base, then we’ll get the ability to take a name parameter from the script/generate command line for free. Let start by changing our base class in version_generator.rb:

class VersionGenerator < Rails::Generator::NamedBase

Now if you run the generator, you’ll get some helpful usage information:

$ ./script/generate version
Usage: ./script/generate version VersionName [options]
Etc…

Here the NamedBase class has written the usage info, explaining that an additional parameter is now expected. If we re-run the generator and add the version file name as a parameter, here’s what we’ll get:

$ ./script/generate version ../build-info/version.txt
   identical  app/controllers/version_controller.rb

This shows a helpful feature of Rails generators: they check if you’re about to overwrite some existing code with the new, generated code. In this case, since we already had a controller called “version_controller.rb” the Rails generator code displayed the “identical” message. Our new generated controller is identical to the previous one since we haven’t used the version name parameter yet. To take advantage of the version file name parameter and our new NamedBase base class, we need to add some new code to VersionGenerator, in bold:

class VersionGenerator < Rails::Generator::NamedBase
  attr_reader :version_path
  def initialize(runtime_args, runtime_options = {})
    super
    @version_path = File.join(RAILS_ROOT, name)
  end
  def manifest
    record do |m|
      m.template('controller.rb', 'app/controllers/version_controller.rb')
    end
  end
end

The way this works is:

  • The NamedBase base class parses the script/generate command line, expecting an additional parameter which indicates the name of some object.
  • This name is provided in "name," an instance variable/attribute of the NamedBase class.
  • The VersionGenerator class assumes "name" indicates the relative path of a version file, determines the full path of the file and then saves the full path in the @version_path attribute.

I mentioned above that Rails generators work by running an ERB transformation; to try using ERB in this example, we just need to refer to the new “version_path” attribute inside the controller.rb template file, like this:

class VersionController < ApplicationController
  VERSION_PATH = '<%= version_path %>'
  def display_version
    render VERSION_PATH
   end
end

The “version_path” variable in this template refers to the version_path attribute of the VersionGenerator class above. I’ve also removed the File.join line from here since we now handle that in the generator itself. If we run the generate command and provide the name of the version file, we’ll get this result:

$ ./script/generate version ../build-info/version.txt
overwrite app/controllers/version_controller.rb? (enter "h" for help) [Ynaqdh] Y
       force  app/controllers/version_controller.rb

As I mentioned above, Rails checks whether you’re about to overwrite some existing code file. Since in this case our controller code file is now different that what we had before (VERSION_PATH and not VERSION_FILE; no File.join, etc.) we get an overwrite warning. I just entered “Y” to overwrite the old file.

If we look at our new controller, app/controllers/version_controller.rb, we now have:

class VersionController < ApplicationController
  VERSION_PATH = '/path/to/myapp/../build-info/version.txt'
  def display_version
    render VERSION_PATH
   end
end

We’ve successfully generated a new VersionController class, based on a parameter passed to our “version” generator. While this is a good start, to be able to use this action in our app we still need to add a route to config/routes.rb. It turns out this is a lot harder to do with a generator, since we will need to insert a new line of code in an existing file, and not just generate a new routes.rb file. We will also need to worry about how to remove the route line when script/destroy is run. It’s possible to do all of this with a Rails generator, but will require a more thorough understanding of how Rails generators actually work. I’ll explain all of that in my next post…

To market, to market...in Rhode Island.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

Before we took our bike ride to lobster roll heaven, Aunt Cathi and I did some shopping for Saturday night's dinner. She had planned a seafood-heavy feast (always music to this landlubber's ears): steamers, angel hair pasta with crab, tomato, wine and herbs and panzanella (bread salad with cucumbers and tomatoes).

Our first stop was the Sakonnet Growers' market in Tiverton, where we picked up cucumbers (the green kind, not the round yellows ones above) and basil for the salad. The market was small (compared to the sometimes overwhelming bustle of the Union Square Greenmarket), but well-stocked. Tiverton's citizens are particularly concerned with preservation, and the market is perched at the top of a rolling, undeveloped meadow ringed by tall trees - an absolutely idyllic setting for browsing the local produce.

I gave in to temptation and bought two jars of locally-made jam (Made from local produce, too!) from Cory's Kitchen at Sweet Berry Farm. My picks were peach-raspberry preserves and hot pepper jam - the former will appear, no doubt, on crumpets chez Queenie in the near future. The latter might end up stirred into salad dressings, spread on crackers, or, possibly, eaten with a spoon.

Our next stop (after a beautiful driving tour of Tiverton) was Coastal Roasters, widely known in the area as the best coffee for miles. Aunt Cathi, primarily a tea drinker, wanted some help picking out a dark, rich coffee for my Uncle Jack. This was a challenge to which I felt equal. The shop roasts most of its own beans, and the selection was fantastic. We ended up choosing a Sumatran blend with cocoa tones to it for Uncle Jack, and ordering a latte (for Cathi) and a café au lait (for me). The coffee was great - rich, round, and strong.

Finally, we stopped at the fish store to collect the crab and steamers. No pictures , sadly, but I can confirm that many times of mollusk were on offer, including the little necks they gave us by mistake (something we only discovered upon opening the bag to clean them just before dinner). Oops.

I have to say, I was seriously impressed with the availability of local, sustainable foods in this little corner of Rhode Island. Everywhere I turned, it seemed, someone was offering me fantastic coffee, delicious ice cream, succulent fish, or fresh fruit - all grown or made within the surrounding 50 miles or so.

Looking for links to all the places we visited, I even found an amazing site called Farm Fresh Rhode Island, a comprehensive guide to buying local and fresh across the (admittedly teeny) state. Pretty nifty, I have to say.

Digital Camera with Built-In Projector

about 1 year ago | Erika Santos: Santos on Technology and Life

Nikon Europe has announced the introduction of the world's first compact digital camera with a built-in projector.

The S1000pj projects images and videos up to 40 inches in size with a VGA resolution and a maximum distance of 2 meters. The camera is supplied with a remote control and stand for ease of use. It is also a 12.1 megapixel shooter, has an optical 5x zoom and the firm’s Best Shot Selector, which takes 10 shots every time the shutter is pressed and automatically saves the best one.

The camera will be in the market next month for about $430. Not bad, considering all the features it offers.

Now I can appreciate technology that is not only cool, but also useful. Not something you can always take for granted.







I'm off - again!

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

Dear readers, it has been a travel-heavy summer for this Manhattanite - and this weekend is no exception! I'm off to Massachusetts and New Hampshire this weekend. I'll be staying in Newburyport, exploring Plum Island, and making a pilgrimage to my old stomping grounds up in Exeter (where I went to high school) and Portsmouth.

Any recommendations for food or fun? Leave 'em in the comments! And, obviously, I'll be back with a full report next week!

Phillips Exeter library photo courtesy of atelier/Ed Brodzinsky. Portsmouth photo courtesy of Philip Case.

Improvements in application support - update

about 1 year ago | Mark Mintz: Mark Mintz

In late 2008 I worked on and blogged about an initiative to improve our application support function. While that initiative has been successful in implementing a new way of supporting our applications and we are in the process of moving our applications to the new model there is something else that I would like to acknowledge. In addition to testing the changes that I described in my blog post last year we also implemented some large changes in our existing support team to more immediately address the same issues I described in the earlier blog post. These changes entailed streamlining the team and asking them to shift their focus from "fire fighting" to:

  1. collaboration and learning
  2. root cause analysis
  3. continuous improvement
  4. making support a fun place to work
The idea was that we had some quality issues with our applications and our application support processes and the quality of service our users were receiving was impacted. We wanted the support team to identify the root causes of those issues and work with our development teams, other support organizations and sponsors to address the issues and make our applications more supportable while also making application support a place where people are happy to work. Well it's been about a year now, the team is in it's fourth "release" and there were some interesting things presented at today's sprint review:
  1. the July year over year support ticket volume has decreased by approximately 30%
  2. the first item presented by the team was the number of hours of support team member savings per month that were generated by the support and development teams focusing on continuous improvement activities
  3. support ticket backlogs are higher than the team would like
My observations on these are:
  1. the year over year decrease in ticket volume is great progress and validates our hypothesis that we had issues that could be overcome. It also makes me ask the question why can't we reduce an additional 30%, 40% or even more?
  2. the idea that the amount of person hours savings was the first thing presented by the team confirms that the team has clearly and decisively transitioned from "fire fighting" to a value add team that is focused on making our applications more supportable
  3. while support backlogs are higher than the team would like (we did reduce the team size quite a bit) the focus on collaboration, continuous improvement and root cause analysis should not decrease. The long term gains that we see from these efforts (see bullet 1 above) are much greater than any short term blips in support ticket volume increases, especially when we collaborate and communicate effectively with our sponsors and users
Needles to say, both of these initiatives have led to interesting findings on how we perform application support and development and will definitely help us think about how to improve in these areas going forward....and I will keep blogging about it as we progress.

Client-side Technologies-I : Browsers

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

To begin with Latest Technologies at client side, let's pick simplest but important one: Browser

Browser, i.e. Web browser, is a software application used to locate and display Web pages, typically html pages. Browsers now a days provide features, such as display graphics, images, play video and so on.

But how it works?

When user type a url in address bar, Browser identifies the protocol (generally http), the server name(which is mapped to DNS at the World Wide Web which is a system of internet servers) and the content user is requesting.

From Webopedia: "In order for your browser to actually connect to the Web server to retrieve the information you request, it communicates with a name server to translate the server name into an IP address. Your Web browser is then able to connect to the Web server at the resolved IP address on port 80. Once your browser has connected to the Web server using HTTP, the browser then reads the HyperText Markup Language (HTML), the authoring language used to create documents on the World Wide Web, and the data is then displayed in your Web browser."

Browser displays the web page by rendering engine. A rendering engine is a program that interprets code and markup languages (such as HTML or XSL) and generates the image of the Web page you see in your Web browser.

Gecko is known as rendering/layout engine for Firefox. It is written in C++ and is cross-platform, and runs on various operating systems including BSDs, Linux, Mac OS X, Solaris, OS/2, AIX, OpenVMS, and Microsoft Windows. Similarly, Trident(also known as MSHTML), rendering engine for IE.

Interestingly, Firefox is #1 browser at present(http://internet-browser-review.toptenreviews.com) with hundreds of plug-ins, various themes and features:


In terms of popularity, Firefox has beaten it's rival IE combinding IE6, IE7 and IE8 statistics (Source W3Schools). Facts say that almost 50 % internet users use Firefox!



Comparing between several web browsers over security, features, UI, etc. Firefox seems more promising than any other browsers. What say?

The lobster roll at the end (well, middle) of the bike path.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

Last weekend, I went up to Bristol, Rhode Island to visit my Aunt Cathi at her new digs smack on the water. My family are a bunch of New Englanders at heart, and it's nice to finally have a member of the parental generation back in the neighborhood (especially when she's as good a cook as Cathi happens to be).

She and my uncle are splitting their time between a fantastic condo in Bristol and a home in Dallas; I haven't seen the latest Dallas place, but I can tell you that the Bristol residence is spectacular. Downtown Bristol (the most patriotic town in American, apparently) is adorable and eminently walkable, and Cathi's condo is part of a complex made entirely of salvaged industrial buildings. The view from the pool gives you an idea of what a gorgeous spot this is:

On Saturday morning, Cathi took me on a tour of her favorite local food shopping destinations (more on those later, I promise). That afternoon, we took a (very warm) bike ride down the East Bay bike path, through Colt State Park, and on to Warren for lunch at Blount's clam shack.

We split the nine-inch lobster roll, which came with a side of fries and coleslaw. The lobster itself was great - tender, flavorful (almost definitely cooked in seawater) and cut into manageably bite-sized pieces. The bun was similarly delicious. The traditional, side-cut New England hot dog bun was toasted all over and lined with a leaf of Bibb lettuce before receiving its precious cargo. The lobster was sparingly dressed with a mild mayo, which was the only thing I would have changed. I like a bit of tang in my lobster roll, and would have killed for a squeeze of lemon or a slightly kickier sauce.

Altogether, though, there's nothing bad about this kind of reward waiting for you at the end of a bike ride - am I right?

How to capture Oracle's dbms_output in your Rails log file

about 1 year ago | Alex Rothenberg: Common Sense Software

I have been writing a rails application on top of a large existing Oracle database where each table has 5+ triggers that each call several stored procedures and each of those PL/SQL stored procedures is hundreds of lines long. Often a simple update statement fails with an ORA-xxxx exception coming from deep in the PL/SQL code and it can be tough to figure out what's gone wrong.

The usual way Oracle database folks figure out what's going on is to put print statements in their code. In oracle this looks like

  dbms_output.put_line('hi i hit this line of pl/sql');
When you're using an Oracle editor like TOAD or SQLDeveloper you have to turn output on and then will see anything that's printed.
  set serveroutput on;
This is great if you divide the application between Rails
and Database developers and assume each group can work independently to write perfect code but what about the real world!
Today I want to show you how I monkey patched the Oracle Enhanced Adapter to stick the dbms_output into
the rails log file.
Let's start with an simple example of a simple PL/SQL function that tells you if a string is more than 5 characters long (with some simple debugging print statements).
  CREATE OR REPLACE FUNCTION
MORE_THAN_FIVE_CHARACTERS_LONG (some_text VARCHAR2) RETURN INTEGER
AS
longer_than_five INTEGER;
BEGIN
dbms_output.put_line('before the if -' || some_text || '-');
IF length(some_text) > 5 THEN
dbms_output.put_line('it is longer than 5');
longer_than_five := 1;
ELSE
dbms_output.put_line('it is 5 or shorter');
longer_than_five := 0;
END IF;
dbms_output.put_line('about to return: ' || longer_than_five);
RETURN longer_than_five;
END;
Now we can run the following in TOAD
  set serveroutput on;
select MORE_THAN_FIVE_CHARACTERS_LONG('a long string') from dual;
select MORE_THAN_FIVE_CHARACTERS_LONG('short') from dual;
And we get this output
  MORE_THAN_FIVE_CHARACTERS_LONG('ALONGSTRING') 
---------------------------------------------
1

1 rows selected

before the if -a long string-
it is longer than 5
about to return: 1

MORE_THAN_FIVE_CHARACTERS_LONG('SHORT')
---------------------------------------
0

1 rows selected

before the if -short-
it is 5 or shorter
about to return: 0
To get the same in our Rails app we just need to monkey patch the OracleEnhancedAdapter by copying what's below into your project as config/initializers/oracle_enhanced_adapter.rb

  module ActiveRecord
module ConnectionAdapters
class OracleEnhancedAdapter < AbstractAdapter
DBMS_OUTPUT_BUFFER_SIZE = 10000 #can be 1-1000000
DBMS_LINE_MAX_SIZE = 1000
def enable_dbms_output
@enable_dbms_output = true
execute "BEGIN dbms_output.enable(#{DBMS_OUTPUT_BUFFER_SIZE}); END;"
end
def disable_dbms_output
@enable_dbms_output = false
execute "BEGIN dbms_output.disable(); END;"
end
def dbms_output_enabled?
@enable_dbms_output
end

protected
def log(sql, name)
super(sql, name)
ensure
log_all_dbms_output if dbms_output_enabled?
end

private
def log_next_line_of_dbms_output
dbms_output_text, status = @connection.exec "BEGIN dbms_output.get_line(:return, :status); END;", ' '*DBMS_LINE_MAX_SIZE, 1
got_text = (status == 0)
@logger.debug "DBMS_OUTPUT: #{dbms_output_text}" if got_text
got_text
end

def log_all_dbms_output
while log_next_line_of_dbms_output do
end
end
end
end
end

To use it let's show a quick script/console session
  >> ActiveRecord::Base.connection.enable_dbms_output
=> []
>> ActiveRecord::Base.connection.select_all("select MORE_THAN_FIVE_CHARACTERS_LONG('a long string') from dual")
=> [{"more_than_five_characters_long('alongstring')"=>1}]
And what's in log/development.log

SQL (27.0ms) BEGIN dbms_output.enable(10000); END;
SQL (25.9ms) select MORE_THAN_FIVE_CHARACTERS_LONG('a long string') from dual
DBMS_OUTPUT: before the if -a long string-
DBMS_OUTPUT: it is longer than 5
DBMS_OUTPUT: about to return: 1

This is admittedly a very simple example but I have used this in a real application where I am updating several related ActiveRecord objects and seeing the DBMS_OUTPUT inline with the various SQL update statements has been extremely useful in tracking down a real bug in the PL/SQL procedure that has been in our system for over a year!

I've submitted this as a patch to the Oracle Enhanced Adapter so perhaps it will be included at some point so you wont have to do the monkey patching yourself. I was somewhat surprised not to find anything similar out there so if you know of something please leave a comment.

Open source on your mind

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

One of the few positive outcomes of economic recession is that business executives in IT are getting interested in Open Source Software (OSS). The economic pressure has put it on their radar.

Us developers have always loved it for the innovation, "socialism" and benevolence that open source is all about. Now with the budget crunch, there's growing interest in sponsors even with feature compromises.

Here's a quote from a recent IT governance discussion:

"An open source/package scan should be conducted to determine if there is a suitable replacement that will solve the above problems"

Where do solutions come from?

about 1 year ago | Mark Mintz: Mark Mintz

I am working on an initiative that is looking to improve the way we engage with our key, front line users when developing IT solutions. Our key user base is highly mobile, global and has very little discretionary time. To be effective and widely adopted, the solutions we deliver need to have clear value propositions, need to be easy to use and generally not require big behavioral changes. Given the complexity created by all of these factors I think we have done a good job in identifying value add solutions that can help these users be more effective and efficient. With that being said, I do believe that there are opportunities out there that remain untapped. The reason being, in my opinion, is due to the way we engage with these key users: typically somebody has an idea for something that might be a good product and then we follow it up with a period of user research validating how that idea could be implemented. I think this approach works but we can improve on it by finding new, different and better ways to source the initial solution ideas. The way we are trying to do this is by listening to our users. Not by asking them questions about a specific product idea but by listening to them talking to each other, sharing ideas, tips and tricks and advice and asking questions of each other. From this we hope to get insight into how they work and the types of issues they face and put ourselves in a position to identify simple solutions that have the potential to help these users. Success is an active community of users openly discussing the things that they do on a daily basis and the tools and techniques they use. With this dialog should come valuable insight into how our users work and what helps and hinders them. Its exciting stuff and has the potential to provide us with a wealth of knowledge that will hopefully lead to greater value for our users. Needless to say I am excited by the challenge and look forward to blogging about what we're learning and the progress we are making. Any feedback would be great....just leave a comment.

Mobile application development - made easy!

about 1 year ago | Lalatendu Das: Interpretations of Technorealism

After my fair share of procrastination, I finally succumbed to the charm of mobile application development. However, as the initial enthusiasm subsided, the reality struck..i.e where to start? Should I start learning Objective C?!@# malloc’s and calloc’s are certainly not my forte. Should I brush-up Java? or JavaME? will it work on iphone?

I chose the easier path out. I set-out to find cross platform tools, which can accelerate native mobile application development. To my surprise there are quite a few tools out there catering to wannabe mobile developers like me.

Here are my favorite picks:

Rhodes –

My Ruby developer friends will love me for sharing this (if not using it already). Developed by Rhomobile – free under GPL v3, easy pricing for commercial usage. The framework is referred to as "Ruby on Rails" of mobile development. It provides MVC framework (Model with – RhoSync & View and Control using Rhodes). Provides deep cross platform support, with application once developed can easily be deployed to iPhone, Blackberry, Windows Mobile, Symbian(! if still stays afloat after Nokia dumps it) and 'of-course' Android.

For iPhone fans: Support for native iPhone features is the best in the breed. Rhodes supports geolocation, camera, contacts, accelerometer, SMS, push, road map and audio / video capture.

One more interesting stuff, use of rhohub for distributed development and easy packaging of applications.

Phonegap –

By far the most widely used cross platform framework in the mobile world. Phonegap is developed by Nitobi – free under MIT license. Developing applications in Phonegap is as simple as it gets. All you need to know is Javascript and HTML. Provides cross platform support, portable to iPhone, Blackberry, and Android.

Provides decent support for native iPhone features such as geolocation, accelerometer and contacts.

Downside: you still may need to learn Objective C for executing server side action. Off-late Apple appstore has rejected some of the Phonegap developed apps under pretext of compatibility issues with future iPhone OS and the use of unsupported 3rd party APIs.

Titanium –

Developed by Appcelerator – free access to beta version – licensing is evolving. Easy to develop application using Javascript and HTML. Provides some sense of cross platform support, with option to port applications to iPhone and Android only.

Titanium provides decent support for native iPhone features such as geolocation, accelerometer, contacts and photos. Better integration with underlying apple libraries enables more standards compliant results.

Corona –

Developed by Ansca – free access to beta version – licensing is evolving. Uses Lua scripting language to develop applications. As of now, Corona enables application development for iPhone only.

Corona provides access to iphone file systems. Support for other native iPhone features such as camera and accelerometer is still under development.

Corona provides built in support for flash, hence has its advantages for development of two dimensional gaming applications.

As I make up my mind to take the plunge (leaning more towards Rhodes), please feel free to share your pick and experience on working with cross platform mobile development tools.

Fastest-Growing Techs

about 1 year ago | Erika Santos: Santos on Technology and Life

According to a recent article on Fortune Magazine, these are the fastest growing technology performers in the world.

1. Research in Motion

2. Sigma Designs

3. Sohu.com

4. Ebix

5. Millicom International Cellular

6. Open Text

7. Pegasystems

8. ANSYS

9. Apple

10. AsiaInfo Holdings

Are you surprised?


Source Article

Momofuku fried chicken dinner, or: we almost finished the whole thing, except not really.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

A few weeks ago, word came down from on high that Momofuku Noodle Bar would be offering a fried chicken dinner for $100 via their online reservations system. Obviously, I signed up immediately. I knew my brother, Jeremy, would be as excited as I was, and he and my sister-in-law Miriam agreed to join me. We still had two spots open in our reservation, so I consulted the Twitterverse. Sure enough, the lovely and freshly-married Kathryn Yu (who also photographed the meal) volunteered to join us, and to bring her husband Dan along for the fun.

Our motley crew met up at Momofuku Noodle at eight o'clock last Thursday. We were the second fried chicken dinner of the night; the restaurant does three (6 PM, 8 PM and 10 PM). The night got off to a serendipitous start when we found out that our waiter was none other than Eric Murdoch, who'd performed as an actor for the first play Jeremy produced here in Manhattan. Eric got us going with a round of the restaurant's justly famous alcoholic slushies (these were watermelon spiked with soju, a Korean rice wine).

Eric told us the chicken would take about 20 minutes to cook, so we decided to kill time by ordering a couple of appetizers. We ordered the pork buns, the heirloom tomato salad with melon and the corn with fingerling potatoes.

All were fantastic, though the tomatoes and pork buns outshone the corn a bit. The pork buns, which are the same ones you find over at Momofuku Ssam Bar, are just flat-out insane. Fluffy and chewy and filled with pork belly and lightly pickled cucumbers, they're just ridiculously good. The tomato salad was really interesting; I was surprised at how well the sweetness of the melon complimented the tomatoes instead of competing with them, and the smoky saltiness of the ham crisp brought the whole thing safely back to porky Momofuku land.

The chef sent out a special treat: seared scallops with corn and chili oil. These were delicious as well; we couldn't quite suss out what seasoning had made its way onto the scallops, but it was something truly yummy. The scallops themselves were large, but still tender and moist. And who doesn't love corn?

And then, finally, the main event. A giant - and I do mean giant - platter of chicken was set down on the table, along with a stack of moo shu pancakes and a bowl of gorgeous herbs and veggies, including radishes, carrots, shisito peppers, opal basil, thai basil, mint, bibb lettuce and shiso leaves. Next came a flight of four sauces: hoisin, jalapeño-garlic, bibim, and ginger-scallion.

There were two kinds of chicken: half of the meat was dipped in buttermilk and seasoned with Old Bay, while the other half was cooked Korean-style, triple-fried and basted with bibim sauce and vinegar.

The idea is that you take a little of everything - the veggies, the herbs, the lettuce and, of course, the chicken, fold it up in a pancake, add some sauce to your liking, and eat the whole thing. After a few minutes of tearing into the chicken with our bare hands, it became clear why the restaurant had covered the table in a sheet of butcher's paper. We left grease stains everywhere, evidence of how thoroughly we enjoyed ourselves.

Overall, our group preferred the Korean chicken to the buttermilk; the meat seemed a bit more tender and well-seasoned, whereas the Old Bay seasoning was confined to the crust of the buttermilk chicken. That said, we enjoyed both offerings and tried to divide our attention as evenly as possible. We didn't want any chicken to feel bad about itself.

We were divided on the topic of the sauces; I was partial to the bibim sauce spiced up with a dash of Sriracha, while Jeremy favored the jalapeño-garlic mixed with the hoisin. Obviously, though, there was something for everyone. The only thing I would do differently? Order a pot of the house pickles to go with everything.

Despite Eric cheering us on, the five of us were not up to the task of eating every last bit. Though I'm sure they were ever-so-slightly disappointed in us, the staff did a crack job of boxing everything up (in three containers) for us to take home and enjoy cold from the fridge.

All of these gorgeous photos were snapped by the very talented Kathryn Yu. You can find more of her work at KathrynYu.com.

Client-Server model: What's latest?

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

I started reading about client-server model for web applications, again.

I wonder, since this model evolved back in 70's and 80's, how many technologies, platforms, etc ccome in.

When I think about the client-server model for web application, few things are obvious:
1. Browser (Firefox, IE, Google Chrome, Safari, etc)
2. HTML, CSS and Java Script
3. Scripting Languages (PHP, Ruby, etc)
4. Latest concepts for RIA (AJAX, Flash, Flex, Silverlight, etc)
5. Others

In my quest to find out, the latest technologies related to Client-Server model for web applications, I'll understand various aspects of these technologies and pros and cons of them.

I'll start from Client side technologies first...

GM's Volt: Car of the future?

about 1 year ago | Nilesh Naik: TechnoBites


Being an enthusiastic car lover, I always dreamt of driving around the city without shelling out much on the fuel. Well here comes a car from the General Motors that not only breaks the 100 mark barrier in fuel economy rating but does so by a large margin. The Chevrolet Volt, a plug-in hybrid car is estimated to get a whopping 230 miles per gallon. It basically consists of an electric engine with Lithium batteries & a internal combustion engine. You can charge its batteries by plugging in to your household electricity when you're home. It operates as an electric car until its batteries start to get low, and then it starts running a small gas motor to power a generator and knowing that Google helped develop this technology makes it even more interesting.

A dream car to own right? Not exactly, as it carries a not too attractive sticker price of ~ $40,000 largely due to high manufacturing costs. Its battery itself costing $8000.

Expected to roll out in 2011, it seems to have got competition even before hitting the roads. Nissan recently announced the 2010 Nissan LEAF dubbed as the possible "Volt killer" claiming 367 mpg - wow!. As a consumer, its great to see competition growing towards greener technology & helping the environment.

So would you go for it? Well analysts say that you'd have to drive at least 200,000 miles—or 158,000 miles before you start saving money. Huh! probably you would be having a different car by then. Or if you dont wont to spend so much of moolah on this new super machine just wait for the technology to improve over the years which could eventually bring its price down.

What are you drinking?

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

Season Three of my current favorite television show premieres tonight. That's right, it's time to re-join Don, Betty, Peggy, Joan, Pete and the rest of the Mad Men crew for another season of debauchery, advertising, overwhelming social change and, of course, cocktails.

As you all know, I love a good cocktail. When I sit down to watch tonight's episode, I will be partaking of a gin gimlet (gin, lime juice, sugar), most likely made with rhubarb simple syrup. Gimlets are Betty Draper's drink, and I feel it might be the right occasion to express solidarity with my fellow Bryn Mawr grad.

So, what will you be drinking tonight? An old fashioned? Scotch, neat? Do tell!

Photo courtesy of Men.Style.com.

INSTALLATION PROCESS FOR IBM G0! DASHBOARD MULTI-SERVER INSTALL

about 1 year ago | Abhishek Dharga: Face The Truth

System Specifications
Gateway Server (GS)
Dispatcher installed on a different server with IBM Cognos 8v4 application tier (MAINServer)
Installation Process
Get IBM Cognos 8v4 BI correctly configured and running on MAINServer (Reference Cognos Configuration User Guide)
Install IBM Go! Dashboard component on GS

Navigate to the location where the IBM Cognos 8 Go! Dashboard files are located and double-click issetup.exe file.
Follow the direction in the installation wizard to complete the installation.
Configure IBM Go! Dashboard
Set Java home
Open Command line, and navigate to Cognos_install_dir\dashboard\bin
Type set JAVA_HOME=path_to_Java_installationand press Enter


Install IBM Go Dashboard service



Configure Dashboard.properties file
Navigate to Cognos_install_dir\war\dashboard using Windows Explorer
Change URLs for dispatcher, Gateway and content.
In command line, navigate to Cognos_install_dir\war\dashboard
Type build.bat and press Enter


To start IBM Go Dashboard Service navigate back to Cognos_install_dir\dashboard\bin
Type net start IBMCognos8GoDashboard and press Enter


Configure Tomcat
Change Tomcat port to 9301 (or any other port) from the default port. (Cognos 8 BI uses Tomcat4, configured to use connection port 8080 by default, which is why to avoid conflict we need to change Tomcat6 connection port)
Navigate to Cognos_install_dir\tomcat6.0.14\conf using Windows Explorer
Open Server.xml in a text editor
Locate the following piece of code:
Change Connector port from 8080 to 9301
Start Tomcat6 service.
Using Command line, navigate to Cognos_install_dir\tomcat6.0.14\bin
Type startup.bat and press Enter.



After the Tomcat service is started successfully, using Internet Explorer navigate to http://localhost:9301/ to start Tomcat Administration.








Deploy .war file which we created using build.bat and dashboard.properties file.
Click Tomcat Manager from Tomcat Administration
When prompted for credentials, enter:
Username: system
Password: manager
Scroll down the page to the Deploy section.




Enter values for the properties:
Context Path: This value should be the same as the one specified in the dashboard.properties file XML Configuration file URL: Path to tomcat-context.xml file
WAR or Directory URL: Path to the dashboard.war file
Test Go! Dashboard
Navigate to http://MachineName:Port/cognos/dashboard/html





The above screen is what you should expect to see if everything has been configured correctly.


Even though IBM Go! Dashboard recognizes Cognos 8 BI, and displays the content within the Content Store, Cognos 8 BI is still unaware of the existence of Go! Dashboard. We will need to install Go! Dashboards on MAINServer too. Since Go! Dashboard is already configured with the dispatcher it’s supposed to use, we only need to install Go! Dashboard on MAINServer with no need to configure it.
Install IBM Go! Dashboard component on MAINServer
Navigate to the location where the IBM Cognos 8 Go! Dashboard files are located and double-click issetup.exe file.
Follow the direction in the installation wizard to complete the installation.
No need to configure any components or start any services on this server.

Now we have provided a link between the BI server and Go! Dashboard server.
Another issue that might arrive when running Go! Dashboards is multiple logins to GO Dashboard even though the user is already logged into Cognos Connections.
To resolve this issue, we’re going to need to adjust the cache settings in Cognos Configuration.




Open IBM Cognos 8 Configuration
From the Actions menu, select Edit Global Configuration














Click General tab
Under Cookie Settings set the path to “/” (without quotation marks) as shown below

Restart IBM Cognos 8 and IBM Go! Dashboard services
Note:

If Go! Dashboard Service Pack 1 is installed on the server, Dashboard.properties file needs to be updated. Variables will be used for the name of the context_root and dist_path in the file and they should be changed to hard-coded names.
Since this is the first generation of Go! Dashboard, if there is a problem during installation, uninstallation and re-installation is the fastest solution. Uninstallation will require deleting the tomcat6.0.14 folder manually. This is done because Tomcat keeps the configurations and those need to be deleted.

Who should play the role of a Scrum Master in our teams?

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

Currently most of our teams have a dedicated person to play the role of Scrum Master for all 3 types of projects we do. Is that the right setup? Here's how I see it...


Type 1

Small teams working on simple project demands e.g. Client Connect, SugarCRM
>> My take: A project team member (product owner or someone from the dev team) can play the Scrum Master role. They can rotate it among them as well. More thoughts below...

Type 2

Teams working on projects with complex sponsor, vendor, technology, coordination risks and demands e.g. Digital Strategy, MyTime
>> My take: We need a dedicated person to play the role of a SM for large projects

Type 3

Everything between 1 and 2
>> My take: Same as type 1


We should consider the following facts during staffing project types 1 and 3:
- everyone in a team may not be able to play the role of a Scrum Master (only a few can in our 150 person team)
- heads-up (forest) vs. heads-down (trees) perspective on projects need to be ensured
- balance between "what" (product owner focus) and "how" (Architect’s focus ) something is built
- Scrum discipline: teams might compromise e.g. its “okay to live with these impediments”
- Anything else to consider?

Thoughts?

Road to mastery

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

It takes 10,000 hours to become an expert in any area.

What are you planning to become an expert in?

Are you spending enough time? Checkout how someone did all the math to chalk out a plan...

Google Caffeine

about 1 year ago | Lalatendu Das: Interpretations of Technorealism

Google unveiled their next-generation search technology, a project code-named Caffeine. As google puts it, "It's the first step in a process that will let us push the envelope on size, indexing speed, accuracy, comprehensiveness and other dimensions".

Being cynical (of all tall claims) the way I am, I set-out to verify the developer preview site of google caffeine. My tried and trusted search query for testing out any search engine is my (relatively unique) full-name and I tried the same on both google sites (the one live vs the developer preview site).

And the result.. Google Caffeine works..

At least it's faster and more comprehensive (77400 hits in 0.11 secs with Caffeine vs 77300 hits in 0.17 secs in the current google site)
- on a separate note Bing gives me 355 hits only :-(..but hey! isn't it a decision engine?

Back to caffeine - User Interface is unchanged, ordering of search results is nearly same..I couldn't make out if there is any improvement in accuracy..may be that part is still work in progress!

While I eagerly wait to see Caffeine live in action, I can't help but wonder 'what's next'

INDIA INSPIRED

about 1 year ago | Rohan Daxini: Rohan Daxini

What's up, field-grown tomatoes?

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

If you live in the northeastern United States, you've probably noticed the lack of field-grown tomatoes at your local market. You may also have heard that this lack is the result of a particularly bad spell of late blight, a strain of the same potato- and tomato-targeting fungus that caused Ireland's famine in the mid-19th century.

Dan Barber (chef & owner at Blue Hill and Blue Hill at Stone Barns) had a great op-ed piece in Sunday's New York Times explaining the origin of this year's particularly nasty case of late blight. Turns out the summer of 2009 has been a sort of perfect storm of nature, economics, culture, agriculture and good intentions, providing perfect conditions for late blight to flourish like crazy.

First of all, late blight loves cool, wet weather. This summer has been remarkably moderate in temperature and generous with water, so it's no surprise that late blight has made itself at home. Next, you have the economy and current food culture, both of which are encouraging people to grow more of their own food. This is a great trend - food you grow at home is indeed far cheaper, and often better than what you can get in the store.

But since so many people buy their tomato plants from large chains like Home Depot, rather than from small, local nurseries, they're increasing the chance late blight has to hop from plant to plant before making the journey to the home garden. Plants raised in smaller batches can be more closely observed for blight before sale, and have less chance of spreading the disease amongst themselves.

I highly recommend you take a look at Barber's piece, which goes on to suggest some improvements to agricultural training and awareness for professional and amateur farmers alike. In no way does he encourage us to walk back from the current trend for home cultivation, but he does remind us that engaging in agriculture means we should learn a bit about the larger ecosystem in which we're now participating.

My List of indespensable developer tools

about 1 year ago | Rohan Daxini: Rohan Daxini

Everyone collects dev tools, utilities and most folks have a list of a few that they feel are indispensable. Here's mine (of course all these on my home PC).


Wherein I add my voice to the general chorus.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

When I read Julie & Julia in 2005, I was underwhelmed by Julie Powell's story. As a food geek (not yet blogger), I was of course struck dumb with jealousy at her success and her chance to appear in the New York Times food section (Nerd alert: Amanda Hesser cameos as herself.). But Powell's book (I did not follow her blog) seemed to me to be a story of struggle against many things in which I myself find pleasure: the unique challenges presented by living in New York, the act of writing, and the small and large tasks involved in cooking a meal.

Don't get me wrong - I thought Amy Adams did a fantastic job bringing Julie Powell to the screen. A lot of people have made much of the fact that Julie is not "likable." Well, she's not. But she is someone to whom many of us can relate. Stuck in a soul-sucking job that makes her feel useless, watching her college friends ascend to great career heights around her, she is feeling that all-too-typical I'm-turning-30-and-don't-feel-like-I-have-anything-sufficient-to-show-for-it malaise. (I know a little something about this.)

In this, she's not so different from Julia Child, who found herself feeling useless and out of place in mid-century Paris. Nora Ephron, whose recent films have struck me as a bit insipid (in contrast to the near-perfection of her screenplay for When Harry Met Sally), does an incredible job of syncing up the stories of these two women, both rhythmically and thematically.

Ephron makes it easy to draw parallels between their lives; for example, all the cooks in the story (including Julia's editor, Judith Jones) are united by the remarkable perfume released when they deglaze a boeuf bourgignon with the titular bottle of burgundy. Sadly, though, Julie's ultimately self-serving goals and view of the kitchen as a battlefield pale in comparison to Julia's goal of bringing French food to Americans and her view of the kitchen as a place of excitement and discovery.

As many reviewers have noted, Julia's Paris (and, briefly, her Germany, Norway and Cambridge) is full of joy, where Julie's New York seems like a place of relentless hardship - to the point where I wanted to scream, "If you hate riding the subway, move to the suburbs!" Both women, though, are blessed with wonderfully supportive husbands and have marriages that are truly partnerships - something that is all too rare in our entertainment, but a phenomenon I see around me daily.

Ephron brought these two relationships to life, and the pitch-perfect portrayals of Simca Beck, Louisette Bertholle, Dorothy McWilliams and Irma Rombauer were similarly spectacular. (All of these folks are described vividly in Julia's memoir My Life In France, on which her half of the movie is based, and which I highly recommend you read as soon as humanly possible.)

But while Meryl Streep's Julia (like the real-life version) is a magnetic whirl of charm and wit (She pulls a cannelloni out of boiling water and declares it to be "as hot as a stiff cock!"), Amy Adams' Julie is not only lost, but seems to face her life with a combination of resignation and selfish, dejected entitlement.

It's fairly well-known that Julia didn't have a terribly high opinion of Julie. Some believe it's because Julia though Julie was taking advantage of her masterpiece, or trying to grab little bits of her limelight. I disagree.

I think that Julia's dislike for the Julie/Julia Project arose from Julie's view of cooking as a summit to be reached, come hell or high water, as opposed to an act to be undertaken with pleasure and excitement. Throughout the movie, Julie talks about "having to" cook. "I have to bone a duck," or, "I have to kill a lobster." To me, and, I suspect, to Julia, these are things I get to try, not things I have to plod through. Julie sees cooking as a means to an end, not as a joyful end in and of itself.

Ultimately, though, both women face rejection, and both decide that they must power past it if they are to achieve their goals. This, for me, was where Ephron's true-to-life portrayal of Julie as irritating paid off.

No matter who you are, to get what you want you have to be willing to declare, as Paul Child does, "Fuck them." Screw the haters, screw the doubters: believe in yourself, and the rest will follow. This, as much as how to make a perfect beurre blanc, is what Julia has taught me, and I'm glad Ephron saw it, too.

The Meta Cloud - Part II

about 1 year ago | Lalatendu Das: Interpretations of Technorealism

The Meta Cloud concept (my earlier blogpost introducing Meta cloud) has taken a step closer to reality.

Cloudkick (a San Jose based start-up) unveiled an open source project named libcloud, which aims at providing a single programming interface for a host of infrastructure clouds such as Amazon EC2, Rackspace, Slicehost and GoGrid. For example, using libcloud you can make a single API call to potentially reboot your server instances across Amazon EC2, EC2-Europe, Slicehost and Rackspace.

In long run, the plan is to extend these Python based APIs to cover more and more infrastructure clouds such as Linode, Flexiscale and the open source Eucalyptus. If things go as planned, this concept can potentially enable partial interoperability, there by breaking the biggest entry barriers for enterprise adoption of clouds.

For those of you interested in contributing to libcloud project, here is the source code on Github.

Functionality of "Save Report"option in "Select a delivery method" In Cognos

about 1 year ago | Abhishek Dharga: Face The Truth

Problem(Abstract)
When a report run in Cognos Viewer and when report take time, a pop-up appear and we can select "Select a delivery method". At this step we can show 3 options, one of them is "Save Report". When you select "Save Report", nothing appear and you go back to the main portal.

Cause
When you click the "Save option", the report will be transferred to a background report process, executed and it's output saved. The immediate action the user is seeing is being taken back to the portal as the report will run in the background. If you go into the Administration tools, you could see that there is a background execution of the report running. Once it is finished, you should see the saved output icon next to the report in the portal. This may need a refresh on the portal.
One problem with this may happen with prompted reports, where the prompt page buildup takes long enough to get the options popup displayed. If you select save in this situation, I believe nothing is going to happen as the prompts are not yet fulfilled.
Resolving the problem
No action

Omelets by Nick.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

There's an art to the perfect omelet, one I have yet to learn. I'm blessed, therefore, that Nick became obsessed with perfecting said art a couple of years ago. His touch hasn't worn off, so you can imagine my delight upon entering the kitchen one morning last week to discover him cracking eggs into three separate bowls.


Maybe one day he'll agree to give you all a tutorial, hmmm?

Call me a convert and buy me a bottle of bourbon.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

Some of you may remember Nick's excellent cocktailing skills from last summer's posts. Well, let me tell you - he outdid himself this time.

On the night I arrived, Nick made us each a bourbon sidecar. Now, you all know what a traditionalist I am when it comes to cocktails - I like gin in my martinis, and a martini without vermouth is just a shot of cold gin. That said, I have been converted completely when it comes to the swap of bourbon for the original cognac in a sidecar.

I like brandy as much as the next girl, but I vastly prefer bourbon's complex smokiness to cognac's smoother flavor. Combined with the sidecar's traditional lemon juice and triple sec (Nick used Cointreau), bourbon becomes the perfect folly for the acid and the sweetness.

And, of course, you can't have a sidecar without a lemon juice and sugarcoated rim. Yum.

L-O-L-A, Lola...

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

On Thursday night, Nick, Louisa and I piled into Nick's car for the hour-long drive into Cleveland for dinner at one of the city's most beloved restaurants, Michael Symon's Lola. The menu is heavy on the pork and the cured meats, which seemed a good sign.

Lola is on East Fourth Street, an area targeted for revitalization. Walk two blocks in either direction, and you're in a rather dead area of downtown Cleveland - but Fourth Street is alive and bustling, full of people walking, drinking, and eating.

We had reserved three seats at the chef's table, and the hostess seated us graciously (despite our being a few minutes late). The chef's table is an elevated, bar-like spot right next to the open kitchen, with a fantastic view of each and every station - a circumstance which only made it harder to decide what to order. I ordered a gin gimlet and got down to the business of choosing.

For my starter, I ordered the pork belly with coffee, apricot and almonds. While I enjoyed the play of salty and sweet (I do love bacon and fruit together, as you know), I thought the dish could have used a bit more spice (maybe more of the pepper that seemed more of a garnish) and a little more contrast in texture: the pureed apricot sauce was silky and well-made, but didn't do much to offset the soft, fatty texture of the belly.

My main was the far more successful duck with romesco sauce. Romesco is made with nuts (usually almonds or hazelnuts), roasted red pepper and garlic. This version used smoked almonds, which added different twist that went well with the rich duck. Along with haricots verts and a sprinkling of shaved almonds (seemingly a favored garnish at Lola), the duck came with a few charred scallions.

The dish was topped with thinly sliced zucchini that tasted somewhat bland on its own, but worked like alchemy with the duck and sauce to elevate the sauce's garlicky zing. My only complaint here was that there simply wasn't enough of the charred scallion to go with every single bite; I had to ration it out. I ate every last bit of this dish, and it took all my dignity to keep from licking the plate clean.

For dessert, I went for the 6 A.M. special, billed as French toast with maple-bacon ice cream and maple syrup. Quintessentially American in its flavors and playfulness, but still a bit refined, this dish captured the spirit of the restaurant - midwestern ingredients and flavors crossed with techniques imported from the wider world, and all done with a healthy dose of fun.

Banh mi mania.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

Once you have terrine and chicken liver pate on your hands, the next logical step is, obviously, to make some banh mi.

If you're one of the unlucky few who has yet to encounter banh mi, let me introduce you to this most delicious of sandwiches. Inspired by the various street sandwiches available in Vietnamese cities, banh mi are a perfect example of the country's fusion of Asian and French flavors. There's no standard, but most banh mi include at least one kind of charcuterie (usually either a rustic pâté or a more spreadable one), some kind of porky filling, fresh herbs, mayonnaise and pickled vegetables - all on a crusty baguette.

We based our homemade version on the recipe from Hot, Sour, Salty, Sweet, and tried to be enterprising with what we already had on hand.

We took our last crock of chicken liver pâté, let it come to room temperature, and mixed in a healthy dose of cinnamon. Next, we sliced some gorgeous Kirby cucumbers, made a quick pickle with daikon and carrot, and followed the cookbook's instructions for a ground pork stir fry for the filling. Finally, we sliced the terrine (one slice each was plenty).

We laid out fresh herbs (mint and cilantro - basil would have been nice, too), dished up some cornichons, and got down to the business of assembling our sandwiches.

Banh mi should be so messy that eating them in front of strangers is a bit embarrassing - and these delivered. Fatty, fragrant, fresh, crunchy, salty, sweet and meaty, they were pretty much the best sandwiches any of the three of us had ever tasted. The sheer act of eating them felt somehow debauched, given all the pork and offal on hand - not to mention the pickles, mayonnaise, and white bread.

And, frankly - we were pretty proud of ourselves for undertaking the effort at all. Banh mi is one of those recipes that require you to make at least three or four other recipes to make the whole thing happen. As Nick pointed out, it was a pretty badass attempt, and a successful one at that.

To drink alongside, we heartily recommend mint juleps - hell, you already have the mint on hand, you know?

The only change I would make next time? The addition of pickled jalapenos. I cannot believe we didn't think of it on the spot. Ah, well - an excuse to do it all over again.

Challenging ourselves usually turns out pretty darn good.

about 1 year ago | Megan Blocker: Queenie Takes Manhattan

So far, each visit to Nick & Louisa has yielded one culinary challenge. Two years ago, it was brioche. Last year, the pork belly-off. This year, it was terrine.

Louisa bought a terrine ages ago, but hadn't worked up the nerve to tackle the job. Sometimes, though, all you need to get the job done is an extra set of hands. And, as it turns out, terrine is remarkably easy - it just has a few delicate assembly-like tasks mixed in with the cooking.

Terrine comes in many varieties, including seafood, vegetable, and offal. For our first foray, we chose something more traditional and basic, Julia Child's terrine de porc, veau et jambon (pork and veal pate with ham). This recipe looked tackle-able and gave us a chance to try out Louisa's other new and slightly intimidating toy, her Kitchen Aid meat grinder attachment.

Louisa ground the pork and half the veal with the lard (oh, yes, indeed) while I marinated the other half of the veal in a mixture of cognac, allspice, thyme and shallots. That marinade was eventually added to the ground filling, along with some sauteed onion, minced garlic and a port reduction.

While Louisa busied herself with the stuffing, I blanched some bacon, which we needed to line the terrine and seal the pate together. Blanching bacon is just like blanching vegetables: drop the slices into boiling water, cook for a few minutes, then cool in an ice bath to stop the cooking. This is an essential step, since it prevents the bacon from shrinking when you bake the terrine.

Once the bacon was cool, I used it to line the terrine, leaving some overhang to fold over the top. Louisa filled the terrine with alternating layers of the forcemeat, the marinated veal, and some sliced, boiled ham. We placed the lid on, and put the terrine in the oven to bake for about 90 minutes.

Once the terrine was done cooking, it was time to turn it from meatloaf to pâté by compressing it with weight. We cut a piece of carboard to fit snugly into the terrine, then stacked four cans of soup on top. The terrine sat on the counter for the next five hours, squishing itself into the right texture.

Five hours later, we pulled the improvised weights and cardboard away to reveal the juicy exterior of the terrine. Ideally, you would refrigerate the terrine for another few hours, still weighted, to allow the fat in the mixture to firm up a bit and hold things even more closely together - but we had banh mi to make, and couldn't help ourselves. (We did refrigerate the weighted terrine overnight once we'd taken a few slices for dinner.)

The terrine sliced easily, and didn't fall apart, even though it hadn't yet been chilled. Inside the bacon wrappings was a gorgeous interior of tender pork & veal (all the more tender for being home-ground), bits of the marinated veal, the juicy ham, and the slightly boozy and autumnal flavors of the cognac, port and allspice.

The terrine was fantastic on our banh mi (more on those soon), and delicious on its own, served on baguette with a smear of grainy mustard, topped with a cornichon. Well worth the effort, it was more tender and flavorful than any commerical pâté I've tried.

I'd love to try adding some cognac-soaked prunes or some more aggressive seasonings to the mix - one of the cool things about pate is what a great canvas it is for experimentation. After all, the original purpose of charcuterie was to use up scraps of this and that - so why not begin at the beginning and get creative?