<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-12669797</id><updated>2012-01-03T14:33:18.980+05:30</updated><category term='JAMon'/><category term='JPA'/><category term='Performance'/><category term='SQL'/><category term='Hibernate'/><category term='Healthcare domain'/><category term='SQLServer'/><category term='Windows'/><category term='HttpClient'/><category term='Data Architecture'/><category term='Enterprise Architecture'/><category term='Castor'/><category term='Web Programming'/><category term='HTTP'/><category term='Insurance'/><category term='Websphere'/><category term='IIS 6.0'/><category term='IP addresses'/><category term='Solaris'/><category term='FileWatcher'/><category term='Digital Certificates'/><category term='XML Schema'/><category term='IRM'/><category term='JEE'/><category term='Java-XML'/><category term='LINQ'/><category term='Constants'/><category term='XSLT'/><category term='FCKeditor'/><category term='Scheduling'/><category term='PDF'/><category term='Javascript'/><category term='Search Engines'/><category term='Memory Analysis.'/><category term='UML'/><category term='XML'/><category term='Design'/><category term='Memory Leak'/><category term='VSTS 2008'/><category term='VS2008'/><category term='Requirements'/><category term='OracleConnection'/><category term='Webservices'/><category term='Migration Factory'/><category term='Portfolio Rationalization'/><category term='XPath.'/><category term='Reusable Components'/><category term='architecture'/><category term='Excel API'/><category term='.NET'/><category term='Code Metrics'/><category term='SOA Governance'/><category term='ESB'/><category term='SQL tuning'/><category term='Session Expiry'/><category term='AJAX'/><category term='Authorization'/><category term='Security'/><category term='Oracle'/><category term='SOA'/><category term='browsers'/><category term='WSDL'/><category term='XQuery'/><category term='Portals'/><category term='Business Rule Engine'/><category term='Business Architecture'/><category term='iBatis'/><category term='JAX-WS'/><category term='DDD'/><category term='Parallel Computing'/><category term='SSL'/><category term='Servers'/><category term='Design Patterns'/><category term='Estimates'/><category term='Datasets'/><category term='ThreadPool'/><category term='Java floating point'/><category term='Visualization'/><category term='BI/DW'/><category term='REST'/><category term='MDM'/><category term='Async Webservices'/><category term='Java Monitoring'/><category term='Migration'/><category term='Cool tools'/><category term='BPM'/><category term='IE hack'/><category term='TCO'/><category term='Caching'/><category term='Heap Analysis'/><category term='Disk Usage'/><category term='Java'/><category term='Web 2.0'/><category term='XML Serialization'/><category term='Exception Handling'/><category term='ADO.NET'/><category term='X.509'/><category term='Reflection'/><category term='Payment Gateway'/><category term='SEO'/><category term='Content Management'/><category term='Database'/><category term='Web crawlers'/><category term='YSlow'/><category term='Intrusion Detection'/><category term='SMO'/><category term='Smart Clients'/><category term='showModalDialog'/><category term='Deep Linking'/><category term='SOA Taxonomy'/><category term='Portlets'/><category term='Zachman Framework'/><category term='Applet'/><title type='text'>Tech Talk</title><subtitle type='html'>Enterprise Architecture, SOA, Performance Engineering, Design and Development tips on Java and .NET platforms.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default?start-index=101&amp;max-results=100'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>393</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12669797.post-8724381218475645509</id><published>2012-01-03T14:33:00.000+05:30</published><updated>2012-01-03T14:33:18.992+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memory Leak'/><category scheme='http://www.blogger.com/atom/ns#' term='Memory Analysis.'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Techniques for handling very large strings in Java</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;In my previous&amp;nbsp;&lt;a href="http://www.narendranaidu.com/2011/12/outofmemoryerror-while-using.html"&gt;blog&lt;/a&gt;, I had jotted down the perils of storing large strings in memory. So what are the alternatives? Listing down a few at the top of my head right now.&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Stream the string to a file and read chunk-wise from the file when required.&lt;/li&gt;&lt;li&gt;Store an array of strings, instead of storing a large string. A large continuous block of memory may not be available, but there could be small holes in the fragmented heap.&lt;/li&gt;&lt;li&gt;Compress the string using GZIP compression methods. Use the &lt;a href="http://docs.oracle.com/javase/6/docs/api/index.html?java/util/zip/GZIPOutputStream.html"&gt;GZIPWriter&lt;/a&gt; class to keep appending strings to a byte-buffer.&lt;/li&gt;&lt;li&gt;If the large XML string is to be sent back as a webservice response, utilize the streaming support in SOAP stacks such as Axis 2 and CXF. Evaluate the use of MTOM for large attachments.&lt;/li&gt;&lt;li&gt;If you are operating on a large number of files, first deal with the 'large' files. To understand why, please peruse these links -&lt;a href="http://blogs.oreilly.com/digitalmedia/2005/01/what-is-the-largest-text-file.html"&gt; Link 1&lt;/a&gt; &amp;amp; &lt;a href="http://www.topologi.com/resources/pdfs/MillionLineFile.pdf"&gt;Link 2&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;In one of the scenarios, the large XML string had to be fed to the JasperReports engine. Found a few interesting options to deal with this challenge &lt;a href="http://itblackbelt.wordpress.com/2008/02/29/generating-huge-reports-in-jasperreports/"&gt;here&lt;/a&gt;. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8724381218475645509?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8724381218475645509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8724381218475645509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8724381218475645509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8724381218475645509'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2012/01/techniques-for-handling-very-large.html' title='Techniques for handling very large strings in Java'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6018087496099734441</id><published>2012-01-03T12:32:00.000+05:30</published><updated>2012-01-03T12:32:42.295+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Memory Leak'/><category scheme='http://www.blogger.com/atom/ns#' term='Memory Analysis.'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Heap Memory in .NET</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Apropos my previous &lt;a href="http://www.narendranaidu.com/2011/12/outofmemoryerror-while-using.html"&gt;post&lt;/a&gt;, my team was trying to resolve another memory leak problem in one of the .NET applications. It is interesting to note that a .NET program does not have any explict way to specify the heap size. The .NET heap size will keep on &lt;a href="http://bytes.com/topic/c-sharp/answers/683386-how-set-max-heap-size-c"&gt;growing&lt;/a&gt; till it consumes all of the available memory.&lt;br /&gt;A hosted application such as IIS can control the amount of heap allocated to a Application Domain. &lt;br /&gt;The following discussion threads throw more light on this: &lt;a href="http://stackoverflow.com/questions/659119/how-can-i-increase-the-heap-size-net"&gt;Link1&lt;/a&gt;&amp;nbsp; &lt;a href="http://stackoverflow.com/questions/301393/can-i-and-do-i-ever-want-to-set-the-maximum-heap-size-in-net"&gt;Link2&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Also found this &lt;a href="http://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/"&gt;amazing article&lt;/a&gt; by Andrew Hunter (ANTS profiler contributor) explaning the Large Object Heap concept in .NET. Understanding these concepts will make us appreciate how we get an unexpected OutOfMemory error even if our total object size is relatively small.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6018087496099734441?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6018087496099734441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6018087496099734441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6018087496099734441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6018087496099734441'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2012/01/heap-memory-in-net.html' title='Heap Memory in .NET'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8389628188485261878</id><published>2011-12-30T16:42:00.001+05:30</published><updated>2011-12-30T16:45:20.202+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>OutOfMemoryError while using StringBuilder/StringBuffer</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I was helping a friend debug a OutOfMemory exception in a Java web application. The program made heavy use of StringBuilder and was appending a large number of strings. An entire record set (containing thousands of records) was essentially converted into an XML string.&lt;br /&gt;Strangely when the OOM error occured, there was still plenty of heap memory available. Furthur deep-dive debugging and some googling around, taught a few important lessons.&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt; Whenever the internal buffer capacity of StringBuilder/StringBuffer is exceeded, then the next character array size it creates is twice of the original size. A good blog explaining this is &lt;a href="http://mohammed-technical.blogspot.com/2010/09/javalangoutofmemoryerror-with.html"&gt;here&lt;/a&gt;. Hence it is better to initialize the initial capacity of the StringBuilder to a reasonable value beforehand.&lt;/li&gt;&lt;li&gt;StringBuilder needs a continuous block of memory for further allocation. For e.g. you may have 20MB free heap space, but it may be fragmented. Hence even a 5MB StringBuilder allocation may fail and result in a OOM error. Links to forums - &lt;a href="http://bytes.com/topic/c-sharp/answers/501231-stringbuilder-outofmemory"&gt;Link 1&lt;/a&gt;&amp;nbsp; &lt;a href="http://stackoverflow.com/questions/363680/stringbuilder-for-string-concatenation-throws-outofmemoryexception"&gt;Link2&lt;/a&gt; &lt;a href="http://stackoverflow.com/questions/8359693/stringbuilder-out-of-memory-error-when-working-with-large-strings-in-java"&gt;Link3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Try to use a 64-bit machine, as there are no practical limitations for the heap memory allocation and also it is much easier to find a continous block of memory due to 64-bit addressing.&lt;/li&gt;&lt;li&gt;Alter the design of the program to not store the string in memory, but in a file. Alternatively stream it directly to the HTTP response.&amp;nbsp; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8389628188485261878?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8389628188485261878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8389628188485261878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8389628188485261878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8389628188485261878'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/12/outofmemoryerror-while-using.html' title='OutOfMemoryError while using StringBuilder/StringBuffer'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6936598897363908935</id><published>2011-12-02T17:01:00.000+05:30</published><updated>2011-12-02T17:01:29.519+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA Governance'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA Taxonomy'/><title type='text'>Taxonomy of Services</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;In one of my&lt;a href="http://www.narendranaidu.com/2011/01/types-of-services-in-soa.html"&gt; previous posts&lt;/a&gt;, I had blogged about creating a taxonomy of services using functional categorization.&lt;br /&gt;For e.g. Entity Services, Task/Activity Services, Process Services and Infrastructure services.&lt;br /&gt;&lt;br /&gt;But services can also be categorized from different perspectives such as layers or intent of use. For e.g.&lt;br /&gt;&lt;i&gt;&lt;u&gt;Categorization based on Service Layer:&lt;/u&gt; &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;1. Business Services: Represent high level business functions that define an enterprise.&lt;br /&gt;2. Application Services: Application specific and usually will be aggregated in a composite service at the business level.&lt;br /&gt;3. Infrastructure Services: Utility functions that deliver cross cutting functions.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;u&gt;Categorization based on scope:&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;1. Enterprise Services: Multiple LOBs use the service.&lt;br /&gt;2. Domain Services: Applicable only within a LOB.&lt;br /&gt;3. Application Services: Local to the App Level.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6936598897363908935?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6936598897363908935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6936598897363908935' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6936598897363908935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6936598897363908935'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/12/taxonomy-of-services.html' title='Taxonomy of Services'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3520375062739947772</id><published>2011-11-17T19:01:00.002+05:30</published><updated>2011-11-17T19:01:58.150+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Analysis vs Design</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This age-old debate keeps propping up every now and then :)&lt;br /&gt;Found a couple of good articles reflecting on the difference between the two.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://butunclebob.com/ArticleS.UncleBob.AnalysisVsDesign"&gt;http://butunclebob.com/ArticleS.UncleBob.AnalysisVsDesign&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devhawk.net/2004/03/30/analysis-vs-design-modeling/"&gt;http://devhawk.net/2004/03/30/analysis-vs-design-modeling/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3520375062739947772?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3520375062739947772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3520375062739947772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3520375062739947772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3520375062739947772'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/11/analysis-vs-design.html' title='Analysis vs Design'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6493234933798078104</id><published>2011-11-03T21:45:00.000+05:30</published><updated>2011-11-03T21:45:10.452+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA Governance'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Web Service Manager vs Oracle Enterprise Gateway</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Oracle Web Service Manager is an integral part of the Oracle SOA suite and it allows us to implement security declaratively; without any coding from the developer. Security policies can be enforced at run-time using WSM agents or WSM gateways. &lt;br /&gt;There is another product called "Oracle Enterprise Gateway" that has features that overlap with OWSM - hence this results in lot of confusion.&lt;br /&gt;&lt;br /&gt;So, lets understand the concepts one by one. A WSM agent is a component that is installed with the endpoint service. So it provides the 'last-mile' security (last security layer). Now OWSM also a gateway component where security policies can be employed in a central location. A gateway can also perform functions that an agent cannot do, such as message routing, transformations, and failover. OWSM also has an extension for OSB, that allows us to use OWSM policies at the OSB (ESB) layer. These capabilities would suffice the requirements of most intranet SOA infrastructures.&lt;br /&gt;&lt;br /&gt;Oracle positions the Oracle Enterprise Gateway as the first line of defence ("perimiter security")&amp;nbsp;when SOA services are exposed to the outside world. This is the equivalent of a DMZ firewall. So it looks like Oracle Enteprise Gateway is a more expansive product that can do everything that OWSM does, plus all the bells and whistles.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6493234933798078104?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6493234933798078104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6493234933798078104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6493234933798078104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6493234933798078104'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/11/oracle-web-service-manager-vs-oracle.html' title='Oracle Web Service Manager vs Oracle Enterprise Gateway'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2638390042079532216</id><published>2011-11-01T14:32:00.001+05:30</published><updated>2011-11-01T14:33:04.215+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDM'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Architecture'/><title type='text'>Ruminating on the Oracle MDM suite</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Recently during one of our internal brainstorming sessions, there was a lot of confusion over the various components available&amp;nbsp;on the Oracle platform to build&amp;nbsp;a&amp;nbsp;robust MDM solution. Part of the confusion was because Oracle has picked up best of breed components from various acquisitions and integrated them together to form the MDM suite. Its important to understand that when someone talks about &lt;a href="http://www.oracle.com/us/products/applications/master-data-management/index.html"&gt;Oracle MDM&lt;/a&gt; - it&amp;nbsp;is a suite of components and NOT just one product. &lt;br /&gt;&lt;br /&gt;Oracle's acquisition of Hyperion has further added to the confusion, as Hyperion has full capabilites to be used as a MDM solution. Oracle promotes Hyperion Data Relationship Manager as a component in its MDM suite - that can be used for managing the relationships between different attributes of master data from disparate sources. &lt;br /&gt;&lt;br /&gt;At the fundamental level, to build a MDM end-to-end solution, you need basic components such as a ETL tool, Data Profiler, Data Cleansing Engine that can be used for standarization, de-duplication, validation, etc. Given below are the core components of the Oracle MDM suite, followed by optional components that help in jump-starting your MDM journey.&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;Oracle Data Integrator Enterprise Edition&lt;/strong&gt;: ODI can be used for ELT style bulk data movement, or near real-time updates, and data services. ODI can consolidate master data from various sources and also publish master data to downstream applications. (Note: Oracle has acquired Golden Gate product that enables real-time intergration of data across disaparate data-sources. GG can also be used in conjuction with ODI for movement of data)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Oracle Data Quality / Data Profiling&lt;/strong&gt;: Oracle Data Profiling allows us to profile the master data and investigate the content and the structure of their different data sources. It also gives users the ability to monitor the evolution of data quality over time using Time Series. Oracle Data Quality allows us to standardize, validate, cleanse and enrich master data – for e.g. master list of securities, issuers, official list, etc. Using both these tools will ensure the integrity of data stored in the MDM data store.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Oracle Business Intelligence Suite&lt;/strong&gt;: OBIEE can be used for analytics and reporting on master data entities.&lt;/li&gt;&lt;/ul&gt;Besides these core components, Oracle MDM suite also contains pre-packaged MDM solutions such as “Customer Hub”, “Product Hub”, “Site Hub”, “Supplier Hub”, etc. (Some of these are part of Siebel MDM, I believe.) &amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2638390042079532216?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2638390042079532216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2638390042079532216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2638390042079532216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2638390042079532216'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/11/ruminating-on-oracle-mdm-suite.html' title='Ruminating on the Oracle MDM suite'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2932102849031087154</id><published>2011-10-27T17:54:00.001+05:30</published><updated>2011-10-27T17:54:45.330+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='IRM'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Ruminating on IRM (Information Rights Management)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;From a security architecture perspective, it is important to consider the need for using IRM technology. Traditionally we have secured access to documents using RBAC patterns for secure access and download.&lt;br /&gt;&lt;br /&gt;But how do you control the information once it is downloaded to the users machine? Can the user copy/paste from the document? Can the user print the document? Can the user forward the document to someone or upload it somewhere? Can he run macros on the document? So how can an enterprise have total control on sensitive information?&lt;br /&gt;&lt;br /&gt;These questions cannot be answered by classical access control mechanisms, they need a new security framework concept called "Information Rights Management". Many traditional ECM vendors also offer IRM adapters or add-ons to help customers have total centralized control over their digital assets. For e.g. SharePoint 2010 has &lt;a href="http://msdn.microsoft.com/en-us/library/ms439625.aspx"&gt;IRM protectors&lt;/a&gt; that can be plugged-in for end-to-end protection of documents on the user's computers.Oracle UCM can be extended with Oracle IRM, etc.&lt;br /&gt;&lt;br /&gt;Across all these IRM product architectures, it is necessary to have some form of client application installed on all users machines. Files that get downloaded from the DMS are special encrypted rights-managed files. The file format contains meta-data that defines the access that can be given to the user. The client application would decrypt the file, understand the access constraints and accordingly give rights to the user. On the windows platform, MS has long released the &lt;a href="http://www.microsoft.com/windowsserver2003/technologies/rightsmgmt/default.mspx"&gt;Windows Rights Management Services&lt;/a&gt; - a comprehensive API to address IRM challenges on the windows platform.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2932102849031087154?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2932102849031087154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2932102849031087154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2932102849031087154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2932102849031087154'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/10/ruminating-on-irm-information-rights.html' title='Ruminating on IRM (Information Rights Management)'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7668888827718928121</id><published>2011-08-11T18:40:00.001+05:30</published><updated>2011-08-11T18:41:09.922+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Parallel Computing'/><title type='text'>How does .NET TPL control the number of threads</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div closure_uid_ydt0w9="217"&gt;&lt;div closure_uid_rbbm57="201"&gt;I often wondered what heuristics the Task Parallel Library (TPL) in .NET uses to control the number of threads for optimal utilization on multi-core machines.&lt;/div&gt;&lt;div closure_uid_rbbm57="201"&gt;Found a great discussion thread on &lt;a href="http://stackoverflow.com/questions/3488381/does-the-task-parallel-library-or-plinq-take-other-processes-into-account"&gt;StackOverFlow&lt;/a&gt; explaining the details.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7668888827718928121?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7668888827718928121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7668888827718928121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7668888827718928121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7668888827718928121'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/08/how-does-net-tpl-control-number-of.html' title='How does .NET TPL control the number of threads'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8756677630733263432</id><published>2011-07-21T15:00:00.000+05:30</published><updated>2011-07-21T15:00:06.923+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA Governance'/><title type='text'>Techniques for Service Identification in SOA</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div closure_uid_hh0793="226"&gt;Its very important to use proper service identification techniques to identify services in an portfolio. In fact, service identification should be the first step in your service lifecycle management process.&lt;/div&gt;&lt;div closure_uid_hh0793="226"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div closure_uid_hh0793="226"&gt;Jotting down some of the techniques that we have been using for identifying services:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;div closure_uid_hh0793="226"&gt;&lt;em&gt;Domain decomposition approach&lt;/em&gt;&amp;nbsp;- Look at the high level business entities and create entity services for them.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div closure_uid_hh0793="226"&gt;&lt;em&gt;Top down BPM driven approach&lt;/em&gt;&amp;nbsp;- Start from the business processes and divide them into sub-processes. Each business process consists of tasks &amp;amp; activities, that&amp;nbsp;would orchestrate between different service components.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div closure_uid_hh0793="226"&gt;&lt;em&gt;Business Goal&amp;nbsp;driven approach&lt;/em&gt; - &amp;nbsp;Derive services from business goals. Decompose the business goals into a set of services that would help satisfy&amp;nbsp;the business goal. Provide tracability between business goals and IT services by a Goal/Business Service matix.&lt;/div&gt;&lt;/li&gt;&lt;li closure_uid_hh0793="233"&gt;&lt;div closure_uid_hh0793="226"&gt;&lt;em&gt;Existing systems&lt;/em&gt; - &amp;nbsp;Service wrappers are created on existing systems - to surface them for orchestration in a business process or a composite service. This technique may not be appropriate if the existing IT landscape is not aligned with business goals.&lt;/div&gt;&lt;/li&gt;&lt;li closure_uid_hh0793="233"&gt;&lt;div closure_uid_hh0793="226"&gt;&lt;em&gt;UI driven approach&lt;/em&gt; - Identify/discover services based on the user interface requirements. UI technologies such as Flash, Silverlight, Ext-JS directly call JSON/REST services on back-end application servers. &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8756677630733263432?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8756677630733263432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8756677630733263432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8756677630733263432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8756677630733263432'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/07/techniques-for-service-identification.html' title='Techniques for Service Identification in SOA'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3105704845635470647</id><published>2011-06-28T13:08:00.000+05:30</published><updated>2011-06-28T13:08:22.381+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMO'/><category scheme='http://www.blogger.com/atom/ns#' term='Search Engines'/><category scheme='http://www.blogger.com/atom/ns#' term='SEO'/><title type='text'>Ruminating on SEO</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;SEO (Search Engine Optimization) is an integral part of any Internet Marketing Campaign. SEO strives to increase the visibility of a website in search results. For SEO, we have to consider both on-page factors and off-page factors. Given below are some examples of what can be done on the site pages and what needs to be done outside the site pages.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;On-Page factors examples:&lt;/u&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Meta tags&lt;/li&gt;&lt;li&gt;Headings&lt;/li&gt;&lt;li&gt;Links&lt;/li&gt;&lt;li&gt;Keyword frequency (Internal Keyword linking strategy)&lt;/li&gt;&lt;li&gt;Site Structure (Create and submit site maps)&lt;/li&gt;&lt;li&gt;UI design that is "Search Engine Friendly" (Image Alt tags, Menus, etc.)&lt;/li&gt;&lt;li&gt;Make tagging and bookmarking easy.&lt;/li&gt;&lt;li&gt;Robots.txt &lt;/li&gt;&lt;li&gt;URL Normalization (if different URLs lead to the same content)&lt;/li&gt;&lt;/ul&gt;&lt;u&gt;Off-Page factors examples:&lt;/u&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;PageRank analysis (Increase no. of inbound links)&lt;/li&gt;&lt;li&gt; Utilize Social Networks, Forums to form a 'link partnership'. (Social Media Optimization - Social SEO)&lt;/li&gt;&lt;li&gt;Create and submit articles, blogs, RSS feeds that link to the site.&lt;/li&gt;&lt;li&gt;Create Sharable content - Mashup ready.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3105704845635470647?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3105704845635470647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3105704845635470647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3105704845635470647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3105704845635470647'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/06/ruminating-on-seo.html' title='Ruminating on SEO'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-9059977464319120590</id><published>2011-06-27T18:28:00.003+05:30</published><updated>2011-06-28T11:15:52.795+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Programming'/><title type='text'>XSL transformations on the brower</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Recently, I came across a web framework that was quite unconventional - the framework was performing XML transformations using XSLT on the browser. All web requests were directed to a legacy system that returned XML and this XML was directly sent to the brower. The browser had already loaded the necessary XSL, Javascript and does the XML -&amp;gt; HTML transformation.&lt;br /&gt;&lt;br /&gt;There are certain pros and cons of this approach.&lt;br /&gt;&lt;u&gt;Advantages:&lt;/u&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Clear separation of markup/layout from content.&lt;/li&gt;&lt;li&gt;Heavy XSL processing offloaded to the brower, brower JS code can check for brower compatibilities and spit out right markup code.&lt;/li&gt;&lt;/ul&gt;&lt;u&gt;Disadvantages&lt;/u&gt;:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;All browsers do not support XSL in a standard way. Can be quite a pain to make the look-n-feel compatible with all browsers.&lt;/li&gt;&lt;li&gt;Search engines/bots see raw XML, may not be able to interpret and understand.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Disables progressive rendering. User won't see anything      at all until entire stylesheet and data is loaded completely.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;XSL is pretty tough to master. Resource skill could become a potential bottleneck.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Could run into scalability issues for large XML payloads. When processing XML files, XSLT must load the entire document into memory.&lt;/li&gt;&lt;/ul&gt;IMHO, although XSLT processing in-browser is fast compared to server side, it is still better if no transformation is required at all. There are tons of server side web-frameworks that can do the job better and faster. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-9059977464319120590?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/9059977464319120590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=9059977464319120590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/9059977464319120590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/9059977464319120590'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/06/xsl-transformations-on-brower.html' title='XSL transformations on the brower'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7186446805875027346</id><published>2011-06-15T11:50:00.000+05:30</published><updated>2011-06-15T11:50:41.469+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Excel API'/><title type='text'>Open source API for read/write to Excel files</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Long back, I had &lt;a href="http://www.narendranaidu.com/2009/01/api-for-readingcreating-excel-files-in.html"&gt;blogged&lt;/a&gt; about native APIs in .NET and Java to read/write Excel files.&lt;br /&gt;Recently came across a new native .NET library that can be used to read/write Excel files and supports the binary BIFF format. This is the format used by Excel 2005 files - i.e. xls files. This API is still evolving and looks quite basic at this point of time.&amp;nbsp; &lt;br /&gt;The code is available here:&amp;nbsp; &lt;a href="http://code.google.com/p/excellibrary/"&gt;http://code.google.com/p/excellibrary/&lt;/a&gt;&lt;br /&gt;There is also a .NET port of the popular Apache POI library available at: &lt;a href="http://code.google.com/p/npoi/"&gt;http://code.google.com/p/npoi/ &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The new office (2007, 2010) documents&amp;nbsp; are based on XML standards (i.e. xlsx files). There are a couple of open source projects for creating and modifying 2007 'xlsx' excel files.&lt;br /&gt;1) &lt;a href="http://epplus.codeplex.com/"&gt;http://epplus.codeplex.com/&lt;/a&gt;&lt;br /&gt;2) &lt;a href="http://excelpackage.codeplex.com/"&gt;http://excelpackage.codeplex.com/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7186446805875027346?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7186446805875027346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7186446805875027346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7186446805875027346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7186446805875027346'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/06/open-source-api-for-readwrite-to-excel.html' title='Open source API for read/write to Excel files'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7932838999685786035</id><published>2011-04-13T14:38:00.001+05:30</published><updated>2011-04-13T14:38:57.057+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='BI/DW'/><title type='text'>Operational Reports vs MIS Reports</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Once organizations create a data warehouse, a lot of people push all the reporting needs to the DW. But do all reports need to run from a DW?&lt;br /&gt;The answer lies in understanding the difference between operational and informational (MIS) reports. A good article by &lt;a href="http://www.inmongif.com/inmon.html"&gt;Bill Inmon&lt;/a&gt; on this difference can be found &lt;a href="http://www.information-management.com/issues/20000701/2349-1.html"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Operational reports are typically detail oriented and shows the latest up-to-date records. Operational reports are used by stakeholders for short term tactical decision making. MIS reports look at summary data over a longer time horizon and are used for strategic decision making.&lt;br /&gt;&lt;br /&gt;Examples of operational reporting include bank teller end-of-day window  balancing reports, daily account audits and adjustments, daily  production records, flight-by-flight traveler logs and transaction logs. &lt;br /&gt;&lt;br /&gt;Examples of informational reporting include monthly sales trends, annual  revenue, regional sales by product line for the quarter, industry  production figures for the year, number of employees by quarter and  weekly shipping costs by carrier.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7932838999685786035?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7932838999685786035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7932838999685786035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7932838999685786035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7932838999685786035'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/04/operational-reports-vs-mis-reports.html' title='Operational Reports vs MIS Reports'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6510206401962898002</id><published>2011-03-23T13:06:00.001+05:30</published><updated>2011-03-23T13:06:01.926+05:30</updated><title type='text'>Activity Diagrams vs BPMN Diagrams</title><content type='html'>&lt;p&gt;For modeling business processes, there are two standards popular today &amp;ndash; UML 2.0 Activity Diagrams and BPMN.&lt;/p&gt;&lt;p&gt;There are semantic differences in notation between the two standards. For e.g. the way OR-splits, AND-splits/joins are shown.&lt;/p&gt;&lt;p&gt;A detailed whitepaper showcasing the differences between the two notations can be found &lt;a href="http://eprints.qut.edu.au/archive/00002977/01/2977.pdf"&gt;here&lt;/a&gt;. &lt;br /&gt;A discussion thread at &lt;a href="http://www.bpm-research.com/forum/index.php?showtopic=501"&gt;http://www.bpm-research.com/forum/index.php?showtopic=501&lt;/a&gt; makes an interesting read.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6510206401962898002?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6510206401962898002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6510206401962898002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6510206401962898002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6510206401962898002'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/03/activity-diagrams-vs-bpmn-diagrams_23.html' title='Activity Diagrams vs BPMN Diagrams'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5451038333531581290</id><published>2011-01-29T20:42:00.000+05:30</published><updated>2011-01-29T20:42:23.899+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Architecture'/><title type='text'>Business Function Models Vs Business Capability Models</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The difference between these models boils down to the difference between a “business function” and a “business capability”.&amp;nbsp; Many organizations use them interchangeably. For e.g. A business capability model may illustrate current-state business functions and also future-state business functions that need to be built to deliver on the business vision.&lt;br /&gt;But there are few folks who would like to draw a clear line of differentiation between the two.&amp;nbsp; Capability can be defined as the ability to perform actions to achieve specific strategic goals/objectives.&lt;br /&gt;&lt;br /&gt;The following links provide interesting reading:&lt;br /&gt;&lt;a href="http://ingenia.wordpress.com/2009/04/29/how-do-you-differentiate-between-a-business-function-and-a-capability/"&gt;Link 1&lt;/a&gt;&lt;br /&gt;&lt;a href="https://ingenia.wordpress.com/tag/business-function/"&gt;Link 2 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hence a business capability is much more than a business function – it encompasses other objects such as Actors, Services, Functions, Processes and Infrastructure.&amp;nbsp; Examples of business capability are – the ability to service customers through online channels, capability to survive liquidity crisis, etc. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5451038333531581290?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5451038333531581290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5451038333531581290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5451038333531581290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5451038333531581290'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/01/business-function-models-vs-business.html' title='Business Function Models Vs Business Capability Models'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6183611483324088261</id><published>2011-01-29T20:38:00.002+05:30</published><updated>2011-01-29T20:38:58.892+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Architecture'/><title type='text'>Business Architecture Models</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;While defining the enterprise architecture of an organization, it is essential to understand the various processes, functions and capabilities of the business. Recently came across the &lt;a href="http://upload.wikimedia.org/wikipedia/commons/b/b1/FEA_BRM_Hierachy.JPG"&gt;FEA Business Reference Model&lt;/a&gt; on Wikipedia. The simplicity of the diagram impressed me.&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;Every organization has different business areas or LOBs. Each business area has a set of business functions that it performs.&amp;nbsp; A ‘Business Function Model’ describes these functional areas and sub-functions in a graphical representation. An example of a BFM can be found &lt;a href="http://www.annapolis.gov/Government/Departments/Finance/ITplan/model.pdf"&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Each LOB executes its business functions by following certain business processes. &amp;nbsp;A business process is an orchestration of different business activities and tasks that may be exposed as SOA services. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6183611483324088261?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6183611483324088261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6183611483324088261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6183611483324088261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6183611483324088261'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/01/business-architecture-models.html' title='Business Architecture Models'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8022816761949528415</id><published>2011-01-18T18:48:00.000+05:30</published><updated>2011-01-18T18:48:17.048+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Various dimensions of Security</title><content type='html'>When we design our applications to be secure, we have to consider all aspects of security. I have often seen people associate security with just authentication and authorization, but there are other security principles to be considered as stated below.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Integrity&lt;/b&gt;: We have to ensure that all messages/data have not been tampered with. Integrity of messages ensures that the data has not been maliciously modified by 'man-in-the-middle'.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Confidentiality&lt;/b&gt;: This security principle ensures that all messages are encrypted and cannot be eavesdropped.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Authentication&lt;/b&gt;/&lt;b&gt;Authorization&lt;/b&gt;: Ensure that all resource access goes through a proper authentication process.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Non&lt;/b&gt;-&lt;b&gt;Repudiation&lt;/b&gt;: This ensures that any party involved cannot refute the validity of a message exchange.&lt;/li&gt;&lt;/ol&gt;Modern toolkits and technologies such as digital certifications satisfy all of the above security principles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8022816761949528415?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8022816761949528415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8022816761949528415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8022816761949528415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8022816761949528415'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/01/various-dimensions-of-security.html' title='Various dimensions of Security'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-73700692980850349</id><published>2011-01-17T16:48:00.000+05:30</published><updated>2011-01-17T16:48:12.815+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='BPM'/><title type='text'>Concurrent Business Engineering</title><content type='html'>Some time back, I had blogged about the advantages of having a unified BPM/SOA strategy at the enterprise level.&amp;nbsp; Ran through a &lt;a href="http://www.forrester.com/rb/Research/concurrent_business_engineering/q/id/37172/t/2"&gt;Forrestor report&lt;/a&gt; that touch a similar concept and calls it as "Concurrent Business Engineering".&lt;br /&gt;&lt;br /&gt;Concurrent Business Engineering entails greater colloboration between Business and IT for jointly working on defining new business processes and also defining the technology platform for supporting the processes.&lt;br /&gt;Business services are best designed with a strong understanding of the business process context, hence a top down BPM process-centric view would help in understanding what services need to be surfaced to provide maximum agility to the business process.&lt;br /&gt;&lt;br /&gt;This is similar to the idea of having a unified BPM/SOA strategy and utilizes the best of top-down and bottom-up methods for executing the business strategy - as &lt;a href="http://www.narendranaidu.com/2010/12/soa-and-bpm.html"&gt;blogged earlier&lt;/a&gt;.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-73700692980850349?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/73700692980850349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=73700692980850349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/73700692980850349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/73700692980850349'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/01/concurrent-business-engineering.html' title='Concurrent Business Engineering'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3983182356641120314</id><published>2011-01-14T18:47:00.000+05:30</published><updated>2011-01-14T18:47:16.327+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><title type='text'>Types of Services in SOA</title><content type='html'>Found a nice article on MSDN describing the various types of services - a taxonomy for services.&lt;br /&gt;Jotting down the concepts explained in the &lt;a href="http://msdn.microsoft.com/en-us/library/bb491121.aspx"&gt;article&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Entity Services&lt;/b&gt; - Expose/Surface business entities in the system.e.g. employee, customer, sales order,etc. They contain CRUD operations and additional domain specific operations - e.g. FindOrderByPrice Entity Services abstract the underlying datasources and persistence mechanisms. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Capability Services&lt;/b&gt; - Implement a specific business capability - for e.g. Pricing Service, Credit Card Processing Service, etc.&amp;nbsp;&amp;nbsp; They may use Entity Services for persistence.&lt;br /&gt;&lt;br /&gt;Thus Entity Services are "data-centric" and Capability Services are "action-centric". &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Process Services&lt;/b&gt; - Acts as a facade for a BPM process. Process services would maintain state due to the very nature of a workflow having to maintain state over a long running process.&amp;nbsp; Process Services are typically implemented using BPM tools such as WWF, Biztalk, WPS, etc. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Infrastructure Services (Utility Services)&lt;/b&gt; - Common cross cutting functions such as Logging, Auditing, Security, Authorization, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3983182356641120314?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3983182356641120314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3983182356641120314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3983182356641120314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3983182356641120314'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/01/types-of-services-in-soa.html' title='Types of Services in SOA'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5938952224669342696</id><published>2011-01-06T15:19:00.001+05:30</published><updated>2011-01-07T15:12:39.007+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA Governance'/><title type='text'>Ruminating on SOA Governance</title><content type='html'>&amp;nbsp;SOA Governance has two dimensions. First – the processes and methodologies used. Second – the tools and products used for governance. &lt;br /&gt;&lt;br /&gt;Quite often, people assume that the purchase of a SOA Governance tool would suffice for implementing SOA Governance. But the fact is that the tools would only help in automating certain enforcement policies and service lifecycle workflows. What is first needed is a framework of processes, policies and organization structure to be defined. Any governance process needs to embrace the trilogy of “people, process and technology”.&lt;br /&gt;&lt;br /&gt;The following diagram illustrates this point and states the various activities that need to be done for implementing SOA Governance. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_s_McoyM9Sao/TSWPrG3frBI/AAAAAAAACvo/tUcebOxF0vY/s1600/SOA_Governance_Model.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://2.bp.blogspot.com/_s_McoyM9Sao/TSWPrG3frBI/AAAAAAAACvo/tUcebOxF0vY/s320/SOA_Governance_Model.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_s_McoyM9Sao/TSWPv4VQgzI/AAAAAAAACvs/UDsPaYKfN7M/s1600/SOA_Governance_Model_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/_s_McoyM9Sao/TSWPv4VQgzI/AAAAAAAACvs/UDsPaYKfN7M/s320/SOA_Governance_Model_1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The Open Group has also published a SOA Governance Framework that can be accessed &lt;a href="https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?catalogno=c093"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5938952224669342696?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5938952224669342696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5938952224669342696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5938952224669342696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5938952224669342696'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2011/01/ruminating-on-soa-governance.html' title='Ruminating on SOA Governance'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s_McoyM9Sao/TSWPrG3frBI/AAAAAAAACvo/tUcebOxF0vY/s72-c/SOA_Governance_Model.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6448758159945053301</id><published>2010-12-29T13:27:00.000+05:30</published><updated>2010-12-29T13:27:38.689+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><title type='text'>SOA Registry, Repository and Service Catalog</title><content type='html'>While implementing enterprise SOA, it is important to consider deploying a service catalog for services. There is a lot of confusion between the concepts of registry, repository and service catalog.&lt;br /&gt;&lt;br /&gt;Traditionally a registry has been a lookup service provided to service consumers. Service providers register their services in the registry and service consumers select an appropriate service for their needs. Standards such as UDDI addressed these needs.The Registry would contain service descriptions, service contracts and service policies that describe a service. Service registries have also been practically used for determining a service end-point address at runtime based on the service unique name. &lt;br /&gt;&lt;br /&gt;So what is a repository? As the importance of SOA Governance grew, it became necessary to capture more meta-data about a service. A service repository integrates information about a service from multiple sources and stores it in a centralized database. Service information may include design artifacts, deployment topologies, service code repository, service monitoring stats, etc. Vendors have started positioning their generic asset management products as SOA repositories. For e.g. Rational Asset Manager.&lt;br /&gt;&lt;br /&gt;A lot of vendors now sell a combined product that consists of the registry and repository. For e.g.&lt;a href="http://publib.boulder.ibm.com/infocenter/sr/v7r0/index.jsp"&gt; IBM Websphere Registry and Repository. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A service catalog is a concept that can be implemented using SOA registry/repository products.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6448758159945053301?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6448758159945053301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6448758159945053301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6448758159945053301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6448758159945053301'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/12/soa-registry-repository-and-service.html' title='SOA Registry, Repository and Service Catalog'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6922741587370352911</id><published>2010-12-27T14:52:00.000+05:30</published><updated>2010-12-27T14:52:46.658+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Entities Vs Value Objects</title><content type='html'>In Domain Driven Design, we often separate Entities and Value Objects. Junior architects always get confused between these 2 concepts. &lt;br /&gt;The essential difference is that domain entities have an identity and a lifecycle. So each Entity has a unique identity and with a given domain, no two entities can have the same identity. Value objects need not have an identity. So if we have an "equals()" method that compares the parameter values of each value object, then we can have value objects that are identical. Value objects should ideally also be immutable. &lt;br /&gt;The following links offer interesting stuff on this concept.&lt;br /&gt;1) &lt;a href="http://www.lostechies.com/blogs/joe_ocampo/archive/2007/04/23/a-discussion-on-domain-driven-design-value-objects.aspx"&gt;Lostechies &lt;/a&gt;&lt;br /&gt;2) &lt;a href="http://stackoverflow.com/questions/75446/value-vs-entity-objects-domain-driven-design"&gt;StackOverflow&lt;/a&gt;&lt;br /&gt;3) &lt;a href="http://devlicio.us/blogs/casey/archive/2009/02/13/ddd-entities-and-value-objects.aspx"&gt;Devlicious&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6922741587370352911?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6922741587370352911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6922741587370352911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6922741587370352911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6922741587370352911'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/12/entities-vs-value-objects.html' title='Entities Vs Value Objects'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6815693739453784894</id><published>2010-12-17T17:58:00.002+05:30</published><updated>2010-12-17T17:59:26.217+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='TCO'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio Rationalization'/><title type='text'>TCO of applications during Portfolio Rationalization</title><content type='html'>In my previous blog post , I had narrated the process of &lt;a href="http://www.narendranaidu.com/2010/09/case-for-it-portfolio-rationalization.html"&gt;portfolio rationalization&lt;/a&gt;. During the fact finding process, we need to calculate the TCO of&amp;nbsp; an application. It’s a good idea to have a predefined template for entering all the parameters that add to the total cost of the application, i.e. hardware costs, software license costs, maintenance costs, data center costs, etc. &lt;br /&gt;&lt;br /&gt;We should also try to collect the TCO statistics over a time period; i.e. over the last 3-5 years. This data when plotted on a graph would help us in identifying patterns and spotting trends. For e.g. if the TCO of an application is showing steep increase with every passing year, then we need to be wary of the “cost of inactivity”. Cost of inactivity means what will happen if no action is taken? &lt;br /&gt;&lt;br /&gt;The TCO of applications should also be compared against the business value that the applications are providing. It may be that 70% of the TCO could be consumed by applications having 30% business value.&lt;br /&gt;Another important dimension to capture would be the usage statistics and performance SLAs over the last few years. If the number of uses are increasing and the SLAs are not been met, then it’s time for some proactive action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6815693739453784894?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6815693739453784894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6815693739453784894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6815693739453784894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6815693739453784894'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/12/tco-of-applications-during-portfolio.html' title='TCO of applications during Portfolio Rationalization'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2404765849472817433</id><published>2010-12-06T19:09:00.001+05:30</published><updated>2010-12-06T19:10:52.840+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='BPM'/><title type='text'>SOA and BPM</title><content type='html'>Yesterday, we were having a discussion with one of our customers on the hot topic of SOA and BPM strategy, i.e. can SOA/BPM initiatives be combined?, what are the challenges, pitfalls, best practices, etc. Jotting down some of the key points of the brainstorming session.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;To start with, its important to realize that both BPM/SOA has a common goal - greater business agility and to align IT with business. SOA and BPM complement each other and the potential benefits are compounded when you have a unified enterprise wide strategy for them.&lt;/li&gt;&lt;li&gt;BPM drives a process-centric thought process - right from design, implementation, monitoring and continuous optimization. BPM forces a paradigm shift from an application centric view to a process centric view. SOA is an architectural style where as BPM is a management discipline. &lt;/li&gt;&lt;li&gt;A combined BPM/SOA initiative will do the delicate balancing act between incremental and transformational change. Also a combined initiative should enable stakeholders to decide what important processes need that extra agility and prioritize them to be re-engineered as services because funding is always limited.&lt;/li&gt;&lt;li&gt;Top-down BPM appraoch drives the discovery of services since they provide important insights into understanding what parts of the IT portfolio can be exposed as SOA services. Thus BMP can provide a structured approach for identifying reusable business services. &lt;/li&gt;&lt;li&gt;SOA services also enable faster integration in BPM as the need for custom integration touch points reduces and this in turn enables faster deployment of BPM. SOA also enables rapid change of business processes which is not possible if the business process in embedded in a lot of traditiona non-SOA applications. For e.g. when a process needs to change to comply with a new regulation or due to a change in business strategy, then a loosely coupled BPM process orchestrated using SOA services is easier to change. New services can be plugged-in or existing services can be rearranged.&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;In today's fast changing business dynamics - "as is" and "to be" are simply temporal states of reality. The future state cannot be predicted, we can only stay prepared by keeping our business processes agile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2404765849472817433?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2404765849472817433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2404765849472817433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2404765849472817433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2404765849472817433'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/12/soa-and-bpm.html' title='SOA and BPM'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3577708534808043980</id><published>2010-12-02T19:19:00.002+05:30</published><updated>2010-12-02T19:20:18.934+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code Metrics'/><title type='text'>SONAR tool</title><content type='html'>My team has been evaluating the SONAR tool to manage code quality. I was impressed with the features and the user friendliness of the tool. &lt;a href="http://www.sonarsource.org/"&gt;SONAR &lt;/a&gt;can be used for both Java and .NET projects. It has a open plug-in architecture that allows any code quality tool to be plugged in. &lt;br /&gt;&lt;br /&gt;For example, for static code analysis it combines the power of popular tools such as PMD, checkStyle and FindBugs into an unified user interface that is great to use :)&lt;br /&gt;&lt;br /&gt;SONAR also has support for free code coverage tools such as &lt;a href="http://www.eclemma.org/jacoco/index.html"&gt;JaCoCo&lt;/a&gt;.&amp;nbsp; Code coverage can be measured by unit tests or integration tests. You can even drill down to source code level - something I love to do :)&lt;br /&gt;&lt;br /&gt;SONAR also integrates with new tools such as &lt;a href="http://www.sqale.org/details/details-indices-indicators"&gt;SQALE &lt;/a&gt;that have a formal approach for defining code quality in terms of maintainability, Testability, Reliability, Changeability, Efficiency, Security, Portability, Reusability, etc. Overall it is an invaluable tool to access &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html"&gt;Technical Debt&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3577708534808043980?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3577708534808043980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3577708534808043980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3577708534808043980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3577708534808043980'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/12/sonar-tool.html' title='SONAR tool'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6194148888128564339</id><published>2010-10-18T13:31:00.000+05:30</published><updated>2010-10-18T13:31:20.552+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Activation bar in UML Sequence Diagrams</title><content type='html'>A lot of folks get confused between the "life-line" concept and "activation bar" concept in Sequence Diagrams.&lt;br /&gt;&lt;br /&gt;The vertical lines drawn are called the lifeline of the object. When the object is no longer alive, then we can draw an 'X' at the bottom of the line. So why do we need an activation bar? I have seen a lot of architects choosing not to draw the activation bar to keep the diagrams simple.&lt;br /&gt;&lt;br /&gt;The activation bar (a.k.a focus of control) represents the time the object is "active", i.e. doing some processing, computing something, waiting for a response from a sub-routine, etc. So it is possible to model multiple interactions in a single diagram - for e.g. a lifeline can have nultiple activation bars.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6194148888128564339?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6194148888128564339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6194148888128564339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6194148888128564339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6194148888128564339'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/10/activation-bar-in-uml-sequence-diagrams.html' title='Activation bar in UML Sequence Diagrams'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1708413483917705842</id><published>2010-10-15T16:29:00.000+05:30</published><updated>2010-10-15T16:29:26.081+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Portals'/><category scheme='http://www.blogger.com/atom/ns#' term='Portlets'/><title type='text'>Good whitepaper on WSRP Portlets</title><content type='html'>A friend of mine was confused on the concept of remote portlets and the WSRP protocol. I forwarded him this &lt;a href="http://www.oasis-open.org/committees/download.php/2634/WSRP%20Whitepaper%20-%20rev%202.doc"&gt;cool whitepaper&lt;/a&gt; that explains the concept of remote portlets in a simple and lucid language.&lt;br /&gt;&lt;br /&gt;Some snippets from the whitepaper:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Remote portlets enable dynamic integration of business applications and information sources into portals.&lt;br /&gt;This approach only works if all portlets are physically installed at the employee portal; the process of making new portlets available is tedious and expensive.&lt;br /&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Instead of just providing raw data or single business functions that still require special rendering on the portal side, Web Services for Remote Portlets (WSRP) are presentation-oriented, interactive web services. &lt;br /&gt;They are easy to aggregate and can be invoked through a common interface using generic portlet-independent code that is built into the portal. In addition, re-implementation of the presentation layer on each portal is avoided. The use of generic portlet proxies consuming all WSRP services conforming to the common interface eliminates the need to develop service-specific portlets to run on the portal.&lt;br /&gt;&lt;br /&gt;The big difference between WSRP services and data-oriented web services is that they are presentation-oriented, interactive services that all have one common interface. This means that they simple plug into portal servers and do not require any service-specific code on the consuming portal.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Another point to consider is the comparison of remote portlets with mashups? Are they the same? Remote portlets and WSRP standards can be used to create mashups, but portlets also bring in the advantage of personalization and customization. Mashup's also need not just refer to aggregation of content. Wikipedia describes mashup as "A mashup is a website or Web 2.0 application that uses content from  more than one source to create a completely new service. This is akin to  transclusion." For e.g. tons of new applications built on top of Google Maps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1708413483917705842?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1708413483917705842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1708413483917705842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1708413483917705842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1708413483917705842'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/10/good-whitepaper-on-wsrp-portlets.html' title='Good whitepaper on WSRP Portlets'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6029112563874113274</id><published>2010-09-22T18:26:00.000+05:30</published><updated>2010-09-22T18:31:11.203+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Portfolio Rationalization'/><title type='text'>The case for IT Portfolio Rationalization</title><content type='html'>Un-rationalized IT portfolio is a critical issue facing many organizations. There are a plethora of reasons why an IT portfolio becomes ‘bloated’ with an ever increasing inventory of applications running of multiple platforms. It could be because of mergers and acquisitions, lack of enterprise architecture standards and IT governance, legacy applications that need to undergo a technology refresh cycle, etc. As a result of this, a majority of the IT budget is spent on “keeping the lights on”, rather than investing on new strategic initiatives. This in turn results in poor business-IT alignment.&lt;br /&gt;&lt;br /&gt;Continuous Portfolio Assessment and periodic Rationalization of IT assets is needed to lower the TCO of the IT portfolio and enable business agility. Portfolio assessment and optimization should be an integral part of the organizations EA group.&lt;br /&gt;&lt;br /&gt;Any portfolio rationalization exercise would start with an assessment of the current state. Here pre-defined templates to capture the high level IT landscape would be beneficial. More comprehensive templates would be required to capture the details of each application. Information parameters such as application infrastructure, business process supported, TCO, pain areas, etc. would be captured.&lt;br /&gt;&lt;br /&gt;The second step would be group applications into clusters. A ‘cluster’ is nothing but a group of applications that are similar in semantics - from a business perspective or a technology architecture perspective. For e.g. applications collaborating or orchestrated to fulfill a business process, a cluster of web applications running of the same technology stack - Websphere App Server on Solaris.&lt;br /&gt;&lt;br /&gt;Each application cluster is then evaluated across various dimensions – such as Business value, Business functionality adherence, Current or Future Technology standards adherence, EA standards conformance,  SLA conformance, TCO, etc. Based on the rating and the weightage given to each parameter, we would arrive at final scores. Based on the scoring, application clusters would be segmented into 4 categories – retain, enhance, replace, retire/sunset.&lt;br /&gt;&lt;br /&gt;The final step is to define roadmaps for the transformation – a set of project streams/initiatives that would be required. A project prioritization framework would help in sequencing the selected initiatives. Pre-defined templates for project prioritization would come in handy here. Here again a metrics driven approach would work; wherein we evaluate the priority of the selected work streams based on parameters such as business impact, risk, technology skills, cost/investment required.&lt;br /&gt;&lt;br /&gt;It is also very important to define a governance body to manage the rationalization program and sustain it. The governance body would have participation from both business and IT stakeholders.&lt;br /&gt;&lt;br /&gt;The end deliverables of the rationalization exercise would be:&lt;br /&gt;1. Matrix of applications segmented into 4 categories – retain, enhance, replace, retire/sunset&lt;br /&gt;2. Define project streams (rationalization roadmaps) and project sequencing (prioritization)  to meet the future state E A vision&lt;br /&gt;3. Define opportunities/initiatives for business process optimization and reduction of TCO&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6029112563874113274?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6029112563874113274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6029112563874113274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6029112563874113274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6029112563874113274'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/09/case-for-it-portfolio-rationalization.html' title='The case for IT Portfolio Rationalization'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2318859241284707347</id><published>2010-08-19T17:50:00.000+05:30</published><updated>2010-08-19T18:03:12.930+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estimates'/><category scheme='http://www.blogger.com/atom/ns#' term='Scheduling'/><title type='text'>Estimates and Scheduling</title><content type='html'>Read an interesting &lt;a href="http://www.joelonsoftware.com/items/2007/10/26.html"&gt;article &lt;/a&gt;by Joel on software scheduling. Most organizations either use the use-case point estimation method or the function point estimation method.&lt;br /&gt;&lt;br /&gt;But the best estimates come from experienced designers and developers - because you have done something similar in the past, you are more confident of the estimates you give.&lt;br /&gt;But how can you bring in these past experiences of people into your estimation process. We would need to collect data on all past and present projects and extract metrics from them.&lt;br /&gt;&lt;br /&gt;In the article, Joel talks about "evidence-based scheduling (EBS)" - i.e. base your future estimates on past experiences and developer productivity. It might be difficult to record the productivity of each and every developer, but we can create clusters for a developer group based on yrs of experience.&lt;br /&gt;&lt;br /&gt;The most interesting point regarding EBS was that you do not have a single delivery date - you only have probabilities assigned to a range of dates. I always struggled selling this concept to program managers and customers. The point is that its impossible to predict the exact date of shipment at the start of the project. Based on fine granular tasks and past estimation data, we can use algorithms such as "Monte Carlo Simulation" to arrive at a range of dates each with a probability index assigned to it - similar to the image below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.joelonsoftware.com/items/2007/10/26ebs1.png"&gt;&lt;img style="cursor: pointer; width: 470px; height: 250px;" src="http://www.joelonsoftware.com/items/2007/10/26ebs1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2318859241284707347?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2318859241284707347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2318859241284707347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2318859241284707347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2318859241284707347'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/08/estimates-and-scheduling.html' title='Estimates and Scheduling'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2216820278432026499</id><published>2010-07-05T13:57:00.000+05:30</published><updated>2010-07-05T14:42:44.685+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Use of Generics in .NET webservices</title><content type='html'>Recently, one of my team members was trying out an idea of using a generic container "response" object for all return types from the webservice. The advantage of doing so was that we would just have one generic "Response&lt;t&gt;" object instead of many response objects for different operations - hence it would be easier for clients to extract data and consistently get other meta-data information in the Reponse object such as "Success/Error messsage", "Count", etc.&lt;br /&gt;Given below is sample code showing the generic response data contract.&lt;br /&gt;-------------------------------------------&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;&lt;br /&gt;[DataContract]&lt;br /&gt;public class Response&lt;T&gt;&lt;br /&gt;{&lt;br /&gt;[DataMember]&lt;br /&gt;public T Data { get; set; }&lt;br /&gt;[DataMember]&lt;br /&gt;public List&lt;t&gt; DataCollection { get; set; }&lt;br /&gt;[DataMember]&lt;br /&gt;public string ErrorMessage { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[DataContract]&lt;br /&gt;public class Customer&lt;br /&gt;{&lt;br /&gt;[DataMember]&lt;br /&gt;public string Name { get; set; }&lt;br /&gt;[DataMember]&lt;br /&gt;public int Age { get; set; }&lt;br /&gt;[DataMember]&lt;br /&gt;public decimal ContactNo { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[DataContract]&lt;br /&gt;public class Vendor&lt;br /&gt;{&lt;br /&gt;[DataMember]&lt;br /&gt;public string VendorName { get; set; }&lt;br /&gt;[DataMember]&lt;br /&gt;public int Rating { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;-------------------------------------------&lt;br /&gt;As you can see, the actual return object (e.g. vendor, customer) is wrapped in a generic response object. Given below is code snippet of the webservice/WCF service.&lt;br /&gt;-------------------------------------------&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;public class GenericService : IGenericService&lt;br /&gt;{&lt;br /&gt;public Response&lt;vendor&gt; DoOtherWork()&lt;br /&gt;{&lt;br /&gt;Response&lt;vendor&gt; res = new Response&lt;vendor&gt;();&lt;br /&gt;Vendor c = new Vendor();&lt;br /&gt;c.VendorName = "Rocky"; c.Rating = 3;&lt;br /&gt;res.Data = c;&lt;br /&gt;res.ErrorMessage = "Big Errors";&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Response&lt;customer&gt; DoWork(int i)&lt;br /&gt;{&lt;br /&gt;Response&lt;customer&gt; res = new Response&lt;customer&gt;();&lt;br /&gt;List&lt;customer&gt; lstcust = new List&lt;customer&gt;();&lt;br /&gt;Customer c = new Customer();&lt;br /&gt;c.Name = "Rocky"; c.Age = 26; c.ContactNo = 7688890909;&lt;br /&gt;int j = 0;&lt;br /&gt;Customer c1 = new Customer();&lt;br /&gt;c1.Name = "dfgdfgRocky"; c1.Age = 26; c1.ContactNo = 7688890909;&lt;br /&gt;&lt;br /&gt;lstcust.Add(c); lstcust.Add(c1);&lt;br /&gt;res.DataCollection = lstcust;&lt;br /&gt;res.ErrorMessage = "No Errors";&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;-------------------------------------------&lt;br /&gt;It was interesting to see how the .NET framework handled this in the WSDL. What complex types are created in the WSDL? This was important because the WCF services could potentially be used by Java and Ruby clients.&lt;br /&gt;Here we found a hitch - the WSDL schema had 2 complex types such as "ResponseOfCustomer24335423" and "ResponseOfVendor24r58sdf". This WSDL worked fine when we created stubs in Java by importing the WSDL. But only the random numbers appended at the end of the complex schema was a problem from naming standards and clarity point of view. You would not want your callers to keep wondering why such strange names were given.&lt;br /&gt;But here again, we found an easy workaround. While defining the data-contract, we have the option of specifying the name of the complex type it should appear as in WSDL.&lt;br /&gt;So we just added one key value pair to the Data Contract attribute as follows.&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;-------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;[DataContract(Name = "ResponseOf{0}")]&lt;/strong&gt;&lt;br /&gt;public class Response&lt;t&gt;&lt;br /&gt;{&lt;br /&gt;[DataMember]&lt;br /&gt;public T Data { get; set; }&lt;br /&gt;[DataMember]&lt;br /&gt;public List&lt;t&gt; DataCollection { get; set; }&lt;br /&gt;[DataMember]&lt;br /&gt;public string ErrorMessage { get; set; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;-------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;span style="font-family:arial;font-size:100%;"&gt;This was cool as could have a placeholder "{0}" for the type passed to the generic container class.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Once we did this, the complex types in the WSDL has user friendly names such as "ResponseOfCustomer" and "ResponseOfVendor".&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2216820278432026499?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2216820278432026499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2216820278432026499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2216820278432026499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2216820278432026499'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/07/use-of-generics-in-net-webservices.html' title='Use of Generics in .NET webservices'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8135886451449134692</id><published>2010-06-23T19:02:00.000+05:30</published><updated>2010-06-23T19:05:29.088+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Rule Engine'/><title type='text'>What rules to put in a BRE?</title><content type='html'>Most organizations today understand the value of externalizing rules from application code by using a Business Rules Engine. The agility and flexibility derived from BREs allows for quicker roll out of new business rules and better business IT alignment.&lt;br /&gt;&lt;br /&gt;But how do we determine what business rules should go into the BRE? Not all business logic needs to go into a BRE. The following methodology can be used to arrive at a good set of externalized business rules.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Prepare a set of variable data/rules for the application. Ask questions such as: What changes? Frequency of change? Who/What triggers the change?&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Assign importance of agility to each variable data. What changes are time-critical? Business Impact if a business rule is not changed in time? Business benefit if we can change the variable data quickly.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Check if business users can make changes to the variable data. For e.g. if-else conditions can be handled by a business analyst, but change in complex statistical formulas may not be easy.&lt;/li&gt;&lt;/ul&gt;If we go through the above thought process, we can arrive at a logical set of variable data and rules that should be externalized by the system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8135886451449134692?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8135886451449134692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8135886451449134692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8135886451449134692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8135886451449134692'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/06/what-rules-to-put-in-bre.html' title='What rules to put in a BRE?'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-9026313395800358833</id><published>2010-05-18T14:04:00.000+05:30</published><updated>2010-05-18T14:38:33.321+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Insurance'/><title type='text'>CLUE database in Insurance</title><content type='html'>&lt;p&gt;The CLUE (Comprehensive Loss Underwriting Exchange) is a database of insurance losses and claims that was created and is maintained by ChoicePoint. &lt;a href="http://www.lexisnexis.com/risk/solutions/clue-property.aspx"&gt;ChoicePoint &lt;/a&gt;was taken over by LexisNexis some time back. LexisNexis C.L.U.E. Property reports contain up to seven years of personal property claims matching the search criteria submitted by the inquiring insurance company. So it's the equivalent of credit reports in the insurance industry. ChoicePoint also maintains a database for &lt;a href="http://www.lexisnexis.com/risk/solutions/clue-personal-auto.aspx"&gt;personal auto claims &lt;/a&gt;history. &lt;/p&gt;&lt;p&gt;When we apply for a homeowner's or auto insurance policy, the insurance company orders and review our CLUE report. A CLUE report is a document containing your personal information, as well as data regarding past property claims that have been paid under your previous insurance policies. CLUE reports includes the type of property (vehicle or home), dates of losses, loss descriptions and amounts paid.&lt;/p&gt;&lt;p&gt;Insurance companies use information on CLUE reports to evaluate homeowner's and auto insurance applicants for acceptability. Information can also be used to determine your policy premiums. CLUE reports are used almost exclusively to underwrite and rate new policies. Most insurers renewing existing policies do not access CLUE reports at renewal, largely because they already have loss histories for these properties in their own database. Only insurance companies that subscribe to CLUE can submit loss data and access CLUE reports.&lt;/p&gt;&lt;p&gt;A software program called Quick Connect has been designed by ChoicePoint for sending and receiving information electronically to and from ChoicePoint.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-9026313395800358833?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/9026313395800358833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=9026313395800358833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/9026313395800358833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/9026313395800358833'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/clue-database-in-insurance.html' title='CLUE database in Insurance'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6420031339825511216</id><published>2010-05-13T17:40:00.001+05:30</published><updated>2010-05-13T18:16:32.999+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><title type='text'>Conceptual model for SOA</title><content type='html'>Just read a very interesting blog post from &lt;a href="http://blogs.msdn.com/nickmalik/about.aspx"&gt;Nick Malik&lt;/a&gt;, where in he provides a &lt;a href="http://blogs.msdn.com/nickmalik/archive/2010/04/16/service-oriented-architecture-conceptual-model.aspx"&gt;Common Conceptual Model for SOA&lt;/a&gt;. I was bowled over by the simplicity of the language and diagram. So easy to explain to a fellow architect embarking on a design assignment based on SOA.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nickmalik/WindowsLiveWriter/ServiceOrientedArchitectureConceptualMod_13132/SV%20-%20SOA%20Concepts_4.png"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 400px; CURSOR: hand" border="0" alt="" src="http://blogs.msdn.com/blogfiles/nickmalik/WindowsLiveWriter/ServiceOrientedArchitectureConceptualMod_13132/SV%20-%20SOA%20Concepts_4.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The most &lt;a href="http://blogs.msdn.com/nickmalik/archive/2007/06/12/canonical-model-canonical-schema-and-event-driven-soa.aspx"&gt;important things &lt;/a&gt;to work on in a SOA project:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Canonical Data Model&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Canonical Message Model (Shared Message Contract)&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Service Interfaces&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Business Event Taxanomy&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;I have seen that if you get these fundamentals right during the design process, then building scalable SOA based systems is a lot easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6420031339825511216?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6420031339825511216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6420031339825511216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6420031339825511216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6420031339825511216'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/conceptual-model-for-soa.html' title='Conceptual model for SOA'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1637708609331526298</id><published>2010-05-12T19:03:00.000+05:30</published><updated>2010-05-12T19:14:52.149+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><title type='text'>Why Enterprise Architecture?</title><content type='html'>Recently a friend of mine asked me to explain in simple terms the benefit of having an Enterprise Architecture for an organization. The challenge was to translate the message in non-technical non-complex terms without any jargon. He apparently had read an EA white-paper by a big analyst firm and had his head spinning :) . I won’t blame him – this is a problem with ‘complex definitions’.&lt;br /&gt;&lt;br /&gt;As architects, the most important challenge that we solve day-in and day-out is in reducing and managing IT complexity. Yet, it’s an irony that many architects/analysts use ‘complex long phrases’ to describe even the simplest of concepts.&lt;br /&gt;&lt;br /&gt;Enterprise architecture is required to give a holistic view of the entire IT landscape of the organization. This enables the organization to view its current state and plan for the future state of its IT operations. EA is very useful to plan and prioritize your IT budgets in accordance with your important business priorities. It serves as a powerful communication tool between the business and IT teams and helps align new IT investments appropriately. Organizations have also started using EA as a tool for risk management and SWOT analysis.&lt;br /&gt;&lt;br /&gt;Thus having an Enterprise Architecture Framework helps us in visualizing the ‘big picture’ and the relationship between different domains. It also leads to better governance and low maintenance cost enabled by enforcement of technology standards and architecture guidelines.&lt;br /&gt;&lt;br /&gt;Quite often, EA is compared to ‘city planning’. In city planning, you look at the big picture and establish zones for specific purposes. It lays down the guidelines and best practices for buildings, roads, water supply, hospitals, etc. The design of each building is analogous to ‘Solution Architecture’. The special skill of designing a kitchen is analogous to ‘technical/application architecture’.&lt;br /&gt;&lt;br /&gt;So to summarize, EA has the following advantages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Helps build a common understanding of the future IT direction of the enterprise.&lt;/li&gt;&lt;li&gt;Provide clear mapping of the business processes and the IT systems supporting it. Provides visibility into how the business processes enable the mission of the enterprise.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Improves interoperability and integration by defining enterprise canonical message models and data models. Also integration standards and guidelines - for e.g. SOA, MOM, etc.&lt;/li&gt;&lt;li&gt;Enables organizational agility - If we need to respond to a business change, what is the impact on the IT systems, etc.&lt;/li&gt;&lt;li&gt;Less cost due to technical homogenity that is easier to support and maintain.&lt;/li&gt;&lt;li&gt;Powerful tool for communicating risk and change to all stakeholders in the enterprise.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There are a number of frameworks for defining EA – popular among them are the&lt;a href="http://narencoolgeek.blogspot.com/2008/12/zachman-framework.html"&gt; Zachman Framework &lt;/a&gt;and &lt;a href="http://www.opengroup.org/togaf/"&gt;TOGAF&lt;/a&gt;. I had also blogged earlier about &lt;a href="http://narencoolgeek.blogspot.com/2010/05/opensource-ea-tools.html"&gt;tools &lt;/a&gt;used for creating an EA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1637708609331526298?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1637708609331526298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1637708609331526298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1637708609331526298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1637708609331526298'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/why-enterprise-architecture.html' title='Why Enterprise Architecture?'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5621512119099630906</id><published>2010-05-12T18:14:00.000+05:30</published><updated>2010-05-12T18:22:09.501+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><title type='text'>OpenSource EA tools</title><content type='html'>Planning to evaluate a couple of open source Enteprise Architecture tools that are becoming popular. IBM &lt;a href="http://www.ibm.com/software/awdtools/systemarchitect/"&gt;System Architect&lt;/a&gt; was the de-facto commercial EA tool in the market and we were actively using it for our customers.&lt;br /&gt;&lt;br /&gt;First is &lt;span&gt;"&lt;a href="http://www.enterprise-architecture.org/"&gt;The Essential Project&lt;/a&gt;" that was launched last year. It is based on the &lt;a href="http://protege.stanford.edu/"&gt;Protégé &lt;/a&gt;ontology tool and allows you to create a meta-model for your EA. It has a EA repository and reporting tools.&lt;br /&gt;&lt;br /&gt;Second is a tool called "&lt;/span&gt;&lt;a href="http://www.iteraplan.com/en"&gt;iteraplan&lt;/a&gt;". This tool is more popular in Europe and also has an Enterprise Edition that is free for use, but without the source code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5621512119099630906?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5621512119099630906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5621512119099630906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5621512119099630906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5621512119099630906'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/opensource-ea-tools.html' title='OpenSource EA tools'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8432940404804260661</id><published>2010-05-11T17:48:00.001+05:30</published><updated>2010-05-11T17:56:26.259+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflection'/><title type='text'>Creating Dynamic classes in Java</title><content type='html'>Earlier I had &lt;a href="http://narencoolgeek.blogspot.com/2005/06/use-of-reflection-in-net-to-create.html"&gt;blogged &lt;/a&gt;about the ability to create new classes from scratch in .NET.&lt;br /&gt;I was looking for something similar to Reflection.Emit() in Java. Found a few examples on the web that use the Java compiler to compile source code dynamically and use Reflection to execute the methods.&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html?page=5"&gt;http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html?page=5&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.rgagnon.com/javadetails/java-0039.html"&gt;http://www.rgagnon.com/javadetails/java-0039.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Other option is to use byte-code manipulation libraries such as &lt;a href="http://jakarta.apache.org/bcel/"&gt;BCEL&lt;/a&gt;, &lt;a href="http://asm.ow2.org/"&gt;ASM&lt;/a&gt;, etc. A good list of open source byte code libraries are given at:&lt;br /&gt;&lt;a href="http://www.java-opensource.com/open-source/bytecode-libraries.html"&gt;http://www.java-opensource.com/open-source/bytecode-libraries.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8432940404804260661?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8432940404804260661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8432940404804260661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8432940404804260661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8432940404804260661'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/creating-dynamic-classes-in-java.html' title='Creating Dynamic classes in Java'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3170656576820761368</id><published>2010-05-11T14:20:00.000+05:30</published><updated>2010-05-11T14:33:55.980+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Payment Gateway'/><title type='text'>Payment Gateways</title><content type='html'>We were exploring the various options for selecting a payment gateway for a new business opportunity. Found this site that has a good explanation of payment gateways and compares the popular payment gateways available in the market.&lt;br /&gt;&lt;a href="http://www.bestpaymentgateways.com/"&gt;http://www.bestpaymentgateways.com/&lt;/a&gt;&lt;br /&gt;The site has a brief explanation on each payment gateway. The following gateways are explained.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Amazon Payment Gateway&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Authorize.net&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;PayPal PayFlow Pro&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;VeriSign   &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Google Checkout   &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Moneybookers   &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;VerePay   &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;WorldPay   &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3170656576820761368?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3170656576820761368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3170656576820761368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3170656576820761368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3170656576820761368'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/payment-gateways.html' title='Payment Gateways'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-4715566601286006255</id><published>2010-05-10T18:00:00.001+05:30</published><updated>2010-05-10T18:15:47.070+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><title type='text'>Parsing and reading text from PDF files</title><content type='html'>One of my development teams was looking for a PDF parsing library. They essentially wanted to search and extract data from PDF files. At first, I thought that &lt;a href="http://en.wikipedia.org/wiki/Optical_character_recognition"&gt;OCR &lt;/a&gt;is the only way to achieve this, but there are libraries available to help us :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pdfbox.apache.org/index.html"&gt;PDFBox &lt;/a&gt;: This seems to be most popular library for extracting text out of PDF files. This is a Java library, but also has a .NET wrapper around it using &lt;a href="http://www.ikvm.net/"&gt;iKVM.NET &lt;/a&gt;&lt;br /&gt;Simple examples using this library can be found &lt;a href="http://devpinoy.org/blogs/marl/archive/2008/03/04/pdf-to-text-using-open-source-library-pdfbox-another-sample-for-grade-1-pupils.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://pdfbox.apache.org/userguide/text_extraction.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://itextpdf.com"&gt;iText &lt;/a&gt;&amp;amp; &lt;a href="http://itextsharp.sourceforge.net/"&gt;iTextSharp &lt;/a&gt;: These libraries are very popular for PDF generation and can also be used for extracting text from PDF files. Sample example can be found &lt;a href="http://itextpdf.com/examples/index.php?page=example&amp;amp;id=275"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have heard that&lt;a href="http://api.openoffice.org/"&gt; OpenOffice.org&lt;/a&gt; also provides you with a Java API that can be used to create and manipulate PDF files, but have not tried it yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-4715566601286006255?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/4715566601286006255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=4715566601286006255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4715566601286006255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4715566601286006255'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/parsing-and-reading-text-from-pdf-files.html' title='Parsing and reading text from PDF files'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8014716948638184034</id><published>2010-05-06T17:54:00.000+05:30</published><updated>2010-05-06T18:07:07.936+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Datawarehouse vs Datamart</title><content type='html'>The debate between creating a datamart or sourcing data from the datawarehouse springs up from time to time across organizations. Found some good links on the web on this great debate:&lt;br /&gt;&lt;a href="http://www.information-management.com/infodirect/19991120/1675-1.html"&gt;information-management&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.exforsys.com/tutorials/data-warehousing/the-difference-between-data-mart-and-data-warehouse.html"&gt;exforsys.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://opensourceanalytics.com/2006/03/14/data-mart-vs-data-warehouse-the-great-debate"&gt;opensourceanalytics.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8014716948638184034?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8014716948638184034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8014716948638184034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8014716948638184034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8014716948638184034'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/05/datawarehouse-vs-datamart.html' title='Datawarehouse vs Datamart'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6797738728990062256</id><published>2010-04-28T21:18:00.000+05:30</published><updated>2010-04-28T21:26:28.344+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Performance issues with an in-memory Datatable select clauses</title><content type='html'>Very often, we cache .NET Datatable objects in memory. This could be for lookup tables or for other frequently accessed data. The following article on MSDN points out that using 'select' on a Datatable can be very very slow.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd364983.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd364983.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Snippet from the article:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-style: italic;"&gt;"Select takes arbitrary criteria and returns an array of DataRows.  Essentially, DataTable.Select has to walk the entire table and compare every record  to the criteria that you passed in. "&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The performance stats for LINQ in the article look very impressive. Looks like Microsoft has made a lot of optimizations on LINQ. It would be great to know (see source code) of what happens behind the scenes and why LINQ is so damn fast!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6797738728990062256?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6797738728990062256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6797738728990062256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6797738728990062256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6797738728990062256'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/04/performance-issues-with-in-memory.html' title='Performance issues with an in-memory Datatable select clauses'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8394406083257719134</id><published>2010-04-28T10:03:00.000+05:30</published><updated>2010-04-28T10:10:18.730+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET PDF creation tools</title><content type='html'>Some time back, I had &lt;a href="http://narencoolgeek.blogspot.com/2007/05/generating-pdfs-on-fly.html"&gt;blogged&lt;/a&gt; about the opensource tools available in Java and .NET for PDF creation. Recently came across another commerical library called "&lt;a href="http://www.dynamicpdf.com/"&gt;Dynamic PDF&lt;/a&gt;" for PDF creation. This library has a Java and .NET version of the API.&lt;br /&gt;The library is easy to use and is very robust. It handles 'over-flowing' tables and text areas in PDF files very gracefully.&lt;br /&gt;Another interesting library that Dynamic PDF sells is the &lt;a href="http://www.dynamicpdf.com/Dot_NET_Dynamic_PDF_Components_Libraries_PrintManager.csp"&gt;DynamicPDF™ PrintManager for .NET &lt;/a&gt;. This library makes it so simple to print PDFs and also has callback handlers for error messages from printers - all pure managed code. Now that's what I like :)&lt;br /&gt;&lt;br /&gt;Two opensource .NET PDF generation tools are &lt;a href="http://www.pdfsharp.net/"&gt;PDFSharp &lt;/a&gt;and &lt;a href="http://itextsharp.sourceforge.net/"&gt;iTextSharp&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8394406083257719134?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8394406083257719134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8394406083257719134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8394406083257719134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8394406083257719134'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/04/net-pdf-creation-tools.html' title='.NET PDF creation tools'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-129808717013831328</id><published>2010-04-28T00:55:00.000+05:30</published><updated>2010-04-28T01:20:28.260+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML Schema'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>XSD to XML and vice versa</title><content type='html'>I was looking for a quick and free tool that could convert XSD schema files to sample XML files and also generate a XSD file from a sample XML file. Commerical tools such as XML Spy and OxygenXML were powerful tools that provided these features, but I was looking for a free one.&lt;br /&gt;First I checkout the open source Java IDEs.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://netbeans.org/"&gt;Netbeans &lt;/a&gt;had a beautiful editor to visualize and edit a XSD schema in a graphical tree structure. But unfortunately it did not have the ability to generate sample XML file or vice versa.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/"&gt;Eclipse &lt;/a&gt;too had a visual editor and allowed visual editing of schema elements. It could generate a sample XML file from a XSD file, but had no option for the reverse; i.e. generating a schema file from a sample XML.&lt;/li&gt;&lt;li&gt;VS 2008 SP1 had both the options - coversion between XML and XSD. For schema files, right click on a node in XSD Explorer view and select "Generate XML". For XML files, select "Tools -&gt; Generate schema" to create the XSD file. Both these operations are very quick in Visual Studio.&lt;/li&gt;&lt;li&gt;VS 2010 has extensive support for &lt;a href="http://msdn.microsoft.com/en-us/library/dd489269(v=VS.100).aspx"&gt;XML tooling&lt;/a&gt;. You have 3 different views for schema designing that should suffice for most complex schema definition.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Besides these free tools, there are other command line tools that can be used. For e.g.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx"&gt;XSD.exe &lt;/a&gt;tool can be schema to XML and vice versa transformation.  &lt;/p&gt;&lt;p&gt;There was another &lt;a href="http://msdn.microsoft.com/en-us/library/aa302296.aspx"&gt;.NET tool &lt;/a&gt;that I found on MSDN for generating XML documents from XSD.&lt;/p&gt;&lt;p&gt;Another cool Java desktop tool that supported these features was &lt;a href="http://www.donkeydevelopment.com/"&gt;XMLSpear&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-129808717013831328?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/129808717013831328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=129808717013831328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/129808717013831328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/129808717013831328'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/04/xsd-to-xml-and-vice-versa.html' title='XSD to XML and vice versa'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7263461703315128047</id><published>2010-04-26T06:27:00.000+05:30</published><updated>2010-04-26T06:39:35.046+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Updatable Views Vs ORM tools (ADO.NET Entity Framework)</title><content type='html'>Recently during one of our design brainstorming discussions, our database developer was having a hard time trying to understand the benefit of using a ORM tool such as NHibernate or ADO.NET Entity framework. For our example scenario, he said that he could easily create database views that would serve the same purpose - abstracting the logical schema and helping the developer avoid complex joins for simple business queries.&lt;br /&gt;&lt;br /&gt;For the use-case we were working on, his statement made sense. But there are a lot of cases and reasons why database views would not be the best choice. Here is a snippet from a &lt;a href="http://msdn.microsoft.com/en-us/library/aa697427%28VS.80%29.aspx"&gt;MSDN article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-style: italic;font-family:lucida grande;font-size:100%;"  &gt;An obvious question at this point would be why not just use  traditional database views for this. While database views can abstract  many of the mappings, often that solution won't work for several process  and functional reasons: (a) many of the views are simply too complex to  be generated and maintained by developers in a cost-effective way, even  for some simple conceptual to logical mappings, (b) the classes of  views that have the property of being automatically updatable at the  store are limited, and (c) databases for core-systems in medium and  large companies are used by many central and departmental applications,  and having each individual application create several views in the  database would pollute the database schema and create significant  maintenance workload for the database administrators. In addition,  database views are limited to the expressivity of the relational model,  and typically lack some of the more real-world concepts of the Entity  Data Model, such as inheritance and complex types.&lt;/span&gt;&lt;p  style="color: rgb(0, 0, 153); font-style: italic;font-family:lucida grande;"&gt;&lt;span style="font-size:100%;"&gt;ADO.NET  client-views work entirely on the client, so each application developer  can create views that adapt the data to a shape that makes sense for  each particular application without affecting the actual database or  other applications. The class of updatable views supported in the Entity  Framework is much broader than those supported by any relational store.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7263461703315128047?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7263461703315128047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7263461703315128047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7263461703315128047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7263461703315128047'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/04/updatable-views-vs-orm-tools-adonet.html' title='Updatable Views Vs ORM tools (ADO.NET Entity Framework)'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8123350402976168919</id><published>2010-04-26T06:05:00.000+05:30</published><updated>2010-04-26T06:11:43.831+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Profilers for .NET</title><content type='html'>Way back, I had &lt;a href="http://narencoolgeek.blogspot.com/2008/06/vsts-2008-has-memory-profiler.html"&gt;blogged &lt;/a&gt;about the profiling capabilities of VSTS 2008 and Numega DevPartner Studio.&lt;br /&gt;&lt;br /&gt;Came across this site that lists down the most of the .NET profiling tools available in the market.&lt;br /&gt;&lt;a href="http://sharptoolbox.com/categories/profilers-debuggers"&gt;http://sharptoolbox.com/categories/profilers-debuggers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have had good experience with &lt;a href="http://memprofiler.com/download.aspx"&gt;.NET memory profiler&lt;/a&gt; and &lt;a href="http://www.red-gate.com/products/ants_performance_profiler/index.htm?utm_source=google&amp;amp;utm_medium=cpc&amp;amp;utm_content=brand_aware&amp;amp;utm_campaign=antsperformanceprofiler&amp;amp;gclid=CKz__KCQo6ECFZ_Y5wodzxNExg"&gt;ANTs profiler&lt;/a&gt;.&lt;br /&gt;Both of them allows you to collect stats on elapsed time for the entire call-stack and also allow you to walk the heap and check the effect of GC runs across heap generations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8123350402976168919?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8123350402976168919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8123350402976168919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8123350402976168919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8123350402976168919'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/04/profilers-for-net.html' title='Profilers for .NET'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3326992222365855552</id><published>2010-04-21T05:58:00.001+05:30</published><updated>2010-04-21T06:08:53.305+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='SQLServer'/><title type='text'>Referential Integrity across databases in SQL Server</title><content type='html'>Having worked on Oracle databases for a long time, I was quite comfortable with the idea of  maintaining RI across different schemas in same database. For e.g. Ur database may have a schema containing master tables and your transaction schema references the lookup data in the master tables.&lt;br /&gt;But to my suprise, prior to SQLServer 2005, it was not possible to have separate schemas in SQL Server. This meant that there was no easy way to maintain &lt;a href="http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/05/13/be-aware-of-these-loopholes-in-your-referential-integrity.aspx"&gt;RI across databases &lt;/a&gt;in SQLServer. The only options were using messy &lt;a href="http://sqlblog.com/forums/thread/9114.aspx"&gt;triggers &lt;/a&gt;or a &lt;a href="http://stackoverflow.com/questions/960465/keeping-referential-integrity-across-multiple-databases"&gt;CHECK constraint with a UDF &lt;/a&gt;(user defined function)&lt;br /&gt;&lt;br /&gt;Maintaining RI across databases is still not possible in SQLServer, but SQLServer 2005/2008 have added the concept of schemas in databases; i.e. it is possible to have multiple schemas in each database and each schema offers the same logical separation that a separate database would. We can also configure the schema to be located on a separate filegroup or a separate disk, thus maximizing performance. In SQLServer 2005/2008, it is possible to have RI constraints across schemas. I think this is the best design approach to take. If it is not possible to have your master data in the same database, then the second best approach is to use replication to get the master data into your database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3326992222365855552?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3326992222365855552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3326992222365855552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3326992222365855552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3326992222365855552'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/04/referential-integrity-across-databases.html' title='Referential Integrity across databases in SQL Server'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2097910981694788605</id><published>2010-04-06T06:28:00.000+05:30</published><updated>2010-04-06T06:37:59.722+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>What is Micro-Architecture in software design?</title><content type='html'>Recently I came across the term 'Micro-Architecture' on a number of pages on Sun's site. Sun's engineers have an &lt;a href="http://blogs.sun.com/alur/entry/what_is_a_micro_architecture"&gt;interesting definition&lt;/a&gt; for this term. They refer to Micro-Architecture as a composition of a set of patterns that can be used to realize a subsystem.&lt;br /&gt;&lt;br /&gt;In the book - "Core J2EE patterns", Micro-Architecture is described as below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;em style="color: rgb(51, 51, 255);"&gt;We define micro-architecture as a set of patterns used together to  realize      parts of a system or subsystem. We view a micro-architecture as a  building      block for piecing together well-known, cohesive portions of an  overall architecture.      A micro-architecture is used to solve a coarser-grained,  higher-level problem      that cannot be solved by a single pattern. Thus, a  micro-architecture represents      a higher level of abstraction than the individual patterns.&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2097910981694788605?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2097910981694788605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2097910981694788605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2097910981694788605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2097910981694788605'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/04/what-is-micro-architecture-in-software.html' title='What is Micro-Architecture in software design?'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3913836518291183479</id><published>2010-03-12T05:35:00.000+05:30</published><updated>2010-03-12T07:18:24.477+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><title type='text'>Critical Success Factors for SOA</title><content type='html'>A lot of organizations are embarking on the SOA journey and it is important to understand the factors that would make the SOA initiative successful. Based on our experience in SOA consulting, we have learned the following.&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-style: italic; color: rgb(0, 0, 153); font-weight: bold;"&gt;Adopt an evolutionary approach to SOA&lt;/span&gt;: It’s impossible to sustain a big-bang approach to SOA at the enterprise level and even more difficult to make a business case for the large investment. The best approach is to have an enterprise level SOA governance and adopt an incremental and iterative approach. This approach is called the ‘hybrid’ or ‘middle-out’ approach.&lt;br /&gt;After gaining success in early iterations, it becomes easier to make a business case for further investment or create a self funding model. It is a great idea to focus on immediate business pain points during the initial iterations, such as automation, reducing duplicity, etc.&lt;br /&gt;&lt;br /&gt;2. &lt;span style="color: rgb(0, 0, 153); font-style: italic; font-weight: bold;"&gt;Ensure top management support&lt;/span&gt;: This is very crucial because SOA strategies would require many departments/LOB’s to come together and function as one unit. And unless you have the top level executive sponsorship to support the SOA initiative, you could get entangled in a mesh of organization politics.&lt;br /&gt;Also it is important to address the cultural issues and involve all layers in the organization during decision making. If we are able to define WIIFM (What’s in it for me?) for each important business stakeholder, then the changes of SOA success are very high.&lt;br /&gt;&lt;br /&gt;3. &lt;span style="color: rgb(0, 0, 153); font-style: italic; font-weight: bold;"&gt;Implement SOA Governance from the start&lt;/span&gt;: SOA governance is a very board area and covers many aspects.  SOA governance includes 2 dimensions – the methodology/process that is established and the tools and technologies used for governance.&lt;br /&gt;Service Life Cycle Management, Service monitoring and Service SLA management are all important points of SOA governance. In fact, if the organization has a EA practice, then SOA governance should be part of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3913836518291183479?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3913836518291183479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3913836518291183479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3913836518291183479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3913836518291183479'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/03/critical-success-factors-for-soa.html' title='Critical Success Factors for SOA'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1042752007353447365</id><published>2010-02-24T12:47:00.000+05:30</published><updated>2010-02-24T13:13:53.368+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Architecture'/><title type='text'>Ruminating on Requirements Elicitation</title><content type='html'>Last night, I was ruminating on the lessons learned during my experience in business architecture, business analysis and requirements elicitation. I think at the broad level, there are 2 kinds of requirements.&lt;br /&gt;&lt;br /&gt;The first kind is - &lt;span style="color:#000099;"&gt;&lt;em&gt;Where we know, what we don't know&lt;/em&gt;&lt;/span&gt;: These requirements are easy to capture since we have an idea about the pain areas of the customer, we know what is the vision of the project, what is being planned to be done, etc. Hence we can ask appropriate questions, dig deeper and after a few iterations of interviews can get a pretty good understanding of the requirements.&lt;br /&gt;&lt;br /&gt;The second kind of requirements are - &lt;span style="color:#000099;"&gt;&lt;em&gt;Where we don't know, what we don't know !&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;Digging out these requirements is the most challenging task - because we never ask the right questions about things that don't know, our past memory/experiences make implicit assumptions on certain things. Such kind of requirements result in last minute suprises and everyone wonders why these points were never discussed or brought out !!!&lt;br /&gt;&lt;br /&gt;How do we elicit these requirements? I think the following techniques during requirements elicitaiton would help:&lt;br /&gt;1. Question each and every assumption - both implicit and explicit. Assumptions may not hold true in every scenario. Check if the assumption is valid for the current scenario.&lt;br /&gt;2. Ask 'stupid' questions - Yes, this works !!!...I have seen that often, analyst's refrain from asking questions because they are self-conscious, are afraid of being ridiculed for lack of knowledge in a domain area, etc. i.e. they are afraid of sounding 'stupid'. But clarifying even the simplest doubt could open up a plethora of new requirements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1042752007353447365?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1042752007353447365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1042752007353447365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1042752007353447365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1042752007353447365'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/02/ruminating-on-requirements-elicitation.html' title='Ruminating on Requirements Elicitation'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8749724258453040018</id><published>2010-02-12T14:50:00.000+05:30</published><updated>2010-02-12T15:13:53.641+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Migration'/><title type='text'>Migrating applications across platforms</title><content type='html'>We often require to migrate applications from one platform (OS/hardware) to an other platform - either as part of a portfolio rationalization program or because the current platform is reaching its EOL. For e.g. migrating Java apps from Solaris/SPARC to Linux/IBM Power, etc.&lt;br /&gt;During such migrations, it is essential to have a well documented plan covering all the aspects, so that we do not miss anything. Listed below is a brief set of points that must be included in the brainstorming discussions during the planning phase.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;Migration of the Runtime environment&lt;/span&gt;&lt;/em&gt;: For e.g. miration of the Java runtime from Solaris to Linux. There are many JRE's available on Linux and we need to select the appropriate one. &lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;Migration of the Application Infrastructure&lt;/span&gt;&lt;/em&gt;: The application may require a webserver, application server, a Message queue, etc. These infrastructure components would need to be ported to the target platform or other alternatives selected.&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;Migration of application code&lt;/span&gt;&lt;/em&gt;: Does the code need to be recompiled/linked on the target platform? Was the application using any platform specific API for performance? &lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;Migration of application configuration&lt;/span&gt;&lt;/em&gt;: What configuration needs to change on the target platform? e.g. file paths, endian-ness, max-memory settings, thread pool settings, etc.&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;Migration of development environment&lt;/span&gt;&lt;/em&gt;: Would it be required to migrate the development environment? Will the same IDE work? IDE-Runtime integration issues, etc.&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;Migration of Build and Deployment process&lt;/span&gt;&lt;/em&gt;: Need to change build scripts - ANT, Maven, Shell scripts, etc. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Also it makes sense to leverage the expertise of the target platform vendor during the migration exercise. For e.g. IBM, HP, SUN, RedHat, Novell, etc. all have guidelines, recommendations and migration kits for migrating from a target platform to their platform.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8749724258453040018?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8749724258453040018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8749724258453040018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8749724258453040018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8749724258453040018'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2010/02/migrating-applications-across-platforms.html' title='Migrating applications across platforms'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6068606932863471885</id><published>2009-12-15T19:01:00.000+05:30</published><updated>2009-12-15T19:14:50.480+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Healthcare domain'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>What is longitudnal data?</title><content type='html'>A dataset is considered to be longitudnal if it tracks the same kind of information at multiple points of time. For e.g. the marks of students over multiple years, patient health records over a period of time, etc.&lt;br /&gt;&lt;br /&gt;The most important advantage of longitudnal data is that we can measure change and the effect of various factors over the data-point time values. For e.g. what is the effect a particular drug had on a cancer patient? The effect of different teachers on a student?&lt;br /&gt;&lt;br /&gt;So essentially, longitudnal data helps in establishing cause-n-effect relationships. Longitudnal data stores are also being used for predictive modeling and other areas. Longitudnal data stores are very popular in the Life Sciences and Healthcare industry.&lt;br /&gt;I am interesting in learning the best practices for creating and optimizing a data-model for longitudnal data stores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6068606932863471885?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6068606932863471885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6068606932863471885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6068606932863471885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6068606932863471885'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/12/what-is-longitudnal-data.html' title='What is longitudnal data?'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-585331592007359619</id><published>2009-12-15T13:30:00.000+05:30</published><updated>2009-12-15T13:42:14.507+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Healthcare domain'/><title type='text'>Difference between biostatistics and bioinformatics</title><content type='html'>Working in the healthcare domain, I often come across the terms - biostatistics and bioinformatics and wondered as to what were the differences between the two branches of studies. A quick googling revealed the following:&lt;br /&gt;The term &lt;em&gt;&lt;strong&gt;Biostatistics&lt;/strong&gt;&lt;/em&gt; is a combination of the words biology and statistics. So it essentially it is the application of statistics to biology. The science of biostatistics encompasses the design of biological experiments, especially in medicine and agriculture; the collection, summarization, and analysis of data from those experiments; and the interpretation of, and inference from, the results.&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Bioinformatics&lt;/strong&gt;&lt;/em&gt; is the application of information technology and computer science to the field of molecular biology. Its primary use has been in genomics and genetics, particularly in those areas of genomics involving large-scale DNA sequencing. Bioinformatics now entails the creation and advancement of databases, algorithms, computational and statistical techniques, and theory to solve formal and practical problems arising from the management and analysis of biological data.&lt;br /&gt;Bioinformatics focuses on applying computationally intensive techniques (e.g., pattern recognition, data mining, machine learning algorithms, and visualization) to understand biological processes.&lt;br /&gt;More information can be found on Wikipedia at:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Bioinformatics"&gt;http://en.wikipedia.org/wiki/Bioinformatics&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Biostatistics"&gt;http://en.wikipedia.org/wiki/Biostatistics&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-585331592007359619?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/585331592007359619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=585331592007359619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/585331592007359619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/585331592007359619'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/12/difference-between-biostatistics-and.html' title='Difference between biostatistics and bioinformatics'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-980643322714302022</id><published>2009-11-19T14:09:00.000+05:30</published><updated>2009-11-19T14:18:05.628+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Authorization'/><title type='text'>Mapping UI controls to entitlements/operations</title><content type='html'>In RBAC, we often need to enable/disable a UI control based on the users role and entitlements. Most programmers write code for mapping a UI control with the operation name, i.e. if 'submitRecord' is not allowed for the user, then disable or hide the button.&lt;br /&gt;&lt;br /&gt;Recently I came across a neat way to handle this using attributes in C#.NET.  This &lt;a href="http://msdn.microsoft.com/en-us/library/aa480723.aspx"&gt;article &lt;/a&gt;describes the use of attributes to specify the 'operationName' and the 'property-value' to be set on the control when we check for entitlements.&lt;br /&gt;&lt;u&gt;Example code snippet:&lt;/u&gt;&lt;br /&gt;&lt;span style="font-family:courier new;color:#000099;"&gt;&lt;span style="font-size:85%;"&gt;[YourCompany.Authorization("EditSalary", "ReadOnly", true)]&lt;br /&gt;private System.Windows.Forms.TextBox Salary;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;span style="color:#000000;"&gt;Though the example is that of a .NET program, the same concept can easily be applied in Java 5, which supports annotations. Annotations in Java are roughly equivalent to Attributes in .NET.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-980643322714302022?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/980643322714302022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=980643322714302022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/980643322714302022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/980643322714302022'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/11/mapping-ui-controls-to.html' title='Mapping UI controls to entitlements/operations'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5495883103194095614</id><published>2009-11-18T19:47:00.000+05:30</published><updated>2009-11-18T20:17:50.432+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='XQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='XPath.'/><category scheme='http://www.blogger.com/atom/ns#' term='XSLT'/><title type='text'>XSLT vs XQuery for XML transformations</title><content type='html'>During the early years in my career, I had always used XSLT for transformation purposes. Recently I have seen that a lot of applications and products are using XQuery for transformations. For e.g. BEA Aqualogic ESB and Apache Service Mix both use XQuery for message transformation capabilities.&lt;br /&gt;&lt;br /&gt;Although XSLT is more powerful than XQuery for transformations, it is much simpler to learn XQuery. I remember the tough learning curve I had to go through when learning XSL, but I could grasp XQuery basics in a couple of hours. Both XSLT and XQuery use XPath for quering XML.&lt;br /&gt;&lt;br /&gt;Found this &lt;a href="http://www.oreillynet.com/xml/blog/2008/06/teaching_xslt_vs_teaching_xque.html"&gt;interesting discussion &lt;/a&gt;on O'Reilly site that compares the two technologies. David P. in the discussion shares some interesting views on the design philosophy behind the two technologies - XQuery is a MUST UNDERSTAND language where as XSLT is a MAY UNDERSTAND language, i.e. it is more adaptive and template driven. XSLT is untyped; conversions between nodes and strings and numbers are handled pretty much transparently. XQuery is a typed language which uses the types defined by XML Schema. XQuery will complain when it gets input that isn't of the appropriate type. XQuery is better for highly-structured data, XSLT for loosely-structured documents.&lt;br /&gt;&lt;br /&gt;We were building a transformation engine to convert between the various &lt;a href="http://www.acord.org/"&gt;ACORD &lt;/a&gt;formats. The Acord committee has ensured that any new version of ACORD only 'adds' new elements to the current schema. No elements are deleted or the schema changed for backwards compatibility.&lt;br /&gt;Hence for these transformations, XQuery fitted the bill. We also did not have to create a Canonical Data Model as direct transfortions were possible due to the above mentioned restriction. Hence if the tool supported 15 ACORD versions, only 15 XQuery files were required.&lt;br /&gt;&lt;br /&gt;Other links on the same subject:&lt;br /&gt;&lt;a href="http://www.xml.com/lpt/a/1549"&gt;http://www.xml.com/lpt/a/1549&lt;/a&gt;&lt;br /&gt;&lt;a href="http://xmlhack.com/read.php?item=1080"&gt;http://xmlhack.com/read.php?item=1080&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.xmlplease.com/xquery-xslt"&gt;http://www.xmlplease.com/xquery-xslt&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oreillynet.com/xml/blog/2006/04/when_to_use_xslt_when_to_use_x.html"&gt;http://www.oreillynet.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5495883103194095614?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5495883103194095614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5495883103194095614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5495883103194095614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5495883103194095614'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/11/xslt-vs-xquery-for-xml-transformations.html' title='XSLT vs XQuery for XML transformations'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-299029985088248142</id><published>2009-10-05T17:06:00.000+05:30</published><updated>2009-10-05T17:12:34.092+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Constants'/><title type='text'>Use of Constants in code</title><content type='html'>&lt;p&gt;Recently there was a big debate during a code reveiw session on the use of constants. The developers had used constants for the following purposes: &lt;/p&gt;&lt;p&gt;1. Each and every message key used in the i18N application was declared as a constant. The application contained around 3000 message keys and hence the same number of constants. &lt;/p&gt;&lt;p&gt;2. Each and every database column name was declared as a constant. There were around 5000 column names and still counting.. &lt;/p&gt;&lt;p&gt;Does it make sense to have such a huge number of constants in any application? IMHO, common sense should prevail. Message keys just don't need to be declared as constants. We already have one level of indirection - why add one more?&lt;br /&gt;Reg. database column names, I have mixed opinions. If a column is being used in multiple classes, does it make sense to declare it as a global constant? Maybe declaring a class as 'Table Name' and its members as 'Column Name' would be a good idea? But if you have a large number of tables and columns, it would become very tedious to even create these constants file.&lt;/p&gt;&lt;p&gt;I found a few tools on the net that can automate the creation of these constants files.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;- &lt;/span&gt;&lt;a href="http://www.codeproject.com/KB/database/EnumGenerator.aspx"&gt;&lt;span style="font-size:85%;"&gt;CodeProject&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;- &lt;/span&gt;&lt;a href="http://www.mobzystems.com/code/using-constants-for-table-and-column-names.aspx"&gt;&lt;span style="font-size:85%;"&gt;MobzySystems&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;- &lt;/span&gt;&lt;a href="http://geekswithblogs.net/thibbard/articles/CSharpCodeToExtractConstIntCodeFromDatabase.aspx"&gt;&lt;span style="font-size:85%;"&gt;ConstTool&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-299029985088248142?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/299029985088248142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=299029985088248142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/299029985088248142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/299029985088248142'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/10/use-of-constants-in-code.html' title='Use of Constants in code'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1521084620505091985</id><published>2009-09-25T13:30:00.001+05:30</published><updated>2009-09-25T13:31:32.273+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Cool Cool JS toolbox</title><content type='html'>Just found this good website having tons of cool JavaScript tools - free for commercial use too.&lt;br /&gt;&lt;a href="http://www.dynamicdrive.com/"&gt;http://www.dynamicdrive.com/&lt;/a&gt;&lt;br /&gt;Check out the dynamic menus - always needed in any web-site development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1521084620505091985?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1521084620505091985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1521084620505091985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1521084620505091985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1521084620505091985'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/09/cool-cool-js-toolbox.html' title='Cool Cool JS toolbox'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5400027965314269115</id><published>2009-09-16T16:17:00.000+05:30</published><updated>2009-09-16T16:28:59.419+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Datasets'/><title type='text'>Should we call Dispose() on a Dataset?</title><content type='html'>During one of my code reviews, I saw that the development team had called 'Dispose()' on all the datasets used in the application. I knew that the Dataset was a disconnected managed object and could not understand what the dispose method would actually be doing? Dispose() is typically called to release unmanaged resources such as file-pointers, streams, socket connections, etc. In most cases, such classes also expose a Close() method that is more appropriate.&lt;br /&gt;&lt;br /&gt;Discussions with the developers revealed that FxCop also throws an error when Dispose() is not called on Datasets.&lt;br /&gt;Further investigation revleaded that the Dataset exposes the Dispose() method as a side effect of inheritance. The Dataset class inherits from the MarshalByValueComponent which implements the IDisposable interface because it is a component. The method is not overridden in the System.Data.Dataset class and the default implementation is in the MarshalByValueComponent class. The default implementation just removes the component from the parent container it is in. But in case of Dataset, there are no parent containers and hence the Dispose() method does nothing useful.&lt;br /&gt;&lt;br /&gt;Conclusion: It is not necessary to call Dispose() on Datasets. Developers can safely ignore the FxCop warnings too :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5400027965314269115?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5400027965314269115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5400027965314269115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5400027965314269115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5400027965314269115'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/09/should-be-call-dispose-on-dataset.html' title='Should we call Dispose() on a Dataset?'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8616246771619840877</id><published>2009-09-16T15:43:00.001+05:30</published><updated>2009-09-16T16:02:52.271+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML Schema'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Ruminating over XML Schema concepts</title><content type='html'>In a recent discussion with my team members, I sensed a lot of confusion over basic concepts on XML Schemas and namespaces - especially over targetNamespace, DefaultNamespace, elements vs types, etc. Well first, lets get the fundamentals right.&lt;br /&gt;&lt;br /&gt;A XML schema defines and declares types (complex and simple) and elements. All elements have a type. If the type has not been specified, it defaults to xsd:anyType. It's easy to understand this by drawing an anology between a class and an object. New elements can be created by referencing existing elements.&lt;br /&gt;&lt;br /&gt;In a WSDL message description, a WSDL part may reference an element or a type. If the SOAP binding specifies style="document", then the WSDL part must reference an element. If the SOAP binding specifies style="rpc", then the WSDL part must reference a type.&lt;br /&gt;Now coming to namespaces, users typically get confused over the difference between a targetNamespace and defaultNamespace. The 'targetNamespace' attribute is typically used in schema files to identify and select the namespace into which new elements that are defined are created in. It is the namespace an instance is going to use to access the types it declares. For e.g. An XML document may use this schema as the default schema. Default schema is defined simply by using 'xmlns=' without a prefix.&lt;br /&gt;It is important to remember that XML schema is itself an XML document. Hence a schema can contain a namespace attribute and also a targetNamespace attribute. Typically they are the same.&lt;br /&gt;&lt;br /&gt;Jotting down links where more explanation is given:&lt;br /&gt;&lt;a href="http://www.coderanch.com/t/224532/Web-Services/java/namespace-targetnamespace"&gt;&lt;span style="font-size:85%;"&gt;http://www.coderanch.com/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/pub/articles/srivastava_namespaces.html"&gt;&lt;span style="font-size:85%;"&gt;http://www.oracle.com/technology/&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8616246771619840877?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8616246771619840877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8616246771619840877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8616246771619840877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8616246771619840877'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/09/ruminating-over-xml-schema-concepts.html' title='Ruminating over XML Schema concepts'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2890949629669733174</id><published>2009-06-26T17:15:00.000+05:30</published><updated>2009-06-26T17:26:48.711+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Digital Certificates'/><title type='text'>Creating a self-signed certificate</title><content type='html'>Jotting down the quick commands in .NET and JDK frameworks that can be used to create a self signed certificate.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the .NET framework, open the Visual Studio command prompt and type the following:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000099;"&gt;makecert -r -pe -n "CN=www.yourserver.com" -b 01/01/2000 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Just replace the CN with the name or IP of your server. The certificate would be created in the default personal store on Windows. Go to MMC and add the 'certificates' snap-in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In JDK first use the keytool utility to generate a certificate in the keystore.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000099;"&gt;keytool -genkey -alias myalias -keystore .keystore&lt;/span&gt;&lt;/div&gt;&lt;div&gt;You would be prompted to enter the CN and other details. Once the cert is stored in the keystore, it can be exported as a file.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000099;"&gt;keytool -storepass password -alias myalias -keystore .keystore -export -rfc -file outfilename.cer&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2890949629669733174?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2890949629669733174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2890949629669733174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2890949629669733174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2890949629669733174'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/06/creating-self-signed-certificate.html' title='Creating a self-signed certificate'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6308823554703971618</id><published>2009-06-11T02:11:00.000+05:30</published><updated>2009-06-11T02:16:02.121+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET Web Methods Tips and Tricks</title><content type='html'>It is possible to pass a parameter by reference to a Web Method? I thought this does not make sense, but behind the covers the .NET webservice proxy and runtime make this possible.&lt;div&gt;A detailed example with sample source code can be found &lt;a href="http://www.codeproject.com/KB/XML/RefAndOL.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;Also given in the above link is an example of supporting polymorphism in Web Methods.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6308823554703971618?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6308823554703971618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6308823554703971618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6308823554703971618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6308823554703971618'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/06/net-web-methods-tips-and-tricks.html' title='.NET Web Methods Tips and Tricks'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-4383946752480374631</id><published>2009-06-09T18:23:00.001+05:30</published><updated>2009-06-09T18:28:53.681+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Monitoring'/><title type='text'>Open Source Application Management Software</title><content type='html'>We needed a simple application mangement tool for monitoring our Java applications running on Tomcat servers. My team evaluated the various free/open-source options and gave a demo of the following 2 tools that proved to be interesting.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. &lt;a href="http://www.manageengine.com/products/applications_manager/"&gt;ManageEngine Applications Manager&lt;/a&gt; - This is free for use (upto 5 monitors). Very user friendly and professional look and feel.&lt;/div&gt;&lt;div&gt;2. &lt;a href="http://www.jmanage.org/"&gt;JManage &lt;/a&gt;- (open source. Good support for Java console applications)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-4383946752480374631?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/4383946752480374631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=4383946752480374631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4383946752480374631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4383946752480374631'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/06/open-source-application-management.html' title='Open Source Application Management Software'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-345066183677605653</id><published>2009-06-09T14:51:00.000+05:30</published><updated>2009-06-09T15:01:21.141+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Passing large .NET datasets across layers</title><content type='html'>If your .NET webservice is &lt;a href="http://narencoolgeek.blogspot.com/2009/05/interoperability-when-using-datasets-in.html"&gt;returning datasets&lt;/a&gt;, then you might face performance problems with large payloads consuming the network bandwidth.  There are a few strategies around this problem.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Convert the dataset into a byte[] using the Binary Formatter.  Compress this byte[] using the Deflate classes in .NET. On the client side, the reverse process needs to be done.&lt;/div&gt;&lt;div&gt;Peter Bromberg has written a nice &lt;a href="http://www.eggheadcafe.com/articles/20060220.asp"&gt;article &lt;/a&gt;explaining the details of this strategy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Convert the dataset into a XML string and compress the XML string.  This &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/827fa51d-5bc3-4955-95ed-624804079bcb/"&gt;discussion forum&lt;/a&gt; thread contains sample source code for the same.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-345066183677605653?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/345066183677605653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=345066183677605653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/345066183677605653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/345066183677605653'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/06/passing-large-net-datasets-across.html' title='Passing large .NET datasets across layers'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7285847388185504435</id><published>2009-06-08T16:06:00.000+05:30</published><updated>2009-06-08T16:15:07.201+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Migration Factory'/><title type='text'>Migration Factory</title><content type='html'>&lt;div&gt;Recently, I have been hearing a lot of buzz around the term - "Migration Factory". A lot of IT service companies have jumped on this buzzword and offer conversion services based on the Migration Factory model. &lt;/div&gt;&lt;div&gt;So what exactly is a Migration Factory? A Migration Factory is a methodology that endeavours to adopt a factory model for churning out migrated components. Essentially the migration landscape is segmented into various well-defined tasks and each segmented task is assigned to dedicated teams having specialized skills in that area. An analogy to a vehicle manufacturing factory would give a fair idea of what the methodology tries to achieve. So this essentially is an assembly line methodology with phases such as planning, assessment, conversion, implementation, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The key drivers in the Migration Factory approach are the reuse of patterns, models, tools gained from past experiences. Toolkits for automation of activities such as code converstion, automated regression testing, etc. form a important part of the Factory model.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my personal experience, I have observed that no migration project is the same. Each project brings its own technology and business challenges, but we can reuse the best practices and other tools developed in previous engagements.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7285847388185504435?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7285847388185504435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7285847388185504435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7285847388185504435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7285847388185504435'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/06/migration-factory.html' title='Migration Factory'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5722834791806895630</id><published>2009-05-16T16:00:00.000+05:30</published><updated>2009-05-16T16:34:54.529+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Data compression in .NET</title><content type='html'>In .NET, developers often have to choose between 2 options for compression/decompression - GZipStream and DeflateStream. What's interesting to note is that GZip uses the same 'deflate' algorithm as DeflateStream; but in addition also supports CRC checks and has additional headers to store metadata such as version nos, original file name, timestamps, etc.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So GZip is actually a data format and multiple files can be compressed into a single archive. You can open a file written to by the GZipStream using a GZip decompression utility such as WinRAR on Windows, gunzip on Linux, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sample example code can be found at MSDN.  There is also a sample solution that allows working with multiple files using GZip compression. Both these classes only support max 4GB as the stream length.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5722834791806895630?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5722834791806895630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5722834791806895630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5722834791806895630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5722834791806895630'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/05/data-compression-in-net.html' title='Data compression in .NET'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-463366304894003245</id><published>2009-05-15T18:00:00.001+05:30</published><updated>2009-05-15T19:30:41.066+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webservices'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Interoperability when using datasets in .NET webservices</title><content type='html'>&lt;div&gt;Datasets are powerful data containers that are very popular in the .NET world. Quite often, a lot of .NET webservices return datasets in their web methods. This is ok, as long as we are sure that all the clients are also on the .NET platform. &lt;/div&gt;&lt;div&gt;But if we want our services to be interoperable with other platforms (e.g. Java), then passing datasets back to webservice clients would not work. This is because a dataset is a generic container and is populated at runtime with data. Hence at design time, it is not possible to define the dataset datatype with a schema. Also when a dataset is serialized to XML, then the default .NET SOAP serializer adds .NET specific attributes to the XML schema. e.g. isDataset=true, Diffgram, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Typed datasets do have a schema backing them, but here again there is a hack required to make typed dataset accessible to a Java program. The hack is to return a xml string or a XML Node instead of the typed dataset. We would also have to change the autogenerated WSDL and add the typed dataset schema to it. A lot of trouble for using datasets in a heterogenous environment :( &lt;/div&gt;&lt;div&gt;For hassle free interop, the best option is to go for pure schema driven complex types that can be mapped to any language.&lt;/div&gt;&lt;div&gt;More information is available at the following links:&lt;/div&gt;&lt;div&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc188755.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/cc188755.aspx&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998428.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms998428.aspx&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.cnblogs.com/rickel/articles/157935.html"&gt;http://www.cnblogs.com/rickel/articles/157935.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-463366304894003245?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/463366304894003245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=463366304894003245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/463366304894003245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/463366304894003245'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/05/interoperability-when-using-datasets-in.html' title='Interoperability when using datasets in .NET webservices'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-507849671193983431</id><published>2009-05-15T15:18:00.000+05:30</published><updated>2009-05-15T15:29:56.462+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webservices'/><category scheme='http://www.blogger.com/atom/ns#' term='XML Serialization'/><title type='text'>XML serialization tips in .NET</title><content type='html'>Today, my team ran across a strange issue. Some of the properties on a .NET class were not getting serialized to XML when used in webservices. There was no error message or any other warning. &lt;div&gt;Closer examination revealed that the properties not getting serialized were 'read-only' properties; i.e. they had getters but no setters. The default XML Serializer in .NET calls the property getters/setters and hence if a read-only property is present, then it is not serialized.&lt;/div&gt;&lt;div&gt;Once we added setters to the properties, XML serialization worked fine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is another option. We can implement the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx"&gt;IXmlSerializable &lt;/a&gt;interface and write custom serialization code. But this could be very tedious. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-507849671193983431?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/507849671193983431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=507849671193983431' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/507849671193983431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/507849671193983431'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/05/xml-serialization-tips-in-net.html' title='XML serialization tips in .NET'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2533146820684394547</id><published>2009-05-13T13:06:00.000+05:30</published><updated>2009-05-13T13:17:24.394+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Migration'/><category scheme='http://www.blogger.com/atom/ns#' term='Cool tools'/><title type='text'>Java to .NET conversion tools</title><content type='html'>Today one of our teams was looking for a Java to .NET conversion tool. They had developed resuable components in Java and the client wanted similar components in their .NET environment.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Microsoft used to ship a module called &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163422.aspx"&gt;JLCA &lt;/a&gt;(Java Language Conversion Assistant) that enables us to covert Java code to .NET code. This tool was shipped as part of VS 2005, but unfortunately is no longer shipped with VS 2008. Please read Microsoft's statement &lt;a href="http://msdn.microsoft.com/en-us/vjsharp/default.aspx"&gt;here &lt;/a&gt;regarding JLCA. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had a quick look at the tool by launching it from VS 2005 and selecting a few Java util libraries. The results looked good, but we need to understand that 100% conversion is not possible. The tool puts in a lot of comments in the generated .NET code, so all errors and warning are maked in the generated code. Also a cool HTML report is generated that mentions the errors and warnings. I could find tons of errros/warnings, but most of them fell into expected categories such as no direct mapping between Java and .Net classses, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ArtinSoft offers an enhanced version of the JLCA tool called &lt;a href="http://www.artinsoft.com/pr_jlca.aspx"&gt;JLCA Companion&lt;/a&gt;. I have not evaluated this, but the documentations states interesting features for customization.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To summarize, I believe such migration tools are useful to jumpstart the process and have a foundation ready to work on.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2533146820684394547?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2533146820684394547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2533146820684394547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2533146820684394547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2533146820684394547'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/05/java-to-net-conversion-tools.html' title='Java to .NET conversion tools'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7338242441621015377</id><published>2009-05-08T13:49:00.000+05:30</published><updated>2009-05-08T15:34:22.544+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Async Webservices'/><title type='text'>Async calls in Java and .NET webservices</title><content type='html'>&lt;p style="margin-top:0in;margin-right:0in;margin-bottom:3.0pt;margin-left:0in; line-height:15.0pt"&gt;&lt;span style="font-size:9.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Over the past few weeks, the Architecture Support Group that I head at my organization, received quite a few queries on making asynchronous web service calls in a SOA environment. So decided to blog about the various options at hand.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:0in;margin-right:0in;margin-bottom:3.0pt;margin-left:0in; line-height:15.0pt"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 12px;"&gt;To make asych webservice calls in .NET, the following programming models are available. Please visit the links for furthur information.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:0in;margin-right:0in;margin-bottom:3.0pt;margin-left:0in; line-height:15.0pt"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 12px;"&gt;1. &lt;a href="http://msdn.microsoft.com/en-us/library/5xcdwwyh(VS.80).aspx"&gt;Using Asychronous Callback delegates&lt;/a&gt;.  &lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:0in;margin-right:0in;margin-bottom:3.0pt;margin-left:0in; line-height:15.0pt"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 12px; "&gt;2. &lt;a href="http://msdn.microsoft.com/en-us/library/wewwczdw.aspx"&gt;Using Event Based Asych methods&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top:0in;margin-right:0in;margin-bottom:3.0pt;margin-left:0in; line-height:15.0pt"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 12px;"&gt;3. &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapdocumentmethodattribute.oneway(VS.80).aspx"&gt;Fire and Forget mechanism&lt;/a&gt;: Here we can decorate the server side webmethod with the 'OneWay' attribute.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:0in;margin-right:0in;margin-bottom:3.0pt;margin-left:0in; line-height:15.0pt"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 12px;"&gt;On the Java side, the popular&lt;a href="http://www.javaworld.com/javaworld/jw-02-2006/jw-0220-axis.html"&gt; Axis-2 framework &lt;/a&gt;supports asych web services calls out of the box, by generating call back handlers in the webservice proxy.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:0in;margin-right:0in;margin-bottom:3.0pt;margin-left:0in; line-height:15.0pt"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 12px; "&gt;The &lt;a href="http://www.w3.org/Submission/ws-addressing/"&gt;WS-Addressing&lt;/a&gt; specification is also trying to bring in a standard for defining different MEP (Message Exchange Patterns).&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7338242441621015377?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7338242441621015377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7338242441621015377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7338242441621015377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7338242441621015377'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/05/async-calls-in-java-and-net-webservices.html' title='Async calls in Java and .NET webservices'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3532190839406486152</id><published>2009-04-30T14:10:00.000+05:30</published><updated>2009-04-30T14:22:57.438+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smart Clients'/><title type='text'>Smart Client Applications</title><content type='html'>Just read &lt;a href="http://japikse.blogspot.com/2008/10/smart-client-or-thin-client.html"&gt;this &lt;/a&gt;blog entry about Smart Client technology and an architect's dilemma to choose an appropriate client UI technology. I had blogged about Smart Clients earlier &lt;a href="http://narencoolgeek.blogspot.com/2008/02/smart-clientshas-pendulum-swung-back.html"&gt;here&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;div&gt;In &lt;a href="http://japikse.blogspot.com/2008/10/smart-client-or-thin-client-part-2-in.html"&gt;the &lt;/a&gt;blog posts, Philip discusses the scenarios where-in a thin web-based client makes sense. For SmartClient, he says that 'offline' applications are the best fit where it makes sense to use a thick client. I feel there is another strong reason why one would want to select Smart Client UI - a rich user experience. Even with cutting edge Ajax solutions, it is impossible to get the same look and feel of a desktop application over a browser.  We also have powerful WinForms/SmartClient third-party controls such as those from &lt;a href="http://www.infragistics.com/"&gt;Infragistics &lt;/a&gt;that enable you to slice-n-dice thousands of records in a grid. Such raw power is not available over a web interface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other important point raised by Philip was the security aspect of Smart Client applications. How would we protect the client code and data from being compromised? Possible solutions:&lt;/div&gt;&lt;div&gt;- Encrypt all data&lt;br /&gt;- Obfuscate the dlls&lt;/div&gt;&lt;div&gt;- Resolve data concurrency errors and database replication errors.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3532190839406486152?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3532190839406486152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3532190839406486152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3532190839406486152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3532190839406486152'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/04/smart-client-applications.html' title='Smart Client Applications'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2995296826701165448</id><published>2009-03-15T18:02:00.000+05:30</published><updated>2009-03-15T18:08:14.256+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Exception Handling'/><title type='text'>Global exception handler in Win Forms and Smart Client</title><content type='html'>I always wondered if it is possible to add a global exception handler for a Win Form application. This global exception handler would handle all exceptions that have not been caught in the UI forms. In web forms, we have the onError event handler in Global.asax, but I was not sure if Windows forms had a similar functionality. &lt;div&gt;I got the answer from Rich Newman's blog here:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://richnewman.wordpress.com/2007/04/08/top-level-exception-handling-in-windows-forms-applications-part-1/"&gt;http://richnewman.wordpress.com/2007/04/08/top-level-exception-handling-in-windows-forms-applications-part-1/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another option I had tried out was using the Policy Injection Block to capture all unhandled exceptions. But the caveat here is that all objects need to be proxied, which may be tedious to do.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2995296826701165448?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2995296826701165448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2995296826701165448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2995296826701165448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2995296826701165448'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/03/global-exception-handler-in-win-forms.html' title='Global exception handler in Win Forms and Smart Client'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-4274001255052065187</id><published>2009-03-02T10:26:00.001+05:30</published><updated>2009-03-02T10:33:48.929+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Priciples of SOA</title><content type='html'>Was reading "&lt;a href="http://www.thomaserl.com/"&gt;Thomas Erl's&lt;/a&gt; book - Priciples of Service Design" over the weekend.&lt;div&gt;It's an interesting book with a lucid language and simple to understand examples. &lt;/div&gt;&lt;div&gt;Jotting down some of the design principles for SOA:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Services should be &lt;span class="Apple-style-span" style="font-style: italic;"&gt;platform neutral and programming language neutral&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Services should have a &lt;span class="Apple-style-span" style="font-style: italic;"&gt;standard interface contract&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Services should be &lt;span class="Apple-style-span" style="font-style: italic;"&gt;loosely coupled&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Design for &lt;span class="Apple-style-span" style="font-style: italic;"&gt;coarse grained&lt;/span&gt; services&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Service Abstraction - Hide information that is not required by clients. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Hide underlying technology details.&lt;/span&gt; Promotes loose coupling.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Service &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Reusability &lt;/span&gt;- Position services as enterprise resources with agnostic functional context; i.e. the service can be used in other functional scenarios too. Always design the service in such a way, that it can be used beyond its original context.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Service &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Autonomy &lt;/span&gt;- Services need to have a high degree of control over their underlying runtime execution environment. The higher up a service is in a typical composition hierarchy, the less autonomy it tends to have due to dependencies on other composed services.&lt;/li&gt;&lt;li&gt;Service &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Statelesness &lt;/span&gt;- defer or delegate state to databases, rather than in memory.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Service &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Discovery &lt;/span&gt;- services can be discoved using standards such as UDDI.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-4274001255052065187?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/4274001255052065187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=4274001255052065187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4274001255052065187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4274001255052065187'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/03/priciples-of-soa.html' title='Priciples of SOA'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7674058875700741197</id><published>2009-01-20T15:12:00.001+05:30</published><updated>2009-01-21T22:42:05.638+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reusable Components'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET FileHelpers Library</title><content type='html'>I came across this cool and simple .NET library that I bet would be useful to everyone - &lt;a href="http://filehelpers.sourceforge.net/"&gt;FileHelpers Library 2.0&lt;/a&gt; &lt;div&gt;Very often, we have tasks where we need to read comma delimited files or fixed lenth files and load them into the database. Though this talk is very straight forward, the FileHelpers Library actually makes this task a breeze. Also the code looks much more clean and maintanable.&lt;/div&gt;&lt;div&gt;Link: &lt;a href="http://filehelpers.sourceforge.net/"&gt;http://filehelpers.sourceforge.net/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7674058875700741197?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7674058875700741197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7674058875700741197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7674058875700741197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7674058875700741197'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/01/net-filehelpers-library.html' title='.NET FileHelpers Library'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8817977460609012119</id><published>2009-01-20T14:19:00.000+05:30</published><updated>2009-01-21T22:51:43.769+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reusable Components'/><title type='text'>API for reading/creating Excel files in Java and .NET</title><content type='html'>&lt;div&gt;Recently I was trying to find a good library for reading and writing Excel files.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In .NET, there were quite a few alternatives. Given below are 2 blog-links where the author has given a detailed analysis of the libraries.&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.functionalfun.net/2008/06/reading-and-writing-excel-files-with.html"&gt;http://blog.functionalfun.net/2008/06/reading-and-writing-excel-files-with.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.functionalfun.net/2008/08/which-net-excel-io-component-should-i.html"&gt;http://blog.functionalfun.net/2008/08/which-net-excel-io-component-should-i.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For .NET, you also have the option of using the COM Excel library thats available if you have Excel(MS Office) installed on your box. But using the Excel COM Interop assembly has performance issues.&lt;/div&gt;&lt;div&gt;For Java, my friend pointed out that an excellent free open-source library is available at BIRT exchange. This library is called "&lt;a href="http://www.birt-exchange.com/products/spreadsheet-api/#features"&gt;e.Spreadsheet Excel API&lt;/a&gt;" and a cursory glance at the sample examples impressed me. The library is simple to use and completely free to use in your commercial applications too.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8817977460609012119?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8817977460609012119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8817977460609012119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8817977460609012119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8817977460609012119'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2009/01/api-for-readingcreating-excel-files-in.html' title='API for reading/creating Excel files in Java and .NET'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-3558569747707221461</id><published>2008-12-10T14:40:00.000+05:30</published><updated>2010-05-12T19:05:58.177+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Zachman Framework'/><title type='text'>Zachman Framework</title><content type='html'>&lt;div&gt;It's been some while since I attended John Zachman's seminar in Mumbai...&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s_McoyM9Sao/SVxkzSKDnrI/AAAAAAAACSk/HS2Tn5__0Xg/s1600-h/Zachman_ASG.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_s_McoyM9Sao/SVxkzSKDnrI/AAAAAAAACSk/HS2Tn5__0Xg/s400/Zachman_ASG.jpg" alt="" id="BLOGGER_PHOTO_ID_5286210894836244146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;Recently someone asked me what the Zachman framework was? I tried to explain to him in simple terms as follows:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The Zachman framework is a classification structure for expressing the basic elements of an enterprise architecture. It a powerful tool for organizing architectural artifacts (design documents, specs, models, etc.) based on context or perspective.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Zachman Framework is a matrix formed by the intersection of two classifications. &lt;/div&gt;&lt;div&gt;The columns represent the primitive interrogatives - why, how, when, who, where and why. The rows represent six different prespectives, which relate to stakeholder groups (Planner, Owner, Designer, Builder, Implementer and Worker). &lt;/div&gt;&lt;div&gt;The intersecting cells of the Framework correspond to models which, if documented, can provide a holistic view of the enterprise.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To view the model, please view below links:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.enterpriseunifiedprocess.com/images/zachmanFramework.gif"&gt;http://www.enterpriseunifiedprocess.com/images/zachmanFramework.gif&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-3558569747707221461?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/3558569747707221461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=3558569747707221461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3558569747707221461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/3558569747707221461'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/12/zachman-framework.html' title='Zachman Framework'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s_McoyM9Sao/SVxkzSKDnrI/AAAAAAAACSk/HS2Tn5__0Xg/s72-c/Zachman_ASG.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-967853180464739502</id><published>2008-11-15T03:33:00.000+05:30</published><updated>2008-11-15T03:40:50.356+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Updatable views using the 'INSTEAD OF' trigger</title><content type='html'>All views are not updatable in a database - especially if the underlying query is a complex one. This &lt;a href="http://www-128.ibm.com/developerworks/db2/library/techarticle/0210rielau/0210rielau.html"&gt;article&lt;/a&gt; gives interesting examples of the challenges faced in updating views.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But latest versions of databases, support a INSTEAD OF trigger, that enables us to make all views updatable. INSTEAD OF triggers fire in place of the triggering action.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The links below show how the 'INSTEAD OF' trigger can be used in different databases:&lt;/div&gt;&lt;div&gt;Oracle: &lt;a href="http://www.psoug.org/reference/instead_of_trigger.html"&gt;http://www.psoug.org/reference/instead_of_trigger.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;DB: &lt;a href="http://www-128.ibm.com/developerworks/db2/library/techarticle/0210rielau/0210rielau.html"&gt;http://www-128.ibm.com/developerworks/db2/library/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www-128.ibm.com/developerworks/db2/library/techarticle/0210rielau/0210rielau.html"&gt;techarticle/0210rielau/0210rielau.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;SQLServer: &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc164047.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/cc164047.aspx&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-967853180464739502?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/967853180464739502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=967853180464739502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/967853180464739502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/967853180464739502'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/11/updatable-views-using-instead-of.html' title='Updatable views using the &apos;INSTEAD OF&apos; trigger'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-7362644504971827390</id><published>2008-11-11T23:13:00.000+05:30</published><updated>2008-11-11T23:29:46.440+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Cold start Vs Warm start of programs</title><content type='html'>We often notice that if we start a Windows Forms application the first time after a system reboot, then the start-up time is quite long. But if I close and open the win-form application again, then the application start-up time is reduced drastically. This is true for all programs - Java. .NET, VB... not just WinForms. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For e.g. open a 5 MB word doc right after reboot and then reopen it again. There would be a difference of 5x-10x in startup times.  This difference between start-up times is called as Cold start and Warm start.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This happens because of 'disk-cache'. The 'disk-cache' is part of RAM that is dedicated to caching disk pages into memory. So the next time, a program is accessed, the disk cache is hit first and if the required program is found there, then it is loaded into the program space. Hence expensive disk access is eliminated and hence the start-up time is much faster. The pages remain in disk cache as long as possible and are removed based on a FIFO principle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Operating systems have started using this technique to make programs appear faster. &lt;/div&gt;&lt;div&gt;For example superfetch service on windows vista (xp has prefetch) does this by putting your most frequent used applications into the ram, so when you launch them, they are actually launched not for the first, but second time. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-7362644504971827390?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/7362644504971827390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=7362644504971827390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7362644504971827390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/7362644504971827390'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/11/cold-start-vs-warm-start-of-programs.html' title='Cold start Vs Warm start of programs'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1463428694024792452</id><published>2008-11-04T19:06:00.000+05:30</published><updated>2008-11-04T19:10:18.348+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Disabling startup programs</title><content type='html'>In Windows XP, if you are getting annoyed by the number of programs that start-up when the OS loads, then there is an easy way to disable the programs we don't need.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just type "msconfig" in the 'Run' window.  A window titled 'System Configuration Utility' would come up. Navigate to the 'StartUp' tab and uncheck those programs that need not be started at boot time.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1463428694024792452?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1463428694024792452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1463428694024792452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1463428694024792452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1463428694024792452'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/11/disabling-startup-programs.html' title='Disabling startup programs'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2239492859474341744</id><published>2008-10-03T16:07:00.000+05:30</published><updated>2008-10-03T16:22:29.281+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>MVP Vs MVC pattern</title><content type='html'>I was recently working on a .NET Smart Client application and came across the 'MVP' (Model View Presenter) design pattern. Having spend years developing applications on the MVC (Model View Controller) pattern (e.g. Struts, Webworks, ROR, etc.), I was intrigued to find out the difference between MVC and MVP (if any)&lt;br /&gt;The core principle behind MVP and MVC remain the same - clean separation of concerns between the presentation tier and the business tier.&lt;br /&gt;Some consider MVP to be a subset of MVC and there are tons of articles on the web giving differences between the two..I found most of the information muggy and more confusing. Finally I came across &lt;a title="About Me" href="http://haacked.com/archive/2008/06/16/everything-you-wanted-to-know-about-mvc-and-mvp-but.aspx"&gt;Phil Haack&lt;/a&gt; blog that explains it in simple and lucid words.&lt;br /&gt;Snippets from his blog:&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;em&gt;The two patterns are similar in that they both are concerned with separating concerns and they both contain Models and Views. Many consider the MVP pattern to simply be a variant of the MVC pattern. The key difference is suggested by the problem that the MVP pattern sought to solve with the MVC pattern. Who handles the user input? &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;br /&gt;&lt;em&gt;With MVC, it’s always the controller’s responsibility to handle mouse and keyboard events. With MVP, GUI components themselves initially handle the user’s input, but delegate to the interpretation of that input to the presenter. &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;In modern GUI systems, GUI components themselves handle user input such as mouse movements and clicks, rather than some central controller. Thus MVP pattern is widely used in WinForms, .NET SmartClient Factory, etc.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;In most web architectures, the MVC pattern is used (e.g. Struts, ASP.NET MVC, ROR, Webworks), whereas MVP pattern is mostly used in thick client architectures such as WinForms.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2239492859474341744?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2239492859474341744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2239492859474341744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2239492859474341744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2239492859474341744'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/10/mvp-vs-mvc-pattern.html' title='MVP Vs MVC pattern'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-4886399694365916546</id><published>2008-08-04T09:19:00.000+05:30</published><updated>2008-08-04T09:23:48.079+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>What the hell are all those processes running in the taskbar?</title><content type='html'>Ever opened the TaskManager on windows and wondered why there are so processes running?&lt;br /&gt;&lt;a href="http://www.howtogeek.com/"&gt;HowTo-Geek&lt;/a&gt; gives valuable information on some of the nagging questions:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://www.howtogeek.com/howto/windows-vista/what-is-juschedexe-and-why-is-it-running/"&gt;juschedexe&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.howtogeek.com/howto/windows-vista/what-is-ctfmonexe-and-why-is-it-running/"&gt;ctfmonexe&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://www.howtogeek.com/howto/windows-vista/what-is-rundll32exe-and-why-is-it-running/"&gt;rundll32&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://www.howtogeek.com/howto/windows-vista/what-is-svchostexe-and-why-is-it-running/"&gt;svchost&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-4886399694365916546?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/4886399694365916546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=4886399694365916546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4886399694365916546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4886399694365916546'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/08/what-hell-are-all-those-processes.html' title='What the hell are all those processes running in the taskbar?'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5465210588287984342</id><published>2008-07-16T10:05:00.000+05:30</published><updated>2008-07-16T10:16:35.989+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='iBatis'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Comparison of iBatis, Hibernate and JPA</title><content type='html'>As architects, we often need to decide on what OR mapping tool to use. I came across this &lt;a href="http://www.javaworld.com/javaworld/jw-07-2008/jw-07-orm-comparison.html"&gt;article &lt;/a&gt;on JavaLobby that compares iBatis, Hibernate and JPA.&lt;br /&gt;&lt;br /&gt;Snippets from the article:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iBATIS &lt;/span&gt;is best used when you need complete control of the SQL. It is also useful when the SQL queries need to be fine-tuned. iBATIS should not be used when you have full control over both the application and the database design, because in such cases the application could be modified to suit the database, or vice versa. In such situations, you could build a fully object-relational application, and other ORM tools are preferable. As iBATIS is more SQL-centric, it is generally referred to as inverted -- fully ORM tools generate SQL, whereas iBATIS uses SQL directly. iBATIS is also inappropriate for non-relational databases, because such databases do not support transactions and other key features that iBATIS uses.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hibernate &lt;/span&gt;is best used to leverage end-to-end OR mapping. It provides a complete ORM solution, but leaves you no control over queries. Hibernate is an ideal solution for situations where you have complete control over both the application and the database design. In such cases you may modify the application to suit the database, or vice versa. In these cases you could use Hibernate to build a fully object-relational application. Hibernate is the best option for object-oriented programmers who are less familiar with SQL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JPA &lt;/span&gt;should be used when you need a standard Java-based persistence solution. JPA supports inheritance and polymorphism, both features of object-oriented programming. The downside of JPA is that it requires a provider that implements it. These vendor-specific tools also provide certain other features that are not defined as part of the JPA specification. One such feature is support for caching, which is not clearly defined in JPA but is well supported by Hibernate, one of the most popular frameworks that implements JPA. Also, JPA is defined to work with relational databases only. If your persistence solution needs to be extended to other types of data stores, like XML databases, then JPA is not the answer to your persistence problem.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;:&lt;br /&gt;iBATIS does not provide a complete ORM solution, and does not provide any direct mapping of objects and relational models. However, iBATIS provides you with complete control over queries. Hibernate provides a complete ORM solution, but offers you no control over the queries. Hibernate is very popular and a large and active community provides support for new users. JPA also provides a complete ORM solution, and provides support for object-oriented programming features like inheritance and polymorphism, but its performance depends on the persistence provider.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5465210588287984342?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5465210588287984342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5465210588287984342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5465210588287984342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5465210588287984342'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/07/comparison-of-ibatis-hibernate-and-jpa.html' title='Comparison of iBatis, Hibernate and JPA'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8260840819251896018</id><published>2008-07-06T11:50:00.000+05:30</published><updated>2008-07-08T12:08:03.508+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Requirements'/><title type='text'>iRise visualization software</title><content type='html'>Recently on request of one of our clients, we were asked to evaluate &lt;a href="http://www.irise.com/"&gt;iRise &lt;/a&gt;V (isualization products.&lt;br /&gt;A quick perusal of what the product offered made me smile. There are so many projects that fail because the end-product is not what the business required. Sometimes the business itself is not sure of what it wants or how the end product should look like.&lt;br /&gt;It's estimated that 60% of projects fail because of misunderstanding of requirements.&lt;br /&gt;&lt;br /&gt;Using iRise visualization products, business analysis can quickly build UI elements that have the same look-and-feel and navigation as the final end product.&lt;br /&gt;More information at &lt;a href="http://www.irise.com/"&gt;http://www.irise.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S: Just got a mail from Tom Humbarger (iRise Project Manager) that an evaluation copy of iRise Studio PE is now available for free 30-day download from &lt;a href="http://www.download.com/iRise-Studio-Professional-Edition/3000-2654_4-10858519.html?cdlPid=10858615"&gt;Download.com&lt;/a&gt;. Would  highly recommend  it  for a try.&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span class="277285016-07072008"&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a rel="nofollow" name="OLE_LINK3"&gt;&lt;span style=""&gt;&lt;strong&gt;&lt;span style="font-size: 7.5pt; color: black; font-family: Verdana;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8260840819251896018?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8260840819251896018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8260840819251896018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8260840819251896018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8260840819251896018'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/07/irise-visualization-software.html' title='iRise visualization software'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-642091183902893771</id><published>2008-06-23T17:22:00.000+05:30</published><updated>2008-06-23T17:36:19.710+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Intrusion Detection'/><title type='text'>Open Source IDS, Firewall, VPN Gateways</title><content type='html'>A few years back, if a SMB(small and medium business) shop wanted to install Firewalls, Network Intrusion Detection systems, VPN Gateways, etc. then it needed to shell out hundreds of dollars for commercial software from giants such as Cisco, Juniper etc.&lt;br /&gt;&lt;br /&gt;But in the last few years, we have a slew of options available from the open-source world. I have been closely watching 2 products in this space:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://www.snort.org/"&gt;Snort&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial; color: rgb(0, 0, 153);font-size:85%;" &gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Snort is an open source network intrusion prevention system, capable         of performing real-time traffic analysis and packet logging on IP networks.         It can perform protocol analysis, content searching/matching and can         be used to detect a variety of attacks and probes, such as buffer overflows,         stealth port scans, CGI attacks, SMB probes, OS fingerprinting attempts,       and much more. &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-family: arial;font-size:85%;" &gt;Snort has three primary uses. It can be used as a straight packet sniffer         like tcpdump, a packet logger (useful for network traffic debugging,         etc), or as a full blown network intrusion prevention system.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial; color: rgb(0, 0, 153);font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;2. &lt;a href="http://www.untangle.com"&gt;Untangle&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-family: arial;font-size:85%;" &gt;Untangle delivers an integrated family of applications that help you simplify and consolidate the network and security products you need, in one place at the network gateway. The most popular applications let businesses block spam, spyware, viruses, and phish, filter out inappropriate web content, control unwanted protocols like instant messaging, and provide remote access and support options to their employees&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Today Snort has become the de-factor standard for IDS. Even Untangle uses Snort for its IDS application. I was impressed with the range of applications available on the Untangle Gateway Platform. It includes SPAM blocker, Web Filter, Firewall, IDS based on Snort, VPN Gateway based on OpenVPN, a patented attack blocker, etc. A must try-out product :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-642091183902893771?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/642091183902893771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=642091183902893771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/642091183902893771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/642091183902893771'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/06/open-source-ids-firewall-vpn-gateways.html' title='Open Source IDS, Firewall, VPN Gateways'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5993645454283067927</id><published>2008-06-14T19:25:00.000+05:30</published><updated>2008-06-14T19:37:41.208+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='FileWatcher'/><title type='text'>File Watcher programs</title><content type='html'>During the early years, we often had to write our own component to monitor file changes or changes to a directory.  Recently a friend of mine introduced me to the &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx"&gt;FileSystemWatcher&lt;/a&gt; class in .NET. We needed such a solid component and were contemplating writing it ourselves.&lt;br /&gt;I was impressed with the wide range of features available in the FileSystemWatcher class. Not only will it detect changes in files, but it can monitor folders and sub-folders too.&lt;br /&gt;And it can monitor a wide range of attributes - not just whether a file exists or not. For e.g. it can monitor whether the file size has changed, renamed, deleted etc.&lt;br /&gt;&lt;br /&gt;I started wondering why there was no equivalent component in the Java SDK. The answer lies in the fact that such kind of event-raising is not available on Unix platforms.  So polling is the only option that works cross-platform. When we poll, we cannot detect directory changes like renaming or moving. Also polling for a directory and all sub-directories has a big performance hit!&lt;br /&gt;&lt;br /&gt;There a few programs available in Java that a developer can use instead of reinventing the wheel. Here are a few links that provide File watcher programs in Java:&lt;br /&gt;&lt;a href="http://jpoller.sourceforge.net/"&gt;http://jpoller.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twit88.com/blog/2007/10/02/develop-a-java-file-watcher/"&gt;Java-File-Watcher&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jahia.org/javadoc-dev/org/jahia/tools/files/FileWatcher.html"&gt;Jahia File watcher&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5993645454283067927?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5993645454283067927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5993645454283067927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5993645454283067927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5993645454283067927'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/06/file-watcher-programs.html' title='File Watcher programs'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2610799557400763034</id><published>2008-06-10T11:08:00.001+05:30</published><updated>2008-06-10T11:12:43.796+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTS 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Memory Analysis.'/><title type='text'>VSTS 2008 has a memory profiler</title><content type='html'>Visual Studio Team System 2005 had a profiler that was useful in obtaining response times and diagnosing time taken by each component/method.&lt;br /&gt;&lt;br /&gt;Now in v2008, the Profiler comes equipped to do heap analysis. Information on how to enable heap analysis can be found at this &lt;a href="http://blogs.msdn.com/buckh/archive/2007/10/09/using-vsts-2008-memory-allocation-profiling.aspx"&gt;blog&lt;/a&gt;&lt;br /&gt;At the end of it, we get a report of the top methods allocating most memory, the types occupying most memory, etc.&lt;br /&gt;This report is not as comprehensive as that provided by &lt;a href="http://www.compuware.com/products/devpartner/studio.htm"&gt;Numega DevPartner Studio.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2610799557400763034?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2610799557400763034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2610799557400763034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2610799557400763034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2610799557400763034'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/06/vsts-2008-has-memory-profiler.html' title='VSTS 2008 has a memory profiler'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-4053085040571977925</id><published>2008-06-09T19:14:00.000+05:30</published><updated>2008-06-10T09:49:59.522+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code Metrics'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Numega DevPartner Studio</title><content type='html'>Recently I installed DevPartner Studio and have explored the features provided by the tool. The tool integrates seamlessly into VS.NET and has the following high-level features:&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Static Analysis&lt;/span&gt; (Similar to FxCop or Code Analysis in VS Team Studio)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Error Detection&lt;/span&gt; (You actually run the application/program and the tool would give a report of possible errors. This tool is more valuable in case of COM usage through .NET and in C, VC++ projects to detect OutOfBounds errors and dangling pointers, etc)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Code Coverage&lt;/span&gt; (You run the application and at the end of it, a report is generated giving us code paths that were not executed. So helpful in finding dead code.)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Memory Analysis&lt;/span&gt; (Heap analysis, shows object graph till root objects, no of objects created/destroyed etc.)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Performance Analysis&lt;/span&gt; (E.g. U can create snapshots while running the application and the tool would give you the time spend in each method and many other stats. E.g. top 20 methods consuming most time, call graph, etc. Another cool feature is the source code window with time stats for each line on the left side. No more guessing what is taking so much time. )&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;In Depth Performance Analyzer&lt;/span&gt; (CPU stats, Disk IO, Network IO, etc)&lt;br /&gt;&lt;br /&gt;Visual Studio Team System provides us with many similar features. A VS product comparison can be found &lt;a href="http://msdn.microsoft.com/hi-in/vsts2008/products/cc149003%28en-us%29.aspx"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-4053085040571977925?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/4053085040571977925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=4053085040571977925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4053085040571977925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4053085040571977925'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/06/numega-devpartner-studio.html' title='Numega DevPartner Studio'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2147187927078715917</id><published>2008-06-02T15:40:00.000+05:30</published><updated>2008-06-02T15:47:40.558+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>Interesting features in Web 2.0 feature pack of Websphere v6.1</title><content type='html'>IBM has recently released a new feature pack for WAS 6.1 that has a host of cool features to build Web 2.0 applications.&lt;br /&gt;AJAX support is provided by the DOJO Toolkit. There are a host of gadgets available (some added by IBM on top of DOJO) for RIA screens. Some features that were of particular interest to me are:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;A javascript SOAP client that will enable web clients to make webservices requests directly.&lt;/li&gt;   &lt;li&gt;Web-remoting RPC component that would enable a JS client to call an EJB method or a POJO method directly.&lt;/li&gt;   &lt;li&gt;Apache Abdera library for manipulating ATOM/RSS feeds&lt;/li&gt;   &lt;li&gt;JSON4J library on the server side to convert between JSON text and Java objects&lt;/li&gt;   &lt;li&gt;AJAX messaging to implement Server side push. This is totally cool. I always wanted to experiment with the CometD functionality available in DOJO and here the interation between the DOJO Message Bus (client) and Websphere Service Integration bus was provided out of the box :)&lt;/li&gt; &lt;/ul&gt; A good example showing Stock Quote Streaming can be found &lt;a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/topic/com.ibm.websphere.webmsg.quotestreamer.help/docs/Overview.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2147187927078715917?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2147187927078715917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2147187927078715917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2147187927078715917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2147187927078715917'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/06/interesting-features-in-web-20-feature.html' title='Interesting features in Web 2.0 feature pack of Websphere v6.1'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6653615452317089623</id><published>2008-05-31T20:36:00.000+05:30</published><updated>2008-05-31T20:48:00.634+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Programming'/><title type='text'>Finding the geographical location of client web requests</title><content type='html'>Nowadays, we see many sites that show our geographical location the screen when we hit the page.&lt;br /&gt;So how do the sites find out this information? Well, on the server side, we can obtain the IP address of the client (or the Internet provider proxy) from the request object.&lt;br /&gt;&lt;br /&gt;From this IP address, we can query a database(typically csv files) and obtain the location information. The country information is free and available for download &lt;a href="http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For state and city information, U got to stuff out some moolah.. :)&lt;br /&gt;More information can be found out here-&lt;br /&gt;&lt;a href="http://www.ip2location.com/faqs-ip-country.aspx"&gt;http://www.ip2location.com/faqs-ip-country.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6653615452317089623?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6653615452317089623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6653615452317089623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6653615452317089623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6653615452317089623'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/05/finding-geographical-location-of-client.html' title='Finding the geographical location of client web requests'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1549805147399691182</id><published>2008-05-28T13:58:00.000+05:30</published><updated>2008-05-28T14:02:37.654+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS 6.0'/><title type='text'>Kernel mode and User mode</title><content type='html'>In IIS 6.0, the core HTTP engine (HTTP.SYS) runs in kernel mode and all worker processes run in user mode. So what exactly is the difference between kernel mode and user mode programs?&lt;br /&gt;&lt;br /&gt;User mode and kernel mode refers to the privilege level a process has to the system hardware. The closer to the hardware the process becomes, the more sensitive the system is to provoking system failure. In any OS, you want to separate applications from OS services because you want the OS to remain functional if an application crashes.&lt;br /&gt;&lt;br /&gt;Typical OS architecture has two rings: one ring running in system mode, and a ring running in user mode. The kernel has full control of the&lt;br /&gt;hardware and provides abstractions for the processes running in user mode. A process running in user mode cannot access the hardware, and must use the abstractions provided by the kernel. It can call certain services of the kernel by making "system calls" or kernel calls. The&lt;br /&gt;kernel only offers the basic services. All others are provided by programs running in user mode.&lt;br /&gt;&lt;br /&gt;Kernel mode program also run much faster than User mode programs as they are much closer to the hardware.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1549805147399691182?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1549805147399691182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1549805147399691182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1549805147399691182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1549805147399691182'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/05/kernel-mode-and-user-mode.html' title='Kernel mode and User mode'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-5755406738936393862</id><published>2008-05-21T00:21:00.000+05:30</published><updated>2008-05-21T01:29:31.441+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Overcoming the 2 connection limit in browsers</title><content type='html'>The HTTP 1.1 protocol dictates that browsers cannot make more than 2 connections per domain name. This limitation can cause slow page loads for pages containing a lot of images or other references to external resources.&lt;br /&gt;To overcome this limitation, we can create &lt;a href="http://en.wikipedia.org/wiki/Subdomains"&gt;sub-domains&lt;/a&gt; and serve other static content from these sub-domains, so that the browser can create extra 2 connections for each sub-domain.&lt;br /&gt;This trick is explained in the following links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://brainspl.at/articles/2006/12/29/speed-up-page-loads"&gt;http://brainspl.at/articles/2006/12/29/speed-up-page-loads&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.die.net/musings/page_load_time/"&gt;http://www.die.net/musings/page_load_time/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Actually the above technique is only useful if there are a lot of external resources that need to be loaded by the page. HTTP 1.1 also brought in the concept of HTTP pipelining. This means that over those two connections the browser can send the requests back-to-back before even before receiving a single response. This completely eliminates the dead-time between getting back the last packet of the previous request and then sending the next request. Instead, all the requests are queued at the server, which sends out responses as fast as TCP/IP would allow. If HTTP pipelining is enabled, then the page load speed improves dramatically.&lt;br /&gt;&lt;br /&gt;But unfortunately, HTTP pipelining is disabled by default in IE/Firefox- bcoz not all proxies and servers support it still. To enable pipelining in Firefox type "about:config" in Firefox's location bar and enable the "network.http.pipelining" preference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-5755406738936393862?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/5755406738936393862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=5755406738936393862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5755406738936393862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/5755406738936393862'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/05/overcoming-2-connection-limit-in.html' title='Overcoming the 2 connection limit in browsers'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-2414527788121894737</id><published>2008-03-21T00:32:00.000+05:30</published><updated>2008-03-21T00:43:56.684+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle RAC and Dataguard</title><content type='html'>A lot of IT managers get confused between what a Oracle RAC does and what Dataguard does.&lt;br /&gt;&lt;br /&gt;Oracle RAC provides us with a cluster of Oracle instances for the same database/datastore. This enables massive scalability and availability. But it does not provide protection against failure of the database or corruption of the data. e.g.  natural disaster that resulted in data-loss or data-corruption.&lt;br /&gt;&lt;br /&gt;Oracle dataguard enables creation of a standby database at a DR site and thus provides data protection.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-2414527788121894737?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/2414527788121894737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=2414527788121894737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2414527788121894737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/2414527788121894737'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/03/oracle-rac-and-dataguard.html' title='Oracle RAC and Dataguard'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-439073083339304448</id><published>2008-03-14T12:26:00.000+05:30</published><updated>2008-03-14T12:44:44.438+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>ViewState in ASP.NET</title><content type='html'>There is so much confusion over what ViewState does and why is it required. Finally the following link helped me in understanding a lot of things:&lt;br /&gt;&lt;a href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx"&gt;http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Snippets from the above article:&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;Server Controls utilize ViewState as the backing store for most, if not all their properties. That means when you declare an attribute on a server control, that value is usually ultimately stored as an entry in that control's ViewState StateBag.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;ASP.NET calls TrackViewState() on the StateBag during the OnInit phase of the page/control lifecycle. This little trick ASP.NET uses to populate properties allows it to easily detect the difference between a declaratively set value and dynamically set value.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;When the StateBag is asked to save and return it's state (StateBag.SaveViewState()), it only does so for the items contained within it that are marked as Dirty. That is why StateBag has the tracking feature. In order for data to be serialized, it must be marked as dirty. In order to be marked as dirty, it's value must be set after TrackViewState() is called. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;When the page first begins to load during a postback (even prior to initialization), all the properties are set to their declared natural defaults. Then OnInit occurs. During the OnInit phase, ASP.NET calls TrackViewState() on all the StateBags. Then LoadViewState() is called with the deserialized data that was dirty from the previous request. The StateBag calls Add(key, value) for each of those items. Since the StateBag is tracking at this point, the value is marked dirty, so that it may be persisted once again for the next postback.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;ViewState is only one way controls maintain values across postbacks. Regular good old HTML FORMS play a role, too. For example, disable viewstate on a textbox, and it will still maintain its value, because it is POSTING the value with the form. Make that TextBox invisible then do a post, and the value is lost. Thats where ViewState helps, which would allow it to maintain the value even if its invisible.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#000099;"&gt;The option to set control properties in the OnPreInit event in order to avoid those values from being entered into the viewstate is a good idea to avoid storing these values in the ViewState. To avoid Datagrids from storing values in the ViewState, rebind the data to the grid on each page load.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-439073083339304448?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/439073083339304448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=439073083339304448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/439073083339304448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/439073083339304448'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/03/viewstate-in-aspnet.html' title='ViewState in ASP.NET'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8242308183253509334</id><published>2008-03-06T15:15:00.000+05:30</published><updated>2008-03-06T15:23:06.522+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Security Principles</title><content type='html'>Browsing thru the OWASP site, I came across the following security principles that are of interest while designing the security architecture. Every security policy has 3 objectives:&lt;br /&gt;a) Confidentiality    b)Integrity    c)Availability&lt;br /&gt;&lt;br /&gt;Examples of security principles:&lt;br /&gt;1: &lt;span style="color:#3333ff;"&gt;Securing the weakest link&lt;/span&gt; (The chain is only as strong as its weakest link) - e.g. Attackers will not target the firewall, but the applications accessible through the firewall.&lt;br /&gt;&lt;br /&gt;2: &lt;span style="color:#3333ff;"&gt;Minimize Attack Surface Area&lt;/span&gt; - design the system such that the potential areas for intrusion are reduced.&lt;br /&gt;&lt;br /&gt;3. &lt;span style="color:#3333ff;"&gt;Principle of Least Privilege&lt;/span&gt; - only give those permissions to the user that are required.&lt;br /&gt;&lt;br /&gt;4. &lt;span style="color:#3333ff;"&gt;Principle of Defense in Depth&lt;/span&gt; - e.g. Do validations at the front-end using Javascript, in the web-tier using validation logic, in the database using constraints and triggers.&lt;br /&gt;&lt;br /&gt;5. &lt;span style="color:#3333ff;"&gt;Fail securely&lt;/span&gt; - If an application/program fails, then it should not leave the system in an insecure state.&lt;br /&gt;&lt;br /&gt;6. &lt;span style="color:#3333ff;"&gt;Separation of Duties&lt;/span&gt; - e.g.an administrator should be able to turn the system on or off, set passwordpolicy but shouldn’t be able to log on to the storefront as a super privileged user, such as beingable to buy goods on behalf of other users.&lt;br /&gt;&lt;br /&gt;7. &lt;span style="color:#3333ff;"&gt;Don't just rely on security by obscurity&lt;/span&gt;. Use security by design. Use elements of both the strategies.&lt;br /&gt;&lt;br /&gt;The following links provide interesting material for reading:&lt;br /&gt;&lt;a href="http://www.infoworld.com/article/05/08/19/34OPsecadvise_1.html"&gt;http://www.infoworld.com/article/05/08/19/34OPsecadvise_1.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Honeypot_%28computing%29"&gt;http://en.wikipedia.org/wiki/Honeypot_%28computing%29&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8242308183253509334?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8242308183253509334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8242308183253509334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8242308183253509334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8242308183253509334'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/03/security-principles.html' title='Security Principles'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6446904650720727360</id><published>2008-03-05T19:23:00.000+05:30</published><updated>2008-03-05T20:12:10.171+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>XSS and CSRF attacks</title><content type='html'>Of late, I have been doing a lot of study to understand 'Cross-Site Scripting' attacks and 'Cross Sitre Request forging' attacks.&lt;br /&gt;XSS flaws occur whenever an application takes user supplied data and sends it to a web browser without first validating or encoding that content. XSS allows attackers to execute script in the victim's browser which can hijack user sessions, deface web sites, possibly introduce worms, etc. &lt;a href="http://www.technicalinfo.net/papers/CSS.html"&gt;http://www.technicalinfo.net/papers/CSS.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.shocking.com/~rsnake/xss.html"&gt;http://www.shocking.com/~rsnake/xss.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How to prevent XSS atacks? Tips from the &lt;a href="http://www.owasp.org/"&gt;www.owasp.org&lt;/a&gt; site&lt;br /&gt;1. Use proper input validation techniques&lt;br /&gt;2. Encoding the output. This includes data read from files and databases.&lt;br /&gt;For input validation, its better to go for a ‘positive’ security policy that specifies what is allowed rather than a ‘Negative’ or attack signature based policies as they are difficult to maintain and are likely to be incomplete.&lt;br /&gt;&lt;br /&gt;The following link at MSDN contains some good info about preventing XSS attacks:&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998274.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms998274.aspx&lt;/a&gt;&lt;br /&gt;Microsoft even has a "Anti-Cross Site Scripting Library" available at:&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa973813.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa973813.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.owasp.org/index.php/Cross-Site_Request_Forgery"&gt;OWASP &lt;/a&gt;site defines CSRF as follows:&lt;br /&gt;Cross-Site Request Forgery (CSRF) is an attack that tricks the victim into loading a page that contains a malicious request. It is malicious in the sense that it inherits the identity and privileges of the victim to perform an undesired function on the victim's behalf, like change the victim's e-mail address, home address, or password, or purchase something. CSRF attacks generally target functions that cause a state change on the server but can also be used to access sensitive data.&lt;br /&gt;&lt;br /&gt;One technique to prevent event CSRF attacks is to use the 'Token Synchronization' pattern. Sample filters for JEE and .NET are available on the OSWAP site at the following links:&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/CSRF_Guard"&gt;http://www.owasp.org/index.php/CSRF_Guard&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/.Net_CSRF_Guard"&gt;http://www.owasp.org/index.php/.Net_CSRF_Guard&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6446904650720727360?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6446904650720727360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6446904650720727360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6446904650720727360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6446904650720727360'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/03/xss-and-csrf-attacks.html' title='XSS and CSRF attacks'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-4799620652207040264</id><published>2008-03-05T19:13:00.000+05:30</published><updated>2008-03-05T19:16:02.878+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Storing sensitive information in properties file</title><content type='html'>In JEE and .NET applications we often store data access configuration parameters such as username, password, datasource URL in properties files. But how to protect this sensitive information? The obvious answer is to encrypt the file or the 'string' properties. But then the question is - where do U store the key? If U encrypt the key, then U would require another key to decrypt this key...a classic chicken-and-egg problem.&lt;br /&gt;&lt;br /&gt;Browsing thru &lt;a href="http://www.owasp.org/"&gt;OWASP &lt;/a&gt; site pages, I came across this &lt;a href="http://www.owasp.org/index.php/How_to_encrypt_a_properties_file"&gt;page&lt;/a&gt; that contained some interesting ideas for this problem. Snippet from the site:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;"Some environments have protected locations, such as the WebSphere configuration files, or the system registry. You can use a file in a protected location, that uses OS access control to limit access to only the application. You could put the key in the code, but that makes it difficult to change and deploy securely. You can also force the master key to be entered when the system boots up so it's only in memory, but that means you lose automatic reboot. You can even split the key and put parts in more than one of these locations."&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;The page also contains a sample implementation in Java for encrypting properties file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-4799620652207040264?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/4799620652207040264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=4799620652207040264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4799620652207040264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/4799620652207040264'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/03/storing-sensitive-information-in.html' title='Storing sensitive information in properties file'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1001850363865662945</id><published>2008-03-04T14:38:00.000+05:30</published><updated>2008-03-04T14:45:07.558+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Various types of performance testing</title><content type='html'>Came across this site (&lt;a href="http://www.loadtest.com.au/types_of_tests.htm"&gt;http://www.loadtest.com.au/types_of_tests.htm&lt;/a&gt;) that lists down the various types of testing that can be done to performance test a system. Given below are snippets from the above page.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color:#3333ff;"&gt;Load Testing:&lt;/span&gt; Load Tests are end to end performance tests &lt;em&gt;under anticipated production load.&lt;/em&gt;  The primary objective of this test is to determine the response times for various time critical transactions and business processes and that they are within documented expectations (or Service Level Agreements - SLAs).  The test also measures the capability of the application to function correctly under load, by measuring transaction pass/fail/error rates. &lt;/li&gt;&lt;li&gt;&lt;span style="color:#3333ff;"&gt;Stress Testing&lt;/span&gt;: Stress Tests determine the load under which &lt;em&gt;a system fails&lt;/em&gt;, and how it fails.  This is in contrast to Load Testing, which attempts to simulate anticipated load.  It is important to know in advance if a ‘stress’ situation will result in a catastrophic system failure, or if everything just 'goes really slow'.  There are various varieties of Stress Tests, including &lt;em&gt;spike, stepped and gradual ramp-up tests&lt;/em&gt;.  Catastrophic failures require restarting various infrastructure and contribute to downtime, a stress-full environment for support staff and managers, as well as possible financial losses. &lt;/li&gt;&lt;li&gt;&lt;span style="color:#3333ff;"&gt;Volume Testing&lt;/span&gt;: Volume Tests are often most appropriate to &lt;em&gt;Messaging, Batch and Conversion processing type situations&lt;/em&gt;.  In a Volume Test, typically the Response times are not measured. Instead, the Throughput is measured.  A key to effective volume testing is the identification of the relevant capacity drivers.  A capacity driver is something that directly impacts on the total processing capacity.  For a messaging system, a capacity driver may well be the size of messages being processed.  For batch processing, the type of records in the batch as well as the size of the database that the batch process interfaces with will have an impact on the number of batch records that can be processed per second.&lt;/li&gt;&lt;li&gt;&lt;span style="color:#3333ff;"&gt;Network Testing&lt;/span&gt;: Network sensitivity tests are tests that set up scenarios of varying types of network activity (traffic, error rates...), and then measure the impact of that traffic on various applications that are bandwidth dependant.  Very 'chatty' applications can appear to be more prone to response time degradation under certain conditions than other applications that actually use more bandwidth.  For example, some applications may degrade to unacceptable levels of response time when a certain pattern of network traffic uses 50% of available bandwidth, while other applications are virtually un-changed in response time even with 85% of available bandwidth consumed elsewhere.This is a particularly important test for deployment of a time critical application over a WAN.&lt;/li&gt;&lt;li&gt;&lt;span style="color:#3333ff;"&gt;Failover Testing&lt;/span&gt;: Failover Tests verify of redundancy mechanisms while under load.  For example, such testing determines what will happen if multiple web servers are being used under peak anticipated load, and one of them dies.  Does the load balancer react quickly enough? Can the other web servers handle the sudden dumping of extra load?  This sort of testing allows technicians to address problems in advance, in the comfort of a testing situation, rather than in the heat of a production outage. &lt;/li&gt;&lt;li&gt;&lt;span style="color:#3333ff;"&gt;Soak Testing&lt;/span&gt;: Soak testing is running a system at high levels of load for prolonged periods of time.  A soak test would normally execute several times more transactions in an entire day (or night) than would be expected in a busy day, to identify and performance problems that appear after a large number of transactions have been executed.  Also, due to memory leaks and other defects, it is possible that a system may ‘stop’ working after a certain number of transactions have been processed.  It is important to identify such situations in a test environment.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1001850363865662945?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1001850363865662945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1001850363865662945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1001850363865662945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1001850363865662945'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/03/various-types-of-performance-testing.html' title='Various types of performance testing'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-1750337011988446264</id><published>2008-02-29T17:12:00.000+05:30</published><updated>2008-02-29T17:19:09.343+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='JEE'/><category scheme='http://www.blogger.com/atom/ns#' term='Webservices'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Schema validation in webservices</title><content type='html'>Recently a friend of mine was working on a .NET SOA project and was facing a peculiar problem.The XML Schema he was using had a lot of restictions such as minOccurs, maxOccurs, int ranges, string regular expression patterns, etc.&lt;br /&gt;&lt;br /&gt;But unfortunately in .NET 2.0 webservices, there was no easy way to validate input messages based on this schema. The reason for this behavior has to do with XmlSerializer, the underlying plumbing that takes care of object deserialization. XmlSerializer is very forgiving by design. It happily ignores XML nodes that it didn't expect and will use default CLR values for expected but missing XML nodes. It doesn't perform XML Schema validation and the consequence is that details like structure, ordering, occurrence constraints, or simple type restrictions are not enforced during deserialization.&lt;br /&gt;&lt;br /&gt;Unfortunately there is no switch in .NET 2.0 that can turn on Schema validations. The only way to validate schemas is to use SOAP extensions and validate the message in the extension code block before deserialization occurs. The following links show us how to do it:&lt;br /&gt;1. &lt;a href="http://msdn.microsoft.com/msdnmag/issues/02/11/XMLFiles/default.aspx"&gt;MSDN-1&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://msdn.microsoft.com/msdnmag/issues/03/07/xmlschemavalidation/default.aspx"&gt;MSDN-2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the J2EE world, JAX-WS 2.0 has become the default standard for developing webservices. In most toolkits, we essentially have 2 options: Let the SOAP engine do the data-binding and validation or separate the data-binding and schema validation from the SOAP engine. For e.g. In Sun Metro project, validation can be enabled for the SOAP engine using the @SchemaValidation attribute on a webservice.(&lt;a href="https://jax-ws.dev.java.net/guide/Schema_Validation.html"&gt;https://jax-ws.dev.java.net/guide/Schema_Validation.html&lt;/a&gt;)&lt;br /&gt;In Axis 2, there is support to enable schema validation using the XMLBeans binding framework.&lt;br /&gt;&lt;br /&gt;I found &lt;a href="http://epubs.cclrc.ac.uk/bitstream/1542/AsifAkramDaveMeredithChapter.pdf"&gt;this &lt;/a&gt;whitepaper quite valuable in understanding the various options for schema validation in JEE webservices.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-1750337011988446264?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/1750337011988446264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=1750337011988446264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1750337011988446264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/1750337011988446264'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/02/schema-validation-in-webservices.html' title='Schema validation in webservices'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-8753041462352979310</id><published>2008-02-27T18:36:00.000+05:30</published><updated>2008-02-27T18:45:36.849+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Problems with Struts SSLext</title><content type='html'>One of the projects I was consulting on, was using the SSL-ext plugin module of Struts to redirect all secure resources to SSL. More information on how to mix HTTP and HTTPS in a web-flow can be found in my blog post &lt;a href="http://narencoolgeek.blogspot.com/2006/01/having-both-http-and-https-in-web.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The SSL plug-in module used a simple technique - a custom request processor/servlet filter would check the URL of each request and then check in the configuration file if the requested resource was secure and needed to be accessed using SSL. So if we receive a plain HTTP request for a secure resource, then a redirect HTTP 304 response would be sent back to the user. The redirected URL would have the HTTPS scheme.&lt;br /&gt;&lt;br /&gt;Now, in the production environment, it was decided to move the SSL encryption/decryption to a Cisco Content Switch (at the hardware level). The Content switch would decrypt the content and then forward the request to the webserver as plain HTTP.&lt;br /&gt;But this caused a problem at the AppServer level as the SSL-ext in Struts always sent redirect responses for all secure resources. This resulted in a recursive infinite loop of request-response traffic between the browser and the servers, due to which the browser showed a 'hanged' screen.&lt;br /&gt;I was given the task to find an innovative solution to this problem. The challenge here was that we wanted to use the SSL-ext plug-in feature functionality so that it is impossible to access secure resources using plain HTTP. All we needed was some way for the content switch to pass information to the AppServer that the request that reached the content switch was HTTPS.&lt;br /&gt;&lt;br /&gt;I decided to do this using HTTP headers. We configured the content switch to set the 'Via' HTTP header to "HTTPS" whenever a SSL request reaches the content switch. We changed the source code of SSL-ext to check for this header instead of the URL scheme and port number and send a redirect if necessary. This simple solution worked just fine and earned me kudos from the team :)&lt;br /&gt;&lt;br /&gt;P.S: I got the idea of using HTTP header after reading the below URL. A must read :)&lt;br /&gt;&lt;a href="http://www.nextthing.org/archives/2005/08/07/fun-with-http-headers"&gt;http://www.nextthing.org/archives/2005/08/07/fun-with-http-headers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-8753041462352979310?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/8753041462352979310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=8753041462352979310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8753041462352979310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/8753041462352979310'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/02/problems-with-struts-sslext.html' title='Problems with Struts SSLext'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-448768571873751473</id><published>2008-02-26T15:02:00.000+05:30</published><updated>2008-02-26T15:36:00.162+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Architecture Principles</title><content type='html'>A member of my team recently asked me a simple question - "What are Architecture principles? And how are they different from the guidelines, best practices and NFRs that we already follow?"&lt;br /&gt;&lt;br /&gt;Well the line of difference between the two is very blurred and in fact there could be a lot of overlap between them.&lt;br /&gt;&lt;br /&gt;Principles are general rules and guidelines(that seldom change) that inform and support the way in which an organization sets about fulfilling its mission.&lt;br /&gt;Architecture principles are principles that relate to architecture work. They embody the spirit and thinking of the enterprise architecture.These principles govern the architecture process, affecting the design, development and maintenance of applications in an enterprise.&lt;br /&gt;&lt;br /&gt;The typical format in which a principle is jotted down is -&lt;br /&gt;1. Statement - explaining what the principle is&lt;br /&gt;2. Rationale - explaining why?&lt;br /&gt;&lt;br /&gt;The following 2 links contain good reading material.&lt;br /&gt;&lt;a href="http://www.opengroup.org/architecture/togaf8-doc/arch/chap29.html"&gt;http://www.opengroup.org/architecture/togaf8-doc/arch/chap29.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.its.state.ms.us/its/EA.nsf/webpages/principles_home?OpenDocument"&gt;http://www.its.state.ms.us/its/EA.nsf/webpages/principles_home?OpenDocument&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Examples of some interesting principles from the above sites:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;em&gt;&lt;u&gt;Principle&lt;/u&gt;&lt;/em&gt;: Total cost of ownership design&lt;/span&gt;&lt;br /&gt;In an atmosphere where complex and ever-changing systems are supporting all aspects of our business every hour of the day, it is easy to lose track of costs and benefits. And yet, these critical measures are fundamental to good decision-making. The Enterprise Architecture can and must assist in accounting for use, for change, for costs, and for effectiveness.&lt;br /&gt;&lt;u&gt;&lt;em&gt;Rationale&lt;/em&gt;&lt;/u&gt;:Total costs of present and proposed alternatives, including unintended consequences and opportunities missed, must be a part of our decisions as we build the architecture of the future.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;&lt;em&gt;Principle&lt;/em&gt;&lt;/u&gt;: Mainstream technology use&lt;/span&gt;&lt;br /&gt;Production IT solutions must use industry-proven, mainstream technologies except in those areas where advanced higher-risk solutions provide a substantial benefit. Mainstream is defined to exclude unproven technologies not yet in general use and older technologies and systems that have outlived their effectiveness.&lt;br /&gt;&lt;u&gt;&lt;em&gt;Rationale&lt;/em&gt;&lt;/u&gt;:The enterprise may not want to be on the leading edge for its core service systems. Risk will be minimized.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;&lt;em&gt;Principle&lt;/em&gt;&lt;/u&gt;: Interoperability and reusability&lt;/span&gt;&lt;br /&gt;Systems will be constructed with methods that substantially improve interoperability and the reusability of components.&lt;br /&gt;&lt;u&gt;&lt;em&gt;Rationale&lt;/em&gt;&lt;/u&gt;:Enables the development of new inter-agency applications and services&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;&lt;em&gt;Principle&lt;/em&gt;&lt;/u&gt;: Open systems&lt;/span&gt;&lt;br /&gt;Design choices prioritized toward open systems will provide the best ability to create adaptable, flexible and interoperable designs.&lt;br /&gt;&lt;u&gt;&lt;em&gt;Rationale&lt;/em&gt;&lt;/u&gt;:An open, vendor-neutral policy provides the flexibility and consistency that allows agencies to respond more quickly to changing business requirements.This policy allows the enterprise to choose from a variety of sources and select the most economical solution without impacting existing applications. It also supports implementation flexibility because technology components can be purchased from many vendors, insulating the enterprise from unexpected changes in vendor strategies and capabilities.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;&lt;em&gt;Principle&lt;/em&gt;&lt;/u&gt;: Scalability&lt;/span&gt;&lt;br /&gt;The underlying technology infrastructure and applications must be scalable in size, capacity, and functionality to meet changing business and technical requirements.&lt;br /&gt;&lt;u&gt;&lt;em&gt;Rationale&lt;/em&gt;&lt;/u&gt;:Reduces total cost of ownership by reducing the amount of application and platform changes needed to respond to increasing or decreasing demand on the system.Encourages reuse.Leverages the continuing decline in hardware costs&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;&lt;em&gt;Principle&lt;/em&gt;&lt;/u&gt;: Integrated reliability, availability, maintainability&lt;/span&gt;&lt;br /&gt;All systems, subsystems, and components must be designed with the inclusion of reliability and maintainability as an integral part. Systems must contain high-availability features commensurate with business availability needs. An assessment of business recovery requirements is mandatory when acquiring, developing, enhancing, or outsourcing systems. Based on that assessment, appropriate disaster recovery, and business continuity planning, design and testing must take place.&lt;br /&gt;&lt;u&gt;&lt;em&gt;Rationale&lt;/em&gt;&lt;/u&gt;:Business depends upon the availability of information and services. To assure this, reliability and availability must be designed in from the beginning; they cannot be added afterward. The ability to manage and maintain all service resources must also be included in the design to assure availability.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;em&gt;&lt;u&gt;Principle&lt;/u&gt;&lt;/em&gt;: Technological diversity is controlled&lt;/span&gt; to minimize the non-trivial cost of maintaining expertise in and connectivity between multiple processing environments.&lt;br /&gt;&lt;u&gt;&lt;em&gt;Rationale&lt;/em&gt;&lt;/u&gt;:There is a real, non-trivial cost of infrastructure required to support alternative technologies for processing environments. There are further infrastructure costs incurred to keep multiple processor constructs interconnected and maintained. Limiting the number of supported components will simplify maintainability and reduce costs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-448768571873751473?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/448768571873751473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=448768571873751473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/448768571873751473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/448768571873751473'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/02/architecture-principles.html' title='Architecture Principles'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-959387902554428528</id><published>2008-02-25T16:05:00.000+05:30</published><updated>2008-02-25T16:38:56.681+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servers'/><title type='text'>Tower Servers -&gt; Rack Servers -&gt; Blade Servers</title><content type='html'>The early servers were tower servers, so called because they were tall in height and took a lot of space and resulted in 'server-sprawl' in data-centers. The 90's saw the introduction of rack servers that were compact and saved a lot of 'real-estate' in the data-centers. A standard &lt;a href="http://en.wikipedia.org/wiki/19-inch_rack"&gt;rack &lt;/a&gt;is 19 inch wide and 1.75 inch high. This dimension is called 1U. So a server component may occupy 1U, 2U or 4 half-U. The most common computer rack form-factor being 42U high, this configuration allows for 42 servers to be mounted on a single rack. Each server has it own power supply and network and switch configuration.&lt;br /&gt;In the past few years, blade servers are gaining a lot of popularity. The advantage of blade servers is that instead of having a number of separate servers with their own power supplies, many blades are plugged into one chassis, like books in a bookshelf, containing processors, memory, hard drives and other components. The blades share the hardware, power and cooling supplied by the rack-mounted chassis -- saving energy and ultimately, money.&lt;br /&gt;Another advantage is that enterprises can buy what they need today, and plug in another blade when their processing needs increase, thus spreading the cost of capital equipment over time.&lt;br /&gt;&lt;br /&gt;In a rack server environment, typically 44% of the electricty consumption is by components such as power supplies and fans. In a blade server, that 44 percent is reduced to 10 percent because of the sharing of these components.This gives the blade server a tremendous advantage when it comes to electricity consumption and heat dissipation.&lt;br /&gt;&lt;br /&gt;The only current disadvantage of &lt;a href="http://en.wikipedia.org/wiki/Blade_server"&gt;blade &lt;/a&gt;servers is the vendor lock-in that comes in when you buy a blade environment and the system management software. In a rack system, it is possible to mix and match servers inside of a rack and across racks at will.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-959387902554428528?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/959387902554428528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=959387902554428528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/959387902554428528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/959387902554428528'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/02/tower-servers-rack-servers-blade.html' title='Tower Servers -&gt; Rack Servers -&gt; Blade Servers'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12669797.post-6810638220861986246</id><published>2008-02-22T18:35:00.000+05:30</published><updated>2008-02-22T18:50:19.905+05:30</updated><title type='text'>Are filters invoked when I do a RequestDispatcher.forward() ?</title><content type='html'>Before Servlet 2.4 specification, it was not clear whether filters should be invoked for forwarded requests, included requests and requests to the error page defined in &lt;error-page&gt;&lt;br /&gt;&lt;br /&gt;But in Servlet 2.4 specs, there is an extra element inside the filter mapping tag.&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;DispatcherFilter&amp;lt;/FILTER-NAME&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/products/*&amp;lt;/URL-PATTERN&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;Possible values are REQUEST, FORWARD, INCLUDE, and ERROR (Request is the default)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12669797-6810638220861986246?l=www.narendranaidu.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.narendranaidu.com/feeds/6810638220861986246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12669797&amp;postID=6810638220861986246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6810638220861986246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12669797/posts/default/6810638220861986246'/><link rel='alternate' type='text/html' href='http://www.narendranaidu.com/2008/02/are-filters-invoked-when-i-do.html' title='Are filters invoked when I do a RequestDispatcher.forward() ?'/><author><name>Naren</name><uri>http://www.blogger.com/profile/14883940950404721626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/5010/763/1600/Naren_Foto.jpg'/></author><thr:total>0</thr:total></entry></feed>
