<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>$ thought &#124; blog</title>
	<atom:link href="http://thoughtworker.in/feed/" rel="self" type="application/rss+xml" />
	<link>http://thoughtworker.in</link>
	<description>Place to serialize my thoughts...</description>
	<lastBuildDate>Mon, 04 Jan 2010 15:18:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Things to Ponder with Alfresco (Part III: WCM &#8211; Improvements)</title>
		<link>http://thoughtworker.in/2010/01/04/things-to-ponder-with-alfresco-part-iii-wcm-improvements/</link>
		<comments>http://thoughtworker.in/2010/01/04/things-to-ponder-with-alfresco-part-iii-wcm-improvements/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 15:18:34 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[alfresco]]></category>

		<guid isPermaLink="false">http://thoughtworker.in/?p=93</guid>
		<description><![CDATA[Now days using web content management systems (WCM) is trivial. You should continuously update the website content to maintain a fresh look. It increases returning customers and popularity. Almost every major website uses a CMS to achieve this. It might be an in-house developed or an off-the-shelf product. In any case, it helps organizations to separate the [...]]]></description>
			<content:encoded><![CDATA[<p>Now days using web content management systems (<a title="Wikipedia: Web Content Management System" href="http://en.wikipedia.org/wiki/Web_content_management_system" target="_self">WCM</a>) is trivial. You should continuously update the website content to maintain a fresh look. It increases returning customers and popularity. Almost every major website uses a <a title="Wikipedia: Content Management Systems" href="http://en.wikipedia.org/wiki/Content_management_system" target="_self">CMS</a> to achieve this. It might be an in-house developed or an off-the-shelf product. In any case, it helps organizations to separate the content authoring team from the application development cycles.  This helps in quicker content updates without being dependent on release schedules. I am going to point out certain things about WCM feature of alfresco. You can also apply the same principles to your WCM if you are using existing one, or planning to develop a new one!</p>
<p><strong>Content storage format </strong>- Alfresco provides a nice feature called "web-forms". There are two types of forms currently available i.e. WCM forms and ECM forms. Both of them capture the input data and store it as XML. You can also choose to apply content transformation using XSL. It helps to save final output as either HTML, Text or PDF etc. Not to forget, the content is actually captured and saved as XML. In my perception one of the strengths of Alfresco is its content repository. If XML is target format, it is saved in CR as a cm:content property and it defeats the whole purpose. If CR is not aware of the structure of the content, it defeats the purpose of content model definition? It is not very different from storing the content xml as plain string in database. Frankly I don't see any benefit of using CR over database in this method.</p>
<p>To avoid such inefficient use of alfresco, you can take some effort and write a custom form component. Use custom forms (develop forms in your application and then communicate with alfresco using API) to capture user data and store them in content repository in defined content model and schema.</p>
<p>This will help you in -</p>
<ul>
<li>Content repository now understands the structure of your content. This is really important and if you have any doubts, please post that in comments. I might write about it later in my blog.</li>
<li>You can apply your custom content transformation logic so that content can be exported in XML / HTML / custom output format. Just generate this once every time you update the content. It improves the efficiency of content management system to deliver target content.</li>
<li> You will have a flexibility of own input format, use JSP or rails forms, its your choice!</li>
</ul>
<p><strong>Deployment benefits - </strong> Alfresco has another great strength, Deployment Infrastructure. I think its also one of its weaknesses. Use it wisely to improve your release management. On the release date of web application usually you come across content sanity issues, or format differences. To avoid that, setup proper environments where alfresco can sync content and test it before you push it to live. This might save you a lot of frustration.</p>
<p>Although its a great feature, there is a caveat to that. Generally all the code for web application is stored in CVS systems. Alfresco code (web scripts, web form definitions etc.) is stored in alfresco. Keeping the versions of alfresco code and web application code is nightmare. Develop some automated web script deployment tool and every time you release, wipe out all the previous webscripts and deploy new ones from the CVS. This always makes you keep updated code in the CVS and versioning becomes much robust.</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2010/01/04/things-to-ponder-with-alfresco-part-iii-wcm-improvements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu: Cisco VPN Client installation on Intrepid</title>
		<link>http://thoughtworker.in/2008/11/19/ubuntu-cisco-vpn-client-installation-on-intrepid/</link>
		<comments>http://thoughtworker.in/2008/11/19/ubuntu-cisco-vpn-client-installation-on-intrepid/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 04:57:56 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://thoughtworker.in/?p=81</guid>
		<description><![CDATA[Cisco VPN client for linux installation doesn't happen out-of-the-box. There is plugin of VPNC which gets integrated with NetworkManager of Ubuntu but I didn't focus on that. Maybe somebody would like to guide the steps for it. I investigated a little and found bunch of articles / blog post about VPN issue. Some of the [...]]]></description>
			<content:encoded><![CDATA[<p>Cisco VPN client for linux installation doesn't happen out-of-the-box. There is plugin of VPNC which gets integrated with NetworkManager of Ubuntu but I didn't focus on that. Maybe somebody would like to guide the steps for it. I investigated a little and found bunch of articles / blog post about VPN issue. Some of the articles are outdated or needs a update. Following steps will get VPN client working on Ubuntu Intrepid and use certificate based authentication to connect.</p>
<p>First get the distribution of VPNClient for linux. This distribution is valid for 32-bit as well 64-bit installations.</p>
<pre>

wget http://tuxx-home.at/vpn/Linux/vpnclient-linux-x86_64-4.8.01.0640-k9.tar.gz

tar -xvzf  vpnclient-linux-x86_64-4.8.01.0640-k9.tar.gz

cd vpnclient

sudo ./vpn_install
</pre>
<p>This command should result in similar output below:</p>
<pre>
Cisco Systems VPN Client Version 4.8.01 (0640) Linux Installer
Copyright (C) 1998-2006 Cisco Systems, Inc. All Rights Reserved.

By installing this product you agree that you have read the
license.txt file (The VPN Client license) and will comply with
its terms.

Directory where binaries will be installed [/usr/local/bin]

Automatically start the VPN service at boot time [yes]

In order to build the VPN kernel module, you must have the
kernel headers for the version of the kernel you are running.

Directory containing linux kernel source code [/lib/modules/2.6.27-7-generic/build]

* Binaries will be installed in "/usr/local/bin".
* Modules will be installed in "/lib/modules/2.6.27-7-generic/CiscoVPN".
* The VPN service will be started AUTOMATICALLY at boot time.
* Kernel source from "/lib/modules/2.6.27-7-generic/build" will be used to build
the module.

Is the above correct [y]

Making module
make -C /lib/modules/2.6.27-7-generic/build SUBDIRS=/home/sachin/vpnsandbox/vpnclient
modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.27-7-generic'
CC [M]  /home/sachin/vpnclient/linuxcniapi.o
In file included from /home/sachin/vpnclient/Cniapi.h:15,
from /home/sachin/vpnclient/linuxcniapi.c:31:
/home/sachin/vpnclient/GenDefs.h:113: error: conflicting types for ‘uintptr_t’
include/linux/types.h:40: error: previous declaration of ‘uintptr_t’ was here
make[2]: *** [/home/sachin/vpnclient/linuxcniapi.o] Error 1
make[1]: *** [_module_/home/sachin/vpnclient] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.27-7-generic'
make: *** [default] Error 2
Failed to make module "cisco_ipsec.ko".
</pre>
<p>To get around this error you need to patch couple of files in the existing source. Download the patch and apply it.</p>
<pre>

wget http://projects.tuxx-home.at/ciscovpn/patches/vpnclient-linux-2.6.24-final.diff

patch &lt; ./vpnclient-linux-2.6.24-final.diff
</pre>
<p>After successful patch of the files you can proceed to the install procedure again -</p>
<pre>
sudo ./vpn_install
</pre>
<p>You should be able to see all files getting compiled successfully. If it is successful you will see a message like below -</p>
<pre>

* You must run "/etc/init.d/vpnclient_init start" before using the client.
* This script will be run AUTOMATICALLY every time you reboot your computer.
</pre>
<p>Now you can copy your vpn configuration files (*.pcf) in /etc/opt/cisco-vpnclient/Profiles folder and you can start connecting the the vpn network using command -</p>
<pre>

vpnclient connect &lt;profile_name&gt;
</pre>
<p>If you want to use certificate based authentication for the connection then following additional steps will be required.</p>
<pre>

sudo cisco_cert_mgr -U -op import
</pre>
<p>This will ask you for the certificate file location and password for the file if required. Enter the passwords for importing certificates if required and proceed with connection.</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/11/19/ubuntu-cisco-vpn-client-installation-on-intrepid/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Region Locked DVDs and Mac Book Pro</title>
		<link>http://thoughtworker.in/2008/10/16/macbook-pro-dvd-issues/</link>
		<comments>http://thoughtworker.in/2008/10/16/macbook-pro-dvd-issues/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 16:58:14 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/?p=87</guid>
		<description><![CDATA[Recently I got a MacBook Pro 2008 from my office. I love the machine but I was completely disappointed when I inserted Italian Job DVD. I was asked to change the region to 2/4 and I stay in region 5. I own the original copy of the DVD and unfortunately, there is no Region 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I got a MacBook Pro 2008 from my office. I love the machine but I was completely disappointed when I inserted <a title="Imdb Italian Job Page" href="http://www.imdb.com/title/tt0064505/" target="_blank">Italian Job</a> DVD. I was asked to change the <a title="DVD Region Code" href="http://en.wikipedia.org/wiki/DVD_region_code" target="_blank">region</a> to 2/4 and I stay in region 5. I own the original copy of the DVD and unfortunately, there is no Region 5 copy available in India. It was never the issue for me because in Windows, <a title="VLC Media Player" href="http://www.videolan.org/vlc/" target="_blank">VLC</a> media player could easily bypass these region codes and ignore it conveniently.</p>
<div class="wp-caption alignnone" style="width: 410px"><img title="DVD Regions Map" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/DVD-Regions_with_key-2.svg/400px-DVD-Regions_with_key-2.svg.png" alt="DVD Regions Map" width="400" height="203" /><p class="wp-caption-text">DVD Regions Map</p></div>
<p>I own few more DVDs belonging to 2/3/4 regions. I own another DVD player (my PlayStation 3) and that is also region locked. Now I have two very expensive machines and lots of <em>original </em>DVD titles yet can't play any of them. I don't know who created this *stupid* protection system which prohibits user from playing legal copies!</p>
<p>I tried various things on my Mac -</p>
<ul>
<li>Using VLC media player for OS X</li>
<li>Using utilities like MacTheRipper for decrypting the dvd</li>
<li>RegionX for changing the region indefinite times</li>
</ul>
<p>None of the above works. I have almost read thousand blog / forum posts related to DVD region issues with Mac but everything was completely failure. Apparently MacBooks have this "MATSHITA DVD-R   UJ-867" super drive which has no way of getting around the protection. I don't want to replace the firmware to region free as it will void my company laptop warranty which makes me crazy.</p>
<p>Now what reward I got by paying for the legal versions of the DVDs? In India any English movie DVD will cost you around Rs. 399-699 which is considerably expensive. You pay Rs. 800-1000 for 1 month of the internet connection. Why I will not be tempted to download nicely ripped DivX movie from torrent instead of buying freaking expensive DVDs which don't play at all?</p>
<p>Now can I demand my money back for these movies? Can I illegaly download the DivX rip of the movie and play it on my laptop and still it will be legal? I really don't know but I will never buy legal DVDs for sure!</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/10/16/macbook-pro-dvd-issues/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Things to ponder with Alfresco (Part-II: Workflow Design)</title>
		<link>http://thoughtworker.in/2008/09/21/workflow-design/</link>
		<comments>http://thoughtworker.in/2008/09/21/workflow-design/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 11:47:12 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/?p=77</guid>
		<description><![CDATA[
  
Complex Workflow Designs


As I mentioned in my earlier post that I will be writing few more posts about the Alfresco. This is second installment in the series. If you are thinking to use Alfresco at the center of your application then it is hard that it will not have a workflow. If your business process [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl id="attachment_76" class="wp-caption alignright" style="width: 310px;"><a href="http://thoughtworker.in/wp-content/uploads/2008/09/cartoonworkflow1.jpg"><img class="size-medium wp-image-76" title="Workflow Cartoon" src="http://www.thoughtworker.in/wp-content/uploads/2008/09/cartoonworkflow-300x238.jpg" alt="Complex Workflow Designs" width="300" height="238" /></a>  </p>
<dd class="wp-caption-dd">Complex Workflow Designs</dd>
</dl>
</div>
<p class="MsoNormal">As I mentioned in my earlier post that I will be writing few more posts about the Alfresco. This is second installment in the series. If you are thinking to use Alfresco at the center of your application then it is hard that it will not have a workflow. If your business process is just more than simple workflows mentioned in Alfresco, then for sure you have to write your own business model definition.</p>
<p class="MsoNormal">If you are planning to do so, here are few lessons I have learned –</p>
<ul>
<li><em>Simplicity</em> – We got lot of benefits just by keeping our process definition simple and neat. Don’t add unnecessary steps which will cause confusing steps for the end users.</li>
<li><em>Right things at right place – </em>Alfresco is very flexible in terms of business logic implementation. You will always have multiple options to accomplish same operation. Web Scripts, Java classes or Web Service and you will be tempted to use different things at times. Decide one approach and stick to it. Put as much as logic in the workflow and don’t spread across the workflow business logic outside the workflow.</li>
<li><em>Loops can be evil –</em> Loops in the workflow actions can be daunting at times. Rethink on the circular steps in the workflow and make sure you are not violating the “simplicity” rule. It might be difficult sometimes to achieve these steps.</li>
<li><em>Blocking is good sometimes –</em> Next bigger decision should be synchronous operations or asynchronous. All the operations which might result in inconsistent states should be synchronous i.e. transactional. Asynchronous operations are better in terms of responsiveness. Sending e-mails could be asynchronous tasks as you people can receive emails after couple of seconds, but if it is related to pushing records to a queue, let it be synchronous. You got the idea!</li>
</ul>
<p>You are advised to check Alfresco <a title="Alfresco Workflow Wiki" href="http://wiki.alfresco.com/wiki/Workflow" target="_blank">wiki</a> for more details. There is plenty of documentation available for the administration and authoring custom workflows.</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/09/21/workflow-design/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Things to ponder with Alfresco (Part-I: Content Model)</title>
		<link>http://thoughtworker.in/2008/09/13/things-to-ponder-with-alfresco-part-i-content-model/</link>
		<comments>http://thoughtworker.in/2008/09/13/things-to-ponder-with-alfresco-part-i-content-model/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 18:21:54 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/?p=69</guid>
		<description><![CDATA[For any content repository, content model definition is similar to the DDL (schema definition) for databases. It is expected in a big application to have evolutionary content model like databases. Updating the table structures or introducing new tables is common in any business application. In content repository, you should also keep in mind that your [...]]]></description>
			<content:encoded><![CDATA[<p>For any content repository, content model definition is similar to the DDL (schema definition) for databases. It is expected in a big application to have evolutionary content model like databases. Updating the table structures or introducing new tables is common in any business application. In content repository, you should also keep in mind that your content model should be open to evolve. Define the content model which will be extensible. Most of the good practices of database design should be applicable here.</p>
<p>Few tips for better content models -</p>
<ul>
<li>Use aspects for specializing types instead of defining content types. There are few advantages of that, aspects can be applied or removed at run-time which gives you much more control over the dynamic nature of types.</li>
<li>Aspects also helps in keeping the default set of properties over a content type to be small. Alfresco recommends you to prefer aspects over custom content types.</li>
<li>Aspects helps you to logically group properties. This helps your data to be part of multiple groups at the same time. If you have aspects <em>Publishable</em> and <em>Indexable</em>; you can apply or revoke a nature at your will without much hassle.</li>
<li>Indexing is very helpful for searchable content. It is useful but use it wisely. The cost of indexing in Alfresco is much higher than cost of index in Databases as this will be full-text search indexes. It will take up more disk space as well as time to index the data. Don't index the content which people are not expect to search! You can define this at the time of content model definition.</li>
<li>Versioning is similar to indexing and use this wisely. The content which is versionable is handled separately by Alfresco. This might be affecting performance as your repository size grows. Don't mark content as versionable if you don't plan to maintain revisions for content.</li>
</ul>
<p>I will continue this series with other experiences with Alfresco. Later.</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/09/13/things-to-ponder-with-alfresco-part-i-content-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alfresco: Workflow managed by JavaScript</title>
		<link>http://thoughtworker.in/2008/05/29/alfresco-workflow-managed-by-javascript/</link>
		<comments>http://thoughtworker.in/2008/05/29/alfresco-workflow-managed-by-javascript/#comments</comments>
		<pubDate>Thu, 29 May 2008 05:05:59 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[alfresco]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/?p=68</guid>
		<description><![CDATA[If you are a regular reader of this blog, you might have figured out that I am currently working on a project involving alfresco at the center and it's a content management system. Earlier I have worked with Content repository (Apache Jackrabbit) and that was a good experience. Alfresco is next step of a content [...]]]></description>
			<content:encoded><![CDATA[<p>If you are a regular reader of this blog, you might have figured out that I am currently working on a project involving <a title="Alfresco Content Management System" href="http://www.alfresco.com" target="_blank">alfresco</a> at the center and it's a content management system. Earlier I have worked with Content repository (<a title="Apache Jackrabbit Content repository" href="http://jackrabbit.apache.org/" target="_blank">Apache Jackrabbit</a>) and that was a good experience. Alfresco is next step of a content repository which extends it into a full blown content management system and much more.  I was working on a problem where we defined a custom (<a title="Ad Link: Novell Advanced Workflow" href="http://www.novell.com/products/teaming/iceworkflow.html" target="_blank">Advanced workflow</a>) to be precise in Alfresco lingo. This workflow was needed to be monitored, managed and accessed only via a webscript as we have used webscripts to do almost everything in our project. I was very pleased to see <a title="Alfresco JavaScript workflow API" href="http://wiki.alfresco.com/wiki/Workflow_JavaScript_API" target="_blank">this</a>, but that is only available in 2.9 labs release (as of now). We are using alfresco 2.2.0 version for our development and that is production stable version, so I have very little choice but go with production version. Alfresco has very limited JavaScript API support for workflow manipulation and that was difficult job for manage. There was no other option than writing custom JavaScript API which allows to manage workflow in Alfresco. We did that and it was very powerful and easy! <img src='http://thoughtworker.in/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   I wanted following features for JavaScript API -</p>
<ul>
<li>Easy to extend</li>
<li>Can handle any workflows</li>
<li>Provides easy ways to retrieve tasks, definitions, paths etc.</li>
<li>Provides as much functionality possible which is available in Alfresco Workflow Console.</li>
</ul>
<p>Alfresco workflow console is command line interaction component which allows you to manipulate, get information about workflows using simple commands and I wanted to do all that using JavaScript. I started exploring the source code and found a class 'org.alfresco.service.cmr.workflow.WorkflowService'. This class has generic API which allows you to do all the operations possible through workflow console. This bean is used for workflow console operations. So all I needed was expose this bean in JavaScript as root object and start using it. That simple!  I wrote a simple java class to expose the bean as follows:</p>
<pre class="java"><span style="color: #000000; font-weight: bold;">package</span> com.<span style="color: #006600;">xxxx</span>.<span style="color: #006600;">yyyy</span>.<span style="color: #006600;">workflow</span>;
&nbsp;
<span style="color: #a1a100;">import java.util.List;</span>
&nbsp;
<span style="color: #a1a100;">import org.alfresco.repo.processor.BaseProcessorExtension;</span>
<span style="color: #a1a100;">import org.alfresco.service.ServiceRegistry;</span>
<span style="color: #a1a100;">import org.alfresco.service.cmr.repository.NodeRef;</span>
<span style="color: #a1a100;">import org.alfresco.service.cmr.workflow.WorkflowService;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> WorkflowManager <span style="color: #000000; font-weight: bold;">extends</span> BaseProcessorExtension <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> ServiceRegistry services;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> setServiceRegistry<span style="color: #66cc66;">&#40;</span>ServiceRegistry serviceRegistry<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">services</span> = serviceRegistry;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> WorkflowService getWorkflowService<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> services.<span style="color: #006600;">getWorkflowService</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>The method getWorkflowService() exposes the workflow service to the JavaScript calls. To expose the Workflow Manager as root object in JavaScript create <em>WEB-INF/classes/alfresco/extension/custom-script-context.xml</em> and you will be good! (If you don't know how to do that, read <a title="Defining JavaScript API" href="http://wiki.alfresco.com/wiki/JavaScript_API#Adding_Custom_Script_APIs" target="_blank">this</a>)  Now, you can get the handle of workflow service in JavaScript code. Yet, we need to write a small component which will allow us to retrieve the active workflows, tasks etc. To do so, I wrote a small JavaScript object which provides those functionality to the user.</p>
<pre class="javascript"><span style="color: #003366; font-weight: bold;">var</span> workflowService = workflow.<span style="color: #006600;">getWorkflowService</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> W = <span style="color: #66cc66;">&#123;</span>
	transitions: <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>noderef<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> task = W._currentTask<span style="color: #66cc66;">&#40;</span>noderef<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #003366; font-weight: bold;">var</span> trans = <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>;
		<span style="color: #000066; font-weight: bold;">try</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> tasks = task &amp;amp;&amp;amp; task.<span style="color: #006600;">path</span>.<span style="color: #006600;">node</span>.<span style="color: #006600;">transitions</span>;
		<span style="color: #000066; font-weight: bold;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> index=<span style="color: #CC0000;">0</span>; index &amp;lt; tasks.<span style="color: #006600;">length</span>; index++<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
			trans<span style="color: #66cc66;">&#91;</span>trans.<span style="color: #006600;">length</span><span style="color: #66cc66;">&#93;</span> = tasks<span style="color: #66cc66;">&#91;</span>index<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">id</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span><span style="color: #000066; font-weight: bold;">catch</span><span style="color: #66cc66;">&#40;</span>error<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
			<span style="color: #009900; font-style: italic;">// Ignore error</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">return</span> trans;
	<span style="color: #66cc66;">&#125;</span>,
&nbsp;
	move: <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>noderef, command<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		workflowService.<span style="color: #006600;">endTask</span><span style="color: #66cc66;">&#40;</span>W._currentTask<span style="color: #66cc66;">&#40;</span>noderef<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">id</span>
                , command<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>,
&nbsp;
	_workflowPath: <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>noderef<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> workFlows = workflow.<span style="color: #006600;">getWorkflows</span>
                      <span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">&quot;workspace://SpacesStore/&quot;</span> + noderef, <span style="color: #003366; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>workFlows.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>&amp;gt;<span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">return</span> workFlows.<span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">id</span> + <span style="color: #3366CC;">&quot;-@&quot;</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;&quot;</span>;
	<span style="color: #66cc66;">&#125;</span>,
&nbsp;
	_currentTask: <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>noderef<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> curTask;
		<span style="color: #003366; font-weight: bold;">var</span> tasks;
		<span style="color: #000066; font-weight: bold;">try</span><span style="color: #66cc66;">&#123;</span>
		tasks = workflowService.<span style="color: #006600;">getTasksForWorkflowPath</span>
                           <span style="color: #66cc66;">&#40;</span>W._workflowPath<span style="color: #66cc66;">&#40;</span>noderef<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>tasks.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &amp;gt; <span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#41;</span>
		      curTask = tasks.<span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #66cc66;">&#40;</span>Error<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
			<span style="color: #009900; font-style: italic;">// Ignore error</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">return</span> curTask;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> initWorkflow<span style="color: #66cc66;">&#40;</span>noderef<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> wflow = actions.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">&quot;start-workflow&quot;</span><span style="color: #66cc66;">&#41;</span>;
	wflow.<span style="color: #006600;">parameters</span>.<span style="color: #006600;">workflowName</span>
             = <span style="color: #3366CC;">&quot;jbpm$xxxxyyyy:abc&quot;</span>; <span style="color: #009900; font-style: italic;">// your workflow name</span>
	wflow.<span style="color: #006600;">parameters</span><span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">&quot;bpm:assignee&quot;</span><span style="color: #66cc66;">&#93;</span>
             = person.<span style="color: #006600;">properties</span>.<span style="color: #006600;">userName</span>;
	wflow.<span style="color: #006600;">parameters</span><span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">&quot;bpm:workflowDescription&quot;</span><span style="color: #66cc66;">&#93;</span>
             = <span style="color: #3366CC;">&quot;Put your description&quot;</span>;
	wflow.<span style="color: #006600;">execute</span><span style="color: #66cc66;">&#40;</span>noderef_for_which_workflow_will_associate<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Thats it! The initiate workflow method is used to apply a workflow to a node. Once that is done, the <em>W</em> object can be used to do operations like retrieving the active tasks, ending the workflow and making the workflow transition.  Hope that helps.  If you need more workflow related information and reading material you can visit following places:</p>
<ul>
<li>JBPM jPDL Documentation (<a title="Open in new window" href="http://docs.jboss.com/jbpm/v3.2/userguide/html/" target="_blank">here</a>)</li>
<li>Alfresco workflow wiki (<a title="Open in new window" href="http://wiki.alfresco.com/wiki/Workflow" target="_blank">here</a>)</li>
<li>ECMArchitect Advance Workflow Guide (<a title="Open in new window" href="http://ecmarchitect.com/archives/2007/11/19/785" target="_blank">here</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/05/29/alfresco-workflow-managed-by-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ubuntu: Firefox 3 beta and unhappy users</title>
		<link>http://thoughtworker.in/2008/05/29/firefox-3-beta-and-unhappy-users/</link>
		<comments>http://thoughtworker.in/2008/05/29/firefox-3-beta-and-unhappy-users/#comments</comments>
		<pubDate>Thu, 29 May 2008 02:09:09 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/?p=66</guid>
		<description><![CDATA[
Beta software prohibited! (Photo obtained from here)
I was really disappointed over past few weeks about Ubuntu 8.04 release. The major reason of disappointment was Firefox 3 beta 4-5. The browser might be having lot of new things which are amazing, the performance might have been improved for JavaScript execution but in reality, the overall performance [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://thoughtworker.in/wp-content/uploads/2008/05/72652229_b2a6395c521.jpg"><img class="size-medium wp-image-67 aligncenter" title="prohibited" src="http://www.thoughtworker.in/wp-content/uploads/2008/05/72652229_b2a6395c52-300x225.jpg" alt="Prohibited" width="300" height="225" /></a></p>
<p style="text-align: center;"><em>Beta software prohibited! (Photo obtained from <a title="Matyx's photostream on flikcr" href="http://www.flickr.com/photos/matyx/72652229/" target="_blank">here</a>)</em></p>
<p style="text-align: left;">I was really disappointed over past few weeks about Ubuntu 8.04 release. The major reason of disappointment was Firefox 3 beta 4-5. The browser might be having lot of new things which are amazing, the performance might have been improved for JavaScript execution but in reality, the overall performance of the browser wasn't that good. I was experiencing slow browsing speeds, sometimes the browser wouldn't respond and sometimes even crash.</p>
<p style="text-align: left;">Firefox 3 is still gaining popularity and there are tons of plug-ins which are still not compatible with it. My favorite plugins are no longer usable with Firefox 3 and that was a big drag for me. Firebug was one of them.  The main reason why I feel very disappointed was Firefox 3 was in beta!</p>
<p style="text-align: left;">Ubuntu was simplifying Linux for all the users who don't want to touch command line for writing documents and browsing internet etc. They are doing a great job on that front too. Firefox 3 made me think is it going away from that objective by giving beta software distribution? I will urge Ubuntu community for not including any of the beta software in mainstream distribution for <strong>any</strong> reason. That might not only discourage non-technical users but also put wrong message on the table.</p>
<p style="text-align: left;">For those users who have similar problem, they can uninstall the <em>Firefox 3</em> from synaptic package manager and install <em>Firefox 2</em> browser instead. Happy browsing!</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/05/29/firefox-3-beta-and-unhappy-users/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Guarding in JavaScript</title>
		<link>http://thoughtworker.in/2008/04/25/guarding-in-javascript/</link>
		<comments>http://thoughtworker.in/2008/04/25/guarding-in-javascript/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 02:34:09 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/?p=65</guid>
		<description><![CDATA[After looking at JavaScript programming sessions by Douglas Crockford (here), I couldn't stop but admire JavaScript. There are many many impressive things in JavaScript but one of the eye-catchy thing was guarding operator in JavaScript.
The &#038;& operator in JavaScript can be acted in two ways. The normal 'and' operator which is used in determining the [...]]]></description>
			<content:encoded><![CDATA[<p>After looking at JavaScript programming sessions by <a href="http://www.crockford.com/">Douglas Crockford</a> (<a href="http://yuiblog.com/blog/2007/01/24/video-crockford-tjpl/">here</a>), I couldn't stop but admire JavaScript. There are many many impressive things in JavaScript but one of the eye-catchy thing was guarding operator in JavaScript.</p>
<p>The && operator in JavaScript can be acted in two ways. The normal 'and' operator which is used in determining the conditional logic results. The other lesser known feature of JavaScript is the guard operator. In following code -</p>
<pre class="javascript">&nbsp;
<span style="color: #009900; font-style: italic;">/* The if is checking if specs is not undefined, false, null,
&quot;&quot; (empty string) or 0 (numeric zero) as these all values
are falsy conditions in JavaScript */</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>specs<span style="color: #66cc66;">&#41;</span>
     width = specs.<span style="color: #006600;">width</span>;
&nbsp;
<span style="color: #009900; font-style: italic;">// To avoid the if condition you can simply do like -</span>
&nbsp;
width = specs &amp;&amp; specs.<span style="color: #006600;">width</span>;
&nbsp;
<span style="color: #009900; font-style: italic;">/* This makes sure that specs is not falsy and they
returns the second operand which is convenient
way to write null check */</span>
&nbsp;</pre>
<p>The same is with || operator too. If the first operand is falsy then it just returns the second operand instead. Consider following code:</p>
<pre class="javascript">&nbsp;
<span style="color: #000066;">name</span> = specs.<span style="color: #000066;">name</span> || <span style="color: #3366CC;">&quot;Name not set&quot;</span>;
<span style="color: #009900; font-style: italic;">/* Use the specs.name, but if name doesn't have a value, use default
value instead. */</span>
&nbsp;</pre>
<p>Very simple and very efficient!</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/04/25/guarding-in-javascript/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Alfresco: Server side JavaScript, anyone interested?</title>
		<link>http://thoughtworker.in/2008/04/22/alfresco-server-side-javascript-anyone-interested/</link>
		<comments>http://thoughtworker.in/2008/04/22/alfresco-server-side-javascript-anyone-interested/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 03:05:51 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/?p=64</guid>
		<description><![CDATA[I started with Alfresco and its amazing software suite. For people, who don't know about content repositories, in short its hierarchical, versionable storage (read  more). Alfresco is one step ahead of other content repository implementations and it is full content management suite. This means, you have workflow, content repository and a portal which allows [...]]]></description>
			<content:encoded><![CDATA[<p>I started with <a title="Visit Alfresco" href="http://www.alfresco.com">Alfresco</a> and its amazing software suite. For people, who don't know about content repositories, in short its hierarchical, versionable storage (read <a href="http://en.wikipedia.org/wiki/Content_repository_API_for_Java"> more</a>). Alfresco is one step ahead of other content repository implementations and it is full content management suite. This means, you have workflow, content repository and a portal which allows you to do lot of standard things e.g. communicating with external world via API, portal, security/authentication etc. From my perspective Alfresco is really great product considering the amount of features it provides and the quality of them.</p>
<p>I am working on a project which involves some bit of alfresco customization to meet the customer needs. This involves configuring alfresco for Windows SSO, allowing users to map their home space in alfresco as network share, knitting a workflow tightly integrated with their business process and writing some dynamic content generation code for reporting, user interaction and for auditing purpose. We could do most of the things straight away and we are quite happy with kind of response alfresco was giving. Everything is clean and configurable. Basically alfresco is built using spring framework; so you can configure custom beans or extend existing beans very easily via some xml files. There are tons of different services and pre-configured beans which might be little overwhelming for the beginners but, as you started to get familiar it doesn't feel so bad.</p>
<p>We were at a point where we wanted to write some server side logic to create a dynamic (web 2.0) UI which has lot of interaction based on data queries with content repository. So we needed easy approach to query repository, minimal xml configuration, ability to change / update logic easily, faster development cycle to start with. Alfresco provides lot of options to communicate to repository -</p>
<ul>
<li>Java API (most raw access to the repository, repository instance is singleton so that will be injected as dependency via spring configuration)</li>
<li>Web Service - Very standard SOAP and XML RPC based communication</li>
<li>RMI - Java RMI which is another standard method looks similar to Web Services</li>
<li>RESTful JavaScript API <img src='http://thoughtworker.in/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>I was excited by last option the most. I thought, lets explore the last one as first three were mundane and I knew what are the pros-cons of most of them. Alfresco provides a clean MVC around content repository and other parts of Alfresco (viz. workflow, user homes and some root objects) where controller is a pre-configured servlet, model is JavaScript code and view is a freemarker template. The beauty of the system is lying in the simplicity of JavavScript code.</p>
<p>Alfresco provides a nice feature rich JavaScript API (more <a href="http://wiki.alfresco.com/wiki/JavaScript_API">here</a>) where some of the objects are injected from scripting engine as root objects. These object provides the building blocks for JavaScript API e.g. search, user home, workflows etc. You can write your own Java services and inject them as root object using simple configuration to extend this foundation. Once your basic services are in place, then you can start knitting or wiring your business logic using these foundation blocks. JavaScript is an ideal choice as it expects small, working code instead of heavy logic which Java can handle. With small fluff of code you will be looking at some fantastic results.</p>
<p>I was amazed and surprised by the simplicity but there are few things which I needed to finalize before I decided to make a choice -</p>
<div>
<ul>
<li>Performance - JavaScript is interpreted in Alfresco using <a href="http://www.mozilla.org/rhino/&lt;br &gt;&lt;/a&gt;">Rhino</a> which is high performance engine by Mozilla. So, no worries about performance. I have evaluated Rhino some time back and that was really great in performance.</li>
<li>Testability - That was major concern. Unit testing with JavaScript was not easy. <a href="http://www.thefrontside.net/crosscheck&lt;br &gt;&lt;/a&gt;">Crosscheck</a> is a good choice to begin with. There are other options like <a href="http://www.jsunit.net/">JsUnit</a> and some browser based frameworks which are not that popular.</li>
<li>Debugging - Alfresco provides a very nice JavaScript debugger where you have luxury of an IDE. Its launched from browser (firefox, IE) and works with ease. Standard debugger features like breakpoints, watches and navigation control are provided.</li>
<li>Ease of deployment - Most of the scripts are convention based (naming conventions, location conventions etc) and very standard. Server can identify updated scripts and no server restart required (in development environment thats a needed feature)</li>
<li>Ability to talk to Java logic - If you want to use a external third-party library from JavaScript, no problem! JavaScript code can use API which are written in Java and work with them with ease. You can even write your heavy-weight business logic components in Java and inject that as service to reduce time and achieve code-reuse.</li>
</ul>
</div>
<p>After all concerns are addressed, I was pretty sure I will be writing most of my business logic code and writing the services in JavaScript. I haven't stressed much in this post on view as its pretty standard <a href="http://freemarker.sourceforge.net/">freemarker</a> template engine. I would like to touch upon that later.</p>
<p>If you are considering the Alfresco and writing your business logic in JavaScript (called as Web Scripts in Alfresco) then I would seriously recommend following things for reading/viewing -</p>
<div>
<ul>
<li>Douglas Crockford — "The JavaScript Programming Language" series of videos (found <a href="http://developer.yahoo.com/yui/theater/&lt;br &gt;&lt;/a&gt;">here</a>)</li>
<li>Alfresco Developer series - For basic hands-on tutorials for Alfresco customization and understanding (found <a href="http://ecmarchitect.com/alfresco-developer-series/">here</a>)</li>
</ul>
<p>Have a great time functional programming! <img src='http://thoughtworker.in/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/04/22/alfresco-server-side-javascript-anyone-interested/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t put JavaScript validation, I&#8217;ll Firebug!</title>
		<link>http://thoughtworker.in/2008/04/20/dont-put-javascript-validation-ill-firebug/</link>
		<comments>http://thoughtworker.in/2008/04/20/dont-put-javascript-validation-ill-firebug/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 16:15:58 +0000</pubDate>
		<dc:creator>Sachin</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.thoughtworker.in/2008/04/20/dont-put-javascript-validation-ill-firebug/</guid>
		<description><![CDATA[Recently, I was with my friend to book a cab. The cab service provided an online booking facility which allows you to provide some details (phone number, address, destination and time of cab etc.). We went ahead and tried to book the cab and it wasn’t accepting the request. It seemed that they put a [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I was with my friend to book a cab. The cab service provided an online booking facility which allows you to provide some details (phone number, address, destination and time of cab etc.). We went ahead and tried to book the cab and it wasn’t accepting the request. It seemed that they put a validation to check that user shall not book a cab less than 4 hours prior to departure.</p>
<p>Unfortunately, we wanted to book the cab on a 3 hours notice and it was mandatory for us to book the cab.  We couldn’t resist but started looking for options at our hand. We pulled the website in Firefox and opened firebug to see where the validation is executed. We were surprised by the validation was done in browser using a very simple JavaScript. We thought; let’s see if we could just pass the 4 hours validation by bypassing the validation or maybe mocking the action. The validation code was very simple; we just put the breakpoint in the function and then set the variable value via firebug to an acceptable level. Bang! The code ran successfully and cab service accepted the request.</p>
<p>We made a successful cab reservation and my friend could take a peaceful ride back home!  Moral of the story: Please put all the business critical validations on the server side instead of browser based JavaScript. If you really want to do some browser based validation then it will be really good idea to <a href="http://en.wikipedia.org/wiki/Obfuscated_code" title="Obfuscate the code">obfuscate</a> the code.</p>
]]></content:encoded>
			<wfw:commentRss>http://thoughtworker.in/2008/04/20/dont-put-javascript-validation-ill-firebug/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
