<?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-6237161444180571452</id><updated>2011-11-27T15:43:05.897-08:00</updated><category term='plone'/><category term='reviews'/><category term='opensuse'/><category term='python'/><category term='mandriva'/><category term='sles'/><category term='zope'/><category term='archlinux'/><category term='guides'/><category term='fedora'/><category term='django'/><category term='general'/><category term='suse'/><title type='text'>Lowkster - Pythonly yours</title><subtitle type='html'>Chance encounters with Python</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.lowkster.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>84</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8865259730968097405</id><published>2011-10-09T01:54:00.000-07:00</published><updated>2011-10-09T01:54:06.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Come on ubuntu release already</title><content type='html'>After looking at the new stuff available in unit tests: &lt;br /&gt;&lt;br /&gt;http://docs.python.org/library/unittest.html&lt;br /&gt;&lt;br /&gt;I am really sold! At a mere glance I can already see two things that would be supremely useful in cleaning up my tests which is:&lt;br /&gt;&lt;br /&gt;doCleanups&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;assert*Equal&lt;br /&gt;&lt;br /&gt;Especially the assertTupleEqual and assertListEqual is really really nice where in the difference of the two sets are compared and the diff included in the failed message. We are using Ubuntu on all of our tests machines so I really hope that the stock Python that comes with the next version of Ubuntu is the 2.7.x branch. The assertAlmostEqual seems a bit dodgy to me but then again I still haven't really gone in depth with the docs yet. &lt;br /&gt;&lt;br /&gt;What would be a nice addition for me would be 'assertTextFileEqual' or something to that end. This would be a great shortcut for me as I do a lot of text file reading and asserting in my tests.&lt;br /&gt;&lt;br /&gt;All in all kudos to the changes made in the unit test module of Python and I like the direction that it's heading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8865259730968097405?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8865259730968097405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8865259730968097405' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8865259730968097405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8865259730968097405'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2011/10/come-on-ubuntu-release-already.html' title='Come on ubuntu release already'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-5874262990498042117</id><published>2011-09-22T07:28:00.000-07:00</published><updated>2011-09-22T07:32:29.239-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Where is that missing recursive chown for Python</title><content type='html'>A question from a colleague of mine prompted me on a week long search for a recursive chown for Python. Initially I just thought that it was due to his inexperience that he was unable to find an answer as a recursive chown  sounds too easy of a function for Python not to have. Alas, however after on and off scouring the net I found that the closest (and the best) answer to what he was looking for is actually &lt;a href="http://stackoverflow.com/questions/2853723/whats-the-python-way-for-recursively-setting-file-permissions"&gt;This stack overflow question&lt;/a&gt;. Ruby has their &lt;a href="http://ruby-doc.org/stdlib/libdoc/fileutils/rdoc/classes/FileUtils.html#M000930"&gt;built into&lt;/a&gt; the Fileutils library which really prompted this post. Also on a less cursory glance I notice that the ruby standard lib has some functions which I really wished Python has which would make a probably transition from my bunch of work horse bash script to a Ruby platform that much easier. They have cp, cp_r and even a diff! Nice! Has there been any attempt of making this easier in Python? If someone knows better please enlighten me, as this just seems too easy for Python not to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-5874262990498042117?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/5874262990498042117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=5874262990498042117' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5874262990498042117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5874262990498042117'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2011/09/where-is-that-missing-recursive-chown.html' title='Where is that missing recursive chown for Python'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6578955155010733864</id><published>2011-06-14T18:57:00.000-07:00</published><updated>2011-06-14T18:57:19.991-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='archlinux'/><title type='text'>Finally! 2.6.38-9 is it!</title><content type='html'>It took 9 revisions but as of kernel 2.6.38-9, my arch box can now reboot and halt fine (just need to put 'rmmod e1000e' in /etc/rc.local.shutdown) and I can live with it for now. For the longest time (about 2 months) after upgrading to 2.6.38 my box just would not reboot or poweroff without hanging and I was actually toying around with idea of replacing my Arch with Fedora 15. &lt;br /&gt;&lt;br /&gt;The relevant posts:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="https://bbs.archlinux.org/viewtopic.php?id=119229"&gt;Arch Forums&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. &lt;a href="https://bugzilla.kernel.org/show_bug.cgi?id=33872"&gt;Kernel bugzilla&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wonder what magicks was sprinkled on this latest stable kernel. Wish there was like someway to read changelogs for revisions on the command line just before I do a 'pacman -Syu', or is there really a changelog maintained for the kernel? From the looks on the kernel bugzilla, it doesn't seem to be moving at all at the moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6578955155010733864?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6578955155010733864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6578955155010733864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6578955155010733864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6578955155010733864'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2011/06/finally-2638-9-is-it.html' title='Finally! 2.6.38-9 is it!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8488973592545202025</id><published>2011-06-10T20:53:00.000-07:00</published><updated>2011-06-10T20:53:30.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><title type='text'>systemd for opensuse</title><content type='html'>As a guy who use openSuSE daily for my work, I like the direction that openSuSE has been treading in the past and now. I am not that intune with the community but then the direction they always take seem to walk the fine line between bring in the latest and greatest changes and maintaining a stability that allow for the majority of the users being able to use it for work. While guys like Fedora and Arch seems to throw caution to the wind bring in the changes with seemingly &lt;a href="http://juliank.wordpress.com/2010/10/22/arch-linux-python-3-and-users/"&gt;little regard&lt;/a&gt; for stability, openSuSE in my books have always been successful at the almost impossible task of maintaining a stable environment with the slew of changes coming from all directions. One thing that comes to my mind when writing this is their decision to maintain kde3 together with kde4 when kde4 was born to aid the transition 4.x. &lt;br /&gt;&lt;br /&gt;With this in mind I look forward to the&lt;a href="http://blog.crozat.net/2011/06/road-to-systemd-for-opensuse-121.html"&gt; systemd integration&lt;/a&gt; into OpenSuSE planned for 12.1. Looks like there are a lot of overwhelming wins using systemd &lt;a href="http://0pointer.de/blog/projects/why.html"&gt;compared&lt;/a&gt; to the old systems. I was beginning to think that the OpenSuSE camp was a bit quiet compared to Ubuntu opting for upstart and Fedora going the&lt;a href="http://fedoraproject.org/wiki/Features/BetterStartup"&gt; Plymouth way&lt;/a&gt;. The only downside I can see for this is that untypical of something that is usually brought into the OpenSuSE, systemd seems to be the youngest of all the projects and I envision a lot of work ahead to stabilize it down for the future. This is something that I am definitely looking forward to in the &lt;a href="http://en.opensuse.org/openSUSE:Roadmap"&gt;Roadmap&lt;/a&gt; for openSuSE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8488973592545202025?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8488973592545202025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8488973592545202025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8488973592545202025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8488973592545202025'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2011/06/systemd-for-opensuse.html' title='systemd for opensuse'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8296876502086144033</id><published>2011-04-12T10:22:00.000-07:00</published><updated>2011-04-12T19:22:59.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Packaging python packages in opensuse</title><content type='html'>While getting one of my packages rejected for inclusion into the python lang repo for openSuSE, the comments made by the reviewer pointed me to find the package: &lt;a href="http://pypi.python.org/pypi/py2pack"&gt;py2pack&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This package made the packaging of Python packages on OpenSuSE brain dead easy by doing all of the heavy lifting, creating a sample spec file that really needs very little editing. Install py2pack, and follow this guide, &lt;a href="http://en.opensuse.org/openSUSE:Packaging_Python#The_fast_and_automated_way"&gt;http://en.opensuse.org/openSUSE:Packaging_Python#The_fast_and_automated_way&lt;/a&gt; and put that together with the great openSuSE build service and you will have a great time packaging which is usually a thankless job no one wants to do.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;&lt;br /&gt;Wow the ruby packaging method is about the same too: &lt;a href="http://en.opensuse.org/openSUSE:Packaging_Ruby"&gt;http://en.opensuse.org/openSUSE:Packaging_Ruby&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8296876502086144033?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8296876502086144033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8296876502086144033' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8296876502086144033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8296876502086144033'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2011/04/packaging-python-packages-in-opensuse.html' title='Packaging python packages in opensuse'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-61119830423875242</id><published>2011-03-13T09:40:00.000-07:00</published><updated>2011-03-13T09:40:55.802-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><title type='text'>opensuse 11.4 a quick disappointed look... part2</title><content type='html'>I will just add closure to this story. After the upgrade botched up, I reluctantly tried to reinstall my server leaving the home volume untouched. That turned out to be a pleasant surprise because of a few things:&lt;br /&gt;&lt;br /&gt;1. 'import setup' of partitioning. Love that! Allowed me to copy over my old partition settings. Saves a whole lot of pain.&lt;br /&gt;&lt;br /&gt;2. Seamless update after that X worked and everything else worked 'out of the box'. &lt;br /&gt;&lt;br /&gt;The only draw back probably is to reinstall a few of the application I have running on the box that is not in the stock install. I am going to put back a few of the points I took away the day before when the upgrade fuched up. &lt;br /&gt;&lt;br /&gt;So if you are upgrading from 11.3 to 11.4 you might want to use the reinstall path. It might turned out to be better and smoother.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-61119830423875242?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/61119830423875242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=61119830423875242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/61119830423875242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/61119830423875242'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2011/03/opensuse-114-quick-disappointed-look_13.html' title='opensuse 11.4 a quick disappointed look... part2'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1766851497026548685</id><published>2011-03-12T19:12:00.000-08:00</published><updated>2011-03-12T19:12:27.521-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><title type='text'>opensuse 11.4 a quick disappointed look...</title><content type='html'>On the upfront, openSuSE's upgrade has always impressed me with it's smoothness. While others falter, openSuSE's upgrade process just chugs along and everything is up and running at the end of it. I did the online upgrade with one of my boxes while the other used the DVD method with 11.3 and both went without a hitch. &lt;br /&gt;&lt;br /&gt;Along came 11.4 and I did not hesitate based on my past experiences, but boy was I wrong. Right after the upgrade my box booted up to no Xdisplay, no sax2 (wtf ! I know I should have read the release notes, but then no alternatives ?!). The no display I can deal with but the next bit really took me for a doozer. The network did not start up even though it was in runlevel 5. Initially I thought it was because my network card was left un configured but configuration and 6 reboots later did not solve the problem. I resigned myself to a putting 'rcnetwork start' to /etc/rc.d/boot.local. &lt;br /&gt;&lt;br /&gt;I did not find other people with the same problem querying uncle google, but for the life of me I can't get it to work. It would just boot up and say that it has reached runlevel 3 or 5 but then I have to manually start up networking using 'rcnetwork start'. These problems really surprised me as openSuSE prior to this has always good to me and upgrades works right from version 10.3 to 11.3 without problems. I guess I got to stop boasting to people how good openSuSE is ... :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1766851497026548685?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1766851497026548685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1766851497026548685' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1766851497026548685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1766851497026548685'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2011/03/opensuse-114-quick-disappointed-look.html' title='opensuse 11.4 a quick disappointed look...'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8906519945663884025</id><published>2010-12-06T20:35:00.000-08:00</published><updated>2010-12-10T00:20:10.844-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>string substitution in list</title><content type='html'>While coding the other day ... I came across this suspiciously looking code that almost look like it would work ...&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;substituted = ["My name is %s","My name is %s", "My name is %s" ] % ["Earl","Matthew","David"]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So used to looking at string substitution, I almost thought that code could work ... of course in order for that to work correctly ... it would have to be something like this ...&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;strings = ["My name is %s","My name is %s", "My name is %s" ]&lt;br /&gt;names = ["Earl","Matthew","David"]&lt;br /&gt;substituted = [ string % name for string,name in zip(strings,names) ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It's string substitution and list substitution .. Repeat that 10 times :). It's always good and enlightening to strip right down to the basics most days. Go on run the first part of the code and see what you get.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8906519945663884025?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8906519945663884025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8906519945663884025' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8906519945663884025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8906519945663884025'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/12/string-substitution-in-list.html' title='string substitution in list'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2153947726368859811</id><published>2010-11-27T08:25:00.000-08:00</published><updated>2010-11-27T08:25:43.540-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Time to update my Python on windows</title><content type='html'>It's time again to play with my Python on my Windows vm and I thought it was high time I updated it since it was running ver. 2.5. First came the easy part, replacing Python itself. I just downloaded and changed the path for python in window's environment variable. &lt;br /&gt;&lt;br /&gt;I ran 'easy_install mysql-python' thinking on other tasks ahead. Hmm .. command now found, fudge around with the paths and found that I had to install the setuptools for windows. Installed it, changed the path to point at PATH;C:\Python27\Scripts and boom now my Python has easy_install. Little did I know more fun lies in wait ... &lt;br /&gt;&lt;br /&gt;First in trying out 'easy_install mysql-python' I ran into an error saying "error: Setup script exited with error: Unable to find vcvarsall.bat". Looks like my install was still lacking something. After some digging around, it seems that, that error is equivalent of gcc not found on Linux, so I was off to install MingGW. &lt;br /&gt;&lt;br /&gt;Install that, downloaded the sources for MySQLdb from sf.net. They used to provide binaries for MySQLdb but it seems now no more. I ran into another error! Google lead me to this answer: &lt;a href="http://www.mail-archive.com/pylons-discuss@googlegroups.com/msg11448.html"&gt;http://www.mail-archive.com/pylons-discuss@googlegroups.com/msg11448.html&lt;/a&gt;. Good point. So I finally found my answer here... &lt;a href="http://www.codegood.com/archives/129"&gt;http://www.codegood.com/archives/129&lt;/a&gt;. Thanks codegood or Ioannis Lalopoulos, for saving a few more of those pili on my scalp! Now ... to find that win32com!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2153947726368859811?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2153947726368859811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2153947726368859811' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2153947726368859811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2153947726368859811'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/11/time-to-update-my-python-on-windows.html' title='Time to update my Python on windows'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-3504608597240570018</id><published>2010-11-24T23:52:00.000-08:00</published><updated>2010-11-24T23:52:10.971-08:00</updated><title type='text'>Equivalent of python's virtualenv</title><content type='html'>I use Python's virtualenv nearly everyday in my work and was lamenting about the lack of a well made solution on Ruby's side of the fence, that was until I found this great gem: &lt;a href="http://rvm.beginrescueend.com"&gt;http://rvm.beginrescueend.com&lt;/a&gt;. This is the closest I guess Ruby comes to having virtualenv. &lt;br /&gt;&lt;br /&gt;I like the elegant way the author of this too approaches installation of rvm short for Ruby Version Manager. It's just a bunch of bash scripts which does some fancy tap dancing with curl but it elegantly works and everything is in your box in a jiffy. I am eagerly installing rvm on my boxes and will report back on my findings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-3504608597240570018?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/3504608597240570018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=3504608597240570018' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3504608597240570018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3504608597240570018'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/11/equivalent-of-pythons-virtualenv.html' title='Equivalent of python&apos;s virtualenv'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7907195887011893605</id><published>2010-11-07T19:01:00.000-08:00</published><updated>2010-11-07T19:28:53.350-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>CSVs, unicodes and BOMs</title><content type='html'>Nothing like a little project specs to make the ugliness start climbing out of the woodwork. I was tasked to write this parser to massage some data destined to be imported into a database. As I worked with the csv library a few things started to be painfully evident to me.&lt;br /&gt;&lt;br /&gt;There was no support for unicode in the csv module, and as I gathered from &lt;a href="http://bugs.python.org/issue1606092"&gt;here&lt;/a&gt;, it doesn't look as though there will be anytime in the near future ... &lt;br /&gt;&lt;br /&gt;Just tinkered a little around with a the neighbor over the fence to see what they offered ... here are both of them side by side ...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&gt;&gt;&gt; data = reader(open("data.csv","r"))&lt;br /&gt;&gt;&gt;&gt; for item in data:&lt;br /&gt;...     print item&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt; 'NZ(\xe8\xaf\xba\xe7\xbb\xb4\xe4\xbf\xa1) &gt;Food(\xe9\xa3\x9f\xe5\x93\x81\xe8\xa1\x8c\xe4\xb8\x9a\xe7\xbb\x84)', '\xe8\xaf\xba\xe7\xbb\xb4\xe4\xbf\xa1\xe9\xa3\x9f\xe5\x93\x81\xe8\xa1\x8c\xe4\xb8\x9a\xe7\xbb\x84\xe6\x9c\x80\xe7\xbb\x88\xe7\x94\xa8\xe6\x88\xb7', 'TRUE']                          &lt;br /&gt;['NZ', 'NZ(\xe8\xaf\xba\xe7\xbb\xb4\xe4\xbf\xa1) &gt;Technical(\xe5\xb7\xa5\xe4\xb8\x9a\xe8\xa1\x8c\xe4\xb8\x9a\xe7\xbb\x84)', '\xe8\xaf\xba\xe7\xbb\xb4\xe4\xbf\xa1\xe5\xb7\xa5\xe4\xb8\x9a\xe8\xa1\x8c\xe4\xb8\x9a\xe7\xbb\x84\xe6\x9c\x80\xe7\xbb\x88\xe7\x94\xa8\xe6\x88\xb7', 'TRUE']                     &lt;br /&gt;['NZ', 'NZ(\xe8\xaf\xba\xe7\xbb\xb4\xe4\xbf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;irb(main):002:0&gt; require 'csv'                                                                      &lt;br /&gt;=&gt; true                                                                                             &lt;br /&gt;irb(main):003:0&gt; CSV.open('data.csv','r') do |row|                                     &lt;br /&gt;irb(main):004:1* puts row                                                                           &lt;br /&gt;irb(main):005:1&gt; end&lt;br /&gt;诺维信) &gt;Technical(工业行业组) &gt;Starch(淀粉糖行业)                                               &lt;br /&gt;诺维信淀粉糖行业最终用户                                                                            &lt;br /&gt;TRUE&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Seems like ruby has got the unicode out of the box ... hmm wonder how much effort it would take have that unicode support? Those reading my last 2 posts are probably wondering if I pro ruby or something. I am not. I love Python and use it for most of my tasks and I love recent developments in it ... just that there are a few "nigglies" with it. I want it to improve beyond these few little bumps.  &lt;br /&gt;&lt;br /&gt;That being said I love the functionality I get when I use DictReader from Python's csv module as it let's me address my columns by name. Useful in situations where you have to reorder the columns. Seems that you can do that too with Ruby with a little &lt;a href="http://snippets.dzone.com/posts/show/3899"&gt;work&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The next one that got my goat was this thing about BOMs or Byte Order Marks fecal matter left by Excel on the headers. Not really a problem with Python but rather Excel, still had to deal with that. Ended up sanitizing my headers and stripping off the damn BOM. There was a library to do that but I thought that was a bit of an overkill. &lt;br /&gt;&lt;br /&gt;Anyway back to the grindstone ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7907195887011893605?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7907195887011893605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7907195887011893605' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7907195887011893605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7907195887011893605'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/11/csvs-unicodes-and-boms.html' title='CSVs, unicodes and BOMs'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2008531335235183215</id><published>2010-11-03T19:12:00.000-07:00</published><updated>2010-11-03T19:12:07.974-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>List comprehension ruby vs python</title><content type='html'>Been exploring a bit of list comprehension in Python so today I thought I peeked over the fence to see a bit of what is happening at ruby's end..&lt;br /&gt;&lt;br /&gt;I really like how they are doing their list comprehension over there, check this example out:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[1,2,3,4,5].select(&amp;:even?).map(|x| x*3)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That is almost readable code even in English! I would read it as something like this.."From the list 1,2,3,4,5 select even numbers and map it to number times 3". Really nice!&lt;br /&gt;&lt;br /&gt;This vs the clunkier Python code ...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[x*3 for x in [1,2,3,4,5] if x%2 == 0]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I mean it both works just that it seems more elegant in ruby. Would be nice if we had that even or odd function in Python. Yeah I know it's trivial to write ... but then following that logic wouldn't it also be trivial to include it in the standard library. Probably my way of emulating this example ain't exactly the best and there are other more succint ways of doing it, if so be great to drop me a line here, but for now hang on while I peek over the fence more :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2008531335235183215?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2008531335235183215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2008531335235183215' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2008531335235183215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2008531335235183215'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/11/list-comprehension-ruby-vs-python.html' title='List comprehension ruby vs python'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-416526073517145155</id><published>2010-10-28T08:55:00.000-07:00</published><updated>2010-10-28T08:55:10.045-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Who's playing catch up now?</title><content type='html'>At one time if I remembered correctly, ruby came up with their gems framework first. I tried it out and really liked it as I got to try out various gems without having to worry if my platform had packages for it or not. At that point the poor Python was left in the dust at the other side of the room without anything remote resembling gems or cshell (Perl). &lt;br /&gt;&lt;br /&gt;Fast forward a couple of years and now easy_install and virtualenv and these two great apps are so wide spread. I used them so much and got used to using and depending on them that when I found myself returning to gem to try out watir, a framework for web testing, I found gem to be clunky and unwieldy. Kudos to the Python camp! In such a short time you have left gems shaking it's head disbelief in the dust! Who said snakes can't be fast. &lt;br /&gt;&lt;br /&gt;For those who are interested, I had problems installing the gem for watir and encountered all sorts of errors and upon searching for the download point for watir to download it by hand, let's just say I missed PyPi a lot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-416526073517145155?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/416526073517145155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=416526073517145155' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/416526073517145155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/416526073517145155'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/10/whos-playing-catch-up-now.html' title='Who&apos;s playing catch up now?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6325771256355614562</id><published>2010-10-26T08:01:00.000-07:00</published><updated>2010-10-26T08:01:11.739-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python-Flask packages in opensuse</title><content type='html'>Been doing some work and playing around with opensuse's great build service and as a result, my packages has been accepted by the opensuse team. So, now pensuse has python-flask and a few related packages in there.  &lt;br /&gt;&lt;br /&gt;Use the devel:languages:python and enjoy. &lt;br /&gt;&lt;br /&gt;Alternatively use the search &lt;a href="http://software.opensuse.org/113/en"&gt;http://software.opensuse.org/113/en&lt;/a&gt; to find what you need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6325771256355614562?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6325771256355614562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6325771256355614562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6325771256355614562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6325771256355614562'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/10/python-flask-packages-in-opensuse.html' title='Python-Flask packages in opensuse'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-3950295284499012028</id><published>2010-08-29T00:06:00.000-07:00</published><updated>2010-08-29T00:06:51.739-07:00</updated><title type='text'>Blogging awards</title><content type='html'>Geeta from packt informed me that Packt is having this &lt;a href="http://www.packtpub.com/open-source-awards-home"&gt;contest&lt;/a&gt; for opensource blogs. To quote the site with the contest running on it's fifth installment:&lt;br /&gt;&lt;br /&gt;"Now in its fifth year, the Award, formerly known as the Open Source Content Management System (CMS) Award, is designed to encourage, support, recognize and reward not only CMSes but a wider range of Open Source projects."&lt;br /&gt;&lt;br /&gt;Nominations start on August 9 and ends on September 17, so get your nominations in! You can read the full announcement &lt;a href="http://www.packtpub.com/blog/packt%27s-2010-open-source-awards-announcement"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-3950295284499012028?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/3950295284499012028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=3950295284499012028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3950295284499012028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3950295284499012028'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/08/blogging-awards.html' title='Blogging awards'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-3710481476127045375</id><published>2010-08-12T19:03:00.000-07:00</published><updated>2010-08-12T19:03:24.734-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>easy_install how I wish ...</title><content type='html'>I use a lot of easy_install during the day to manage my packages. First off the bat let me just get this off my chest, I hesitated like about 10 times before writing this article, for fear of getting panned all the way to Sunday, but then Sunday isn't really that far away so here goes. Also, before that if you are going to pan me or burn my ass for not reading docs at least at the end of it disseminate some useful info at the end of the burning comment so that everybody can benefit from it. God knows I would appreciate it. &lt;br /&gt;&lt;br /&gt;I was doing some stuff on Pylons and for some reason Routes-1.12 was screwing stuff up, so I had to downgrade Routes by doing something like:&lt;br /&gt;&lt;br /&gt;easy_install 'Routes&lt;1.12' and it did it's work well enough.&lt;br /&gt;&lt;br /&gt;Two thoughts itched at my thoughts though ... the whole experience of downgrading Routes felt a little bit too deja-vuish to be comfortable. Did I not do this before the other day? I could have sworn it was working the other day with Routes-1.11. All of this mental itching started a seed of mistrust for my hithero good simple friend easy_install. &lt;br /&gt;&lt;br /&gt;Anyways, I just proceeded but now with an eye on my friend in the corner just to check up on what the macha was doing. I tried to find out the version of route that was running from easy_install, hmmm there was no way of doing that! At this point I just hear those magnums and AK-47s from all of you Python elites ready to blow me to kingdom come, as they always say "easy_install is meant for easy installing!" Okay okay, but is it so very hard to write it so that we can do something like:&lt;br /&gt;&lt;br /&gt;'easy_install query Routes' ??&lt;br /&gt;&lt;br /&gt;Remember pan me at this point if you want if you know that easy_install can do it somehow with some black magicks but at least let everybody know how. In the end I settled for this:&lt;br /&gt;&lt;br /&gt;'python -c 'import routes;print routes.__path__'&lt;br /&gt;&lt;br /&gt;Sigh ... I know my ass is just going to be hurting after this ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-3710481476127045375?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/3710481476127045375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=3710481476127045375' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3710481476127045375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3710481476127045375'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/08/easyinstall-how-i-wish.html' title='easy_install how I wish ...'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6788398692812234664</id><published>2010-08-11T02:28:00.001-07:00</published><updated>2010-08-11T02:33:12.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>New Book from Packt</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;Guys from packt have been hitting the web quite frequently and have sent me another book to review, this time Object Oriented programming in Python. Always wanted to read about this. &lt;/p&gt;&lt;p&gt;Anyway you can find a peek here:&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/sites/default/files/1261-chapter-7-Python%20object-oriented-shortcuts.pdf"&gt;Chapter No.7: Python Object Oriented Shortcuts&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;p/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6788398692812234664?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6788398692812234664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6788398692812234664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6788398692812234664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6788398692812234664'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/08/new-book-from-packt.html' title='New Book from Packt'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2399295908437613212</id><published>2010-07-10T08:48:00.000-07:00</published><updated>2010-07-10T08:48:12.599-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>My easy buildout example Pt. 1</title><content type='html'>For a long time I could not make heads or tails of buildouts just that I kept on hearing that it's supposed to be very easy to make packages and distribute them. So finally this week end I sat down, rolled up the sleeves and decided to really try and understand what I was missing.&lt;br /&gt;&lt;br /&gt;My aim, create the world's easiest package with absolutely nothing in it. All I wanted to do was just understand what is going on.&lt;br /&gt;&lt;br /&gt;Firstly I needed to create my own package, for this I let the great python paste script do all the heavy lifting for me:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[lowks@bobot-mdv-ng pylons]$ ./bin/paster create -t basic_package buildout_example&lt;br /&gt;Selected and implied templates:&lt;br /&gt;  PasteScript#basic_package  A basic setuptools-enabled package&lt;br /&gt;&lt;br /&gt;Variables:&lt;br /&gt;  egg:      buildout_example&lt;br /&gt;  package:  buildout_example&lt;br /&gt;  project:  buildout_example&lt;br /&gt;Enter version (Version (like 0.1)) ['']: 0.1&lt;br /&gt;Enter description (One-line description of the package) ['']: Buildout Example&lt;br /&gt;Enter long_description (Multi-line description (in reST)) ['']: Buildout Example&lt;br /&gt;Enter keywords (Space-separated keywords/tags) ['']: buildout example&lt;br /&gt;Enter author (Author name) ['']: Low Kian Seong&lt;br /&gt;Enter author_email (Author email) ['']: kianseong@gmail.com&lt;br /&gt;Enter url (URL of homepage) ['']: www.lowkster.com&lt;br /&gt;Enter license_name (License name) ['']: BSD&lt;br /&gt;Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]:&lt;br /&gt;Creating template basic_package&lt;br /&gt;Creating directory ./buildout_example&lt;br /&gt;  Recursing into +package+&lt;br /&gt;    Creating ./buildout_example/buildout_example/&lt;br /&gt;    Copying __init__.py to ./buildout_example/buildout_example/__init__.py&lt;br /&gt;  Copying setup.cfg to ./buildout_example/setup.cfg&lt;br /&gt;  Copying setup.py_tmpl to ./buildout_example/setup.py&lt;br /&gt;Running /home/lowks/virtualenv/pylons/bin/python setup.py egg_info&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What the paste script will do is it will ask you a bunch of questions where all the answers is used to fill up your setup.py. Your setup.py now will look something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from setuptools import setup, find_packages&lt;br /&gt;import sys, os&lt;br /&gt;&lt;br /&gt;version = '0.1'&lt;br /&gt;&lt;br /&gt;setup(name='buildout_example',&lt;br /&gt;      version=version,&lt;br /&gt;      description="Buildout Example",&lt;br /&gt;      long_description="""\&lt;br /&gt;Buildout Example""",&lt;br /&gt;      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers&lt;br /&gt;      keywords='buildout example',&lt;br /&gt;      author='Low Kian Seong',&lt;br /&gt;      author_email='kianseong@gmail.com',&lt;br /&gt;      url='www.lowkster.com',&lt;br /&gt;      license='BSD',&lt;br /&gt;      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),&lt;br /&gt;      include_package_data=True,&lt;br /&gt;      zip_safe=False,&lt;br /&gt;      install_requires=[&lt;br /&gt;          # -*- Extra requirements: -*-&lt;br /&gt;      ],&lt;br /&gt;      entry_points="""&lt;br /&gt;      # -*- Entry points: -*-&lt;br /&gt;      """,&lt;br /&gt;      )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Wow! How did that just happen ?? Well the paster script as promised did all the heavy lifting and filled up the setup.py with all the input you just put in just now. Isn't that magical ?&lt;br /&gt;&lt;br /&gt;If you are doing in a virtualenv, do a 'easy_install zc.buildout' to get started on getting all the buildout stuff. Remember that you will definitely find other guides somewhere else to do this. I am just writing this down as an exercise and a reminder to myself. &lt;br /&gt;&lt;br /&gt;After you finish installing zc.buildout, to sprinkle the buildout magic in your current source directory, cd into the source directory which for this example would be the buildout_example and then all you have to do is run '../bin/builout init'. It is really really easy! &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[lowks@bobot-mdv-ng buildout_example]$ ../bin/buildout init&lt;br /&gt;Creating '/home/lowks/virtualenv/pylons/buildout_example/buildout.cfg'.&lt;br /&gt;Creating directory '/home/lowks/virtualenv/pylons/buildout_example/bin'.&lt;br /&gt;Creating directory '/home/lowks/virtualenv/pylons/buildout_example/parts'.&lt;br /&gt;Creating directory '/home/lowks/virtualenv/pylons/buildout_example/develop-eggs'.&lt;br /&gt;Generated script '/home/lowks/virtualenv/pylons/buildout_example/bin/buildout'.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That's almost it! Thanks to your fairy god mother buildout script, you will find a bunch stuff already created. Most of the guides I read was too heavy as it tried to get too much stuff done now ... so I am going to cover more in the second part. For now just pat your back in that you are 3/4 done! Go have a great cup of puerh tea!&lt;br /&gt;&lt;br /&gt;For the next part we will see what each part in the buildout.cfg and at the end we will see how to finish the buildout process plus create a section for nosetests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2399295908437613212?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2399295908437613212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2399295908437613212' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2399295908437613212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2399295908437613212'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/07/my-easy-buildout-example-pt-1.html' title='My easy buildout example Pt. 1'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-5231341209144864601</id><published>2010-06-27T00:40:00.000-07:00</published><updated>2010-06-27T00:44:46.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Did you know?</title><content type='html'>There are some of my overseas friends that are genuinely surprised when they visit my homeland Malaysia, to find that people are actually civilized, not swinging from tree to tree in loin cloths. To these people, with a sense of pride I even venture to tell them "We even have an healthy OpenSource movement !". That being said, this is not a posting about pride.&lt;br /&gt;&lt;br /&gt;As I was driving back home I thought about the point of this post, what I wanted to say. I guess I just wanted to let my other Python and OpenSource audience or brothers on the other side of the globe know what is the state of acceptance of Python and other OpenSource technologies in most of the corporate sectors over here. I summarized this list after talking and being turned down by a few corporate companies recently for employment. Here goes ...&lt;br /&gt;&lt;br /&gt;Did you know ...&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Most of the corporate customers, banking sectors, basically the people that matters still think that most of the OpenSource technologies such as Python, Ruby, MySQL is unsecure and reject it based on that? "unstable" is the word they use. PhP which runs probably the majority of the websites in the world is shunned for security reasons while they force their standards of using Java for all of their internal applications!&lt;/li&gt;&lt;li&gt;While some banks accept that they cannot be a total island and reject OpenSource technologies, they require all components you use in a project to be listed down. &amp;nbsp;I don't know why, probably they want to scrutinize the list and make sure that everything is secure before accepting any "unstable" application. This vs. the fact that M$ Products all around that are used all around their establishment which do not even reveal any of the components used in their products!&lt;/li&gt;&lt;li&gt;All of these guys complain about the fact that languages like Python should not be used based on the fact that it's not officially supported and at the same time accept Java? Ermmm .... I do hope that Oracle signed an agreement with Sun before buying it that it will never close down support for Java even if it gets unprofitable.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Almost all of the major financial institutions that I know of that reject OpenSource use products based on OpenSource such as F5, HP and Bluecoat to run their daily operations. Should I be afraid now?&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;It is my hope that since this blog has a audience of somewhat more than 3 people that the CEO or the decision makers of these&amp;nbsp;institutions chance upon this blog and realize how flamingly stupid their decision for rejecting OpenSource based on these FUD is. &amp;nbsp;At least if you want to so damn secure then you should be fair and insists that all of your products such as M$ products reveal all of their components and source code so that you can audit it (If you really have so much resources to audit all of the things you use). When you succeed in doing that then the good thing is after that you can set up your own freaking software company. Come on, meet me half way here I would really like to believe that the people which I trust to take care of my money at least know their mouth from their asshole when it comes to the apps they are using to run their daily operations!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For No. 4, don't you think that since these Products use the same OpenSource tools that you rejected, that they would also be unstable or unsecure? When will you learn that it's not the tool you use that makes the app unstable, IT'S HOW YOU BUILD OR PROGRAM IT????? Then based on this logic all of those applications should be rejected too right? Why don't you?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After thinking about it for some time, I decided to start working with some local Universities to educate their students by offering my time to do small projects. I am meeting up with a lot of resistance but I am optimistic. Although my small ship is sailing alongside behemoths like M$ who sponsor everything from labs to the tissue our snot nosed university graduates use to wipe their nose with, the acceptance is growing. More of these students are and have heard about OpenSource technologies at least and a few of the major education&amp;nbsp;institutions have started to accept OpenSource technologies.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To change the whole&amp;nbsp;apocalyptic&amp;nbsp;outlook for being an "OpenSource consultant" now, fresh graduates will need jobs waiting for them. Show them that it pays to pick up this knowledge or study and they will. Now, the few misfits that dare to venture down the OpenSource hole, always have this unemployment cloud hanging over their heads when they graduate. Herein lies a problem. If this was to go right, these students who invest their time and energies needs jobs, good high paying jobs when they go out and dare to put the current deal breaker word "OpenSource" on their resumes. For that to happen, we need some MNCs out there to start realizing that the space between their ears would be better employed to think with instead of the hole where excrement comes out from. &amp;nbsp;I really hope that this slap on the face really lands on the right audience as I really hope that one day Malaysia too can come out of this intellect and choice stranglehold that some proprietary vendors think of putting us in.&lt;br /&gt;&lt;br /&gt;I would like one day to be able to proudly exclaim "This app was built using OpenSource technologies" like the way it should be instead of having to hide behind generalizations or something out right lying.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-5231341209144864601?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/5231341209144864601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=5231341209144864601' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5231341209144864601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5231341209144864601'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/06/did-you-know.html' title='Did you know?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2377731776409572990</id><published>2010-06-25T08:29:00.000-07:00</published><updated>2010-06-25T08:34:05.341-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mandriva'/><title type='text'>Mandriva pt 2</title><content type='html'>Another little thing that Mandriva paid attention to that makes me like it that much more. After reading the comments to the earlier post, I enabled the backports and installed chrome from the backports, checked the flash plugin out of the box and guess what? It just works!&lt;br /&gt;&lt;br /&gt;Great job mandrivians! It's small touches like this that shows you care and make repeat customers (like me) as well as new ones! Btw, I am still trying out the multitude of guides on how to get flash working on Fedora 13 x64 without success.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2377731776409572990?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2377731776409572990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2377731776409572990' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2377731776409572990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2377731776409572990'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/06/mandriva-pt-2.html' title='Mandriva pt 2'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7792820555704365176</id><published>2010-06-23T00:59:00.000-07:00</published><updated>2010-06-23T01:01:37.857-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='mandriva'/><category scheme='http://www.blogger.com/atom/ns#' term='fedora'/><title type='text'>Moving to mandriva?!</title><content type='html'>Never thought I would be writing this, but I am actually considering moving my Linux boxes (based mainly in OpenSuSE and Fedoras) to Mandriva! During my hey days we always considered Mandrake (it's name then) something of a play distribution or a distribution for Linux beginners and should not be used for 'serious' work.&lt;br /&gt;&lt;br /&gt;Fast forward about 10 years, after a name change I don't know why suddenly I felt an urge to pick up the latest version of Mandriva 2010 to give it the proverbial spin. After playing around with the bought version of Mandriva (yes I actually bought a copy!). I really started liking it. Let me just list down a few of the reasons why.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There is a wealth of packages. I was not left wanting for any specific packages. Most of the packages I needed was there.&amp;nbsp;&lt;/li&gt;&lt;li&gt;For a rpm based distribution the package manager is blindingly fast and contains a couple of things done right I wish was in zypper and yum. One of them being the ability to pass as an argument the bandwidth that is to be consumed by urmpi (their package manager) during updates or installation. This I found to be very useful in my old office who was sharing bandwidth with another company! They also do some smart things to speed things up during updates such as by default not downloading the description of patches unless needed (when clicked on)&lt;/li&gt;&lt;li&gt;The network manager is cool. I like how Mandriva does their network manager. It's independant of the DE. For example, if I am logged into XFCE and wanted to move over to KDE or some other DE, and I am already connected wirelessly, after logging out and in, I am still connected because the network manager is&amp;nbsp;separate from the DE. Oh! How I wish the other distros would do this simple little thing!&lt;/li&gt;&lt;li&gt;Their look and feel is quite standard across all DEs and WMs. Now the one small bug in the ointment is that I found that LXDE, the new favorite new kid on the block does not work correctly.&lt;/li&gt;&lt;/ol&gt;I am trying my best to find fault with Mandriva 2010 and can find little (The 'little' here would be it does not have a package for chromium-browser!), so I am seriously considering moving over to Mandriva from what I am using now. Just downloaded the Free version and am thinking hard why should I be keeping Fedora 13 on my laptop now, though truth be told Fedora 13 does a lot of things right too and after the little debacle of getting flash-plugin working correctly is sitting happily on my X61 now. Ah ... decisions, decisions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7792820555704365176?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7792820555704365176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7792820555704365176' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7792820555704365176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7792820555704365176'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/06/moving-to-mandriva.html' title='Moving to mandriva?!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1506066859786790673</id><published>2010-06-22T10:36:00.000-07:00</published><updated>2010-06-23T01:51:00.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><title type='text'>New Book review Django- Django E-Commerce by Jesse Legg</title><content type='html'>&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=lowks&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=1847197000&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Folks at Packt sent me another book to review which is Django E-Commerce. Right off the bat I got some comments regarding how relevant this book might be with so many applications based on Django that do ecommerce floating out there.&lt;br /&gt;&lt;br /&gt;For me though, I find this book is suited for those people who want to use Django building an Ecommerce site by using the tools provided by a default installation of Django. It also gives insight into how the ecommerce tools are built. It starts from the best place possible which is from a working example.&lt;br /&gt;&lt;br /&gt;Each section is explained carefully from the overview to the technical implementation of the module. This is very useful and I learnt a thing or two reading most of the explanation here.&lt;br /&gt;&lt;br /&gt;The payment process here employs the 'google checkout' processor to process the payment. What is covered here is also the use of one of Django 'secret sauce' which is views and each section and code is explained. The steps on how to lift a normal Django component to enterprise level functionality is explained starting from using the most basic way of implementation. This approach is taken in explaining the search module and it's great! I like it this way as it's a progression approach and programmers will learn why code and approaches evolve the way they do. Great way of learning! Here too the author explains and shows how to use some of the most famous Django plugins to achieve what we want to do.&lt;br /&gt;&lt;br /&gt;Using&lt;a href="http://www.sphinxsearch.com/docs/current.html"&gt; Sphinx&lt;/a&gt; for an E-Commerce site is also used here and the value here is that the example can be easily expanded to create more complex examples or sites. Later in the reporting section integration to salesforce is shown. I really like this as these examples are practical examples that can be used to create a real E-Commerce site that works and avoid walking too much on the academic side of things. This is the main strength of this book. Amazon, JScript and a lot of other tools are also shown.&lt;br /&gt;&lt;br /&gt;I will definitely be keeping this book handy on my book shelf for reference in building an E-Commerce app and I highly recommend it.&lt;br /&gt;&lt;br /&gt;Check out the book here:&amp;nbsp;&lt;a href="http://www.packtpub.com/django-1-2-e-commerce-build-powerful-applications/book?utm_source=blog.lowkster.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003437"&gt;http://www.packtpub.com/django-1-2-e-commerce-build-powerful-applications/book?utm_source=blog.lowkster.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003437&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1506066859786790673?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1506066859786790673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1506066859786790673' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1506066859786790673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1506066859786790673'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/06/new-book-review-django.html' title='New Book review Django- Django E-Commerce by Jesse Legg'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6114526394959680323</id><published>2010-05-22T10:31:00.000-07:00</published><updated>2010-05-22T10:31:34.733-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='mandriva'/><title type='text'>A Linux type?</title><content type='html'>As part of what we do, we help business people migrate over from their usually rotten Windows XP, Vista and what ever else incarnation of Redmond OS over to Linux. We found that some people really took to Linux while some got stuck in purgatory complaining constantly in the transition period. I found that certain types of personality as well as expectations makes the whole process smooth and dare I say even enjoyable?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I found that the more open the new user is to a new OS, being more open to forget about Windows they are the more enjoyable the process is. "This used to work so much better on my laptop in Windows ..." kinda attitude will almost guarantee a world of pain. &lt;/li&gt;&lt;li&gt;Having a positive attitude helps ... as in you are home ... your printer does not work instantly ... instead of just chalking it up to the new OS being bad just give it a whirl and think of the fun of trying out something new will make it enjoyable.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Trusting your new OS as well as your new found friend (me) when it comes to buying peripherals will help during the transition.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Those with the attitude above really took to Linux like fish to water and it sorta became their bragging rights in among their friends. Remember too that these are pure business people without any prior Linux experience. So it's gratifying to me to over hear them in conversation with their friends "Aiya ... you are still using that slow piece of crap .. see my new Open Source OS! No virus can touch it and it's blazing fast!" It's nice to know we did one for Linux advocacy in our own way as well as fill our pockets up a bit :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6114526394959680323?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6114526394959680323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6114526394959680323' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6114526394959680323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6114526394959680323'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/05/linux-type.html' title='A Linux type?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7017297095753589123</id><published>2010-05-20T06:58:00.000-07:00</published><updated>2010-05-20T23:47:42.607-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Another book to review! (Django E-Commerce)</title><content type='html'>The nice folks at Packt has sent me another book to review. This time the book is &lt;a href="http://www.amazon.com/Django-1-2-E-Commerce-J-Legg/dp/1847197000?ie=UTF8&amp;amp;tag=lowks&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Django 1.2 E-Commerce&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=lowks&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1847197000" style="border: medium none ! important; margin: 0px ! important; padding: 0px ! important;" width="1" /&gt;. The sample title looks great which includes setting up an e-commerce site in 30 mins using the usual suspects from the Django framework: Admin, generic views and using Checkout from google. The example looks practical and easy to follow ... makes me like this book already. For those of you who want to get a whiff of what this book is like ... here is a link to the sample chapter.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.packtpub.com/sites/default/files/7009-chapter-2-setting-up-shop-in-30-minutes_0.pdf"&gt;https://www.packtpub.com/sites/default/files/7009-chapter-2-setting-up-shop-in-30-minutes_0.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7017297095753589123?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7017297095753589123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7017297095753589123' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7017297095753589123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7017297095753589123'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/05/another-book-to-review-django-e.html' title='Another book to review! (Django E-Commerce)'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8397158948270961316</id><published>2010-05-05T01:35:00.000-07:00</published><updated>2010-05-05T01:38:18.498-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Repoze BFG</title><content type='html'>&lt;a href="http://www.amazon.com/repoze-bfg-Web-Application-Framework-Version/dp/0615345379?ie=UTF8&amp;amp;tag=lowks&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" target="_blank"&gt;&lt;img alt="The repoze.bfg Web Application Framework: Version 1.2" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;Format=_SL160_&amp;amp;ASIN=0615345379&amp;amp;tag=lowks" /&gt;&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=lowks&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0615345379" style="border: medium none ! important; margin: 0px ! important; padding: 0px ! important;" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;I have been trying repoze BFG's tutorials the past few days and I must say that I like it just judging from the tutorials. Firstly I was very surprised the tutorials worked out of the box ... after being hammered around by the tutorials from Grok, so it was a nice surprise. Looking at the examples too it doesn't make my eyes bleed _so_much_ so I am definitely interested to know more about Repoze.&lt;br /&gt;&lt;br /&gt;Developed by &lt;a href="http://agendaless.com/"&gt;http://agendaless.com/&lt;/a&gt; , on the whole the project has a good solid feel to it offering tons of documentations on it's site. Of course you cannot run that far away from the mind-melting Zope framework but then hey! trust me, it looks a whole lot better! It says that Repoze is inspired by Zope, Pylons and Django and I would say it shows in the code produced.&lt;br /&gt;&lt;br /&gt;According to the site, Repoze is MV rather than MVC as there is not much of a 'Controller' to talk about. I am currently actively looking for a project where I can really put Repoze to the metal to see how it fits me in a project environment.&lt;br /&gt;&lt;br /&gt;As someone said long time ago to me ... all frameworks suffer from the same disease ... it can really do the 90% fast and great but it's the last 10% that is going to blast the skin from your bones ... okay so I am paraphrasing, but you get my point. So, I am going to put this one through the paces hopefully initially with a smallish project that is not so heavy with the funky specs with just one or two bumps on the road to stretch the framework a bit. &lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=lowks&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0615345379" style="border: medium none ! important; margin: 0px ! important; padding: 0px ! important;" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8397158948270961316?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8397158948270961316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8397158948270961316' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8397158948270961316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8397158948270961316'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/05/repoze-bfg.html' title='Repoze BFG'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4704541931035898342</id><published>2010-04-15T02:03:00.001-07:00</published><updated>2010-04-15T02:03:58.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>PyCon APAC</title><content type='html'>Well they say that a picture paints a thousand words ... so here we go&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_eVgoKogosHI/S8bWS2Y-PuI/AAAAAAAAAHU/R1fxKiVxsw4/s1600/image002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_eVgoKogosHI/S8bWS2Y-PuI/AAAAAAAAAHU/R1fxKiVxsw4/s400/image002.jpg" width="282" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I think I might go this year just to see how it is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4704541931035898342?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4704541931035898342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4704541931035898342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4704541931035898342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4704541931035898342'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/04/pycon-apac.html' title='PyCon APAC'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eVgoKogosHI/S8bWS2Y-PuI/AAAAAAAAAHU/R1fxKiVxsw4/s72-c/image002.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-9153027303269387271</id><published>2010-04-12T22:59:00.000-07:00</published><updated>2010-04-12T23:12:33.007-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Update on grok web development tryout</title><content type='html'>After dancing around the pale moonlight with a newly slaughtered chicken in my birthday suit, offering fruits to the grok gods, finally today the gods were kind on me and helped me along to find this solution that works! The closest I got the example in the grok book to work is to install the grokproject and start a new project without errors, but when I try to start up the devel server, all sorts of strange manner of monsters jumped out at me.&lt;br /&gt;&lt;br /&gt;Just have a look at this : &lt;a href="http://archive.netbsd.se/?ml=zope-grok-dev&amp;a=2009-01&amp;t=9652486"&gt;archive.netbsd.se&lt;/a&gt; What needs to be done is to edit the paster template and everything will work fine. I guess either this bug has not been looked into or is still an open bug.&lt;br /&gt;&lt;br /&gt;Heh! I spoke too soon, I got to the main page of grok management but as soon as I try to do anything, I get this:&lt;br /&gt;&lt;br /&gt;"TypeError: character mapping must return integer, None or unicode"&lt;br /&gt;&lt;br /&gt;Hmmm ... google gods say this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://mail.zope.org/pipermail/grok-dev/2009-January/007219.html"&gt;Not really a solution&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Not much of a solution it seems, just that Python-2.6 is not supported. I am using grokproject, but how can I see what version of grok is grokproject using. As the mail says, errors like this is really really off putting and does not help with building confidence with the project!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank"  href="http://www.amazon.com/Grok-1-0-Development-Carlos-Guardia/dp/1847197485?ie=UTF8&amp;tag=lowks&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Grok 1.0 Web Development&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=lowks&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=1847197485" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-9153027303269387271?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/9153027303269387271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=9153027303269387271' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/9153027303269387271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/9153027303269387271'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/04/update-on-grok-web-development-tryout.html' title='Update on grok web development tryout'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8911917393675382567</id><published>2010-04-05T00:04:00.000-07:00</published><updated>2010-04-05T00:07:22.326-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Review of Grok Web Development 1.0 Part 1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/51q3ycKcNKL._SL160_.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 130px; height: 160px;" src="http://ecx.images-amazon.com/images/I/51q3ycKcNKL._SL160_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I like Zope/Plone. I repeat I really like Zope and Plone. Though here in this blog I might sometimes balk at the monolithic-ness of the 2.x era of them, fundamentally I like the concepts that they put forth. When things like Django, Turbogears rolled around thanks to Ruby On Rails, the call for Zope to recreate itself was sounded and did they respond! Zope3 was almost a ground up rewrite. At that point I had moved on to Django for one of my projects but I looked back longingly sometimes at the useful components put out by Zope. Then someone told me about Grok. I looked at it and liked it alot (okay maybe I still have reservations about Zodb) and it looked to me very much similar to how Django and others were playing the game, except that Grok came to the party with very advanced clubs and spears inherited from it's day in Zope-2.x! So when I got the chance to review the Grok book from Packt, I jumped at it. I wanted to find out what is the innards of Grok and how to or can I deploy an enterprise project using Grok.&lt;br /&gt;&lt;br /&gt;The review of this book got very much delayed due to the fact that grok, like all other Zope stuff needed Python2.5 or Python2.4 to get working correctly. Now in this day and age of every distro racing to be the latest, bestest and most up to date, it was a challenge for me to get a Python2.5 or Python2.4 easily. I ended up going the VMWare route and installing a copy of Centos5.4 which still spots Python2.4.3 by default. This probably would be the biggest stumbling block of any newbie trying out the book the first time. The examples all require you to have a copy of Python2.5 which can be a challenge to find or install right. Once I had the components, I started on my way by using easy_install and then virtualenv which is the Python Virtual Environment. Again, these would require a little fore knowledge of Python stuff so this book might not be totally for the newbie programmer who don't know anything about the Python programming language. A bit of introduction to Grok, as far as I can remember. Grok came about when there was a little discord in the community about the monolithic-ness of Zope-2.x, when light frameworks such as Django, Turbo Gears and others started coming on to the scene. You can say that the Grok project was created to allow programmers or fans of Zope to enjoy a modular development environment offering the best of Zope where programmers can now pick and choose pieces of it can apply it to their work. I must say that the pieces of Zope when good is truly good and most often than not I find myself recreating some of the functionality of Zope in my projects using other frameworks. What could have been done is to release a VMware image of a working environment to work on. Definitely a boon in terms of speed up of trying out the examples!&lt;br /&gt;&lt;br /&gt;The book starts out the example by using Virtualenv (Python's virtual environment) and easy_install which is a good move as Grok's packages are not readily available and probably installing it would not be the easiest thing to do in the programming world. Getting a relative newbie caught up in installation of Grok when all they want to do is to bring it for a test drive would be painful to say the least. I tried lots of environment including Ubuntu which resulted in errors preventing the example from working until at last I found Centos 64 bit which worked with the examples. The process of finding this out was maddening! Perhaps grok is still under development but what I suspect is that most of grok's dependencies or libraries is still playing catch up with the example in the book. This might be off putting to a Grok newbie venturing into the land of Grok development. The examples were the most enjoyable part of the book where the beginner could feel that they were starting a project from scratch. &lt;br /&gt;&lt;br /&gt;The admin tab in the applications for Grok is touched here and covered in passing highlighting all the main features of all the tabs. In the views section, those who are new to Zope Page Templates and the TAL (Template Attribute Language) will get a nice and concise introduction to some of the functionalities of using ZPT with Grok. Those who are Zope / Plone developers could probably skip this section without too much difficultly unless you are like me who want a refresher's course on ZPT. This deep into the book I really like the examples thrown my way and it's really refreshing for me to see that one of my favorite Python application have reinvented themselves and this bodes well for it. &lt;br /&gt;&lt;br /&gt;Catch more of this review in part 2....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8911917393675382567?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8911917393675382567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8911917393675382567' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8911917393675382567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8911917393675382567'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/04/review-of-grok-web-development-10-part.html' title='Review of Grok Web Development 1.0 Part 1'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8696546043881015177</id><published>2010-04-03T10:36:00.001-07:00</published><updated>2010-04-03T10:43:09.990-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mandriva'/><title type='text'>Getting mtp device (Sony Walkman) to automount in mandriva 2010 powerpack</title><content type='html'>Currently I am running Mandriva 2010 powerpack on my laptop. Everything worked correctly and great and there are a lot of things I like about Mandriva. Today while trying to get my Sony walkman to automount as a usb device it just did not work automagically like how it did in my OpenSuSE. I debugged it a bit and found that it was recognized as a usb device but it just did not mounted automatically (I use KDE). Shot up nautilus and everything worked just great. &lt;br /&gt;&lt;br /&gt;Being in a frisky mode today, I was undaunted and continued to search around for the solution. Found the solution in a Mandriva forum here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.mandriva.com/viewtopic.php?t=87508"&gt;MTP Solved Forum&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A bit outdated yes but I deciphered what I could from there, and found that the solution is to install mtpfs. Just do a 'urpmi mtpfs' as root and your Sony Walkman should automount automagically from thereon after and everything will be hunky dory on your Mandriva baby. &lt;br /&gt;&lt;br /&gt;Btw, I am also quite impressed with the number of packages offered in Mandriva. Nearly all of the Python packages I am used to is in here and the package installer is space age fast!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8696546043881015177?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8696546043881015177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8696546043881015177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8696546043881015177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8696546043881015177'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/04/getting-mtp-device-sony-walkman-to.html' title='Getting mtp device (Sony Walkman) to automount in mandriva 2010 powerpack'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2441329917589530123</id><published>2010-02-22T03:53:00.000-08:00</published><updated>2010-02-22T03:57:33.705-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><title type='text'>Sneak peak preview of upcoming book</title><content type='html'>My friends at packt has sent another book for me to review! The Grok-1.0 is up and I have been looking for this as I have been looking for just an excuse to get my elbows dirty up to Python oil again! &lt;br /&gt;&lt;br /&gt;You can see a preview of the book here: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.packtpub.com/grok-1-0-web-development/book?utm_source=blog.lowkster.com&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_002481"&gt;Preview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Even better a sample chapter here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.packtpub.com/files/7481-grok-1-0-Web-development-sample-chapter-5-forms.pdf"&gt;Chapter 5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is going to be good!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2441329917589530123?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2441329917589530123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2441329917589530123' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2441329917589530123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2441329917589530123'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2010/02/sneak-peak-preview-of-upcoming-book.html' title='Sneak peak preview of upcoming book'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8967733174704847173</id><published>2009-12-17T20:26:00.001-08:00</published><updated>2009-12-17T20:42:30.394-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python training in Malaysia</title><content type='html'>A guy contacted me recently regarding training. Me tried of course to look for local trainers here but some were either too expensive or just strangely did not reply emails. So it boiled down to having to do it myself. My junior programmer (or should I say sys admin since he said he wants nothing to do with programming) asked essentially can we survive being a Python trainer in Malaysia. Sadly, the answer is still no. Training here are few and far apart. After hearing my answer, his face showed a kind of demeanor that your neighbor would have if you drove up the drive way with your broken down Toyota claiming that this is dream car. &lt;br /&gt;&lt;br /&gt;He must have been thinking that Java as a language is still better than Python since he can at least see some Java jobs on jobstreet and stuff. Generally that is still the whole conception of Python in Malaysia. Talks do help. We just need more. At least nowadays when I talk to corporates about Python they don't ask me why I suddenly bring wildlife into a conversation when they asked me what would the ideal programming language that their IT department should adopt for high productivity. I should hit the university level more to create more awareness. I have thought classes for corporates who were full of Python doubters and at the end of the class, all the Java people walked out at least respecting Python for what it can do and actually contemplating using Python in their environment. &lt;br /&gt;&lt;br /&gt;It's really gratifying to see programmers who were initially so skeptical about Python suddenly light up to the possibilities of using Python for their work after being in the Python training with me. That to me is priceless and I wish that I could do more of these kind of Python gigs. &lt;br /&gt;&lt;br /&gt;I think that awareness is the key for us Pythonistas to be able to survive doing the thing that we love so much here. I think that here at least if more people knew about the existence of Python it would really help and then I can finally tell that doubting junior system administrator ... "Yes! There is a future being a Python trainer!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8967733174704847173?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8967733174704847173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8967733174704847173' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8967733174704847173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8967733174704847173'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/12/python-training-in-malaysia.html' title='Python training in Malaysia'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1557096267100081325</id><published>2009-12-03T00:53:00.000-08:00</published><updated>2009-12-03T00:58:31.769-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Project Documentation</title><content type='html'>Currently I am in the process of passing down my project to some juniors and I find the need to document it. Me being the lazy ass programmer that I am obviously started to look for something that would allow me to complete my documentation in as least steps and most painless way as possible. Found two main applications that I am using now:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://sphinx.pocoo.org"&gt;Sphinx&lt;/a&gt; -&gt; For main documenting work.&lt;br /&gt;&lt;br /&gt;2. &lt;a href="http://happydoc.sourceforge.net/"&gt;Happydoc&lt;/a&gt; -&gt; For parsing and generating code documentation. &lt;br /&gt;&lt;br /&gt;Both are quite easy to use and allows documentation to be generated in various format, which includes latex, html or pdf. Nice thing is both supports rest type reStructured text formatting which I just absolutely adore and is great to work with. I am especially impressed with Sphinx and the beautiful documents generated by Sphinx, coming with it's own search and everything. It's just what the lazy programmer doctor ordered. I am still evaluating both of these programs and am still open to other choices but so far these fit the bill nicely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1557096267100081325?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1557096267100081325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1557096267100081325' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1557096267100081325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1557096267100081325'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/12/project-documentation.html' title='Project Documentation'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6715425219586621936</id><published>2009-11-11T17:48:00.000-08:00</published><updated>2009-11-11T17:59:41.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>django-evolution aka orm pain part 2</title><content type='html'>Finally bit the bullet and tried out a new application to help me do the changes I needed to do on the db and boy am I glad I did. &lt;a href="http://code.google.com/p/django-evolution/"&gt;django-evolution&lt;/a&gt; is a joy to use. It's easy to install with no strange dependencies and it did everything out of the box as described. Initially somethings did trip me up such as the django-evolution's initialization actually looks only at the models.py and does not actually bother what is really in the db, as in say the models.py you define a field that is not actually in the db during the first 'python manage.py syncdb' to create the django-evolution table, it does not actually know that and will just carry on not knowing that there are discrepancies between the models.py and the actual db. &lt;br /&gt;&lt;br /&gt;After I figured that part out, it was easy. Just add the fields and their attributes, re-run an update script on my data and everything is done. Now my selects are much faster. Initially a 3k row db select was taking 50s and now using the caching functionality of select_related() it comes back in a blazing 4s. Ah here too initially I got tripped a bit as after putting in all the relationship I noticed that it still did not do a cache select_related until I did some digging and found that all columns defined with 'null=True' is not cached by select_related(). Looking at the actual sql generated by the Django CRM, it looks proper and very well done. I am still checking out the little nooks and crannies of the application but so far I give django-evolution the thumbs up! I am actually looking at the code to see if during the initial syncdb django-evolution can actually peer into the db to see if the definitions are actually kosher before proceeding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6715425219586621936?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6715425219586621936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6715425219586621936' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6715425219586621936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6715425219586621936'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/11/django-evolution-aka-orm-pain-part-2.html' title='django-evolution aka orm pain part 2'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1160653915846342444</id><published>2009-11-09T00:53:00.000-08:00</published><updated>2009-11-09T01:05:00.380-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>When you play outside of django's ORM ... you get pain!</title><content type='html'>For one of my projects, I forgot to implement the relationship of one my models. I thought I could get away with it by writing a tag that made a query to the db upon being fed a string in the report. To my horror, this caused the report to take about 50seconds to generate for a paltry 3000 record db! Upon tailing the logs of query.log, I found that the multitude of query to the db was causing the problem. It was basically hitting the db about 3000+ times for a single page report. That is when I found out the good thing about Django's select_related(). The problem now is, I do not have that relationship and need to build that relationship into the db. Not exactly fun with a db that is already populated with data. Led me to thinking, while Django's ORM might be great for stuff like calling data from another table, but would it also incur a performance hit everytime data is being queried. I have heard Django being used for high traffic sites but then are these high traffic sites?&lt;br /&gt;&lt;br /&gt;I tried looking around but I could not find a satisfactory answer to this: "What if you wanted to model data for an existing MyISAM table which does not have the relationship?" It would be nice if Django provided a mechanism to recreate the relationship between MyISAM tables that is implemented at the MiddleWare. Say if I were to go the Django way now, would I have to dump out the data, re-implement the tables in a 'Django-ic' model then reimport back my data?&lt;br /&gt;&lt;br /&gt;Currently I am feeling that in order to play in Django ORM's park. I am being forced to play by it's rules. If I opt to write my sqls raw then the ORM takes back it's ball and refuses to let me even venture into it's side of the park and I am left to recreate back a lot of the convenient functionality that was provided by the ORM layer. There doesn't seem to be a nice middle ground and that just sucks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1160653915846342444?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1160653915846342444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1160653915846342444' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1160653915846342444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1160653915846342444'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/11/when-you-play-outside-of-djangos-orm.html' title='When you play outside of django&apos;s ORM ... you get pain!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-3142833532692301022</id><published>2009-09-18T09:03:00.000-07:00</published><updated>2009-09-18T09:10:14.987-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Patching Fun - Update</title><content type='html'>Looking around for a solution for a cleaner way of patching up my code on the Windows server, without installing the unixtools for windows, I eventually arrived at the &lt;a href="http://code.google.com/p/python-patch/"&gt;python-patch tool&lt;/a&gt;. This nice little (less than 600 lines) tool allows you to have patch like capability and all deliciously packed in a Python script. Thanks techtonik!&lt;br /&gt;&lt;br /&gt;So now I can just packup the patch.py Python script together with my patch file, and Walla! the admin at the other side can just run something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;python patch.py diff_patch&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;to patch up my code. With a little modification, the patch.py can even generate a results.log for me to review the patch process. If anything were to go south, I can just send the reverse patch. &lt;br /&gt;&lt;br /&gt;Now .... should I just get the script to autorun .... hmmm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-3142833532692301022?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/3142833532692301022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=3142833532692301022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3142833532692301022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3142833532692301022'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/09/patching-fun-update.html' title='Patching Fun - Update'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8482325590715481245</id><published>2009-09-17T12:18:00.000-07:00</published><updated>2009-09-17T12:51:30.046-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Patching fun (on windows) 101</title><content type='html'>I have sent about 100 odd patches to a system I am working on and in this post I gather together some of the lessons I have gathered along this path. I write all of my patches in Python and after much hair pulling sessions over the phone with customers am happy to say the sacrificed hair did go along to help me have a epiphany of what would be the best way to help customers who are willing to help us apply patches along. You can say it's a collection of what to do and what not to do tested in real life project scenarios.&lt;br /&gt;&lt;br /&gt;First off and of ultimate importance is to get into the right frame of mind before you write a patch to be sent to a customer. The frame of mind you should be in is ... remember that paying customers never ever want to help you apply patches so if you run across one that is willing (like in my case), thank Allah, Buddha, the Universe or whatever deity you pray to for your lucky break! Your (paying) customer does not owe you anything, in fact you are in their debt if they even entertain your patch request. Get in this frame and your chances of writing a successful patch will be increased two fold.&lt;br /&gt;&lt;br /&gt;Okay, here are some dos for writing patches. These steps below are for systems that are not accessible remotely and a bit physically too far or demanding for your to travel to.&lt;br /&gt;&lt;br /&gt;1. Always recreate (as much as possible) the environment in which to run the patch. This means that if your customer's site has a G Drive (windows) your machine in which you are creating your patch better have that. I have had some great time tracking down why a patch does not work when it magically died while trying to open up a log file on Drive G in a machine that only has C and D drives. This includes in the case of windows of using the same binaries of libraries that your code belongs to. Just recently I had a good time on the phone with a customer who claims that come functionality was not working whereas using we were both using the same script! He insisted that my script was not working while I kept on suspecting that the problem lies between the computer and the chair. Finally I found the problem was due to an outdated binary build that he was using. If having the same build is no longer possible, at least go through the changelog of whatever library you are using to get prepared for whatever problems that might arise.&lt;br /&gt;&lt;br /&gt;2. Always have backups of each of your patching steps. In fact it's best to include a sort of un-patch patch just incase your patch goes south. The steps to backup the important files should be done by your script and should not depend on your customer. So something like 'Please backup and replace file bla-bla" is not recommended because how do you know what your customer is backing up the original file to. Here you are thinking that they backed it up to something like &lt;original_file&gt;.bak and they backed it up to &lt;original_file&gt;.bak. A lot of fun will ensue in the case if you have to write a revert script later. Step no. 2 can be summarized as your customer should do as least as possible in the patching process short of running a patch script.&lt;br /&gt;&lt;br /&gt;3. Generate error and result log of your patch process and ask the good will of your customers to send those logs back to you. This will help in determining if your patch process is successful.&lt;br /&gt;&lt;br /&gt;4. Describe in your email what should the customer see in the event that your script is successfully run. I find here the quickest and surest way is to include a screenshot of what they should see. Typing out the results is error prone and it's hard to describe what they should see plus do you think your customers got that much time to read a long drawn out email? &lt;br /&gt;&lt;br /&gt;5. Test, test, test and test each of your steps at least 4 times before sending the patch out. No testing is too much in this kind of scenario especially if you are dealing with live data.&lt;br /&gt;&lt;br /&gt;6. Always include a way in which to identify what build are you customers currently running. This could be as simple as a BUILD text file indicating what BUILD are they currently running or in the case of a web application, a build number nicely tucked away at the top left hand or right hand corner of the screen. Everyone of your patches should update this BUILD number. This is instrumental if you were on the phone with your customer and want them to help you identify how updated are their source code.&lt;br /&gt;&lt;br /&gt;Hopefully this post will help me remember the things that I did right and those that I painfully learned not to do again. It would be great too if it can help you avoid those pot holes that have claimed the lives of a few of those hair on my head. Happy patching!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8482325590715481245?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8482325590715481245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8482325590715481245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8482325590715481245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8482325590715481245'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/09/patching-fun-on-windows-101.html' title='Patching fun (on windows) 101'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-5645024126249161468</id><published>2009-09-07T11:48:00.000-07:00</published><updated>2009-09-07T12:01:35.865-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>import scripts using python</title><content type='html'>Today I finished another import script using python. The import medium is from Excel to MySQL db. I began my importing exploits using Python and have used it ever since. After doing so many import scripts using Python as my main language I could not think of using anything else. While some other people might be using Bash, I have been using Python ever since the beginning I got my feet wet in doing data migration for systems. Some of the reasons why I like Python for this task are:&lt;br /&gt;&lt;br /&gt;1. The wealth of libraries available. I particularly like the csv module which I use heavily in my imports the DictReader module in the csv module also makes short of a lot work during imports. I just cannot imagine using something else.&lt;br /&gt;&lt;br /&gt;2. The dicts, the lists and tuples are indispensable and great little tools in sifting through data.&lt;br /&gt;&lt;br /&gt;3. Python's clean and structured program allows me to pass the script to juniors or allows me to look back at the import script to either use it at another location or improve it 3 months down the line.&lt;br /&gt;&lt;br /&gt;Then the question is why don't more people write import scripts in python? Well I can think of a few cons when it comes to using Python in import scripts and these are:&lt;br /&gt;&lt;br /&gt;1. For old ass machines such as old style Solaris or HP/UX Python is just not installed by default. While you can install a copy of python on these boxes, sometimes you do not have that liberty and besides the first rule of any importing job is not to add more applications on the system you are trying to import data into.&lt;br /&gt;&lt;br /&gt;Hmm I think I can only think of one valid reason why using Python would not give you and edge. I am using Python till this day importing all my data and have not faced any issues yet. How is your experience ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-5645024126249161468?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/5645024126249161468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=5645024126249161468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5645024126249161468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5645024126249161468'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/09/import-scripts-using-python.html' title='import scripts using python'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2300890266021511605</id><published>2009-08-30T04:38:00.000-07:00</published><updated>2009-08-30T10:47:08.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>My Personal take Python 31 on Windows</title><content type='html'>Downloaded and installed Python 3.1 on Windows to kick around the tyres a bit on the new version of Python. Currently I am getting myself used to one of the biggest changes where print is now a function. This means that stuff like this:&lt;br /&gt;&lt;br /&gt;print "testing" &lt;br /&gt;&lt;br /&gt;will not work anymore. This will now give you an error :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; print "testing"&lt;br /&gt;  File "&lt;stdin&gt;", line 1&lt;br /&gt;    print "testing"&lt;br /&gt;                  ^&lt;br /&gt;SyntaxError: invalid syntax&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The help function has also been made a function. This means that ....&lt;br /&gt;&lt;br /&gt;help &lt;function&gt; will not work too and will just end up ...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; help print()&lt;br /&gt;  File "&lt;stdin&gt;", line 1&lt;br /&gt;    help print()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now you will have to put up the parentheses like so ... help(print)&lt;br /&gt;&lt;br /&gt;The map function will also not work like it used to. I am still trying to find out how it works.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; def print_me(line):&lt;br /&gt;...     print (line)&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; print_me("stuff")&lt;br /&gt;stuff&lt;br /&gt;&gt;&gt;&gt; a = ["print","me","now"]&lt;br /&gt;&gt;&gt;&gt; map(print_me,a)&lt;br /&gt;map object at 0x01765CD0&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;These means too most of my code would be borked .. sigh! Stuff that I have been using for my client's code like Django and Zope will need to be updated too. This is all I have explored for now. Will write more as I encounter more. &lt;br /&gt;&lt;br /&gt;Update: I updated the title a bit after the first comment. Tsk tsk some people can so be so uptight these days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2300890266021511605?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2300890266021511605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2300890266021511605' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2300890266021511605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2300890266021511605'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/08/python-31-on-windows.html' title='My Personal take Python 31 on Windows'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7549190307376726720</id><published>2009-07-27T21:12:00.001-07:00</published><updated>2009-07-27T21:27:09.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Django 1.1</title><content type='html'>Django 1.1 is nearing a release and from what I can see about the new features the two most exciting one (to me at least) are improvements from the models end that is the "managed" model and the "proxy" models. Managed models would be good for existing tables that should not be managed by django. This is useful in some of my projects in which I am using django for database work but do not necessarily need django to manage it. Now if only the database evolve stuff or database versioning stuff: http://paltman.com/2008/jul/03/managing-database-changes-in-django/ could be integrated into the core, now that would be superb!&lt;br /&gt;&lt;br /&gt;Talking about migration too, is this project: http://code.google.com/p/dmigrate/ still alive. Doesn't look like there are any downloadable stuff. The examples are half of what I need what I further need is the ability to undo db migration changes between revisions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7549190307376726720?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7549190307376726720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7549190307376726720' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7549190307376726720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7549190307376726720'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/07/django-11.html' title='Django 1.1'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-3324008122627603161</id><published>2009-06-20T11:58:00.000-07:00</published><updated>2009-06-20T12:14:39.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>ModelAdmin readonly fields</title><content type='html'>Finalizing my web application, there was a few outstanding patches left to do. One of this I always felt strange why it was left out in the open. Django's admin interface form by default allows you to edit the primary key of the model. I always felt strange why it allowed this as it led to unexpected behavior. My users would edit the primary key expecting the changes to be done on the record which of course did not happen as django created another new object with the new edited id. &lt;br /&gt;&lt;br /&gt;In solving this bug I was hoping that django's admin model allowed for something like 'readonly = ( 'id_field')' or something like to that respect. Just thinking out aloud but shouldn't this be automatically done for all primary key fields in models.py ? Shouldn't the primary key be made non editable by default unless explicitly stated in the definition? Even then should the primary key be allowed to be edited? If a user were to be allowed to edit the primary key, would it really be editing or 'cloning' a new object with similar data but differing ids? I haven't really done a thorough search yet but I think by default all the fields is open to edit in the current django's ModelAdmin. Of course you hide the field away by chucking the field in the exclude tuple in your model's admin declaration but what if the user wanted to see that field? I was actually quite surprised when a declaration of fields that should be readonly in my ModelsAdmin did nothing. That was the first way I thought of doing it anyway.&lt;br /&gt;&lt;br /&gt;The best would be a new tuple called readonly that would declare fields that are readonly in the change_form. To cut a long story short, I found someone had already created a snippet for it &lt;a href="http://www.djangosnippets.org/snippets/937/"&gt;here&lt;/a&gt;. Works perfectly and it's exactly what I was looking for. The questions that remain however are:&lt;br /&gt;&lt;br /&gt;1. Why isn't this in the core?&lt;br /&gt;2. Should you actually allow primary key fields to be edited ?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-3324008122627603161?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/3324008122627603161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=3324008122627603161' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3324008122627603161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3324008122627603161'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/06/modeladmin-readonly-fields.html' title='ModelAdmin readonly fields'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-3996617758602773366</id><published>2009-06-16T00:21:00.000-07:00</published><updated>2009-06-16T00:38:28.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Ownership and responsibility</title><content type='html'>One thing that most smaller companies or any company for that matter really treasures are employees who take ownership of what they do. This is because employees that take ownership often will go the extra mile for a project because they feel that they own the project. In my opinion this is hard to create in a employer-employee based company because of the inherent weakness of this structure. Employees are normally paid monthly. Whether they take on more or less projects, their salary will still come in, so the less they do the better off they are. Taking on the responsibility of a project will only give them more headache and more to answer to. &lt;br /&gt;&lt;br /&gt;The boss who wants to create this kind of situation must be brave enough to take the leap into somewhat unchartered region. Profit share. You want partners start treating your employees like partners and I am sure they will rise up to the challenge. Trust them and allow them to make mistakes. Mistakes are the single most important asset for a small rising star. They are your mistakes and they are there to show you the way. Learn from them and cease making them mistakes. Mistakes are good. Expect to make many of them. The more you make the higher the chances of success. You know in the beginning your staff will screw up, except their work anyway making as least modifications as possible. Asking your staff to make a 10 page writeup only to at last use the last 2 sentences will be a killer on morale and will create the "I-don't-give-a-shit" employees. Let them make mistakes and take a chance with them. They will appreciate it. &lt;br /&gt;&lt;br /&gt;Follow through on your words. Expecting people to own a project without any compensation or carrot will just create a situation where your people will feel exploited and words will sound hollow. Who in their right minds want to take on extra work for nothing? Bosses or companies owners who realize this early will be able to tap into the entrepreneur side of their employees and create a situation where their employees will naturally take on extra responsibilities without fuss. As the owner or the boss you main job is to step out of the way of your people as they do their work offering your support along the way. At the end of the day if your people feel that they have achieved something with the least help from you as possible then you are successful in creating people who take on ownership of projects and you in the would have gained leverage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-3996617758602773366?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/3996617758602773366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=3996617758602773366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3996617758602773366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3996617758602773366'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/06/ownership-and-responsibility.html' title='Ownership and responsibility'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8282877230373582171</id><published>2009-06-11T05:35:00.001-07:00</published><updated>2009-06-11T05:43:25.394-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Google Docs Office killer Not?!</title><content type='html'>Those who know me a bit might know that I sell Google Apps as one of the many interest in business. Lately however I find that I cannot seriously sell Google Docs and expect them to use google docs to replace Microsoft Office. Google docs might just be good for doing simple documents and nothing more than that. &lt;br /&gt;&lt;br /&gt;I say that for a few reasons:&lt;br /&gt;&lt;br /&gt;1. Documents cannot exceed 50k. Now if an organization were to depend on Google docs entirely how is it able to do some serious document work if it has this limitation?&lt;br /&gt;&lt;br /&gt;2. For simple formatting google docs is superb. In fact I like it so much I tried living of it exclusively for a little while until I found that for real work like doing quotes and invoicing you had to know html to edit the templates. Now how can you expect a company's secretary or the admin staff to know how to edit html?! Fail! Complete utter fail!&lt;br /&gt;&lt;br /&gt;3. There is no way to password protect a document easily. Now I do not need comments telling with a webpage detailing the hows of doing this across a few pages of hacking. The point here is that it cannot be done by customers so it's a fail.&lt;br /&gt;&lt;br /&gt;Until these issues are solved or at least worked around, google don't even expect to be able to dislodge Microsoft Office. Infact, looking at the technical challenges that you have to surmount, I am beginning to think that it might not even be worth the fight.&lt;br /&gt;&lt;br /&gt;As for now I will continue to sell my services configuring Google Apps but I will concentrate more on pushing the email and the Calendaring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8282877230373582171?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8282877230373582171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8282877230373582171' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8282877230373582171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8282877230373582171'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/06/google-docs-office-killer-not.html' title='Google Docs Office killer Not?!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6761234221736482074</id><published>2009-06-10T02:28:00.001-07:00</published><updated>2009-06-10T02:43:49.793-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Django CRM?</title><content type='html'>Few of our customer came up asking for some crm functionality from us. Quite a few actually. These are not full blown sugarcrm kind of requirements. Actually they are very simple functionality. Looking at these requirements, it made me think that going for something like sugar would be like taking three steps back to gain a step forward. I would have to spend my time editting out functionality and it would be a dumbing down process all over again. Rather than go this route I thought it would be nice to probably use Django to build them this.&lt;br /&gt;&lt;br /&gt;Looking around here are some of the links I found relating Django to CRMs:&lt;br /&gt;&lt;br /&gt;http://www.tschitschereengreen.com/blog/index.php/2007/10/15/django-based-crm/&lt;br /&gt;http://code.google.com/p/django-projects-crm/&lt;br /&gt;https://launchpad.net/django-cream/+download&lt;br /&gt;&lt;br /&gt;Seems that most of them are either abandoned or not very usable. Sigh ... &lt;br /&gt;&lt;br /&gt;That's about all that I found for django crm. The rest of the solutions are too much of an overkill in terms of hacking time or completeness. Okay now my favorite part ... back to the Django drawing board.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6761234221736482074?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6761234221736482074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6761234221736482074' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6761234221736482074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6761234221736482074'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/06/django-crm.html' title='Django CRM?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2480956116933662914</id><published>2009-06-02T00:47:00.000-07:00</published><updated>2009-06-02T00:59:20.342-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Django talk</title><content type='html'>Just finished my Django talk yesterday and I must say while a few dude and dudettes walked out, there was generally quite good interest (better than I thought) from a few young people in the crowd. Initial talks are also underway to form a PUG or Python User Group locally here in Malaysia. I would really like to see this happen. The response has been quite good infact I would go so far as to push to even include Python in some programming curriculum in our universities.&lt;br /&gt;&lt;br /&gt;That is the only way I would see Python growing and getting more acceptance. On that note too I also mentioned during my talk for frameworks like ROR, Django, TG and it's like to gain more acceptance in the industry, more articles or howtos concentrating on enterprise level deployments of these frameworks have go to be available.&lt;br /&gt;&lt;br /&gt;Something like: http://enterprise.djangoproject.com? &lt;br /&gt;&lt;br /&gt;I would really like to see Django grow from it's current girth to something that could rival all the J2EE stuff out there.&lt;br /&gt;&lt;br /&gt;Nice link &lt;a href="http://www.chariotsolutions.com/slides/pdfs/Django2ndLanguage-Generic.pdf"&gt;here&lt;/a&gt; to some good django slides ... damn could have used those for my talk :).&lt;br /&gt;&lt;br /&gt;P/S -Thanks to all those readers who came to the talk :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2480956116933662914?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2480956116933662914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2480956116933662914' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2480956116933662914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2480956116933662914'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/06/django-talk.html' title='Django talk'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4127433835304513076</id><published>2009-05-17T20:33:00.000-07:00</published><updated>2009-05-17T20:47:03.369-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Review of Django 1.0 Template Development</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eVgoKogosHI/ShDYiMGfUOI/AAAAAAAAACY/nqZ1eUhQclw/s1600-h/Django_template_development.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 260px; height: 320px;" src="http://2.bp.blogspot.com/_eVgoKogosHI/ShDYiMGfUOI/AAAAAAAAACY/nqZ1eUhQclw/s320/Django_template_development.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5337003640309633250" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Initially when Packt Publishing sent this ebook &lt;a href="http://www.packtpub.com/django-1.0-template-design-practical-guide/book"&gt;Django 1.0 Template Development by Scott Newman&lt;/a&gt; to review, I did what any self respecting Django entreprenuer with 3 project down his pants would do. I skimmed through the book to the code sections and read through the code and read about 10 lines after that. The blink that I obtained reading the book this way was not too good and I felt some of the explanation in certain sections lacking. &lt;br /&gt;&lt;br /&gt;BAD mistake! This book SHOULD NOT and I repeat SHOULD NOT be read that way. After I hunkered down and read the book cover to cover, it was then I really began to like it. So now, Django projects later, I wish that I read the book the right way the first time, because it has given me so many ideas to improve my Django code. So my advice, get this book, read it cover to cover and then revisit, bookmark or underline sections that you will revisit later. This way I found out was the way to get the maximum benefit out of this great Django reference. I really like reading technical books that know how to put forth advanced concepts with sounding too technical. Good programmers do not automatically make good teachers and the ones that do are the rare breed. On that note I loved the simple way in this book was presented. So, my kudos to Scott for making this an easy understandable read.&lt;br /&gt;&lt;br /&gt;This is a book for Django developers who already have the basics and have been playing around with the Django examples from the website. The writing is to the point and easy to understand and practical examples are littered around to help the Django developers get their heads around what is being discussed. Perfect book to have by your side to try out code as your read. While the examples are simple, you could easily incorporate the examples into a real project. &lt;br /&gt;&lt;br /&gt;My guess is that this book was not really meant for the total novice to Django. This book is meant for the mid level Django developer who wants introduction so some deeper concepts in Django especially those who want to find out more about Django's templates. That being said however, some sections seem to be crying out for more explanation.&lt;br /&gt;&lt;br /&gt;The urls.py section has a very useful section regarding splitting up of the urls.py file for bigger projects. I really like this! It shows a bit about the whys and hows about proper Django deployment that is not usually covered the normal docs and mostly has to be scraped of mailing lists. The section about views is covered briefly but does contain a few useful examples and explains the concepts of requests and responses well using a few of Django's built in functions. Now what would have made this part of the book exceptional would be if the author covered best practices of deploying enterprise Django applications such as splitting the views.py into apps to avoid the views.py getting too big or unwieldy. The generic views section gives a good and solid explanation regarding one of Django's more powerful functionality that is the generic views. Middling Django developers should find this section of the book a useful reference as well as guide in their projects.&lt;br /&gt;&lt;br /&gt;The next chapter is all about Context and how to use them in Django. I like the examples here and they work well to explain the concepts about Context. What the author could have done to solidify the examples here would be probably to include an example of how a normal call to an object would be done versus the method of using the Context object. The examples in this section are simply superb! They assume minimal knowledge from the beginning and build up to cover some of the more complex topics in Django without ever letting the example getting too heady. One thing I learnt here is the alters_data attribute that is actually included in all the templates preventing a method being called from the templates. It serves as an introductory to this functionality but I would have liked it more if a bit more explanation was given as how this attribute is put together with the save and delete methods. A bit more explanation about what kind of data is carried in the request object would be nice here. Scott teaches us to write our own context processor with a simple example of returning the user's ip address. &lt;br /&gt;&lt;br /&gt;In my opinion Django's tags and filters are most of the time underestimated in the light of some other more powerful templating engine for example ZPT in Zope, but understanding them will make you understand the power of them and how much you can really do. I rely on these guys most of the time in my projects and they are great to use. Here Scott goes through most of the tags and filters that you probably would use in your project life and more. If you ever wanted to understand what is the difference between tags and filters read the book! I understand now and he does it in a one liner! The next chapter is equally good focusing on loading and inheriting templates. Don't blast over this chapter thinking it's not important (I was tempted to). Scott cover one or two things you might not have known about your settings.py. I learnt a thing or two here namely the fact that you can get away by even distributing your template files as eggs! Template inheritance in Django is another one my favourites and Scott does a good job covering the basics using easy to understand diagrams, much like how I would explain the concept of template and inheritance to a template newbie, read it through though as Scott delves a bit deeper into templates with a few advanced concepts. The concept of multiple templates are covered next and the simple examples covered here are so easy to understand I could not wait to just &lt;alt&gt;&lt;tab&gt; to my Django instance to knock out the examples and try the out! Extending the section on creating a section for mobile content, Scott shows us how to employ the use of session variables in writing a middleware to check for mobile user agents. Good stuff this, you could if you wanted to copied section of this code and make it parf of your site. &lt;br /&gt;&lt;br /&gt;In the custom filter section, Scott offers a simple example and the nice thing here is he slowly builds in advanced concepts without getting too Django technical. The example is easy to follow and beginners will easily pick up filter writing skills. One issue I ran into when trying out the examples is that this section does not cover some of the strange error messages that the template filters shoots out if you do not follow the syntax exactly. On that note this book could do well with some examples showing the errors that might be encountered in the examples. &lt;br /&gt;&lt;br /&gt;One of Django's “killer app” is the admin interface. With just a one liner you get a beautiful web interface to edit your objects with all the forms and validation thrown in. While this is all good, the templates for admin interface takes some digging in and sometime to understand. I used it for one of my projects and let's just say one or two times I had to think hard just to get a column to align. Doing some wishful thinking I wish now I have a Delorean so that I could take a copy of this ebook and pass it to my head scratching self in the past. That would have really sped things up and made life easier for me as Scott does a superb job here of explaining the intricacies of the admin templating system.&lt;br /&gt;&lt;br /&gt;On the whole I would gladly add this book my collection of Django books as a good source of reference. While it does not cover all aspects of Django, the section that it does cover, it covers thoroughly and I find that it's very useful in satisfying my curiosity to find out more about Django's templating system, filters and tags. The information that it presents is very practical and good to be applied in projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4127433835304513076?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4127433835304513076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4127433835304513076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4127433835304513076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4127433835304513076'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/05/review-of-django-10-template.html' title='Review of Django 1.0 Template Development'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eVgoKogosHI/ShDYiMGfUOI/AAAAAAAAACY/nqZ1eUhQclw/s72-c/Django_template_development.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6857466635762181247</id><published>2009-05-12T20:44:00.000-07:00</published><updated>2009-05-12T20:57:44.894-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Unexpected behavior of python's ConfigParser</title><content type='html'>While working on some python code today I ran into some scoping issues that involved ConfigParser. The issue that made the process of finding and fixing the issue in the code harder is an unexpected behavior (on my end at least). &lt;br /&gt;&lt;br /&gt;The situation is like this. My script relies on a configuration file that resides in the same directory as my script. For example sake let's call this file example.conf. During the execution of my script however, the directory scope of my script is no longer at my script main directory, so when it tries to find example.conf again it fails. This however is the part that put me off. The part that put me off is the fact that the error coming from ConfigParser is not really descriptive.&lt;br /&gt;&lt;br /&gt;Take this example for example:&lt;br /&gt;&lt;br /&gt;"&gt;&gt;&gt; config_file = 'does_not_exist_stuff.conf'&lt;br /&gt;&gt;&gt;&gt; config_parser = SafeConfigParser()&lt;br /&gt;&gt;&gt;&gt; config_parser.read(config_file)&lt;br /&gt;[] &lt;------------- shouldn't this part shot up some error messages?&lt;br /&gt;&gt;&gt;&gt; config_parser.get('config1','test_config')&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;stdin&gt;", line 1, in &lt;module&gt;&lt;br /&gt;  File "/usr/lib64/python2.6/ConfigParser.py", line 531, in get&lt;br /&gt;    raise NoSectionError(section)&lt;br /&gt;ConfigParser.NoSectionError: No section: 'config1'"&lt;br /&gt;&lt;br /&gt;The thing I am trying to say here is when I try to feed SafeConfigParser a config file that does not exist should it complain? I understand that the onus should be on my code to check whether or not the config file exists but then an error saying "No section:" does not really help too much in finding the error fast. I am writing this post just hoping some one would chip in and show me if the way I am using ConfigParser is wrong or something if not I am considering writing a patch for ConfigParser. &lt;br /&gt;&lt;br /&gt;On the other hand I found another Python configuration parser:&lt;a href="http://pyfig.alecwh.com/"&gt;http://pyfig.alecwh.com/&lt;/a&gt;. Going to look at this later on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6857466635762181247?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6857466635762181247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6857466635762181247' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6857466635762181247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6857466635762181247'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/05/unexpected-behavior-of-pythons.html' title='Unexpected behavior of python&apos;s ConfigParser'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-410467600578061103</id><published>2009-04-11T20:09:00.000-07:00</published><updated>2009-04-11T20:21:54.992-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Sum for the range of a column in Excel</title><content type='html'>Working on my current project, one requirement came out which made me all the more appreciative of django's nice array of built-in filters. I generated an Excel report for my clients which is generated from html. Good and nice. Then one of them said, hey can the Excel report have a row which outputs the sum of the whole column of say the column E? Something usual and easy in Excel but stumped me for a while of how to do it from html to excel. For the most part it was trying to figure out how to include that SUM formula at my html code. &lt;br /&gt;&lt;br /&gt;A little visit to M$ support center got me the &lt;a href="http://support.microsoft.com/kb/260239"&gt;help&lt;/a&gt; I needed and then it was back to nice plethora of filters django has .... Turns out that you can include formula into a cell (or a table column in this case) by simply doing something like this '=SUM(E2:E70)' just after the opening tags for your column. This part actually took the longest for me as I did not really know how to do it correctly. My last row in this case was dynamic because it depended on the number of rows generated by my query. So all I did next was some little magicks like this ...&lt;br /&gt;&lt;br /&gt;'=SUM(E2:E{{query.count|add:1}})', which takes the count of the results and adds one to it because Excel rows start from a 1 while the count function returns counts starting from row 0. Just something very simple. Don't really want to tax the brain during the weekends y'know ... anyway just a small thank you to django for really great tool box of useful built-in filters. You really made this post shorter than it ought to have been :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-410467600578061103?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/410467600578061103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=410467600578061103' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/410467600578061103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/410467600578061103'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/04/sum-for-range-of-column-in-excel.html' title='Sum for the range of a column in Excel'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4606332860799508878</id><published>2009-03-19T10:01:00.000-07:00</published><updated>2009-03-19T10:07:55.916-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Another strange django unicode error solved!</title><content type='html'>Today while trying to my final product to one of our customer's an ugly little error shot back at me when I tried editting any of the imported records into the database. "django ascii codec can't encode ..." bla bla it would complain and refuses to render the said template. Tracking down the problem down, I found it to the __str__ method being returned one of my models. &lt;br /&gt;&lt;br /&gt;After changing the database encoding for my MySQL database ( sucky on windoze ), it still stubbornly spat back the same error at me. Finally after searching around more I found the smart_str method's usage &lt;a href="http://www.saltycrane.com/blog/2008/11/python-unicodeencodeerror-ascii-codec-cant-encode-character/"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Kudos! It works now. So instead of returning the normal 'str(self.name)' I do a 'smart_str(self.name)' and everything is back to it's hunky doriness!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4606332860799508878?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4606332860799508878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4606332860799508878' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4606332860799508878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4606332860799508878'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/03/another-strange-django-unicode-error.html' title='Another strange django unicode error solved!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4901927335642735787</id><published>2009-01-26T05:29:00.000-08:00</published><updated>2009-01-26T05:51:33.340-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Multi row transaction capabilities</title><content type='html'>The project in which I wrote a python script to process rows in an Excel spreadsheet interfacing with a MySQLdb and fronted on the web end using django is coming to a close. There is just one more requirement to go. They want rollback capabilities with the ability to completely rollback all actions on a particular excel file if one of the rows in the file buffs up or errors out. This is so that they can correct just that one row in that Excel file then feed the same Excel file to my Python process script without worry about the sanctity of the data of the rest of the rows.&lt;br /&gt;&lt;br /&gt;This means that I have to somehow implement a multi-row rollback functionality or application level transaction. Python's MySQLdb library supports rollback but only on each transaction. I need a "all or nothing" like functionality. This is something new for me, so I scouted around on google to get some inspiration or to see if someone else had done the same thing. I found this &lt;a href="http://www.harald-hoyer.de/linux/pythontransactionclass"&gt;small transaction&lt;/a&gt; class by &lt;a href="http://www.harald-hoyer.de"&gt;Harald Hoyer&lt;/a&gt; at his site. Planning to try out his stuff to see if they can fulfill my requirements. Instinctively, I feel the final solution that I come up with will be a bit different. &lt;br /&gt;&lt;br /&gt;The only other way I can see this happening is to maintain another database table keeping track of all actions that are performed at the row level in the input Excel Forms eg: row1 : insert, row2: update. Then if the script detects an error or Exception while processing the form it will perform the reciprocal or rollback to all of the actions that have been performed on the data on the Excel file. So far whatever I have is still being worked out in the noggin' coming close to being implemented.&lt;br /&gt;&lt;br /&gt;Update: &lt;br /&gt;Something that I seem to have overlooked is that since I am using django for the web front maybe I can also use it's ORM at the backend. It all depends on how much work it would be to ORM-ize my existing code base.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4901927335642735787?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4901927335642735787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4901927335642735787' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4901927335642735787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4901927335642735787'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/01/multi-row-transaction-capabilities.html' title='Multi row transaction capabilities'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1131098788176928261</id><published>2009-01-23T08:24:00.000-08:00</published><updated>2009-01-26T20:44:08.680-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Lenovo's ideapad</title><content type='html'>Today I was tasked by the better half to bring a lenovo ideapad S10 to life. My date with the ideapad got off to a rough start when during the initial filling in of the customary username and password and other stuff, the power died on me. From there on the puppy was not too happy with me and refused to boot up slapping me in the face with a "Installation not complete" dialog box and proceeded to reboot every time I clicked on the 'Ok' button or tried to cancel it. Good stuff. Tried the reboot-click-on-dialog cycle for about 3 to 4 times before calling yer-olde' friendly tech support dude who began the conversation with "Don't mean to be offensive..." (I mean what was I supposed to do?! It doesn't even come with a damned rescue disk!) Ever notice how people always tend to start getting nasty every time after saying that.... ?! Yeehawe! &lt;br /&gt;&lt;br /&gt;Okay, so after a little bit of good vibes rescue generally telling how manly he sounded on the horn, the guy tells me that there is a rescue button there that can reset the baby back to it's factory settings ... Ah! So that is what that little non-standard button is fer! The funny thing about this button is that it will only work if the unit is turned off! Tried it during boot up and no way Jose! The button was like non responsive, just like when you tell your gf _not_ to go MNG just this once for your date. It only worked after I finally hunkered down to read the damn manual! Now, why didn't I just save myself the aggravation and did that from the beginning? Why? I don't know, I just want to be cool like everyone?! &lt;br /&gt;&lt;br /&gt;At this point the lappie is working fine installed with a printer and a hax0red version of office 2007. Hey! don't be barking down this pair of pants asking why not openoffice! When the customer is your gf and she ain't in the mood of hearing about your FSS evangelism, you shut up and and nod man! The customer is always right, doubly so when she is your better half! &lt;br /&gt;&lt;br /&gt;On the performance of this little guy I can only say this ... "It's slow and steady". Stuff works but there is just that little bit of lag before starting up, hey give it a break it's just that little atom of a processor under the hood man! I am quite happy with the performance considering that we only forked out Rm 1,783 with printer thrown in! I can see the appeal this kind of lappie would have for the ever on the go exec that just wants to occasionally check his/her mail or do the usual proposal on the run. For the rest of us that needs that performance juice from their daily machine, and do more than that stay clear! &lt;br /&gt; &lt;br /&gt;Well, at least it's been fun and I am still in her good books :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1131098788176928261?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1131098788176928261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1131098788176928261' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1131098788176928261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1131098788176928261'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/01/lenovos-ideapad.html' title='Lenovo&apos;s ideapad'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8862270390663966712</id><published>2009-01-11T08:57:00.000-08:00</published><updated>2009-01-11T09:16:29.060-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Gmail migration script done!</title><content type='html'>Hello there again! Nothing like a little good olde' scripting to usher in the new year. As most of you will recall I was working on a script to migrate email from an existing imap server on to google app. The only thing that my script needed to do was transform folders into labels. Easy peasy I thought sure someone else has encountered this. Boy, was I wrong. I could not for the life of me find anything of the sort out there!&lt;br /&gt;&lt;br /&gt;Well, no matter. I proceeded to create my own script from scratch and after about 2 hours my script could already scan my existing imap server, list all the folders and re-create them as labels on my gmail account! It was then that I stumbled across this &lt;a href="http://blog.xiaoduo.info/wiki/GmailMigrationScript"&gt;piece of genius&lt;/a&gt; xiao duo so graciously left of the web. Their script was made to migrate emails from an existing gmail account to another gmail account. I found that the script they had complemented mine to a T! Talk about Laws of Attraction!! Great! All I had to do now was to transplant my script using my vim scalpel on to my script and faster than you can say Fedora 10's release name I had a working super duper gmail migration script!&lt;br /&gt;&lt;br /&gt;Everything works as it should. About the only drawback I noticed with my script was that with TmNut's great connection, the connection timed out on me a few times and after restarting the script it started screening the folders right from the top again. Maddening! This is one of the improvements I have noted down, but for now everything works just fine. I can't attach any code here, so if for some reason you need the script just drop me a comment or a line here.&lt;br /&gt;&lt;br /&gt;Catch ya laterz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8862270390663966712?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8862270390663966712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8862270390663966712' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8862270390663966712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8862270390663966712'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2009/01/gmail-migration-script-done.html' title='Gmail migration script done!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2172733474692340339</id><published>2008-12-31T07:44:00.000-08:00</published><updated>2008-12-31T07:59:30.070-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><title type='text'>Why I use Linux.</title><content type='html'>Today while trawling around on the opensuse mailing list I found this gem of a quote from one of the user's answers that summarize really well why I love and continue to use Linux and why any other thing would feel wrong ....&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;&lt;span style="font-style:italic;"&gt;I use openSUSE and Linux because it allows me to use my computers the&lt;br /&gt;way I want.  I have some almost new hardware and some really old&lt;br /&gt;stuff.  I'm typing this on a Thinkpad laptop with a P3/1Ghz and 256mB&lt;br /&gt;RAM while I have 4 ssh sessions into my server running 2 movie&lt;br /&gt;re-encodes and doing file maintenance in the other 2.  I've got 2&lt;br /&gt;directories on my server mounted on this and 1 directory on this&lt;br /&gt;laptop mounted on the server to copy files with.  If I was using MacOS&lt;br /&gt;or Windows I'd barely be able to do anything.&lt;/span&gt;&lt;br /&gt;""" - Larry Stotler &lt;br /&gt;&lt;br /&gt;Thank you Larry for converting my thoughts into such simple but expressive words.&lt;br /&gt;&lt;br /&gt;There have been mixed reviews for OpenSuSE 11.1, some lauding it while others panning it for a disaster almost as bad as the 10.1 release mostly surrounding KDE-4 desktop choice. The desktop environment is so much a part of a distro nowadays that normal users do not usually make the distinction between what is the distro and what is the desktop environment. For them, KDE or OpenSuSE they are both the same. For me I applaud the OpenSuSE team for taking a brave  new step ahead! KDE-4 has it's faults no doubt but as usual I put my total trust in the OpenSource community to mold into something better than the current 3.5.x. I will still look forward to keeping OpenSuSE as my main working distro.&lt;br /&gt;&lt;br /&gt;Finally to all the readers of this blog. Merry belated Christmas and a Happy Profitable new year ahead!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2172733474692340339?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2172733474692340339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2172733474692340339' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2172733474692340339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2172733474692340339'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/12/why-i-use-linux.html' title='Why I use Linux.'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8829862823356687644</id><published>2008-12-28T20:33:00.001-08:00</published><updated>2008-12-28T20:42:42.337-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>opensuse 11.1 and python 2.6</title><content type='html'>Just upgraded my X61's opensuse from 11.0 to 11.1 and found that the opensuse team bumped up the python version from python-2.5.x to python-2.6. Woohooops! Definitely won't win them any new fans in the Python camp for that move. For one deluge no longer works as it uses Python-2.5.x. As a comparison, although the folks over at the Fedora-10 camp is also known for their up to date apps, they still maintained python at version 2.5.2 to maintain a semblance of sanity with some of the apps that need python 2.5. I am just going through the multitude of Python applications I have on my box to see which one greets me with a "Goodbye cruel world" bomb. Why oh why do you have to be like that opensuse?! Well on the upside the whole desktop experience has improved and I had a relatively smooth upgrade path. &lt;br /&gt;&lt;br /&gt;Something else too, kde-4.1 which used to be pretty clunky and unusable in 11.0 has been improved and after a while of getting used to it, I am beginning to think it's pretty good.&lt;br /&gt;&lt;br /&gt;Well, when the lizard gives you lemon make lemonade I guess ... time to revisit ktorrent. I just hope everything else is intact.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8829862823356687644?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8829862823356687644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8829862823356687644' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8829862823356687644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8829862823356687644'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/12/opensuse-111-and-python-26.html' title='opensuse 11.1 and python 2.6'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2174315979768421212</id><published>2008-12-20T10:39:00.000-08:00</published><updated>2008-12-20T10:46:37.791-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Script to import mail from existing email account into google</title><content type='html'>I am writing a script to help our customers migrate from their current mail to google apps' gmail. Found a host of scripts on the net but finding one that works correctly not to mention even work proved a challenge. Too many of the script just fell short of what I needed. There were perl scripts, ruby scripts and also python scripts. &lt;br /&gt;&lt;br /&gt;All of them just did not have the one thing I needed that is to convert the imap folders into gmail's labels. What about folders that have more than one level? Well I came up with the idea to convert them this way:&lt;br /&gt;&lt;br /&gt;Original structure:&lt;br /&gt;         Level 1&lt;br /&gt;               =&gt; Level2 &lt;br /&gt;Into a label : Level1_Level2&lt;br /&gt;&lt;br /&gt;The normal mail migrate script that comes with gmail does not seem to convert imap folders into labels. Currently I am looking into using the libgmail library to do what I want. Ran into some trouble installing the source copy because it was looking for python-mechanize and one of the dependancy of python-mechanize is python &lt; 2.5! Sheesh! Well poking around using google I found an older package of libgmail that did not need python-mechanize. Hopefully to be able to come up with early prototype by tomorrow. Has anyone built something similar?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2174315979768421212?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2174315979768421212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2174315979768421212' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2174315979768421212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2174315979768421212'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/12/script-to-import-mail-from-existing.html' title='Script to import mail from existing email account into google'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7365808600922690116</id><published>2008-12-06T08:02:00.000-08:00</published><updated>2008-12-06T08:07:55.803-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Some great functions in django templates</title><content type='html'>In my quest to capitalize the title for my application, I found some great functionality in django's templates. &lt;br /&gt;&lt;br /&gt;To 'humanize' data there is contrib package called 'humanize'. For the docs you can find it &lt;a href="http://docs.djangoproject.com/en/dev/ref/contrib/humanize/#ref-contrib-humanize"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For some built in functions look &lt;a href="http://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs"&gt;here&lt;/a&gt;. I really like some of the humanize functions after spending so much time to implement some of the functions found here. While django's template language might not be as powerful as others they sure have some pretty useful functionality here!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7365808600922690116?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7365808600922690116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7365808600922690116' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7365808600922690116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7365808600922690116'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/12/some-great-functions-in-django.html' title='Some great functions in django templates'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-5787430278509454306</id><published>2008-10-27T22:01:00.000-07:00</published><updated>2008-10-27T23:26:18.933-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Return of zope?</title><content type='html'>First off the bat, let me just this post is not meant to add more gasoline to the django vs Plone wars. It is just meant to read as my thoughts surrounding the Experience of using Zope and Plone and trying to use them both in my company.&lt;br /&gt;&lt;br /&gt;It's no secret now my company is using django for most of our web related projects. Although I use mostly django now, I am like the kid who left his good pal to play at the other side of the fence. I constantly look back and think if we could still fit zope in somewhere in our projects. I think back right to the beginning when I did my first web project. Unlike many I did not start with php. I started with zope because my company at the time wanted to vary our skill base. I had many a sleepness night trying to wrap my head around the zope concepts and paradigms. I got my ass handed back to me many times at the #zope channel by MacYet yet strangely I persisted and slowly I grew to like zope. &lt;br /&gt;&lt;br /&gt;Then came Plone. In my next company I deployed a Customer Complaints Form applications for them using Plone and Archetypes (it was called cmftypes at that time). Most of the time I did not know what I was doing yet at the end I succeeded in completing the project and the last I synced with my cronies there they are still using that application for their daily operations. This enamored my confidence in Zope and Plone. I also did a few other projects using Plone and generally found the going easy and liked using it although there was always a voice telling me to go deeper into the engine to see how everything ticked. &lt;br /&gt;&lt;br /&gt;Coming from these positive experiences, I did not hesitate to recommend Plone to deploy a web membership system for a political party for a project that we had secured. This was when the nightmare began which chipped away nearly all of my confidence for using Zope/Plone as a development platform for my company. Here are some of the issues I ran into:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Technical Issues&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Plone was over complete for the project. As with a lot of other projects I tried to shoehorn Plone into, I found that it could do the 90% of the requirements easily without even breaking a sweat but the last 10%, which usually is the most essential and mission critical ones required a huge re-engineering of some of the components inside of Plone. It was just too daunting of a task to do. To make it worse it was tasks that seemed very easy to non-Plone developers. "Can I make the font for this automatically generated font smaller here","Could you please remove this green drop-down here and place it here" .... etc. etc. Most of the time I had to explain to my principal his technical point of view and the Plone point of view. This created a lot of heated and opinionated exchanges and needless to say at the end both of us were unhappy. Most of the time I found that I either had to make some little change to some Plone component of Product that would cost me a lot of time because I had to understand how everything fit together before I could modify it. Other times I found that I had to strip out features that were not needed to start with. Deploying Plone for our prototyping stage created problems for us as users saw some of the components of Plone and started coming out with extra requirements based on what they saw.&lt;br /&gt;&lt;br /&gt;2. ZODB Performance. This one really stuck a knife in my gut. We were not deploying the next Slashdot but ZODB needed to at least handle 30,000 to 100,000 objects at once. ZODB was too much of a blackbox at this stage for us to optimize when it when it went to the land of the Slo-Zo. I kept on packing the database up and found bottlenecks all around the place. I can totally relate to how this &lt;a href="http://www.crubellier.com/blog/?p=3"&gt;guy feels&lt;/a&gt; and why he too chose to go for a ZODB-less Zope. My partner who is a Dba felt pretty helpless without me when all his knowledge of optimizing rdbms was moot when the heart of Plone was ZODB which did not even have a SQL like syntax. At 30,000 objects it was taking 20 seconds to come back with queries! This alarmed a lot of people but I did not have good answers for them. Trying to run Plone on MySQL did not seem very optimal too as a lot of Plone's magicks and functionality seem too tied down to ZODB. I will concur here and admit I did not know enough of ZODB to make it really work for us, yet from all angle that we were looking at this, Plone seemed more and more of a wrong choice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Non Technical Issues&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. There was just no developers around! I could find PhP developers by just talking to aunt Tilly that lives across the street but Python/Zope/Plone developers was a rare breed! Even if I found them, they were very expensive and usually overseas. However, to be fair most of those PhP developers that we found through Aunt Tilly lacked finesse and were not of standard. However, having some developers is still better than nothing at all and this was one of the reasons I had to surrender to using PhP. The trick now was not to code the application myself rather to leverage my time by hiring programmers to do it. My partner and I found that there was no way to deploy the project using Zope/Plone if we did not have anyone we can hire or outsource it to. The sheer pervasiveness of PhP won out here.&lt;br /&gt;&lt;br /&gt;It was at this time when I started to look at other alternative frameworks that we could use that was a bit closer to the metal and allowed for easy deployment. I found django. Django was a joy from the start. Following the documentation allowed me to be productive from the go and for once I could understand what I was doing! There weren't 120 stacks of libraries I had to wade through to get something working for once I found that I could pass some of my half finished stuff to my developers and they could take over the project ! Like many coming to django there were of course some paradigm shifts I had to get used to namely the lack of some functionality in the django templates but I soon got used to that. jquery was also integrated into my pages easily and for the first time in a long time I know exactly what each line of code in my application did.&lt;br /&gt;&lt;br /&gt;django is certainly no Php not by a long shot but at strangely I found that explaining django to a developer easier going than trying to carpet bomb their brain with Zope. &lt;br /&gt;&lt;br /&gt;Recently, my projects started growing in size and after my views.py and my models.py started getting unwieldy and spinning off too many apps I started looking around to see if other people faced the same thing and I found other dissidents around. Most of the voices out there seem to say that django is good for small projects but found that to create re-usable apps using django they seemed to be re-creating zope! Although with django I do not feel that I am "fighting the framework" I could see where these voices are coming from. This is where I could almost see Zope developers snickering at a corner as I could almost hear them say "I told you!". &lt;br /&gt;&lt;br /&gt;Certain developments too have happened and a few articles I have read, pointed to Zope3 being a totally different beast to Zope2. I read a few of the examples using the zope3 architecture and I must say they look a world easier but would I be able to come up with my own stuff? I honestly do not know. I think too the move to run zope with wsgi without ZODB is a good one. I am challenged to think of a situation where using ZODB would be advantageous to using a RDBMS. Rant on &lt;a href="http://jrandolph.com/blog/?p=23"&gt;here&lt;/a&gt;. I still do not know where we are going yet and I am going to take zope3 for a thorough drive before making my decisions. &lt;br /&gt;&lt;br /&gt;Some other opinions:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.reddit.com/r/programming/comments/71oeo/what_django_can_learn_from_zope"&gt;What django can learn from Zope&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img411.imageshack.us/my.php?image=presentation8bm.jpg"&gt;Time taken to create a trivial app.&lt;/a&gt; &lt;-- Trivial applications or play code is less useful as most of the time they usually fall on the side of the "barebones" frameworks like django, ror or pylons. &lt;br /&gt;&lt;br /&gt;I wrote this post because I know as time goes along and to remain agile and more importantly fast, with more projects under our belt, re usability will be a feature that we want. Currently we are doing fine with django but will the future paint a come back for Zope into our organisation ? Personally I hope so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-5787430278509454306?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/5787430278509454306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=5787430278509454306' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5787430278509454306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5787430278509454306'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/10/return-of-zope.html' title='Return of zope?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6687329100209388094</id><published>2008-10-25T02:08:00.000-07:00</published><updated>2008-10-25T02:20:23.853-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>datepicker without admin</title><content type='html'>Django's admin interface is one of the really nice things about django because of it's functionality and useful tools. Nearly all of the reviews I have read about django have mentioned a good thing or two about the admin interface. There is however sometimes a need to go beyond or implement a lesser version of admin interface. This is where the adventure of living outside the realm of comfort for me begins ... &lt;br /&gt;&lt;br /&gt;I have been trying to live outside the comfort of the admin interface for django and have found other niceties outside of the admin interface namely generic views, forms and others. I have been using these tools to build a web inventory cum sales application for one of our clients and happy to say it has been fairly successful. &lt;br /&gt;&lt;br /&gt;Generic views are really powerful and really helps to shave off development time. There are however withdrawal symptoms my code is feeling to the admin interface. I have reimplemented some of the css niceties and javascript in my code. One of the one I am looking for is to re implement the cool datepicker admin has every time it encounters a DateTime or a Date Field. &lt;br /&gt;&lt;br /&gt;I have tried a few things towards this goal:&lt;br /&gt;&lt;br /&gt;1. Included all the javascript from the admin interface for my page. This just failed silently and my text box looked just the same.&lt;br /&gt;2. Passing the model.DateTime a widget argument in which I call the widgets from django.contrib.admin.widgets. This resulted in a unexpected keyword error. &lt;br /&gt;&lt;br /&gt;It would be nice if the django admin team can do a small writeup or a break down on how the admin interface was implemented. This would be really nice as there are some really good stuff in there which can also be useful in it's bits and pieces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6687329100209388094?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6687329100209388094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6687329100209388094' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6687329100209388094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6687329100209388094'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/10/datepicker-without-admin.html' title='datepicker without admin'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8086706404791009842</id><published>2008-10-08T04:54:00.001-07:00</published><updated>2008-10-08T05:25:28.806-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Update on the python windows saga</title><content type='html'>The fiasco finally ended, my code is working and the customers are at least quiet. My requirements were simple, my excel trawler trawled the excel pumping stuff into the database. Then after that it had to copy the excel file based on the outcome of the process. So if it failed it had to copy the input excel file into a 'fail' and conversely into a 'pass' folder if it did it's job right. Here is the catch. The customer wanted the whole directory structure of the input file to be created in the fail/pass folders. I thought "Heck this is simple! Just do a 'cp --parents /path/to/input/file /[pass | fail]/folder' What could be easier?" &lt;br /&gt;&lt;br /&gt;Boy was I wrong. All of the windblows solutions did not fit right. I found this &lt;a href="http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html"&gt;page&lt;/a&gt; by Tim Golden which I thought was golden until I tried out most of it's stuff and it did not exactly work right for me at least. Essentially it boiled down to:&lt;br /&gt;&lt;br /&gt;1. If it copied the directory tree(shutil.copytree) it did not copy the file right. If it saw a file in the path, it would just copy the file and the did not do the sub folders and the parent folders. Augh! Maddening!!&lt;br /&gt;&lt;br /&gt;2. I could not just do a system call to do 'cp --parents' because this was a windblows machine. So I thought initially os.system stuff was out. It drove me nuts something so simple could not be achieved by any of the windows command line stuff like copy or xcopy or robocopy.&lt;br /&gt;&lt;br /&gt;Finally I cheated. I downloaded a windows port of &lt;a href="http://unxutils.sourceforge.net/"&gt;cp&lt;/a&gt;, and just a os.system call on it.  That too had it's fair share of problems such as you could not do a 'cp --parents c:/some/thing c:/some/one' because it tried to do a c:/some/one/c: and bombed out because it did not like the colon. Looking at this I used the os.path.splitdrive and split up the stuff then did a copy.&lt;br /&gt;&lt;br /&gt;I know this is not clean enough for you purist out there, but heck it works and that is all that counts ... to customers at least.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8086706404791009842?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8086706404791009842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8086706404791009842' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8086706404791009842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8086706404791009842'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/10/update-on-pythons-windows-saga.html' title='Update on the python windows saga'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7292959467353533854</id><published>2008-10-07T19:19:00.000-07:00</published><updated>2008-10-07T20:58:00.444-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Spaces in directory names ... I really love you not!</title><content type='html'>Have I mentioned I really love Python? Have also mention that I really hate Windows? I did not? Well here I go again ... I REALLY HATE WINDOWS. This time the target of my scorn or anger is the stupid spaces in folder names windows users are so apt to give to their folders. It screws my programs and special attention has to be given to quote them to work... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Grrrr, all sorts of funny stuff happen at this stage. I am wondering how the heck I am going to quote the whole filename if I am doing something like below:&lt;br /&gt;&lt;br /&gt;import shutil&lt;br /&gt;&lt;br /&gt;for file in os.listdir("/home/lowks"):&lt;br /&gt;&lt;br /&gt;    shutil.copy(file,"/tmp")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I tried 'shutil.copy('%s',"/tmp") but it spat out errors at me. Is this because the string is a unicode string? If so how do you convert the file path to a raw string? I really hope if someone has experience doing this to shine some light this way.&lt;br /&gt;&lt;br /&gt;Ops ... it seems I made a little error there, it seems to work but not in my longer script. My script basically has to copy a file including it's parent folders into a fail / success directory based on the outcome of running the script. I tried shutil.copytree but it does not work and fails silently, which prompted my spaces-in-directory-name hate. I am wondering aloud here there must be an easier way of doing this, a one liner thing.&lt;br /&gt;&lt;br /&gt;I think also I have found the error with my script. It is still a space related issue where if there is a space in the folder name, then it automatically treats the last string as a file name and shutil will bomb out when it tries to open up that file for copying or moving, like something below:&lt;br /&gt;&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "process.py", line 321, in &lt;module&gt;&lt;br /&gt;    ,failure_directory)&lt;br /&gt;  File "D:\python25\lib\shutil.py", line 80, in copy&lt;br /&gt;    copyfile(src, dst)&lt;br /&gt;  File "D:\python25\lib\shutil.py", line 46, in copyfile&lt;br /&gt;    fsrc = open(src, 'rb')&lt;br /&gt;IOError: [Errno 13] Permission denied: u'C:\\import2\\testing folder'&lt;br /&gt;&lt;br /&gt;In the case above, the 'testing folder' is actually a folder but shutil have interpreted the 'folder' as the filename hence the exception.&lt;br /&gt;&lt;br /&gt;Ah ask and ye shall receive, in windows there is a short file name for all files for example C:\Program Files is equals to C:\Progra~1 or something to that effect. This same short filename can be used in python if you use the win32api, in a one liner like this:&lt;br /&gt;&lt;br /&gt;import win32api&lt;br /&gt;&lt;br /&gt;long_file_name='C:\Program Files\I am a file'&lt;br /&gt;short_file_name=win32api.GetShortPathName(long_file_name)&lt;br /&gt;&lt;br /&gt;This works. If you are incline to read more about this go &lt;a href="http://mail.python.org/pipermail/python-win32/2006-May/004716.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7292959467353533854?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7292959467353533854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7292959467353533854' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7292959467353533854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7292959467353533854'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/10/spaces-in-directory-names-i-really-love.html' title='Spaces in directory names ... I really love you not!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4183481448868590948</id><published>2008-09-24T19:12:00.000-07:00</published><updated>2008-09-24T19:23:35.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>django and some plone</title><content type='html'>There seems to be some rumblings on the Plone front for us currently. For our main stable of development however, we have moved away although not totally from Plone to django. The main reason here is that for Plone deals to be feasible for us, we either have to:&lt;br /&gt;&lt;br /&gt;1. Lock requirements down really tight so that the juniors can have a go at it .... or &lt;br /&gt;&lt;br /&gt;2. Sic some seniors at it.&lt;br /&gt;&lt;br /&gt;In my own experience, it seems that while Plone can be easy if worked within a tight parameter, try swaying a bit out of those parameters, when you have to peer under the hood and you are in a world of pain. It's hard to gain leverage using Plone this way. django on the hand has been actually quite young developer friendly for us and they end up being actually more productive compared to when they are forced to make some funky changes in Plone. Most of the business applications that we build require a light framework and is normally built from ground up. This means that Plone is sometimes an overkill for these apps which is a shame because Plone almost always appear like a good fit in the beginning. In the end, to be able to shoehorn Plone in means a lot stripping functionality and code out. &lt;br /&gt;&lt;br /&gt;For what it's worth we still try to train up our guys to do basic Plone stuff but only time will tell if it makes business sense to invest any time in Plone/Zope.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4183481448868590948?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4183481448868590948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4183481448868590948' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4183481448868590948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4183481448868590948'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/09/django-and-some-plone.html' title='django and some plone'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1942524617771463360</id><published>2008-08-01T00:29:00.000-07:00</published><updated>2008-08-01T00:35:39.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>A simple find in python ?</title><content type='html'>Continuing on my saga with my Python importer for xls, I ran into a situation where I had to dig in recursively into a directory structure and do something with Python. There seemed to be nothing easy in Python such as a 'find . -name '*.xls' -exec perform_task {} \;'. All of the solutions or suggestions that I have run across so far from stuff found in google seems to need me to perform some sort of mental or code acrobats. This is not to create a flame, I am just an intermediate in this so I am welcoming suggestions to do this if you people have any.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1942524617771463360?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1942524617771463360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1942524617771463360' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1942524617771463360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1942524617771463360'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/08/simple-find-in-python.html' title='A simple find in python ?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-28978016606444333</id><published>2008-06-22T21:55:00.000-07:00</published><updated>2008-06-22T22:19:13.781-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>scraping data from excel files</title><content type='html'>I am currently still in the midst of writing my excel scraper to scrape data from excel files. There are two types of encrypted excel files that I need to scrape from. Both of them contain similar data but are structured differently. &lt;br /&gt;&lt;br /&gt;The first problem that I encountered is that the data position are not standard and scattered all around the place, for example in the first type of file the data starts reading from line 10 to 31 while the second type of file starts reading from 11 to 31. The form looks neat and good to the human eye but is a coordinate hunting nightmare programmatically! While both of the files contain similar data, I found that one method to scrape data is insufficient because of the tiny differences in the location of the data. I cannot use odbc methods to run sql statements on them as they are encrypted, so I am stuck doing coordinate targeting.&lt;br /&gt;&lt;br /&gt;After much doodling around with positions of data, I finally decided to write a Form object that takes a record_type an argument. When I instantiate a record_type of say 'A' type it will then load up the profile of the 'A' type object which is a dictionary that contains all the information of where most of the data are on the form. This dictionary is my implementation of a profile. So from there my object will know where all the important bits of information are based on the profile from the dictionary.&lt;br /&gt;&lt;br /&gt;Anyone have done something similar in a better way?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-28978016606444333?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/28978016606444333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=28978016606444333' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/28978016606444333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/28978016606444333'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/06/scraping-data-from-excel-files.html' title='scraping data from excel files'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4886010750562219692</id><published>2008-06-20T05:49:00.000-07:00</published><updated>2008-06-20T05:54:33.274-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>surrounded by win32com's python and not liking it</title><content type='html'>I am using the win32com library to write an application to populate data that are in encrypted excel files that are kept in a specific folder into a mysql database. Most of the part is there except that I do not find much of win32com library documentation around. One part of my code really irks me and it's the excel visible part. Everytime it is processing an excel file, it has to open up the file and close it up again. When I set the visible part of the code to 0 or false, my application doesn't run correctly anymore. Some of my code are as follows :&lt;br /&gt;&lt;br /&gt;import win32com.client&lt;br /&gt;xl=win32com.client.Dipatch('Excel.Application')&lt;br /&gt;xl.Visible=1&lt;br /&gt;&lt;br /&gt;Grr ! I wonder why this thing doesn't work if you set the Visible to 0. Can't this work in the background? Woe !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4886010750562219692?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4886010750562219692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4886010750562219692' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4886010750562219692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4886010750562219692'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/06/surrounded-by-win32coms-python-and-not.html' title='surrounded by win32com&apos;s python and not liking it'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7510366348208858960</id><published>2008-06-13T21:37:00.000-07:00</published><updated>2008-06-13T21:56:49.425-07:00</updated><title type='text'>Enterprise project lessons</title><content type='html'>Being in the technical lead for an enterprise project teaches you a thing or two. I was wearing those shoes recently for one of our projects recently and here is what I learnt :&lt;br /&gt;&lt;br /&gt;1. If you are going to be using a framework of any sort you better know it inside out, left to right and top to bottom. When funky modifications are asked for or if your application starts to slow down you better know exactly or roughly where to start tweaking. This is the reason too why my partner feels that the bigger the project, the closer to the metal the framework used has go to be.&lt;br /&gt;&lt;br /&gt;2. If the scope of the project is large and you suspect you might not have enough developers, never never never choose to use a tool which leaves you with one choice when it come to developers. For our case we had to give in and go the php route for this particular project. In my company we have shunned php in the past choosing not to use for any projects, but we had to bow in to pressure this time because it was just too hard trying to find capable and dependable python developers where we are. Once we caved in and accepted php, we found a pool of capable php programmers.&lt;br /&gt;&lt;br /&gt;3. I can never over emphasize the next one. Never never never never under estimate the scope of a project especially if it pays a lot. When the customer says "I just need a web page to capture data" always ask for more information. It might not just be the application that is complex, it might even turn out to be the setup itself that is going to pose a challenge. In our case, we had to deploy multiple instances of our application in a few remote places to allow data entry people to key data. At the end of the day we had to merge the data all back into a central database.&lt;br /&gt;&lt;br /&gt;4. For any project always look for a capable PM. It might lower your bottom line, but trust me it's worth it. A good PM will save you 3 am calls while at the same time allow you to multi task in the back ground and do what you do best. Fortunately for us, we have found such a candidate in my old business associate though we cannot use him for this project fearing our customer might just freak out seeing a new PM on the job !&lt;br /&gt;&lt;br /&gt;5. Always have a old school unix or Linux who knows all the old text mangling tricks loaded and ready. In this case it was my partner. Even when doing seemingly unrelated stuff like web application never under estimate the usefulness of these guys. We had to move about 50,000 records trapped in excel into the database and his skills proved invaluable ! (Not that I am that much behind now, but I had to concentrate on getting the web end up)&lt;br /&gt;&lt;br /&gt;In the end though, through all the late nights and sweat, this project has thought invaluable lessons in project management as well as resource planning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7510366348208858960?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7510366348208858960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7510366348208858960' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7510366348208858960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7510366348208858960'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/06/pm-for-enterprise-projects.html' title='Enterprise project lessons'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4799883471461985629</id><published>2008-06-08T21:16:00.000-07:00</published><updated>2008-06-08T21:22:07.315-07:00</updated><title type='text'>python unicode sucks</title><content type='html'>I have had some bad experiences with python unicode on my current project and suffice to say I a tad nervous about using python for my next project. The unicode support is just horrendous and is very limited. I tried googling for unicode+&lt;enter python project name&gt; and nearly everytime it came back with multiple hits ! I read about a version of python in cvs that has unicode support built in but then I noticed the word 'cvs' **shrudder** My experiences might not be that complete so I would appreciate input from other senior snake wranglers out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4799883471461985629?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4799883471461985629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4799883471461985629' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4799883471461985629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4799883471461985629'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/06/python-unicode-sucks.html' title='python unicode sucks'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1449322052078165080</id><published>2008-06-05T02:43:00.000-07:00</published><updated>2008-11-13T10:09:45.774-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>django pluggables</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_eVgoKogosHI/SEe5YSVYGsI/AAAAAAAAAB0/gqpahO6o7b8/s1600-h/django-pluggables.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_eVgoKogosHI/SEe5YSVYGsI/AAAAAAAAAB0/gqpahO6o7b8/s320/django-pluggables.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5208335320966765250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have struck goldmine ! Bored today with another plone innard hacking session I began hunting around on the internet for a django plugins site. I came across this site called &lt;a href="http://www.djangopluggables.com"&gt;http://www.djangoplugables.com/&lt;/a&gt; ! This is exactly what I am looking for with a cute little plug in socket as a logo! I am astounded by the speed in which django has grown ! &lt;br /&gt;&lt;br /&gt;I have coded some applications with django the past and I can say I like the feel of using it. It is  has what I need in terms of a web application framework and is closer to the python metal than plone or zope will ever hope to be. Don't get me wrong, I still have a soft spot for zope and I truly hope that zope 3's modularity will be more elegant than the monolithic monstrosity that zope 2.x is.&lt;br /&gt;&lt;br /&gt;Today while looking at the pluggable site, has given me much more confidence of adopting django as one of the stable technologies to deliver web applications in my company's offerings. Coming from a background that have used both I can attest to why a senior python programmer would love django. I hope though the django community get it right and do not start on the path of sticking stuff together to create another zope 2.x !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1449322052078165080?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1449322052078165080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1449322052078165080' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1449322052078165080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1449322052078165080'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/06/django-pluggables.html' title='django pluggables'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_eVgoKogosHI/SEe5YSVYGsI/AAAAAAAAAB0/gqpahO6o7b8/s72-c/django-pluggables.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-7801176357460996339</id><published>2008-06-04T07:58:00.000-07:00</published><updated>2008-06-04T08:10:41.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>index vs. metadata</title><content type='html'>Newbies hacking up scripts for the first time in a zope or plone environment might be confused at some of the terminology, heck I know I was ! Anyway, one that took me some time to grok not to mention numerous emails bugging people on the mailing list to understand is the difference between portal catalog indexes and metadatas. I will just say it in my own words here as I understand it now. &lt;br /&gt;&lt;br /&gt;Index are keywords you add to portal catalog to allow you to create query based on them. Eg. query['Title'] = 'lowkster'. Here, 'Title' would be an index. The easiest way to see all the index in your portal_catalog would be to use the zmi. Go to the root of your site using the zmi and then access your portal catalog using the link provided by the left hand side menu. Here youwill find a tab called 'Indexes'. Here are the listing of all the Indexes in your portal's catalog. You can also add a new index in your portal catalog using this page.&lt;br /&gt;&lt;br /&gt;Metadatas on the other hand are stuff that you want to show in your query results. For example you query your portal catalog and in the result is a metadata called 'Books'. You can then in your page template display this by calling it as such '&lt;span tal:replace="python.results('Books')" /&gt;. To set one of the fields in your content type as a metadata field, you have to add the variable 'isMetaData=True' to your field definition. You can also add a new metadata to the portal catalog using the zmi. &lt;br /&gt;&lt;br /&gt;Anyway, forgive me if my way of explaining indexes and metadatas is wrong. This is just my way of understanding the difference between the two. Feel free to correct me if I am wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-7801176357460996339?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/7801176357460996339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=7801176357460996339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7801176357460996339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/7801176357460996339'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/06/index-vs-metadata.html' title='index vs. metadata'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1404040921526996018</id><published>2008-05-15T09:32:00.000-07:00</published><updated>2008-05-15T09:39:49.392-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fedora'/><title type='text'>getting tapping to work on fc9</title><content type='html'>Currently i am running fc9 on my trusty old acer and one of the initial irritants I found was that tapping on the touchpad no longer works (In opensuse it worked just fine out of the box). This is a real annoying bug as I am used to tapping my way around using my touchpad. Scouring the fedora forums, I finally chanced upon &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=439386"&gt;this entry&lt;/a&gt; in the redhat bug list. Well, well, well it turns out the "bug" isn't really a bug after all. A long story short basically your package of synaptics from fedora has a patch that has disabled tapping on touchpads because some wiseguy thought that it was for the best since no one really likes tapping on a touchpad. &lt;br /&gt;&lt;br /&gt;So a guy called Bob Kashani was kind enough to rebuild the packages and remove the the offending patch. All you have to do is download his rpm from :&lt;br /&gt;&lt;br /&gt;http://www.ocf.berkeley.edu/~bobk/packages/&lt;br /&gt;&lt;br /&gt;Run a rpm -Uvh, do a restart of the Xorg by doing the old ctrl-alt-backspace and you are good to go :)&lt;br /&gt;&lt;br /&gt;Thanks bob for the package. It works great here !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1404040921526996018?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1404040921526996018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1404040921526996018' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1404040921526996018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1404040921526996018'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/05/getting-tapping-to-work-on-fc9.html' title='getting tapping to work on fc9'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1553364992356637349</id><published>2008-04-30T00:32:00.000-07:00</published><updated>2008-04-30T00:35:32.242-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>ATVocabulary Manager with MasterSelectWidget</title><content type='html'>I am using MasterSelectWidget in one of my projects to create the master-slave/master-slave combo of select widgets in my form It then occured to me how nice would it be if I could get my vocabulary from ATVocabularyManager which I have already installed on my site. Well, I lied it's not actually nice... it's one of the requirements :). Anyway I tried a few times to point my dynamic vocabulary at ATVocab's method but it failed to load up the Select widget with it's values. I wonder if this has been done by anyone ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1553364992356637349?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1553364992356637349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1553364992356637349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1553364992356637349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1553364992356637349'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/04/atvocabulary-manager-with.html' title='ATVocabulary Manager with MasterSelectWidget'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-3774743071400261229</id><published>2008-04-21T00:58:00.000-07:00</published><updated>2008-04-21T01:01:41.102-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Archecsv</title><content type='html'>Recently while working on a plone project I found the need to import a whole lot of csv based data into my plone site while creating objects on the fly. I found just the thing to fit this need in &lt;a href="http://plone.org/products/archecsv/?searchterm=ArcheCSV"&gt;ArcheCSV&lt;/a&gt;. This is a nice little product that you can add on to your plone site and can then import data from your csv files in batch and map it on to existing AT based Objects on your site. Good one this ! Just remember update your catalog for your objects to show up and start using them. Using this Product and Archgenxml one has little code left to touch ... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-3774743071400261229?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/3774743071400261229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=3774743071400261229' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3774743071400261229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/3774743071400261229'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/04/archecsv.html' title='Archecsv'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-172683564795888539</id><published>2008-03-29T19:11:00.000-07:00</published><updated>2008-11-13T10:09:46.042-08:00</updated><title type='text'>Ouch ! Torrentspy</title><content type='html'>Ouch ! It's a sad day indeed today when I tried visiting torrentspy and was greeted with this :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_eVgoKogosHI/R-73Sophz7I/AAAAAAAAABo/ROnb2N3iOeA/s1600-h/end_torrentspy.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_eVgoKogosHI/R-73Sophz7I/AAAAAAAAABo/ROnb2N3iOeA/s320/end_torrentspy.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5183352120671326130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One can only guess the real reason behind the close but like they say it's been a wild and most often than not a wonderful ride. Good bye torrentspy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-172683564795888539?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/172683564795888539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=172683564795888539' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/172683564795888539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/172683564795888539'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/03/ouch-torrentspy.html' title='Ouch ! Torrentspy'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_eVgoKogosHI/R-73Sophz7I/AAAAAAAAABo/ROnb2N3iOeA/s72-c/end_torrentspy.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-1910649210341404573</id><published>2008-03-26T21:57:00.000-07:00</published><updated>2008-03-26T22:02:55.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='suse'/><category scheme='http://www.blogger.com/atom/ns#' term='sles'/><title type='text'>Sles 10 Training</title><content type='html'>Just finished a three day training on SuSE Linux Enterprise Server 10 for some &lt;a href="http://www.iperintis.com"&gt;iperintis&lt;/a&gt; folks. It was a nice change of pace for work and the interesting thing that I found was the tremendous amount of improvements that the SuSE distro has undergone. From it's butt slow updater in the 10.1 version to today's zypper and tolerable updater, I must say I do not have to strain to see the improvements that the team has done. The students were quite impressed to see that installing opensuse and sles was even easier than windows and were just tickled pink over some of the tools that they were shown. This first training is for the fundamentals level while next week they will be going through the intermediate and advanced levels. Good luck people !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-1910649210341404573?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/1910649210341404573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=1910649210341404573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1910649210341404573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/1910649210341404573'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/03/sles-10-training.html' title='Sles 10 Training'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-5992708501517144924</id><published>2008-03-20T09:35:00.000-07:00</published><updated>2008-03-20T09:39:35.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>YUI datatables does not work for IE ?</title><content type='html'>I have been playing around with the datatables from Yahoo UI package for one of my customers. Much to my surprise though the code does not work for IE. I have been googling around for somebody reporting the same issue but so far I haven't found anything to the effect. I am just following the same example from the YUI site. On using YUI for my work, everything is good but then there are a few issues I am running into :&lt;br /&gt;&lt;br /&gt;1. caching on the datatable itself does not lend itself to easy doing.&lt;br /&gt;2. compatibility issues between browsers doesn't lend itself friendly to enterprise solutions.&lt;br /&gt;&lt;br /&gt;Going to look more into this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-5992708501517144924?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/5992708501517144924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=5992708501517144924' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5992708501517144924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/5992708501517144924'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/03/yui-datatables-does-not-work-for-ie.html' title='YUI datatables does not work for IE ?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4081640528518655895</id><published>2008-01-27T23:24:00.000-08:00</published><updated>2008-01-27T23:33:03.034-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>What has happened to plonecollectorng ?</title><content type='html'>One my favorite product on plone is the plonecollectorng. I like all the functionality that it offers. It was imo ahead of it's time. I was actually planning to use it to build part of company's portal as the customer care center but as I found out later it seems that plonecollectorng has disappeared from the plone world. When I ask on the channel it's people who answer me only do so in whispers and would rather not have anything to do with it and even went so far as to suggest me a new collector called &lt;a href="http://plone.org/products/poi"&gt;poi&lt;/a&gt;. I felt so much like Charleston Heston in Planet of the Apes ! &lt;br /&gt;&lt;br /&gt;I am sorry I lost touch with the plone world a little while, but can anyone actually explain to me what has happened to plonecollectorng ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4081640528518655895?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4081640528518655895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4081640528518655895' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4081640528518655895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4081640528518655895'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/what-has-happened-to-plonecollectorng.html' title='What has happened to plonecollectorng ?'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-379068487214237900</id><published>2008-01-26T03:31:00.000-08:00</published><updated>2008-01-26T03:39:23.949-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>We are live on the unoffical python planet</title><content type='html'>Python programming has been slow this few weeks as I am busy working up business deals all around, with three plone presentations set up for next week. Life is busy but good. We have generated some local interest here in Malaysia especially with the ISO standardizations in using plone as their document management system. With plone's multitude of functionality, a full blown document management system is just a few clicks away. &lt;br /&gt;&lt;br /&gt;On the blog side I happy to report that this blog is now part of the unofficial &lt;a href="http://www.planetpython.org"&gt;python planet &lt;/a&gt;community !  So we are live on two channels now ! Yayy !!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-379068487214237900?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/379068487214237900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=379068487214237900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/379068487214237900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/379068487214237900'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/we-live-on-unoffical-python-planet.html' title='We are live on the unoffical python planet'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8712308523377073283</id><published>2008-01-09T14:26:00.000-08:00</published><updated>2008-01-09T14:39:52.577-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Plone - redirecting authenticated users to member folder after login</title><content type='html'>Another in the useful-hack-department&lt;br /&gt;&lt;br /&gt;Task : &lt;br /&gt;&lt;br /&gt;After login you want authenticated users to be directed straight to their folders. Normally, after login, the users are redirected to the where ever they wanted to go in the first place. &lt;br /&gt;&lt;br /&gt;Solution :&lt;br /&gt;&lt;br /&gt;The file that controls what happens after a user logs in is the file CMFPlone/skins/plone_login/login_next.cpy. So customize this file and edit it.&lt;br /&gt;&lt;br /&gt;Basically what is happening here is, login_next.cpy will look for a variable called came_from. If the came_from variable is set, then it will redirect the user to whatever came_from is set as. At this point I knew what I had to do, the challenge was to find the right methods to achieve what I want. I needed the method to tell me what is the authenticated user's home folder. After some digging around I found it.&lt;br /&gt;&lt;br /&gt;Just add this line to the login_next.cpy, somewhere at line 25 :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;home_url = membership_tool.getAuthenticatedMember().getHomeFolder().absolute_url()&lt;br /&gt;came_from = home_url&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's pretty evident what this two lines does, it basically calls the membership_tool's methods to determine the authenticated user's home folder's url and set's came_from to that value. After adding those two lines in there, login and logout again and all of your authenticated user's should be redirected to their home folders after login. Happy hacking !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8712308523377073283?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8712308523377073283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8712308523377073283' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8712308523377073283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8712308523377073283'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/plone-redirecting-authenticated-users.html' title='Plone - redirecting authenticated users to member folder after login'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-6554831624036757266</id><published>2008-01-08T20:48:00.000-08:00</published><updated>2008-11-13T10:09:46.839-08:00</updated><title type='text'>plone-3.0.5 is out and it's great</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eVgoKogosHI/R4RUgu0tRpI/AAAAAAAAABc/nhZnVnRONEE/s1600-h/argouml_diagram.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_eVgoKogosHI/R4RUgu0tRpI/AAAAAAAAABc/nhZnVnRONEE/s320/argouml_diagram.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5153336794920339090" /&gt;&lt;/a&gt;&lt;br /&gt;Plone 3.0.5 is out, finally ! I was waiting for this release for it to solve a bug with archetypes where when I used argouml to generate a plone type, it's required fields did not work correctly. Well, I tested the release out on my lappie and now it works like a charm. Damn this is sweet ! &lt;br /&gt;&lt;br /&gt;For the uninitiated few who have been living under a big tempurung for like a year, archgenxml is product for plone which generates plone products from your uml diagrams. So what this means to you o' tired developer is, YOU DON'T HAVE TO TOUCH ONE LINE OF CODE to have a working plone product at your disposal.... YES ! Don't adjust your browser text size, you read me right the first time. YOU DO NOT HAVE TO EVEN TOUCH ONE LINE OF CODE. Just design your application using something like argouml, feed it to argenxml and BOOM BAM in as long as it takes for you to restart your plone instance, you have your product sitting there waiting for you.&lt;br /&gt;&lt;br /&gt;Take your first step on your journey &lt;a href="http://plone.org/documentation/tutorial/archgenxml-getting-started/?searchterm=archgenxml"&gt;here&lt;/a&gt; and start taking on as many plone projects as you can ... woohoo !! Damn this product is so good it should not be free !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-6554831624036757266?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/6554831624036757266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=6554831624036757266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6554831624036757266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/6554831624036757266'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/plone-305-is-out-and-its-great.html' title='plone-3.0.5 is out and it&apos;s great'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eVgoKogosHI/R4RUgu0tRpI/AAAAAAAAABc/nhZnVnRONEE/s72-c/argouml_diagram.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2055207407608513488</id><published>2008-01-08T15:46:00.000-08:00</published><updated>2008-01-08T15:59:11.903-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Zope's best kept secrets</title><content type='html'>Stumbled upon this gem of an &lt;a href="http://faassen.n--tree.net/blog/view/weblog/2007/09/10/0"&gt;article&lt;/a&gt; during one of my searches, the article does a decent job of summarizing what are the best features inside zope but wonders why zope is still the best kept secret. Reading that reminded me of a video I saw at plone.tv. Check it out &lt;a href="http://plone.tv/media/530888016/view"&gt;here&lt;/a&gt;. Okay, so this is a plone screencast, but I shrudder to think of zope's future if the same people are involved. I mean come on, this guy is supposed to be involved in marketing plone and he is boring me to tears ! That ain't supposed to be happening. I am supposed to feel inspired after one of these right ? Heck at least the grok presentation was funny .... &lt;br /&gt;&lt;br /&gt;I mean I can understand if English is not his language, but give a little more enthusiasm than that huh ... ?! Put me up infront of a stage of people and I can sell plone better than that pal. More thought should be given into zope / plone marketing if this is the state of the team involved with marketing it now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2055207407608513488?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2055207407608513488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2055207407608513488' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2055207407608513488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2055207407608513488'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/zopes-best-kept-secrets.html' title='Zope&apos;s best kept secrets'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-2877210744762426891</id><published>2008-01-08T09:49:00.000-08:00</published><updated>2008-01-08T09:55:27.067-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>More good words for z3</title><content type='html'>Electric Duncan some more good things to say about zope3 or z3 &lt;a href="http://oubiwann.blogspot.com/2005/08/django-vs-zope3-or-right-web-app-dev.html"&gt;here&lt;/a&gt;, this time it's vs django. To a certain extent I do agree with some of the things mentioned in that article. At times I do feel that I am trying to bend django to my will when I was coding my application, but alas, I am too green in z3 to give any meaningful comment regarding the comparison. Here, duncan mentions something that piqued my interest - Coding his application in z3, with learning curve thrown in took him two days ! Now that is a wow-ser for me ! &lt;br /&gt;&lt;br /&gt;Although at the back of my mind the article look more slanted towards zope than django which might explain why the author felt more at home with z3, but then it's a good read after all and has inspired me more to go towards giving z3 another serious look for my web development work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-2877210744762426891?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/2877210744762426891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=2877210744762426891' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2877210744762426891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/2877210744762426891'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/more-good-words-for-z3.html' title='More good words for z3'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4105061370419272569</id><published>2008-01-07T19:31:00.000-08:00</published><updated>2008-11-13T10:09:47.080-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>grok zope</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eVgoKogosHI/R4LwrO0tRoI/AAAAAAAAABU/wDqzMC-YFG4/s1600-h/grokzope.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_eVgoKogosHI/R4LwrO0tRoI/AAAAAAAAABU/wDqzMC-YFG4/s320/grokzope.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5152945549169477250" /&gt;&lt;/a&gt;&lt;br /&gt;Just finished my grok.zope.org tutorial and much kudos to the author for making zope easy. The tutorial is well paced and newbies should have no problems understanding some of the concepts of zope, although to be honest when the part about the persistence come rolling along, it would pay to have some zope experience. &lt;br /&gt;&lt;br /&gt;To me it is good to see zope reinvent ( or in this case re architect ) itself to meet the demands of web application frameworks of today. It used to be that people never looked twice at zope when you needed to deploy a basic web application because they did not want the extra baggage that came with zope ( esp the 2.x branch ) although it came with a host of useful features that would really help to shorten development time of any web application. Now with zope3, I am confident of zope being the cog that can fit into much much more wheels out there.&lt;br /&gt;&lt;br /&gt;Good stuff ! If you haven't checked out what the whole bruhaha is surrounding zope3, do yourself a favor and drop by &lt;a href="http://grok.zope.org"&gt;grok.zope.org&lt;/a&gt; and try out the tutorials, the very least is you will walk away understanding the zope framework and architecture a whole lot better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4105061370419272569?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4105061370419272569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4105061370419272569' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4105061370419272569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4105061370419272569'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/grok-zope.html' title='grok zope'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eVgoKogosHI/R4LwrO0tRoI/AAAAAAAAABU/wDqzMC-YFG4/s72-c/grokzope.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-4952577797966460971</id><published>2008-01-06T22:47:00.000-08:00</published><updated>2008-01-06T23:12:26.014-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='guides'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Installing zope3</title><content type='html'>Wanting to try out the tutorials over at &lt;a href="http://grok.zope.org"&gt;grok.zope.org&lt;/a&gt; ( ** CORRECTION - Actually you don't need zope3 to tryout grokproject - My mistake **) which seems really really yummy, I decided to buckle up and install zope from source on my trusty old lappie. It just requires a few steps and shouldn't be scary to all ye old sys admins out there. So, this short howto is meant for those who just dipped the big toe into the big zope pool and who are just trying to get their heads around the whole architecture.&lt;br /&gt;&lt;br /&gt;1. Get the relevant sources. In this case python-2.4.4 from &lt;a href="http://www.python.org"&gt;python.org&lt;/a&gt; and zope-3.3.x source from &lt;a href="http://www.zope.org"&gt;zope.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Building python. This one is easy. Just untar the python package and then issue the commands : ./configure --prefix=/opt/python24;make;make install This will install the python binaries in the /opt/python24 folder. The reason why we have to build the python 2.4 binaries is because zope3 works best with the python-2.4.x branch.&lt;br /&gt;&lt;br /&gt;3. Next you have to build zope. This involves untarring the zope source and then in the source directory issue the command : ./configure --prefix=/opt/zope3 --with-python=/opt/python24/bin/python. This will tell zope to install it's binaries in /opt/zope3 and use the python in /opt/python24/bin/python instead of the system PATH. &lt;br /&gt;&lt;br /&gt;3. Create the zope instance : './opt/zope3/bin/mkzopeinstance -d /opt/zope3/instance -u [username]:[secret] where username and secret is the username and password of your choice when you want to access your zope instance.&lt;br /&gt;&lt;br /&gt;4. Starting up your zope instance : 'cd /opt/zope3/instance/bin; ./zopectl start'. Open up your browser and try to access 'http://localhost:8080/manage'. If your installation is successful, it should prompt you for a username and password pair. Fill in the username and password from step 3. &lt;br /&gt;&lt;br /&gt;Congrats ! You have just successfully installed zope 3 !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-4952577797966460971?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/4952577797966460971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=4952577797966460971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4952577797966460971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/4952577797966460971'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/installing-zope3.html' title='Installing zope3'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8692620919361019989</id><published>2008-01-06T18:56:00.000-08:00</published><updated>2008-01-06T19:23:44.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>getting to pesky foreign key data in django</title><content type='html'>Optimizing databases is a good practice and should be done for any enterprise applications, but as all things go there is a price to pay. The price you pay is when calling back and displaying the data into one can be real PITA. django is a damn good framework and allows you to do work fast with a pedal-to-the-metal feel but then certain amounts of work still has to be done when you have foreign keys defined.&lt;br /&gt;&lt;br /&gt;Say you have a database with two tables : contacts and address. The relationship of the two tables are of the one to many kind, I could never really wrap my head around the one-many many-one many-many thingy so let me just say it in layman so I understand it better myself. "One contact can have one or more than one address"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;class Contacts(models.Model):&lt;br /&gt;..... bla bla&lt;br /&gt;&lt;br /&gt;class Address(models.Model):&lt;br /&gt;&lt;br /&gt;  customer_id=models.ForeignKey(Contacts,edit_inline=models.STACKED,num_in_admin=2)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So in the code above you have basically linked both the tables together using a ForeignKey relationship. the 'edit_inline' ... mumbo jumbo just tells django to add the address field into the main Contacts form during creation and modification and not as a pop up link ( This is important and could be a clincher for normal users ).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Calling all the data back for display&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Okay so now you are honky dory with a great admin form for you to add data into your database, now the problem starts when you want to call all the data back for display in your template.&lt;br /&gt;&lt;br /&gt;Don't worry django comes with little helper functions, you just have to do a few more steps to display your foreignkey data.&lt;br /&gt;&lt;br /&gt;For my case, in my view.py I do something like this :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;from stock.models import Contacts&lt;br /&gt;&lt;br /&gt;def main(request,id):&lt;br /&gt;    contact_list = Contacts.objects.get(id=id)&lt;br /&gt;    return render_to_response('stock/mytemplate.html',{'contacts':contact_list})&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Probably the html formatting would made my code not valid in python, but just check ur identation especially after the function definition.&lt;br /&gt;&lt;br /&gt;The few lines of code above basically expects you to send it an id ( from the url using the GET method ) and then get the Contacts object and then packs up that data object and sends you merrily along to your template with that. &lt;br /&gt;&lt;br /&gt;Okay, a bit about the Contact objects. Inside your contact objects if you have a foreign key relationship it automatically create a method for you to access the data. The method is called &lt;foreign table&gt;_set. So following our example, we know that we have a relationship with the table Address, so we can expect that each contact object will have a method called 'address_set'. Still okay so far ? Lets go ....to get the data you normally call it like this :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;contact_list.address_set.select_related()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This returns an orm object inside a list, so on your template you will call it like this :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;{% for address in contact.address_set.select_related %}&lt;br /&gt;&lt;p&gt;&lt;br /&gt;                Address: {{address.address|escape}}&lt;br /&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;{% endfor %}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That will bring up and display all your address for that particular contact. Done ! Easy peasy, well for me at least just comment me if think more clarification...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8692620919361019989?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8692620919361019989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8692620919361019989' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8692620919361019989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8692620919361019989'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/getting-to-pesky-foreign-key-data-in.html' title='getting to pesky foreign key data in django'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8257805942018153531</id><published>2008-01-06T09:22:00.000-08:00</published><updated>2008-01-06T09:27:26.829-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Plone 3.0.5 !!</title><content type='html'>Waiting for the 8th of January which basically means that Plone 3.0.5 will be released. I am waiting for this release because it fixes a bug in Archetypes which currently causes validation on required fields in a form generated by Archgenxml to fail. After learning the few curves of using ArchgenXML, I must say I am bought hook and sinker on this product. It's really good stuff. With just the drawing of the uml class diagrams allows a developer to generate Plone code, almost too good to be true. &lt;br /&gt;&lt;br /&gt;I want to be able to cover the Archgenxml topic in one of my classes on Plone. Now I am still working on the course structure of how the plone course will be like. Will keep you guys posted regarding this too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8257805942018153531?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8257805942018153531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8257805942018153531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8257805942018153531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8257805942018153531'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/plone-305.html' title='Plone 3.0.5 !!'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6237161444180571452.post-8223800455204515869</id><published>2008-01-06T08:33:00.000-08:00</published><updated>2008-01-06T09:19:45.481-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>A different view of blogger</title><content type='html'>After having a gym session and talking to &lt;a href="http://geek00l.blogspot.com/"&gt;geekool&lt;/a&gt;, I am having a different view of blogger. I used to like having my own plone site and managing it, but after chin seng explained how it would make more sense and less headaches just having your blog in blogger, it just hit home to me.&lt;br /&gt;&lt;br /&gt;One thing about having my blog here is that no one can come and tell me that need to move it or need to shut it down or anything like that. So, I am going to put my blog up here from now on and this will be the central point of dissemination of all information.&lt;br /&gt;&lt;br /&gt;On projects, currently I am still working on a web project using django and I am learning up the little nooks and crannies of the language. It would seem that most of the project's repo is placed in google code repositories. I am using a calendar event but it seems to be buggy. But while researching for this, I found this &lt;a href="http://www.3captus.com/download/django_calendar"&gt;project&lt;/a&gt; that seems a bit more promising. Will look into this and report later on this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6237161444180571452-8223800455204515869?l=blog.lowkster.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lowkster.com/feeds/8223800455204515869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6237161444180571452&amp;postID=8223800455204515869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8223800455204515869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6237161444180571452/posts/default/8223800455204515869'/><link rel='alternate' type='text/html' href='http://blog.lowkster.com/2008/01/different-view-of-blogger.html' title='A different view of blogger'/><author><name>lowks</name><uri>http://www.blogger.com/profile/02110530883983060094</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/_eVgoKogosHI/Syw7w1iCCNI/AAAAAAAAAF4/XMzRuAVJvRE/S220/lowkster.jpeg'/></author><thr:total>0</thr:total></entry></feed>
