<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5308859</id><updated>2011-04-21T12:34:10.378-07:00</updated><title type='text'>Codeworks::code and stuff</title><subtitle type='html'>A place where I attempt at writing shit that might be useful for people and also keep track of shit that happens in my life.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeworks.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5308859.post-105841354059252587</id><published>2003-07-16T20:45:00.000-07:00</published><updated>2003-07-16T20:45:40.443-07:00</updated><title type='text'></title><content type='html'>Programming languages galore. Need a cross platform , easy to learn language ?&lt;br /&gt;&lt;br /&gt;Try &lt;a href="http://www.rapideuphoria.com/hotnew.htm"&gt;Euphoria&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-105841354059252587?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/105841354059252587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/105841354059252587'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_07_13_archive.html#105841354059252587' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-105841110143673071</id><published>2003-07-16T20:05:00.000-07:00</published><updated>2003-07-16T20:05:01.350-07:00</updated><title type='text'></title><content type='html'>New php based blogging software. This looks kewl.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bblog.com/"&gt;http://www.bblog.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Checkout the features : &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Smarty centric. That is bBlog uses smarty for templates, plugins, and as much as possable other parts of Smarty.&lt;br /&gt;# Template driven with easy templates.&lt;br /&gt;# Plugins to change the way text is formatted, and to provide other features.&lt;br /&gt;# Metaweblog compatible xml-rpc server ( so you can use w.bloggar ).&lt;br /&gt;# Included plugins:&lt;br /&gt;&lt;br /&gt;    * Threaded comments&lt;br /&gt;    * BBCode&lt;br /&gt;    * Textile&lt;br /&gt;    * Calendar&lt;br /&gt;    * Blogroll&lt;br /&gt;    * Referers&lt;br /&gt;    * ... more to come &lt;br /&gt;&lt;br /&gt;# OO style coding, to be fast, clean ( easy to modify ) and secure.&lt;br /&gt;# Nice Looking :)&lt;br /&gt;&lt;br /&gt;And it does look really nice :)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-105841110143673071?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/105841110143673071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/105841110143673071'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_07_13_archive.html#105841110143673071' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-105824116948528850</id><published>2003-07-14T20:52:00.000-07:00</published><updated>2003-07-14T21:09:51.453-07:00</updated><title type='text'></title><content type='html'>Its been some time. Somewhere less then a month. I apologise for the cob webs, and please don't mind the cracks in the paint. Nonetheless, I am back and I hope to get some shit going. Lot has changed since the last I blogged. Among them include &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I have moved out&lt;/strong&gt; : Although it was great to have free laudary and cleaning services , the drive to and back from work was killing. We (me and Bots) now rent a room close to the office. This allows me to go back at 7:00pm , get a nap, come back to the office at about 10:00pm , code till 2:00 am , head back , get some rest and be in the office again at about 9:30- 10:00 am. Excellent :)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;I adjudicated the finals of the &lt;/strong&gt; &lt;a href="http://www.mmuaustrals.com"&gt;MMUAUstrals 2003&lt;/a&gt; : This ate up almost a week. But it was great. I managed to exorsicise many a debating demons through this and it felt much better. At least I have contributed to some major competition and etched my name in the debating archives.  It was alot better then when I was a puppet adjudicator during the Asians 2000. Puppet in the sense that I knew nuts about adjudication and it was my mentor (who was Deputy Chief Adjudicator ) who was running the show. Moreover , this competition we even had an IT round with the following motions:&lt;br /&gt;&lt;br /&gt;1.This house believes that Open Source is a clear and present danger to capitalism.&lt;br /&gt;2.This house believes that software companies should be financially liable for bugs in their software.&lt;br /&gt;3.This house believes that employers have the right to check employees email.&lt;br /&gt;&lt;br /&gt;I was in a round where they did the 2nd motion. There was an abovious lack of material (these are all primarily arts and law students) but they had the arguments heading the right way. Issues discussed included the fact that there is a vicious&lt;strong&gt; release first - test later&lt;/strong&gt; attitude in the software world due to the fact that features sell. Hence ensuring that there is a financial detriment attached to bugs will slow and hopefully reverse this cycle. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I am developing on a windows 98 machine&lt;/strong&gt; : I don't wanna go off on a rant but this totally sucks. Why then you ask ? Well because I have 2 products I am working on that HAS to get out the door by end of this month. Since Windows 98 is the lowest common denominator, and most businesses run it still, I have to ensure that the bloody apps work on it best. Working on my RedHat and testing on Bots XP justs didnt cut it. There were some aspects of the apps that would work on XP but not on 98 and that totally sucked. Sucked more then working on Windows 98 :(.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I am a lot fatter&lt;/strong&gt; : Blame it on the booze, rich breakfast and a bad case of fucking laziness folks. I gotta hit the joggers again. Gotta get the routine again.&lt;br /&gt;&lt;br /&gt;Well thats for now. I just needed to get that out of the system.&lt;br /&gt;&lt;br /&gt;See you guys soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-105824116948528850?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/105824116948528850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/105824116948528850'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_07_13_archive.html#105824116948528850' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-96004473</id><published>2003-06-24T21:28:00.000-07:00</published><updated>2003-06-24T21:33:13.000-07:00</updated><title type='text'></title><content type='html'>Its been way too long since I last blogged. &lt;br /&gt;&lt;br /&gt;The crap maintenance work is getting to me , getting to most of us. Hardly anytime is spent coding, time is instead spent fire fighting bullshit like Symantec AntiVirus Servers that refuse to start, fixing fucked up Windows ME (the worst Windows version ever), upgrading Windows 2000 workstations, handling problems due to flaky TMNet DNS servers (domains resolve only 3 out of 10 times) , reinstalling  Office XP due to Windows ME registry fuck-ups, redeploying Symantec AntiVirus Clients due to Symantec AntiVirus Server reinstalls, troubleshooting BRAND NEW ADSL modems which don't work (this took 12 hours, we didnt know if the problem was the modem, the line , the Windows ME[again!] or the Network card: turned out it was the OS and the Modem), dealing with dumb ass support from TM Net for ADSL and dealing with customers who need to purchase software and hardware.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fuck.&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-96004473?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/96004473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/96004473'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_22_archive.html#96004473' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95784595</id><published>2003-06-18T01:57:00.000-07:00</published><updated>2003-06-18T02:02:17.000-07:00</updated><title type='text'></title><content type='html'>Learning new languages.&lt;br /&gt;&lt;br /&gt;Many programming languages, share common aspects. We see languages sharing common ground in terms of is Object Orientation implementation (inheritance ,abstract objects, intefaces,polymorphism) the way it is run, (i.e. interpretatated or compiled), the type of control commands it supports (i.e. for,foreach,if ,break etc), the usage of delimeters (i.e. () {} ; ' ' etc) and many more. &lt;br /&gt;&lt;br /&gt;Hence it makes a lot of sense of learning new languages by mapping aspects of languages you already know. This allows you to build up the basics of the new language you are learning faster and then work in the unique features of the language later.&lt;br /&gt;&lt;br /&gt;Some people argue that , instead of coding using the plus points of the new language , you end up coding as you would in the language you used as the spring board. For example I have read about situations where C programmers, coding in C++ without really cashing on the plus points of C++.&lt;br /&gt;&lt;br /&gt;Although this might very well be true I believe the primary reason why this happened was more due to the fact that between C and C++ there is a major paradigm (I hate that word) change. You are moving from a procedural coding methodology to one that is Object based. (And lets leave the discussion that you can code OO in C for another day) Would this necessarilly be the case if you are moving between Object languages? The effect would be much less. I don't think so.&lt;br /&gt;&lt;br /&gt;Naturally effort would be required on the part of the coder dude to learn up the new languages plus points to leverage its benefits. &lt;br /&gt;&lt;br /&gt;I have tried doing this for the Python language and I did manage to get a grasp of the language at reasonable speed. I attribute this primarily also to the book I was using while trying to grasp Python, and best of all its available online. Mark Pilgrim's excellent &lt;a href="http://diveintopython.org"&gt;Dive into Python&lt;/a&gt;. It adopts an approach of relating aspects of Python to theequivalent or somewhat equivalents aspects of other languages such as Java ,C and C++.&lt;br /&gt;&lt;br /&gt;Where it also shines is in showing where what might seem like similar functiality in other languages, is actually not. This definately helps from letting you fall into an icky pool of confusion.&lt;br /&gt;&lt;br /&gt;Another great source for learning this excellent language(and many other languages actually) is &lt;a href="http://pleac.sourceforge.net/"&gt;PLEAC - Programming Language Examples Alike Cookbook&lt;/a&gt;. Ill let the site explain what it provides &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Following the great Perl Cookbook (by Tom Christiansen &amp; Nathan Torkington, published by O'Reilly) which presents a suite of common programming problems solved in the Perl language, this project aims to gather fans of programming, in order to implement the solutions in other programming languages.&lt;br /&gt;&lt;br /&gt;If successful, this project may become a primary resource for quick, handy and free reference to solve most common programming problems using higher-level programming languages, and for comparison on ease-of-use and power/efficiency of these languages. &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;There you go. Now go and learn a language today :)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95784595?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95784595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95784595'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_15_archive.html#95784595' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95766127</id><published>2003-06-17T13:36:00.000-07:00</published><updated>2003-06-17T13:38:17.000-07:00</updated><title type='text'></title><content type='html'>Its been sometime since I have posted. A good deal of laziness and a block of 'koteh-jobs' have resulted in me not having the time to code , read or blog. Nonetheless, I hope to have more time soon.&lt;br /&gt;&lt;br /&gt;There are several things happening:&lt;br /&gt;&lt;br /&gt;The application I have been working on is near feature complete for the first beta. Now what I need to do is work out the UI kinks , cross plaform GUI headaches, refactor lots of hurried code and ensure it has an easy to use installer which will allow for a self contained installation. &lt;i&gt;Shit&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I have been using &lt;a href="http://www.reportlab.com"&gt;Reportlab&lt;/a&gt; and I must say, its an excellent piece of software. Ill be writing a short howto on how to generate simple business documents (such as invoices,bill,quotes etc.) using it soon. It won't be too much of interest for the intermediate or advance Reportlab user , but it might help some beginners like myself.&lt;br /&gt;&lt;br /&gt;On other fronts , I am also trying to help put with a local comunity effort to promote Malaysian blogs through the development of a publicly managed OPML list of all Malaysian blogs that will allow &lt;a hreh="http://www.feedster.com"&gt;Feedster&lt;/a&gt; to do searches for Malaysian only blogs. The &lt;a href="http://www.gathani.org"&gt;Walrus&lt;/a&gt; got his eyes set on making a search engine , ultra kewl. I hope to spend some time on this soon too, if I can find any :).&lt;br /&gt;&lt;br /&gt;So, there we go , the shits lined up, lets see where I can go from here.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95766127?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95766127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95766127'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_15_archive.html#95766127' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95656315</id><published>2003-06-14T01:25:00.000-07:00</published><updated>2003-06-14T01:46:06.000-07:00</updated><title type='text'></title><content type='html'>I have been looking into a bayesian spam filtering solution. Not knowing much about it I have been doing some basic reserach. Here are some links to those who might find it of interest:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.paulgraham.com/better.html"&gt;Paul Graham: Better Bayesian Filtering &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.paulgraham.com/spam.html"&gt;Paul Graham: A plan for spam&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://christophe.delord.free.fr/en/popf/index.html"&gt;PopF -- POP3 Spam Filter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://magix.fri.uni-lj.si/orange/"&gt;Orange&lt;/a&gt;:is a component-based data mining software. It includes a range of preprocessing, modelling and data exploration techniques.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.divmod.org/Reverend/gs.html"&gt;EZ Bayesy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.divmod.org/Reverend/"&gt;Reverend&lt;/a&gt;:is a general purpose Bayesian classifier&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95656315?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95656315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95656315'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_08_archive.html#95656315' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95582508</id><published>2003-06-12T01:19:00.000-07:00</published><updated>2003-06-12T01:19:59.610-07:00</updated><title type='text'></title><content type='html'>Need some kewl Malaysian blogs to checkout? Checkout the &lt;a href="http://www.petalingstreet.org/"&gt;Project Petaling Street&lt;/a&gt; site. Its an aggregation of Malaysian blogs from across many genres. Very kewl indeed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95582508?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95582508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95582508'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_08_archive.html#95582508' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95579371</id><published>2003-06-11T22:45:00.000-07:00</published><updated>2003-06-11T22:48:43.000-07:00</updated><title type='text'></title><content type='html'>Anybody got an Apple Powerbook they would like to get rid off ? :) &lt;br /&gt;&lt;br /&gt;Apple is &lt;a href="http://www.inluminent.com/weblog/archives/apple_g5_rumors.php"&gt; rumoured&lt;/a&gt; to be releasing new G5 machines soon. So if there are people out there who are interested in making a jump and want to get rid of their 17inch G4 Powerbooks, please contact me at saradiya@TAKE_THIS_OUT.ameba6.com. &lt;br /&gt;&lt;br /&gt;Why Macs ? Why the hassle of expensive software , hardware, minimal support (in relative terms to PC support at least) , especially in Malaysia ?&lt;br /&gt;&lt;br /&gt;Well, I have always been a sucker for non-IBMPC based machines.I started out with an &lt;a href="http://apple2history.org/"&gt;Apple II&lt;/a&gt; AT computer class at 7 and then went on to use an &lt;a href="http://www.amiga.com"&gt; Amiga&lt;/a&gt;. I used to use an &lt;a href="http://amiga.emugaming.com/a500.html"&gt;Amiga 500&lt;/a&gt; which I got in 1989 then I moved on to an &lt;a href="http://amiga.emugaming.com/a1200.html"&gt; Amiga 1200 &lt;/a&gt; which I got in 1993. I used to be devoted to those machines. I used my Amiga all the way till 1999 before selling out to the PC. Some of the fire was rekindled however when I got Linux running on my machine. Using a Mac might bring back fond memories of a 'different programming/computing environment'. That would be sweet.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95579371?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95579371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95579371'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_08_archive.html#95579371' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95578847</id><published>2003-06-11T22:25:00.000-07:00</published><updated>2003-06-11T22:25:01.830-07:00</updated><title type='text'></title><content type='html'>The stock market is moving up, SARS is less a scare, business types (apart for the ones getting awarded large contracts by the US in Iraq) don't care about Iraq anymore. Hey things seem to be actually looking up. After 3 years of a bearish stance , people seem poised for a new breath of economic life. Whats your organization doing to ride the next cycle ? (If there is gonna be one :) )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95578847?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95578847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95578847'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_08_archive.html#95578847' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95472574</id><published>2003-06-09T10:36:00.000-07:00</published><updated>2003-06-09T10:39:57.000-07:00</updated><title type='text'></title><content type='html'>Turn yourselves on.&lt;br /&gt;&lt;br /&gt;&lt;img src=http://members.lycos.co.uk/p123t/power_switch.jpg border=0 alt="Turn yourselves on."&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95472574?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95472574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95472574'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_08_archive.html#95472574' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95458017</id><published>2003-06-09T02:48:00.000-07:00</published><updated>2003-06-09T03:13:05.000-07:00</updated><title type='text'></title><content type='html'>Customization, can we ever get it right?&lt;br /&gt;&lt;br /&gt;Product customization is inevitable if you are providing applications catered for industry. Some  developers can afford to deny their customers customization and tell them to go shove it. Others can't. &lt;br /&gt;&lt;br /&gt;Those 'others' gotta deal with some pretty sticky issues such as :&lt;br /&gt;&lt;br /&gt;-It requires requirement analysis , which is a black art. Your customers never really know what they want, but they somehow always know what they don't want. Shit hits the fan when what they don't wan't happens to be that bunch of code you have been working on for the last month.&lt;br /&gt;&lt;br /&gt;-It requires a cost estimate. Without really knowing what they want , estimatng cost is tougher then trying to wank off a bad Nazi German porn flick. &lt;i&gt;Bill for work done then!.&lt;/i&gt; Tough. Malaysian business climate and style does not necessarily favour providers who can't produce the numbers first.&lt;br /&gt;&lt;br /&gt;-It requires you to maintain seperate trees of applications. When work and upgrades are done on the code , there is the problem of trying to ensure that your patches apply across all the customizations you have done for all your clients.&lt;br /&gt;&lt;br /&gt;-It requires charm, strength and common sense. Customers , once they get the ball running, can demand for ridiculous changes. It takes both tact and intelligence to deal with finding the balance between satisfying your customers and satisfying your programming team which have already taken up residence in the cubicles.&lt;br /&gt;&lt;br /&gt;How can we deal with customization?&lt;br /&gt;&lt;br /&gt;-Have a freaking large test suite. Its been said again and again and again, but it never can be said enough. Test , test and test. Especially if you know that your product will be one that would need customization. This will allow you to manage the change and customization through the test suites.&lt;br /&gt;&lt;br /&gt;-Define , during development and make it clear to the customer , areas that the software can be customized. This is further improved by  always ensuring that your application is designed in such away that the back end and the front end is seperate. The less coupling you have , the easier it is to make changes without the suffering of a meltdown due to runaway, change induced bugs.&lt;br /&gt;&lt;br /&gt;-Code customizable. Eg. , if its a DB application , stick all field definitions in a xml script that regenerates al the applications fields upon deployment. Build pluggable architectures that allow easy addition of business logic.&lt;br /&gt;It might be a significant investment upfront but the pay offs in terms of flexibility and re-usability will balance it out.&lt;br /&gt;&lt;br /&gt;-Don't customize. Seriously. Sometimes clients business processes might be unnecessaryily complex. Working with them to streamline things for a month might save you months of coding, testing and debugging. Obviously this is tougher when you are a small fart software company with a programmer who doubles up as a "Business Process Consultant".  Nonetheless , a sensible, outside perspective goes a long way at times.&lt;br /&gt;&lt;br /&gt;To be honest many large software companies both local and foreign don't entertain customization. These include software companies that software products have traditionally included customization. For eg. SAP does not customize anymore then 10% of their solutions. &lt;br /&gt;&lt;br /&gt;In summary, in trying to get market traction, your company might be forced to pander to the demands of customers. A bit of foresight , some tactful negotiation and a some luck will allow you to get through that, as I am hoping it will get our company through. Once we are making enough money, we can ask pushy customers to go shove it :). &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95458017?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95458017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95458017'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_08_archive.html#95458017' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95398083</id><published>2003-06-06T22:03:00.000-07:00</published><updated>2003-06-06T22:03:15.553-07:00</updated><title type='text'></title><content type='html'>We are going to cyberjaya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95398083?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95398083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95398083'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95398083' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95379723</id><published>2003-06-06T11:10:00.000-07:00</published><updated>2003-06-06T11:13:45.000-07:00</updated><title type='text'></title><content type='html'>Today was more interesting then fruitful. Interesting days are days where you end up doing stuff out of the ordinary, not running down the old track. They tend to be less productive in respect to bringing  home the bread, but nonetheless are essential in ensuring that you will always find new shit to do.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gathani.org"&gt;Walrus&lt;/a&gt;,&lt;a href ="http://chernobill.blogspot.com"&gt;bots&lt;/a&gt; and I, met up with &lt;a href="http://www.jeffooi.com"&gt;some&lt;/a&gt; &lt;a href="http://www.mycen.com.my/duasen/"&gt;kewl&lt;/a&gt; &lt;a href="http://www.alphaque.com"&gt; blogger&lt;/a&gt;  &lt;a href="http://www.aizuddindanian.com/voi/"&gt;dudes&lt;/a&gt; &lt;a href="http://www.timyang.com"&gt;today&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Although each brough to the bar table their many different personas, one aspect that seemed to bind everyone of them was a vision of building a more mature and fertile blogging landscape in Malaysia. &lt;br /&gt;&lt;br /&gt;Among the suggestions to achieve this were : &lt;br /&gt;&lt;br /&gt;-A Malaysian blog award &lt;br /&gt;-A website containing selected aggregated content from Malaysian blogs &lt;br /&gt;-some other shit I couldn't listen cause I was too busy gulping down my beer&lt;br /&gt;&lt;br /&gt;I commend these chaps for their aspirations and hope to contribute in any way I can. Lets see where this shit goes.&lt;br /&gt;&lt;br /&gt;That was the interesting part of the day.&lt;br /&gt;&lt;br /&gt;The less fruitful part was the fact that I had not much time to code. Moreover the app is entering a portion where there is very little exciting and explorative coding and more mundane bullshit, abit like HTML hacking in PHP. Fuck.&lt;br /&gt;&lt;br /&gt;I hope to be out of this patch soon. Tommorow will not be too kind as to offer me any coding time either as &lt;a href="http://www.gathani.org"&gt;Walrus&lt;/a&gt; and I will need to head of to the land of Cyber-fucking-fiber-in-the-palms-jaya to get &lt;a href="http://www.timyang.com"&gt;Assgonus&lt;/a&gt; server up and running.&lt;br /&gt;&lt;br /&gt;Fuck wei.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95379723?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95379723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95379723'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95379723' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95335956</id><published>2003-06-05T10:52:00.000-07:00</published><updated>2003-06-05T10:58:57.000-07:00</updated><title type='text'></title><content type='html'>Its 1:50 am and I am at the office. The code is at 40%. The truth is its more like 35% done, maybe less. This whole fucking percentage bullshit is so fucking arbitiary I might as well say its at 5% completion. Fuck that. It will get done. I just want to get all the basic shit in place first. I need all the functions in place so I can demo the application to the client again. There are some essential components that have to be completed before I can do that however. &lt;br /&gt;&lt;br /&gt;After I pass this milestone I am gonna refactor , and what Id like to call , strengthen the code. This would involve&lt;br /&gt;&lt;br /&gt;-checking for weird casses of user input&lt;br /&gt;-putting in lots of assertions&lt;br /&gt;-putting in more exception handling&lt;br /&gt;-adding more user exceptions&lt;br /&gt;&lt;br /&gt;I know. Maybe I should of done all that while I was coding. Maybe I should of used &lt;b&gt;test then code&lt;/b&gt; methodology, and maybe I should of wanked less. &lt;br /&gt;&lt;br /&gt;Fuck that. Ill get this shit done. Good night people.&lt;br /&gt;&lt;br /&gt;&lt;img src=http://members.lycos.co.uk/p123t/palace_modified.jpg border=0 alt="Rome wasnt built in a day"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95335956?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95335956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95335956'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95335956' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95315630</id><published>2003-06-04T21:30:00.000-07:00</published><updated>2003-06-04T21:30:11.990-07:00</updated><title type='text'></title><content type='html'>Kewl hackers dont seem to finish university.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;Frankel, who is called ``Our Benevolent Dictator'' on the Nullsoft site, founded the company in 1998 after dropping out of the University of Utah.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.nytimes.com/aponline/technology/AP-AOL-Nullsoft.html"&gt;Rogue AOL Subsidiary Leader to Resign&lt;/a&gt; (Free registration required)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95315630?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95315630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95315630'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95315630' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95269568</id><published>2003-06-03T21:34:00.000-07:00</published><updated>2003-06-06T08:37:43.000-07:00</updated><title type='text'></title><content type='html'>&lt;img src=http://members.lycos.co.uk/p123t/keypad_modified.jpg border=0 alt="The only way is up"&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Focus, and let this day be a productive one. The only way from here is up. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95269568?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95269568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95269568'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95269568' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95233405</id><published>2003-06-03T05:22:00.000-07:00</published><updated>2003-06-03T05:22:57.000-07:00</updated><title type='text'></title><content type='html'>Assert yourself well : &lt;a href="http://www.python.org/cgi-bin/moinmoin/UsingAssertionsEffectively"&gt;Using assertion effectively in Python&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95233405?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95233405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95233405'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95233405' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95230311</id><published>2003-06-03T03:00:00.000-07:00</published><updated>2003-06-03T03:03:00.000-07:00</updated><title type='text'></title><content type='html'>With the VCs gone , computer scientists costing a dime a dozen (not referring to good ones here , more like your average chap with a certificate from his local 'institut'), and your average IT company doing repetitive,stale, stationary development (read: VB database apps) that brings the cashflow, we are quick to forget the vigour and excitement that is a foundation of this industry. More importantly we are quick to forget that most of the industry shattering shit we have were built in garages of people like you and   me. Let us not resign tothe notion that cool tech can only be done by the big guns of today. And what better way then to traverse those garage days. &lt;br /&gt;For those that have not already visited, this cool link from PBS,check it out &lt;a href="http://www.pbs.org/nerds/"&gt;Triumph of the nerds&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The transcripts are particularly good.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95230311?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95230311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95230311'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95230311' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95230175</id><published>2003-06-03T02:52:00.000-07:00</published><updated>2003-06-03T03:02:48.000-07:00</updated><title type='text'></title><content type='html'>"Very often design is the most immediate way of defining what products become in people's minds." -- Jonathan Ive&lt;br /&gt;&lt;br /&gt;Thats what the dude who designed the iMac and iPod thinks. And he hit it on the buzzer. What people see is what people perceive your product as capable off. Undeniably , what you see, by itself is a representation of what the product is capable off, but badly designed products hide potential and features behind shitty exteriors.&lt;br /&gt;&lt;br /&gt;So how do you make software kewl in respect to UI design?&lt;br /&gt;&lt;br /&gt;Well the truth is I don't know, yet. But I know some people who have nailed it , or think they have&lt;br /&gt;&lt;a href="www.jeffraskin.com"&gt;Jeff Raskin&lt;/a&gt;&lt;br /&gt;&lt;a href="http://slashdot.org/articles/00/05/15/176254.shtml"&gt;Andy Hertzfeld&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95230175?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95230175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95230175'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95230175' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95184533</id><published>2003-06-02T02:35:00.000-07:00</published><updated>2003-06-02T07:31:09.000-07:00</updated><title type='text'></title><content type='html'>&lt;img src=http://members.lycos.co.uk/p123t/subway_modified.jpg border=0 &gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95184533?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95184533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95184533'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95184533' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95184060</id><published>2003-06-02T02:11:00.000-07:00</published><updated>2003-06-02T02:13:40.000-07:00</updated><title type='text'></title><content type='html'>The work on that database application I have been doing , has been happening sporadically. Id say its about 35% done and Id like to see it reach 60% by the end of this week.&lt;br /&gt;&lt;br /&gt;The one area of the application I have not delved into is the report/letter generation section. This would involve pulling data off the database , and stuffing the data into a formated manner that would be printable. From where I stand , what I see as a feasible way to do this is to generate PDFs of the reports and then print them. This is primarily because &lt;br /&gt;&lt;br /&gt;-I need the reports to be generated in such away that they are cross platform and consistent across these platforms. Generating PDFs mean that the documents/reports that are generated can be easily printed on Linux/Apple/Win.&lt;br /&gt;&lt;br /&gt;-The documents/reports generated are primarily view only. Hence there is no need for the out put format to be editable. These are documents/reports that the user will send to their clients for billing/quotation/invoicing purposes.&lt;br /&gt;&lt;br /&gt;What I plan to use? &lt;a href="http://www.reportlab.com"&gt;Reportlab&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;From the site &lt;I&gt;" ReportLab Inc. specializes in tools for generating dynamic PDF documents derived from any data source.&lt;br /&gt;&lt;br /&gt;Our technology empowers information providers to transform data into professionally formatted documents complete with dynamic text, images, charts and tables. We deliver innovative, mission-critical applications to world-class financial firms, and sell a range of software products to enable development teams do the same. "&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ill blog my journeys with this module here soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95184060?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95184060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95184060'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_06_01_archive.html#95184060' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95073543</id><published>2003-05-30T02:46:00.000-07:00</published><updated>2003-05-30T02:46:07.420-07:00</updated><title type='text'></title><content type='html'>The workload is too sporadic. Between trying to  answer calls, write quotes and invoices, understand hypercondriac customers that have no life other then ask you to move their computers around, I try to code. And its having a toll. This task switching ain't no good at all. It results in a need to repeatedly retrace last process states , which by itself can be time consuming and tiring.&lt;br /&gt;&lt;br /&gt;How do you deal with this ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95073543?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95073543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95073543'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_05_25_archive.html#95073543' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95066578</id><published>2003-05-29T21:49:00.000-07:00</published><updated>2003-05-29T21:54:11.000-07:00</updated><title type='text'></title><content type='html'>Managers concern about security in Malaysia&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;a href="http://star-techcentral.com/tech/story.asp?file=/2003/5/29/technology/29idcsecure&amp;amp;sec=technology"&gt;Security spending still up despite overall slowdown&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; This disparity in supply and demand has consequently created new market opportunities for security software vendors and service providers, IDC said.  &lt;br /&gt;&lt;br /&gt;"Currently accounting for about 21% (in 2002) of total regional revenues, Australia will continue to be the largest geographic market for managed security services in the region, due to a higher level of maturity towards outsourcing," said Lee. &lt;br /&gt;&lt;br /&gt;"Meanwhile, other key drivers include security adoption that is primarily driven by CIOs' fear of security breaches and growing regulatory requirements." &lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Interesting. If there is one area where there are many powerful and well established Open Source tools , it would be the network security area. This would mean a lower level of entry for budding companies. The usual barriers of entry would still be there such as brand recognition, financing (especially in the case of managed security services) competency and others, but assuming you get your shit together, build your brand name and value by maybe contributing to Open Source projects, this might be a real opportunity.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95066578?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95066578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95066578'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_05_25_archive.html#95066578' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-95025357</id><published>2003-05-28T23:14:00.000-07:00</published><updated>2003-05-28T23:14:07.030-07:00</updated><title type='text'></title><content type='html'>Python debugging guide &lt;a href="http://home.att.net/~stephen_ferg/papers/debugging_in_python.html"&gt;Debugging in Python&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-95025357?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95025357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/95025357'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_05_25_archive.html#95025357' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-94975134</id><published>2003-05-27T22:09:00.000-07:00</published><updated>2003-05-27T22:09:51.930-07:00</updated><title type='text'></title><content type='html'>I am looking into testing , both unit testing and black box testing. Black box testing are used in testing the application from a user perspective ,for both GUI and web - apps. Unit testing test API's hence they are more relevent to programmers&lt;br /&gt;&lt;br /&gt;So here are some links&lt;br /&gt;&lt;br /&gt;Black box testing&lt;br /&gt;&lt;br /&gt;Web-app&lt;br /&gt;&lt;br /&gt;Black box testing article from o'reilly : &lt;a href="http://www.onjava.com/lpt/a/3672"&gt;http://www.onjava.com/lpt/a/3672&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;White box testing &lt;br /&gt;&lt;br /&gt;Python : &lt;br /&gt;&lt;br /&gt;&lt;a href="http://pyunit.sourceforge.net/pyunit.html"&gt;PyUnit&lt;a&gt; Pretty standard - unit testing style. Based on JUnit.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.python.org/doc/current/lib/module-doctest.html"&gt;Doctest&lt;/a&gt; A rather more novel approach to testing. Tries to make it as natural as possible.&lt;br /&gt;&lt;br /&gt;[Work in progress]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-94975134?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94975134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94975134'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_05_25_archive.html#94975134' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-94974826</id><published>2003-05-27T22:00:00.000-07:00</published><updated>2003-05-27T22:00:44.240-07:00</updated><title type='text'></title><content type='html'>This might interest some CS dudes/dudettes out there:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://radio.weblogs.com/0103807/stories/2002/06/06/generalIJustGraduatedWithAComputerScienceDegreeAndPleasePleaseDontMakeMeWorkAtTheMall.html"&gt;I Just Graduated with a Computer Science Degree And Please, Please Don't Make Me Work at the Mall&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-94974826?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94974826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94974826'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_05_25_archive.html#94974826' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-94933334</id><published>2003-05-27T03:02:00.000-07:00</published><updated>2003-05-27T03:02:14.050-07:00</updated><title type='text'></title><content type='html'>Python has a method to allow for classes to obtain other classes dynamically and at runtime. Its excellent. Its called mixins. From a the following article : http://www.linuxjournal.com/article.php?sid=4540&lt;br /&gt;&lt;br&gt;&lt;br /&gt;"Mix-in programming is a style of software development where units of functionality are created in a class and then mixed in with other classes. This might sound like simple inheritance at first, but a mix-in differs from a traditional class in one or more of the following ways. Often a mix-in is not the ``primary'' superclass of any given class, does not care what class it is used with, is used with many classes scattered throughout the class hierarchy and is introduced dynamically at runtime."&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Whats even more kewl is the following :&lt;br /&gt;&lt;br /&gt;"The grapevine informs me that Symbolics' object-oriented Flavors system is most likely the earliest appearance of bona fide mix-ins. The designers were inspired by Steve's Ice Cream Parlor in Cambridge, Massachusetts where customers started with a basic flavor of ice cream (vanilla, chocolate, etc.) and added any combination of mix-ins (nuts, fudge, chocolate chips, etc.). In the Symbolics system, large, standalone classes were known as flavors while smaller helper classes designed for enhancing other classes were known as mix-ins. "&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Its interesting how knowing the history and the naming reason for this language functiality suddenly sheds so much light and understanding on how it works and what it was meant to do.&lt;br /&gt;&lt;br&gt;Groovy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-94933334?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94933334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94933334'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_05_25_archive.html#94933334' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-94895183</id><published>2003-05-26T06:11:00.000-07:00</published><updated>2003-05-28T00:54:55.000-07:00</updated><title type='text'></title><content type='html'>Need a cross platform RAD?&lt;br /&gt;&lt;br /&gt;I have been working on a simple, cross platform database application for work, and I needed it done quickly.&lt;br /&gt;&lt;br /&gt;There we a few criteria that surrounded the development of this application&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It needed to be developed using Open Source tools that would allow us to release the final product as closed source if required.&lt;br /&gt;&lt;br /&gt;It needed to be done fairly quickly.&lt;br /&gt;&lt;br /&gt;We couldnt afford to buy any commercial tools.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So what did we use ?&lt;br /&gt;&lt;br /&gt;Pythoncard - http://www.pythoncard.org &lt;br /&gt;&lt;br /&gt;Allows for rapid GUI development (although relatively elementary for now)&lt;br /&gt;&lt;br /&gt;wxPython - http://www.wxpython.org (used by Pythoncard)&lt;br /&gt;(execellent cross platform GUI toolkit with great python bindings)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sqLite - http://www.sqlite.org (excellent embeddable SQL engine )&lt;br /&gt;&lt;br /&gt;pySqlite -http://pysqlite.sourceforge.net (python SQLite connector)&lt;br /&gt;&lt;br /&gt;SQLObject - http://sqlobject.org (a OO &lt;-&gt; relational mapper - not necessarily matured but has enough to be used in a live project -- get the CVS copy)&lt;br /&gt;&lt;br /&gt;With all these tools we managed to strap together a pretty fast RAD  environment to work in.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How is it done ?&lt;br /&gt;&lt;br /&gt;1.Design the GUI in pythoncard.&lt;br /&gt;&lt;br /&gt;2.Design the model. This is basically the stuff that your application will be storing. You will have to design the relevent SQL and then the relevent SQLObject subclass.&lt;br /&gt;&lt;br /&gt;3.Write the relevent Python classes for the GUIs that you designed in Pythoncard.&lt;br /&gt;&lt;br /&gt;4.Link up the event handling functions with the relevent model calls.&lt;br /&gt;&lt;br /&gt;5.Done&lt;br /&gt;&lt;br /&gt;[Work in progress]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-94895183?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94895183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/94895183'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_05_25_archive.html#94895183' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-93099243</id><published>2003-04-23T00:35:00.000-07:00</published><updated>2003-04-23T00:36:05.000-07:00</updated><title type='text'></title><content type='html'>&lt;b&gt;Code ain't grow on no trees&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I have yet to begin anywork on the document circulation system. I expect it to be a long night. The fucking problem is that we have so much non-programming work to do that it takes all the time. I am currently spending up to 1 hour trying to burn 8 cds for a secretary at a clients company because &lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;1)Their personal cd burner has gone kaput , so we have to use the network cd burner which they dont know how to use.&lt;br&gt;&lt;br /&gt;2)Because they make it seem like we have to do it although it isn't necessarily stated in our maintenance contract.&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;The things you have to do. In 6 months we will be making enough money to hire people to do this dumbass work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-93099243?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93099243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93099243'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_04_20_archive.html#93099243' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-93098958</id><published>2003-04-23T00:26:00.000-07:00</published><updated>2003-04-23T00:28:04.000-07:00</updated><title type='text'></title><content type='html'>&lt;b&gt;Freshmeat focus&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Interesting python xmlrpc library for python -- written in C &lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/py-xmlrpc/"&gt;py-xmlrpc&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-93098958?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93098958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93098958'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_04_20_archive.html#93098958' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-93053505</id><published>2003-04-22T09:15:00.000-07:00</published><updated>2003-04-22T09:15:22.870-07:00</updated><title type='text'></title><content type='html'>I hate coding without taking a bath, but we have this prototype for a document routing system that we got to get out by Monday next week, hence urgency has been injected into the air.&lt;br /&gt;&lt;br /&gt;We hope to get it done by Monday. We will.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-93053505?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93053505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93053505'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_04_20_archive.html#93053505' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-5308859.post-93036334</id><published>2003-04-22T02:20:00.000-07:00</published><updated>2003-04-22T02:26:52.000-07:00</updated><title type='text'></title><content type='html'>Ultra kewl posting from the python mailing list on understanding algorithmic complexity and "O" notation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=roy-92A049.08504216042003 40reader1.panix.com&amp;rnum=3"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Peter van Kampen &lt;news@datatailors.xs4all.nl&gt; wrote:&lt;br /&gt;&gt; I think I almost 'get it'. Except who or what decides what Big-O a&lt;br /&gt;&gt; certain algorithm has. Is that by 'hunch' or by running benchmarks or&lt;br /&gt;&gt; are there still other ways to recognize 'Big-O's&lt;br /&gt;&lt;br /&gt;You do it by analysis.  Basicly, you find the "inner loop", i.e. the bit &lt;br /&gt;of core code that gets run over and over while the algorithm does its &lt;br /&gt;work.  Then, you figure out (by looking at the code) how many times that &lt;br /&gt;inner loop will run given that the input is a given size.&lt;br /&gt;&lt;br /&gt;Sometimes, in a high level language like Python, there are implied loops &lt;br /&gt;in what look like atomic operations.  This can obscure the real &lt;br /&gt;algorithmic complexity of a program, unless you know enough to look &lt;br /&gt;deeper.  Take the classic Python example:&lt;br /&gt;&lt;br /&gt;s1 = ""&lt;br /&gt;for s2 in stringList:&lt;br /&gt;   s1 += s2&lt;br /&gt;&lt;br /&gt;On the surface, it looks like this should be an O(N) program, where N is &lt;br /&gt;the number of strings in stringList.  Certainly, for N strings, the loop &lt;br /&gt;gets executed N times.  But, the string addition has an couple of &lt;br /&gt;inherent loops of its own.  The most obvious is that each character in &lt;br /&gt;s2 has to be copied someplace, so it really looks like this:&lt;br /&gt;&lt;br /&gt;s1 = ""&lt;br /&gt;for s2 in stringList:&lt;br /&gt;   for c in s2:&lt;br /&gt;      s1 += c&lt;br /&gt;&lt;br /&gt;Now it looks like it takes O(k*N) steps, where N is again the number of &lt;br /&gt;strings in stringList, and k is the average number of characters in a &lt;br /&gt;string.&lt;br /&gt;&lt;br /&gt;Here's the first tricky part -- for the purpose of big-O notation, the k &lt;br /&gt;is meaningless.  It's essentially a constant factor.  For a given &lt;br /&gt;universe of strings (say, words in a dictionary), k is not going to &lt;br /&gt;change as you add more strings.  Sure, it's going to have minor &lt;br /&gt;variations as the average bops around, but once you've got a statisticly &lt;br /&gt;valid sample of input strings, it'll pretty much stay put.  k may be a &lt;br /&gt;function of the kinds of strings you're giving it (k might be bigger for &lt;br /&gt;German compared to English), but it's not a function of the number of &lt;br /&gt;strings you're feeding the program.  For big-O purposes, O(k*N) where k &lt;br /&gt;is a constant is the same as O(N).  What we're trying to describe is the &lt;br /&gt;shape of the growth curve, not the scaling factors.&lt;br /&gt;&lt;br /&gt;And, here's the second tricky part -- since strings in Python are &lt;br /&gt;immutable, the way you do s1 += s2 is to figure out how long each of the &lt;br /&gt;two components are, allocate a new string big enough to hold the sum of &lt;br /&gt;those, and copy the two original strings into the new one.  So, let's &lt;br /&gt;tear that apart a bit and see what it looks like, complexity wise.&lt;br /&gt;&lt;br /&gt;We need to figure out how long each component string is.  On the &lt;br /&gt;surface, that's O(N), where N is the length of the string.  In C, it &lt;br /&gt;looks something like:&lt;br /&gt;&lt;br /&gt;length = 0;&lt;br /&gt;while (*string != NULL) {&lt;br /&gt;   length++;&lt;br /&gt;   string++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;This takes 2*N steps (it does two additions on each of N trips through &lt;br /&gt;the loop), but big-O says that O(2*N) is the same as O(N).&lt;br /&gt;&lt;br /&gt;Fortunately for us, Python doesn't need to do that.  Python stores &lt;br /&gt;strings in a way where the length is pre-computed and stored.  All it &lt;br /&gt;really needs to do to get the length is something like "return &lt;br /&gt;string.length", which is a constant-time operation (i.e. it takes the &lt;br /&gt;same amount of time regardless of the length of the string).  That's &lt;br /&gt;called O(1).&lt;br /&gt;&lt;br /&gt;So, we could rewrite the whole thing as something like:&lt;br /&gt;&lt;br /&gt;s1 = ""&lt;br /&gt;for s2 in stringList:&lt;br /&gt;   len1 = len(s1)&lt;br /&gt;   len2 = len(s2)&lt;br /&gt;   newLen = len1 + len2&lt;br /&gt;   temp = allocate buffer for newLen characters&lt;br /&gt;   for c in s1:&lt;br /&gt;      temp += c&lt;br /&gt;   for c in s2:&lt;br /&gt;      temp += c&lt;br /&gt;   s1 = temp&lt;br /&gt;&lt;br /&gt;Now, we analyse the complexity of each bit of that.  It does the outer &lt;br /&gt;loop N times, but how much work is involved in each iteration of the &lt;br /&gt;outer loop?  Each of the len()'s we already figured out is constant &lt;br /&gt;time, so they don't add anything complexity-wise.  Adding the two &lt;br /&gt;lengths is also constant time.&lt;br /&gt;&lt;br /&gt;For the sake of argument, I'm going to assume that memory allocation is &lt;br /&gt;constant time, although I don't really know that for sure.  To really do &lt;br /&gt;the analysis right, I'd have to know the details of how Python memory &lt;br /&gt;management works, and I don't, but I'm reasonably confident that it's &lt;br /&gt;not going to be a determining factor here.&lt;br /&gt;&lt;br /&gt;Now we come to the first interesting part.  The "for c in s1" loop takes &lt;br /&gt;as many iterations as s1 is long.  Well, how long is s1?  It varies as &lt;br /&gt;the program progresses, but after we've processed M strings, it's &lt;br /&gt;approximately k*M characters long (where k is again the average string &lt;br /&gt;length).  We again toss out the constant k, and come up with the &lt;br /&gt;complexity of this particular loop being O(M).  But, what's M?  It &lt;br /&gt;varies from 1 to N, and on average, it's N/2.  But, the constant factor &lt;br /&gt;of 1/2 doesn't mean anything to big-O, so O(M) = O(N/2) = O(N).&lt;br /&gt;&lt;br /&gt;The "for c in s2" loop we've already discussed and decided it was O(k), &lt;br /&gt;which is the same as O(1), i.e. constant time.&lt;br /&gt;&lt;br /&gt;And finally, the rebinding of s1 to the new temporary string is constant &lt;br /&gt;time.  One minor hitch is that this causes the old s1 to fall out of &lt;br /&gt;scope and become a candidate for garbage collection.  Again, without &lt;br /&gt;knowing the details of Python's memory management, I can't say for sure &lt;br /&gt;what the algorithmic complexity of freeing a string is, but for now I'm &lt;br /&gt;going to assume it's O(1).&lt;br /&gt;&lt;br /&gt;So, overall, we do an O(N) inner loop (plus a lot of constant-time stuff &lt;br /&gt;that we're ignoring), O(N) times, giving us an overall algorithmic &lt;br /&gt;complexity of O(N^2).  This is often called quadratic behavior, and is &lt;br /&gt;generally considered evil and something to be avoided if at all possible.&lt;br /&gt;&lt;br /&gt;How evil?  Well, I read recently that the new Python 2.3 release is &lt;br /&gt;supposed to be 10% to 20% faster than 2.2.  That sounds impressive (and, &lt;br /&gt;don't get me wrong, it is impressive), but it's bupkis compared to &lt;br /&gt;algorithm tuning.  Imagine you've got a program which runs in O(N^2) &lt;br /&gt;time.  If you could find a way to reduce it to O(N), for an input set of &lt;br /&gt;just 10 items, you would have speeded it up by a factor of 10!  Compared &lt;br /&gt;to upgrading your Python interpreter, you did 50-100 times better tuning &lt;br /&gt;the algorithm.  Now try to consider the implications of going from &lt;br /&gt;O(N^2) to O(N) with 25,000 input items!&lt;br /&gt;&lt;br /&gt;BTW, this is perhaps one of the few arguments against teaching Python &lt;br /&gt;(or any high-level language) as a first programming language.  So much&lt;br /&gt;algorithmicly complex stuff gets pushed down into atomic language &lt;br /&gt;constructs that there's no longer much of a correlation between code &lt;br /&gt;complexity and algorithmic complexity.  This, of course, is what makes &lt;br /&gt;high level languages so useful in the first place, but I fear we may be &lt;br /&gt;training a new generation of programmers for whom algorithmic complexity &lt;br /&gt;is not as familiar a concept as it used to be.&lt;br /&gt;&lt;br /&gt;I'm not saying we should still be teaching C (or assembler) as a first &lt;br /&gt;language.  On the other hand, I suspect analysis of algorithms probably &lt;br /&gt;needs to be emphasized more (and earlier) in the curriculum.  When I &lt;br /&gt;first learned this stuff, it was mostly just a codification and rigorous &lt;br /&gt;analysis of concepts I'd already explored experimentally in the normal &lt;br /&gt;course of writing C programs.  I suspect now it's rather completely new &lt;br /&gt;ground, and may seem rather esoteric and theoretical and not &lt;br /&gt;particularly relevant to real-world problems like designing java &lt;br /&gt;animiations for web pages :-)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5308859-93036334?l=codeworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93036334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5308859/posts/default/93036334'/><link rel='alternate' type='text/html' href='http://codeworks.blogspot.com/2003_04_20_archive.html#93036334' title=''/><author><name>Mohan</name><uri>http://www.blogger.com/profile/07601405186388671679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
