<?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-7444586</id><updated>2011-04-21T11:50:47.086-07:00</updated><title type='text'>Log4Tech - Abhinav's notes</title><subtitle type='html'>Enterprise software, webservices, mobile aplications, programming and methodologies</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7444586.post-4745572154188114109</id><published>2007-05-10T23:41:00.000-07:00</published><updated>2007-05-11T00:07:11.568-07:00</updated><title type='text'>Bluetooth Remote Control</title><content type='html'>I have been looking for a Bluetooth Remote Control application that can be used to control the media player from the mobile. I watch a lot of movies on my laptop and it is really a pain to pause and control volume using the keyboard. Earlier I found very few applications, specifically none in open source.&lt;br /&gt;&lt;br /&gt;I found one good &lt;a href="http://www.jaylee.org/RemoteControl/"&gt;Remote Control in .NET by Jerome Laban&lt;/a&gt; although it is designed for the windows smartphone and did not work on my Pocket PC 2003. I also tried &lt;a href="http://www.bluetoothshareware.com/bluetooth_remote_control.asp"&gt;this one available in J2ME&lt;/a&gt;, but this is designed for Nokia and did not run on my phone's J2ME.&lt;br /&gt;&lt;br /&gt;Recently I have seen quite some activity on these kind of projects. &lt;a href="http://sourceforge.net/projects/blurc"&gt;blurc&lt;/a&gt; and &lt;a href="http://developer.berlios.de/projects/lbrc/"&gt;lbrc&lt;/a&gt; are open source projects for remote control of Linux. &lt;a href="http://bemused.sourceforge.net/"&gt;Bemused&lt;/a&gt; is another such project for controlling Media player from Symbian, also ported to J2ME. However, I am more interested in applications like &lt;a href="http://startofentry.blogdns.org/space/MobileControl"&gt;Mobile Control Suite&lt;/a&gt;, which can control other applications like PowerPoint. It is really cool to show a slideshow using a remote control.&lt;br /&gt;&lt;br /&gt;Finally the good news, I have also created an installer for the Remote Control in .NET which is a complete suite as well. Can't upload it using blogger, but I will contribute this back to Laban. Unfortunately Laban's code is not open source and I would really like an SDK that can be used to develop more plugins for other applications. Anyone interested in starting this open source ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-4745572154188114109?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/4745572154188114109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=4745572154188114109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/4745572154188114109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/4745572154188114109'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2007/05/bluetooth-remote-control.html' title='Bluetooth Remote Control'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-316682410343825560</id><published>2007-01-06T07:14:00.000-08:00</published><updated>2007-01-17T12:35:25.072-08:00</updated><title type='text'>Profiling tools for Java</title><content type='html'>When your web application developed some months ago, does not perform well or cannot support the number of users hammering at it, profiling is the way to go. Performance tuning is a difficult job and trying to solve it by looking at source code is like trying to throw sticks at a huge beast. So you choose the place to attack very carefully and thats what the profiling tools are designed for.&lt;br /&gt;&lt;br /&gt;Till sometime back, the commercial ones like &lt;a href="http://www.quest.com/jprobe/"&gt;JProbe&lt;/a&gt;, &lt;a href="http://www.borland.com/us/products/optimizeit/"&gt;OptimizeIt&lt;/a&gt; and &lt;a href="http://www.ej-technologies.com/products/jprofiler/overview.html"&gt;JProfiler&lt;/a&gt; were the only tools of choice, and the open source tools were limited to taking snapshots of Java heap and then looking at the numbers. But now you can save a lot by utilizing open source tools, and some of them even offer features not available in commercial tools. Recently I happened to review the various tools available for profiling a Java web application, and I started out with &lt;a href="http://www.manageability.org/blog/stuff/open-source-profilers-for-java"&gt;this big list&lt;/a&gt;. I have always liked the complete lists of open sources available at manageability, but the absence of any comparisons makes it difficult to use.&lt;br /&gt;&lt;br /&gt;First I shortened the list by cutting down the tools which did not have the following essential features -&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Easy to install and configure&lt;/li&gt;&lt;li&gt;No modification to existing code&lt;/li&gt;&lt;li&gt;Profile server side applications&lt;/li&gt;&lt;li&gt;Decent documentation&lt;/li&gt;&lt;li&gt;Visual representation of statistics&lt;/li&gt;&lt;li&gt;Active development&lt;/li&gt;&lt;li&gt;Dynamic statistics, and not snapshots&lt;/li&gt;&lt;/ul&gt;You might be able to work with some of the following missing, but I really wanted a tool which wouldn't make our developers throw their hands in frustration :) So this limited the choice to a handful which were reviewed.&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Tool&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Features&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Limitations&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://glassbox-inspector.dev.java.net/"&gt;Glassbox&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;No configuration required&lt;/li&gt;&lt;li&gt; Shows possible problem in the code, not statistics&lt;/li&gt;&lt;li&gt; Understands web frameworks like Struts&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Does not show possible memory leaks&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://oss.metaparadigm.com/jmemprof/"&gt;Jmemprof&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Shows detailed memory  statistics by class and method&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Runs very slowly with Sun JDK&lt;/li&gt;&lt;li&gt;No visualizations&lt;/li&gt;&lt;li&gt;GUI only shows statistics not clickable call graphs&lt;/li&gt;&lt;li&gt;No CPU statistics&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.experimentalstuff.com/sunr/projects/gcspy/index.html"&gt;GCSpy&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Shows various generations of objects&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Requires conceptual understanding of GC&lt;/li&gt;&lt;li&gt;Does not show statistics or visualization at source code level&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://eclipsecolorer.sourceforge.net/index_profiler.html"&gt;Eclipse Profiler&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;No configuration required &lt;/li&gt;&lt;li&gt; Shows graphs of memory &lt;/li&gt;&lt;li&gt; CPU statistics available to a good detail &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Memory profiling limited to showing heap memory usage&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://infrared.sourceforge.net/versions/latest/screenshots.html"&gt;InfraRED&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Shows bottlenecks in the code&lt;/li&gt;&lt;li&gt;Analyzes the application as layers and allows drill down to expensive pieces like views and queries&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;No visualizations&lt;/li&gt;&lt;li&gt;Does not profile memory&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;a href="http://ejp.sourceforge.net/"&gt;&lt;/a&gt;&lt;td&gt;&lt;a href="http://ejp.sourceforge.net/"&gt;EJP&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Simple to use&lt;/li&gt;&lt;li&gt;Ability to drill down within functions with timing&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;No support for memory profiling&lt;/li&gt;&lt;li&gt;No visualizations&lt;/li&gt;&lt;li&gt; Limited number of users &lt;/li&gt;&lt;li&gt; Does not seem to be under active development &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://profiler.netbeans.org/index.html"&gt;Netbeans Profiler&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Very nice visualizations &lt;/li&gt;&lt;li&gt; Profiling of memory as well as CPU &lt;/li&gt;&lt;li&gt; Step by step documentation with screenshots &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt; &lt;td&gt;&lt;ul&gt;&lt;li&gt;Works with NetBeans IDE only&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.eclipse.org/tptp"&gt;Eclipse TPT Platform&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Profiling of memory as well as CPU&lt;/li&gt;&lt;li&gt; Supports many servers&lt;/li&gt;&lt;li&gt; Good documentation&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Better visualizations are needed&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://java.sun.com/performance/jvmstat/"&gt;jvmstat&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Shows sizes of various generations of objects&lt;/li&gt;&lt;li&gt;Monitors garbage collection activity&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Requires understanding of garbage collector&lt;/li&gt;&lt;li&gt;Runs on J2SE 5.0 only&lt;/li&gt;&lt;li&gt;Not for detailed profiling at classes/method level&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The recommended tools for profiling are Eclipse TPT (Testing and Performance Tuning) Platform and Netbeans Profiler. Both these tools come close to commercial tools by providing features like memory and CPU profiling both, professional interfaces for drilling down to the problems, visualizations and helpful tutorials. jvmstat is the recommended tool for performance tuning of the JVM.&lt;br /&gt;&lt;br /&gt;Glassbox and InfraRED are great tools during application development since they pinpoint possible issues without any code on part of the developer and can point performance problems before the code reaches the QA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-316682410343825560?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/316682410343825560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=316682410343825560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/316682410343825560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/316682410343825560'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2007/01/profiling-tools-for-java.html' title='Profiling tools for Java'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-115386249188550491</id><published>2006-07-25T14:13:00.000-07:00</published><updated>2006-07-25T14:26:54.713-07:00</updated><title type='text'>Agile development</title><content type='html'>For a long time, I have been wanting to write a blog on development methodologies, but haven't done so because I usually write the blog when I am satisfied with my survey of all the recent developments in that area. But methodologies are endless research so here is a brief overview of Agile which will be updated soon.&lt;br /&gt;&lt;br /&gt;A brief overview first. Strictly speaking, Agile methods are not a methodology but a philosophy for modern application development. So there are specific methodologies like XP, Scrum, Crystal, Lean Development (from the Google article) which belong to the Agile class. It is absolutely true that most of our development happens that way and we should use Agile philosophy. As for RUP, it is a broad set of practices like use cases, iterations, documentation. Hence really speaking, RUP is a framework that can be fitted with many methodologies. For example, RUP can be used with XP (incidentally called dX - XP turned round on its head :)&lt;br /&gt;&lt;br /&gt;When it comes to choosing a methodology, it is easy to fall into the trap of mix-and-match. For example, many organizations claim to follow a variation of XP, but all they are doing is - following the part of XP which says developers may not question the requirements, but conveniently forgetting that XP strictly specifies that only developers may give the estimates for the work. For the same reason, if we are to really follow Agile, we need to watch for conflicts. Agile clearly says that it is heavily dependent on people rather than just process-oriented. So it does not think of people as resources but as individuals, each of which has its own strengths and weaknesses and it is no longer possible to think of developers as pluggable units. It also changes the process itself if people want that.&lt;br /&gt;&lt;br /&gt;I have also studied a bit on outsourcing using Agile methods. There are some big differences. First of all, usual Agile does not rely much on documentation but on close proximity between technical and business people. In outsourcing scenarios, this needs to be handled by more documentation. Practitioners believe that the amount of documentation should be "just enough", although this is determined only by experimentation across several projects. Secondly constant visits from both sides are necessary. Third is that business requirements should be written down at the client side and then test scenarios be written at the outsourcing side. Most important is that continous integration systems be in place, so that nightly builds can be taken any time the customer wants to see the current situation. I also believe that Agile methods have certain weaknesses, like lack of an integrated architecture, which can be well addressed by the software architecture artifact from RUP.&lt;br /&gt;&lt;br /&gt;My views are influenced by Martin Fowler (universally heralded for design patterns), Alastair Cockburn (of Crystal fame), XP proponets, RUP website and others. Some interesting links for further reading -&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://alistair.cockburn.us/index.php/Are_iterations_hazardous_to_your_project?"&gt;Misuse of Iterations&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://martinfowler.com/articles.html#id51843"&gt;Various articles on methodologies by Martin Fowler&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://www.informit.com/articles/article.asp?p=25929&amp;amp;rl=1"&gt;Internationally Agile &lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://www.agilexp.org/downloads/TheNewXP.pdf"&gt;The new XP&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-115386249188550491?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/115386249188550491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=115386249188550491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/115386249188550491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/115386249188550491'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2006/07/agile-development.html' title='Agile development'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-115359729016292064</id><published>2006-07-22T12:09:00.000-07:00</published><updated>2006-07-22T12:43:35.596-07:00</updated><title type='text'>Mp3 tagging through music fingerprints</title><content type='html'>I have a collection of few thousand mp3 files with unmeaningful names and tags. Sometimes I do try to rename the tags and filenames using iTunes, Windows Media Player or other editors but its just too huge a task to be completed, more so because the collection is increasing all the time. There is a huge number of tools for fixing, ranging from tools which can edit the tags, to tools which can write the tags using filenames. While learning Python, I wrote a small code to beautify the names, extending which is a Someday task in my GTD list :)&lt;br /&gt;&lt;br /&gt;It is too difficult to edit tags using iTunes, even with the functionality of editing multiple files simultaneously. I found this great open source tool &lt;a href="http://mp3bookhelper.sourceforge.net/"&gt;Mp3 book helper&lt;/a&gt;, which uses the good trick of exporting/importing tags and filenames to CSV files. It is much easier to edit the CSV files using Microsoft Excel, specially because of Macros and functions and then import the corrected file.&lt;br /&gt;&lt;br /&gt;However, often the filename and the tags are completely incorrect making it impossible to correct it without listening. I have always wondered if there could be a way to digitize the music patterns and look the tags into a database of music patterns. Today I was searching if there has been some work on it, and found to my suprise that there are many such systems already implemented.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://musicbrainz.org/"&gt;MusicBrainz&lt;/a&gt; is such a community which has such a database of music fingerprints and tags. It provides a freely downloadable tool called Picard that can search and correct the tags of your files by sending music fingerprints to MusicBrainz server, although highly manual and not automated. It uses music fingerprinting technology supplied by &lt;a href="http://www.musicdns.org/"&gt;MusicDNS&lt;/a&gt;, which has a database and client side APIs for collecting music fingerprints of various audio files and searching the database. The use of this API is completely free for non commercial purposes. A real act of benevolence I would say, attempting to bring some sort of an order into the huge amount of audio information !&lt;br /&gt;&lt;br /&gt;Looks like it can be classified as a Web 2.0 application...the elements are there all right. The database is unique and is constantly improved by users contributing music fingerprints and tags. Programming model is there too, only thing missing is a nifty user interface. It would be nice to write a service which constantly monitors your collection and automatically tags your files by running the MusicDNS api.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-115359729016292064?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/115359729016292064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=115359729016292064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/115359729016292064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/115359729016292064'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2006/07/mp3-tagging-through-music-fingerprints.html' title='Mp3 tagging through music fingerprints'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-115326442990633645</id><published>2006-07-18T14:54:00.000-07:00</published><updated>2006-08-26T10:42:02.243-07:00</updated><title type='text'>Web 2.0</title><content type='html'>Every client wants to enable Web 2.0 for their applications, and like &lt;a href="http://www.paulgraham.com/web20.html"&gt;Paul Graham&lt;/a&gt;, I initially disliked the term so much that upon its mention I used to immediately launch into a lengthy marketing talk about user experience, AJAX, collaboration and the semantic web. No wonder the term has been called &lt;a href="http://blogs.zdnet.com/ip-telephony/?p=805"&gt;marketing slogan&lt;/a&gt; and even &lt;a href="http://roughtype.com/archives/2005/10/the_amorality_o.php"&gt;amoral&lt;/a&gt;. Looks like there are still some folks out there in software who believe in honesty ! :)&lt;br /&gt;&lt;br /&gt;Finally I decided that enough was enough and at least I need to try to appreciate it from a business perspective if not technical.&lt;br /&gt;&lt;br /&gt;The term was popularized by O'Reilly Media and MediaLive International for a conference they hosted, the first Web 2.0 Conference in October 2004. Later on, an &lt;a href="http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html"&gt;article on oreilly.net &lt;/a&gt;clarified the meaning in detail. This article tries to differentiate between Web 2.0 applications like Wikipedia, Blogs, Google Adsense, Flickr and their Web 1.0 counterparts like Britannica Online, Websites, DoubleClick and Ofoto, and uses the differences to come up with Web 2.0 principles -&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Web as a platform - Software is provided as a scalable service. Examples are Google Search, Adsense, BitTorrent&lt;/li&gt;&lt;li&gt;Harnessing collective intelligence - Users are trusted to contribute to the collective material. Examples are Wikipedia, Amazon reviews, Flickr tagging, Blogs&lt;/li&gt;&lt;li&gt;Data as central - Application relies on a unique, hard to recreate repository of information that becomes more valuable as more users use it. Examples are Amazon, Imdb&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lightweight programming models - Programming models allow use of various platforms and integrate easily to form innovative applications. AJAX, REST web services, RSS are key components in this. Mashup is a good example of these put to work.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Software above the level of a single device - Devices can utilize the web to perform useful services. iTunes and TiVo are good examples.&lt;/li&gt;&lt;li&gt;Rich user experience - Gmail, Flickr&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Dion Hinchcliffe examines the &lt;a href="http://web2.wsj2.com/the_state_of_web_20.htm"&gt;current state of Web 2.0&lt;/a&gt; with a brave attempt at architecture of the web using people, machines and technologies. In a &lt;a href="http://web2.wsj2.com/the_best_web_20_software_of_2005.htm"&gt;seperate article&lt;/a&gt;, he also lists the applications best qualified to be called Web 2.0.&lt;br /&gt;&lt;br /&gt;After all that reading, I think I have at least a handle on the new web. I can't get rid of the feeling that technically, nothing has changed. AJAX means that now we can use Javascript safely and can get away with supporting a few browsers :) RSS has also been around for long. Web services have been there for a long time as well as as P2P. One thing that has really changed is the convergence of devices.&lt;br /&gt;&lt;br /&gt;However, it is definitely true that these technologies are being combined in ingenious ways to create new applications that allow users to access relevant information and collaborate more effectively. And if you would like to call it the emergence of Web 2.0 and it makes business sense, I am fine with that !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-115326442990633645?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/115326442990633645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=115326442990633645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/115326442990633645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/115326442990633645'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2006/07/web-20.html' title='Web 2.0'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-114498255023437764</id><published>2006-04-13T18:32:00.000-07:00</published><updated>2006-07-25T14:31:05.150-07:00</updated><title type='text'>Javascript glorified</title><content type='html'>Ever since Google brought back &lt;a href="http://www.crockford.com/javascript/survey.html"&gt;Javascript&lt;/a&gt; into fashion with Gmail, Google Suggest, Google Earth and My Google, everyone is swearing by AJAX. Even Microsoft has followed suit with Windows Live and MSN Virtual Earth. Someone at google saw beyond all the bad publicity of Javascript, although gurus like &lt;a href="http://www.crockford.com/javascript/javascript.html"&gt;Douglas Crockford &lt;/a&gt;have known its power for long.&lt;br /&gt;&lt;br /&gt;Inspite of its design flaws, Javascript is a very innovative programming language with the syntax of C and Java and the power of Scheme and Python.&lt;br /&gt;&lt;br /&gt;1. Javascript treats functions as first class objects, they may be passed to a function, be a member of an object, put inside a hashtable. They can even have arbitrary number of arguments and can also contain other functions.&lt;br /&gt;&lt;br /&gt;2. Javscript objects are dynamic. Its possible to add members and functions at runtime because the objects are essentially a collection of name value pairs.&lt;br /&gt;&lt;br /&gt;3. Javascript can be used for &lt;a href="http://www.crockford.com/javascript/inheritance.html"&gt;inheritance&lt;/a&gt; and &lt;a href="http://www.crockford.com/javascript/private.html"&gt;private members&lt;/a&gt;. Inheritance is implemented through the inherits function and private members through closures. Closure means that an inner function has access to variables and parameters of the outer function.&lt;br /&gt;&lt;br /&gt;4. Functional programming in javascript is possible through &lt;a href="http://www.svendtofte.com/code/curried_javascript/"&gt;currying&lt;/a&gt;, the technique of passing one function to another as argument. It also supports recursion.&lt;br /&gt;&lt;br /&gt;Javscript had been long renegated to the level of a toy language only suitable for showing annoying popups. With the modern browsers increasingly supporting the ECMAScript standard, and the support for XmlHttp object, it has emerged as a great way to build cross browser interactive applications.&lt;br /&gt;&lt;br /&gt;There are a large number of AJAX frameworks in almost every language used for web applications. These frameworks provide server side controls and Javascript libraries for easing the task of building AJAX based applications. There are also some great Javascript toolkits like &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt;, &lt;a href="http://mochikit.com/"&gt;MochiKit&lt;/a&gt;, &lt;a href="http://prototype.conio.net/"&gt;Prototype&lt;/a&gt;/&lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt; and the &lt;a href="http://developer.yahoo.com/yui/"&gt;Yahoo! UI Library&lt;/a&gt;. &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; is another toolkit which takes the novel approach of generating Javascript code from Java source written using the libraries provided.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Open source AJAX Frameworks in .NET&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.magicajax.net/"&gt;MagicAJAX.NET&lt;/a&gt; - Handles AJAX calls like postbacks and needs very little code.&lt;/li&gt;&lt;li&gt;&lt;a href="http://atlas.asp.net/docs/atlas/default.aspx"&gt;ATLAS&lt;/a&gt; - The official framework developed by Microsoft. Contains javascript libraries for UI components, AJAX calls and cross browser support.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.borgworx.net/"&gt;AJAX.Net&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Here is a &lt;a href="http://www.daniel-zeiss.de/AJAXComparison/Results.htm"&gt;nice comparison of many frameworks&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Open source AJAX Frameworks in Java&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a class="external text" title="http://ajaxtags.sourceforge.net/" href="http://ajaxtags.sourceforge.net/" rel="nofollow"&gt;The AJAX JSP Tag Library&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a class="external text" title="http://javawebparts.sourceforge.net" href="http://javawebparts.sourceforge.net/" rel="nofollow"&gt;Java Web Parts&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a class="external text" title="http://smirnov.org.ru/en/ajax-jsf.html" href="http://smirnov.org.ru/en/ajax-jsf.html" rel="nofollow"&gt;The AJAX-JSF&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://getahead.ltd.uk/dwr/"&gt;Direct Web Remoting (DWR)&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of course there are &lt;a href="http://ajaxpatterns.org/Java_Ajax_Frameworks"&gt;many more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;AJAX Frameworks in PHP&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.litfuel.net/mybic/"&gt;MyBic&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://saja.sourceforge.net/"&gt;SAJA&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://pear.php.net/package/HTML_AJAX"&gt;HtmlAJAX&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ruby on Rails also has an &lt;a href="http://rails.rubyonrails.com/classes/ActionView/Helpers/PrototypeHelper.html"&gt;AJAX extension&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As pointed out by &lt;a href="http://jroller.com/page/punchedcardtojavapeople"&gt;Kinshuk&lt;/a&gt;, Javascript needs to be treated with respect as far as debugging is concerned because of its dynamic nature and loose typing. There are some tools available for this like &lt;a href="http://www.jslint.com/lint.html"&gt;JSLint&lt;/a&gt; (you can think of it as checkstyle for Javscript), apart from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp"&gt;Microsoft Script Debugger&lt;/a&gt; for IE and &lt;a href="http://www.webreference.com/programming/javascript/venkman/"&gt;Venkman&lt;/a&gt; for Mozilla. Frameworks for &lt;a href="http://log4js.sourceforge.net/"&gt;logging&lt;/a&gt; and &lt;a href="http://www.edwardh.com/jsunit/"&gt;unit testing&lt;/a&gt; are already there. Maybe its time for an exclusive IDE for javascript.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-114498255023437764?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/114498255023437764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=114498255023437764' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/114498255023437764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/114498255023437764'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2006/04/javascript-glorified.html' title='Javascript glorified'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-114029451666941206</id><published>2006-02-18T12:17:00.000-08:00</published><updated>2006-03-12T20:47:52.093-08:00</updated><title type='text'>Stress free productivity</title><content type='html'>As &lt;a href="http://www.davidco.com/"&gt;David Allen&lt;/a&gt; describes in &lt;a href="http://www.amazon.com/gp/product/0142000280/102-7569228-7692967?v=glance&amp;n=283155"&gt;Getting Things Done&lt;/a&gt;, like most people I feel frustrated and bogged down by the great number of things that are on my mind. While working on an important project, the mind keeps reminding that your investment decisions are overdue, there is an important social event to attend, you need to make that important decision and so on.&lt;br /&gt;&lt;br /&gt;The book makes for interesting reading, but I have summarize the tricks in a short algorithm that would be easier to remember.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make a list of the projects you currently have. Everything that requires two or more actionable items should be considered a project. Highlight the very next physical action required to move the project forward.&lt;/li&gt;&lt;li&gt;Normally, you would have 50 to 100 projects. Divide the projects into several categories and group these into areas of responsibilities like Finance, Health etc. This way you can also track the time spent on various areas.&lt;/li&gt;&lt;li&gt;Make folders for each of the projects that contains reference material and other documents regarding the project.&lt;/li&gt;&lt;li&gt;Mark all your incoming stuff, ideas, things to do into following folders.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;a) Trash - No action required and not needed in future &lt;/p&gt;&lt;p&gt;b) Reference - No action required but may be needed as reference &lt;/p&gt;&lt;p&gt;c) Someday - No action required recently but in distant future &lt;/p&gt;&lt;p&gt;d) Followup - Action to be taken by someone else &lt;/p&gt;&lt;p&gt;e) Calendar - Scheduled at a particular time &lt;/p&gt;&lt;p&gt;f) Projects - Is a next action on some project&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Your calendar should be sacred and should contain only those items that must absolutely be done on that date or you do not need to do it at all. Moving tasks in the calendar to another day should not be done as far as possible.&lt;/li&gt;&lt;li&gt;Start your day by looking at your calendar and tackle the items. When you find free time between the items on your calendar, look at your projects list and select a next action depending on the time you have available.&lt;/li&gt;&lt;li&gt;Do a weekly review of your projects and next actions. Spend some time on the maintenance of your system.&lt;/li&gt;&lt;/ul&gt;You can buy this &lt;a href="http://www.davidco.com/store/catalog/Getting-Things-Done-Outlook-Add-In-by-Netcentrics-p-16156.php"&gt;Outlook plugin &lt;/a&gt;which helps implementing the methods.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-114029451666941206?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/114029451666941206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=114029451666941206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/114029451666941206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/114029451666941206'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2006/02/stress-free-productivity.html' title='Stress free productivity'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-113949370494065094</id><published>2006-02-09T05:22:00.000-08:00</published><updated>2006-02-09T06:01:44.980-08:00</updated><title type='text'>Back to the protocols</title><content type='html'>We do so much programming for the web applications and still rarely get a chance to understand how the basic protocols work. So when I was recently asked to provide some material on IP spoofing, I waded through &lt;a href="http://www.faqs.org/rfcs/rfc791.html"&gt;the specification &lt;/a&gt;after a long time.&lt;br /&gt;&lt;br /&gt;Since the handshake between client and server consists of passing the source address as well as the sequence number generated by the server, for a successful attack we need to send an initiating message and since we do not receive the answer from the server, we need to guess the sequence number generated by the server and send the correctly incremented number in our ack. We also need to disable the spoofed host through flooding or some other means. Here is an &lt;a href="http://examples.oreilly.com/networksa/tools/blind-spoof.html"&gt;excellent article with source code &lt;/a&gt;for this attack.&lt;br /&gt;&lt;br /&gt;When you are on the &lt;a href="http://www.tengu.be/files/IP-spoof1.txt"&gt;same local network as the host &lt;/a&gt;whose identity you are trying to assume, the attack is much easier because IP packets are available to you.&lt;br /&gt;&lt;br /&gt;Here is a much referenced paper on &lt;a href="http://citeseer.ist.psu.edu/rd/72726122%2C43037%2C1%2C0.25%2CDownload/http://citeseer.ist.psu.edu/cache/papers/cs/5603/http:zSzzSzwww.ja.netzSzCERTzSzJANET-CERTzSz..zSzBellovinzSzTCP-IP_Security_Problems.pdf/bellovin89security.pdf"&gt;TCP/IP security problems by Bellovin&lt;/a&gt; including attack through routing protocols, ICMP and other application level protocols.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-113949370494065094?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/113949370494065094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=113949370494065094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/113949370494065094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/113949370494065094'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2006/02/back-to-protocols.html' title='Back to the protocols'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-113918211922365618</id><published>2006-02-05T14:31:00.000-08:00</published><updated>2006-02-05T15:32:16.100-08:00</updated><title type='text'>O2 Adventures</title><content type='html'>Not having blogged for a long time does make you lazy. This blog started as a journal of the interesting problems that I came across, and as a reference in case I need to work upon the problem again. Yesterday I was doing all the research again to upgrade the firmware of my O2 XDA II Mini which I did some months before, so I decided to be more diligent this time.&lt;br /&gt;&lt;br /&gt;O2 XDA II Mini has been one of the most popular smartphones, mostly because it is a full blown Pocket PC Phone with almost the size of a regular mobile. In fact, this was one of the main reasons that made me decide in its favor instead of its smaller cousin, the Windows Mobile for smartphones. It boasts of a 416 MHz processor with a lot of applications including the Midlet manager for J2ME applications.&lt;br /&gt;&lt;br /&gt;However, the support for this phone leaves a lot to be desired. One of the reasons could be that this phone is manufactured by a lesser known company called HTC from Taiwan and resold as O2 XDA, iMate JAM and many other names. HTC also has &lt;a href="http://en.wikipedia.org/wiki/O2_xda"&gt;many other models &lt;/a&gt;which are sold by different names and this is the key for being able to find useful links. Fortunately, there is a &lt;a href="http://forum.xda-developers.com/front_page.php"&gt;forum of excellent people &lt;/a&gt;have who reverse engineered the XDA devices down to the &lt;a href="http://buzzdev.net/component/option,com_remository/Itemid,100/func,select/id,45/"&gt;ROM upgrades&lt;/a&gt; and other software. Here is how to &lt;a href="http://members.iinet.net.au/~apmoon/ppc/cf/Snow_Fix_ampda.CAB"&gt;improve the camera settings &lt;/a&gt;, which was very irritating because 1.3 MP camera is supposed to be good !&lt;br /&gt;&lt;br /&gt;Few months back I took the plunge of ROM upgrade, mostly because I was blinded with the desire for &lt;a href="http://www.microsoft.com/windowsmobile/press/imagegallery/look.mspx"&gt;Windows Mobile 5.0&lt;/a&gt;. My device runs Windows Mobile 2003 and the new version offers much more usability without sorting to the stylus and more advanced office applications. It also has a &lt;a href="http://msdn.microsoft.com/mobility/windowsmobile/howto/windowsmobile5/api/default.aspx"&gt;large number of managed APIs &lt;/a&gt;for Graphics, GPS, Telephony which would be useful for certain personal productivity applications I wanted to work upon.&lt;br /&gt;&lt;br /&gt;I tried to upgrade my Mini without noticing that the ROM was meant for Himalaya or the XDA II. Not having even the &lt;a href="http://members.iinet.net.au/~apmoon/ppc/bs/ampda_How_To_PPC_Upgrades_V1.pdf"&gt;ROM backup&lt;/a&gt;, I ended up losing all data but fortunately got &lt;a href="http://www.seeo2.com"&gt;the original ROM for O2 &lt;/a&gt;after registering with the IMEI number of the device. For some of the XDA devices, the &lt;a href="http://www.my-xda.com/"&gt;official ROM upgrades &lt;/a&gt;are available. The &lt;a href="http://www.clubimate.com/"&gt;iMATE also has a site &lt;/a&gt;on which o2 users cannot register, but if you know the precise link, it may be possible to get hold of the downloads. In fact, I managed to download the manual for setting up wireless modem from here.&lt;br /&gt;&lt;br /&gt;The end result has been disappointing, it seems there is an announcement from O2 that there will be no update released to Windows Mobile 5.0 for existing devices. &lt;a href="http://blogs.msdn.com/windowsmobile/archive/2005/10/06/477999.aspx"&gt;Mike calligaro tries to explain&lt;/a&gt; the reasons for this. Of course the existing device owners are bound to feel cheated, firstly because some devices have released updates and so the xda developers would be the place to watch :)&lt;br /&gt;&lt;br /&gt;Some other useful applications for the Pocket PC, free of course :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tcpmp.corecodec.org/about"&gt;Pocket Media Player&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pocketgear.com/software_detail.asp?id=13778"&gt;Agile Messenger (Free version)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://buzzdev.net/component/option,com_remository/Itemid,100/func,select/id,33/"&gt;Networking Utilities&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/technet/prodtechnol/wce/downloads/ppctoys.mspx"&gt;Powertoys from Microsoft&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-113918211922365618?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/113918211922365618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=113918211922365618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/113918211922365618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/113918211922365618'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2006/02/o2-adventures.html' title='O2 Adventures'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-111360576778731376</id><published>2005-04-15T14:29:00.000-07:00</published><updated>2006-04-13T18:32:19.656-07:00</updated><title type='text'>Season of Spring</title><content type='html'>Going by the amount of open source projects I have recently seen rallying around Spring, it seems to have largely overshadowed EJB 3.0. JBoss 4.0 provides a plugin for EJB 3.0 and Oracle has also released a preview of Oracle Application Server EJB 3.0. But the EJB needs a major overhaul to address the growing realization that EJBs are not the key to a scalable and high performance architecture. Here is an excellent critique of EJB 3.0. Spring container can be plugged with all the components required for building scalable web applications.&lt;br /&gt;&lt;br /&gt;You get to choose a whole lot of MVC frameworks in Spring. By using the dependency injection, Spring allows the web application context to be automatically supplied with business delegates instead of having to look them up. Spring has its own MVC component, can inject Struts actions with beans through Struts with Spring, and can also Webwork2 actions. There is a two way integration with JSF (Java Server Faces), that makes Spring beans available to JSF beans and integrates JSF beans into Spring.&lt;br /&gt;&lt;br /&gt;View technologies - Because views in Spring are completely seperated from MVC layer, it is possible to use XSLT, JasperReports and Tiles as view components, apart from velocity and JSP. See here for pointers on integrating Cocoon as view.&lt;br /&gt;&lt;br /&gt;Persistence - Spring can use Hibernate, iBATIS and JDO as its persistence mechanism and provides a common API for exception wrapping, transactions and resource management.&lt;br /&gt;&lt;br /&gt;Security - Acegi framework also has ACL-based security apart from role-based security. Role-based security in J2EE containers frequently proves insufficient and has to be enhanced programmatically by using adhoc solutions. Using Yale University's open source Central Authentication Service (CAS), the Acegi Security System for Spring can participate in an enterprise-wide single sign on environment.&lt;br /&gt;&lt;br /&gt;To get started, you can use Appfuse, which is a fully integrated template application with many frameworks to jumpstart your development. It provides templates for various combinations of hibernate, tapestry, jsf and can even generate simple forms using appgen. Going by the amount of effort that has gone into the development of web application frameworks in Java, I am always frustrated by the amount of work required to develop even simple applications and Appfuse is really refreshing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-111360576778731376?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/111360576778731376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/111360576778731376'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2005/04/season-of-spring.html' title='Season of Spring'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-110079678846224166</id><published>2004-11-18T08:53:00.000-08:00</published><updated>2004-11-18T10:02:18.130-08:00</updated><title type='text'>Audio Conference</title><content type='html'>You would never think that voice conference over internet was so big a deal ! Till I saw so many questions on the newsgroups asking for source code and others scolding them for being beggars. &lt;a href="http://www.catb.org/~esr/faqs/smart-questions.html"&gt;Eric Raymond&lt;/a&gt; wouldn't be too pleased I guess :)&lt;br /&gt;&lt;br /&gt;A little bit of theory is in order. Audio and video transmission takes place using a protocol called RTP (&lt;a href="http://www.faqs.org/rfcs/rfc1889.html"&gt;Real-time Transport Protocol&lt;/a&gt;). It usually runs over UDP but it is possible to run RTP over connection-oriented protocols also. You need another protocol to manage the semantics of the conference, for example call signalling and control. &lt;a href="http://www.openh323.org/standards.html"&gt;H.323&lt;/a&gt; is one of the earlier suite of protocols for this purpose. SIP, the &lt;a href="http://www.cs.columbia.edu/sip/drafts.html"&gt;Session Initiation Protocol&lt;/a&gt;, is another suite for Internet conferencing and telephony. Thus, voice conference clients can communicate with each other using IP addresses, or using multicast addresses. But client IP addresses are not known behind NATs and many routers have multicasting disabled.&lt;br /&gt;&lt;br /&gt;NAT (&lt;a href="http://www.faqs.org/rfcs/rfc1631.html"&gt;Network address translation&lt;/a&gt;) is the translation of private IP addresses by routers. A NAT translates a private address of an internal host like 192.168.1.30/4000 to the IP address of the router and some randomly chosen port before sending a packet to the outside world. When the response from the outside world comes back, the router uses the mapping to deliver the packet to the correct internal host.&lt;br /&gt;&lt;br /&gt;Being a lazy programmer and because of my assumption that any self respecting programmer could do this project in a couple of days, I &lt;a href="http://www.google.co.in/search?q=audio+conference+source+code&amp;btnG=Search&amp;amp;hl=en"&gt;googled&lt;/a&gt; for audio conferences. Surprisingly, most of the ones that I found rely on static IP addresses or multicasting enabled routers between the conference clients. Here is the list of the audio conferences I found.&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://www.jaytee.se/download/JusTalk2_BETA_095_20030209.zip"&gt;JusTalk2&lt;/a&gt; - Implemented using server and client model. Source code unavailable.&lt;br /&gt;2. &lt;a href="http://www.conferencexp.net/community/default.aspx"&gt;ConferenceXP&lt;/a&gt; - Microsoft research project. Requires multicasting enabled. The best part is that it contains an implementation of RTP in .NET.&lt;br /&gt;3. &lt;a href="http://www.openh323.org/"&gt;OpenH323&lt;/a&gt; - An implementation of H323 server and client. Requires multicasting.&lt;br /&gt;4. &lt;a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&amp;f=45&amp;amp;t=001727"&gt;Jose Botella's code on javaranch &lt;/a&gt;- JMF implementation of peer communication. Requires static IPs.&lt;br /&gt;5. &lt;a href="http://jxcube.jxta.org/"&gt;JXCube&lt;/a&gt; - Implemented over JXTA p2p stack. Haven't got it running yet.&lt;br /&gt;6. &lt;a href="http://sourceforge.net/projects/openmash"&gt;OpenMash&lt;/a&gt; - The popular vic and vat tools which require multicasting. The &lt;a href="http://www.isi.edu/div7/yoid/releases/index.html"&gt;yoid project&lt;/a&gt; has a version that uses multicast simulation using a server, but I have not experimented with it.&lt;br /&gt;7. &lt;a href="http://www.speakfreely.org/"&gt;SpeakFreely&lt;/a&gt; - Works for static IPs only.&lt;br /&gt;8. &lt;a href="http://www.divmod.org/Home/Projects/Shtoom/index.html"&gt;Shtoom&lt;/a&gt; - Python implementation of VOIP and a good critique of the H323 protocol.&lt;br /&gt;9. &lt;a href="http://research.edm.luc.ac.be/jori/jrtplib/jrtplib.html"&gt;JRTPLib&lt;/a&gt; - C++ implementation of RTP protocol.&lt;br /&gt;10. &lt;a href="http://www-sop.inria.fr/rodeo/fphone/obtain.html"&gt;Freephone&lt;/a&gt; developed at INRIA - Uses unicast for one-to-one and multicast for conferences.&lt;br /&gt;11. &lt;a href="http://www.sys-con.com/story/?storyid=45832&amp;amp;DE=1"&gt;Web conferencing over HTTP&lt;/a&gt; by Pramod and Yayati - Uses HTTP files upload and download for communication between clients. Seems like a weird idea, but it works !&lt;br /&gt;12. &lt;a href="http://www.codeproject.com/internet/voicechat2.asp"&gt;Voice Chat using client server&lt;/a&gt; on Codeproject - VC++ implementation using client server architecture. Messy code, but you can get it to work over internet.&lt;br /&gt;&lt;br /&gt;I thought about the problem of communicating behind NAT and came up with the obvious solution - a server that acts as an &lt;a href="http://www.mindcontrol.org/~hplus/nat-punch.html"&gt;introducer&lt;/a&gt;. All clients connect to the server, and reveal their translated IP. The server distributes these translated IPs to all the clients. Now the clients send packets to each other using these translated IPs and in the process make entries in their respective NAT tables. Initially some packets will be dropped, but finally NAT routers will forward packets from the other client.&lt;br /&gt;&lt;br /&gt;There a complete site devoted to the problem of &lt;a href="http://midcom-p2p.sourceforge.net/"&gt;communicating over middleboxes&lt;/a&gt;. In the process, I read this excellent RFC which describes &lt;a href="http://www.brynosaurus.com/pub/net/draft-ford-midcom-p2p-03.txt"&gt;various types of NAT&lt;/a&gt;. There are some other specifications in progress to solve this problem. STUN (&lt;a href="http://www.ietf.org/rfc/rfc3489.txt"&gt;Simple Traversal of UDP through Network address translators&lt;/a&gt;) is a protocol devised to discover the type of NAT. IETF has also proposed a &lt;a href="http://www.ietf.org/rfc/rfc3303.txt"&gt;framework for middlebox &lt;/a&gt;communication.&lt;br /&gt;&lt;br /&gt;However, to take no chances, I implemented the server as a dumb packet forwarder. The server knows the clients translated IP addresses. Every client communicates the names of clients to send the packets to, and the server forwards any packet received from that client to all the clients specified. Using this server, I was able to talk with my friend Aditya in Geneva, and also had a 3-way conference. Please note that this simple forwarder is useful for a conference with few people, but the bandwidth requirement increases by n*n. Hence some kind of mixing needs to be implemented in the next version of server. Do let me know if there already exists one :)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-110079678846224166?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/110079678846224166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=110079678846224166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/110079678846224166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/110079678846224166'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/11/audio-conference.html' title='Audio Conference'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-109882890547546311</id><published>2004-10-26T13:16:00.000-07:00</published><updated>2004-10-27T04:24:02.906-07:00</updated><title type='text'>XML Everywhere</title><content type='html'>With a renewed interest in rich clients and the popularity of XML, it is no surprise that so many engines for building user interfaces using XML are available. &lt;a href="http://jakarta.apache.org/commons/jelly/libs/swing/"&gt;JellySwing&lt;/a&gt; has been around for quite some time which allows declaring Swing UIs using XML. It is implemented as a tag library for apache project, Jelly.&lt;br /&gt;&lt;br /&gt;Creating a user interface using XML actually represents a convergence of two good ideas -&lt;br /&gt;1. Seperation of the view and model - The presentation layer is cleanly seperated from the application logic.&lt;br /&gt;2. Cross platform GUI - The GUI can run on any platform and device as long as the GUI engine is present.&lt;br /&gt;&lt;br /&gt;The problem now is to have a specification that is implemented by a lot of engines running on many different platforms, just like the ubiquitous browser. Microsoft promised to bring &lt;a href="http://www.xaml.net/"&gt;XAML&lt;/a&gt; (XML Application Markup Language) but due to a juggling of internal resources, XAML, and its parent, Longhorn, have been pushed to a release date sometime after 2006.&lt;br /&gt;&lt;br /&gt;Meanwhile one of the alternatives is &lt;a href="http://www.xulplanet.com/tutorials/xultu/"&gt;XUL&lt;/a&gt;, spearheaded by the Mozilla. It already boasts of a few implemented engines, which is a big advantage. &lt;a href="http://luxor-xul.sourceforge.net/"&gt;Luxor&lt;/a&gt; is an implementation of XUL which uses Python for implementing script actions. &lt;a href="http://www.swixml.org/"&gt;SwiXML&lt;/a&gt; uses XUL to create Swing applications and applets. &lt;a href="http://www.myxaml.com/"&gt;MyXaml&lt;/a&gt; is a XUL engine for building .NET applications. Codeproject shows &lt;a href="http://www.codeproject.com/cs/miscctrl/xmlGuiGenerator.asp"&gt;an example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.w3.org/TR/xforms/"&gt;XForms specification&lt;/a&gt;, which is now a W3C recommendation is also projected as a method for building device independent user interfaces using XML. It has a lot of implementations but it is designed for creating web applications rather than smart clients. Hence it has fewer user controls which can only be used to build simple clients. XForms places more emphasis on submitting XML data from the forms instead of the HTTP name and value pairs.&lt;br /&gt;&lt;br /&gt;Flash is also a good choice for creating rich clients since it is supported on large number of browsers. You can even write Flash clients using the Macromedia XML. &lt;a href="http://www.macromedia.com/software/flex/productinfo/brz_overview/"&gt;The Flex engine&lt;/a&gt; used by Macromedia is available for the J2EE platform and a .NET version will be released in the near future.&lt;br /&gt;&lt;br /&gt;Serverside reports that the &lt;a href="http://www.laszlosystems.com/"&gt;Laszlo Presentation Server&lt;/a&gt; has been open sourced. This is &lt;a href="http://www.richinternetapps.com/archives/000074.html"&gt;another platform&lt;/a&gt; for delivering SWF files targeted for the Flash player. &lt;a href="http://www.laszlosystems.com/lps/laszlo-in-ten-minutes/"&gt;Laszlo applications&lt;/a&gt; are written in LZX, a standards-driven XML and JavaScript description language. (The thing to remember is that the rich clients in Flash/LZX do not have the full power of a client application)&lt;br /&gt;&lt;br /&gt;There are many engines with their own XML specification for creating UIs.  &lt;a href="http://java-source.net/open-source/xml-user-interface-toolkits"&gt;javasource.net has a list&lt;/a&gt; of these implementations. &lt;a href="http://jgb.sourceforge.net/index.php"&gt;Java Gui builder&lt;/a&gt; , &lt;a href="http://www.jeasy.de/"&gt;JEasy&lt;/a&gt;, &lt;a href="http://www.jaxfront.com/pages/demo.html"&gt;JAXFront&lt;/a&gt; are some more Java engines I found through googling. Here is &lt;a href="http://msdn.microsoft.com/msdnmag/issues/02/11/NETGUIBliss/"&gt;an article&lt;/a&gt; that shows how to develop an XML-based GUI language parser for .NET.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-109882890547546311?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/109882890547546311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=109882890547546311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/109882890547546311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/109882890547546311'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/10/xml-everywhere.html' title='XML Everywhere'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-109093651957464743</id><published>2004-07-27T05:02:00.000-07:00</published><updated>2004-07-27T06:55:19.573-07:00</updated><title type='text'>Self extracting installer in Perl</title><content type='html'>Self-extracting installation is a great feature of windows applications. Clicking on a Setup.exe extracts all files and starts the configuration of the application. No unzipping, no README. I wanted to use the same approach for packaging a PHP-based web application meant for Apache running on a Linux box.&lt;br /&gt; &lt;br /&gt; Perl seemed a good choice as platform for the installer because of its compact syntax,  multiple platform support and huge number of libraries. The basic idea is very simple - Append a perl script with the zipped archive. This perl script reads itself and extracts the zipped archive, unzips and calls the configuration script. The problem is how to append the zipped archive and still not confuse the interpreter. The trick of using &lt;a href="http://www.perl.com/lpt/a/2002/08/13/comment.html"&gt;multiline comments in Perl&lt;/a&gt; can do the job.&lt;br /&gt; &lt;br /&gt; Still reading on OOPS in Perl starting with this &lt;a href="http://www.pconline.com/~erc/perlmod.htm"&gt;handy introduction&lt;/a&gt; but the basic Perl script is as follows : &lt;br /&gt; &lt;br /&gt; use Shell;&lt;br /&gt; &lt;br /&gt; # Change these values for your desired installation&lt;br /&gt; # Parameter 1 - Name of this file&lt;br /&gt; # Parameter 2 - Name of temporary file&lt;br /&gt; # Parameter 2 - Size of the zip file to be appended to script (in bytes)&lt;br /&gt; # Parameter 3 - OS Command for unzip&lt;br /&gt; # Parameter 4 - OS Command to run the configuration script&lt;br /&gt; &lt;br /&gt; install("setup.pl", "temp.zip", 200048, "unzip temp.zip -d /usr/local/", "perl /usr/local/configure.pl");&lt;br /&gt; &lt;br /&gt; sub install {&lt;br /&gt;     my $SETUP = $_[0];&lt;br /&gt;     my $TEMP = $_[1];&lt;br /&gt;     my $ZIP_SIZE = $_[2];&lt;br /&gt;     my $UNZIP_CMD = $_[3];&lt;br /&gt;     my $CONFIGURE_CMD = $_[4];&lt;br /&gt; &lt;br /&gt;     open(PROG, $SETUP) or die "Could not open file : " + $!;&lt;br /&gt;     binmode(PROG);&lt;br /&gt;     seek(PROG, -$ZIP_SIZE, 2);&lt;br /&gt;     &lt;br /&gt;     open(BINFILE, "&gt;$TEMP") or die "Could not open file : " + $!;&lt;br /&gt;     binmode(BINFILE);&lt;br /&gt;     while (read(PROG, $buff, 65536))&lt;br /&gt;     {&lt;br /&gt;         print BINFILE $buff;&lt;br /&gt;     }&lt;br /&gt; &lt;br /&gt;     close(PROG) or die "Could not close file : ";&lt;br /&gt;     close(BINFILE) or die "Could not close file :";&lt;br /&gt; &lt;br /&gt;     print "Extraction complete\n";&lt;br /&gt;     &lt;br /&gt;     system($UNZIP_CMD);&lt;br /&gt;     system($CONFIGURE_CMD);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; # Force the interpreter to think of the binary file as comment.&lt;br /&gt; =for comment&lt;br /&gt; &lt;br /&gt; For using the script, you need to modify the size of the zipped archive, the unzipping command and the configuration command. Concatenate the zipped archive to the modified script and you are ready to run the setup using the command : perl -w setup.pl&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-109093651957464743?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/109093651957464743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=109093651957464743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/109093651957464743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/109093651957464743'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/07/self-extracting-installer-in-perl.html' title='Self extracting installer in Perl'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-108963215597036353</id><published>2004-07-12T03:38:00.000-07:00</published><updated>2006-04-13T18:28:35.936-07:00</updated><title type='text'>IoC Containers</title><content type='html'>Last week I was working on a .NET application needing a very pluggable architecture. To ensure extensibility, the application was factored into components. It is obvious that most components required some basic services like lifecycle management, configuration, contextualization and composition. Thus began my search for an IoC (Inversion of Control) container in .NET. &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;Martin Fowler explains&lt;/a&gt; it very well.&lt;br /&gt;&lt;br /&gt;There has been considerable interest in light-weight containers in the Java world for providing these services wich has resulted in projects like &lt;a href="http://avalon.apache.org/"&gt;Avalon/Merlin&lt;/a&gt;, &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; and &lt;a href="http://www.picocontainer.org/"&gt;PicoContainer&lt;/a&gt;. Of course, their heavier counterparts, J2EE application servers are only too well-known. These containers differ from the application servers in many respects. One is, they just provide a microkernel for managing the components. The application servers provide a much larger set of services to the EJBs including security, transactions, connection pooling, message queues and schedulers. There are almost no restrictions on the components being managed by the container and no hard contracts to fulfill.&lt;br /&gt;&lt;br /&gt;While application servers provide their services to the contained EJBs using descriptors, these containers explicitly handover the service providing component to the user component. There is a difference in the lookup pattern also. While the J2EE containers use the ServiceLocator pattern (JNDI) to find other components, these containers use some variation of IoC or dependency injection - Constructor injection(PicoContainer), Setter injection(Spring) or Interface injection(Avalon).&lt;br /&gt;&lt;br /&gt;These containers also provide features which are not part of the J2EE framework. For example, Spring provides a framework for &lt;a href="http://www.springframework.org/docs/reference/aop.html"&gt;aspect-oriented programming&lt;/a&gt;. Avalon provides components on the &lt;a href="http://avalon.apache.org/planet/components/index.html"&gt;avalon planet&lt;/a&gt; for thread pool, scheduler and datasources thus allowing the use of different implementations of these services. If you are working on the J2EE platform, &lt;a href="http://jakarta.apache.org/hivemind/"&gt;HiveMind&lt;/a&gt; is a good bet. It is an IoC container that can be deployed on a J2EE application server. Thus you have access to a simple container with the full power of J2EE.&lt;br /&gt;&lt;br /&gt;As for my search, I found that &lt;a href="http://www.picocontainer.org/Home"&gt;PicoContainer.NET&lt;/a&gt; is the only option at the moment. &lt;a href="http://www.springframework.net/"&gt;Spring.NET&lt;/a&gt; is in planning stages. Avalon is also being ported as &lt;a href="http://avalon.apache.org/central/laboratory/castle/index.html"&gt;Castle&lt;/a&gt; but has not been released.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-108963215597036353?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/108963215597036353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=108963215597036353' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108963215597036353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108963215597036353'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/07/ioc-containers.html' title='IoC Containers'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-108877649947985792</id><published>2004-07-02T06:37:00.000-07:00</published><updated>2004-07-02T06:54:59.480-07:00</updated><title type='text'>Return of the template</title><content type='html'>The good old templates are now available both in Java and  C# by the name Generics. C++ programmers have long used templates to provide compile time safety for data structures which are collections of objects. Templates or Generics, as they will be now known, save the burden of casting the object back to the appropriate type for the programmer and avoid the penalty of runtime type checking for the virtual machine.&lt;br /&gt;&lt;br /&gt;There is a brief introduction of the Generics implementation in the &lt;a href="http://java.sun.com/developer/technicalArticles/releases/j2se15langfeat/"&gt;new features in the J2SE 1.5 release&lt;/a&gt;, code named Tiger on java.sun.com. &lt;a href="http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf"&gt;This tutorial&lt;/a&gt; offers a more complete explanation of the Generics feature. With features like boxing, metadata, foreach loop and typesafe enumerations, it is now even more closer to C#.&lt;br /&gt;&lt;br /&gt;Microsoft has announced the &lt;a href="http://lab.msdn.microsoft.com/vs2005/"&gt;beta release of Visual Studio 2005&lt;/a&gt;, code named Whidbey which implements the &lt;a href="http://download.microsoft.com/download/8/1/6/81682478-4018-48fe-9e5e-f87a44af3db9/SpecificationVer2.doc"&gt;C# 2.0 specification&lt;/a&gt;. This document on &lt;a href="http://www.informit.com/content/images/0321154916/samplechapter/hejlsbergch19.pdf"&gt; C# 2.0 features&lt;/a&gt; on informit.com explains the Generics implementation. C# 2.0 now also provides a template like &lt;a href="http://weblogs.asp.net/ericgu/archive/2004/05/27/143221.aspx"&gt;syntax for implementing nullable types &lt;/a&gt; which has been a requirement for long and even has an &lt;a href="http://nullabletypes.sourceforge.net/"&gt;open source project&lt;/a&gt; dedicated to implementing nullable types.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-108877649947985792?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/108877649947985792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=108877649947985792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108877649947985792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108877649947985792'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/07/return-of-template.html' title='Return of the template'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-108867545974049915</id><published>2004-07-01T02:36:00.000-07:00</published><updated>2004-07-01T02:50:59.740-07:00</updated><title type='text'>Driving Underground with Lucky Ali</title><content type='html'>Listening to rap music like Out of control by Rancid, while racing a car at speeds over 250 km/hr can be quite strenous. So last night, I and my friend &lt;a href="http://sankums.blogspot.com"&gt;Sanjeev&lt;/a&gt; set out to change the soundtracks bundled with &lt;a href="http://www.eagames.com/official/nfs/underground/us/"&gt;Need For Speed Underground&lt;/a&gt;. EA Games stores all the 27 tracks in the directory SNDSTREAMS as an AST format file. After a little Googling and reading lots of posts from NFS fans, we stumbled on this &lt;a href="http://homepage.ntlworld.com/dinouk/Publish2/html/downloads.html"&gt;excellent repository&lt;/a&gt; of NFS Underground software.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://homepage.ntlworld.com/dinouk/Publish2/astimp.zip"&gt;NFS Music Importer by Arushan&lt;/a&gt; works really well. The zipped archive comes bundled with a little tool from EA itself which imports MP3 files into ASF format. Then the music importer can flawlessly burn these soundtracks into the AST file. A minor glitch - you cannot change the number of tracks and only overwrite an existing track. But the soothing track of Kitni Haseen Jindagi Hai - Lucky Ali while racing a car is something not to be missed :) Please take a backup of the original AST, if you have not grown too old for rap.&lt;br /&gt;&lt;br /&gt;This repository also has an &lt;a href="http://homepage.ntlworld.com/dinouk/Publish2/nfsu_lan.1.0.1.zip"&gt;NFS server for windows/linux&lt;/a&gt; and a &lt;a href="http://homepage.ntlworld.com/dinouk/Publish2/no_intro.zip"&gt;cool patch which replaces the introductory movies&lt;/a&gt;, so that you get to the action faster. I have not read the EA license, but I cannot see them going gaga over this :) Please do read it before you face any damages. And finally, remember the EA advice - Leave the racing for the track. Drive safely.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-108867545974049915?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/108867545974049915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=108867545974049915' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108867545974049915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108867545974049915'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/07/driving-underground-with-lucky-ali.html' title='Driving Underground with Lucky Ali'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-108851624742242362</id><published>2004-06-29T04:56:00.000-07:00</published><updated>2004-06-29T06:43:14.396-07:00</updated><title type='text'>Java on the desktop</title><content type='html'>Sun is back into the desktop war. First you have the Java Desktop System 2 for Solaris and SuSE Linux 8.1 ($50 per employee per year for unlimited seats) with lots of firepower - Star Office, Sun Java Studio and a host of configuration tools bundled. I have not tried installing it, but you have the usual raves and rants with &lt;b&gt;the Jem report by Valour &lt;/b&gt; which wishes &lt;a href="http://www.thejemreport.com/modules.php?op=modload&amp;name=News&amp;file=article&amp;sid=127"&gt; only if it actually worked &lt;/a&gt; and the &lt;b&gt; Newsforge review by Chris &lt;/b&gt; which claims it to be the &lt;a href="http://www.newsforge.com/os/03/09/18/003212.shtml?tid=23"&gt;most polished and real-world user-ready Linux desktop &lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;With the future releases of the Java Desktop System, Sun is also bringing 3D windowing capabilities to the desktop to offer a far richer user experience. Here are &lt;a href="http://wwws.sun.com/software/looking_glass/details.html"&gt; some cool snaps&lt;/a&gt; or a &lt;a href="http://wwws.sun.com/software/looking_glass/demo.html"&gt;live demo&lt;/a&gt; if you have the bandwidth. This is very, very cool !&lt;br /&gt;&lt;br /&gt;&lt;a href="https://jdic.dev.java.net/"&gt;Java Desktop Integration Components&lt;/a&gt; project provides Java applications with access to facilities provided by the native desktop such as the mailer, the browser, and registered document viewing applications.&lt;br /&gt;&lt;br /&gt;Additionally it provides the mechanisms by which Java applications can integrate into the native desktop such as registering Java applications as document viewers on the desktop and creating installer packages. There are other projects in the incubator, like &lt;a href="https://jdic.dev.java.net/documentation/incubator/screensaver/index.html"&gt;Screensaver SDK&lt;/a&gt; which allows you to write Screensaver applications in Java and the &lt;a href="https://jdic.dev.java.net/documentation/incubator/tray/index.html"&gt;Tray Icon API&lt;/a&gt; which can be used to create tray icons.&lt;br /&gt;&lt;br /&gt;And finally the latest salvo. &lt;a href=""&gt; Java Desktop Network Components &lt;/a&gt; project endeavors to make it significantly easier to construct rich, data-centric desktop clients by providing Swing components for many of the required design and coding tasks.&lt;br /&gt;&lt;br /&gt;In case you are wondering about the &lt;b&gt; Network &lt;/b&gt;, &lt;a href="https://jdnc.dev.java.net/documentation/overview.html"&gt;Amy Fowler explains &lt;/a&gt; : &lt;br /&gt;&lt;p&gt;The most central feature shared by what we call "data-centric, enterprise desktop clients" is connecting users with data - loading it, viewing it, filtering it, editing it, validating it, saving it, and so on.. And these days that data is usually tied to a network data source, such as an SQL database, HTTP servlet, or WebService, bringing with it the complexity of networking. JDNC does the heavy lifting here, by providing built-in support for dealing with these network data sources, including multi-threaded support (so the UI doesn't block during network operations) and incremental loading -- hence, the "Network" in "JDesktop Network Components".&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-108851624742242362?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/108851624742242362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=108851624742242362' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108851624742242362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108851624742242362'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/06/java-on-desktop.html' title='Java on the desktop'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444586.post-108826288115477928</id><published>2004-06-26T08:04:00.000-07:00</published><updated>2004-06-26T08:14:41.153-07:00</updated><title type='text'>Log4Tech.init()</title><content type='html'>Everyone of my friends seems to have a weblog now. Many are using it to be able to search themselves on Google. My friend &lt;a href="http://www.tarunupadhyay.com"&gt;Tarun&lt;/a&gt; tells me that ego-surfing is the word. Some benevolent souls are crying hoarse that this is going to &lt;a href="http://www.microcontentnews.com/articles/googlebombs.htm"&gt;render our favorite search engine useless &lt;/a&gt;someday. My own $.02 on this is, if not blogs, then mailing lists are anyway going to do that...the Sun is finally going to die and the Universe is headed for emptiness.&lt;br /&gt;&lt;br /&gt;So finally I have decided to be on the bandwagon. Looked around for a J2EE-based blogging application, liked &lt;a href="http://deepblack.blackcore.com/"&gt;Deepblack&lt;/a&gt; a little, also thought about &lt;a href="http://msdn.microsoft.com/msdnmag/issues/03/10/Blogging/default.aspx"&gt;creating my own using .NET &lt;/a&gt;, then deployed &lt;a href="http://www.movabletype.org/"&gt;MovableType&lt;/a&gt; on my office machine, but finally settled for blogger.com. ASP model works, I must say !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444586-108826288115477928?l=abhinavmaheshwari.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abhinavmaheshwari.blogspot.com/feeds/108826288115477928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444586&amp;postID=108826288115477928' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108826288115477928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444586/posts/default/108826288115477928'/><link rel='alternate' type='text/html' href='http://abhinavmaheshwari.blogspot.com/2004/06/log4techinit.html' title='Log4Tech.init()'/><author><name>Abhinav</name><uri>http://www.blogger.com/profile/18436969109557648385</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
