<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3416015228970774796</atom:id><lastBuildDate>Thu, 18 Mar 2010 01:06:00 +0000</lastBuildDate><title>{proton: fever}</title><description>the fever is on!</description><link>http://www.protonfever.com/</link><managingEditor>noreply@blogger.com (Varun Mehta)</managingEditor><generator>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/protonFever" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="protonfever" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-60549239636363535</guid><pubDate>Thu, 18 Mar 2010 01:06:00 +0000</pubDate><atom:updated>2010-03-17T21:06:00.334-04:00</atom:updated><title>Annoying Geo Targeting</title><description>Ever see those annoying ads on websites you are visiting, which advertise services or locations around where you are currently surfing. How do they figure out where you are??&lt;br /&gt;
&lt;br /&gt;
Such kind of targeting in the online media world is called as "geo-targeting". Every computer or device that connects to the internet gets an IP address assigned to it. These addresses are assigned based on your location, so if you are in North America your IP will start from 63.*.*.* or 64.*.*.*. If you are in Asia, your IP address will range in 202.*.*.* or 212.*.*.*, so on and so forth. These addresses are further drilled to second and third level based on the subnet mask.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;When ads are placed, to target people in a specific location, they get help from the IP address/subnet, and then the spam ads really want to desperately reach you, they use a trick like the one mentioned in the cartoon below...&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://imgs.xkcd.com/comics/geoip.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="244" src="http://imgs.xkcd.com/comics/geoip.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;I hate to analyze &lt;a href="http://xkcd.com/"&gt;xkcd.com&lt;/a&gt;, but this one hits right on target my work domain.&amp;nbsp; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-60549239636363535?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P-_eLofeGCJKxss2VgL38dxI-4k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P-_eLofeGCJKxss2VgL38dxI-4k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P-_eLofeGCJKxss2VgL38dxI-4k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P-_eLofeGCJKxss2VgL38dxI-4k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2010/03/annoying-geo-targeting.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-2950774483810614414</guid><pubDate>Wed, 17 Mar 2010 01:02:00 +0000</pubDate><atom:updated>2010-03-16T21:02:36.551-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">technical</category><title>Hot Deployment issues</title><description>The build always makes it to the staging and production server after a series of rigorous tests. This ensures the build is complaint with the requirement and that none of the old features have been compromised in any way. Once in a while, a rare, but an &lt;a href="http://www.kevinwilliampang.com/2008/08/28/top-10-things-that-annoy-programmers/"&gt;annoying&lt;/a&gt; "&lt;a href="http://en.wikipedia.org/wiki/Scope_creep"&gt;Scope Creep&lt;/a&gt;" scenario does happen.&lt;br /&gt;
&lt;br /&gt;
Just minutes before the demo some one would realize a missing feature or patch which missed the commit deadline and did not make it to the server. So as a quick temp fix we just deploy that file to ensure the code does not have to go through the grueling tests again. Some of the smart developers don't commit these hot patches to SVN or merge it with the patch branch, losing the feature again.&amp;nbsp; &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Writing a shell script or a program which can check the MD5sum of all the files deployed, with the files about to be deployed can give us an idea if anything had been hot deployed. Hudson has a neat trick called as fingerprints for jar files, which is similar in the same aspect of checking MD5, so you know if you need to redeploy all the jar files or only the changed ones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-2950774483810614414?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wWJnjGuSwHIjpTOXxUgf3ZaaFrs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wWJnjGuSwHIjpTOXxUgf3ZaaFrs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wWJnjGuSwHIjpTOXxUgf3ZaaFrs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wWJnjGuSwHIjpTOXxUgf3ZaaFrs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2010/03/hot-deployment-issues.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-8112443630678099526</guid><pubDate>Wed, 17 Feb 2010 22:38:00 +0000</pubDate><atom:updated>2010-02-17T17:50:31.906-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project planning</category><title>Project Management and Issue tracking tools: Redmine vs Trac</title><description>I've been beating around the web searching for a good solution, that can scale from a microISV team to a mid sized team. We've been using &lt;a href="http://svnrepository.com/"&gt;svnrepository.com&lt;/a&gt; for sometime. They provide svn and git as a SCM,&amp;nbsp; also trac with multiple plugins for project management.&lt;br /&gt;
&lt;br /&gt;
Off late they've upgraded to a new system which offers &lt;a href="http://www.redmine.org/"&gt;redmine&lt;/a&gt;, along with &lt;a href="http://trac.edgewall.org/"&gt;trac&lt;/a&gt; and also has support for mercurial. After searching the web for a few minutes, I hit upon this article at stackoverflow; &lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/1130466/trac-vs-redmine-vs-jira-vs-fogbugz-for-one-man-shop"&gt;Trac vs. Redmine vs. JIRA vs. FogBugz for  one-man shop?&lt;/a&gt; Check through the article, you might find it useful.&lt;br /&gt;
&lt;br /&gt;
If you are looking for online svn hosting, this website might be useful to you. &lt;a href="http://www.svnhostingcomparison.com/"&gt;http://www.svnhostingcomparison.com&lt;/a&gt;. It provides you with multiple options available in the market. You can filter depending on the cost, disk space and other features.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-8112443630678099526?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/syyO5e0qG9bG1Cf5gpw8phGdb-U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/syyO5e0qG9bG1Cf5gpw8phGdb-U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/syyO5e0qG9bG1Cf5gpw8phGdb-U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/syyO5e0qG9bG1Cf5gpw8phGdb-U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2010/02/project-management-and-issue-tracking.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-7322905925623289240</guid><pubDate>Tue, 16 Feb 2010 22:59:00 +0000</pubDate><atom:updated>2010-02-16T18:01:15.440-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project planning</category><title>Adhoc or Agile</title><description>I wanted to hot link to an old post by &lt;a href="http://www.simonbrown.je/"&gt;Simon Brown&lt;/a&gt;, but I believe he's dropped his old blog and transformed into a more consultant type blog. I'm copy pasting the old post here, with link to the original post.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;In the vast majority of cases where these phrases are used, agile has  mistakenly been used to mean that the development process in use is ad  hoc or even non-existent. It's not hard to get to the bottom of what  people mean by agile, particularly in interviews, with a few simple  questions. Usually, the flow of conversation goes something like this. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Me  : So you're using agile ... how are you finding it?&lt;/li&gt;
&lt;li&gt;Them : Good  thanks, we've been doing XP for a while now.&lt;/li&gt;
&lt;li&gt;Me : Oh right,  which practices of XP are you following?&lt;/li&gt;
&lt;li&gt;Them : We've got the  users sitting near us and we're doing test-driven development. We don't  do pair programming.&lt;/li&gt;
&lt;li&gt;Me : How are you managing your  iterations/time boxes?&lt;/li&gt;
&lt;li&gt;Them : We do a release whenever a new  feature is ready. The users test it and then tell us how they'd like it  changed. Agile is really good for capturing this early feedback. We just  respond to whatever the users want and they love it!&lt;/li&gt;
&lt;li&gt;Me : So  how long are your iterations?&lt;/li&gt;
&lt;li&gt;Them : Oh, that depends on .....&lt;/li&gt;
&lt;li&gt;Me  : So then, how are you finding test-driven development?&lt;/li&gt;
&lt;li&gt;Them :  We're really liking that. It's such a great technique for understanding  exactly what an API should do before you code it.&lt;/li&gt;
&lt;li&gt;Me :  Excellent. What sort of unit test coverage do you have?&lt;/li&gt;
&lt;li&gt;Them :  Oh, I don't know, but it's probably over 50%.&lt;/li&gt;
&lt;li&gt;Me : 50%? Do you  use a code coverage tool? Do you write unit tests before writing all of  your code?&lt;/li&gt;
&lt;li&gt;Them : No, we've not got around to using a coverage  tool yet. We sometimes right tests before the code, but we usually don't  have the time to do that so we do it afterwards.&lt;/li&gt;
&lt;li&gt;Me : How do  you ensure quality?&lt;/li&gt;
&lt;li&gt;Them : We're supposed to do code reviews,  but we don't usually have time.&lt;/li&gt;
&lt;li&gt;Me : So then, how do you feel  agile methods differ from others, such as ...?&lt;/li&gt;
&lt;/ul&gt;For me, agile  is about reducing the ceremony associated with software development  while maintaining very tight control over the structure of the process  and quality of the deliverables. Unfortunately, many people are now  using "agile" as a buzzword to describe their projects, although in  reality these projects are low in ceremony, structure and quality.&lt;br /&gt;
&lt;br /&gt;
Hmmm  ... are you really agile or just ad hoc?&lt;/blockquote&gt;&lt;br /&gt;
Original Link: &lt;a href="http://www.simongbrown.com/blog/2006/11/21/agile_or_ad_hoc.html" target="_blank"&gt;http://www.simongbrown.com/blog/2006/11/21/agile_or_ad_hoc.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-7322905925623289240?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ft_JFPnErdtcRaYvYWWql7GsLeg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ft_JFPnErdtcRaYvYWWql7GsLeg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ft_JFPnErdtcRaYvYWWql7GsLeg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ft_JFPnErdtcRaYvYWWql7GsLeg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2010/02/adhoc-or-agile.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-1777722403811731712</guid><pubDate>Thu, 21 Jan 2010 22:05:00 +0000</pubDate><atom:updated>2010-01-21T17:46:39.615-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project planning</category><title>Customizing JIRA workflow</title><description>Like other cool companies we also use JIRA for issue tracking; and we are agile using it. JIRA has posted a very useful article on how &amp;nbsp;to go agile using JIRA [&lt;a href="http://confluence.atlassian.com/display/CONFEVAL/Using+JIRA+for+Agile+Development"&gt;http://confluence.atlassian.com/display/CONFEVAL/Using+JIRA+for+Agile+Development&lt;/a&gt;].&lt;br /&gt;
&lt;br /&gt;
Since JIRA gives you an option to customize the workflow.&amp;nbsp;We've added some more details extending the normal 4 step JIRA workflow to a 6-7 step workflow.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;The steps are closely related to what we follow in a normal development cycle, something that is not only natural to a developer, but also helps managers track them.&amp;nbsp;A look at the major steps involved;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_a14Xcoi-jlw/S1jQXAqTyOI/AAAAAAAABBY/DtBnwW187CM/s1600-h/Jira-flowchart.preview.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_a14Xcoi-jlw/S1jQXAqTyOI/AAAAAAAABBY/DtBnwW187CM/s640/Jira-flowchart.preview.gif" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Open Issue:&lt;/b&gt; Issue created by the lead and assigned to a responsible developer.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;In Progress: &lt;/b&gt;Once the developer starts working on it, they mark is as "In Progress", to let others know he's working on it.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;More Info needed: &lt;/b&gt;Along the way is&amp;nbsp;any information is needed from the business analyst or the decision maker, reassign the issue to them and mark it as "More Info Needed" who when provides more info, assigns back to you. Why the run around; well helps you document for future reference.&amp;nbsp;Back "&lt;b&gt;In Progress&lt;/b&gt;" the developer continues with the quest to complete it.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Development Complete:&amp;nbsp;&lt;span style="font-weight: normal;"&gt;When finished coding, update the status as "Development Complete". The module is code complete but not unit tested for yet!&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Unit Tested:&lt;span style="font-weight: normal;"&gt; Supporting unit test was written and&amp;nbsp;integrated&amp;nbsp;with the Ant/Maven build to run in Hudson/Cruise Control/Bamboo&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;There are also cases, when there are no unit tests needed or possible for the code, the developer can mark &amp;nbsp;"No Unit Test" in that case.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;QA Approved:&lt;/b&gt; This is where we get a bit waterfally, but only cos we think unit test may not always provide complete testing justice of your application. Here the QA is&amp;nbsp;responsible&amp;nbsp;for ensuring the business&amp;nbsp;requirements&amp;nbsp;are met as specked out.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Resolve Issue:&lt;/b&gt; Good to go, go to staging, pass some robust abuse, and if all goes well resolve the issue.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Close Issue:&lt;/b&gt; The build has been released and we are generating release notes of what made it and what was missed. Close the issue and let it rest. If there are any&amp;nbsp;repercussions reopen the ticket.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;*There is some debate about the Unit Test being written first and then the code; so you know what to expect; but in this case, it's a state for the developer and the manager for better understanding.&lt;br /&gt;
&lt;/blockquote&gt;On how to create a custom workflow, please refer the JIRA documentation&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-1777722403811731712?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tiidoZ3LPNrx0697fGUomW6WrdM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tiidoZ3LPNrx0697fGUomW6WrdM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tiidoZ3LPNrx0697fGUomW6WrdM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tiidoZ3LPNrx0697fGUomW6WrdM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2010/01/jira-workflow.html</link><author>noreply@blogger.com (Varun Mehta)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_a14Xcoi-jlw/S1jQXAqTyOI/AAAAAAAABBY/DtBnwW187CM/s72-c/Jira-flowchart.preview.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-6793806251401011800</guid><pubDate>Tue, 27 Oct 2009 20:21:00 +0000</pubDate><atom:updated>2009-10-27T16:32:53.289-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project planning</category><category domain="http://www.blogger.com/atom/ns#">technical</category><title>Version Control Policy: Best Practices</title><description>Your code base is always under version control (if it's not, it's high time you did!), and developers are always scared about taking updates or committing files, under some supernatural fear, that an update will wipe out their local changes. This causes a lot of trouble in the team, when some developers have not updated their code base since a long time. I've compiled below a checklist of best practices.&lt;br /&gt;
&lt;br /&gt;
Before you check in your code to subversion, here are a few points to follow.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Ensure that there are 0 (zero) serious CheckStyle, PMD, FindBugs error (warnings should be reviewed). If you need an exception&lt;/li&gt;
&lt;li&gt;Checked in Code must build with all dependencies (not just your module).&lt;/li&gt;
&lt;li&gt;Checked in Code must not break unit tests.&lt;/li&gt;
&lt;li&gt;Checkins without comments should be noted as a build break caused by the developer.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Before committing your changes to repository, it is advisable to synchronize the files, run an update and then commit your changes.&lt;/li&gt;
&lt;/ul&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: x-large;"&gt;Some best practices for not getting your code out of date.&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Synchronize your local SVN repository using eclipse instead of external third party tools.&lt;/li&gt;
&lt;li&gt;Update all the projects religiously every morning, irrespective of you having to commit your code that day or not. This will ensure you are always working on the latest code base.&lt;/li&gt;
&lt;li&gt;Instead of blindly running an update from eclipse, follow the following steps.&lt;/li&gt;
&lt;li&gt;Right click on all the projects in the project explorer, which are under version control&lt;/li&gt;
&lt;li&gt;Team --&amp;gt; Synchronize with repository.&lt;/li&gt;
&lt;li&gt;If it asks you to open-up the team perspective view, say "yes".&lt;/li&gt;
&lt;li&gt;At the bottom right corner of your eclipse you should see these three icons in blue, grey and red.&lt;/li&gt;
&lt;li&gt;Blue stands for incoming changes, grey outgoing and red as conflicting.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_a14Xcoi-jlw/SudUlTOlkyI/AAAAAAAAA7k/pUWWW8Tj7Rc/s1600-h/confliciting_changes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_a14Xcoi-jlw/SudUlTOlkyI/AAAAAAAAA7k/pUWWW8Tj7Rc/s640/confliciting_changes.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
If you have the count of red more than 0, then your repository has conflicting files.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Under Synchronize tab, select the similar "red arrow", the list below is filtered to show only conflicting files.&lt;/li&gt;
&lt;li&gt;Double click on the file to open in compare editor, fix the errors, and then update the files.&lt;/li&gt;
&lt;li&gt;You can safely run an update on all the files with the blue incoming arrow icon.&lt;/li&gt;
&lt;li&gt;Under any circumstances, NEVER copy the .svn file from another use to your repository. This folder contains the svn connection and credential information.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Changesets&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Most if the commits in the system span across sub-modules and generally contain multiple files. When "applying a patch", "fixing a bug", "adding a new features". Always commit these group of files as one commit and not individual files, with the same comment!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Example: Jira ticket: ABC-123, introduced a new feature which involved changes in totality of 15 files, don't commit the 15 files one by one, but commit them all together as one group (changeset) of 15 files with proper comments.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Every time you hit a commit, there is a new revision created. After committing 15 files separately you've created 15 versions (or changesets), and incase an issue occurs and you need to revert the changes, you'll have to revert the revisions one by one. If these changes were done as a group, all you need to revert the one big changeset. Group commit also reduce the noise level and useless incrementing of revisions in SVN (any version control).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;BUT, Each ticket needs to have its own commit changeset, not grouped with other tickets, unless there is a dependency between the tickets.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Futher reading:&lt;/b&gt; &lt;a href="http://subversion.tigris.org/faq.html#changesets"&gt;http://subversion.tigris.org/faq.html#changesets&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-6793806251401011800?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vwN33DafYIAkm0v0l0hZmVjHldE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vwN33DafYIAkm0v0l0hZmVjHldE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vwN33DafYIAkm0v0l0hZmVjHldE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vwN33DafYIAkm0v0l0hZmVjHldE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2009/10/version-control-policy-best-practices.html</link><author>noreply@blogger.com (Varun Mehta)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_a14Xcoi-jlw/SudUlTOlkyI/AAAAAAAAA7k/pUWWW8Tj7Rc/s72-c/confliciting_changes.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-3935333151630916893</guid><pubDate>Sun, 27 Sep 2009 18:56:00 +0000</pubDate><atom:updated>2009-10-27T16:23:26.623-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project planning</category><category domain="http://www.blogger.com/atom/ns#">technical</category><title>Software Versioning</title><description>&lt;a href="http://en.wikipedia.org/wiki/Software_versioning"&gt;Software versioning&lt;/a&gt; for the end consumer is a very vital part of the software release cycle. It is one of the primary identifiers for consumers to report issues against in a software. It also helps the development team to identify, if the features/bug fix made it through the release.&lt;br /&gt;
&lt;br /&gt;
We follow a similar pattern, which can be useful for you too. The version number is strongly tied to the &lt;a href="http://subversion.tigris.org/"&gt;SVN&lt;/a&gt; (also valid for other version control systems) branching and tagging convention. &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; (CI server) also plays an important role in stamping the build number.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;Convention&lt;/b&gt;: &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;productRelease.majorRelease.minorRelease.patchRelease.buildNumber&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;productRelease&lt;/b&gt;: Also called as the platform release, generally used when there is a huge overhaul of the application framework or platform.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;majorRelease&lt;/b&gt;: Is the interim release like a Q1, Q2 release. Q1 would be called at 1, Q2 as 2, when a huge set of features is released, then we increment this version number.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;minorRelease&lt;/b&gt;: Since we follow a two week sprint, after every two weeks the counter will increment by 1.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;patchRelase&lt;/b&gt;: So the minorRelease made it past QA, but has some issues, when these issues are fixed and redeployed as a patch, the counter is incremented by 1.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;buildNumber&lt;/b&gt;: The build number is generated by Hudson and will be appended as the last id.&lt;/li&gt;
&lt;/ul&gt;So how does this affect the usage of Subversion. Before we get into those details, there are a few ground rules for subversion you'll have to follow, once every Release is released, tag it and create a branch to maintain it.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Considering the starting stage, mark the platform release as 1;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Once we release the first sprint; a new branch called 1.0.1 will be spawned off and 1.0.2 will &amp;nbsp;continue on the trunk.&lt;/li&gt;
&lt;li&gt;Any patches to be released on 1.0.1, will be further branched as 1.0.1.1 and will be supplied to QA on blocker fixes post 1.0.1 release.&lt;/li&gt;
&lt;li&gt;Once 1.0.1.1 is released, it'll be merged back to 1.0.1.&lt;/li&gt;
&lt;li&gt;If further more bugs are found, they'll be released at 1.0.1.2 following the same process.&lt;/li&gt;
&lt;li&gt;No one will dual commit the changes from the branch to trunk, if the fix is for a patch, it'll only be committed to the patch branch.&lt;/li&gt;
&lt;li&gt;Once the patch branch has been cleared by QA, it'll be merged to the minorRelease branch.&lt;/li&gt;
&lt;li&gt;Once the second patch has been cleared by QA, it'll be merged to the minorRelease branch and then the minorRelease branch to the trunk for the next minorRelease.&lt;/li&gt;
&lt;li&gt;There should be not not more than 2 patches for one minorRelease, (considering a 2 week sprint)&lt;/li&gt;
&lt;li&gt;The second patch merge date is a 2 days maximum before the next minorRelease.&lt;/li&gt;
&lt;li&gt;The changes from patches will only make it to the minorRelease branch or the trunk, via branch merging.&lt;/li&gt;
&lt;li&gt;Every release will also result in the tag of the same name.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The branch merging should be performed by all developers in a cyclic fashion, so everyone is well versed with the process.&lt;/li&gt;
&lt;/ul&gt;Along this route, Hudson will keep building, automated testing the build, and this build number will also hold reference when releasing a build, every subsequent build need not always be released to QA, there can be 20 Hudson tests and builds before being released to QA.&lt;br /&gt;
&lt;br /&gt;
The numerous branching and merging might sound like a overhead, but will result in a more cleaner release process. Patch releases should not be one class or js file hot-patched, but a complete new fresh build, for redeployment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-3935333151630916893?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AjnS7_3QNtr1SLNjkeAHrtIoWec/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AjnS7_3QNtr1SLNjkeAHrtIoWec/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AjnS7_3QNtr1SLNjkeAHrtIoWec/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AjnS7_3QNtr1SLNjkeAHrtIoWec/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2009/10/build-numbers-for-branching-tagging.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-1435469016002230678</guid><pubDate>Thu, 30 Jul 2009 13:36:00 +0000</pubDate><atom:updated>2009-11-06T12:04:01.568-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google docs</category><category domain="http://www.blogger.com/atom/ns#">startup</category><category domain="http://www.blogger.com/atom/ns#">technical</category><category domain="http://www.blogger.com/atom/ns#">Google Cloud</category><category domain="http://www.blogger.com/atom/ns#">Google Apps</category><title>Online Recruitment Firm</title><description>One of my friend’s over the past few months has been speculating starting her own recruitment firm, but was not sure how to go about investing &amp;amp; setting it up. So we got together and brainstormed a few ideas. We created a list of tools that are of utmost importance for her work.&lt;br /&gt;
&lt;br /&gt;
It turns out Microsoft Office, MS Word more precisely is one of the most sought after tools by recruiters, followed by Microsoft Outlook for email.&lt;br /&gt;
&lt;br /&gt;
95-98% of the people seeking jobs send their resumes in MS Word format.&lt;br /&gt;
Time immemorial email is one of the fastest and most efficient way of bulk communication.&lt;br /&gt;
Using MS Office is expensive, and word documents are a prime target for carrying viruses. We needed a document reader, an email client and a strong anti-virus software.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Not sounding too stingy doing business running of the mill free gmail, yahoo or hotmail account, we invested in a domain name and got ourselves a dot.com so we could user @ourdomain.com. We got Google Apps and used our domain name to host it, and we were ready as a recruitment firm.&lt;br /&gt;
&lt;br /&gt;
Let me explain our choices; We choose the Google Apps package, because it comes with 3 major tools we needed.&lt;br /&gt;
&lt;br /&gt;
Gmail: One of the best email clients on the web, supports grouped conversation, amazing search, apply labels.&lt;br /&gt;
&lt;br /&gt;
The grouped conversation helps you track the posting for which you’ve received a reply.&lt;br /&gt;
You can apply labels such as Java, .NET, ruby, finance, hedge funds etc.. and classify incoming resumes. Applying multiple labels helps you pick up users from a wide range of skill sets faster.&lt;br /&gt;
Direct integration with google docs.&lt;br /&gt;
Amazing anti-virus policy. The attachment is scanned when the document is received and also when we download/open the attachment&lt;br /&gt;
&lt;br /&gt;
Google Docs: Online document reader, allows you to export as PDF and MS Word.&lt;br /&gt;
&lt;br /&gt;
No danger of being hit by virus.&lt;br /&gt;
Allows you to collaborate documents online, so if you need some more clarification from the job-seeker or need them to update the document, you can always share the document and ask them to modify it.&lt;br /&gt;
Once done, just export the document in MS Word format and mail it to the company. Saves you a lot of time and effort running behind the job seeker and tracking which email as the final version.&lt;br /&gt;
One of the main reasons for choosing Google Docs was “upload via email“.&lt;br /&gt;
Google docs gives you a long, obscure email address which is difficult to remember and, if we mail a word document or any text document to it. Google docs creates a word document for us online. We went ahead and created an email alias resume@domain.com which received resumes and stored it on the google server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Google Calendar: A free bonus! Helps you schedule, track and invite others to your meetings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One of the biggest benefits is you don’t need to carry your laptop around not sure when you receive the next email and will have to forward the resume, also tomorrow if the hard drive crashes, we have nothing to worry all the data is backed up on the google cloud, just pick up a new machine log on to the browser and we are back in business.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-1435469016002230678?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rv2JFpUm1WhH5k4oghMBBynapNI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rv2JFpUm1WhH5k4oghMBBynapNI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rv2JFpUm1WhH5k4oghMBBynapNI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rv2JFpUm1WhH5k4oghMBBynapNI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2009/07/online-recruitment-firm.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-7416587889496435633</guid><pubDate>Wed, 03 Jun 2009 03:45:00 +0000</pubDate><atom:updated>2009-11-21T17:38:43.117-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project planning</category><category domain="http://www.blogger.com/atom/ns#">technical</category><title>Staging environment using VMware</title><description>&lt;span style="font-size: 78%;"&gt;(This document is aimed more towards Java &amp;amp; VMWare, but the same can be replicated for any other language &amp;amp; environment)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 130%; font-weight: bold;"&gt;Abstract&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You have a team of developers working on different modules for a project-product which are inter-dependant. Each developer diligently writes unit &amp;amp; integration tests supporting their code. You want to set-up an agile test environment to run the unit tests &amp;amp; staging server for integration test, but purchasing hardware for multiple machines is a constraint.&lt;br /&gt;
&lt;br /&gt;
The following article provides a guide on how virtualization tools like VMware can be used to set-up staging or QA environment (Agile).&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;Set-up&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
You can either install Windows or Linux (we are on an Ubuntu system) as the HostOS. Use a 64-bit distribution.&lt;br /&gt;
&lt;br /&gt;
Download VMWare server from [&lt;a href="http://www.vmware.com/products/server"&gt;&lt;span style="font-family: courier new;"&gt;http://www.vmware.com/products/server&lt;/span&gt;&lt;/a&gt;] select the distribution type depending on your OS. The guest and the host OS can be completely different, they need not be same there is no relation between them.&lt;br /&gt;
eg: You can install Windows as host and Linux as guest or vice-versa.&lt;br /&gt;
&lt;br /&gt;
You can either create the virtual machines all by yourself using the VMware step-by-step wizard, or download 'appliances' created by others from the VMware site [&lt;a href="http://www.vmware.com/appliances"&gt;&lt;span style="font-family: courier new;"&gt;http://www.vmware.com/appliances&lt;/span&gt;&lt;/a&gt;], this saves you the initial installation effort.&lt;br /&gt;
&lt;br /&gt;
When you create a new VM, you are also asked the default networking connection type. NAT and Bridged are the most common options one selects from. Use NAT if you want the VM to talk within its own subnet only, or Bridged if you want other machines on the same subnet as the host access them.&lt;br /&gt;
eg: Your host machine is on 192.168.10.50&lt;br /&gt;
&lt;blockquote&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Tip: If you installing the guest yourself, you can create one master guest, with all the common applications configured (eg: OpenSSH server would be great to have on all the guests for remote management or java), you'll have to change the host name after that.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;Power up each of the VM's and install the required applications for which they've been set and use them like any other machine on the network.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;    Your source files are versioned on the Revision Control Server&lt;/li&gt;
&lt;li&gt;    Your tests are run nightly on the Cruise Control Server&lt;/li&gt;
&lt;li&gt;    Your team documents the whole project and process on the Wiki, and file bugs in Bugzilla&lt;/li&gt;
&lt;li&gt;    Your MySQL server is used for running the DB &amp;amp; the supporting DBs for other apps (bugzilla, wiki)&lt;/li&gt;
&lt;/ul&gt;These VM's need to be maintained like any other normal physical machine on the network.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 130%; font-weight: bold;"&gt;Pitfalls&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Putting all your eggs in one basket, if the main VMware server fails, all the "machines" (VM's) fail.&lt;/li&gt;
&lt;li&gt;Since the server is dependant on the native OS it sits on, the capabilities of the VMServer is restricted by the OS&lt;/li&gt;
&lt;li&gt;Solution: Use commercial ESX Server or other alternatives&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;Alternatives&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You can use the Xen too for virtualization. I've heard pretty good things about it too, with a few short comings &amp;amp; advantages over VMServer (that's a separate topic all together).&lt;br /&gt;
&lt;br /&gt;
There is an article dedicated to Virtual Machines on Wikipedia, you can refer that depending on your needs and fix upon a solution that suits your needs better&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;Glossary&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Virtualization&lt;/span&gt; - The virtual machine simulates enough hardware to allow an unmodified "guest" OS (one designed for the same CPU) to be run in isolation&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Continuous Integration&lt;/span&gt; - Continuous integration describes a set of software engineering practice's that speed up the delivery of software by decreasing integration times&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Revision Control&lt;/span&gt; - Revision control (also known as version control (system) (VCS), source control or (source) code management (SCM)) is the management of multiple revisions of the same unit of information&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Host OS&lt;/span&gt; - The operating system installed on the physical machine running VMware Server.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Guest OS&lt;/span&gt; - The operating system installed on the virtual machine.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 130%; font-weight: bold;"&gt;Bibliography&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;http://en.wikipedia.org/wiki/Agile_software_development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Xen"&gt;http://en.wikipedia.org/wiki/Xen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=8305397494524192141&amp;amp;postID=6841188937538141017#%20http://en.wikipedia.org/wiki/Comparison_of_virtual_machines"&gt;http://en.wikipedia.org/wiki/Comparison_of_virtual_machines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=8305397494524192141&amp;amp;postID=6841188937538141017#%20http://en.wikipedia.org/wiki/Virtualization"&gt;http://en.wikipedia.org/wiki/Virtualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=8305397494524192141&amp;amp;postID=6841188937538141017#%20%20http://en.wikipedia.org/wiki/Continuous_Integration"&gt;  http://en.wikipedia.org/wiki/Continuous_Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=8305397494524192141&amp;amp;postID=6841188937538141017#%20%20http://en.wikipedia.org/wiki/Revision_control"&gt;  http://en.wikipedia.org/wiki/Revision_control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=8305397494524192141&amp;amp;postID=6841188937538141017#%20%20http://it20.info/blogs/main/archive/2007/11/26/83.aspx"&gt;  http://it20.info/blogs/main/archive/2007/11/26/83.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=8305397494524192141&amp;amp;postID=6841188937538141017#%20http://mysql-dba-journey.blogspot.com/2007/11/mysql-and-vmware.html"&gt;http://mysql-dba-journey.blogspot.com/2007/11/mysql-and-vmware.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-7416587889496435633?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MTnGKwJDES84Xc4Ri7PCjEQsrlo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MTnGKwJDES84Xc4Ri7PCjEQsrlo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MTnGKwJDES84Xc4Ri7PCjEQsrlo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MTnGKwJDES84Xc4Ri7PCjEQsrlo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2008/06/agile-environment-using-virtualization.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-1237799671135757929</guid><pubDate>Thu, 19 Mar 2009 04:31:00 +0000</pubDate><atom:updated>2010-01-21T17:17:23.076-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">technical</category><title>DWR &amp; Hibernate Lazy Loading</title><description>&lt;span id="goog_1256672377674"&gt;&lt;/span&gt;&lt;span id="goog_1256672377675"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;Time immemorial, we are all aware about the famous lazy load exceptions in Hibernate. Using a detached object does not exactly hide us from the issue. We are using &lt;a href="http://directwebremoting.org/"&gt;DWR&lt;/a&gt; in our application and found that when marshalling (or unmarshalling if you insist) a detached object to JSON, DWR was erratically trying to call a null (lazyly loaded) object, causing LazyLoadExceptions.&lt;br /&gt;
&lt;br /&gt;
We did not want to use &lt;a href="https://www.hibernate.org/43.html"&gt;OpenSessionInViewFilter&lt;/a&gt; as it is evil (some day I'll post all the consolidated rantings as one). You can google and find a lot of info around it.&lt;br /&gt;
&lt;br /&gt;
As a quick fix we did what one would first think of, "It's a demo, just eager load it!". Well the demo was over and now was the time to investigate a better solution, and we did find it.&lt;br /&gt;
&lt;br /&gt;
It was no rocket science, the solution was available in front of us all along, we just did not look hard enough. When using DWR, there are BeanConverters available which are responsible for this marshalling process. There was one for Hiberante, called "hibernate3". &lt;a href="http://directwebremoting.org/dwr/server/hibernate"&gt;http://directwebremoting.org/dwr/server/hibernate&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;The HibernateBeanConverter tries to avoid reading from un-initialized properties. (If you just want something that blindly reads everything then just use a plain BeanConverter).&lt;br /&gt;
&lt;/blockquote&gt;Bingo, so when exporting a detached hibernate object to DWR, use type="hibernate3" and that should resolve the lazy load issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-1237799671135757929?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/53vXOkIGgrg8VHO05sdytuhmadQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/53vXOkIGgrg8VHO05sdytuhmadQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/53vXOkIGgrg8VHO05sdytuhmadQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/53vXOkIGgrg8VHO05sdytuhmadQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2009/03/dwr-lazy-loading.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-5589894475885911749</guid><pubDate>Sun, 08 Feb 2009 18:22:00 +0000</pubDate><atom:updated>2009-10-27T15:36:45.359-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">technical</category><title>By Contract or By Convention</title><description>Should we be using interfaces for everything and making everyone explicitly implement them or should we trust that everyone follows the same convention.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;By Contract&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
For use cases, where a certain contracts needs to be followed, we should use interfaces, this allows easier testing and loose coupling of implementation, allowing us more flexibility to change the implementation at run time as asked for.&lt;br /&gt;
&lt;br /&gt;
eg: UserService interface has a method fetchUser();&lt;br /&gt;
We can have two implementations for this service method, one using a DAO and other the WebService. Thus the implementation is loose and "the contract" is set to return a User.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;By Convention&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In certain cases, we cannot implement a contract, esp where the concerns span across multiple layers of the app. This is when we need to define convention over contract. AOP is the perfect use case where this needs to be strictly followed.&lt;br /&gt;
&lt;br /&gt;
Let's consider the service methods which fetch information for displaying info to the front end. They need to have a specific security restriction associated with it, or a use case where we need to assign "READ_ONLY" rights to certain users for an object. In order to keep the code as decoupled as possible we use AOP, which apply concerns on these methods, without having actual references in the code.&lt;br /&gt;
For these concerns to be properly applied, we need to follow conventions.&lt;br /&gt;
&lt;br /&gt;
eg: All DAOs should persist an object using the create() method only, that ways we can add a concern to block access to all create() methods for a group of user. If someone plans to "be different" and follow their own convention, like calling the method persist(), this can open up a huge security hole in the application. The AOP concern will skip "persist()" as it does not follow convention. Such issues will not be caught unless there is a proper code review performed on the code base, or we have really really strong test case.&lt;br /&gt;
&lt;br /&gt;
If your module needs to follow a convention, which cannot be controlled using a contract, please document it, so as the team can follow is correctly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-5589894475885911749?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vVFBCKHCKJk30JCkJGFOkfOSjEM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vVFBCKHCKJk30JCkJGFOkfOSjEM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vVFBCKHCKJk30JCkJGFOkfOSjEM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vVFBCKHCKJk30JCkJGFOkfOSjEM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2009/02/by-contract-or-by-convention.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-7641814255759544910</guid><pubDate>Mon, 02 Feb 2009 04:44:00 +0000</pubDate><atom:updated>2010-01-21T17:17:11.585-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">technical</category><title>2 DTO or not 2 DTO</title><description>Since the new project began I've been think about this over and over again reading as many posts and taking ideas from different posts and blogs. The more I read, the less I knew. Below is a collection of few links I've come across which have some conclusive and non-conclusive decisions/arguments, some of these post lean towards POJO's and some towards DTO(Data Transfer Object). Frankly I was not been able to convince myself on what to use. (Leaning more towards POJO's as detached objects).&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://forum.springframework.org/archive/index.php/t-27716.html"&gt;http://forum.springframework.org/archive/index.php/t-27716.html&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://forum.springframework.org/showthread.php?t=11338"&gt;http://forum.springframework.org/showthread.php?t=11338 &lt;/a&gt;&lt;br /&gt;
&lt;a href="http://forum.springframework.org/showthread.php?t=9810"&gt;http://forum.springframework.org/showthread.php?t=9810 &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.hibernate.org/124.html"&gt;http://www.hibernate.org/124.html &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://api.blogs.com/the_catch_blog/2005/05/protecting_the_.html"&gt;http://api.blogs.com/the_catch_blog/2005/05/protecting_the_.html&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://hookom.blogspot.com/2004/12/corporate-developer.html"&gt;http://hookom.blogspot.com/2004/12/corporate-developer.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here is a small tutorial talking about how to develop using POJO's. Makes you think the non-EJB2 way. (Reading this is strongly recommended)&lt;br /&gt;
Part 1 -&lt;a href="http://www.developer.com/java/ejb/article.php/3590731"&gt; http://www.developer.com/java/ejb/article.php/3590731&lt;/a&gt;&lt;br /&gt;
Part 2 - &lt;a href="http://www.developer.com/java/ejb/article.php/3592341"&gt;http://www.developer.com/java/ejb/article.php/3592341&lt;/a&gt;&lt;br /&gt;
Part 3 - &lt;a href="http://www.developer.com/java/ejb/article.php/3594121"&gt;http://www.developer.com/java/ejb/article.php/3594121&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Since EJB3 is more revolutionary and uses POJO's unlike remoting in EJB2, here is a link from the sun java forums&lt;br /&gt;
&lt;a href="http://forums.sun.com/thread.jspa?threadID=5302559"&gt;http://forums.sun.com/thread.jspa?threadID=5302559&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I strongly recommend everyone to read these articles before choosing. My brains had been deep fried already reading these before trying to reach any conclusion. I wanted some other heads to think about these issues and post in their opinions.&lt;br /&gt;
&lt;br /&gt;
Some points where I played the devil's advocate and jotted my concerns with arguments before we said 'I do' to DTO or POJO.&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;ProDTO&lt;/span&gt;: DTO will shield the UI if there are any model changes&lt;br /&gt;
Argument: Either ways we'll have to modify the DTO, the marshaller/unmarshaller to propagate these changes from the POJO to DTO. DTO does not eliminate the problem completely, but obfuscates or hides it.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;ProDTO&lt;/span&gt;: Our service layer shall talk to various 'services' webUI or web Service or RMI or Star Trek, so we need DTOs to provide loose coupling and don't want the service to expose the domain object directly.&lt;br /&gt;
Argument: We will use XML (WSDL or SOAP or RestFUL or &lt;add-a-buzz-word&gt;) for data transfer, which will involve marshalling/unmarshalling of the XML to DTO and then POJO &amp;amp; vice-versa, any changes will again have to propagated. through all the layers. We are just exposing the POJO to the XML transformer, not the DAO calls. The POJO by itself cannot persist if in a detached state. Unless we have a usecase of just exposing half the object to the webservice (do we have a usecase?)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;ProPOJO&lt;/span&gt;: Less effort, lean and clean design, any changes will propagate at multiple places and will provide less points of transformation errors.&lt;br /&gt;
Argument: The inner implementation of the POJO with the Data model needs to be changed, but the view/web service does not have to change the implementation. We have to make the changes in these layers even if we don't have to, there by adding more work and complexity.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;ProPOJO&lt;/span&gt;: No over head of transforming POJO to DTO and vice-versa. Less memory consumption.&lt;br /&gt;
Argument: It's a good practice to separate your business objects and data objects, provides better decoupling.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Anti-POJO&lt;/span&gt;: Handling Lazy Initialization of hierarchical objects, no openSessionInView Filter for ExtJS.&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Anti-DTO&lt;/span&gt;: Locking of objects for optimistic locking. DTO's are not aware of the revision.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt; Use POJOs as detached objects where basic CRUD calls are required and for fetching objects with minimum hierarchy, but if you need to fetch loads of info from different tables with a very small subset of columns from each, then use HQL + DTO&lt;br /&gt;
&lt;/add-a-buzz-word&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;code&gt;Select new com.vtech.model.dto.CompanyEmployee(bla bla bla);&lt;/code&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-7641814255759544910?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QndEZuHHmGRSCH4OyfzCqp2RkUU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QndEZuHHmGRSCH4OyfzCqp2RkUU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QndEZuHHmGRSCH4OyfzCqp2RkUU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QndEZuHHmGRSCH4OyfzCqp2RkUU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2009/02/2-dto-or-not-2-dto.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-2958785204722996758</guid><pubDate>Mon, 04 Aug 2008 18:25:00 +0000</pubDate><atom:updated>2010-01-21T17:18:01.893-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CFA Level I</category><title>iPhone &amp; CFA</title><description>I've enrolled myself for the Level I CFA exam in December '08. Studying on and off, depending on the schedule and time availability. Off late I stumbled upon &lt;a href="http://www.senfinance.com/"&gt;SenFinance&lt;/a&gt; an interesting site full of Accounting and Quantitative tutorials for CFA Level I.&lt;br /&gt;
&lt;br /&gt;
I downloaded them all and wanted to view them on my way to work (a 20 minute train travel is good to study). So I got my hands on &lt;a href="http://www.erightsoft.com/SUPER.html"&gt;SUPER®&lt;/a&gt; which is an amazing software to convert any one video or auto file to another format. Now I finally have the tutorials in mp4 format and can study on my way to work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-2958785204722996758?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ap6OOminaDqqc44gNCTL8l5HOVE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ap6OOminaDqqc44gNCTL8l5HOVE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ap6OOminaDqqc44gNCTL8l5HOVE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ap6OOminaDqqc44gNCTL8l5HOVE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2008/08/iphone-cfa.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-1735229739502898815</guid><pubDate>Wed, 30 Jul 2008 19:59:00 +0000</pubDate><atom:updated>2010-01-21T17:11:27.534-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">technical</category><title>Setting up a PHP development environment on your local system</title><description>This is an old post I had written on google docs, before VMware Server was free for the general user. Thought could be still more relevant to the general developer for testing in Linux envoirment. VMPlayer I beleive is lighter than VMware Server.&lt;br /&gt;
&lt;br /&gt;
There are 2 stages of setting up the development &amp;amp; testing environment for yourself. The preferred work environment is Linux. If you already on Linux then you can safely skip Stage I, you can directly proceed to Stage II, also if you have Linux already installed, just cross check if you have the LAMP (Linux + Apache + MySQL + PHP) server installed.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Pre Installation Software Download Links&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.vmware.com/download/player/"&gt;http://www.vmware.com/download/player/&lt;/a&gt; [VMPlayer]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ubuntu.com/getubuntu/download"&gt;http://www.ubuntu.com/getubuntu/download&lt;/a&gt; [Ubuntu]&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;STAGE I: Setting up Ubuntu on VMWare.&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Download Ubuntu/Xubuntu/Kubuntu Desktop edition ISO, what ever you like... all the same just different filemanagers (Gnome/Xfe/KDE resp.). If you are comfortable with command line, then you can also install the Server edition with no XWindows and only commandline.&lt;/li&gt;
&lt;li&gt;Download and install VMPlayer for your system.&lt;/li&gt;
&lt;li&gt;Download qemu for your operating system and extract in any directory you like.&lt;/li&gt;
&lt;li&gt;Open your commandline to go ahead to bin folder of qemu and type &lt;/li&gt;
&lt;/ul&gt;&lt;pre&gt;&lt;code&gt;qemu-img create -f vmdk ubuntu.vmdk 3G&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Here we are creating a 3GB, virtual hard drive in VMWare format. This file will now act as our hard drive for VMWare to install an OS on it. The name of the file is ubuntu.vmdk, you can name it what ever you wish to.&lt;/li&gt;
&lt;li&gt;Now the main vmx file (The VMWare configuration file). change the highlighted paths as per your system.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;pre&gt;&lt;code&gt; #!/usr/bin/vmware
config.version = "8"
virtualHW.version = "4"
ide0:0.present = "TRUE"
ide0:0.filename = "ubuntu.vmdk"
# The amount of RAM you want to allot to the Operating system. For Desktop use 512 and server just 256.
memsize = "512"
MemAllowAutoScaleDown = "FALSE"
ide1:0.present = "TRUE"

#ide1:0.fileName = "auto detect"
#ide1:0.deviceType = "cdrom-raw"

ide1:0.fileName = "ubuntu-7.04-server-i386.iso"
ide1:0.deviceType = "cdrom-image"

ide1:0.autodetect = "TRUE"
floppy0.present = "FALSE"
ethernet0.present = "TRUE"
usb.present = "TRUE"
sound.present = "TRUE"
displayName = "Ubuntu LAMP Server"
guestOS = "ubuntu"
nvram = "ubuntu-server-three.nvram"
MemTrimRate = "-1"

ide0:0.redo = ""
ethernet0.addressType = "generated"
uuid.location = "56 4d ce 99 e0 d2 2b bf-73 47 ac 62 65 13 57 86"
uuid.bios = "56 4d ce 99 e0 d2 2b bf-73 47 ac 62 65 13 57 86"

tools.syncTime = "TRUE"
ide1:0.startConnected = "TRUE"

uuid.action = "create"

checkpoint.vmState = "ubuntu-lamp-server.vmss"

isolation.tools.hgfs.disable = "TRUE"
virtualHW.productCompatibility = "hosted"
tools.upgrade.policy = "manual"

tools.remindInstall = "TRUE"

usb.autoConnect.device0 = ""
&lt;/code&gt;&lt;/pre&gt;
&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;After setting all the paths correctly, if you have VMPlayer installed, just save the vmx file, (call it ubuntu.vmx) and double click on the file.&lt;/li&gt;
&lt;li&gt;If all the paths are set correctly, the VMPlayer will boot up the virtual drive and show the ubuntu installation menu. This is easier than windows a million times.&lt;/li&gt;
&lt;li&gt;At the end of the installation (server or desktop) the process will ask you, if you want to install LAMP server. Select it and let it install the LAMP server.&lt;/li&gt;
&lt;li&gt;Reboot the system, and you are good to go. You have successfully installed Ubuntu on VMWare.&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;STAGE II: Check the configuration setup of Apache/MySQL/PHP&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Now we'll check if PHP and Apache have been successfully installed on your system. Go the /var/www folder, you should be seeing a apache2-default folder out there. If you see these then apache seems to be installed. Just open the browser and type http://localhost you should be able to see the apache-default folder over there. If you a receive a page not found then apache is not running or installed properly.&lt;br /&gt;
&lt;br /&gt;
If things look good, next stage is to check PHP installation. Create a file named index.php and type the following there.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;?php phpinfo(); ?&amp;gt; &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Just refresh the localhost (place the file in /var/www) That should give you loads of PHP info on the screen in blue, purple and a huge table. If that happens you are good to go!!! Else something is wrong!!!.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;   MySQL Check&lt;/span&gt;&lt;br /&gt;
Open the command line and type&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;mysql -uroot&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
If it opens up with a mysql&amp;gt; prompt then it's good else something is wrong. Your mysql password is blank.&lt;br /&gt;
&lt;br /&gt;
If all sounds good, now go to Stage III&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;STAGE III: Applications to setup.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Download&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;JOOMLA&lt;/li&gt;
&lt;li&gt;WORDPRESS&lt;/li&gt;
&lt;/ul&gt;Extract them to the /var/www folders and access them using &lt;a href="http://localhost/joomla"&gt;http://localhost/joomla&lt;/a&gt; and &lt;a href="http://localhost/wordpress"&gt;http://localhost/wordpress&lt;/a&gt; respectively if you extracting them to the folders on these names.&lt;br /&gt;
&lt;br /&gt;
How to go about setting them, start the index.php or read the readme file and you should be good to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-1735229739502898815?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_LGz05kD2idWGwM2WTVPAfDe6zQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_LGz05kD2idWGwM2WTVPAfDe6zQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_LGz05kD2idWGwM2WTVPAfDe6zQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_LGz05kD2idWGwM2WTVPAfDe6zQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2008/07/setting-up-php-development-environment.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3416015228970774796.post-5651406123989205763</guid><pubDate>Sun, 13 Jul 2008 23:30:00 +0000</pubDate><atom:updated>2010-01-21T17:16:47.220-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">technical</category><title>Duplicate file finder</title><description>Disk space is cheap, starting from a 1.2GB hard drive from my first computer to a "spare" 500GB external hard drive, cheap data storage has come a long way. I click a lot of photographs ever since I got my first digital camera, and I store a lot of these photos too (locally), now since 2006 I have over 201,608 photos and some videos. My camera photo number counter has reset twice!!&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;A few days back I decided to hand over my drive to my brother, since he was leaving soon, I dumped all the stuff on my two laptops, and forgot about them. Of late my wife asked me to pick up good nice pics so we can print them. That's when I realized I had a lot of duplicate photos, now the simplest idea was to find the duplicate file names and delete them, but that was not possible, since I had already reset the counter so I technically had 3 files with the same name and atleast 10,000 of them!!&lt;br /&gt;
&lt;br /&gt;
MD5 to the rescue. Since all the photos and movies are binary files, MD5 seemed ideal to me...&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;MD5 digests have been widely used in the software world to provide some assurance that a transferred file has arrived intact. For example, file servers often provide a pre-computed MD5 checksum for the files, so that a user can compare the checksum of the downloaded file to it.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
So I started my eclipse and churned out a program to scan my HDD and compare MD5 keys and find all duplicates.&lt;br /&gt;
&lt;br /&gt;
The method below generates the MD5 checksum for any file&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;  private static String generateMD5(String path) throws IOException {
MessageDigest digest;
InputStream is = null;
try {
digest = MessageDigest.getInstance("MD5");
is = new FileInputStream(new File(path));
byte[] buffer = new byte[8192];
int read = 0;

while((read = is.read(buffer)) &amp;gt; 0) {
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
return bigInt.toString(16);
} catch(NoSuchAlgorithmException e) {
e.printStackTrace();
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
} finally {
is.close();
}
return null;
}
&lt;/code&gt;&lt;/pre&gt;Then go ahead and get a list of all the files on your system&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
missed the code
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
And finally run the main method.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;public static void main(String[] args) throws Exception {
List filePaths = new ArrayList();
File file = new File("/home/varun/workbench/duplicates.csv");
FileWriter fw = new FileWriter(file);
SortedMap duplicates = new TreeMap();
filePaths = generateFileMap("/mnt/datastorage/photos", filePaths);
for(String path : filePaths) {
String hash = generateMD5(path);
if(duplicates.containsKey(hash)) {
fw.write(path + "," + duplicates.get(hash) + "\n");
} else {
duplicates.put(hash, path);
}
}
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
So go ahead and run this, you can also extend it to generate a list of any kind of duplicate files. Average file size is 1.5 - 2.0 MB&lt;br /&gt;
&lt;br /&gt;
The output file when viewed on Open Office, Google Docs or Excel looks like this&lt;br /&gt;
&lt;br /&gt;
This is how the output looks like this. It shows you which file a duplicate of which other file.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;/mnt/datastorage/Photos/2008/Photos/Halloween NYC 2007/DSC01958.JPG /mnt/datastorage/Photos/2008/Photos/SORT ME/DSC01958.JPG
/mnt/datastorage/Photos/2008/Photos/Halloween NYC 2007/DSC01959.JPG /mnt/datastorage/Photos/2008/Photos/SORT ME/DSC01959.JPG
/mnt/datastorage/Photos/2008/Photos/Halloween NYC 2007/DSC01960.JPG /mnt/datastorage/Photos/2008/Photos/SORT ME/DSC01960.JPG&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; Ran the program with SHA algorithm also and here are the comparison times.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Time for MD5 858,953ms (14.31 minutes)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Time for SHA 1,191,656ms (19.80 minutes)&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Bibliography&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/MD5#Applications"&gt;http://en.wikipedia.org/wiki/MD5#Applications &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Md5sum"&gt;http://en.wikipedia.org/wiki/Md5sum &lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3416015228970774796-5651406123989205763?l=www.protonfever.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kvTcm3F5XD6-AX0-OzzO-GvlUuo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kvTcm3F5XD6-AX0-OzzO-GvlUuo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kvTcm3F5XD6-AX0-OzzO-GvlUuo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kvTcm3F5XD6-AX0-OzzO-GvlUuo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.protonfever.com/2008/07/duplicate-file-finder.html</link><author>noreply@blogger.com (Varun Mehta)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item></channel></rss>
