<?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-10244258</id><updated>2012-01-29T13:00:16.517+01:00</updated><category term='rest'/><category term='ami'/><category term='url'/><category term='asterisk'/><category term='state oriented programming'/><category term='scala'/><category term='scheduler'/><category term='erlang'/><category term='functional programming'/><category term='modularity'/><category term='otp'/><category term='state machines'/><category term='github'/><category term='good code'/><category term='testing'/><category term='cron'/><category term='reuse'/><title type='text'>Essien Ita Essien's Blog</title><subtitle type='html'>Collections of random ramblings about events and signals in the daily operations of a lazy coder daemon. Observe - "Lazy" not "Slothfull"</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default?start-index=101&amp;max-results=100'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>147</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10244258.post-8502547989011557600</id><published>2008-12-04T19:54:00.000+01:00</published><updated>2008-12-05T02:48:19.231+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheduler'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='url'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='otp'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='cron'/><title type='text'>New Project - URLCron</title><content type='html'>Following up my quiet annoucements yesterday on Erlami, Erlcfg and Fastiga, I've just pushed another project out to github... UrlCron.&lt;br /&gt;&lt;br /&gt;The way I architechture out platforms, closely mimicks the way UNIX programs are advisedly written... i.e. Small Programs Which Do One Thing, Do Them Well, And Can Read From Standard In and Write To Standard Out In A Simple Format.&lt;br /&gt;&lt;br /&gt;In our case, most of our applications usually are made of up many RESTfull webservices, all talking to each other via HTTP Calls and JSON responses. The UIs are all Heavily ClientSide javascripts, that also talk to the various webservices. Normally, each application will have one authoritative application server, which is also a RESTfull webservice, that is directly responsible for knowing *everything* about this particular application.&lt;br /&gt;&lt;br /&gt;For instance, one of our media campaign engines has an appserver which deals with authentication, authorization, media setup, etc for various front ends (HTTP clients, SMS clients, IVR clients, etc).&lt;br /&gt;&lt;br /&gt;Following this very very loose coupling and disconnected architechture, we tend to evolve lots of small stand alone systems. And a lot of times, we need to set timeouts, callbacks, schedules a lot of activities that should be deferred etc. This can all quickly degenerate into complexity and incompatibility and lots of duplicate code, and can become very language dependent. Also, the option of using the venerable cron daemon to call urls from shell scripts is not very nice, and is too much of a hack.&lt;br /&gt;&lt;br /&gt;Enter URLCron. UrlCron is designed to fit into our disconnected mesh of services, to allow us to schedule a call from any service to call any other service and then store the results. The scheduling service can come back at a later datetime to check the status.&lt;br /&gt;&lt;br /&gt;In its current implementation on github, its just a few days old and is not yet mature, but the entire concept works end to end.&lt;br /&gt;&lt;br /&gt;The readme on github contains a lot of ideas of where I would like to logically take this to, and some notes on architechture and design.&lt;br /&gt;&lt;br /&gt;Someone else wants to have fun poking around at this? Go crazyyyy!!!!&lt;br /&gt;&lt;br /&gt;Ace out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-8502547989011557600?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/8502547989011557600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=8502547989011557600' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/8502547989011557600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/8502547989011557600'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2008/12/new-project-urlcron.html' title='New Project - URLCron'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-5392847238662838951</id><published>2008-12-03T01:10:00.000+01:00</published><updated>2008-12-03T01:26:30.345+01:00</updated><title type='text'>Sweet November</title><content type='html'>November was a good month. Yeah really was... and yeah i know... the world is in general economic recession, but hey... Obama won!!! :)&lt;br /&gt;&lt;br /&gt;Anyways... last month, saw three of our inhouse projects quietly released on github. My github page is at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/essiene"&gt;http://github.com/essiene&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll just use this post to talk &lt;span style="font-style: italic;"&gt;briefly&lt;/span&gt; on the three projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ErlAMI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ErlAMI (pronounced Erl AM I) was my first serious Erlang project that was not hot off the tutorial presses :)&lt;br /&gt;&lt;br /&gt;I cut my proverbial Erlang teeth on this project. It is an Asterisk AMI protocol library done in Erlang/OTP and trust me, I've learned a huge load just doing this project.&lt;br /&gt;&lt;br /&gt;I needed to build an automated dialler based on Asterisk as part of our inhouse product stack, and defintely needed to talk to Asterisk. This was a project that I had started in Java a couple of months back, but after taking the red pill, I decided that the Matrix had me, and I just had to do this in Erlang.&lt;br /&gt;&lt;br /&gt;At the time I started it,  I was still reading Joe Armstrong's "Programming Erlang", so walking through the git&lt;br /&gt;history will feel like a trip through Joe's book.&lt;br /&gt;&lt;br /&gt;I started by rolling my own structures and processes everywhere, learning new features of the language and using them, learning eunit and other things and rolling them in.&lt;br /&gt;&lt;br /&gt;Eventually, I had built my own poor man's OTP.  I had my primitive supervision trees,  FSMs,  servers,  even a poor straw man's event manager and handler framework.&lt;br /&gt;&lt;br /&gt;Impressive, but as I finally completed the OTP parts of the book, I realized I had to port to OTP because of the immense gains, and just the raw amount of iron clad tested code I would be basing on. I did just that, and the result is the current Erlami.&lt;br /&gt;&lt;br /&gt;This one will take a while to mature, but i'm continually finetunning my ideas and feeding them back here, and there are some funny bugs and corner/edge case issues here and there, which will get cleaned up with more use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Erlcfg&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the new kid on the block, and an idea I just had to execute... plus, since last year, I've made it a job of mine to learn compiler tools on every language that I know and use. In this case, I just had to get my hands on leex and yecc.&lt;br /&gt;&lt;br /&gt;The idea is simply my own extrapolation of the Java properties file format.&lt;br /&gt;&lt;br /&gt;Normally a properties file looks like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some.key = value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some.other.key = other value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some.other.other_key = other other value&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I like this because it is naturally namespaced, is eye friendlier than XML and my java SDP platform uses properties files strictly for configuration. The only problem is verbosity, which is caused by non-nesting, i.e. The format does not allow itself to be refactorable. For instance, examining:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some.key = value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some.other.key = other value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some.other.other_key = other other value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some.other.other.key = other value&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It would be more maintainable to rewrite this as:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;some = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    key = "value";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    other = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        key = "other value";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        other_key = "other other value";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        other = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            key = "other value";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Also, this bears some resemblance to JSON and in some way YAML. Well... erlcfg aims to do just this, and add something else... VARIABLES! Checkout the &lt;a href="http://github.com/essiene/erlcfg/tree/master/README"&gt;README&lt;/a&gt; for a good complex config file example.&lt;br /&gt;&lt;br /&gt;Currently, the syntax is very strict (notice the extra assignment operators and semicolons... annoying!) to help make parsing easier.  But since I have achieved my initial goals, I'll go back and make it easier to write.&lt;br /&gt;&lt;br /&gt;Also, I have some interesting plans, like adding XML DTD type support, or simple type annotations to help in verification of config file syntax, easily, this would allow you to define:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;server {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    port = integer;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    listen = list(string);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    log {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        data = string;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        level = atom;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And the use this to verify&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;server = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    port = 111;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    listen = ("192.167.10.1", "192.168.10.1");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    log = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        data = "/var/log/applog";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        level= debug;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I would then love to be able to verify the file by doing:&lt;br /&gt;&lt;br /&gt;$ erlcfg --verify /var/lib/configfile.dtd /etc/config.conf&lt;br /&gt;&lt;br /&gt;This is still a nice dream right now, but trust me to keep hacking at this till it is done. Did I also mention that it supports all erlang terms except the tuple?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fastiga&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This one is a scala project. It is an implementation of an Asterisk FastAGI container in scala.&lt;br /&gt;&lt;br /&gt;This really came about from me having a very specific way I wanted to build my AGI applications, i.e. like the Simple State Machines that they are. Basically, almost like you would build a parser from a BNF specification, I wanted to build my AGI applications to match my state diagrams.&lt;br /&gt;&lt;br /&gt;So I set out to eliminate IFs with MATCHes, build case classes that would allow those matches and employ scalar Actors and Tail Recursion to make it all work nicely. Also, using reflection, we can host multiple AGI applications inside just one container, which currently is deployed inside of another servlet container, hence allowing more packagable code and promoting better code reuse.&lt;br /&gt;&lt;br /&gt;You work on your AGI logic, let us handle the running and hosting framework.&lt;br /&gt;&lt;br /&gt;Its still a work in progress, but the main ideas are realized and it is being used heavily in-house.&lt;br /&gt;&lt;br /&gt;We actually have a *thin* framework around it, (much like the OTP is a framework around Erlang) which&lt;br /&gt;I'll tidy up and make a part of the project.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Looking Forward&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Honestly, more things are coming down the pipe... lots of ideas and tools that we're using inhouse, which I believe will be valuable to some other team of harrassed developers like us. :)&lt;br /&gt;&lt;br /&gt;So this is hoping for a more productive December and onwards.&lt;br /&gt;&lt;br /&gt;Ace... out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-5392847238662838951?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/5392847238662838951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=5392847238662838951' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/5392847238662838951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/5392847238662838951'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2008/12/sweet-november.html' title='Sweet November'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-5869611167058681033</id><published>2008-11-01T06:19:00.000+01:00</published><updated>2008-11-01T08:19:03.350+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='state machines'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='otp'/><category scheme='http://www.blogger.com/atom/ns#' term='state oriented programming'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Erlang/Scala... gateway to State Machine Oriented Programming</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;WARNING: LONG ARTICLE AHEAD, GRAB YOUR FAVOURITE BEVERAGE.&lt;br /&gt;&lt;br /&gt;Background&lt;/span&gt;&lt;br /&gt;For the past couple of weeks, my team has been working on a version two of one of our apps.&lt;br /&gt;&lt;br /&gt;The first version was basically a Python application, that called out to a Java REST webservice.  This webservice talked to asterisk via AMI.&lt;br /&gt;&lt;br /&gt;There was also some python AGI scripts also for doing automated IVR sessions.&lt;br /&gt;&lt;br /&gt;It worked, but there where a lot of ideas after the first version was done. So I did what any sanity loving team lead would do.... branched out git repo and started work on version 2. Now, our version 1.0stable is available for clients, but we're shooting to quickly start recommending version 2.0 and already, just after 3 weeks of very hard work, we're smiling and approaching the end.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New Beginnings Architecture&lt;/span&gt;&lt;br /&gt;The structure of the new application is this:&lt;br /&gt;&lt;br /&gt;The Java AMI REST webservice, has been replaced by an Erlang/OTP/Mnesia/Mochiweb webservice. If you have any idea what those terms mean, you can already see that I've gained a lot of features.&lt;br /&gt;&lt;br /&gt;My Prioritized FIFOs are now distributed across multiple nodes... at almost zero coding cost (I didn't find a comfortable way of doing this in Java). (We'll be releasing the Erlang AMI library next Month as open source software).&lt;br /&gt;&lt;br /&gt;The python AGI scripts have been replaced with Scala AGI application modules, seated in a novel FastAGI server built also in scala. (This server will also be released as open source).&lt;br /&gt;&lt;br /&gt;The rest of the application is a Comet/Oribited/JQuery/Pylons over mod_wsgi mix.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why Oh Why?!!!&lt;/span&gt;&lt;br /&gt;Now, this is the fun part... why?&lt;br /&gt;&lt;br /&gt;For the last 1.5+ years I've been working exclusively in Telecoms integration middleware and SDP space, building and deploying services for very agrressive customers, one of them now the fastest growing Telecoms company in Nigeria (if not Africa). And that experience left me with some major impressions:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;My approach was still error prone.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The problems are simple but exacting&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;There is NO ROOM for NON-EXACTNESS... ZERO!!!&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;I learnt this lessons, rather shockingly, since I consider myself a carefull artisan, always striving to improve my art, and having done so more than a rather no-too-small percentage of others :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enter Application Patterns&lt;/span&gt;&lt;br /&gt;The first thing I noticed was that all the applications follow a particular pattern, and I rightly set about building a framework to easily enable writing of these applications... I'm pretty proud of that framework and its humming silently in more than 3 different sized telecoms networks.&lt;br /&gt;&lt;br /&gt;The framework has adapters to connect to various network elements, USSD Gateways, SMS Gateways, MSCs, Mediation Servers, etc and convert all incoming messages into a common format (based on HTTP URLS). These requests are routed on the framework router to the Service endpoints... the Handlers.&lt;br /&gt;&lt;br /&gt;The handlers are the core of the framwork and do all the SCP, AAA, etc, connections and business logic.&lt;br /&gt;&lt;br /&gt;After writing a couple of the handlers, more similarities stood out, so I kept fine-tuning that part of the framework untill very little of it was left to be customized for just the business logic. The plan is to eventually develop a DSL that can be used to write that part and deploy in realtime.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where Did I Go Wrong&lt;/span&gt;&lt;br /&gt;Along the way, I noticed that some of the applications would still evade my exception handling. Also, once in a while, when traffic would spike, I would get some errors which I *shouldn't* be getting.  I would&lt;br /&gt;rise to the occasion and fix them, but after one pretty hairy issue with some lost transactions, I really began to question my entire foundations.&lt;br /&gt;&lt;br /&gt;There seemed to be something amiss, I couldn't seem to translate the very simple logic flow into similar Java code, without some corner and edge suprises (and I unittest A LOT!). Something was definitely missing.&lt;br /&gt;&lt;br /&gt;I would solve the problem, but decided that I needed to change something very fundamental.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Does This Tunnel Have An End?&lt;/span&gt;&lt;br /&gt;That was when I started my gazillionth trek up the Functional programming hill - out of desperation. I had dabbled in Haskell 2 years ago and left off, because there where no practical libraries. I'd had a brief fling and excitement with Ocaml around the time I dropped Haskell, but dropped it too, though I really liked Ocaml and was more productive,  I dropped it because it didn't have good libraries (these situations are changing as I write... just last month or so, both Ocaml and Haskell have annouced Battries Included projects... hooray).&lt;br /&gt;&lt;br /&gt;I had also touched Erlang but hurriedly dropped it... I mean... ewwwwwww.... was that even readable syntax? I had played with various dialects of lisp, (common lisp, newlisp, a bit of scheme), but somehow, my inner programmer didn't gel with any of these, at least not yet.  Maybe it was just the timing, but I like to think that I just wasn't ready, I hadn't faced my own waterloo class of problems yet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Matrix Has You... errr... Scala&lt;/span&gt;&lt;br /&gt;Anyway, this time, as I started exploring other options again, something was different. I was looking out for a language that:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Would allow me to write code without carrying tooo much state information about, so I didnt' get shot in the foot when I least expected&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Had very broad library coverage&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;If possible allow me build on what I'd already done.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Could allow me build my dream distributed persistence framework (in my class of problems, Map/Reduce hence Hadoop/HBase/CTable is not the solution... I was looking for a mature DHT or something better with object serialization support (Scalaris,Mnesia!).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Easily allow me scale out without worrying about concurrency issues, locks, synchronication, etc.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;Anyways, that was when I first came across Scala the language. (www.scala-lang.org)&lt;br /&gt;&lt;br /&gt;Scala combines very strict typing, functional and object oriented paradigms with very sexy type inference into one badass language that runs on the JVM,  (and I hear .NET CLR too).&lt;br /&gt;&lt;br /&gt;I couldn't believe it, so I took my time dipping my feet in the pool and sampling.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Learning Strategy... the Stalker/Prey Approach&lt;br /&gt;&lt;/span&gt;There is a way that I like to learn when I'm really really serious. I search to web for all sort of references and tutorials, blogs, articles and what nots about my prey (well... technology doesn't sound as cool :) ), and then take my time, going thru all the trivial examples, code snippets, hanging out on IRC, etc... just to immerse myself in the feel on the technology. When I have a reasonable feel or the technolofy and community, I now dive in head first via the "recommended text or tutorial".&lt;br /&gt;&lt;br /&gt;Long story short, I began to stalk Scala. Funnily, in so doing I became the prey! I know... its weird, but eventually, Scala and I just "clicked". I don't know what did it, if it was the special sweet spot on the JVM, or the combined OOP and Functional paradigms, or the fact that I could import and just use my Vast Array of company code that had been writen already in Java. I don't know but we just clicked. And I knew I had to see this one through.&lt;br /&gt;&lt;br /&gt;My first plan was to investigate how to write a servlet in Scala and see if I could eventually  swap out my Java handlers with Scala handlers. I started investigating that productively, but kept happening along another big mine that blew up in my mind...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Erlang: A Second Coming&lt;/span&gt;&lt;br /&gt;As I read and played with Scala, the Actors library implementation just kept coming up and how it was a clone of something that was native in Erlang. Well, I decided that if Scala stole it from Erlang, it had to be worth finding out the main thing itself. I made up my mind, and I picked up a second victim.&lt;br /&gt;&lt;br /&gt;Still syntax-wary from my last attempt at Erlang, I went for the stalking now with questions on my mind.&lt;br /&gt;&lt;br /&gt;Then a funny thing happened. This time, I waltzed over the Erlang syntax... and I still don't know why, but that syntax just seemed different, instead of weird. After I kept at it for a couple of days, the veil simply lifted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So What's The Bling?&lt;br /&gt;&lt;/span&gt;Erlang has so much goodies its hard to imag ine that its open source. Its usually features that rich, that make companies like Microsoft, keep close tabs on their languages.&lt;br /&gt;&lt;br /&gt;Anyway, my easy way of explaining Erlang is this:&lt;span style="font-style: italic;"&gt;  Erlang feels like a domain specific language for highly available and highly scalable applications with very low error rates and high integration to other environments.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Take some time and read that again. Out of the box, erlang allows you to very cheaply create concurrent applications that can be distributed on mulitple network nodes. Its a very basic concept, not an advanced language feature. (spawn, !)&lt;br /&gt;&lt;br /&gt;These processes are encouraged to be built for failure, so you don't try to prevent your processes or nodes from dieing (A concept I call Fighting Your Exceptions). Instead you encourage them to die, quickly! Erlang provides process parenting/monitoring as another very basic concept, to allow you restart dead processes. (spawn_link, link, monitor, supervisor)&lt;br /&gt;&lt;br /&gt;Finally, what I'd always loved in C and detested in Java (low-level bit manipulations) are present in a very convenient data type: Binaries&lt;br /&gt;&lt;br /&gt;This means a lot to me. I used to fall back to C/D to write low-level  binary protocol clients, and use the library to build a proxy-daemon which spoke plain-text, and then connect to that from Java, Python, etc... now I just do the entire back-ends in Erlang!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Programming As State Machine Construction&lt;/span&gt;&lt;br /&gt;Finally, I come to the main point.&lt;br /&gt;&lt;br /&gt;Has any of these helped me solve my problems with my previous approach? Hell Yeah!!!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Immutability in Scala/Erlang helps me avoid a very nasty class of concurrency problems... race conditions in multithreaded Java code.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Immutability also encourages localized variable definitions, which encourages what I call &lt;span style="font-style: italic;"&gt;"terminal functions"&lt;/span&gt;. These are functions whose scopes terminate in themselves. The have all they need inside them, without looking for a global or class wide state. Everything is either passed in or initialized there. And debugging them is WAAAAAAYYYYY simpler :)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Higher Order Functions, Anonymous functions and Currying, provide some of the bassaddest refactoring tools known to man (and woman... if she can program :) ). Its just sooooo cool refactoring code in these languages. Even Python has to take a back seat sometimes, and that is saying a LOT because Python is darned flexible.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Tail Recursion (probably my favourite feature): Allows me to write pure State Machines. Some event driven, some acceptor state machines. This has been my biggest boost in the last couple of months. I sit down and come up with 3 types of diagrams:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt; An application layering diagram, that gives me the various service layers and defines the protocols, contracts and messages between each layer.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;A State Transition Diagram or and State Table, which describes &lt;span style="font-weight: bold;"&gt;completely &lt;/span&gt;all the states for each layer and the messages and transitions between them&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;A flowchat for each state in each state State Machine in each application layer. I now sit down and virtually translate the diagram into code that works &lt;span style="font-weight: bold;"&gt;without suprises&lt;/span&gt;!! I never felt this was possible in such a short time.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;I use the Erlang/OTP framework, especialy gen_server, gen_fsm and gen_event, a lot to simplify my life and use Scala Actors intensively. I plan to try out the Scala/OTP library that is being built here: &lt;a href="http://github.com/jboner/scala-otp/tree/master"&gt;http://github.com/jboner/scala-otp/tree/master&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;I'm in the business of software, and one of our company motos and policies is to solve hard problems that plague our clients. We continually come up with innovative solutions and deliver them, and most of them end up being used by lots of concurrent users.&lt;br /&gt;&lt;br /&gt;Scala and Erlang have shown in a very short time, that the future will be pretty different from what we currently know today. I think the era of the Swarm is upon us, where most of our applications are going to be used by a myriad of users. The ability to be able to write correct code that is easily debuggable and run in a scalable environment is going to be more and more of a differentiating factor, and hopefully, that can translate into pre-forty year old retirement ;)&lt;br /&gt;&lt;br /&gt;In all seriousness, if you've not looked at a Functional programming language for your choice platform, you do your self a serious disservice, which can only be fixed by looking into one, SERIOUSLY as soon as possible.&lt;br /&gt;&lt;br /&gt;Ace... out.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-5869611167058681033?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/5869611167058681033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=5869611167058681033' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/5869611167058681033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/5869611167058681033'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2008/11/erlangscala-gateway-to-state-machine.html' title='Erlang/Scala... gateway to State Machine Oriented Programming'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-7383997528384757848</id><published>2008-10-17T11:59:00.003+01:00</published><updated>2008-10-17T14:32:23.772+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reuse'/><category scheme='http://www.blogger.com/atom/ns#' term='good code'/><category scheme='http://www.blogger.com/atom/ns#' term='modularity'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><category scheme='http://www.blogger.com/atom/ns#' term='ami'/><title type='text'>Client/Server design and implementation: Discovering the symmetry in implementation</title><content type='html'>I experienced a paradigm shift in my design approach recently, which I'd like to put into writing, so I can formulate the rough thoughts in my head better.&lt;p  style="text-align: justify;font-family:trebuchet ms;"&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;I've been working on an Erlang AMI library implementation for a couple of weeks now.&lt;/p&gt;&lt;p  style="text-align: justify;font-family:trebuchet ms;"&gt;I set out initially to write a simple AMI Client library that I could use to implement my application. On the way, I had to learn eunit so I could thoroughly test as I built, not to mention, quickly build test the small blocks before integrating them.&lt;/p&gt;&lt;p  style="text-align: justify;font-family:trebuchet ms;"&gt;After I built a working prototype (with plenty of bugs which I was well aware of), I knew I had to unittest this properly, if I wanted to have confidence in the code not to mention bragging rights for well tested code.&lt;/p&gt;&lt;p  style="text-align: justify;font-family:trebuchet ms;"&gt;&lt;span style="font-weight: bold;"&gt;First a problem&lt;/span&gt;&lt;br /&gt;The problem with testing external connections like this is usually bootstrapping. If I have asterisk installed on my dev machine, writing the tests is not a problem. But if J. Random Hacker grabs my source, and&lt;br /&gt;out of habit types:&lt;/p&gt;&lt;p  style="text-align: justify;font-family:trebuchet ms;"&gt;     make test&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;They're only going to get pass marks only if they have asterisk configured, and by some telepathic ethos among hackers, also set up his asterisk instance to have the same username and password as my own, among other things (channels, etc). Unfortunately, this doesn't happen as much as we'd love it to :).&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;There is a way around this using Mock frameworks (which I've never used by the way :D). Anyways, I did what any hacker worth his mettle would do, I sucked it up, stashed the client code in its buggy state, and went ahead to implement a simulator from the same code base.&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;You what?!!!&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;Yup... I'm building AmiSym, which is an Asterisk AMI Simulator, and it shipswith the ami library (so you get a client and server for the price of just the client). Now onto the cool parts of doing this.&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Advantage Number 1 - More experience&lt;/span&gt;&lt;br /&gt;You can never over emphasise the value of increased experience when solving a domain specific problem. In my case, I'm basically solving the AMI problem a second time, even though it is from another perspective&lt;br /&gt;(more on that below). This give me more exposure to the problem, than I would have had if I'd done a one-time-coding-pass and written the client library.&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;Infact, I end up tackling the AMI library problem 3 times. Once when I implemented the prototype. Once when I implemented the simulator. And once when I reimplement the client with the experience I've gained from implementing the simulator.&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Advantage Number 2 - The other side&lt;/span&gt;&lt;br /&gt;If I had stuck to writing just the client, I would probably come up with a well done client (I mean, I love to consider myself a not-so-shabby programmer), but now that I am also implementing the server side, I get&lt;br /&gt;to see the problem from both sides of the coin. And that has impacted the way I understand the communication and the mechanisms that the client has to implement because I'm designing both the producer and consumer.&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;For instance, I created an internal data structure to store the &lt;span style="font-weight: bold;"&gt;Key: Value&lt;/span&gt; pairs that are AMI responses, with a simple hack to deal with things like &lt;span style="font-weight: bold;"&gt;action: command&lt;/span&gt; results, which contain extra data that&lt;br /&gt;don't come in &lt;span style="font-weight: bold;"&gt;Key: Value&lt;/span&gt; pairs.&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;This worked satisfactorily for as far as I was just a client. But once I started implementing the simulator, I decided I had to use the same data structure on both sides of the connection, immedietly, I found out my&lt;br /&gt;Data structure wouldn't be symmetric. That Is, I couldn't do:&lt;/p&gt;&lt;p face="trebuchet ms" style="text-align: justify;"&gt;     AMI RAW DATA  =&gt; RESPONSE PARSER                                  =&gt;  INTERNAL REPRESENTATION&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;and then&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;&lt;br /&gt;INTERNAL REPRESENTATION =&gt; DESERIALIZER =&gt; AMI RAW DATA&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;This was a problem, since it would mean, either two code bases, or just mean that I should redesign my INTERNAL REPRESENTATION, which is what I did.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;So I now have a more robust Data Structure, because I took a trip to the other side.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;&lt;span style="font-weight: bold;"&gt;Advantage Number 3 - Borrowing From the other side&lt;/span&gt;&lt;br /&gt;If these were the only advantages, the code would already be better off, but there is more. My design of the simulator State Machine and internal processes, end up being very sensible. I attribute this to the fact that my first attempt at writing the simulator is in actualty, my second attempt at tackling an AMI library core.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;Now, going back to the client, and I'm borrowing a MIRROR image of the simulator process in the client. Simply put, this makes a *lot* of sense. It makes sense for a Client and Server of the same protocol, to be mirror images of each other, such that when plugged together, and a message in inserted into any them, it will loop through the virtual ring that is formed and "theoritically" come back in the same representation.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;This is all kind of abstract, but just think of two halves of a hoop that fit perfectly together... or YinYang... each groove in one is complemented by an extrusion on the other, so they're really just each other, only turned inside out.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;I think that approaching any problem space from this perpective produces a much more robust and complete design and coded implementation. Or to state it in cooler terms... realizing the Zen of YinYang in&lt;br /&gt;Client/Server systems yeilds better code and a better design.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;&lt;span style="font-weight: bold;"&gt;Advantage Number 4 - Modularity&lt;/span&gt;&lt;br /&gt;The final advantage I want to bring up is extreme modularity. Usually, one can relate to modularity in its more common form. Take for instance a problem where we write a generic TCP framework that allows one to inherit and extend to either an HTTP or SMTP module.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;This I would like to call forward-divergent modularity, which refers to a single code base being made modular to allow the core functionality to be easily diverged down an irreversible path.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;This is not type of modularity I gained.  The type of modularity I'm referring to, which I'd like to call cyclic-divergent modularity would best be described with the help of some funky diagrams. Enjoy :P&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_71vXvqQL2Io/SPiOu3xXVpI/AAAAAAAAAG4/93ru14bMNPE/s1600-h/forward-divergent.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_71vXvqQL2Io/SPiOu3xXVpI/AAAAAAAAAG4/93ru14bMNPE/s320/forward-divergent.png" alt="" id="BLOGGER_PHOTO_ID_5258109500851181202" border="0" /&gt;&lt;/a&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;The figure above shows what I have termed Forward-Divergent Modularity. Each of UNIQUE CODE A and B have a common core or set of common core modules, which do similar stuff (like open a socket, setup a generic session, store client_id/ip mappings in a HashMap, etc), but then each of them have their unique portions (SMTP protocol versus HTTP protocol).&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;I call it forward-divergent, because a virtual message travelling through this system, would either start from CORE and move towards A, or move towards B. A system that is structured this way is an Either/Or system. Nothing would make a single message cross camps. You would not be able to "virtually" LOOP the above system at the UNIQUE CODE POINTS without introducing a protocol converter (mostly impractical) which&lt;br /&gt;confirms that even though they have the same base, they're different logical systems.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;Now onto cycle-divergence.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_71vXvqQL2Io/SPiTgQnQWtI/AAAAAAAAAHA/SLcHlbBe8hI/s1600-h/cyclic-divergent.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_71vXvqQL2Io/SPiTgQnQWtI/AAAAAAAAAHA/SLcHlbBe8hI/s320/cyclic-divergent.png" alt="" id="BLOGGER_PHOTO_ID_5258114747379768018" border="0" /&gt;&lt;/a&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;The figure above shows what I term cyclic-divergent. As you can see, this entire system turns out to be a Single virtual system, even though there is some uniqueness in A and B.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;In this case, a "virtual" system message can be inserted at any point, and it should theoritically, go through various transforms, but by the time it returned to its originating point, it should be back to the same format it originated in.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;In Conclusion - Dude Stop Being Abstract&lt;/span&gt;&lt;br /&gt;Ok, I'll stop. :)&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;I don't know about you, but I'm always thinking about code I write, and realisations like these, make me a better systems designer and implementor. For instance, now that I know that I'm actually building a single virtual unit, I have been able to identify that common core in my code base now.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;My work from here on out is to widen the common core as much as possible, so that the unique parts are very small. This will result in a more robust client library and server library, that both depend on a well tested and shaken core. This is most decidedly better than implementing one in absense of the other would have resulted in.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;As an aside, I'm not so sure I would have seen this using a mock framework (I've never used one, so I don't know). This is not an anti-mock framework rant, just an observation anyways. My personal conclusion then is that whenever one is implementing a protocol-ish library, there could be a lot to gain from also building the Other Side of the protocol in the same code base. The important point of note is IN THE SAME CODE BASE.&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;So if I were to write an HTTP server, I would also write a client in the same code base, and use that in my testing.  Too much work? Yeah, maybe... but its fun... and its got its perks :)&lt;/p&gt;&lt;p style="text-align: justify; font-family: trebuchet ms;"&gt;Peace out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-7383997528384757848?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/7383997528384757848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=7383997528384757848' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/7383997528384757848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/7383997528384757848'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2008/10/clientserver-design-and-implementation.html' title='Client/Server design and implementation: Discovering the symmetry in implementation'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_71vXvqQL2Io/SPiOu3xXVpI/AAAAAAAAAG4/93ru14bMNPE/s72-c/forward-divergent.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-3979099925422801906</id><published>2008-10-12T02:56:00.001+01:00</published><updated>2008-10-12T03:01:33.205+01:00</updated><title type='text'>Quick link to creating custom Erlang behaviours</title><content type='html'>One of the things I liked about Python when I learnt it back then, was&lt;br&gt;how it exposed what it was doing under the hood in a simple way.&lt;p&gt;For instance, passing self as the first argument of class methods made&lt;br&gt;lots of sense coming from an Abstract Data Type use case with C&lt;br&gt;Structs,&lt;br&gt;I could immedietly see the relationship.&lt;p&gt;Anyway, some parts of Erlang are like that too... and trust me... its&lt;br&gt;a really really small and concise language (too concise? :)),&lt;br&gt;anyways... if you&amp;#39;ve&lt;br&gt;ever tried to do any sort of Frameworky thingy in an OOP language,&lt;br&gt;you&amp;#39;ve had to use Interfaces or something similar (hopefully you&amp;#39;ve&lt;br&gt;done this right? and not left&lt;br&gt;your users to figure out at [compile | run] time why things are&lt;br&gt;borking sooooo badly).&lt;p&gt;Anyways... since Erlang has no classes and there are nothing like&lt;br&gt;Interfaces, they implement a very nice feature called Behaviours which&lt;br&gt;do some thing similar to Interfaces. At least, tthat&amp;#39;s the&lt;br&gt;simplest way to think about Erlang Behaviours.&lt;p&gt;Here&amp;#39;s a quick link showing how to create yours... short and straight&lt;br&gt;to the point: &lt;a href="http://www.trapexit.org/Defining_Your_Own_Behaviour"&gt;http://www.trapexit.org/Defining_Your_Own_Behaviour&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-3979099925422801906?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/3979099925422801906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=3979099925422801906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/3979099925422801906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/3979099925422801906'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2008/10/quick-link-to-creating-custom-erlang.html' title='Quick link to creating custom Erlang behaviours'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-2443398374306930405</id><published>2008-10-12T02:05:00.001+01:00</published><updated>2008-10-12T03:01:10.069+01:00</updated><title type='text'>Asterisk AMI Library in the works</title><content type='html'>We&amp;#39;re building an interesting application in the office, and Asterisk is &lt;br&gt;a big part of that application.&lt;p&gt;The component I&amp;#39;m working on communicates with Asterisk via AMI mostly &lt;br&gt;for originating calls, and I have a version of it in Java working with &lt;br&gt;some small bugs here and there.&lt;p&gt;I decided some weeks back to rebuild that component in Erlang, so I&amp;#39;m &lt;br&gt;currently working on an Asterisk AMI library in Erlang. This is my first &lt;br&gt;&amp;quot;real&amp;quot; app in erlang (The ring benchmark exercise in Programming Erlang &lt;br&gt;doesn&amp;#39;t count :) ).&lt;p&gt;For me, when working on a project, I *really* love to get unit tests up &lt;br&gt;and running. They are a great way to &amp;quot;break the ice&amp;quot; and really really &lt;br&gt;really help keep code maintainable and keep regressions in check as &lt;br&gt;codebase grows. So last week, I finally downloaded and went thru the &lt;br&gt;docs for Eunit, and started using it, first for the Ring benchmark (I &lt;br&gt;should post that code somewhere) exercise and now for the AMI library. &lt;br&gt;Its pretty neat and simple.&lt;p&gt;Since I&amp;#39;m still new to Erlang, I&amp;#39;m learning and applying so this &lt;br&gt;library. The library will eventually be open sourced and then I&amp;#39;ll be &lt;br&gt;found out for what I really am... a cheap fraud who can&amp;#39;t code to save &lt;br&gt;his left pinkie :)&lt;p&gt;Anyways... just finished some unit testing and all works, so I&amp;#39;m going &lt;br&gt;to bed in high spirits :)&lt;p&gt;--Zzzzzzz&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-2443398374306930405?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/2443398374306930405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=2443398374306930405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/2443398374306930405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/2443398374306930405'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2008/10/asterisk-ami-library-in-works.html' title='Asterisk AMI Library in the works'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-2086821236965698490</id><published>2008-10-11T20:25:00.001+01:00</published><updated>2008-10-11T20:33:04.811+01:00</updated><title type='text'>Back Online</title><content type='html'>Well, I&amp;#39;m back to blogging and the whole online presence thing.&lt;p&gt;But there was a reason I deliberately stopped blogging. I realized that &lt;br&gt;the internet is a very interesting medium of communication. People that &lt;br&gt;don&amp;#39;t even know you will get to read the things that you write.&lt;p&gt;This is all cool, but the problem is that no matter how shallow or &lt;br&gt;uncooked your theories (or reasonings) are, some people who are just too &lt;br&gt;lazy to fathom things out by themselves, will swallow what you have to &lt;br&gt;say, hook, line, sinker and dare I say boat with the captain and crew!!! &lt;br&gt;I decided then to stop blogging until I was sure that I had something &lt;br&gt;fairly well cooked to contribute to the community at large.&lt;p&gt;So, why am I back? Am I saying that now I&amp;#39;m a rock star programmer or &lt;br&gt;something akin to that? Well... one small part of me wishes that were &lt;br&gt;the bare truth, but I really can&amp;#39;t judge my &amp;quot;rock-starNESS&amp;quot; (or &lt;br&gt;awesomeness to boot!), but I can honestly write about a wider breath of &lt;br&gt;interesting topics that I have had a lot more close encounters with, &lt;br&gt;than before...&lt;p&gt;Just to give a brief preview, I have spent the past 1year+, working on &lt;br&gt;an SDP (Service Deployment Platform) that is now in production &lt;br&gt;deployment in a number of tel cos here. That has been probably the most &lt;br&gt;satisfying experience I&amp;#39;ve gained, and has in turn led me onto my &lt;br&gt;current path which I toe as a programmer. On this path, I&amp;#39;ve picked up &lt;br&gt;and continue to pick up things like Parsers (JavaCC, Apaged, Lex/Yacc), &lt;br&gt;Distributed, Redundant and Reliable Systems and their construction &lt;br&gt;(DHTs, Heartbeat, Mnesia, MySql replication), Functional Programming &lt;br&gt;Languages (Ocaml, Scala, Erlang), OTP (Did i mention Erlang already?!).&lt;p&gt;I have learnt sooooo much technology in a short while and waaaaaay much &lt;br&gt;more about crafting reliable systems and managing code complexity to &lt;br&gt;produce easily evolving code bases that you don&amp;#39;t have to pray to God &lt;br&gt;each time you do an upgrade.&lt;p&gt; From here on out, I&amp;#39;ll be blogging a bit more often, not sprouty and &lt;br&gt;all authoritative, but just staying on the stuff that I&amp;#39;ve learnt and &lt;br&gt;now know. Hopefully, these will make for some fun reading and mayhap... &lt;br&gt;helpfull.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-2086821236965698490?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/2086821236965698490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=2086821236965698490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/2086821236965698490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/2086821236965698490'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2008/10/back-online.html' title='Back Online'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-115144621765952372</id><published>2006-06-27T23:10:00.000+01:00</published><updated>2006-06-27T23:10:17.686+01:00</updated><title type='text'>RSS Support for Neengine</title><content type='html'>&lt;p class="mobile-post"&gt;Yay!!! I just completed validating the RSS generated by Neengine, &lt;br /&gt;therefore Neengine now had RSS Feed support. You'll notice the RSS feed &lt;br /&gt;icon now if you use a real browser (*hint* Firefox).&lt;/p&gt;&lt;p class="mobile-post"&gt;Also, Thelda now properly mirrors to a specified blogger.com url. I'm &lt;br /&gt;thinking of writing an e17 module that will call thelda and periodically &lt;br /&gt;post blogs from a folder to Neengine... hmmmm... I'll see about that &lt;br /&gt;(seems essienitaessien.com is becoming a technology franchise :)&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways, I don't think I should be repeating any RSS Howto here, so I'll &lt;br /&gt;just point to some of the many fine articles available if you want to &lt;br /&gt;know how to do this too:&lt;/p&gt;&lt;p class="mobile-post"&gt;  &amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;br /&gt;href="http://www.peterfreitag.com/item/465.cfm"&amp;gt;http://www.peterfreitag.com&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;  &amp;lt;li&amp;gt;&amp;lt;a &lt;br /&gt;href="http://www.kbcafe.com/rss/rssfeedstate.html"&amp;gt;http://www.kbcafe.com/rss/rssfeedstate.html&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;The first of the links is a quick primer and you can get up and running &lt;br /&gt;in no time. The second one contains some more information that is &lt;br /&gt;interesting to know.&lt;/p&gt;&lt;p class="mobile-post"&gt;Oh, and I quickly learned that you REALLY WANT TO VALIDATE your feed. &lt;br /&gt;You can do this over at &amp;lt;a href="http://feedvalidator.org"&amp;gt;Feed &lt;br /&gt;Validator&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;Ok... with that out of the way, I think I to really work on the comment &lt;br /&gt;spam validation next. This means, I have to implement or borrow a &amp;lt;a &lt;br /&gt;href="http://en.wikipedia.org/wiki/Captcha"&amp;gt;CAPTCHA&amp;lt;/a&amp;gt; implementation. &lt;br /&gt;That's all that's really holding Neengine back from being ready for a &lt;br /&gt;v1.0 I think. Anyways, I'll have to work on that this week.&lt;/p&gt;&lt;p class="mobile-post"&gt;In other news, I'm beginning work on a Forums module. I will probably be &lt;br /&gt;testing it here on essienitaessien.com, but its to be used in client web &lt;br /&gt;communities.&lt;/p&gt;&lt;p class="mobile-post"&gt;Time to go clean-up the soul... aka... reading C code and possibly &lt;br /&gt;refactoring.&lt;/p&gt;&lt;p class="mobile-post"&gt;return;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-115144621765952372?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/115144621765952372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=115144621765952372' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115144621765952372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115144621765952372'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/06/rss-support-for-neengine.html' title='RSS Support for Neengine'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-115101922440703081</id><published>2006-06-23T00:33:00.001+01:00</published><updated>2006-06-23T00:33:44.420+01:00</updated><title type='text'>My kingdom for an SMS Port</title><content type='html'>&lt;p class="mobile-post"&gt;I'm currently awake, putting the finishing touches to the MIDP &lt;br /&gt;application I've been working on since last week. I posted last week &lt;br /&gt;about the rapid speed with which I quickly whipped up a 90% working &lt;br /&gt;demo. At that point, what was left was finally sending collected &lt;br /&gt;information via SMS to a remote application server listening via SMS.&lt;/p&gt;&lt;p class="mobile-post"&gt;To do this, you'd use the J2ME Wireless Messaging API (WMA). The api &lt;br /&gt;seems rather simple and I looked at the code in the WMA Demo example &lt;br /&gt;that comes with the j2me Wireless Tool Kit. I adapted the main sending &lt;br /&gt;functionality there into a function of mine to send text... and that's &lt;br /&gt;where my problems began (I know that in retrospect).&lt;/p&gt;&lt;p class="mobile-post"&gt;Apparently, according to the SMS specification, more than one SMS &lt;br /&gt;application can recieve at the same phone number simoultaneously, just &lt;br /&gt;like TCP/IP sockets. To differentiate the different applications, the &lt;br /&gt;sms url addressing scheme looks just like the usual http scheme we're &lt;br /&gt;all used to, complete with the port numbers, so I can send an SMS to a &lt;br /&gt;phone number at sms://+123456:10 . When the SMS gets to the phone, an &lt;br /&gt;application listening at sms port 10 will recieve this. All well and &lt;br /&gt;good it seems, but not so for me... when I suddenly discovered that SMS &lt;br /&gt;allows for port numbers, I started wondering what would happen if I &lt;br /&gt;don't specify the port number? Or which port the default sms recipient &lt;br /&gt;application listens at? Basically, b/cos I knew that in HTTP, not &lt;br /&gt;specifying a port number means you're specifying port 80, I got worried &lt;br /&gt;and tried to find out. I didn't find this out directly, instead what I &lt;br /&gt;found out was that if your app is LISTENING, and it couldn't careless &lt;br /&gt;about the port the message comes in on, it should be set to listed at &lt;br /&gt;port 0.&lt;/p&gt;&lt;p class="mobile-post"&gt;Armed with this half baked information, I went on to assume that sending &lt;br /&gt;to port 0 then should be okay, if you're not interested in sending to &lt;br /&gt;any particular port! Well, needless to say, my first version didn't &lt;br /&gt;work. I didn't get an exception or anything, the application just &lt;br /&gt;behaved as if it were sending, and quit rapidly, but nothing happened. &lt;br /&gt;On the Sony-Ericsson phone I was initially testing on, the phone kept &lt;br /&gt;asking me if I wanted the application to RECIEVE messages! This was odd, &lt;br /&gt;since i was trying to SEND, anyways, I just thought the phone was being &lt;br /&gt;stupid and that all was ok, and I went on... it didn't work.&lt;/p&gt;&lt;p class="mobile-post"&gt;I decided to try on a Nokia 6600, but when I tried to move the jar over &lt;br /&gt;via bluetooth, it didn't even install. In my "infinite" wisdom ;), I &lt;br /&gt;believed we were having problems with code signing (hilarious huh?). &lt;br /&gt;Anyways, I convinced my boss to start the process of obtaining a &lt;br /&gt;verisign certificate last week, and I went on to relax and wait.&lt;/p&gt;&lt;p class="mobile-post"&gt;By Monday this week, I realized the certificate would probably not be &lt;br /&gt;getting to us b4 Wednesday, when I was due for a second client demo. On &lt;br /&gt;tuesday then, I decided to go stay over with some of my friends (Bugzy, &lt;br /&gt;Nnamo, ROM and co :P) who also write j2me apps on and off. That nite, &lt;br /&gt;Bugzy and Myself first tried to deploy his j2me apps on another 6600 and &lt;br /&gt;they deployed... that was when I realized the Nokia issue was due to the &lt;br /&gt;MIDP version. I had been building for MIDP2.0 all the while, so I &lt;br /&gt;changed my setting to build for MIDP 1.0, CLDC 1.0 with WMA 1.0, and &lt;br /&gt;rebuilt the app, fixing what needed fixing, then I deployed to the Nokia &lt;br /&gt;properly... and boom!!! It worked!!! The sms left the Nokia phone... we &lt;br /&gt;were ecstatic.&lt;/p&gt;&lt;p class="mobile-post"&gt;We then deployed to a sony-ericsson and met disappointment... it didn't &lt;br /&gt;send. After some tinkering, we changed the port number from 0 to 1, just &lt;br /&gt;for the sake of trying something different... and w00t!!! It worked!!! &lt;br /&gt;PHEW! I tidied up the code for the demo and went for the demo yesterday. &lt;br /&gt;It went well BUT there was a problem, the SMS message arrived at the &lt;br /&gt;application with some 8 extra bytes infront of the commands we were &lt;br /&gt;sending! Incidentally, sending the message to another phone, there were &lt;br /&gt;no extraneous bytes... so what could be wrong :(.&lt;/p&gt;&lt;p class="mobile-post"&gt;I was just frustrated and annoyed, but hey... I had to figure it out. I &lt;br /&gt;started scouring materials, and probably read over 10 WMA tutorials &lt;br /&gt;today, that all said the same thing, and who's example code looked &lt;br /&gt;exactly like my current code, though they were all using port 5000. I &lt;br /&gt;decided to use port 5000, but nada... no show. Very depressing. Finally, &lt;br /&gt;my collegue at the office, Lanre suggested we try to setup NowSMS on his &lt;br /&gt;box, since he has a trial version and see if that could help. Grudgingly &lt;br /&gt;I agreed.&lt;/p&gt;&lt;p class="mobile-post"&gt;10 minutes latter, we have NowSMS listening for messages, and I send a &lt;br /&gt;command from the application, and check the incoming messages to NowSMS &lt;br /&gt;and what do I see? THE SMS COMES IN AS A BINARY MESSAGE AND NOT AS A &lt;br /&gt;TEXT MESSAGE!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;That is sooooo suprisingly amazing... but finally I at least know why &lt;br /&gt;the bytes. I try to read thru the specs to see where I may have made a &lt;br /&gt;mistake, and finally, I come to a conclusion that J2ME WMA &lt;br /&gt;implementation has a bug, since I had specified &lt;br /&gt;MessageConnection.TEXT_MESSAGE!!! Finally, I do what I do sometimes when &lt;br /&gt;all logical explanations have flown out the window... I deleted the sms &lt;br /&gt;sending function I had, and proceeded to write another one. I just &lt;br /&gt;cleared the page, and without thinking of my former implementation I &lt;br /&gt;wrote a smaller one, and just tested again... and BOOM!!! IT WORKS!!! I &lt;br /&gt;see the messages into NowSMS come in as TEXT and not as BINARY!!! &lt;br /&gt;Amazing... I look thru my former code and the new one... and the &lt;br /&gt;difference? Nothing... hey.. then why is this worki... uhh... wait... in &lt;br /&gt;my new code, I FORGOT to add port numbers!!!!! You mean...? Yup. The &lt;br /&gt;problem was the port numbers I was adding. I SHOULD NOT have added them &lt;br /&gt;AT ALL. Infact, if I hadn't added them at all, the very first time I &lt;br /&gt;tested my app on the sonyericsson, it would have worked!!!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;Well, needless to say, this was an anti-climax. I was just too relieved &lt;br /&gt;and rushed to do the demo, and everything works well finally. I'm &lt;br /&gt;currently awake putting finishing touches to the look, input &lt;br /&gt;verification, etc.&lt;/p&gt;&lt;p class="mobile-post"&gt;The moral lesson of this long twisted story? Uhhh... I'm not too sure &lt;br /&gt;what that should be, but I guess "when all fails, do something &lt;br /&gt;illogical." is not a bad moral lesson :)&lt;/p&gt;&lt;p class="mobile-post"&gt;Seriously though, I still don't know why I hadn't tried without port &lt;br /&gt;numbers loooooooooooooong ago. Now at least, I know better, and I'm &lt;br /&gt;putting this here incase someone else has the same problem.&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways... njoi&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-115101922440703081?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/115101922440703081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=115101922440703081' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115101922440703081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115101922440703081'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/06/my-kingdom-for-sms-port.html' title='My kingdom for an SMS Port'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-115101918830679848</id><published>2006-06-23T00:33:00.000+01:00</published><updated>2006-06-23T00:33:08.373+01:00</updated><title type='text'>OLPC board in da haus!</title><content type='html'>&lt;p class="mobile-post"&gt;Two days ago Khaled of the OLPC project was at our office. They're in &lt;br /&gt;Nigeria trying to wrap up the arrangement with the Nigerian government. &lt;br /&gt;He came with some friends from Alteq (Alteq is an IT company in Nigeria &lt;br /&gt;operating out of Abuja, who also use Open Source software end-to-end to &lt;br /&gt;provide their solutions - Really cool guys).&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways, Khaled came to drop one of the prototype boards with me, so I &lt;br /&gt;can play around with it. I immidietly transfered one of the older OLPC &lt;br /&gt;version of fedora I had lying about onto a USB drive and tried to boot &lt;br /&gt;off of the board, but I got a GRUB error... meh!!! I'be been busy with &lt;br /&gt;my MIDP app, so no time to tackle it squarely yet. I should be done with &lt;br /&gt;the darn MIDP application tomorrow anyways, so I should be a bit free to &lt;br /&gt;tackle the board.&lt;/p&gt;&lt;p class="mobile-post"&gt;Its very small and cute. I should post images here... as soon as I work &lt;br /&gt;in image or the gallery section of essienitaessien.com.&lt;/p&gt;&lt;p class="mobile-post"&gt;Ahhh well... we had some very interesting conversations and some really &lt;br /&gt;cool ideas flowing back and forth... its always that way when open &lt;br /&gt;source folks meet to talk. You'd think that coming from different parts &lt;br /&gt;of the world, we'd have little to crack wit about... but you'd be sooooo &lt;br /&gt;wrong. Its amazing, but at least for IT/geek types, who spend time on &lt;br /&gt;newsgroups/irc/forums, there has emerged a kind of sub-culture which is &lt;br /&gt;immedietly evident once they meet and start conversing. We really had &lt;br /&gt;fun... its a pity they had to head back to Abuja that day. Khaled should &lt;br /&gt;be swinging by Lagos tommorrow or Saturday probably, so we should be &lt;br /&gt;able to catch some drinks this evening without the pressure of work &lt;br /&gt;deadlines :)&lt;/p&gt;&lt;p class="mobile-post"&gt;I'll err.. try to *hic* keep everybody *hic* posteddddd *hic*&lt;/p&gt;&lt;p class="mobile-post"&gt;:P&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-115101918830679848?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/115101918830679848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=115101918830679848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115101918830679848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115101918830679848'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/06/olpc-board-in-da-haus.html' title='OLPC board in da haus!'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-115010564433711713</id><published>2006-06-12T10:47:00.000+01:00</published><updated>2006-06-12T10:47:24.396+01:00</updated><title type='text'>Neengine Update - Fun With Cheetah Templates</title><content type='html'>&lt;p class="mobile-post"&gt;Finally, Neengine is looking cleaner and more visually palatable. Thanks &lt;br /&gt;to a few hours on Googling on HTML formatting with Cheetah Templates. &lt;br /&gt;I've been mulling moving over to templetor which seems will come by &lt;br /&gt;default in webpy 2.0, but the '4 space' indentation thing actually irks &lt;br /&gt;me. I can understand it in Python as a language, but as a hard &lt;br /&gt;requirement in a templating system, its a bit irritating. The real &lt;br /&gt;problem though is that right now, the errors caused by getting &lt;br /&gt;indentation wrong are not accurately reported, and will probably lead &lt;br /&gt;you to frustratingly look at other things. Since I'm not motivated to &lt;br /&gt;hack that area, I'll just wait for Aaron to fix it, before I evaluate it &lt;br /&gt;again :D&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways, I got to find out that Cheetah can control how special &lt;br /&gt;characters in its place holders are treated, using something called &lt;br /&gt;Output Filtering. With output filtering, you can either specify an &lt;br /&gt;output filter as an argument to the rendering function, or you can do it &lt;br /&gt;in the Template itself, using the #filter directive to cheetah.&lt;/p&gt;&lt;p class="mobile-post"&gt;By default, web.py treats HTML tags specially, hence rendering them &lt;br /&gt;literally, instead of treating them as HTML. But using the two &lt;br /&gt;directives: #filter ReplaceNone, #filter WebSafe, you can turn this &lt;br /&gt;behaviour on and off. With the 'ReplaceNone' filter, you switch to &lt;br /&gt;Cheetah's default behaviour, which is to only treat Python's 'None' as a &lt;br /&gt;special character, replacing it with an empty space, every other thing &lt;br /&gt;is rendered as is, so HTML tags will be rendered as HTML tags. With the &lt;br /&gt;'WebSafe' filter, all characters that that can have special meanings on &lt;br /&gt;the Web are escaped so as to be rendered visually literal.&lt;/p&gt;&lt;p class="mobile-post"&gt;I currently switch between these two when rendering Neengine's HTML &lt;br /&gt;contents. Ofcourse, this is after turning linebreaks into and HTML break &lt;br /&gt;tag. Currently, I still have to add transparent support for embedding &lt;br /&gt;HTML into the posts, so it is escaped intelligently. I'm not even going &lt;br /&gt;to think of how I'll do that now, till probably later in the week (if &lt;br /&gt;i'm in the mood).&lt;/p&gt;&lt;p class="mobile-post"&gt;With that, Neengine is a lot more mature now. The only critical things &lt;br /&gt;left now before I can declare a version 1.0 Neengine is Anti-Spam &lt;br /&gt;validation for comments, so that I can enable back the comments section, &lt;br /&gt;and RSS feed support. Other features like embedding images in posts will &lt;br /&gt;probably come in a major version bump, since this will likely break the &lt;br /&gt;database schema.&lt;/p&gt;&lt;p class="mobile-post"&gt;For now though, I'm off to hack thin client images :)&lt;/p&gt;&lt;p class="mobile-post"&gt;*enjoi*&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-115010564433711713?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/115010564433711713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=115010564433711713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115010564433711713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/115010564433711713'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/06/neengine-update-fun-with-cheetah.html' title='Neengine Update - Fun With Cheetah Templates'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114988471489129018</id><published>2006-06-09T21:25:00.000+01:00</published><updated>2006-06-09T21:25:14.956+01:00</updated><title type='text'>Unix Network Filesystems Suprise</title><content type='html'>&lt;p class="mobile-post"&gt;Ever since I started work on this Thin Client distro, I've been kinda &lt;br /&gt;skeptical about the kind of application performance I would get.&lt;/p&gt;&lt;p class="mobile-post"&gt;I decided to ignore it and work on and cross over the speed barrier when &lt;br /&gt;and if it hits me in the face, and I was really expecting a huge punch. &lt;br /&gt;Coupled with the fact that I was testing the distro out with a USB &lt;br /&gt;bootable version of it, everything was just slow and ungainly.&lt;/p&gt;&lt;p class="mobile-post"&gt;The first time I tried to mount the network filesystem via samba on the &lt;br /&gt;USB based distro, and run OpenOffice off of it, I almost passed out just &lt;br /&gt;from the time I was waiting for openoffice to show me the damn splash &lt;br /&gt;screen!!! Well... that really discouraged me, but hey... I went on to &lt;br /&gt;put stuff together.&lt;/p&gt;&lt;p class="mobile-post"&gt;As at today, I just had to test that baby on an IDE device, so I &lt;br /&gt;hijacked an old harddrive, dd'd my image over to it and proceeded to &lt;br /&gt;boot off of it. The first thing I decided to try was Opera (which our &lt;br /&gt;client really wants), and WOW HOT DAMN!!!! I was shocked. The thing was &lt;br /&gt;blazing fast!!! Just to see how Opera running off of a networked &lt;br /&gt;filesystem performed against a networked Firefox as well, I went ahead &lt;br /&gt;to run Firefox too... and tho it was slower to start up than Opera, I &lt;br /&gt;was also impressed.&lt;/p&gt;&lt;p class="mobile-post"&gt;I went on to run some other applications like QT Designer which I was &lt;br /&gt;expecting to take forever and a half to start... and my o my... It &lt;br /&gt;displayed the splash screen almost immedietly!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;Finally, I went to try OpenOffice and it took like 25 seconds to show me &lt;br /&gt;the splash screen (which is basically about the same time that MS Office &lt;br /&gt;apps take to show me their splash screen on a Windows Box!!!) Well, at &lt;br /&gt;the end of today... I'm really tripped about Network Filesystem &lt;br /&gt;performances. I actually wrote an initscript helper app 'wltcfsd' &lt;br /&gt;(Wazobia Linux Thin Client FileSystem Daemon) to make configuring and &lt;br /&gt;persisting my network filesystem settings on the thin client easier.&lt;/p&gt;&lt;p class="mobile-post"&gt;I can say... I'm really loving thin clients. Infact, i'm loving it so &lt;br /&gt;much I'm thinking of setting up all the translators to run off thin &lt;br /&gt;clients at the office :P&lt;/p&gt;&lt;p class="mobile-post"&gt;Also, I've been thinking of clustering too... check the scenario... Thin &lt;br /&gt;clients, connecting to a huge cluster over a 1000baseT network or &lt;br /&gt;something... WOW!!!! That there is the power of linux.&lt;/p&gt;&lt;p class="mobile-post"&gt;Ahhh... now I have to go become a couch potatoe... I don't think i'm &lt;br /&gt;partying this weekend. I have me 24 on DVD, I have to finally add &lt;br /&gt;intelligent formatting to Neengine, and I have some refatoring patch I &lt;br /&gt;was thinking about for e17 modules gadcon clients.&lt;/p&gt;&lt;p class="mobile-post"&gt;Seems I'll just be coding thruout this weekend.&lt;/p&gt;&lt;p class="mobile-post"&gt;t'sall good&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114988471489129018?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114988471489129018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114988471489129018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114988471489129018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114988471489129018'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/06/unix-network-filesystems-suprise.html' title='Unix Network Filesystems Suprise'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114986247194505625</id><published>2006-06-09T15:14:00.000+01:00</published><updated>2006-06-09T15:14:32.016+01:00</updated><title type='text'>Thin Client Success</title><content type='html'>&lt;p class="mobile-post"&gt;Hurray for persistence!!! I've finally gotten the thin-client distro to &lt;br /&gt;a point we can actually deploy.&lt;/p&gt;&lt;p class="mobile-post"&gt;My main worry (apart from the hardware fiasco i mentioned in a previous &lt;br /&gt;post), was getting the network filesystem right. I was worried about &lt;br /&gt;performance and all those other small things, but eventually, it seems &lt;br /&gt;to a large degree SMBFS mounts solves the immediate need of our first &lt;br /&gt;prospective client.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'm impressed at the speed of stuff like Opera, Skype, etc, running over &lt;br /&gt;the SMBFS mounted partition. Veeeeerrry cool stuff. What I did was &lt;br /&gt;basically to modify kadischi (the Fedora LiveCD generator), to stop &lt;br /&gt;immediately after building the filesystem and after running &lt;br /&gt;post_install_scripts.&lt;/p&gt;&lt;p class="mobile-post"&gt;At this point, I run my own customization scripts, and then make a &lt;br /&gt;squashfs image. I also build my initrd system from an updated ALE &lt;br /&gt;(http://datavibe.net/~essiene/ale) initrd system.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'll have to do a full overhaul on ALE, as its serving me in ways I &lt;br /&gt;didn't even think of previously... another hurray for lazyness by prior &lt;br /&gt;doing!!! :P My initrd image, creates a unionfs of the readonly squashfs &lt;br /&gt;filesystem and some other read-write images which I use to persist &lt;br /&gt;config data, and once I boot, my custom rc.d script runs and mounts my &lt;br /&gt;server drives over SMBFS and I have my full system.&lt;/p&gt;&lt;p class="mobile-post"&gt;As at today, the config file for the mounting is just that... a simple &lt;br /&gt;txt file. I'm sure the clients will want a GUI config program accessible &lt;br /&gt;from the menu... if i'm not passed out over the weekend, I'll do that up &lt;br /&gt;for Monday :)&lt;/p&gt;&lt;p class="mobile-post"&gt;For now, I'm wrapping up everything nicely, and I'll probably drive down &lt;br /&gt;to do a techie demo for the techs over at our first prospective &lt;br /&gt;thin-client client (huh? :P)&lt;/p&gt;&lt;p class="mobile-post"&gt;return;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114986247194505625?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114986247194505625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114986247194505625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114986247194505625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114986247194505625'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/06/thin-client-success.html' title='Thin Client Success'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114959853036636146</id><published>2006-06-06T13:55:00.000+01:00</published><updated>2006-06-06T13:55:30.456+01:00</updated><title type='text'>Wazobia Linux Thin Client Edition - Problems</title><content type='html'>&lt;p class="mobile-post"&gt;For the past couple of weeks, I've been deriving an embedded distro &lt;br /&gt;based on Wazobia Linux which ofcourse is based off of Fedora Core. I've &lt;br /&gt;tested this out on an HP hardware we layed our hands on for testing &lt;br /&gt;purposes and everything has been working fine.&lt;/p&gt;&lt;p class="mobile-post"&gt;Recently though, we had to order a prototype of the hardware we intended &lt;br /&gt;to use and I proceeded to boot off of it and WHAM!! BHAM!!! Problems. &lt;br /&gt;I'd gotten so comfortable on my test platform that I'd forgotten that &lt;br /&gt;the test platform was i586 but the target platform is i386. First, I &lt;br /&gt;rebuilt the kernel... and I get it to boot. Next was rebuilding the &lt;br /&gt;initrd image. That one was a huge battle, since I had some other &lt;br /&gt;problems with tty(s) that I didn't show themselves till I tried booting &lt;br /&gt;off of the target platform.&lt;/p&gt;&lt;p class="mobile-post"&gt;Right now, I realise we have two options. Either we rebuild all the &lt;br /&gt;binaries for the target platform (a lot of drudgery involved :( ) or we &lt;br /&gt;select our test platform (or similar) as the new target platform. &lt;br /&gt;Arggghhhh!!! And i'm supposed to be having a demo later today :(. I &lt;br /&gt;guess I'll just go ahead and demo with the test platform, and worry &lt;br /&gt;about the rest later.&lt;/p&gt;&lt;p class="mobile-post"&gt;Its really annoying though... ahh well... at least I now have a way &lt;br /&gt;forward. *yawn* return;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114959853036636146?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114959853036636146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114959853036636146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114959853036636146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114959853036636146'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/06/wazobia-linux-thin-client-edition.html' title='Wazobia Linux Thin Client Edition - Problems'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114911113504751161</id><published>2006-05-31T22:32:00.000+01:00</published><updated>2006-05-31T22:32:15.130+01:00</updated><title type='text'>Thelda/Neengine</title><content type='html'>&lt;p class="mobile-post"&gt;Two nites ago, I stayed up and worked out the last few show stoppers in my&lt;/p&gt;&lt;p class="mobile-post"&gt;News/Blogging engine (Neengine). Today, Its up for testing on &lt;br /&gt;http://www.essienitaessien.com.&lt;/p&gt;&lt;p class="mobile-post"&gt;I've disabled comments for now, till I work out Comment Spam Avoidance &lt;br /&gt;(CSpA(tm)) :P.&lt;/p&gt;&lt;p class="mobile-post"&gt;Since Neengine is a RESTfull webapp, posting an article is a simple HTTP &lt;br /&gt;post. To facilitate this, I have a python library and client - Thelda.&lt;br /&gt;Currently, there is no authentication in place, and I'm working on &lt;br /&gt;that... but I'll probably put up my todo engine first, dunno... just &lt;br /&gt;depends on what brand of hashish I'm hashing out gaswise when I sit down &lt;br /&gt;to code at nite :P&lt;/p&gt;&lt;p class="mobile-post"&gt;For a bit more on the name Thelda/Neengine... see &lt;br /&gt;http://www.essienitaessien.com/news/53&lt;/p&gt;&lt;p class="mobile-post"&gt;return;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114911113504751161?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114911113504751161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114911113504751161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114911113504751161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114911113504751161'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/05/theldaneengine_31.html' title='Thelda/Neengine'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114893165745463736</id><published>2006-05-29T20:40:00.000+01:00</published><updated>2006-05-29T20:40:57.520+01:00</updated><title type='text'>Holiday Kingdom</title><content type='html'>&lt;p class="mobile-post"&gt;I think Nigeria is a Holiday Kingdom!!! I can't even count how many &lt;br /&gt;Public holidays and non-work days we've had this year alone. Its simply &lt;br /&gt;amazing that we are still earning salaries :)&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways, I had to be a good citizen and join in the celebration of &lt;br /&gt;Democracy Day today, which meant no work (in the 9 - 5 sense of the &lt;br /&gt;word, but hey... we know better right? ;)) I actually came in late from &lt;br /&gt;Abeokuta today, I'd lost my phone some 3 fridays ago, so I had to go &lt;br /&gt;pick up my SIM pack, so I can recover the number from MTN services center.&lt;/p&gt;&lt;p class="mobile-post"&gt;In other news. I've been fine tuning the blog/news engine and I should &lt;br /&gt;have it online sometime this week on http://www.essienitaessien.com. &lt;br /&gt;Once that is done, I'll be posting directly there and probably have the &lt;br /&gt;posts mirrored here for archiving purposes, hey... Google has enough &lt;br /&gt;space... why reinvent the flat tire?&lt;/p&gt;&lt;p class="mobile-post"&gt;In yet other news. I was having some issues last week with a IDE Disk On &lt;br /&gt;Module (DOM) chip, while trying to put my thin client distro onto it. &lt;br /&gt;Well, the nice manufacturers have sent me the instructions I needed and &lt;br /&gt;I'll soon have it splinkin and splankin... :D&lt;/p&gt;&lt;p class="mobile-post"&gt;In yet other news... uhhh... what other news? sheesh!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;Ace... out!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114893165745463736?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114893165745463736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114893165745463736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114893165745463736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114893165745463736'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/05/holiday-kingdom.html' title='Holiday Kingdom'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114860549719009207</id><published>2006-05-26T02:04:00.000+01:00</published><updated>2006-05-26T02:04:57.263+01:00</updated><title type='text'>New Job, New Begginings</title><content type='html'>&lt;p class="mobile-post"&gt;I've always loved Linux since my last year in college when I discovered &lt;br /&gt;it, and though I used it extensively in my personal endeavours, and &lt;br /&gt;aggressively introduced it anywhere I worked (routers, etc), I'd always &lt;br /&gt;dreamed of working in a Linux and Open Source based company where I can &lt;br /&gt;use Open Source technologies that I've come to know and trust.&lt;/p&gt;&lt;p class="mobile-post"&gt;Well, up to late last year, I worked at a .NET shop somewhere in &lt;br /&gt;Abeokuta, Ogun State in Nigeria. While I must say, I did some stuff that &lt;br /&gt;others may call cool, I never really enjoyed myself fully (apart from &lt;br /&gt;those few times when I conived with Dan to introduce some Python into &lt;br /&gt;the works ;) or that other time when I worked with Kevin on a BlackBerry &lt;br /&gt;application talking to a PHP webservice... now those were cool). I still &lt;br /&gt;went along with my personal mantra - Real Hackers Hack Back Home At Nite &lt;br /&gt;At What They Love!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;This year however, all that has changed. January this year, I had an &lt;br /&gt;exciting job offer that I snapped up, not neccessarily b/cos of the pay &lt;br /&gt;(which was indeed higher than my then pay, but not by that much of a &lt;br /&gt;margin), but b/cos of what I'd be doing. To cut the long story short... &lt;br /&gt;I resigned from where I was, and I now work at Leapsoft Limited and I'm &lt;br /&gt;the Lead developer(/engineer?) on Wazobia Linux &lt;br /&gt;(http://www.wazobialinux.com). YAY!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;For me, this has been a PHEW!!! experience. A lot of what I'd done while &lt;br /&gt;playing around on my lappie at nite, I now HAVE to do at work. For &lt;br /&gt;instance, I'd studied Pacman (the package manager that comes with &lt;br /&gt;ArchLinux), and understood how to build a fresh system from that (I even &lt;br /&gt;created a project based on that, targetting small footprint systems (ALE &lt;br /&gt;: http://datavibe.net/~essiene/ale). Currently at Wazobia Linux, I've &lt;br /&gt;HAD to study the rpm and Anaconda system and I've built something akin &lt;br /&gt;to what ALE did, that we now use to automate our distro building &lt;br /&gt;process. Cutting Long to short - its damn exciting!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;The other thing that keeps triping me, is that finally, i'm having to &lt;br /&gt;build solutions on Open Source technologies for a Living (and I'm &lt;br /&gt;getting paid to do it). All the *l337* stuff I used to play around with, &lt;br /&gt;I now have to do them on a deadline, and I've finding out ways to master &lt;br /&gt;my tools better, and work even faster.&lt;/p&gt;&lt;p class="mobile-post"&gt;This brings me to my main gripe about Windows... I don't  hate &lt;br /&gt;Windows/M$ technologies... NO!!! What I hate is that they're not &lt;br /&gt;mallaeble (well, they're mallaeble to an extent, but this don't come &lt;br /&gt;cheap!). Alot of the information and resources you need to turn your m$ &lt;br /&gt;tool into what you want, and not neccessarily what the creators foresaw, &lt;br /&gt;is almost too steep to go after seriously. Infact, its soo steep that a &lt;br /&gt;lot of very inquisitive ppl just dumb themselves down and say "Is it &lt;br /&gt;worth the struggle?" after trying for a while.&lt;/p&gt;&lt;p class="mobile-post"&gt;I've had friends who back in second year at college, we used to all play &lt;br /&gt;around with computers, thinking how cool it would be to do this, and &lt;br /&gt;that and the other, if we only found out how, and a lot of them stopped &lt;br /&gt;having fun with their systems a long time ago. I'm not refering to &lt;br /&gt;gaming fun, or watching movies :) that still happens, I'm talking of the &lt;br /&gt;raw fun you have when you've just pulled off one *crazy* hack on your &lt;br /&gt;system. On Linux and other opensource related technologies/platforms, &lt;br /&gt;inquisitive guys like me basically have information overload. With or &lt;br /&gt;without money to buy good books (like we used to be back in school), its &lt;br /&gt;possible to scrounge round, raise a buck, go to a cyber cafe and &lt;br /&gt;download from tldp.org, print and go back to your system. That was the &lt;br /&gt;joy of discovering Linux for me. I COULD RESUME PLAY. Today, I'm lucky &lt;br /&gt;to be working on this kind of project day in day out.&lt;/p&gt;&lt;p class="mobile-post"&gt;Ofcourse, the software industry is in a serious state of flux now. &lt;br /&gt;Microsoft announcing 3 betas, Google growing bigger, Linux systems no &lt;br /&gt;more just toys, the web undergoing the rennaissance of immense &lt;br /&gt;proportions, its going to be interesting to see how all these play out &lt;br /&gt;in a couple of years, but i personally believe OpenSource will keep &lt;br /&gt;getting stronger overtime. I don't think its 100m sprint, I think its &lt;br /&gt;more like a Marathon or a Cross Country race.&lt;/p&gt;&lt;p class="mobile-post"&gt;return;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114860549719009207?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114860549719009207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114860549719009207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114860549719009207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114860549719009207'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/05/new-job-new-begginings.html' title='New Job, New Begginings'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114857013281196027</id><published>2006-05-25T16:15:00.000+01:00</published><updated>2006-05-25T16:15:32.916+01:00</updated><title type='text'>Happy Birthday Me (What? A website?)</title><content type='html'>&lt;p class="mobile-post"&gt;Yay!!! I'm one year older today. And I have just the perfect birthday &lt;br /&gt;present for me - A new website at: http://www.essienitaessien.com (Stan &lt;br /&gt;says the url is pretty user unfriendly... I say meh!!! :P)&lt;/p&gt;&lt;p class="mobile-post"&gt;njoi.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114857013281196027?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114857013281196027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114857013281196027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114857013281196027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114857013281196027'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/05/happy-birthday-me-what-website.html' title='Happy Birthday Me (What? A website?)'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114843953641918253</id><published>2006-05-24T03:58:00.000+01:00</published><updated>2006-05-24T03:58:56.506+01:00</updated><title type='text'>One more year approaching</title><content type='html'>&lt;p class="mobile-post"&gt;Thursday 25th Of May is my birthday!&lt;/p&gt;&lt;p class="mobile-post"&gt;Hmmm... just wait a minute. I'm adding yet another year to the chronos &lt;br /&gt;matrix of my life... ah well... I think this one year has been quite good.&lt;br /&gt;In retrospect, I've gone way deeper into programming than I expected I &lt;br /&gt;would, yet in some ways, I didn't go as deep as I really wanted to.&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways, I'll just think more about this and deliver this with the &lt;br /&gt;birthday present I've _built_ for myself. I'll  unveil this on Thursday &lt;br /&gt;morning, with&lt;br /&gt;all the untold gist and hush-hush crap i've been with-holding all these &lt;br /&gt;months.&lt;/p&gt;&lt;p class="mobile-post"&gt;Catchya on thursday&lt;/p&gt;&lt;p class="mobile-post"&gt;(hmm... does this feel like an Apple or Google Pre-press release? :P)&lt;/p&gt;&lt;p class="mobile-post"&gt;Ace out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114843953641918253?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114843953641918253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114843953641918253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114843953641918253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114843953641918253'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/05/one-more-year-approaching.html' title='One more year approaching'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-114442076109256384</id><published>2006-04-07T15:39:00.000+01:00</published><updated>2006-04-07T15:39:21.173+01:00</updated><title type='text'>Breaking Radio Silence</title><content type='html'>&lt;p class="mobile-post"&gt;I have been on self imposed radio silence since the beginning of this year.&lt;/p&gt;&lt;p class="mobile-post"&gt;I have been becoming ONE with the NULL VOID!&lt;/p&gt;&lt;p class="mobile-post"&gt;Right now I have gained oneship with the null as you will see in &lt;br /&gt;subsequent posts, but perfect oneness with the null void has eluded &lt;br /&gt;me... and i think its because I was striving to cast myself into a ready &lt;br /&gt;made void pointer. Instead, I shall now cease to strive...&lt;/p&gt;&lt;p class="mobile-post"&gt;I feel the voidness at the periphery... it is but like the fluttery &lt;br /&gt;kisses of a See Nymph ever so near, yet never there.&lt;/p&gt;&lt;p class="mobile-post"&gt;I cease to strive and instead I choose to break radio silence.&lt;/p&gt;&lt;p class="mobile-post"&gt;may you become one with the null void.&lt;/p&gt;&lt;p class="mobile-post"&gt;return;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-114442076109256384?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/114442076109256384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=114442076109256384' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114442076109256384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/114442076109256384'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2006/04/breaking-radio-silence.html' title='Breaking Radio Silence'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113447712050558677</id><published>2005-12-13T13:32:00.000+01:00</published><updated>2005-12-13T13:32:00.536+01:00</updated><title type='text'>Fun with SQLite - Embedded never so easy</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Over the weekend, I had to help a friend out with a little assignment (again :-)), to write an address book in C. Anyways, I opted to use SQLite, my reasons being (in no particular order):&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ol style='margin-top:0in' start=1 type=1&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;I&amp;#8217;d heard how simple it      was&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;I&amp;#8217;d never tried it and      was itching&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;I&amp;#8217;d written a production      app with mysql embedded C library about 2 yrs ago, and was curious to see      how SQLite felt like&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;I just needed an excuse to try      SQLite out, and the C API at that&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;My prognosis in a nutshell: AWESOME!!!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I basically was writing C SQLite code 5 minutes after reading their &amp;#8220;Getting started in 5 minutes guide&amp;#8221;, and though I was on the irc channel (#sqlite on freenode), I didn&amp;#8217;t ask any questions&amp;#8230; it was all clear and straight forward &amp;#8211; except that part when my AUTOINCREMENT didn&amp;#8217;t work on a field declared as *&lt;b&gt;&lt;span style='font-weight:bold'&gt;int&lt;/span&gt;&lt;/b&gt;*, till I realized it was supposed to be *&lt;b&gt;&lt;span style='font-weight:bold'&gt;integer&lt;/span&gt;&lt;/b&gt;* - meehhhh!!!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways, the tipping point for me was how it deals with rows returned in a query.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Typedef for a function pointer sqlite3_callback, that looks like:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;int func(void * data, int numcols, char** colvals, char** colnames);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Basically, if you pass this function pointer to sqlite3_exec when executing a query that returns rows, this call back will be called for each row returned! This is very cool really. It&amp;#8217;s a massive relief from the pointer gymnastics I had to do with the mysql4 C api, to get at my returned rows back then.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways, I don&amp;#8217;t know if this exists yet, but with all the data structure work I&amp;#8217;ve been doing recently, I have been thinking of a patch to SQLite that would instead take a call back that looks like this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;int func(void * data, int numrows, sqlite_list);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;the sqlite_list, would actually be a linked list of hash tables. Each node in the list will be a returned row, and each node, would actually&amp;nbsp; be a hashtable of the columns. This would be even EASIER to program against.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Currently, I&amp;#8217;m not even going to deceive myself and say I&amp;#8217;m going to write that patch&amp;#8230; I&amp;#8217;m not even thinking about it in any of my main processing threads&amp;#8230; instead its been swapped out into some fscked up area of my mind&amp;#8230; where it will stay until such a time as I have a *&lt;b&gt;&lt;span style='font-weight:bold'&gt;voila&lt;/span&gt;&lt;/b&gt;* experience with the SQLite source code (which I intend to read anyways&amp;#8230; but that intention is stored in that same fscked up area of my mind&amp;#8230; so you get the real picture of things)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways&amp;#8230; I did finish the address book rather nicely, and it was fun to call over one of my C hating colleague to see how it worked. Ope just laffed me to smitherins :-)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;The fun part of the project was modeling the entities in the application. We have this Object Persistence Framework we use in our C# apps in the office, and I basically built something close to that in C, to do the project&amp;#8230; and it again reaffirmed my belief that learning various programming paradigms leaves you a MUCH better programmer. Taking a look at the Address Book source code, looks SOOOOO much like OOP code written in any modern language&amp;#8230; the only difference will be that no member access operator is being used. Infact, it looked like doing Python without the namespaces :)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Conclusion&amp;#8230; SQLite is cool, so am I :-)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien out.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113447712050558677?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113447712050558677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113447712050558677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113447712050558677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113447712050558677'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/fun-with-sqlite-embedded-never-so-easy.html' title='Fun with SQLite - Embedded never so easy'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113447629476166223</id><published>2005-12-13T13:18:00.000+01:00</published><updated>2005-12-13T13:18:14.806+01:00</updated><title type='text'>yirae: lists complete</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Yesternite, I was able to wrap up the episode on Singly and Doubly linked lists for libyirae. I&amp;#8217;ll upload the code later in the evening.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Some cool things happened as usual during the coding process, that allowed me to refactor out more Node manipulations, like Make_Next_Node, Make_First_Node (this for doubly linked lists, as singly linked lists don&amp;#8217;t have any differentiating features for the *&lt;b&gt;&lt;span style='font-weight:bold'&gt;first&lt;/span&gt;&lt;/b&gt;* node), etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Most important of all, was that implementing the Doubly Linked List class ydList.c allowed me to see my algorithms more clearly, and had me going back to ysList (the singly linked class), to clean stuff up.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Right now, I have a number of todo&amp;#8217;s but my next target Data Structure is a Hashtable.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Just before I get there though, I have to refactor the core operations of the linked lists class, I have a lot of operations, push, pop, insert, insertsorted, etc, and I think its not necessary. I want to settle on some core ops that can be used to perform the rest. For instance. Insert(), should be able to be used to implement both Append() and Pop(), even though that&amp;#8217;s not what I&amp;#8217;m doing currently. But before I move on the larger issue of Hashtables I have to clean up that (and probably, since it will be childs play, implement a Stack and Queue class).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;After cleaning up the operations, I want to make the lists, generic. Right now, the DATA member of the lists are just ints. I want to make these into void * so I can use the lists as a generic carrier for _&lt;i&gt;&lt;span style='font-style:italic'&gt;any&lt;/span&gt;&lt;/i&gt;_ type of data class.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Also, related to the immediate above point, I&amp;#8217;m not sure how to structure the Hashtable. I have two options&amp;#8230;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ol style='margin-top:0in' start=1 type=1&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;struct yHashTable {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;void *data;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;char *key;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;struct yHashTable *next;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;Or&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ol style='margin-top:0in' start=2 type=1&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;struct yhtData {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;void *data;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;char *key;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.75in'&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Struct yHashTable {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct yhtData *content;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct yHashTable *next;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;There seem to be advantages for each implementation. In 1 above, I have simplicity of representation and initial implementation, but I will have to rewrite most of my linked list code to support stuff like sorting by key, etc. in 2 above, I can pass in a different function pointer each time I need to sort, one for sorting by data, one for sorting by keys, and I won&amp;#8217;t need to modify my linked list code much when inheriting to create the HashTable. I tend to favour method 2 above though, but I&amp;#8217;ve not made up my mind yet which way to go. I&amp;#8217;ll finish that operations clean up first, and then when I get to that bridge, I&amp;#8217;ll just have to cross it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;It appears I&amp;#8217;m still on target for my end of yr goal for Data Structures&amp;#8230; the one I&amp;#8217;m apprehensive about is Binary Trees. I don&amp;#8217;t know *&lt;b&gt;&lt;span style='font-weight:bold'&gt;anything&lt;/span&gt;&lt;/b&gt;* about them apart from the fact that they&amp;#8217;re pretty tall, and come in two flavours (b i n a r y&amp;nbsp;&amp;nbsp; t r e e s&amp;#8230;. get? :;) ) I guess that pretty much sums up my understanding of those :D&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways&amp;#8230; back to other things now&amp;#8230; I&amp;#8217;ll post when yirae-0.3 is uploaded.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien&amp;#8230; out.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113447629476166223?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113447629476166223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113447629476166223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113447629476166223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113447629476166223'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/yirae-lists-complete.html' title='yirae: lists complete'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113394949248705915</id><published>2005-12-07T10:58:00.000+01:00</published><updated>2005-12-07T10:58:12.493+01:00</updated><title type='text'>libyirae: API updated to clearly differentiate a list from a node</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I put my words to action yesternite, and updated all the functions to properly differentiate b/w a Node and the List itself. The NODE objects are used internally in the List implementation, and keep things clean, for the user of the library, all you&amp;#8217;ll ever need to do, is to use the LIST and its functions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;It was actually fun to do. The fun part was, change all the declarations, recompile, and run the test, see the SegFaults, and start making them all go away one at a time :-), it doesn&amp;#8217;t get better than that&amp;#8230; ohhh&amp;#8230; it just did&amp;#8230; VALGRIND!!! Yup, I also had to plug mem leaks and once again we&amp;#8217;re VALGRIND certified to boot!!! :P. I&amp;#8217;ve really learnt a tremendous lot doing all this.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;There is a decision I&amp;#8217;m dilly-dallying on&amp;#8230; Currently, I have the NODE functions and LIST functions in one file still&amp;#8230;. I have to do basic File Content refactoring obviously, the question is now&amp;#8230; how closely do I couple the two? I&amp;#8217;m trying to think ahead to when I start inheriting (tonite to be precise), close coupling will entail doing something like:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ol style='margin-top:0in' start=1 type=1&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Pull the list functions out of      ysnode.c into yslist.c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Define the move the struct      _ysNode definition into ysnode.h&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;beable to to call      struct-&amp;gt;next, etc from yslist.c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;loose coupling will entail:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ol style='margin-top:0in' start=1 type=1&gt;  &lt;li class=MsoNormal style='mso-list:l1 level1 lfo2'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Pull the list functions out of      ysnode.c into yslist.c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l1 level1 lfo2'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;leave the struct _ysNode      definition in ysnode.c (hence hiding it from yslist.c)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l1 level1 lfo2'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;defining accessor functions      ysnGet_Next(), ysnSet_Next(), ysnGet_Data(), ysnSet_Data() for the NODE      objects&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l1 level1 lfo2'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;using these accessors from      yslist.c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Why am I dilly-dallying? Theoritically, loose coupling is the way to go, but it just seems like an unnecessary hoop deep in my gut&amp;#8230; hmmm&amp;#8230; especially since I&amp;#8217;m not even sure how the inheritance is going to work yet till I start coding. Anyway, I think I just made up my mind. I&amp;#8217;ll stick with loose coupling, and be ready to change my mind if things start getting unnecessarily complex. Yup&amp;#8230; that&amp;#8217;s what I&amp;#8217;ll do. That means, by tonite, I should start on the doubly linked lists implementation, then will release 0.3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I&amp;#8217;m looking forward to close of work already :D (don&amp;#8217;t tell &lt;a href="http://www.inthrill.com/weblogs/bunmi"&gt;Bunmi&lt;/a&gt; I said that ;) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien out.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113394949248705915?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113394949248705915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113394949248705915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113394949248705915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113394949248705915'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/libyirae-api-updated-to-clearly.html' title='libyirae: API updated to clearly differentiate a list from a node'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113394878725080327</id><published>2005-12-07T10:46:00.000+01:00</published><updated>2005-12-07T10:46:27.406+01:00</updated><title type='text'>Directory Services for the rest of us.</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;If you've every worked with M$ Active Directory, you'll appreciate the need for directory services to be easy to deploy. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I've worked extensively with Active Directory, and maybe I was just being lazy, but I could never actually get myself gingered up to configure OpenLDAP.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I also kept hearing good things about Novell eDirectory, but heck, I can't lay my hands on it to try it (but I hear its pretty tite).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Last year, RedHat bought AOL's Directory Server, and planned to OpenSource it... I heard that news, and just put it at the back of my mind as probably one of the most important Linux announcements (for the back office), for last year. We didn't hear from them again till earlier this year, when they made a first release.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;That release was the basic LDAP engine without the admin console and a few other extras. The reason they gave was there are still parts of the code that are not able to be opensourced at that time, and they were still working to make it good to go.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyway, this morning, I saw this via an article on lxer.com: http://directory.fedora.redhat.com/wiki/FDS10Announcement&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I'm yet to play with it, but this is a version 1.0 release, with everything feature complete for a first milestone. Its a great acheivement for RedHat, and the OpenSource community in general. I want to thank the guys at RedHat for being a great OpenSource company (even though i still think Fedora is bloated ;) - I mean, everyone is entitled to _MY_ own opinion right? :P). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyway, getting serious, I'm going to definitely try this baby out. Then I'll be able to know if the wait was worth it (in my guts, i feel it was).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Once more... thank you RedHat.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien out.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113394878725080327?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113394878725080327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113394878725080327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113394878725080327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113394878725080327'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/directory-services-for-rest-of-us.html' title='Directory Services for the rest of us.'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113387519226345223</id><published>2005-12-06T14:19:00.000+01:00</published><updated>2005-12-06T14:19:52.273+01:00</updated><title type='text'>Listening To Code: The importance of proper nomenclature</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Is that even the spelling of Nomenclature up there? ;;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;[hmm&amp;#8230; it apparently is correct]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Yesterday nite, as I implemented Pop() for yirae singly linked lists, I realized that my return value couldn&amp;#8217;t be a ysNode as all my other functions till then had been doing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Basically, I&amp;#8217;d been doing stuff like:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;ysNode n = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;n = ysNode(n, 5);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;As you can see, I pass in the node (which is actually the head node of the linked list), and I return the new head of the list. This works well, until I get to POP(), which needs to pull off the first item on the list, and traditionally return it, but unlink it from the list. I couldn&amp;#8217;t do:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;n = ysPop(n);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Doing that will loose the data I&amp;#8217;m popping. Eventually, I had to do this instead:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;int data = ysPop(&amp;amp;n);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;And my declaration for ysPop is:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;int ysPop(ysNode*);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I notice that this is very neat and efficient, and I don&amp;#8217;t like my functions having conflicting calling semantics, so I start to implement all my other functions to match this semantic, since I can&amp;#8217;t make Pop() match their semantics, so Push() becomes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;ysNode n = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;ysPush(&amp;amp;n, 5);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;succinct and powerfull!!!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;There is just one problem&amp;#8230; now, I have to remember to append the ampersand infront of all my nodes that I&amp;#8217;m passing to the various functions&amp;#8230; like so: &amp;#8216;&amp;amp;n&amp;#8217; instead of just &amp;#8216;n&amp;#8217;, since I&amp;#8217;m now passing a pointer to a ysNode. Ofcourse, I&amp;#8217;m apt to forget that, and infact, many of my &amp;#8216;make&amp;#8217; invocations remind me of that with an error/warning. Thinking of how to solve this, I begin to think of creating a typedef for ysNode*.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Before I continue, a bit of background on ysNode.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;The definitions if you look in ysnode.c:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;struct _ysNode {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int data;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct _ysNode* next;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;typedef _ysNode* ysNode;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Now, you can see what my basic Node element struct looks like. Ofcourse, I could have been using struct _ysNode throughout my functions, but my code will quickly become ungainly, so according to SAGE advice, I typedef struct _ysNode* as ysNode, and I&amp;#8217;m using it throughout. Now, I realize I also have to have a ysNode*, which is essentially a struct ysNode**, I sat back and started thinking&amp;#8230; hmm&amp;#8230;. Have I made a mistake somewhere? Why do I find myself having to define ysNode*?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;BAAMM!!! It struck me.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;A linked list is a collection of items, each item having a reference (or knowing how) to find the next item. Each of these items is a NODE, but the NODES are a distinct ENTITY from the LIST itself. From the way my code is starting to look, there seems to be a LinkedList type struggling to emerge, infact, its shadow is already present in &amp;amp;n (which is a ysNode*), but I hadn&amp;#8217;t recognized it yet. Immediately I realized this, I also realized that my public functions were doing the wrong things, namely: exposing nodes to the user of the library.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;What do I mean. From what I just said previously, it would seem obvious that a NODE is contained in a LIST, but that could as well as just be an IMPLEMENTATION detail&amp;#8230; I could by stroke of Genius (AKA Insanity ;) ), also come up with an implementation of Lists that doesn&amp;#8217;t use NODES :), I just wonder what would be used, but anyway, the point is that the design is porous as it is exposing the NODES to all eyes. My *&lt;b&gt;&lt;span style='font-weight:bold'&gt;public&lt;/span&gt;&lt;/b&gt;* functions then, SHOULD operate on Lists, and not Nodes. The question is then, what is a list, and what is a node?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;At the Domain level, a LIST is a collection of Nodes, but at the programmatic level, a LIST is just a pointer to the HEAD of a node&amp;#8230; does this sound familiar? Try this, an Array is C, is just a Pointer to the first element of an Array!!! Yup, that a nice zinger&amp;#8230; once I realized this, a lot of things just fell into place.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;The title of this article, is taken from the fact that I WOULD have missed this, if I wasn&amp;#8217;t paying attention to what the code was trying to say to me. And the code was able to talk to me clearer because I gave it a good voice to start with &amp;#8211; THE NAMES OF THE VARIABLES N STRUCTURES. Its very important to properly name your objects to as accurately as possible model the problem domain you&amp;#8217;re trying to solve. If you do this, the code gains a voice, so to speak, and you can read it back and learn from it. Just imagine if I&amp;#8217;d stuck to my earlier plan of calling ysNode, yLinkedList. I would NEVER have had the paradigm shift I had in the way I did. Infact, immediately after naming it yLinkedList, I just thought&amp;#8230; no&amp;#8230; this doesn&amp;#8217;t feel right, all I&amp;#8217;m passing around are nodes, so I renamed them, and its come back to pay me good for that decision.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Its like this, I start out implementing functionality, with a particular rule of thumbs, along the way, I happen to implement some stuff that I don&amp;#8217;t exactly plan for from the scratch (b/cos I&amp;#8217;m paying attention to refactorings and good coding techniques), then a pattern emerges which I didn&amp;#8217;t set out to create. I recognize the pattern and want to optimize it or at least refactor it properly, and in so doing I set out to understand the pattern. The understanding of this pattern, then teaches me something much more than what I knew at the onset of the project. This is my code beginning to talk to me. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;This may all sound poetic and stuff, but in practice, these things happen all the time&amp;#8230; your domain problem becomes clearer as you set out to define the problem in terms of a programmable solution. This is where bottoms-up coding is strongest&amp;#8230; as you build small units, you can recognize the patterns that are forming and seek to understand them. If you follow Tops-Down coding, chances are that most of what you&amp;#8217;re doing, you&amp;#8217;ve already thought of it outside the advantage of being embedded in the problem&amp;#8217;s solution, therefore, you&amp;#8217;ll miss the tiny details, which are likely to make the solution *&lt;b&gt;&lt;span style='font-weight:bold'&gt;elegant&lt;/span&gt;&lt;/b&gt;*. Ofcourse you may argue that elegance in software is an unreal panacea, or a Holy Grail of sorts, and can&amp;#8217;t be achieved in production scenarios, but only in small one on one projects&amp;#8230; my answer to that is that, in a proper dev house, the *&lt;b&gt;&lt;span style='font-weight:bold'&gt;production software&lt;/span&gt;&lt;/b&gt;* is just a combination of many *&lt;b&gt;&lt;span style='font-weight:bold'&gt;one on one&lt;/span&gt;&lt;/b&gt;* modules &amp;#8211; any project manager will agree with that description. The question then is how to make the coders benefit from the fact that they still end up working on their individual one-on-one projects.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Well&amp;#8230; I&amp;#8217;m still learning, and still growing, and by Jove&amp;#8230; Data Structures seems to be a wonderfull way to end 2005 :-)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113387519226345223?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113387519226345223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113387519226345223' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113387519226345223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113387519226345223'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/listening-to-code-importance-of-proper.html' title='Listening To Code: The importance of proper nomenclature'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113387327130781746</id><published>2005-12-06T13:47:00.000+01:00</published><updated>2005-12-06T13:47:51.346+01:00</updated><title type='text'>yirae: uploaded</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;The code to yirae is uploaded: &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://datavibe.net/~essiene/downloads/yirae-0.2.tar.gz"&gt;http://datavibe.net/~essiene/downloads/yirae-0.2.tar.gz&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113387327130781746?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113387327130781746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113387327130781746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113387327130781746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113387327130781746'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/yirae-uploaded.html' title='yirae: uploaded'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113386802503489867</id><published>2005-12-06T12:19:00.000+01:00</published><updated>2005-12-06T12:20:25.050+01:00</updated><title type='text'>libyirae: simple sorting of singly linked lists</title><content type='html'>And so the story goes…&lt;br /&gt;&lt;br /&gt;I have finally done it yippee!!! :-) Source will be available at http://datavibe.net/~essiene/downloads/yirae-0.2-tar.gz before the end of the day.&lt;br /&gt;&lt;br /&gt; (needless to say, i built this on a GNU system, so gcc in any of its incarnations will work [cygwin, ming, etc]&lt;br /&gt;&lt;br /&gt;After my last ungainly experience with those-pesky-lists™, I had to go follow most of the links I had bookmarked to see how guys have been tackling sorting of singly linked lists. Everyone seemed to agree that they were harder than sorting doubly linked lists (at least I have to believe that, so I don’t feel dumber than I’m feeling presently :)). Anyways, there are a number of approaches, but I’ll try to explain the one I like best.&lt;br /&gt;&lt;br /&gt;First imagine you have a list like:&lt;br /&gt;&lt;br /&gt;1-&gt;3-&gt;2&lt;br /&gt;&lt;br /&gt;When traversing this list, and you come across 2, you just have to swap it with 3 and you’re done. Imagine instead that you have:&lt;br /&gt;&lt;br /&gt;1-&gt;3-&gt;2-&gt;5-&gt;1-&gt;7&lt;br /&gt;&lt;br /&gt;A single pass would go something like this:&lt;br /&gt;&lt;br /&gt;You don’t touch 1, then you swap 3 and 2, you then swap 5 and 1 and you don’t touch 7… the result looks like:&lt;br /&gt;&lt;br /&gt;1-&gt;2-&gt;3-&gt;1-&gt;5-&gt;7&lt;br /&gt;&lt;br /&gt;Tada… its still not sorted, you’ll have to pass thru this list at least two more times, before you get the desired:&lt;br /&gt;&lt;br /&gt;1-&gt;1-&gt;2-&gt;3-&gt;5-&gt;7&lt;br /&gt;&lt;br /&gt;This raises a number of issues… 1st you have to repeat this process basically till you can verify that all your elements are in order… for a long list, this is just not acceptable. Anyways… this was the most obvious approach, and its ridden with a number of issues.&lt;br /&gt;&lt;br /&gt;The other not so obvious approach is this. First, imagine that you have an InsertSorted() function that will insert an element such as to keep its place. It doesn’t sort an existing list, but it will not add to the confusion if its not sorted. So if I have:&lt;br /&gt;&lt;br /&gt;1-&gt;5-&gt;7-&gt;3&lt;br /&gt;&lt;br /&gt;And I call InsertSorted(2) on this list, it will result in:&lt;br /&gt;&lt;br /&gt;1-&gt;2-&gt;5-&gt;7-&gt;3&lt;br /&gt;&lt;br /&gt;Once I have a method like that, I can proceed to one of two implementations for the sorting:&lt;br /&gt;&lt;br /&gt;Method 1 – the least brain tickling path&lt;br /&gt;=============================&lt;br /&gt;1. iterate thru the list&lt;br /&gt;2. POP each node you meet, OFF the list (remember POP removes a node)&lt;br /&gt;3. InsertSorted each node you POP into a new list&lt;br /&gt;4. return the new list :)&lt;br /&gt;&lt;br /&gt;Nice and easy, this is the current implementation I have. Though, I’ve been wondering about the cost of the new list in the whole process. Also, my current implementation has another Node memory overhead (I’ve explained that one in the code). There is a second method, that at first glance, seems more efficient, though after thinking thru it, the efficiency can just to tied down to the process of creating a new linked list that the first method incurs, if that cost can be shown to be zero, then there is basically no loss or gain as far as I can think, anyway, the second method goes thus:&lt;br /&gt;&lt;br /&gt;Method 2 – using only one list&lt;br /&gt;============================&lt;br /&gt;1. iterate thru the list&lt;br /&gt;2. if you find any node out of sorted order, Unlink the Node (unlink doesn’t destroy the Node, just removes it from the list and returns the Node to you)&lt;br /&gt;3. InsertSorted the node back into the list.&lt;br /&gt;4. return the list&lt;br /&gt;&lt;br /&gt;This method seems to be more efficient than the method 1, but I’ve not done any testing/profiling so I don’t know for sure. After thinking for a while, there is really no memory usage difference, as in the first case, when the new list grows as the old list decreases. Also, the creation of a new list isn’t a costly operation at all by my implementation.  &lt;br /&gt;&lt;br /&gt;If you look thru the code, you’ll see that my public functions deal with data not nodes, so I POP data, and I Insert data hence I always have to create an underlying Node object to help me out… I’m thinking of having utility versions of all these operations that pop Nodes and Insert Nodes, so I can reuse the memory without free’ing one only to allocate it later…&lt;br /&gt;&lt;br /&gt;Anyways, the code is free to look at. I hope it helps some other person, especially if (s)he’s doing an assignment ;)&lt;br /&gt;&lt;br /&gt;Oh finally, the thing that makes me happy is that ynode_test.c is totally valgrind approved :D, I hear LinkedLists are always a point where guys leak memory, but I guessed I closed mine up well… maybe not NewsWorthy™, but definitely something for me to be proud about.&lt;br /&gt;&lt;br /&gt;Essien out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113386802503489867?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113386802503489867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113386802503489867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113386802503489867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113386802503489867'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/libyirae-simple-sorting-of-singly.html' title='libyirae: simple sorting of singly linked lists'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113379272267542004</id><published>2005-12-05T15:25:00.000+01:00</published><updated>2005-12-05T15:46:28.403+01:00</updated><title type='text'>Singly Linked List Class - libyirae genesis</title><content type='html'>/*-------------------ABOUT--------------------*/&lt;br /&gt;A collection of data structures, implemented for the sake of learning. Yirae, is a contamination of the Efik work Y're, which means to link or join. I chose the name b/cos the first structures implemented for yirae was a singly linked list. The library is called libyirae :)&lt;br /&gt;&lt;br /&gt;*---------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;/*-----------------Makefile--------------------*/&lt;br /&gt;all: libyirae.a  test&lt;br /&gt;            @echo "All Done"&lt;br /&gt;&lt;br /&gt;test: ysnode_test&lt;br /&gt;            @echo "All Test Done"&lt;br /&gt;&lt;br /&gt;ysnode_test: ysnode_test.c libyirae.a&lt;br /&gt;            gcc -o ysnode_test ysnode_test.c -I. -L. -lyirae&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;libyirae.a: ysnode.c ysnode.h&lt;br /&gt;            gcc -c ysnode.c&lt;br /&gt;            ar -rcs libyirae.a ysnode.o&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;            rm *.o&lt;br /&gt;            rm *.a&lt;br /&gt;&lt;br /&gt;/*---------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;/*-------------------ynode.h-------------------*/&lt;br /&gt;#ifndef YNODE_H&lt;br /&gt;#define YNODE_H&lt;br /&gt;&lt;br /&gt;typedef struct _ysNode *ysNode;&lt;br /&gt;&lt;br /&gt;ysNode ysCreate(void);&lt;br /&gt;void ysFree(ysNode);&lt;br /&gt;&lt;br /&gt;ysNode ysPush(ysNode, int);&lt;br /&gt;ysNode ysRemove(ysNode, int);&lt;br /&gt;&lt;br /&gt;void ysSwapNodes(ysNode*, ysNode*);&lt;br /&gt;ysNode ysSwap12(ysNode);&lt;br /&gt;&lt;br /&gt;int ysLength(ysNode);&lt;br /&gt;void ysPrint(const ysNode);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;/*---------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*----------------ysnode.c---------------------*/&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;struct _ysNode {&lt;br /&gt;            int data;&lt;br /&gt;            struct _ysNode *next;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;typedef struct _ysNode *ysNode;&lt;br /&gt;&lt;br /&gt;ysNode ysCreate()&lt;br /&gt;{&lt;br /&gt;            ysNode head = malloc(sizeof(struct _ysNode));&lt;br /&gt;&lt;br /&gt;            if(head) {&lt;br /&gt;                        head-&gt;data = 0;&lt;br /&gt;                        head-&gt;next = NULL;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return head;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ysFree(ysNode head)&lt;br /&gt;{&lt;br /&gt;            ysNode current = head;&lt;br /&gt;            ysNode next;&lt;br /&gt;&lt;br /&gt;            while(current) {&lt;br /&gt;                        next = current-&gt;next;&lt;br /&gt;                        free(current);&lt;br /&gt;                        current = next;&lt;br /&gt;            }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ysNode ysFind_Last(ysNode head)&lt;br /&gt;{&lt;br /&gt;            ysNode current = head;&lt;br /&gt;&lt;br /&gt;            while(current) {&lt;br /&gt;                        if(current-&gt;next == NULL) {&lt;br /&gt;                                    return current;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        current = current-&gt;next;&lt;br /&gt;            }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ysNode ysPush(ysNode head, int data)&lt;br /&gt;{&lt;br /&gt;            ysNode n = ysCreate();&lt;br /&gt;&lt;br /&gt;            if(n) {&lt;br /&gt;                        n-&gt;data = data;&lt;br /&gt;                        n-&gt;next = head;&lt;br /&gt;                        head = n;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return head;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ysNode ysRemove(ysNode head, int data)&lt;br /&gt;{&lt;br /&gt;            ysNode current = head;&lt;br /&gt;            ysNode prev = NULL;&lt;br /&gt;&lt;br /&gt;            while(current) {&lt;br /&gt;                        if(current-&gt;data == data) {&lt;br /&gt;                                    if(prev) {&lt;br /&gt;                                                prev-&gt;next = current-&gt;next;&lt;br /&gt;                                                free(current);&lt;br /&gt;                                                break;&lt;br /&gt;                                    } else {&lt;br /&gt;                                                head = current-&gt;next;&lt;br /&gt;                                                free(current);&lt;br /&gt;                                                break;&lt;br /&gt;                                    }&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        prev = current;&lt;br /&gt;                        current = current-&gt;next;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return head;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ysNode ysCopy(ysNode node)&lt;br /&gt;{&lt;br /&gt;            ysNode n = ysCreate();&lt;br /&gt;            if(n) {&lt;br /&gt;                        n-&gt;data = node-&gt;data;&lt;br /&gt;                        n-&gt;next = node-&gt;next;&lt;br /&gt;            }&lt;br /&gt;            return n;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int ysLength(ysNode head) {&lt;br /&gt;            int count = 0;&lt;br /&gt;            ysNode current = head;&lt;br /&gt;&lt;br /&gt;            while(current) {&lt;br /&gt;                        count++;&lt;br /&gt;                        current = current-&gt;next;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return count;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ysPrint(ysNode head)&lt;br /&gt;{&lt;br /&gt;            if(!head) {&lt;br /&gt;                        printf("(null)\n");&lt;br /&gt;            } else {&lt;br /&gt;                        ysNode current = head;&lt;br /&gt;                        while(current) {&lt;br /&gt;                                    printf("%d-&gt;", current-&gt;data);&lt;br /&gt;                                    current = current-&gt;next;&lt;br /&gt;                        }&lt;br /&gt;                        printf(".\n");&lt;br /&gt;            }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*-------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*-------------------ynode_test.c----------------*/&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;ysnode.h&gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;            ysNode l = NULL;&lt;br /&gt;            &lt;br /&gt;            /* using ysPush() eventually, faster than Append, that has to Find_Last() first, before appending*/&lt;br /&gt;            l = ysPush(l, 5);&lt;br /&gt;            l = ysPush(l, 10);&lt;br /&gt;            l = ysPush(l, 7);&lt;br /&gt;            l = ysPush(l, 23);&lt;br /&gt;&lt;br /&gt;            printf("The list is now %d nodes long as shown below: \n", ysLength(l));&lt;br /&gt;            ysPrint(l);&lt;br /&gt;&lt;br /&gt;            printf("Starting removals\n");&lt;br /&gt;&lt;br /&gt;            l = ysRemove(l, 7);&lt;br /&gt;            ysPrint(l);&lt;br /&gt;&lt;br /&gt;            l = ysRemove(l, 23);&lt;br /&gt;            ysPrint(l);&lt;br /&gt;&lt;br /&gt;            l = ysRemove(l, 5);&lt;br /&gt;            ysPrint(l);&lt;br /&gt;&lt;br /&gt;            l = ysRemove(l, 10);&lt;br /&gt;            ysPrint(l);&lt;br /&gt;&lt;br /&gt;            printf("Removals finished\n");&lt;br /&gt;&lt;br /&gt;            ysFree(l);&lt;br /&gt;            return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*------------------------------------------------*/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113379272267542004?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113379272267542004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113379272267542004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113379272267542004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113379272267542004'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/singly-linked-list-class-libyirae.html' title='Singly Linked List Class - libyirae genesis'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113379216158694867</id><published>2005-12-05T15:16:00.000+01:00</published><updated>2005-12-05T15:16:01.636+01:00</updated><title type='text'>On implementing singly linked lists</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;This weekend, on account of a friend&amp;#8217;s assignment, I had to delve into implementing linked lists. (Yeah, I admit, I&amp;#8217;ve never taken time to study the implementation of these babies, all I knew was the concept). Jumping in with my usual optimistic, how hard can it be&amp;#8230; I mean, I&amp;#8217;ve written kernel modules to boot ;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways, to be honest&amp;#8230; the singly linked list was not hard to implement at all. I got all the basic operations, Create(), Free() (oh&amp;#8230; I love to valgrind my stuff, it gives me a good feeling ;) ), Add() and Remove(), these were relatively painless (for the Add(), I had to implement a Find_Last(), so I could always append at the end of the list, being that I wasn&amp;#8217;t holding a tail pointer anywheres). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyway, the other requirement was for the list to be always sorted in ascending order. And away I went, I mean, how hard can sorting and swapping of pointers and s*** be? I&amp;#8217;ll just add this teeny&amp;#8230; weeny&amp;#8230; BAAAM!!! I hit a road block!!! Suddenly, my understanding of pointers is being stretched to the limit, and much as I would hate to admit on OpenInterWeb&amp;#8482;, I DON&amp;#8217;T KNOW POINTERS LIKE I THOUGHT I DID!!!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;It was a sobering moment, as I kept deceiving myself, fighting with a very annoying segment of code, trying to get the sorting to work and I finally admitted to myself&amp;#8230; I&amp;#8217;ve been butt kickd!!! DAMN!!! You can imagine how intelligent I was feeling then.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways, I&amp;#8217;ve managed to bookmark a lot of articles on advanced pointers and linked lists, and data structures in general (I mean, when I kick this guy in the patella, I&amp;#8217;m off to the Races with Hash Tables, and binary trees!!!).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;One of the good things I found out tho, was that traversing a list with a for is not quite so neat as with a while. I&amp;#8217;ve been so used to all the foreach, for foo in bar ;), constructs, my initial reaction was to traverse with a for loop. When doing things like Remove(), that need a reference to a previous pointer, its somehow *&lt;b&gt;&lt;span style='font-weight:bold'&gt;cleaner&lt;/span&gt;&lt;/b&gt;* to use a while loop, at least, it made my code cleaner when I changed the fors to whiles.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways, I think every hacker worth his salt, should try to implement a couple of things just for the fun of understanding them. And if possible, eat your own dog **** on a couple of projects, so I&amp;#8217;m making up a list of stuff I NEED to do before this year runz out finally &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ol style='margin-top:0in' start=1 type=1&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Complete the Darned Sorted      Singly Linked lists,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Inherit and implement Doubly      Linked Lists&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Implement Basic Hashtables&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;implement a Basic Binary tree&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Wow!!! Now that&amp;#8217;s a tall order!!! That means, I&amp;#8217;m parking/suspending all other hacking endeavours for the next two weeks :(&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;The other thing I started thinking of, and I&amp;#8217;m not so fixated on it now, but I wouldn&amp;#8217;t mind attempting an implementation, is a Garbage Collector. This one is really of interest to me, as I&amp;#8217;m very MemoryLeak conscious these days.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Oh well&amp;#8230; lets see what happens in the next two weeks. I must win I tell you.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113379216158694867?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113379216158694867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113379216158694867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113379216158694867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113379216158694867'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/on-implementing-singly-linked-lists.html' title='On implementing singly linked lists'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113351659581251582</id><published>2005-12-02T10:43:00.000+01:00</published><updated>2005-12-02T10:43:15.870+01:00</updated><title type='text'>Sourceforge New Look</title><content type='html'>&lt;p class="mobile-post"&gt;I've been lazying my behind and didn't even know sourceforge has a brand &lt;br /&gt;new look!!! WHEEEEEEEEEEEEEe!!!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;It really looks cool. I just got the monthly mail sent to project admins &lt;br /&gt;today, and looked at the site, and its really cool. I hope other aspects &lt;br /&gt;of usability in the backend have been worked on as well... for instance, &lt;br /&gt;I just couldn't get my sourceforge webspace to work :(&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways, I'll be checking that out later.&lt;/p&gt;&lt;p class="mobile-post"&gt;Oh... Pysystray looks even cooler now :)&lt;/p&gt;&lt;p class="mobile-post"&gt;https://sourceforge.net/projects/pysystray/&lt;/p&gt;&lt;p class="mobile-post"&gt;Essien out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113351659581251582?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113351659581251582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113351659581251582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113351659581251582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113351659581251582'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/sourceforge-new-look.html' title='Sourceforge New Look'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113347001475123994</id><published>2005-12-01T21:46:00.000+01:00</published><updated>2005-12-01T21:46:54.830+01:00</updated><title type='text'>INIT Issues : More reasons why I love Linux</title><content type='html'>&lt;p class="mobile-post"&gt;A couple of days ago, I was playing with the LIVE CD image i've created. It boots properly off the HDD when I vector to it using a basic initrd image. The problem is that once It gets written to a CD, funky stuff begin to happen, all b/cos a CD is a read-only medium.&lt;/p&gt;&lt;p class="mobile-post"&gt;When I started playing with the LIVE CD creation, I hadn't really taken that into consideration. So I had to scourge the web looking for ideas on how ppl handled that. Why I was scouring, I was trying to take the lazy way out - I went into my /etc/rc.sysinit, and started commenting out lines that would cause a disk write (I just wanted to see a darned login screen... i mean... what's wrong with that? :) )&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway, after one of my many chroots into the image, i tried to boot into the image, and realised i'd borked something badly. I then tried to boot back into my system and TADA!!!!! i got:&lt;/p&gt;&lt;p class="mobile-post"&gt;INIT: "cannot execute /etc/rc.sysinit"&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway, to cut out all the dramatics, I had a very unusable system.&lt;/p&gt;&lt;p class="mobile-post"&gt;Now, lemme qualify, when Linux doesn't boot normally, there are a MYRIAD of ways to boot and access your files, especially when you use GRUB as your bootloader. Anyway, I tried doing a chroot from the original install cd which can serve as a minimal rescue cd, and all the permissions where in place... nothing looked out of the ordinary, still i got the silly message!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;I did what i normally do with Linux problems, I just let it alone, and for a the last few days, i didn't get to boot linux when i got back home from work (I work on .NET on M$ by day anyways ;) ). Finally I decided to give it one last shot. I sent a message to the archlinux mailing list, asking for an idea on what could be wrong. While waiting for an answer, i hit google, and i came across a nearly similar thread in a RedHat ml and on the Arch forums. Both just confirmed my suspicions, something WAS amiss, in the case of the RedHat guy, the file that INIT was looking for, wasn't physically there... in the case of the ArchLinux guy, the file was there, but permissions were denied, and none of these was my scenario. To make matters worse, I'd been running /etc/rc.sysinit on that partition when accessed from the install cd without issues.&lt;/p&gt;&lt;p class="mobile-post"&gt;Finally, i decided to take it home. I just used grub to set my init=/bin/bash, once i got the bash prompt, i attempted to run /etc/rc.sysinit, and BOOP!!!, it borked nicely. It couldn't find /bin/sh!!! This was the problem... the intepreter at the shebang was /bin/sh!!! I looked, and it wasn't there... i prolly symlinked it out without knowing when i was doing multiple chroots from the root image :((&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway, I had to reboot the kernel in rw mode (other than the default ro mode), and use pacman to reinstall bash, and get back that symlink, and voila... its all good my man!!! All GOOD!!!&lt;/p&gt;&lt;p class="mobile-post"&gt;The moral lesson? Use a flexible OS, that allows you to know all about it without buying expensive books etc... this was what saved me, and this is Why i LOVE Linux.&lt;/p&gt;&lt;p class="mobile-post"&gt;with BlinDvws, i would prolly have had to reinstall (at least a repair install of XP :( )&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway... Linux R0ckz and so do I :)&lt;/p&gt;&lt;p class="mobile-post"&gt;Essien out&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113347001475123994?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113347001475123994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113347001475123994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113347001475123994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113347001475123994'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/12/init-issues-more-reasons-why-i-love.html' title='INIT Issues : More reasons why I love Linux'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113283570999800627</id><published>2005-11-24T13:35:00.000+01:00</published><updated>2005-11-24T13:35:10.056+01:00</updated><title type='text'>Pacman kicks serious arse</title><content type='html'>&lt;p class="mobile-post"&gt;On of the more deceptive qualities of Open Source software is the &lt;br /&gt;userbase of a particular product. People tend to swarm to what others &lt;br /&gt;are already using, and accept all that is there without much of a &lt;br /&gt;thought about alternatives. The bad part of it is when the authors of &lt;br /&gt;the software don't look out at alternatives to see if they could improve &lt;br /&gt;theirs by learning a thing or two from others.&lt;/p&gt;&lt;p class="mobile-post"&gt;Case in Point... Linux Package Management Systems.&lt;/p&gt;&lt;p class="mobile-post"&gt;My distro hopping ended for me when I discovered ArchLinux at least 3yrs &lt;br /&gt;ago or there about. Before then, I had breifly used Gentoo for about 6 &lt;br /&gt;months, and I loved the auto-dependency resolution it did. I also felt &lt;br /&gt;cool about the compiling backthen ;), untill I found ArchLinux and found &lt;br /&gt;I didn't HAVE to compile UNLESS I realy WANTED to. For me, Pacman was &lt;br /&gt;Portage without the compiling (and ohh... ArchLinux PKGBUILD files are &lt;br /&gt;so what I expect, as opossed to Gentoos Ebuilds which I kept telling &lt;br /&gt;myself I was going to get into, but that's not the point). The thing is &lt;br /&gt;after using Portage for a while and loving it, and then using Pacman and &lt;br /&gt;adoring it, I'd not really given thought to other distros and their &lt;br /&gt;related package managers... untill recently.&lt;/p&gt;&lt;p class="mobile-post"&gt;I've had a brush with apt and yum. And frankly, Pacman kicks all their &lt;br /&gt;collective arses in the areas where their functionality overlap. My main &lt;br /&gt;gripe with apt, is the various interfaces (which after using apt for &lt;br /&gt;almost more than a month, I'm still confused when I need to search for &lt;br /&gt;instance, (apt-cache? apt-get? apt-foobar?). I'm all for small programs &lt;br /&gt;that do one thing and do it well, but I'm also all about interfaces for &lt;br /&gt;productivity, and everyone in a while the apt-bleh family of programs &lt;br /&gt;trip me on guessing which should be doing what. Ok... that seems to be &lt;br /&gt;my only gripe with apt actually :) (Its not as intuitive to me as Pacman &lt;br /&gt;is, prolly b/cos i've wrked with Pacman for the past 3yrs? Though I can &lt;br /&gt;vaguely recall grabbing the whole of pacmans major operations after &lt;br /&gt;about 2 or 3 *schemes* thru the man page. I'm still procrastinating when &lt;br /&gt;I'll sit down and STUDY the apt-bleh family of man pages). Its ok, but &lt;br /&gt;well... i prefer pacman in that regard.&lt;/p&gt;&lt;p class="mobile-post"&gt;For yum, I think it has a more succinct interface than apt, and its &lt;br /&gt;easier to get a grasp of its options, almost and compact as pacman too. &lt;br /&gt;My overwhelming gripe with yum is all the *i think* uneccessary things &lt;br /&gt;it does each time. Maybe there's and option to turn the attitude off, &lt;br /&gt;but i dunno right now. Each time i hit yum install foobar, or yum search &lt;br /&gt;bleh, or yum erase st0pd3l00pz. It refreshes its archives (? or what is &lt;br /&gt;that thing it does each time, fetching base, updates, etc, EVERY &lt;br /&gt;FRIGGING TIME!!!). Its just annoying especially over an SSH connection &lt;br /&gt;that is breaking like burnt, crusty pancakes. I know yum is trying to &lt;br /&gt;build dependencies, etc, but does it build it dynamicaly? I dunno. For &lt;br /&gt;pacman, pacman packages installs these info in a DB of sorts, so it can &lt;br /&gt;easily get back this info, in a very very minute fraction of the time it &lt;br /&gt;takes yum to grab its own dependency information. So far, that's the &lt;br /&gt;only gripe I have with yum.&lt;/p&gt;&lt;p class="mobile-post"&gt;In summary, I know I'm seriously biased toward ArchLinux, but my head is &lt;br /&gt;not so far gone up my behind that I can't stick it out and do a balanced &lt;br /&gt;assessment (and its not like i set out to do an assessment anyway... its &lt;br /&gt;just my first reactions from my guts). Lets hope in the coming days as I &lt;br /&gt;continue to use apt and yum, I can find admirable features which can be &lt;br /&gt;patched into Pacman, so it kicks even more serious arse...&lt;/p&gt;&lt;p class="mobile-post"&gt;In parting...&lt;/p&gt;&lt;p class="mobile-post"&gt;yum: Hey pac... what are you doing? Those boots look huge&lt;br /&gt;pacman: uhhh... could you please just stand over here next to apt&lt;br /&gt;apt: okay d00d, we're here... what do we do next.&lt;br /&gt;pacman: just turn around, with your backs to me, and bend over just a &lt;br /&gt;bit... uhh.. too much... aha... perfect.&lt;/p&gt;&lt;p class="mobile-post"&gt;*B00T*&lt;/p&gt;&lt;p class="mobile-post"&gt;------------------------------&lt;br /&gt;LMFAO&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113283570999800627?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113283570999800627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113283570999800627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113283570999800627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113283570999800627'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/11/pacman-kicks-serious-arse.html' title='Pacman kicks serious arse'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113260387073824919</id><published>2005-11-21T21:11:00.000+01:00</published><updated>2005-11-21T21:11:16.886+01:00</updated><title type='text'>Coding Guidelines... MUST READ!!!</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://thc.org/root/phun/unmaintain.html"&gt;http://thc.org/root/phun/unmaintain.html&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-113260387073824919?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113260387073824919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113260387073824919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113260387073824919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113260387073824919'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/11/coding-guidelines-must-read.html' title='Coding Guidelines... MUST READ!!!'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113258165098356122</id><published>2005-11-21T15:00:00.001+01:00</published><updated>2005-11-21T15:06:18.196+01:00</updated><title type='text'>sfdisk hacking</title><content type='html'>Still in a bid to create a self installing router, I’ve had to play around with sfdisk for autopartitioning and stuff. After reading thru the man pages, getting an idea, I grabbed the source of the ArchLinux installer and looked at how Judd did the auto partitioning parts… it looks cool. &lt;br /&gt;&lt;br /&gt;My main problem is that I want to be able to detect the size of the disk, then create various partitions sized in percentages of the disk total size. The ArchLinux installer routine doesn’t do this, instead of uses some fixed sizes for /boot, swap and the whole rest of the disk for /.&lt;br /&gt;&lt;br /&gt;I’m still looking for the best way to get the disk size (maybe I’ll even go with parted eventually). Anyway, I’ll try stuff out maybe tmrw nite or something… if that works… then the automated router installation CD will be finished sooner than I was expecting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113258165098356122?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113258165098356122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113258165098356122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113258165098356122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113258165098356122'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/11/sfdisk-hacking.html' title='sfdisk hacking'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113258161595346936</id><published>2005-11-21T15:00:00.000+01:00</published><updated>2005-11-21T15:04:17.320+01:00</updated><title type='text'>Good Bye DevFS (sob... sob.. sob)</title><content type='html'>A lot of folks complained about DevFS and all its issues in the kernel tree... but I really wasn't one of those guys. For me DevFS solved a real problem: When I built initrd images, I didn't have to worry about populating the /dev tree before the kernel was booted up.&lt;br /&gt;&lt;br /&gt;I don't really know how UDev based initrds handle this, I've been a bit lazy about finding out, untill last weekend, when I had to build an initrd image for an automated router installer. I tried to build with the lattest ArchLinux 2.6.13 kernel (DevFS was finally removed from this kernel build). I hit a snag, and I hatted the pre-DevFS days of copying some /dev files over manually when building the initrd, and I have this very neat scripts that do everything for me (part of ALE, which i've been revamping seriously as I get to do more work these days). Anyway, I finally chicken'd out just to get things working, and fell back to using 2.6.12 kernel.&lt;br /&gt;&lt;br /&gt;I'm going to take out some time to find out more about UDev (FINALLY!!!), since its finally shoved itself in my face... blegh!!!&lt;br /&gt;&lt;br /&gt;ok... back to code .NET Web forms DataLists now. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113258161595346936?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113258161595346936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113258161595346936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113258161595346936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113258161595346936'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/11/good-bye-devfs-sob-sob-sob.html' title='Good Bye DevFS (sob... sob.. sob)'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113214716678361042</id><published>2005-11-16T14:19:00.000+01:00</published><updated>2005-11-16T18:14:24.973+01:00</updated><title type='text'>mod_rewrite voodoo :)</title><content type='html'>`` Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. ''&lt;br /&gt;&lt;br /&gt;                 -- Brian Moore&lt;br /&gt;                bem@news.cmc.net&lt;br /&gt;&lt;br /&gt;The above is one of my best quotes so far, after encountering mod_rewrite. Anyways, onto the meat.&lt;br /&gt;&lt;br /&gt;From an anonymous comment on my post yesterday, someone wanted to do something like this using mod_rewrite:&lt;br /&gt;&lt;br /&gt;http://www.abc.com/sub   ========&gt; http://sub.abc.com&lt;br /&gt;&lt;br /&gt;My former solution had to do with some general redirect/MIME forcing and then some PHP trickery, which actually works. But there's even a more mod_rewrite (ty) based solution... the secret is in the use of the RewriteCond expression which I didn't know of when I replied that post initially.&lt;br /&gt;&lt;br /&gt;The problem initially was that with RewriteRule, you can only access the part of the url that comes after the host name. For instance, in http://foo.com/bar, you only have access to /bar in RewriteRule. To do this, we actually need access to the foo.com part as well. This is where RewriteCond comes in handdy.&lt;br /&gt;&lt;br /&gt;With RewriteCond, you can basically execute a RewriteRule as long as the condition is satisfied. There are special condition variables that you have access to like HTTP_HOST (which we'll be using here), and a bunch of other apache server/environment variables.&lt;br /&gt;&lt;br /&gt;Ok... the rule look like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteEngine on &lt;/span&gt;#this turns on the RewriteEngine... duh!!! :)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteLog /path/to/logfile&lt;/span&gt; # i like to turn this on, to see what actually happens&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteLogLevel 1&lt;/span&gt; #when testing out a new rule, i set this to 5 so i can see what's happening step by step&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteCond %{HTTP_HOST} ^www\.([a-z0-9]+)\.com$ &lt;/span&gt;#this will match, www.bleh.com, www.anything.com, www.wassup.com, well...you get the idea. Note that I applied the () grouping so i can access the matched variable later as %1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteRule ^/([a-z0-9]+)$ http://$1.%1.com/ [R,L] &lt;/span&gt;#now i pick up the /sub part of the url, and use that to generate the redirect url. The i apply the two flags [R, L]. R means force a redirect. L just makes this the final rule that this match will traverse.&lt;br /&gt;&lt;br /&gt;Lets lay it out again without all the nasty/helpfull comments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RewriteEngine on&lt;br /&gt;RewriteLog /path/to/logfile&lt;br /&gt;RewriteLogLevel 1&lt;br /&gt;&lt;br /&gt;RewriteCond %{HTTP_HOST} ^www\.([a-z0-9]+)\.com$&lt;br /&gt;RewriteRule ^/([a-z0-9]+)$ http://$1.%1.com/ [R,L]&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yup... try this out, and see the deep vodoo. On my test apache host, if i do:&lt;br /&gt;&lt;br /&gt;http://www.mrouter.com/sub&lt;br /&gt;&lt;br /&gt;I end up getting http://sub.mrouter.com&lt;br /&gt;&lt;br /&gt;kewl o yeah... voodoo? DEFINITELY!!!&lt;br /&gt;&lt;br /&gt;Essien out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113214716678361042?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113214716678361042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113214716678361042' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113214716678361042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113214716678361042'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/11/modrewrite-voodoo.html' title='mod_rewrite voodoo :)'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-113209145520499603</id><published>2005-11-15T22:50:00.000+01:00</published><updated>2005-11-15T22:50:55.250+01:00</updated><title type='text'>guess who's back</title><content type='html'>&lt;p class="mobile-post"&gt;so you thought you had me huh? And i was gone for good? well... i'm back.&lt;/p&gt;&lt;p class="mobile-post"&gt;Seriously though, a lot of things has been going thru my mind this last &lt;br /&gt;weeks, and I thought it was better i sort them out before i went on with &lt;br /&gt;bloggin as usual.&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyways... now, i'm back bloggin. And for a first taste, i've been &lt;br /&gt;playing with mod_rewrite for apache.. and DANG!!! Its sooo cool.&lt;/p&gt;&lt;p class="mobile-post"&gt;More on that later.&lt;/p&gt;&lt;p class="mobile-post"&gt;Essien, out!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-113209145520499603?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/113209145520499603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=113209145520499603' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113209145520499603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/113209145520499603'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/11/guess-whos-back.html' title='guess who&apos;s back'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112852171943956981</id><published>2005-10-05T15:15:00.000+01:00</published><updated>2005-10-05T15:15:23.600+01:00</updated><title type='text'>Pysystray progress - Lessons learned so far</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;pysystray-0.6.0 and pysystray-0.6.1 (a bugfix  release) are out in the wild now :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;(&lt;A  href="http://datavibe.net/~essiene/pysystray"&gt;http://datavibe.net/~essiene/pysystray&lt;/A&gt;)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The major work in the 0.6.X branch is to make the  menu's modifiable on the fly.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Grab n Play at: &lt;A  href="https://sourceforge.net/project/showfiles.php?group_id=145849"&gt;https://sourceforge.net/project/showfiles.php?group_id=145849&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Now, this is what brings me to the crux of this  post. On my own, there are some plans I had for pysystray, these plans are no  where near what it is now. My point is that my own scope when compared to what  pysystray can currently do in its relatively short lifetime, was terribly  myopic. Its amazing what real life situations can do to a software project, even  a very small one like pysystray.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;This brings me to another thought. Imagine that I  was a company, producing pysystray. Ofcourse, one can say that my users will  also eventually create the ecosystem akin to the one i've described. I agree.  But the question is, what chances would a single guy like me, have of convincing  the next Joe Schmoe to actually Buy n License pysystray? Well, I really don't  know the true answer to that, but i have a feeling that it has been easier to  build an ecosystem b/cos of the BSD license. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;That said, I think the most important difference is  this. Under a Buy n License arrangement, (aka. Get em, lock em in ;) ), it would  seem that once I have my customers, locked in and dependent on me, I am likely  to drive the code in any direction that I see very fit, regardless of wether  this is neccessary or not. I could decide to begin to add features, and even  begin to dream up integration into other products of mine that i'm dreaming up.  I can then use that product as a leverage to move other products of mine into  the unsuspecting consumers hands. This seem like a wise Marketing move to me.  Eventually what could happen, is that small simple pysystray, could be Pysystray  Professional 2005 :-), and i'll have standard versions, enterprise editions that  can connect to Oracle and even SAP!!! :-) (i can't even say that with a straight  face!!! LMAO!!!&amp;nbsp;)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Anyway, you get the picture. Let me paint the  second picture. In the second case, the code is opensource, so my selfish  interests can be uneccessarily served, because once i begin to move in a  direction that is undesirable, someone else can very rightly grab the source and  fork the project, and i'll be left with a product with no users :). Instead of  being selfish, I have to learn to listen to the community that is growing around  the project. Some of the users are using it for some very serious projects, and  will have really demanding requests to make. Its in the interest of the project,  to try to satisfy these real needs as much as possible. That way, the small  project gets better and more usefull, and everyone goes home happy  :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Let me say here, that the first scenario doesn't  neccessarily always happen, but it can happen (and has happened too many times  than is good). I belive software should be as small and simple as possible (and  no smaller/simpler), serve one purpose (and better serve it well),&amp;nbsp; and be  reusable in ways not originally imagined by the creator. If software does this,  it will proove over time to have survival insticts of a virus, as it will keep  finding itself used by larger projects. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Software written in this way, is easier managed  too, and is simpler to finish too. I'm beginning to find that some of my biggest  beef with some software, is my total inability to bend them to my vastly  superior will (yeah right!!). But seriously, I'm not dumb, and I want to be able  to do things the arthur didn't even think possible. This is my idea of Genetic  Mutation / Natural Selection as applied to software. If your software can't  easily mutate to serve new needs (b/cos there will always be new needs), it is  doomed before it is even released. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;In conclusion, I've been&amp;nbsp;learning that there  is truly "Nothing New Under The Sun", as most ideas we think are new, are slight  variations of already known ideas. If you combine this with "Scratch Your Itch",  then you can really have a successfull project. If you build something just for  the sake of building it, its almost likely to fail, or become stuck in a rut  later in life. If you build something you actually use yourself, chances are  you'll lovingly take care of it, and strange as it may sound. Successful  opensource software have a loving arthur, who painstakinly guards against dirty  code, wrong ideas, etc, but most importantly, keeps the code lean and mean and  relevant.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Phew!!! That was a mouthfull...&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Essien... out.&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112852171943956981?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112852171943956981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112852171943956981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112852171943956981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112852171943956981'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/10/pysystray-progress-lessons-learned-so.html' title='Pysystray progress - Lessons learned so far'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112850938789965247</id><published>2005-10-05T11:49:00.000+01:00</published><updated>2005-10-05T11:49:47.950+01:00</updated><title type='text'>XMLHttpRequest - Good or Evil</title><content type='html'>&lt;DIV&gt;&lt;FONT size=2&gt;&lt;FONT face=Arial&gt;Bunmi (&lt;A  href="http://www.inthrill.com/weblogs/bunmi"&gt;http://www.inthrill.com/weblogs/bunmi&lt;/A&gt;)&amp;nbsp;sent  this article around: &lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;A  title=http://www.devx.com/webdev/Article/28861  href="http://www.devx.com/webdev/Article/28861"&gt;&lt;FONT  color=#000000&gt;http://www.devx.com/webdev/Article/28861&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN  style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;They've been having fun  with studying AJAX at Artemis (&lt;A href="http://www.artemis-solutions.com"&gt;&lt;FONT  color=#000000&gt;http://www.artemis-solutions.com&lt;/FONT&gt;&lt;/A&gt;) recently (i'm jealous  :) ). Anyway, that article arthur ticked me off the wrong way, especially with  his conclusions... I thought he was going to be objective and balanced, but he  wasn't, so here goes my two kobo reply.&lt;/SPAN&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN  style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;FONT color=#000000&gt;I  think its unfair to paint &lt;?xml:namespace prefix = st1 ns =  "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:City w:st="on"&gt;&lt;st1:place  w:st="on"&gt;Ajax&lt;/st1:place&gt;&lt;/st1:City&gt; as unsafe in the face of similar data that  CAN and using the authors phrase, HAS been ganered from users using Desktop apps  too. Truth is, once youre on the internet, Security and Privacy gain a whole  new meaning. I mean, the term "spyware" came up way before &lt;st1:City  w:st="on"&gt;&lt;st1:place w:st="on"&gt;AJAX&lt;/st1:place&gt;&lt;/st1:City&gt;. Assuming that the  Web was safe before &lt;st1:City w:st="on"&gt;&lt;st1:place  w:st="on"&gt;AJAX&lt;/st1:place&gt;&lt;/st1:City&gt; (or safer), is a false premise, check out  what cross-site-scripting can achieve. Agreed with &lt;st1:City  w:st="on"&gt;AJAX&lt;/st1:City&gt; you can do these things easier than before, that  doesnt mean that without &lt;st1:place w:st="on"&gt;&lt;st1:City  w:st="on"&gt;AJAX&lt;/st1:City&gt;&lt;/st1:place&gt; these things totally cant be done.  &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;FONT  color=#000000&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;FONT color=#000000&gt;One  may argue that with spyware, you have to install them... well... have you ever  decompiled/disassembled that program you use most on your system, to make sure  its not spying on you? Oh... i c... you took the Software Companies word for  it... And now you're not going to take their word for it if they tell you their  website is not spying on you? Whatever... Me, I don't believe any of them  anyway... I just limit how much of my info can be compromised so at anytime the  amount of info I loose is really minimal. How do I do this? I&amp;nbsp;TRY  to&amp;nbsp;allow only&amp;nbsp;OpenSource software have access to my most personal  data, and where I can't, I don't bitch if I can't fix it. I'm I still very safe?  Ofcourse NOT!!! What kind of world would this be if we were all totally safe?  Unrealistic... that's the truth of Life... deal with it.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;?xml:namespace prefix  = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT  color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT color=#000000&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;It is also not ground  enough for the author to say: *&lt;/SPAN&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;Are you not yet  fearful and angry? Not ready to rise up and strip the XMLHttpRequest code from  your browser?*&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;As a matter of fact, I  think thats just a dumb conclusion (IMNSHO). Every Network Admin worth his  salt, infact, any Engineer or human that deals in innovations, knows that when  adding features to a product/design, most features can be used for Good as well  as for Bad. If you asked me, I would say that in Nature everything comes in  ionized (for want of a better expression) pairs  Positive Side n Negative Side.  &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;Take the most basic of  human abilities  Choice. This is the single factor that allows us to have great  men like G. Washington, A. Lincoln, Essien Ita Essien (no thats not a typo  :P), its also the same factor that allows us to have some of the worlds worst  Tyrants like A. Hitler, J. Stalin, etc. Is choice a Bad Thing? Ill say a  resounding NO!!! But Im guessing that the Arthur of that article is likely to  recommend that the UN recommend all Nations of the world to pull out Choice from  all New Human Beings. Soundz hilarious right? Exactly, thats what reading that  pessimism laden paper feels like to me.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;I would appreciate an  article that highlights the potential security holes, and a way for users to be  wary of them better than an out-on-out attack on AJAX (just b/cos its a new  technology, and wasnt pushed to the fore by some *&lt;B&gt;traditional&lt;/B&gt;* big name,  b/cos i'm almost certain that where this angst is coming from), and a conclusion  that we should Strip Out XMLHttpRequest from our browsers!!! That just  silly.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;Anyways, any browser  that likes, can go ahead and pull out XMLHttpRequest from its implementation and  then sit back and watch satisfactorily as its Market Share torpedos downward  (Oh, and if you've somehow missed the news, Opera the browser is free now  too!!!). Yeah, and they can quote me as having said so (who am i? baaah. Go  away thats not important YET :-) ). XMLHttpRequest has come to stay.  &lt;st1:City w:st="on"&gt;&lt;st1:place w:st="on"&gt;AJAX&lt;/st1:place&gt;&lt;/st1:City&gt; is a  technology that grew up in the wild of real software solutions (as opposed to a  carefully designed paradigm), as such, it has _Darwinically_ earned its right to  survive and my o my survice it will, or mutate into something even more crazy  it will.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;My advice for all Nay  Sayers? Wake up shesssh get real this is NOT _&lt;I&gt;Duh Maytreex&lt;/I&gt;_, this is  actually _&lt;I&gt;Duh Reelwhurled&lt;/I&gt;_ :-) and as such, &lt;st1:City  w:st="on"&gt;&lt;st1:place w:st="on"&gt;AJAX&lt;/st1:place&gt;&lt;/st1:City&gt; is here to stay.  &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;Oh and lest I forget,  better get more educated on&amp;nbsp;safe browsing habits, and dont worry, the next  generation of Data Protection is just around the corner trust me, I use  Firefox!!!&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;Essien...  out.&lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112850938789965247?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112850938789965247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112850938789965247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112850938789965247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112850938789965247'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/10/xmlhttprequest-good-or-evil.html' title='XMLHttpRequest - Good or Evil'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112842103007908066</id><published>2005-10-04T11:17:00.000+01:00</published><updated>2005-10-04T11:17:10.146+01:00</updated><title type='text'>Web 2.0 - What do you think it is?</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;Bunmi (&lt;A  href="http://www.inthrill.com/weblogs/bunmi"&gt;http://www.inthrill.com/weblogs/bunmi&lt;/A&gt;)  recently sent a mail around the office that related to Web 2.0, I replied and in  so doing, crystalized my own thoughts for Web 2.0. Here is my unaltered reply  below.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;Web 2.0 is the emerging  webscape that is basically driven by small, decentralized, hackable and open  platforms. It incorporates a lot of things, but the thing that seems to have  really got it kicking off is &lt;?xml:namespace prefix = st1 ns =  "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:City w:st="on"&gt;&lt;st1:place  w:st="on"&gt;AJAX&lt;/st1:place&gt;&lt;/st1:City&gt;. At the very core of web 2.0 is dynamism  (and dynamic frameworks with its starchild  RoR) , transparent data (RSS,  Atom), simple frameworks (a brave new RESTafarian web as opposed to SOAPsuds  :-)), and oh! Did I mention a connection back to Google? :-)&lt;?xml:namespace  prefix = o ns = "urn:schemas-microsoft-com:office:office"  /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;I like to think of it  as the desktop, slowly distilling its most important parts, onto the browser.  What I mean is that Web 2.0 aims at pulling the basic underlying things we do on  our desktop, and making them doable from the browser. This doesnt mean well  soon have M$ Office running in Firefox / Opera / IE, but it means that a lot of  what we do today on the desktop, will be increasingly done in a browser, hence  making the most important platform of the next couple of decades, NOT the  Operating System, but the BROWSER. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;This also means  relevance in this emerging techscape is going to be judged a lot on hackability  / trustability (I define hackability as the property of a platform that allows  it to be easily extended/modified/maintained, without relying on lots of theory  and/or _&lt;I&gt;advanced&lt;/I&gt;_ tools. I consider trustability of a platform, as the  property that allows it to be easily extended/modified/maintained, without  loosing peace-of-mind. Think continous_integration, test_driven_development,  worse_is_better, release_frequently_release_early,  feature_driven_development.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;This is ofcourse my own  understanding of the current webscape and events I see unfolding in the  industry. Whatever eventually happens, Im sure glad to be alive and coding in  these times == &amp;gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN  style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;@(^_-)@&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112842103007908066?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112842103007908066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112842103007908066' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112842103007908066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112842103007908066'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/10/web-20-what-do-you-think-it-is.html' title='Web 2.0 - What do you think it is?'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112747934722396571</id><published>2005-09-23T13:42:00.000+01:00</published><updated>2005-09-23T13:42:27.230+01:00</updated><title type='text'>Burning My Way To A Distro</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;15 CDRs and counting!!!&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;This was just at last nite... i burnt about 10 of  them last nite.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;What am I talking about? Oh yeah, I've been  building a customized linux distro based on ArchLinux&amp;nbsp;for a targetted  application for a while now.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I already have the ALE (see my Links sidebar)  framework, so this hasn't been a total from the scratch affair. Thanks to  ArchLinux's overwhelming KISS principle, anyone who's interested can do stuff  like that. Trus me... its not rocket science :-). Anyways, the plan is to  embrace and extend ALE. So once this is done, i'll supplement ALE such that, I  can redo this by just changing a config file, and boom!!! (Ok... so exploding  stuff isn't quite so good, but you get the picture.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Last nite, I ensured the partioning works properly  (i've disabled FTP mode from the base arch installer for now, just to keep  things simple), and I'm making the actions follow themselves. Currently, on the  Arch Installer, each time you finish an action, it brings you back to the main  menu, which is ok for me really, but for my target audience, It will be less  ambigous, to actually go thru the steps one after the other.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Everything works okay now, so I'll need to update  the base packages to pull in the lattest packages available now, and then i've  been thinking of the Config Files tweaking. Dunno how i'm going to solve that  yet. I've been thinking of just dropping some sane default values there, and  having a seperate system program to help tune the configs. Dunno, not decided  yet, so i'll leave it as it is.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;By tonite, I should finally install successfully on  the first victim box :), then I'll spend the weekend tidying up the dialogs, and  perhaps finetuning the configuration mechanism.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Essien out!!!&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112747934722396571?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112747934722396571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112747934722396571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112747934722396571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112747934722396571'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/09/burning-my-way-to-distro.html' title='Burning My Way To A Distro'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112731703468418091</id><published>2005-09-21T16:37:00.000+01:00</published><updated>2005-09-21T16:37:14.756+01:00</updated><title type='text'>pysystray on Daily Python</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;This was an interesting suprise on Daily Python  (&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;&lt;A  href="http://www.pythonware.com/daily/"&gt;http://www.pythonware.com/daily/&lt;/A&gt;),  The list for today 2005-09-21, lists pySystray-win32's lattest sourceforge  release announcement there. Yipee!!!&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Its actually a humbling experience for me...  *sniff*&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I'll just go cry now in private... this is a  special moment :-)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112731703468418091?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112731703468418091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112731703468418091' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112731703468418091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112731703468418091'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/09/pysystray-on-daily-python.html' title='pysystray on Daily Python'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112729845862056015</id><published>2005-09-21T11:27:00.000+01:00</published><updated>2005-09-21T11:27:40.573+01:00</updated><title type='text'>pysystray-0.5.2 released</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Just updated sourceforge, with the lattest version  of pysystray.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;This release is basically concept complete with  what I initially set out to acheive. Its amazing that most of the time, I didn't  really plan what would be in the next version, but I just went with my  gut.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I now have balloon tooltips, on_load event  callbacks, etc, so I can fully write small service like apps that totally sit on  the Windows Notification Area, all in python.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;My first thought is an IRC impersonation of me :),  this guy will just notify me if i'm doing something important and someone in a  channel he's watching says something that might interest me :), ofcourse,  there's the ever-vapourware 'phiba' (tm), that may eventually get written  now.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;bahhh... i'm just a lazy humbug :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Essien... out!!!&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112729845862056015?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112729845862056015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112729845862056015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112729845862056015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112729845862056015'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/09/pysystray-052-released.html' title='pysystray-0.5.2 released'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112655337836593281</id><published>2005-09-12T20:29:00.000+01:00</published><updated>2005-09-12T20:29:38.366+01:00</updated><title type='text'>Customising ArchLinux</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I've recently had to build a custom distro aimed at  a specific purpose. To do this, I quicly visited my sources for ALE (&lt;A  href="http://datavibe.net/~essiene/ale"&gt;http://datavibe.net/~essiene/ale&lt;/A&gt;),  as a starting point to build the LIVE root image. This was actualy a no brainer,  as all it involved was building the pacages I wanted, and changing the ALE  config files.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The intersting part has so far been building the CD  installer.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;In according to the Zen Of Laziness (TM) of which  i'm an avid practitioner, I am basing the CD installer off the basic official  ArchLinux installer ISO. Hacking it has been fun so far. What i'm basicaly  doing, is to tweak the setup script, so some options that I don't need are  hidden, and some sane defaults are used in configuring most of the config files.  Since this is a targetted distro, its wiser to use them Sane  defaults.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Once I finish this, i'm going to tie it into ALE  somehow. The goal is to be able to build a CD installer for a custom distro in  all of 5 minutes, levering off ALE's config files, etc. :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I currently have to vanilla box to test the  installer on :-( so I'm having to just print messages where work would be  done... (not cool!!! :( ), Ii'll still make sure everything works well, then  maybe I'll give wendy (my old laptop), a run for here money :), poor ole gal,  she really served me faithfully (and still has some important data, but bolivia  (my new laptop), totally kicks wendies behinds ;)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;If i keep working at nights, I should be able to  get this completed this weekend, with minimum fuss. What's actually slowing me  down, is the testing... I wonder if there's any other way I could do this....  hmmm....&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112655337836593281?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112655337836593281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112655337836593281' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112655337836593281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112655337836593281'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/09/customising-archlinux.html' title='Customising ArchLinux'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112655284312300587</id><published>2005-09-12T20:20:00.000+01:00</published><updated>2005-09-12T20:20:43.130+01:00</updated><title type='text'>pysystray new releases</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;pysystray is undergoing some maturing out in the  wild, that it prolly would not have achieved indoors :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;A  href="http://datavibe.net/~essiene/pysystray"&gt;http://datavibe.net/~essiene/pysystray&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;A  href="https://sourceforge.net/projects/pysystray/"&gt;https://sourceforge.net/projects/pysystray/&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Originally I had intended pysystray as an  alternative to writing real services. So a pysystray application would just sit  in the system tray and do what a service would have normally done (yeah... i  know... its not the best place to do that... but heck it rocks).&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Anyways, releases upto 0.4.2 focused on ironing  that out smoothly.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Last week, there was a need on the mailing list, to  use pysystray in a more traditional sense, as part of a larger GUI project. In  this case, enough wasn't exposed via the API for controlling the underlying  _App() object. Solving that was an intersting excercise though, and on Friday, i  released 0.5.0, which introduced a new Object systray.Control() (for want of a  better name :-) ). This allows more traditional things like Control.show(),  Control.hide(), Control.enable(), Control.disable(), etc.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Today, i've just released 0.5.1 (worked on this  over the weekend), to iron out some kinks in 0.5.0.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Currently, while waiting for feedback, i'm thinking  of cleaning up the Control api in the next 0.5.x release. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Ofcourse, all these, have not broken API yet for  the already existing systray.App().&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Also, in the process of doing this, i've been  learning more about how win32api actually works. Its not facinating (and i think  its too verbose), but at least, i finally am understanding the shindig!  :)&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112655284312300587?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112655284312300587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112655284312300587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112655284312300587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112655284312300587'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/09/pysystray-new-releases.html' title='pysystray new releases'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112655228072178953</id><published>2005-09-12T20:11:00.000+01:00</published><updated>2005-09-12T20:11:20.766+01:00</updated><title type='text'>Silent Nigh, Hackers Nigh :)</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Yup, i've been quiet for a while. Been quite busy  on a number of fronts, and interesting things are happening too. Be giving a  flurry of updates in the next few days.&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112655228072178953?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112655228072178953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112655228072178953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112655228072178953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112655228072178953'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/09/silent-nigh-hackers-nigh.html' title='Silent Nigh, Hackers Nigh :)'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112532336230388258</id><published>2005-08-29T14:49:00.000+01:00</published><updated>2005-08-29T14:49:22.336+01:00</updated><title type='text'>E-Modules tutorial on edevelop.org</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The E-Modules exploration I wrote here: &lt;A  href="http://essiene.blogspot.com/2005/08/exploring-e17-modules-part-i.html"&gt;http://essiene.blogspot.com/2005/08/exploring-e17-modules-part-i.html&lt;/A&gt;,  has now moved to &lt;A  href="http://www,edevelop.org"&gt;http://www,edevelop.org&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I've cleaned it up a bit more, removed the funky  disclaimer (which i actually miss O.o :) ). Generally, I think that version is  cleaner, but i've maintained a link to the original.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;In future, I will also keep posting the raw  versions here, while I will clean-up and post another version to  edevelop.org&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112532336230388258?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112532336230388258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112532336230388258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112532336230388258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112532336230388258'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/e-modules-tutorial-on-edeveloporg.html' title='E-Modules tutorial on edevelop.org'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112507624387127500</id><published>2005-08-26T18:10:00.000+01:00</published><updated>2005-08-26T18:10:43.883+01:00</updated><title type='text'>Very Cool Thoughts On Coding</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I just stumbled across these links, and I must say,  I love Kevin Barnes' way of putting things.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;A  href="http://www.journalhome.com/codecraft/8106/#c2752"&gt;http://www.journalhome.com/codecraft/8106/#c2752&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;A  href="http://www.journalhome.com/codecraft/7775"&gt;http://www.journalhome.com/codecraft/7775&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112507624387127500?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112507624387127500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112507624387127500' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112507624387127500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112507624387127500'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/very-cool-thoughts-on-coding.html' title='Very Cool Thoughts On Coding'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112506629736670443</id><published>2005-08-26T15:23:00.000+01:00</published><updated>2005-08-26T15:26:48.650+01:00</updated><title type='text'>Exploring E17 Modules - Part I</title><content type='html'>DISCLAIMER: This is not your traditional tutorial where someone that knows somthing tells you about it. No. In this case, this is someone learning about something and writing down thoughts. That it happens to feel somewhat like a tutorial is a side effect. That said. Njoi :-)&lt;br /&gt;&lt;br /&gt;After much procrastination, yesternite, i was plain restless, I looked at the numerous projects I have at different stages of completion on my box, and decided to instead look at something different: E17 Modules.&lt;br /&gt;&lt;br /&gt;After my fair success with pysystray(http://datavibe.net/~essiene/pysystray), I've been thinking of doing something similar in E17. The only problem is having the time to sit down to understand what is really going on. So yesterday, I took the first plunge.&lt;br /&gt;&lt;br /&gt;Its amazing what barriers knowledge can pose, and consequently, what barriers you can surmount, when you have the knowledge. My main problem earlier had been setting up a build environment for a module. I hadn't really understood the working of Autotools (from the angle of the developer), so a few weeks back, I did a Google for AutoTools tutorials and came up with a free book :). After reading upto chapter 12, I really was *enlightened* :-), and finally, looking around the e_modules source tree, I suddenly understood how to insert my own module into the whole e_modules build process. (I'll expantiate on this latter, just incase you are like me, and didn't quite grab it at first).&lt;br /&gt;&lt;br /&gt;Anyways, my approach is a very bare bones approach. I took the in-tree weather module, stripped it to its barest components. And created a module i called 'hello' :). And from there, I'll start building up as I keep striving to understand the whole architecture.&lt;br /&gt;&lt;br /&gt;My first findings (which are not really news anyways):&lt;br /&gt;&lt;br /&gt;1. There are some functions that MUST be supplied by the module (this is akin to implementing an Interface if you're thinking OOP). e_modapi_init(), e_modapi_shutdown, e_modapi_save(), e_modapi_info(), e_modapi_about().&lt;br /&gt;&lt;br /&gt;2. Each of these functions takes a single argument. A pointer to an E_Module.&lt;br /&gt;&lt;br /&gt;3. The E_Module structure, contains all the information you need to know/tweak for your module. &lt;br /&gt;&lt;br /&gt;4. The order goes like this:&lt;br /&gt;    a. When you load your module, nothing in your code is called (same when you unload your module). The work starts when you Enable your module or when you Start/Restart E while your module is marked as Enabled&lt;br /&gt;    b. When your module gets started some funky stuff happens to load the module into memory, and the first function from your module to be called in e_modapi_info(). In e_modapi_info(), you're supposed to set distinctive characteristics of your module. Like the icon file, the edje file, and some other things like that. In my bare module. I didn't do anything there... just to get stuff running.&lt;br /&gt;&lt;br /&gt;    c. Next, E's config system queues your e_modapi_save() to be called at a latter time when the system is idle. (Thnx to raster for this explanation, I had it wrong before). e_modapi_save() is actually supposed to be used to persist data used by your module. (more on this latter). In this bare module. I left this blank as well.&lt;br /&gt;&lt;br /&gt;    d. Finally, you e_modapi_init() is called. Remember this function takes an E_Module *, but returns a void*. Some important things need to happen here. Firstly, You _SHOULD_  return a valid pointer to a data structure that will be used by your module. If you return a NULL the init will fail. You can be sure that if you return anything that points to memory you can't account for you'll have funky results ;) (Be my guest... try this, and lemme know how long it took for you CPU to melt :-) ).&lt;br /&gt;       The strategy here, is to create a simple struct that will contain all the info that you need to do you stuff, and return a pointer to that struct. What E does, is take your return value and store it in the E_Module-&gt;data attribute, where it will always be available from that point onwards.&lt;br /&gt;        Imagine you have this.&lt;br /&gt;&lt;br /&gt;        typedef struct _hello {&lt;br /&gt;            char* message;&lt;br /&gt;        } hello;&lt;br /&gt;&lt;br /&gt;        typedef hello* Hello;&lt;br /&gt;&lt;br /&gt;       Let that struct be your module Hello struct. for e_modapi_init(), we'll have this:&lt;br /&gt;&lt;br /&gt;        void*&lt;br /&gt;        e_modapi_init(E_Module *m)&lt;br /&gt;        {&lt;br /&gt;            Hello h = NULL;&lt;br /&gt;&lt;br /&gt;            /*normally you check for api version here and bail out if version is wrong. lets just ignore that for now*/&lt;br /&gt;&lt;br /&gt;            h = (Hello) malloc(sizeof(hello)); /*you should usually ecapsulate this in a function like hello_new() that does this and some other stuff for you.*/&lt;br /&gt;&lt;br /&gt;            if(!h) {&lt;br /&gt;                 e_error_dialog_show("Hello Module", "Initialize Failed!"); /* I'm adding this so we can see what's going on.*/&lt;br /&gt;                return NULL;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            e_error_dialog_show("Hello Module", "Initialized Successfully!");&lt;br /&gt;            e_error_dialog_show("Hello Module", "Hello World!"); /* Finally our own e_module hello world... now the world is at peace ;) */&lt;br /&gt;            return h;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        That's a very basic e_modapi_init() to get you going. When you being thinking of saving and restoring data, a bit more will need to be done here, and when you throw in menus, GUI, config stuff... that baby can begin to do realy much more... for now tho.. this is all you need. &lt;br /&gt;&lt;br /&gt;    e. After init returns. You module should be fully running. There are two more important hooks that you need to take care of. e_modapi_save(), and e_modapi_shutdown(). Like I mentioned earlier, e_modapi_save() is used to persist data. And we don't really want to do any persisting now, so we ignore it. On the other hand e_modapi_shutdown(), will be called when we Disable our Module, or when E is going down (for good, or for a restart). What we need to do in shutdown() is to release all memory we claimed in init(). But how do we get that data? The E_Module struct has a number of attributes we should get very friendly with, but right now, what we're iterested in, is the data struct we initialized in init(), That data struct is stored in the 'data' attribute of our E_Module struct. In our case this should suffice.&lt;br /&gt;&lt;br /&gt;        int&lt;br /&gt;        e_modapi_shutdown(E_Module *m)&lt;br /&gt;        {&lt;br /&gt;            Hello h = NULL;&lt;br /&gt;&lt;br /&gt;            h = m-&gt;data; /* this is how we get back our Hello struct from the module subsystem. There are other attributes that hold other things, face, menu, etc. ignore for now */&lt;br /&gt;&lt;br /&gt;            free(h);&lt;br /&gt;&lt;br /&gt;            e_error_dialog_show("Hello Module", "Shutdown Completed");&lt;br /&gt;&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        In our case, that simple function will do our shutdown for us.&lt;br /&gt;&lt;br /&gt;    f. Lets quickly run over the info, save, and about. Remember, e_modapi_info() is the first function that is called in your module. Its supposed to help setup information on your module, like label, icon_file (which shows up in the menu), etc. about is called when the about menu item is clicked. Typically should just give info on your module and exit, but hey.... you can write a webserver inside there if you're so inclined :), just return 1 when you're done. For save/info, we'll do nothing. Here we go:&lt;br /&gt;&lt;br /&gt;        int&lt;br /&gt;        e_modapi_info(E_Module *m)&lt;br /&gt;        {&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        int&lt;br /&gt;        e_modapi_save(E_Module *m)&lt;br /&gt;        {&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        int&lt;br /&gt;        e_modapi_about(E_Module *m)&lt;br /&gt;        {&lt;br /&gt;            e_error_dialog_show("Hello Module",&lt;br /&gt;                                            "A hello wold module for E17. To appease the gods of tutorials.\n"&lt;br /&gt;                                            "If we don't have this, we may be banished to debugging the great "&lt;br /&gt;                                            "Aiii Eee for the rest of our days! \n\n"&lt;br /&gt;                                            " Visit: http://essiene.blogspot.com/2005/07/travellers-log-1.html "&lt;br /&gt;                                            "for more information :)"&lt;br /&gt;                                            );&lt;br /&gt;&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. Finally comes the part that kept me from doing this for a very long time. I didn't understand the compilation process. Well, now I understand it a bit more, thanks to reading up autotools (btw, FREE BOOKS ROXS :-) )&lt;br /&gt;&lt;br /&gt;    The _easiest_ way *THAT I* found to compile my module was to add it to the e_module tree from CVS. If you already have that proceed. Else, check http://www.get-e.org for instructions on how to grab E from CVS. You only need the e_module tree really. So this could be a quick start here. The password for anonymous is blank. Remember that.&lt;br /&gt;&lt;br /&gt;        $ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/enlightenment login&lt;br /&gt;        $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/enlightenment co e17/apps/e_modules&lt;br /&gt;&lt;br /&gt;These two commands will check out e_modules for you:&lt;br /&gt;&lt;br /&gt;The e_modules directory will contain this directory src/modules, where all the other modules exist. &lt;br /&gt;    a. Create a new directory called hello in the src/modules directory.&lt;br /&gt;    b. Type your source files in here. Traditionally, the files are named e_mod_main.c and e_mod_main.h (for any custom headers you want to define and function prototypes). Remember to include the correct header files, e.h for all the e stuff, and any other functions you use. (stdlib.h for malloc and free)&lt;br /&gt;    c. You'll need a file Makefile.am, that is used by autotools to generate Makefile.in which is used by configure to generate Makefile. (pretty twisted huh? Yup... if you don't understand it that is :) )&lt;br /&gt;    d. For that, you can copy the Makefile.am from the flame module directory, into your directory, and rename all instances of 'flame' to 'hello'&lt;br /&gt;    e. Some files are mentioned in that Makefile.am that you don't have currently, so i suggest that you copy module_icon.png from the flame module over as well. Don't wory, it won't break anything.&lt;br /&gt;    f. Now move into the parent directory (modules), and edit the Makefile.am there. add 'hello' to the end of the line that says SUBDIRS = . (this enables your module folder to be processed)&lt;br /&gt;    g. Step upto the e_modules root folder and edit configure.in. At the bottom of the file, there will be a set of lines that look like: src/modules/flame/Makefile. Add your line after the rest, but before the square brackets. Something like this should suffice: src/modules/hello/Makefile&lt;br /&gt;    h. Save and exit configure.in&lt;br /&gt;    i. If you fetched from CVS, this is the time to type ./autogen.sh in the e_modules root (if you downloaded a tarball, then just go ahead and type ./configure, specifying the neccessary options to configure/autogen.sh)&lt;br /&gt;    j.  go ahead and make with make install&lt;br /&gt;    k. load the module like you would load other modules&lt;br /&gt;    l. enable it. You should see your message boxen now :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, that's how far I got last night. Before I started delving into the E sources trying to understand more stuff, also asking questions on IRC. In the next log, i'll attempt to tackle persisting information, and maybe adding menus and or faces. I hope this helps someone out there :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112506629736670443?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112506629736670443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112506629736670443' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112506629736670443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112506629736670443'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/exploring-e17-modules-part-i.html' title='Exploring E17 Modules - Part I'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112489678610676934</id><published>2005-08-24T16:19:00.000+01:00</published><updated>2005-08-24T16:19:46.186+01:00</updated><title type='text'>Its Official GTalk Rox</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;:)&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112489678610676934?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112489678610676934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112489678610676934' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112489678610676934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112489678610676934'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/its-official-gtalk-rox.html' title='Its Official GTalk Rox'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112488372004394485</id><published>2005-08-24T12:42:00.000+01:00</published><updated>2005-08-24T12:42:00.050+01:00</updated><title type='text'>Threaded handlers in Pysystray</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;One of the important TODO's I have for pysystray is  making the menu item callbacks/handlers threaded. To acheive this, I thought of  the simlplest most unobstrusive way to add it, and I decided to go with  Decorators.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Uptill yesternite, I didn't really get Decorators,  but back at home, Stan (my flat mate) and I took a look at the PEP, and  suddently It was all clear.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I then wrote this simple decorator:&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; import thread&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; def run_threaded(func):&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def  wrapper(*args):&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  thread.start_new_thread(func, tuple(args))&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return  wrapper&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;To run any function in a seperate thread of  execution you'd do this:&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; import time #just for a sleeping  example :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; @run_threaded&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; def looper(x):&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; for i in xrange(0,  x): #gotta love generators :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  print i&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  time.sleep(2)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;now running:&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;gt;&amp;gt;&amp;gt; looper(10)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;will run it in a seperate thread of execution.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;With me finally understanding Decorators, I now  have just metaclasses left to understand before I can say I'm trully upto step  on python 2.4's features. But man... you just gotta love this language... Its  sooooo malleable.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I've added the run_threaded decorator to pysystray,  but i've not released this version yet... I'm going to refactor the files a bit  more, and try to attack one or two more todo's before i release  0.5.0.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Btw, If you're wondering why this is an important  addition... Currently, if a MenuItem callback/handler takes too long to  complete, it hangs the UI, and the pop-up menu no more shows up. This will also  be helpfull for the on_load event handler so it also doesn't lock up the  UI.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Oh.. btw, I'm thinking of using the Google API  message notifier for pysystray's notifier... If its possible. I'll start groking  the SDK next :)&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112488372004394485?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112488372004394485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112488372004394485' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112488372004394485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112488372004394485'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/threaded-handlers-in-pysystray.html' title='Threaded handlers in Pysystray'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112488240425706109</id><published>2005-08-24T12:20:00.000+01:00</published><updated>2005-08-24T12:20:04.300+01:00</updated><title type='text'>Google Rulez!!!!</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;OMG!!!!&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Yesterday, I installed Google Desktop 2, allowed it  to index Bolivia (my laptop), and was just tripping all over it, and was just  about to post praises, but guess what happened?&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Google Talk was released this morning, and DAMN!!!  I've fallen all over myself on this dual move.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Everyone at my office already crying 'Death to  Yahoo Chat' just by using Google Talk Beta!!! Its amazing, and the Voice Talk  feature just plain blew us all away. Yahoo Chat is toooooo darn heavy...  sheesh!!!&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The things that Google does are now bodering on  Magic ;), I mean, with Google Desktop, who needs that Start Menu anymore? Just  type the beginnings of your program name, and its finds it, you press enter and  'launcho!!!'&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Google Desktop also has notifiers for my Outlook  mails, Gmail, everything, and even an Outlook search plugin... which totally  rox!!! Ofcourse, i've disabled my Outlook notifier and i'm using Google's  Notifier now.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;My homepage is now set to Google Desktop's  Homepage, which is totally what I love.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;What's next? Oh well.... there's the SDK with  Python bindings :D, so I guess you can already percieve what's next... oh  yeah... baby... we're gonna hack the hell outta that SDK :D&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Oh.. and Google Talk is keeping with Open  standards, supporting XMPP/Jabber... cool...&amp;nbsp; Man, these guys are seriously  throwing open the field... now a major IM provider is behind Jabber, I wonder  how Yahoo and MSN respond to that... not that I care anyways :D&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Yahoo made a good move with konfabulator, as i'm  still going to keep my Konfabulator weather widget on my desktop, but hey...  that's about all i'm going to be using from them :D&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The world is getting more intersting... i'm just  wondering what next... Googlix? A Google Linux Distro? O.o... they have the  world by the balls already... and the world doesn't seem to mind ;)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Oh... boy.. exciting times :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112488240425706109?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112488240425706109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112488240425706109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112488240425706109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112488240425706109'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/google-rulez.html' title='Google Rulez!!!!'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112479486754480304</id><published>2005-08-23T12:01:00.000+01:00</published><updated>2005-08-23T12:01:07.560+01:00</updated><title type='text'>pysystray progress</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Yesterday, on request by some users, I changed the  licensing to BSD style. There is now a 0.4.2 release, which just contains that  change.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;This seems to be the least problematic license out  there, and I really don't have to wrangle my head around the specifics. I just  want to write code that others can use, period.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;There is now a mailing list: &lt;A  href="http://lists.sourceforge.net/lists/listinfo/pysystray-users"&gt;http://lists.sourceforge.net/lists/listinfo/pysystray-users&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;There is now a couple of things to do, cheif among  them is to make the menu items actions threaded, so that it doesn't lock up the  UI while long actions are being performed. That and Adding an on_load, event  that can be set to start a process once the App starts. Those are my highest  priority features before i start considering a version 1.0.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112479486754480304?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112479486754480304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112479486754480304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112479486754480304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112479486754480304'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/pysystray-progress.html' title='pysystray progress'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112470955753612468</id><published>2005-08-22T12:19:00.000+01:00</published><updated>2005-08-22T12:19:17.563+01:00</updated><title type='text'>pysystray on sourceforge</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I've been quiet for a while. Deliberately  too.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;In that time, quite a lot of things have happened,  all not too good, but some very exciting.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I'm currently hosting pysystray on sourceforge. The  homepage is at &lt;A  href="http://datavibe.net/~essiene/pysystray"&gt;http://datavibe.net/~essiene/pysystray&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I tried everything in my power to get the  sourceforge supplied webspace to host the homepage for the project, but nada....  it didn't work. So i gave up and went along with my webspace.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;So far, i've had some good feedback, and a major  project seems to want to use it, I just got mail from someone on their dev team  this morning, just clarifying the licensing :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Cool huh? Yeah... makes me feel good that pysystray  is usefull for someone afterall.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I'll update with what happens to that  :)&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112470955753612468?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112470955753612468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112470955753612468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112470955753612468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112470955753612468'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/pysystray-on-sourceforge.html' title='pysystray on sourceforge'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112325167136339832</id><published>2005-08-05T14:56:00.000+01:00</published><updated>2005-08-05T15:21:11.373+01:00</updated><title type='text'>more EET progress, update on D Xlib</title><content type='html'>Got some more lines of code in yesternite. Moving a bit slowly... i have this project at work that is tasking me out.&lt;br /&gt;&lt;br /&gt;Anyways, i've added support for image data to the EET File. In the course of this, i had to create two struct ImageHeader, and Image, to make it all cleaner to use. Image may become a class with its own methods in a future incarnation/refactoring cycle. I can smell it already, but i'll delay the decision untill its obvious. Next come the DataDescriptor stuff i've been avoiding :D. Once i'm able to do those, i'll give myself an ECCTD certification. What's ECCTD? Duhhh!!! Essien Certified C To D Porter... DOH!!! :)&lt;br /&gt;&lt;br /&gt;On the D Xlib front. Dejan (http://dejan.lekic.org), has finally gotten around to trying out what i've done so far, and declared we're good to go for the next step. Incidentally, we've decided to put a chill pill on Directly making Xlib D, OOP. What i think is that it will happen when we start the next phase... uhh.. yeah... This was just a precursor to another project. Porting DFL to Linux (http://www.dprogramming.com/dfl.php). &lt;br /&gt;&lt;br /&gt;Just incase you haven't yet figured it out... that's how the XLib to D port came up :). Vathix, who is the author of DFL would want to have DFL on Linux, so Dejan and I are helping out, and in the process, hopefully filling a great need.&lt;br /&gt;&lt;br /&gt;Anyways, we're ready to start moving on DFL, and we're going to be modelling it after dotGNU's Xsharp (A from scratch implementation of the .NET System.Windows.Forms functionality for the dotGNU project).&lt;br /&gt;&lt;br /&gt;Dejan should setup subversion for Xlib D, and we'll be on our way... lets see how much work we can punch in this weekend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112325167136339832?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112325167136339832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112325167136339832' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112325167136339832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112325167136339832'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/more-eet-progress-update-on-d-xlib.html' title='more EET progress, update on D Xlib'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112324798430463671</id><published>2005-08-05T14:09:00.000+01:00</published><updated>2005-08-05T14:41:28.800+01:00</updated><title type='text'>exml  : first feelings...</title><content type='html'>First of all Libxml2 is a great library. I truly respect it.&lt;br /&gt;&lt;br /&gt;Ok… that said, the C API … it has too many gotcha’s… sheesh!!!&lt;br /&gt;&lt;br /&gt;Lets say I have a file ‘root.xml’ that looks like this&lt;br /&gt;&lt;br /&gt;&amp;lt;root&gt;&lt;br /&gt; &amp;lt;node1&gt;&lt;br /&gt;  &amp;lt;node2&gt;&lt;br /&gt;   foo&lt;br /&gt;  &amp;lt;/node2&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;node2&gt;&lt;br /&gt;   bar&lt;br /&gt;  &amp;lt;/node2&gt;&lt;br /&gt; &amp;lt;/node1&gt;&lt;br /&gt;&amp;lt;/root&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Using libxml2 directly, I can get a structure representing the whole document with&lt;br /&gt;&lt;br /&gt;xmlDocPtr doc = xmlParseFile(“root.xml”);&lt;br /&gt;&lt;br /&gt;To get the root node:&lt;br /&gt;&lt;br /&gt;xmlNodePtr node = xmlDocGetRootElement(doc);&lt;br /&gt;&lt;br /&gt;currently, node will contain information about the &amp;lt;root&gt; level. &lt;br /&gt;&lt;br /&gt;If I try to printf() node-&gt;name, it correctly reports ‘root’. Nil Problemo.&lt;br /&gt;&lt;br /&gt;My problem arises when I start trying to walk the tree. xmlNodePtr has a member called children,&lt;br /&gt;And its supposed to return the children node. Anyways… if I do:&lt;br /&gt;&lt;br /&gt;node = node-&gt;children;&lt;br /&gt;&lt;br /&gt;I expect it to now be pointing at &amp;lt;node1&gt; right? Well, its not… instead when I try to printf() node-&gt;name at this point,&lt;br /&gt;It gives me ‘text’.&lt;br /&gt;&lt;br /&gt;Ok… before some libxml2 guru crucifies me, I’m sure there’s something I’ve not read the documentation for, but hey… that’s the behaviour I expect… or am I missing something?&lt;br /&gt;Don’t answer… but I guess I am. I kept trying to play with this for a couple of hrs, trying to recursively walk thru any document… and this behaviour kept tripping me.&lt;br /&gt;&lt;br /&gt;Anyways, I just thought.. hmm… what is in exml? Afterall what do I have to loose? I have the entire enlightenment cvs tree on my system anyways…. So away I went.&lt;br /&gt;&lt;br /&gt;Using exml, I was pleasantly surprised at how it matched up with my thinking and my expectations (I belive my expectations of API’s are usually very high).&lt;br /&gt;&lt;br /&gt;Anyways…. To get the entire document with exml I do:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EXML* doc = exml_new();&lt;br /&gt;exml_file_read(doc, “root.xml”);&lt;br /&gt;&lt;br /&gt;Almost same as libxml2, and a bit more verbose I admit. I would have preferred it being structured after a constructor paradigm.&lt;br /&gt;&lt;br /&gt;Now, I can query the current point that the document is at. Via functions… so if I do:&lt;br /&gt;&lt;br /&gt;printf(“tag = %s\nvalue = %s\n”, exml_tag_get(doc), exml_value_get(doc));&lt;br /&gt;&lt;br /&gt;nice and easy… ofcourse… you can still an object that refers to the current node, by:&lt;br /&gt;&lt;br /&gt;EXML_Node* node = exml_get(doc);&lt;br /&gt;&lt;br /&gt;And the previous can be done with:&lt;br /&gt;&lt;br /&gt;printf(“tag = %s\nvalue = %s\n”, node-&gt;tag, node-&gt;value);&lt;br /&gt;&lt;br /&gt;So far, nothing really different.&lt;br /&gt;&lt;br /&gt;The tripping part is if I want to get the &amp;lt;node1&gt; part of the document. EXML has very handy functions for clearly moving around the document unambiguously. (I don’t know if libxml2 has these as well, but I didn’t wait to find out once I discovered exml’s ease of use)&lt;br /&gt;&lt;br /&gt;exml_down(), exml_up(), exml_next(), exml_next_nomove(), exml_goto(), exml_goto_top();&lt;br /&gt;&lt;br /&gt;each of these move you in a specific direction without suprising results, and return the value of the next node tag as a char*, or NULL if there is no next node.&lt;br /&gt;&lt;br /&gt;Still trying to drill down to ‘foo’ and ‘bar’ from our xml document, I would do this:&lt;br /&gt;&lt;br /&gt;//I’m not checking for errors or freeing memory as I’m going, in real code, I’d do these.&lt;br /&gt;&lt;br /&gt;EXML* doc = exml_new();&lt;br /&gt;exml_file_read(doc, “root.xml”); //right now we have the whole document, and we’re at &amp;lt;root&gt;&lt;br /&gt;exml_down(doc); //we’re now at &amp;lt;node1&gt;&lt;br /&gt;exml_down(doc); //we’re now at &amp;lt;node2&gt; so we can read and get ‘foo’&lt;br /&gt;&lt;br /&gt;printf(“Expecting ‘foo’, got : ‘%s’\n”, exml_value_get(doc));&lt;br /&gt;&lt;br /&gt;exml_next(doc); //we’re now at the second &amp;lt;node2&gt; so we can read and get ‘bar’&lt;br /&gt;&lt;br /&gt;printf(“Expecting ‘bar’, got : ‘%s’\n”, exml_value_get(doc));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;well…that’s it basically… that’s just it.&lt;br /&gt;&lt;br /&gt;All in all EXML.h is just 81 lines of defs, white space included. Also, I didn’t need any primer to figure out how to use this library. I just looked at the header file and it was clear (Rule Of Least Surprise).&lt;br /&gt;&lt;br /&gt;To my lazy mind… this is currently THE xml C library for me now. The only thing for some other folks may be that it depends on Ecore, another part of the EFL, which actually depends on Evas and EET as well, for me tho… I already depend on the EFL, so I don’t mind one bit.&lt;br /&gt;&lt;br /&gt;Did I remember to mention that its built ontop of libxml? Yup… it’s a very nice piece of work… building on the solid layer that is libxml2, but not having all the gotcha’s etc.&lt;br /&gt;&lt;br /&gt;Ofcourse, there’s no inherent support (YET) for XPATH, XSLT, etc, and all the goodies that libxml2 already has, still, it works so far, and in less than 15 minutes after looking at the header file for the first time, I already had the weather.com parsing library upto the point where I can inteprete simple search queries… &lt;br /&gt;&lt;br /&gt;Nice? You bet!!!&lt;br /&gt;&lt;br /&gt;Essien, out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112324798430463671?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112324798430463671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112324798430463671' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112324798430463671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112324798430463671'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/exml-first-feelings.html' title='exml  : first feelings...'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112324665527769891</id><published>2005-08-05T13:57:00.000+01:00</published><updated>2005-08-05T13:57:35.300+01:00</updated><title type='text'>Ajax Paper</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"&gt;http://www.adaptivepath.com/publications/essays/archives/000385.php&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;This seems to be one of the earliest and authoritative on the &lt;st1:City w:st="on"&gt;&lt;st1:place w:st="on"&gt;AJAX&lt;/st1:place&gt;&lt;/st1:City&gt; phenomenon. Good read.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112324665527769891?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112324665527769891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112324665527769891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112324665527769891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112324665527769891'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/ajax-paper.html' title='Ajax Paper'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112315864544612473</id><published>2005-08-04T13:30:00.000+01:00</published><updated>2005-08-04T13:30:45.453+01:00</updated><title type='text'>C Xml Processing</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Started trying to grok XML Processing in C, and so far, I&amp;#8217;m learning libxml2. Seems interesting, though really painfull initially ( I mean, coming from ElementTree and the links of Amara that are available in Python, libxml2 C Api can be very primitive). But now, its not looking that bad at all, infact, I can say I&amp;#8217;m enjoying myself&amp;#8230; currently I&amp;#8217;m turning my attention to using it to grab information from the weather.com webservice (I expect to have a libweathercom from that experiment). Then ofcourse, there is the conversion to D (if it hasn&amp;#8217;t already been done)&amp;#8230; who says life is boring? :)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien.. out!!!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112315864544612473?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112315864544612473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112315864544612473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112315864544612473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112315864544612473'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/c-xml-processing.html' title='C Xml Processing'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112315844660628703</id><published>2005-08-04T13:27:00.000+01:00</published><updated>2005-08-04T13:27:26.640+01:00</updated><title type='text'>EET progress</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I&amp;#8217;ve moved over the hoop that was causing me grief in my EET File class. Its done now, and unittested. I&amp;#8217;ve also discovered that apparently a file can&amp;#8217;t be opened for Appending&amp;#8230; that&amp;#8217;s somewhat odd, there are some File Mode flags for READ, WRITE, READ_WRITE.I&amp;#8217;ve not been able to use READ_WRITE to successfully open a file. Tired asking around #edevelop. No one answered authoritatively, but &amp;#8216;Codewarrior&amp;#8217; suggested I may be right. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways, that won&amp;#8217;t stop me from moving ahead.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;There are some tricky contstructs still infront, so, my path for the rest of the week is cut out for me I guess. Interesting? YOU&amp;nbsp; BET!!! :) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112315844660628703?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112315844660628703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112315844660628703' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112315844660628703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112315844660628703'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/eet-progress.html' title='EET progress'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112306544651635907</id><published>2005-08-03T11:37:00.000+01:00</published><updated>2005-08-03T11:37:26.546+01:00</updated><title type='text'>Xlib Classes for D</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Yesternite, I got around to start encapsulating Xlib C functionality into D Classes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Still working from the simple line drawing example, I was able to pick out the necessary layers for a basic Xlib application, and have translated these to classes. So far, I had to create there to work:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ol style='margin-top:0in' start=1 type=1&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Display&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;ol style='margin-top:0in' start=1 type=a&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;This seems to be the basis of       what you end up seeing. I&amp;#8217;m still reading up on what it really is,       but I think it&amp;#8217;s the basic abstraction of what the XServer actually       controls.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;/ol&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Screen&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;ol style='margin-top:0in' start=1 type=a&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;For my program to run, I needed       to get the current BlackPixel, WhitePixel values from the DefaultScreen       of the Display. So my display class allows me access to the Screens (encapsulated       as the Screen class)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;/ol&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;Window&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;ol style='margin-top:0in' start=1 type=a&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;Now, those little boxen you       see on you monitor. The ones with the close buttons, etc, are actually       the windows. Actually I got to find out that even buttons, scrollbars,       etc, are all windows under Xlib.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;To create me a window I need a       parent, and the display has a DefaultRootWindow, which I use as the       parent for the top level window of my little line drawing app. Display       class has a property, DefaultRoowWindow (encapsulated as a Window class)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;Also windows are not visible       or usable until after successfully Mapped by X.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;/ol&gt;  &lt;li class=MsoNormal style='mso-list:l0 level1 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span      style='font-size:10.0pt;font-family:Arial'&gt;GC&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;ol style='margin-top:0in' start=1 type=a&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;This one confused me       initially, as I first thought it was another surface encapsulation.       Reading the Xlib programming manual in the wee hours of this morning,       cleared this up for me.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;A GC (Graphic Context), is an       encapsulated resource that holds information about drawing primitives,       for example, line width, line style, foreground color, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;   &lt;li class=MsoNormal style='mso-list:l0 level2 lfo1'&gt;&lt;font size=2 face=Arial&gt;&lt;span       style='font-size:10.0pt;font-family:Arial'&gt;To draw a line, I create a       simple GC from the Window, and call its DrawLine method.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;  &lt;/ol&gt; &lt;/ol&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Yesternite, I was a bit lazy about encapsulating the Events immidietly, actually I felt that my initial understanding of the Events wasn&amp;#8217;t very good, and I may not do a good job encapsulating, so I left them raw as they are. I&amp;#8217;ll read more on them tonite, and do some more work. Once I have the Events also encapsulated, I&amp;#8217;ll proceed to write the various unittests for the small functionality present in these classes, and I think I&amp;#8217;ll do a File refactoring, it seems those classes are gonna get really big, I don&amp;#8217;t want them all in the same single file.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Once I&amp;#8217;m done with the UnitTests tho, I&amp;#8217;ll move on to the second example program, and add features to the classes to get it to run.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Btw, I didn&amp;#8217;t get to touch the EFL to D port last nite&amp;#8230; I have some design decisions to make on EET, and I&amp;#8217;m thinking I&amp;#8217;ll take the very raw and straightforward way forward for now&amp;#8230; when I&amp;#8217;m more used to the class, I&amp;#8217;ll come back and refactor.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien, out!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112306544651635907?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112306544651635907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112306544651635907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112306544651635907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112306544651635907'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/xlib-classes-for-d.html' title='Xlib Classes for D'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112289742236691868</id><published>2005-08-01T12:21:00.000+01:00</published><updated>2005-08-01T12:57:02.386+01:00</updated><title type='text'>Yahoo! Widgets</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1612/783/1600/maze_konfab1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/maze_konfab1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You know... ever since Google took the world by storm (uuhh... make that by search... or is it by searching for a storm? :) ), they've left A LOT of competitors behind... and not just in the dust... but in the Sand Dunes.&lt;br /&gt;&lt;br /&gt;But i think i can say that Yahoo has been a worthy competitor... they keep responding well, (after all Yahoo's and Google's founders are all Stanford products right?).&lt;br /&gt;&lt;br /&gt;Anyways, that aside, Yahoo has done something very cool... they acquired Konfabulator and set it free. I used to use Konfabulator pre 2.0 on my old laptop (wendy), and used to utter some PG Expletives anytime the expiration notice showed up on my box. When i got my new laptop (bolivia), i swore they wouldn't see my boxen anymore... no matter how cool they were (and they're ooooooo sooooo cool). Well a couple of weeks ago, i found out that Yahoo has acquired them, and set it free. So i can USE IT WITHOUT paying (call me cheap-arse, cheap-stake... whateva... that's your problem)&lt;br /&gt;&lt;br /&gt;What is Konfabulator? Uhh... check out: http://www.konfabulator.com&lt;br /&gt;&lt;br /&gt;what can you do with it?&lt;br /&gt;&lt;br /&gt;That screenshot is worth a thousand how-to's (but you don't really need a thousand how-tos on generating a screenshot) [that statement doesn't mean anything, so please don't try to make any meaning out of it:) ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112289742236691868?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112289742236691868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112289742236691868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112289742236691868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112289742236691868'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/yahoo-widgets.html' title='Yahoo! Widgets'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112289113167110871</id><published>2005-08-01T11:12:00.000+01:00</published><updated>2005-08-01T11:12:11.710+01:00</updated><title type='text'>Weekend Hacks</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I had an interesting and fun filled weekend...  really.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;First,&amp;nbsp;I completed the first stage of the Xlib  D port. And i have the first sample D Xlib program that draws a line to the  screen, waits 10 secs and exits.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;This is just the first stage.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The next stage involves making the library *FEEL*  OOP and feel like D instead of C. This will involve a continous process of  introducing classes, etc, to encapsulate most of the pointers flying  around.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The hard part is done anyways, this part is a  matter of&amp;nbsp; continous integration, and good judgement. I'm starting that  this week, and I'll have to be studying core Xlib programming to understand the  application layering, so i can do at least a half decent job. No rushes  here.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I'll make these available on my download area  within the week.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;On the D EFL port, i've been creating the D layer  for EET, and ran into some pointer related issues, as i try to wrap up the  function calls into D Classes, but along the way, i learnt more about D's  invariants, pre and post conditionals (Contract Programming), this stuff is VERY  VERY COOL. When used properly, it really reduces bugs, and helps find bugs  faster, combine this with D's inbuilt UnitTesting, and i really don't know why i  should use any other language for Midlevel Application Development (Low level is  owned by C, and High Level is owned by Dynamic Languages like Python). If you  really feel the need for speed... don't take a cup of Java, or try to Sharpen  your C, no no no no no, just take the next alphabet... D. :)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Needless to say, i felt pretty accomplished this  weekend, and rewarded my self with a nice move.... SIN CITY... the movie is  sorta weird... but its really cool, and my, was Mickey Rourke, Marv? That guy  was my main guy in the movie.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Ok.... off to work now  :)&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112289113167110871?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112289113167110871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112289113167110871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112289113167110871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112289113167110871'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/08/weekend-hacks.html' title='Weekend Hacks'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112254894417263980</id><published>2005-07-28T12:09:00.000+01:00</published><updated>2005-07-28T12:09:04.206+01:00</updated><title type='text'>The Birth Of Google</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://www.wired.com/wired/archive/13.08/battelle.html"&gt;http://www.wired.com/wired/archive/13.08/battelle.html&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Very interesting read.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112254894417263980?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112254894417263980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112254894417263980' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112254894417263980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112254894417263980'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/birth-of-google.html' title='The Birth Of Google'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112246420592066140</id><published>2005-07-27T12:36:00.000+01:00</published><updated>2005-07-27T12:36:45.926+01:00</updated><title type='text'>More D port progress</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;efl.edb&amp;nbsp;is now complete for a first version.  All natice Edb.h funcionality has been wrapped up with D functions/methods to  give them a D feel.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I've started on the Eet.h. This also shouldn't take  time. I'm going to avoid Evas for now, and instead probably focus on all the  smaller libs, Epeg, Epsilon, Imlib (not soo small), Embryo. If i survive thru  all these, i think i'll be in the right frame of mind to tackle the big boys,  Evas, Ecore, Edje, Ewl.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Something is happening though as i'm doing all  this. EFL is getting very clear. There is this thought of a Python port in my  mind too. If I last thru all these a Python port will be very feasible and  clearer too.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;On the Xlib front. I'm continuing with the #define  constants. I should be thru tonite or tmrw, then enter a thourough testing phase  to see if i can transliterate C programs to D using Xlib.d; Once that is  successfull, then i'll start to wrap the functions into D classes,  etc.&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112246420592066140?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112246420592066140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112246420592066140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112246420592066140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112246420592066140'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/more-d-port-progress.html' title='More D port progress'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112246289705989449</id><published>2005-07-27T12:14:00.000+01:00</published><updated>2005-07-27T12:14:57.096+01:00</updated><title type='text'>Traveller's Log 1</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;The sacred book of hacking says: "Every coder worth  his modules, should have time that is *his* own to spend mashing at the stuff  that interests him. That is the only path to true greatness"&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;There are they who wander in this path, but get  sidetracked by the Great Coperate (tm). It is rumoured that some of them have  been seen in the dungeons of the Great W$ debugging the Legendary Beast... Ai  EE, that accepts malformed HTML, and spits your CSS back in your face. Needless  to say, great is their misery.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Consider instead, J. R. Hacker of the Noob, of the  order of the Freshman, of the order of the Unemployed. He it is said of, to have  followed the path of X. It is said he was visited in a dream by the GNOME, the  great protector of Gtk. Weather it be true, we shall never know. But we know it  was he who initiated the GNOME Project. Today, he has been granted the venerable  post of VP at the Wovell.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Thus spake the great master Google and I listened  to his result pages. From them I have found the path to the SourceForge. I have  learned to drink from its great repository with the cup of CVS and SVN. Master  Google has thought me the rudimentary yet arkane art of building using the  secret autotools and raw Makefiles.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I have learned to sit at the feet of other students  of Great Master Google who meet at the IRC. Great scholars of the order of the  #c, #python, #bash, #linux, #edevelop, #archlinux, and a great many other sects  that are more numerous than any one human can possibly know. But the Great  Master Google knows them all.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;In the hallways of the #c, i have learnt the secret  arts of glibc, and devoted myself the the art of libdl. I have learned to grok  the PEPs of the Python dot Org to understand what the Masters say in #python.  Now i understand the way of the List-Comprehension, and I can swim through any  Generator Expression. There is still the secrets of the Meta-Classes and  Decorators to be mastered though. But i have found that sitting under the  ElementTree, one can feel the Zen of XML.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Finally I also have started my journey thru the  desert of OSS. That great Oximorous Multiverse. My sword in hand, is built from  Raw Linux found in the KISS valleys of &lt;A  href="http://www.archlinux.org"&gt;http://www.archlinux.org&lt;/A&gt;.&amp;nbsp;I have  extended the blade and stuck a custom -mm kernel in the handle. I carry about a  small Vim anvil in case i need to craft any C, D, Python, Bash tools.&amp;nbsp;My  backpack contains additional PHP and&amp;nbsp;Perl hammers&amp;nbsp;among a lot of other  contraptions that master Google has given to me over the years. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;My quest&amp;nbsp;I know not where it will lead me, but  I am intent on finding that path to true greatness.&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112246289705989449?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112246289705989449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112246289705989449' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112246289705989449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112246289705989449'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/travellers-log-1.html' title='Traveller&apos;s Log 1'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112237712987012689</id><published>2005-07-26T12:21:00.000+01:00</published><updated>2005-07-26T12:25:29.873+01:00</updated><title type='text'>Edb.h to Edb.d</title><content type='html'>Anyway, just to Test my understanding of the .h to .d conversion process thoroughly, yesternite, i basically started and finished porting Edb (from the enlightenment EFL) to D. And you know what? I'm extremely IMPRESSED with those libraries. I was expecting to have lots of #defines to copy across, but NO NO NO NO NO!!! &lt;br /&gt;&lt;br /&gt;Raster and guys are using really good C programming Semantics, with little used but beneficial features of C. Instead of using #define foo baa, like everyone else does, they use C's enums... And looking thru the header files, they read like a cool users manual. WOW!!! I'll tell you something... that library is WELL designed. &lt;br /&gt;&lt;br /&gt;also, i've wrapped up the Edb into an Edb class, to make it feel more like a D programmer would expect. and the Edb class is ready as a version 0.0.0.0.1 :)&lt;br /&gt;&lt;br /&gt;What is left are three functions:&lt;br /&gt;&lt;br /&gt;char **e_db_dump_multi_field( char *file,  char *file2, int *num_ret);&lt;br /&gt;char **e_db_dump_key_list( char *file, int *num_ret);&lt;br /&gt;char **e_db_match_keys(E_DB_File *db,  char *pattern, int *num_ret);&lt;br /&gt;&lt;br /&gt;I have to make these module level functions, and give them D calling semantics, and encapsulate away the raw pointers.&lt;br /&gt;&lt;br /&gt;And oh.. here's a sample program that worked for me yesternite:&lt;br /&gt;&lt;br /&gt;/*-------------------------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;import std.stdio;&lt;br /&gt;import efl.edb;&lt;br /&gt;&lt;br /&gt;int main(char[][] args)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;Edb db = new Edb("afile.edb");&lt;br /&gt;&lt;br /&gt;db.set("Magnus_i", 55);&lt;br /&gt;db.set("Magnus_f", 55.59);&lt;br /&gt;db.set("Magnus_s", "fifty-five");&lt;br /&gt;&lt;br /&gt;db.close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Edb db2 = new Edb("afile.edb");&lt;br /&gt;&lt;br /&gt;int ival = db2.get_int("Magnus_i");&lt;br /&gt;float fval = db2.get_float("Magnus_f");&lt;br /&gt;char[] sval = db2.get_string("Magnus_s");&lt;br /&gt;&lt;br /&gt;db2.close();&lt;br /&gt;&lt;br /&gt;writefln("Magnus = %d\t%f\t%s", ival, fval, sval);&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*-------------------------------------------------------------------*/&lt;br /&gt;&lt;br /&gt;Oh... and i forgot to mention... since D has inherent support for unittests, the Edb.d module contains its own unittests.&lt;br /&gt;&lt;br /&gt;Why am i doing this? I'm learning... Duh!!!&lt;br /&gt;&lt;br /&gt;This means to me that i totally understand the C.h to D.d conversion process, and hey... its fun. &lt;br /&gt;&lt;br /&gt;Once i totally wrap up the C parts of Xlib.h, then I can start giving them D objects to make D Xlib programming more fun.&lt;br /&gt;&lt;br /&gt;Essien... out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112237712987012689?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112237712987012689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112237712987012689' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112237712987012689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112237712987012689'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/edbh-to-edbd.html' title='Edb.h to Edb.d'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112237665816531720</id><published>2005-07-26T11:58:00.000+01:00</published><updated>2005-07-26T12:17:38.183+01:00</updated><title type='text'>Xlib, C to D port: Third Iteration</title><content type='html'>O blimey!&lt;br /&gt;&lt;br /&gt;When i said i would probably start again one more time on the Xlib C to D port... i sort of felt it. I'm not so sure i meant it, but i had to do exactly that this weekend.&lt;br /&gt;&lt;br /&gt;When the Mythical Man Month says, plan to start from scratch at least once... its very true. Things get clearer if you not scared of starting over at least once. Infact... just plan for it.&lt;br /&gt;&lt;br /&gt;I completed the second iteration of Xlib and had Xmd.d, X.d and Xlib.d as at Saturday, in the wee hours of morning. Then i tried to port a simple Xlib C program that draws a line to its D version. It was then my suspicions of gcc -E were confirmed. Most of the convenience macros and #define constructs were missing. The convenience macros are not really a problem, since D semantics will mean having to rely less on such trickery, but the #define constants are really important, as they are mostly values that are unique to a function etc.&lt;br /&gt;&lt;br /&gt;Thus i decided to look at h2d at http://www.dsource.org/projects/h2d/&lt;br /&gt;&lt;br /&gt;I tried it out, and my... it made my work even easier, and converted all the structs, typedefs, types for me. phew!!! time shaver, but still, the script it uses 'deeify' is still subject to the gcc -E problem, since it still employs it.&lt;br /&gt;&lt;br /&gt;My third iteration, involved:&lt;br /&gt;&lt;br /&gt;1. Using h2d's 'deeify' to run convert the .h file to a .d file.&lt;br /&gt;2. Visually inspecting the .h file and copying over all the #define constants that have been left out by 'deeify'&lt;br /&gt;3. convert the copied over #defines to either const declarations or enums (this part is still hard boring work)&lt;br /&gt;&lt;br /&gt;Using this, i quickly went thru Xmd.h and X.d again, and they are ready in their first version. The last is Xlib.d, which has quite a number of boring constants to work on. I'm going to probably whip up a script to do those. But now that everything is *really* clear, i'm making progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112237665816531720?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112237665816531720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112237665816531720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112237665816531720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112237665816531720'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/xlib-c-to-d-port-third-iteration.html' title='Xlib, C to D port: Third Iteration'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112203022893042440</id><published>2005-07-22T11:59:00.000+01:00</published><updated>2005-07-22T12:03:48.940+01:00</updated><title type='text'>Lazzyness is not a bad habit! Slothfullness is :)</title><content type='html'>So what’s the difference? &lt;br /&gt;&lt;br /&gt;Hehe… in my world, I classify Laziness as the unwillingness to do more work than you feel you need to do. Slothfulness, in this same world of mine, is the unwillingness to do work that must be done.&lt;br /&gt;&lt;br /&gt;You still don’t see the difference? Lemme explain. I’m slothfull about my Laundry (trust me… you don’t want to stick your nose near my laundry bad :) ), but I’m totally Lazy about Programming.&lt;br /&gt;&lt;br /&gt;Porting XLib to D, is a case in point. From my limited understanding of the conversion process, I jumped in, took one look at Xlib.h, saw that it included X.h, and Xmd.h, and I decided to start by converting X.h to X.d&lt;br /&gt;&lt;br /&gt;All well, and good, till I started doing the actual conversion. I started seriously replacing complex #defines, #ifndefs, etc, with version() statements, etc, and got stomped on a number of them, put TODO: markers on them for a next iteration, and tried to move as fast as I could. In the first two days, I completely had X.h converted to X.d (a whooping 3000+ line file!!!). That proves I’m not slothfull by my definition. &lt;br /&gt;&lt;br /&gt;Well, next was Xmd.h to Xmd.d, and I started… full of energy and enthusiasm… and then I realized… heck… at this rate… I’ll NEVER finish this stuff!!! How did I come to that realization? Well, all this files are VERY LARGE. Then my lazy side kicked it… my hands just REFUSED to move on the keyboard again, and I started thinking… there MUST be something I’m not doing correctly. I considered writing a bash or python script to take the drudgery away, but then there were still so many special cases, and my RegEx is not FBI class RegEx (whatever FBI class RegEx is :) ).&lt;br /&gt;&lt;br /&gt;It was then I started looking closely at the docs and found that there was  a recommended step I was indeed missing out.&lt;br /&gt;&lt;br /&gt;There is a recommendation to run the Preprocessor before conversion actually starts.. hmm… how did I ever miss that? Will it simplify my work? I went to find out.&lt;br /&gt;&lt;br /&gt;I ran gcc –E on X.h and OMG!!! The result was less than 20 lines of code… I immediately began to suspect the process.&lt;br /&gt;I repeated this on Xmd.h and DAMN! The same thing… all the code was disappearing, and some files like Xosdefs.h turned up totally empty. I popped into irc, asked around a bit, and someone said I may have empty files if I’m not referencing anything from those files.&lt;br /&gt;&lt;br /&gt;Keeping that in mind, I reapeted that on Xlib.h, which pulled in code from X.h and Xmd.h, and I compared the sections it pulled in, and they were the same as the ones I got when I ran gcc –E on the independent files. Also, Xlib.h wasn’t empty like the other files, but it was just left with struct defs and typedefs… &lt;br /&gt;&lt;br /&gt;Wow!!! That is a whole lot less work than my previous approach. So I’ve already clobbered the old sources, and started again. I’m almost certain I may start afresh at least once more as things get clearer, but it’s a whole lot more clearer. What I want to do is to download digital mars C compiler and use that to run the Preproccessor stage and compare the two outputs.&lt;br /&gt;&lt;br /&gt;Currently my work is cut out for me, I’ve written a quick and dirty bash script, that does most of the typedef replacements that are obvious, and the type mappings (unsigned long long -&gt; ulong for instance).&lt;br /&gt;&lt;br /&gt;I’m sure I’ll be able to test my example code this weekend, so I’m still shooting for that.&lt;br /&gt;&lt;br /&gt;Back to laziness and sloth. I was lazy about continuing, but not slothfull about doing the necessary research. Also, my continuing along with my HARD WORK approach, will seem to prove that I’m not lazy and not slothfull. The truth is, once I refuse to AT LEAST CONFIRM a suspicion, then I’m slothfull. This is probably one of the key factors that separate smart hackers from the regular drone next desk :).&lt;br /&gt;&lt;br /&gt;Maybe I’m not your uberKewl smart hacker, but hey…I’m MY UberKewl smart hacker :)&lt;br /&gt;&lt;br /&gt;Essien… Out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112203022893042440?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112203022893042440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112203022893042440' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112203022893042440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112203022893042440'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/lazzyness-is-not-bad-habit.html' title='Lazzyness is not a bad habit! Slothfullness is :)'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112193563907154765</id><published>2005-07-21T09:43:00.000+01:00</published><updated>2005-07-21T09:47:19.076+01:00</updated><title type='text'>XLib D port, Jython BlackBerry apps</title><content type='html'>Progress on porting XLib to D, took a minor step forward yesternite.&lt;br /&gt;&lt;br /&gt;I've completed X.h -&gt; X.d conversion, and dmd reports no errors. That's a little victory. Now, X.h actually includes Xmd.h, which has some *wicked* preprocessor defs, like:&lt;br /&gt;&lt;br /&gt;#if defined (_LP64) ||     defined(__alpha) || defined(__alpha__) ||     defined(__ia64__) || defined(ia64) ||     defined(__sparc64__) ||     defined(__s390x__) ||     (defined(__hppa__) &amp;&amp; defined(__LP64__)) ||     defined(__amd64__) || defined(amd64) ||     defined(__powerpc64__) ||     (defined(sgi) &amp;&amp; (_MIPS_SZLONG == 64))&lt;br /&gt;#define LONG64    /* 32/64-bit architecture */&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;My translation to D, looks so far like this:&lt;br /&gt;&lt;br /&gt;version( _LP64 || __alpha || __alpha__ || __ia64__ || ia64   __sparc64__ || __s390x__ || __hppa__ || __LP64__   __amd64__ || amd64 || __powerpc64__ ) {&lt;br /&gt;&lt;br /&gt; version = LONG64;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Ofcourse, you'll note that i don't have any representation for the compound &amp;&amp; that is or'd into that expression..:&lt;br /&gt;&lt;br /&gt;|| (defined(sgi) &amp;&amp; (_MIPS_SZLONG == 64)&lt;br /&gt;&lt;br /&gt;I'm not sure how to add that to the version() construct. What is really stomping me, is how to cater for the _MIPS_SZLONG == 64, since i can't specify expressions in a version() conditional. Hmmm....&lt;br /&gt;&lt;br /&gt;Anyone with any ideas? I'm still thinking about this. I'll continue tonite, and i'll move on to other parts... everything doesn't have to be picture perfect for a first release, which will happen when i'm able to run the tutorial at:&lt;br /&gt;&lt;br /&gt;http://tronche.com/gui/x/xlib-tutorial&lt;br /&gt;&lt;br /&gt;I won't need those defs to get it work on my box, which is a humble AMD Anthlon64 :), but we'll need them eventually if we're really serious about portability.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Btw, yesterday, i was also trying to get a Jython BlackBerry sample to build, and suprisingly, i got quite far, only to be stomped by a preverification error. java.lang.NoClassDefFoundError. I used jythonc to build a .java file out of my .py program, and proceeded to use rapc.exe (RIM's custom tool for creating .cod files, needed by the BlackBerry).&lt;br /&gt;&lt;br /&gt;rapx.exe actually calls another program preverify.exe, and then calls a java compiler, then does some funky stuff. My problem, happened at the preverification stage. it was preverifying the jython.jar archive and borked. The good news is, i think its just a path thing i have to sort out, as when i also tried to preverify net_rim_api.jar, without using the IDE, it also borked on the same error.&lt;br /&gt;&lt;br /&gt;I'll give this another shot sometime tonite. If this woiks, this WILL be SOOOOOOO cool... my next step will be generic MIDP and CLDC apps in jython! WHOOOOO!!!&lt;br /&gt;&lt;br /&gt;Ok... Essien... out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112193563907154765?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112193563907154765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112193563907154765' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112193563907154765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112193563907154765'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/xlib-d-port-jython-blackberry-apps.html' title='XLib D port, Jython BlackBerry apps'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112185975122711875</id><published>2005-07-20T12:42:00.000+01:00</published><updated>2005-07-20T12:42:31.260+01:00</updated><title type='text'>Revisiting D</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;After not doing active D coding in a while, I&amp;#8217;ve been revisiting it gently in the past weeks. What slowed me of initially was there was nothing I was doing with it productively.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;For my scripting and generic one-off projects that I see no reason why I need to compile, I use the venerable Python, and at work, I work with C#. And back at the shell, I still use serious Bash scripting. So apart from the proof of concept D sprint that I set for myself, I really didn&amp;#8217;t have any project to use it for.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Well, it seems that is going to change. Someone on (Dejan@irc.freenode.net#d), suggested the creator of DFL (&lt;a href="mailto:Vathix@irc.freenode.net#d"&gt;Vathix@irc.freenode.net#d&lt;/a&gt;), do a Linux/Unix &lt;st1:place w:st="on"&gt;&lt;st1:PlaceType w:st="on"&gt;port&lt;/st1:PlaceType&gt;  of &lt;st1:PlaceName w:st="on"&gt;DFL&lt;/st1:PlaceName&gt;&lt;/st1:place&gt;, utilizing Xlib. So, I&amp;#8217;ve jumped the opportunity to put my D to the test.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;What we&amp;#8217;ll be doing is basically porting XLib to D so D GUI toolkits like DFL, can be built easily on Linux.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;The truth is, what we&amp;#8217;re doing (thanks to D being a practical and realistic language), is not as hard as its sounding&amp;#8230; infact, all we have to do, first convert all the necessary XLib header files to d modules, then we can work on making the D modules more &amp;#8216;D-Like&amp;#8217;, adding object oriented paradigms etc, but the first part, is actually boring translation if you may &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I started somestuff last nite&amp;#8230; and my first target is to be able to import X11.Xlib (analogous to #include &amp;lt;X11/Xlib.h&amp;gt;), for this, I have a whole lot of modules to convert. I&amp;#8217;ve moved part of X.h to X.d, I&amp;#8217;ll continue tonite.. and hopefully in two nites time, I should be able to write a basic XLib app in D.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;In other news, as I started working on this yesternite, it became clearer how I would approach porting the EFL to D. Infact, I don&amp;#8217;t even need the whole EFL right now, I just want to make the test module that comes with e17, be writable in D, then I&amp;#8217;ll go from there. I&amp;#8217;m not going to code that yet, I&amp;#8217;ll wait for things to become clearer from the XLib effort, then I&amp;#8217;ll let my inner-coding-monkey&amp;#8482; get to work on that &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien out.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112185975122711875?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112185975122711875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112185975122711875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112185975122711875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112185975122711875'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/revisiting-d.html' title='Revisiting D'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112176994096773254</id><published>2005-07-19T11:45:00.000+01:00</published><updated>2005-07-22T12:50:23.403+01:00</updated><title type='text'>Kernel Issues, e17 autobuild script</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I just solved a very frustrating issue that showed up with my Kernel.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;First of all, my laptop (a Compaq R4000), has issues with the default installed ArchLinux Kernel 2.6 (I&amp;#8217;ve not tried 2.4).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I had to build a kernel during the install to get my Keyboard to work &amp;#8211; yes, keyboard&amp;#8230; I have no idea what happened. I&amp;#8217;ve even tried doing a visual examination of the diff b/w the two kernel .config&amp;#8217;s but I came up with no clue&amp;#8230; anyway&amp;#8230; at least it worked, with one funny glitch: My time was really accelerating, so when I ran that kernel for a while, and rebooted into windows, I&amp;#8217;d have kerberous issues b/cos of time sync.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Last week, I decided to solve that problem once for all, by repeating a compile from my FailSafe kernel config. In doing that&amp;#8230; I felt I should do some more optimizations and playing around, and I disabled PNP_BIOS support, and left only PNP_ACPI. Well&amp;#8230; this cause me untold headaches, as my Network card stopped working&amp;#8230; the driver would load properly, but I&amp;#8217;d just get an SIOCADDRT: Network Unreachable.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Very frustrating&amp;#8230; I searched high and low, and had no clue what was causing it, until I ran across some Redhat user threads, and someone mentioned IRQ issues that had given him similar errors, then I closely looked at my dmesg, and noticed a complain about IRQ handling with ACPI and some drivers that may still be using the old method. That was when I recalled my visual diffs of the Arch kernel and my own config, that PNP_BIOS was OFF&amp;#8230; well&amp;#8230; long story short&amp;#8230; I enabled it back and its working again&amp;#8230; and I&amp;#8217;ve learnt something new! &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;On other fronts, I&amp;#8217;d been using Rensel&amp;#8217;s Repository to feed by e17 needs on ArchLinux for a while now, but after noticing that he only seems to build against Rasterman&amp;#8217;s releases on freedesktop.org, I decided to roll mine (I&amp;#8217;d tried this before and had serious compile issues).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyway, this time, I was prepared, and after getting from CVS, I built the eet, edb, evas and ecore, they all worked, tho I had an eye opening problem with ecore finding evas, and I finally mastered the use of the &amp;#8216;&amp;#8212;with-bleh-config=/path/to/bleh-config&amp;#8217; argument to ./configure.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Now I have a tried and tested autobuild script for e17, that builds using &amp;#8216;pacman&amp;#8217;, and installs to my system. I did most of the work over the weekend, but still had some issues with some packages finding Ewl headers, and my result from &amp;#8216;/usr/bin/ewl-config&amp;#8217; was really messed up. Yesternite, I stayed up till 4.00am, finetuning that script, and currently&amp;#8230; its in its simplest form, with a library, and two actually builder scripts. And to test stuff, I uninstalled my last successful build, setup the build process and went to sleep. When I woke up around 7.30, I just logged in and typed &amp;#8216;startx&amp;#8217;&amp;#8230; and yup! It works beautifully.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I also managed to write my first e17 module today (actually I just modified the snow module, using the test module as a guide :) ), at least it works.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;So now, e17 is back up to current spec, and Dapo wants it tonite too :).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Ahh&amp;#8230; I&amp;#8217;m thinking of modifying this script to work with Autopackage (&lt;a href="http://www.autopackage.com/"&gt;http://www.autopackage.org&lt;/a&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyways, I guess I have my work cut out for me.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Essien, out.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112176994096773254?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112176994096773254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112176994096773254' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112176994096773254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112176994096773254'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/kernel-issues-e17-autobuild-script.html' title='Kernel Issues, e17 autobuild script'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112142957720945742</id><published>2005-07-15T13:12:00.000+01:00</published><updated>2005-07-15T13:12:57.240+01:00</updated><title type='text'>We've caught a virus</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;At my office.. we&amp;#8217;ve caught a virus!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I swear I had nothing to do with it&amp;#8230;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;But currently&amp;#8230; everyone is talking Python, Linux, Open Source (when I mentioned this to Stan, we agreed to keep our big mouths shut, and see where all this was leading to)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I mean, core Windows guys who would not even look at Open Source stuff, suddenly going out of their way to learn Linux&amp;#8230; and not just any distro, ArchLinux (&lt;a href="http://www.archlinux.org/"&gt;http://www.archlinux.org&lt;/a&gt;).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;You probably wont guess what their default window Manager is: &amp;nbsp;e17 (infact, Dapo has asked me to build Arch Packages of the lattest e17 from cvs&amp;#8230; wow! These guys are really demanding ;) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Uhh&amp;#8230; and yup&amp;#8230; they&amp;#8217;re already trying Mono, MonoDevelop and are seriously excited&amp;#8230; infact&amp;#8230; Dapo said, &amp;#8220;The world is getting interesting&amp;#8221;, this was when I told him about WINE (&lt;a href="http://www.winehq.org/"&gt;http://www.winehq.org&lt;/a&gt;), well&amp;#8230; I just told him, &amp;#8220;Its always been interesting&amp;#8230; you just didn&amp;#8217;t know about it then&amp;#8221;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Any way, did I say I had nothing to do with it? I guess I lied&amp;#8230; I&amp;#8217;ve been doing passive evangelism&amp;#8230;. The sort that Microsoft will use when they release Longhorn &amp;#8211; They&amp;#8217;ll force you to use it&amp;#8230; force you nicely &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Well, I released PMUtils today to the rest of the guys in the office, made it look VERY COOL &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;, and it uses the lattest libpm (python version), I&amp;#8217;m too lazy to update the C# version (uhhh&amp;#8230; this means&amp;#8230; I just don&amp;#8217;t want to do it :D), this means that to have publishing features for myPM, you HAVE TO install python, elementtree, and my libraries, libpm and systray. To make things cleaner, I&amp;#8217;ve used inno setup, to pack these nicely.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;So now, everyone at Splashers Technologies (&lt;a href="http://www.splasherstech.com/"&gt;http://www.splasherstech.com&lt;/a&gt;) uses a Python program everyday ;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;That is VIRAL Marketting. And we&amp;#8217;ve caught the Linux/Python/OpenSource virus :)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I learn from the best.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112142957720945742?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112142957720945742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112142957720945742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112142957720945742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112142957720945742'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/weve-caught-virus.html' title='We&apos;ve caught a virus'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112110750797600202</id><published>2005-07-11T19:28:00.000+01:00</published><updated>2005-07-11T19:45:08.006+01:00</updated><title type='text'>Eclipse Help Plugin for D</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/1612/783/1600/eclipsed1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/200/eclipsed1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I went playing with Eclipse this weekend (again! :) ).&lt;br /&gt;&lt;br /&gt;Anyways, I don't see the reason of using Eclipse and being a developer if one doesn't know how to create a plugin. But then again, one can't just go about creating plugins just for the sake of plugins.&lt;br /&gt;&lt;br /&gt;Any way, i've been having his 'itch' recently. My most used eclipse plugin PyDev, doesn't have all documentation that comes for instance with PythonWin or the Standard IDLE. Also, the eclipse plugins for the 'D' programming language doesn't have any documentation/reference.&lt;br /&gt;&lt;br /&gt;I went to work, to see how easy it would be to extend the Eclipse help system, and the screeny above is the result of that effort, for the D programming Language.&lt;br /&gt;&lt;br /&gt;To be honest, i really can't say i totally grok the stuff, but at least i have the idea. I've just downloaded the HTML docs for Python, and will over the couple of days, try to work them in. &lt;br /&gt;&lt;br /&gt;I'm also going to clean up the D docs and contribute them to the eclipseD guys.&lt;br /&gt;&lt;br /&gt;Am i having fun? You bet...&lt;br /&gt;&lt;br /&gt;Essien out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112110750797600202?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112110750797600202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112110750797600202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112110750797600202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112110750797600202'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/eclipse-help-plugin-for-d.html' title='Eclipse Help Plugin for D'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112076382201960499</id><published>2005-07-07T19:54:00.000+01:00</published><updated>2005-07-07T20:22:06.523+01:00</updated><title type='text'>Java on LInux for Client, Inno Setup</title><content type='html'>Finally Dapo has figured out all he needs to run a Java TTS (Text To Speech) App on Linux, and he's set for his Demo in Lagos this weekend.&lt;br /&gt;&lt;br /&gt;I'm finishing up his Linux setup, and his environment is:&lt;br /&gt;&lt;br /&gt;Archlinux/e17 (yuh baby.!)/Eclipse/Tomcat/MySQL/Java&lt;br /&gt;&lt;br /&gt;(I'm wishing we could have added Jython to that too :) )&lt;br /&gt;&lt;br /&gt;Kewl huh? you bet.&lt;br /&gt;&lt;br /&gt;Also, I decided to master Inno Setup once for all, and I finally got it working, and have used it to package PMUtils 1.0. Its rather flexible and i prefer the setup package it produces to the default msi's we build with .NET... uugghh!!!&lt;br /&gt;&lt;br /&gt;Anyways, i'm using the proper setup on my box now, am noticing some usability issues... i guess i'll hit guys with it tmrw.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112076382201960499?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112076382201960499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112076382201960499' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112076382201960499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112076382201960499'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/java-on-linux-for-client-inno-setup.html' title='Java on LInux for Client, Inno Setup'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112073666900009427</id><published>2005-07-07T12:44:00.000+01:00</published><updated>2005-07-07T12:44:29.030+01:00</updated><title type='text'>Nokia Development with Eclipse</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I've been working on this gently ever since i  finally got the hang of Eclipse. Last nite, i stayed up, read some pdfs on  Programming style and stuff like that, and continued on trying to get this to  work.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Basically, i learnt that the Nokia Development  Environment could plug into Eclipse as well as other popular Java IDEs. I've  downloaded and setup the Nokia Development Environment, and in the process, also  Downloaded and setup the EclipseME plugin.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Now, i can create a Nokia MIDP Project (but i don't  know where to go from there :) ) Also, I have options of creating a MIDlet  suite, but when i try to do that, eclipse complains that there is no platform to  build the MIDlet for. I'm still looking into this.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Anyway... It looks like i'm actually set for  developing Nokia apps, and i have the 7210 SDK (which i can test with my phone  :) ). What i need now, is a sort of wholesome primer... From looking at the docs  that come with the SDK, its a lot like writing a BlackBerry App, i just need to  know how to create the entry point.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I'll scrounge around some more this weekend,  download lots of articles from Forum Nokia, and spend next week reading thru  them... am sure i'll get it all working by next week... Ahh... i feel a whole  new frontier coming for me.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;By the way, i'm itching to get the new Nokia  Internet Tablet, once its officially released. Its a pure Linux Based Beast...  And from what i've seen via Google and various blogs... its going to be one fun  hackable platform. Maybe i'll just get this instead of the Zaurus I was thinking  off... hmm....&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112073666900009427?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112073666900009427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112073666900009427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112073666900009427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112073666900009427'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/nokia-development-with-eclipse.html' title='Nokia Development with Eclipse'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112064892560060459</id><published>2005-07-06T12:22:00.000+01:00</published><updated>2005-07-06T14:03:50.966+01:00</updated><title type='text'>Python Speech API for Windows</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Dapo has been working on this Java app that should read text out of a webpage, and my! Has he had issues with Java!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;He&amp;#8217;s gone from issue to issue, and he wishes he could have done it all in C# / .NET (He&amp;#8217;s really our local .NET guru &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt; ).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Anyway, I started feeling slightly jealous, and set out to see how hard it would be to achieve in Python. I hit my repository &amp;#8211; AKA &amp;#8211; Google &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt; font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;, and typed in Python Speech API.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;There were myriads of&amp;nbsp; results. I picked the first one that happened to be a recipe from the Python Cookbook on ActiveState. :&lt;/span&gt;&lt;/font&gt; &lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/93025"&gt;http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/93025&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Well, the second link I checked out was a module called pyTTS, which is a thin layer atop Microsofts SAPI framework. : &lt;a href="http://www.cs.unc.edu/~parente/tech/tr02.shtml"&gt;http://www.cs.unc.edu/~parente/tech/tr02.shtml&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;To say that I was shocked will be an understatement&amp;#8230; this is what the code to read a line looks like with pyTTS:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;#-----------start of code -------------#&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;import pyTTS&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;tts = pyTTS.Create()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;tts.Speak(&amp;#8220;Unbelievable right? But I&amp;#8217;m speaking!&amp;#8221;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;#------------uhh&amp;#8230; end of code :D -------#&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;That&amp;#8217;s it!!!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I called Dapo over, to look at the sample Python Code, and we all started laughing&amp;#8230; I mean it was so simple it was absurd.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;The point here, is not *&lt;b&gt;&lt;span style='font-weight:bold'&gt;JUST&lt;/span&gt;&lt;/b&gt;* that it is only three lines of code. The point is that I most python libraries feel the same way. They do most of the underground work for your Default Scenario (which you end up using 90% of the time), and if you still want to get raw access&amp;#8230; be my guest&amp;#8230; its always there. The CookBook recipe still shows that without pyTTS, I could still build something simple and very much Pythonic from scratch, in VERY LITTLE lines of code. Its definitely amazing to have this much power at your finger tips.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;If there is one thing I&amp;#8217;ve learnt from Python, it is the power in succinctness. IMOHO, any developer that is not harnessing this succinctness yet from any source, Perl, Python, Ruby, Groovy, etc, is really wasting valuable time on things that he/she doesn&amp;#8217;t have to spend time on.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Now, this is not exactly running out of a web page (So its not exactly Dapo&amp;#8217;s *&lt;b&gt;&lt;span style='font-weight:bold'&gt;Current&lt;/span&gt;&lt;/b&gt;* problem&amp;#8230; but a Python Webapp, is same as a Python Desktop app, and I don&amp;#8217;t have to battle Java Applets like he&amp;#8217;s doing now&amp;#8230; poor guy &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt; )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Now, what&amp;#8217;s the next cool thing I&amp;#8217;ll do with this? Hehehe&amp;#8230; I think &amp;#8216;misctray&amp;#8217; is going to start reading my tutorials and reading materials for me &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112064892560060459?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112064892560060459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112064892560060459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112064892560060459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112064892560060459'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/python-speech-api-for-windows.html' title='Python Speech API for Windows'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112064886497803759</id><published>2005-07-06T12:21:00.000+01:00</published><updated>2005-07-06T13:58:13.306+01:00</updated><title type='text'>More systray utils</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Yesterday, I decided I needed to clean up some of my remote pop3 mailboxes I&amp;#8217;ve not checked in a while. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Not a problem, but I have a very slow link, and downloading 13.8Mb of mail is not something I&amp;#8217;d like to wait after work to do. So well, I got home last nite, and welded together another systray based utility I named &amp;#8216;misctray&amp;#8217;. Currently, It has just 2 uses&amp;#8230; check the number of mails on a particular account, and allow me to delete the mails without downloading them first (basically a looped &amp;#8216;DELE&amp;#8217; &lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Wingdings&gt;&lt;span style='font-size:10.0pt;font-family:Wingdings'&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt; ).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Tested it out this morning, and boom! It works. &amp;#8216;misctray&amp;#8217; has me thinking tho&amp;#8230; I think I&amp;#8217;d like a framework, where I can write arbitrary python scripts, drop them in a &amp;#8216;mistray plugins&amp;#8217; folder, and misctray would pick them up automagically, and create a menu/menu-item out of them. That way, I can have one consistent launcher for my python scripts, right on my Windows System Tray.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Hmm&amp;#8230;nice idea&amp;#8230; I like it, I&amp;#8217;ll do it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-112064886497803759?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112064886497803759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112064886497803759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112064886497803759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112064886497803759'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/more-systray-utils.html' title='More systray utils'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112049805545704888</id><published>2005-07-04T18:13:00.000+01:00</published><updated>2005-07-04T18:27:35.463+01:00</updated><title type='text'>PMTray 1.0 with some screenshots</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/1612/783/1600/pmtray-idle.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/pmtray-idle.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/1612/783/1600/pmtray-menus.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/pmtray-menus.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/1612/783/1600/pmtray-syncing.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/pmtray-syncing.jpg" border="0" alt="" /&gt;&lt;/a&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;Well, well, well, sometimes we make plans and totally don't end up following them, because a better plan came up all of a sudden.&lt;br /&gt;&lt;br /&gt;That's basically happened to me over the weekend.&lt;br /&gt;&lt;br /&gt;Remember i had planned to start working on the now very much hypothetical and soon to be not so vapourware 'phiba' :). Well, i found another immediate need, PMTray. PMTray is my lattest addition to the PMUtils package i currently use to manage our time and interact with our web based time management tool.&lt;br /&gt;&lt;br /&gt;I quickly put this together with the systray module (that dude has realy gotten usefull).&lt;br /&gt;&lt;br /&gt;Using systray to solve a real problem also helped me to refactor it for better usability, and what i really need to add now before i can satisfactorily declare systray-1.0.0 is 1) A status message akin to Yahoo Messenger Notifications (when folks log on and off, but as beautifull as Outlooks Mail notifier messages.&lt;br /&gt;2) Support of an OnApplicationLoad event, so i can run a full service off the systray.&lt;br /&gt;3) Support for Notification Balloons (This is not really too important if i can achieve the first one. Infact, any of 1 or 3 will be cool for a version 1.0.0, and both WILL ROCK!)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The screenies sort of speak for them selves. (pmtray is the cool - yup, cool, green icon nearer the system clock)&lt;br /&gt;&lt;br /&gt;1. pmtray is idle&lt;br /&gt;2. pmtray - showing menu options&lt;br /&gt;3. pmtray - synchronizing with WebPM&lt;br /&gt;&lt;br /&gt;ok... gtg, i really have this pain in my neck... i think its a cold :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112049805545704888?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112049805545704888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112049805545704888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112049805545704888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112049805545704888'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/07/pmtray-10-with-some-screenshots.html' title='PMTray 1.0 with some screenshots'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112015360082409980</id><published>2005-06-30T18:37:00.000+01:00</published><updated>2005-06-30T19:00:12.583+01:00</updated><title type='text'>systray sample app screenshots</title><content type='html'>I decided to post some screenies of the sample app included in the systray package source.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1612/783/1600/first.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/first.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1612/783/1600/second.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/second.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1612/783/1600/third.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/third.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1612/783/1600/fourth.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1612/783/320/fourth.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. The first shot identifies the sample app (its the 'S' icon).&lt;br /&gt;&lt;br /&gt;2. The second shot showcases MenuOptions.&lt;br /&gt;&lt;br /&gt;3. The third is me in the midst of selecting an option that will change the app icon.&lt;br /&gt;&lt;br /&gt;4. The App icon has been changed (And the Hover Text as well). The current icon has a white 'S' the other one had a black 'S' with an outer glow.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyways... just a sample app. staty tuned... 'phiba' coming your way soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112015360082409980?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112015360082409980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112015360082409980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112015360082409980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112015360082409980'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/systray-sample-app-screenshots.html' title='systray sample app screenshots'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112014345205908719</id><published>2005-06-30T15:28:00.000+01:00</published><updated>2005-06-30T15:57:37.100+01:00</updated><title type='text'>systray 0.2.1</title><content type='html'>The topic says it all. And as usual... i had to stay up... this time i think i just stayed till 1.00am... i'm getting lazy i guess :)&lt;br /&gt;&lt;br /&gt;I have built up systray-0.2.1, and its looking good.&lt;br /&gt;&lt;br /&gt;Here's the changelog so far.&lt;br /&gt;&lt;br /&gt;0.2.1&lt;br /&gt;=============&lt;br /&gt;1. Make Menu() and MenuItem() have default values for 'title' in constructor, so they can be blank.&lt;br /&gt;&lt;br /&gt;0.2.0&lt;br /&gt;=============&lt;br /&gt;1. Add MenuItem.add_submenu&lt;br /&gt;2. implement the _App class inheriting from SysTrayIcon.SysTrayIcon&lt;br /&gt;3. Added text and icon property to _App class which call refresh_icon, automatically&lt;br /&gt;4. Modify App.start() to use _App() instead of SysTrayIcon.SysTrayIcon&lt;br /&gt;5. Change App.start() to correctly set window_class_name of _App class&lt;br /&gt;6. Refactor out MenuBase.&lt;br /&gt;7. Reimplement MenuItem as a child of MenuBase, removing irrelevant attributes&lt;br /&gt;8. Implement Menu as a chile of MenuBase, seperate from MenuItem.&lt;br /&gt;9. Extend App to support both App.add_menu() and App.add_menuitem(), for unambigous usability&lt;br /&gt;10. Modify App to have a default on_quit handler that does nothing, so it now always exits properly.&lt;br /&gt;11. Rename default_onclick(s) to default_handler(s). &lt;br /&gt;12. Create a module object DEFAULT_HANDLER to be the default_handler accessor object&lt;br /&gt;13. Make App and MenuBase use DEFAULT_HANDLER as their default handlers for on_quit() and onclick() respecively&lt;br /&gt;14. Added doc strings for _App and App, MenuBase, Menu, MenuItem.&lt;br /&gt;15. Extend Menu to support SubMenus and MenuItems explicitly&lt;br /&gt;16. Incoporate distutils framework for installation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;0.1.0&lt;br /&gt;=============&lt;br /&gt;1. Initial Release&lt;br /&gt;2. Create systray module&lt;br /&gt;3. Build App class&lt;br /&gt;4. Build MenuItem class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The source comes with a sample application, here is the code:&lt;br /&gt;&lt;br /&gt;#--------- systray sample ---------------&lt;br /&gt;from systray import *&lt;br /&gt;import time&lt;br /&gt;&lt;br /&gt;mitem_txtchg = systray.MenuItem('Change Text')&lt;br /&gt;&lt;br /&gt;def txtchg_onclick(s):&lt;br /&gt;    s.text = 'systray sample - ' + str(time.clock())  &lt;br /&gt;    &lt;br /&gt;mitem_txtchg.onclick = txtchg_onclick&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;menuitem_published = systray.MenuItem()&lt;br /&gt;menuitem_published.icon = 'published.ico'&lt;br /&gt;&lt;br /&gt;def menuitem_published_onclick(s):&lt;br /&gt;    s.icon = 'published.ico'&lt;br /&gt;    &lt;br /&gt;menuitem_published.onclick = menuitem_published_onclick&lt;br /&gt;&lt;br /&gt;menuitem_default = systray.MenuItem()&lt;br /&gt;menuitem_default.icon = 'default.ico'&lt;br /&gt;&lt;br /&gt;def menuitem_default_onclick(s):&lt;br /&gt;    s.icon = 'default.ico'&lt;br /&gt;    &lt;br /&gt;menuitem_default.onclick = menuitem_default_onclick&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;menu_icon = systray.Menu('Icon')&lt;br /&gt;menu_icon.add_menuitem(menuitem_published)&lt;br /&gt;menu_icon.add_menuitem(menuitem_default)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;st_sample = systray.App('systray sample', 'default.ico')&lt;br /&gt;&lt;br /&gt;st_sample.add_menuitem(mitem_txtchg)&lt;br /&gt;st_sample.add_menu(menu_icon)&lt;br /&gt;&lt;br /&gt;st_sample.start()&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;#--------------------------------------------------------#&lt;br /&gt;&lt;br /&gt;at this stage, i think i've side tracked enough from 'phiba'. What is phiba? phiba was why i got looking for the SysTrayIcon.py module in the first place... its supposed to be a home brewed blogger butt... ooopss.. blogger bot :)&lt;br /&gt;&lt;br /&gt;I'll start work on this sometime tonite i guess... i have the blogger API docs, and now i have 'systray'. I think that was the last missing piece. i think i should have something exciting soon :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112014345205908719?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112014345205908719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112014345205908719' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112014345205908719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112014345205908719'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/systray-021.html' title='systray 0.2.1'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112007612973778650</id><published>2005-06-29T21:04:00.000+01:00</published><updated>2005-06-29T21:15:29.746+01:00</updated><title type='text'>Eclipse, Python at Work and uhhh.. EMR</title><content type='html'>Today, I 'officially' had reason to work with Eclipse, PyDev and Python. :)&lt;br /&gt;&lt;br /&gt;We were modifying the Hospice Backend, so i had to redo the import scripts which were crafted in Python. I had done this previously using PythonWin IDE, but since i've fallen inlove with Eclipse (yeah, now i admit it is cool, it has a rather high coolness factor too ;) ), I Decided to import the project into Eclipse and continue from there.&lt;br /&gt;&lt;br /&gt;Yup... It turned out very painless and infact, very beneficial. I think that's it, Eclipse/PyDev has become my Python development Environment of choice. Now all that needs to be added is a way to access PyDoc easily, probably integration of all the docs that come with PythonWin into the Eclipse Help system, and I guess I won't open any other python Python IDE/IDLE/SHELL again ;)&lt;br /&gt;&lt;br /&gt;woooo... exciting times.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Btw, today, I officially joined our EMR team. Phew! Everyone dreads that project, b/cos its so big, somewhat badly designed... and fixes keep coming in everyday.&lt;br /&gt;&lt;br /&gt;Well today, I worked with Seun and did some fixes. One of the Refactorings I added today, was for implementing Warnings before closing forms with Changed data. I took one look at the stuff and told Seun... man... we can't be copying and pasting... Immedietly I went to work on an interface ISaveClose, and we integrated it first into the New Allergies form and the New Medications form. It works very nicely. Tmrw, we'll make all the other forms that need to do that, use it.&lt;br /&gt;&lt;br /&gt;I'll actually like to go one step further, build a class that implements that inteface already, and all the what nots, so by making each of the forms just inherit from that class, we will be good to go.&lt;br /&gt;&lt;br /&gt;Why this was never done before? hehe... that's the million dollar question :)&lt;br /&gt;&lt;br /&gt;Boy... my back aches... my tummy rumbles... i really gtg.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112007612973778650?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112007612973778650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112007612973778650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112007612973778650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112007612973778650'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/eclipse-python-at-work-and-uhhh-emr.html' title='Eclipse, Python at Work and uhhh.. EMR'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-112003494644078113</id><published>2005-06-29T09:27:00.000+01:00</published><updated>2005-06-29T19:43:47.663+01:00</updated><title type='text'>Python and the Windows System Tray</title><content type='html'>Continuing with my exploration of small neat and usefull python hacks for windows, I went searching the web for how to use python to write an app that would run on the Windows System Tray.&lt;br /&gt;&lt;br /&gt;Shift over... its Googlistic All The Way :)&lt;br /&gt;&lt;br /&gt;I came across this from Simon Brunning : http://www.brunningonline.net/simon/blog/archives/SysTrayIcon.py.html&lt;br /&gt;&lt;br /&gt;Quickly downloaded it, and yesternite (yup... i'm becoming a Pythonire - that's a poor vampire spin off :D ), I took it for a Test Drive.&lt;br /&gt;&lt;br /&gt;After a quick understanding of how it works, I tried to write a small app, and in the process I quickly refactored out a small library, that makes using it a bit more Intuitive to me.&lt;br /&gt;&lt;br /&gt;The module which i dubbed 'systray' looks like this:&lt;br /&gt;&lt;br /&gt;import SysTrayIcon&lt;br /&gt;&lt;br /&gt;def default_onclick(s):&lt;br /&gt;    return&lt;br /&gt;    &lt;br /&gt;class SysTrayApp:&lt;br /&gt;    def __init__(self, title, icon=None):&lt;br /&gt;        self.icon = icon&lt;br /&gt;        self.title = title&lt;br /&gt;        self.menu = []&lt;br /&gt;        &lt;br /&gt;    def start(self):&lt;br /&gt;        SysTrayIcon.SysTrayIcon(self.icon, self.title, tuple(self.menu) ,default_menu_index=1)&lt;br /&gt;        return&lt;br /&gt;        &lt;br /&gt;    def add_menuitem(self, m):&lt;br /&gt;        self.menu.append(tuple(m))&lt;br /&gt;        #print tuple(self.menu)&lt;br /&gt;        return&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;class MenuItem(list):&lt;br /&gt;    def __init__(self, title):&lt;br /&gt;        list.__init__(self)&lt;br /&gt;        self.append(title)&lt;br /&gt;        self.append(None)&lt;br /&gt;        self.append(default_onclick)&lt;br /&gt;        &lt;br /&gt;    def __set_icon(self, icon):&lt;br /&gt;        self[1] = icon&lt;br /&gt;        &lt;br /&gt;    def __set_onclick(self, handler):&lt;br /&gt;        self[2] = handler&lt;br /&gt;        &lt;br /&gt;    icon = property(None, __set_icon, None, "Icon Property")&lt;br /&gt;    onclick = property(None, __set_onclick, None, "OnClick Event Handler")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Easily use this module, you can do the following:&lt;br /&gt;&lt;br /&gt;#-------------------------------&lt;br /&gt;&lt;br /&gt;import systray&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mitem_sample = systray.MenuItem('Sample Menu')&lt;br /&gt;        &lt;br /&gt;st_sample = systray.SysTrayApp('systray sample', 'default.ico')&lt;br /&gt;st_sample.add_menuitem(mitem_sample)&lt;br /&gt;st_sample.start()&lt;br /&gt;&lt;br /&gt;#--------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To add icons and menu actions to those menu items, modify the code as follows:&lt;br /&gt;&lt;br /&gt;import systray&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mitem_sample = systray.MenuItem('Sample Menu')&lt;br /&gt;mitem_sample.icon = 'default.ico'&lt;br /&gt;&lt;br /&gt;def sample_onclick(systrayicon):&lt;br /&gt;     systrayicon.title = "I have been clicked"&lt;br /&gt;     return&lt;br /&gt;&lt;br /&gt;mitem_sample.onclick = sample_onclick&lt;br /&gt;        &lt;br /&gt;st_sample = systray.SysTrayApp('systray sample', 'default.ico')&lt;br /&gt;st_sample.add_menuitem(mitem_sample)&lt;br /&gt;st_sample.start()&lt;br /&gt;&lt;br /&gt;#---------------------------------------------&lt;br /&gt;&lt;br /&gt;Well, that's it.&lt;br /&gt;&lt;br /&gt;I want to use this for some nifty utils, like a network monitoring daemon, a monitor for pmserv, etc.&lt;br /&gt;&lt;br /&gt;hmm... fun times ahead i say.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-112003494644078113?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/112003494644078113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=112003494644078113' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112003494644078113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/112003494644078113'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/python-and-windows-system-tray.html' title='Python and the Windows System Tray'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111998014191952708</id><published>2005-06-28T18:19:00.000+01:00</published><updated>2005-06-28T18:35:41.926+01:00</updated><title type='text'>GNU GOATS on JAVA</title><content type='html'>Like i said earlier, these are exciting times. And if i hear anymore person say that lack of patents stiffles creativity, i'll personally truss em!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After crying about the Java Trap (http://www.gnu.org/philosophy/java-trap.html), the GNU community has been responding on many fronts, as a lot of Free software these days are written in Java. The result is GCJ and libgcj (which comes with GCC 4.0).&lt;br /&gt;&lt;br /&gt;If you're a bit used to UNIXy nomenclature, libgcj may strike you as odd, b/cos its normally c/c++ libraries that are named like that, since they are compiled to native code. Well... GCJ can compile Java code to native code... Yes sir, you heard me well. In this manner, Java programs can run REALLY FAST. &lt;br /&gt;&lt;br /&gt;libgcj is then the implementation of the Java library, and is currently a result of two GNU projects collaborating well (the original libgcj guys and the GNU Classpath hackers).&lt;br /&gt;&lt;br /&gt;What does this mean for me as a coder, well, i now have a standard free platform to write Java code (uhh... i'm not exactly a Java freak tho). But most important to me, is that i can compile OpenOffice and Eclipse and run them as native binaries on Linux (and to some extent on windows using Ming). Now that is what i call innovation. You would wonder why Sun didn't do this? Or why .NET uses the same principle as Java (no native code). Well, they all tell you its compile once run everywhere, but in practice we know its not usually that straight forward, and its more true with Java than with .NET anyway, so why bother?&lt;br /&gt;&lt;br /&gt;I personally don't know, and right now, i don't care :) Once I can run my Java programs that i NEED on my preferred platform, at native speeds, the bigwigs can go do what ever they like.&lt;br /&gt;&lt;br /&gt;Business as we know it is changing fast, and innovations like this are the reason. Like I said earlier, these are exciting times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111998014191952708?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111998014191952708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111998014191952708' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111998014191952708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111998014191952708'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/gnu-goats-on-java.html' title='GNU GOATS on JAVA'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111997898987921209</id><published>2005-06-28T17:58:00.001+01:00</published><updated>2005-06-28T18:16:29.890+01:00</updated><title type='text'>Eclipse Weekend, pmutils - introducing pmserv</title><content type='html'>Last weekend, i decided to really take Eclipse for a drive. And i have one word. It is USEFULL. Note i didn't say cool. I'm yet to feel the coolness factor, though one plugin nearly got me there (the vim plugin - yeah... i'm a nerd so what? :) )&lt;br /&gt;&lt;br /&gt;What I did was to install eclipse and setup the lattest version of PyDev, and then migrated my development of libpm and pmutils, to Eclipse. &lt;br /&gt;&lt;br /&gt;My first really tripping moment was the Refactoring Functionality. It is really cool. What I ended up doing mostly is, all the places i know i want to factorize out a function, I use the Refactoring -&gt; Extract Method. Then examine the resulting function to see if its good enough (sometimes, there are unnesseccarry arguments, etc). But, its really a time-shaver :)&lt;br /&gt;&lt;br /&gt;I firstly cleaned up libpm and pmutils somemore, dealing with most of my todos, then started facing pmserv, which was intended as a windows service. i had layed out a basic service framework, but there was still work to be done, methods to extract from the existing pmutils, etc.&lt;br /&gt;&lt;br /&gt;I did all of this in Eclipse, and last nite, i stayed up till 2.30am, to finish pmserv, and it works beautifully.&lt;br /&gt;&lt;br /&gt;One of the things that really tripped me with eclipse was the External Tools feature. I added the python console (ofcourse), and a windows command prompt, which i used while developing the service (installing, starting, stoping). I really needed to include the windows Service Manager and Event Viewer too, and a PyDoc viewer, but didn't get around to doing those... I guess there's always latter, as i'm planning to write a blogging service too :)&lt;br /&gt;&lt;br /&gt;All in all, i'll say, Eclipse is a really serious utility, and this is another boon for opensource development, and the ubiquitious J. Random Hacker. Thanks to tools like eclipse and all the budding tool smiths out there, anyone can start doing very usefull stuff, without paying a dime, and what's more... this things are actually industry standard.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Exciting Times are ahead i tell you, i'm really happy to be alive and coding in this era.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111997898987921209?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111997898987921209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111997898987921209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111997898987921209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111997898987921209'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/eclipse-weekend-pmutils-introducing_28.html' title='Eclipse Weekend, pmutils - introducing pmserv'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111997895510742173</id><published>2005-06-28T17:58:00.000+01:00</published><updated>2005-06-28T18:15:55.113+01:00</updated><title type='text'>Eclipse Weekend, pmutils - introducing pmserv</title><content type='html'>Last weekend, i decided to really take Eclipse for a drive. And i have one word. It is USEFULL. Note i didn't say cool. I'm yet to feel the coolness factor, though one plugin nearly got me there (the vim plugin - yeah... i'm a nerd so what? :) )&lt;br /&gt;&lt;br /&gt;What I did was to install eclipse and setup the lattest version of PyDev, and then migrated my development of libpm and pmutils, to Eclipse. &lt;br /&gt;&lt;br /&gt;My first really tripping moment was the Refactoring Functionality. It is really cool. What I ended up doing mostly is, all the places i know i want to factorize out a function, I use the Refactoring -&gt; Extract Method. Then examine the resulting function to see if its good enough (sometimes, there are unnesseccarry arguments, etc). But, its really a time-shaver :)&lt;br /&gt;&lt;br /&gt;I firstly cleaned up libpm and pmutils somemore, dealing with most of my todos, then started facing pmserv, which was intended as a windows service. i had layed out a basic service framework, but there was still work to be done, methods to extract from the existing pmutils, etc.&lt;br /&gt;&lt;br /&gt;I did all of this in Eclipse, and last nite, i stayed up till 2.30am, to finish pmserv, and it works beautifully.&lt;br /&gt;&lt;br /&gt;One of the things that really tripped me with eclipse was the External Tools feature. I added the python console (ofcourse), and a windows command prompt, which i used in developing the service. I really needed to include the windows Service Manager and Event Viewer too, but didn't get around to doing those... I guess there's always latter, as i'm planning to write a blogging service too :)&lt;br /&gt;&lt;br /&gt;All in all, i'll say, Eclipse is a really serious utility, and this is another boon for opensource development, and the ubiquitious J. Random Hacker. Thanks to tools like eclipse and all the budding tool smiths out there, anyone can start doing very usefull stuff, without paying a dime, and what's more... this things are actually industry standard.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Exciting Times are ahead i tell you, i'm really happy to be alive and coding in this era.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111997895510742173?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111997895510742173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111997895510742173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111997895510742173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111997895510742173'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/eclipse-weekend-pmutils-introducing.html' title='Eclipse Weekend, pmutils - introducing pmserv'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111970420356792670</id><published>2005-06-25T13:13:00.000+01:00</published><updated>2005-06-25T13:56:43.576+01:00</updated><title type='text'>Solution Layering</title><content type='html'>How many times have you actually felt that you were doing too much work while programming?&lt;br /&gt;&lt;br /&gt;Hmmm... ok... i know we all feel overworked, and most of us derive a kind of sadistic pleasure just from the feeling of overworked pressurized must-meet-dealine kinda crap :) but sometimes, its plain unneccessary.&lt;br /&gt;&lt;br /&gt;Actually, as you grow as a coder, you begin to relish 'elegant' solutions, that not just showcase how smart you are, but also reduce the number of keystrokes you hit and stuff like that (at least, i crave for that elegance in my solutions). What keeps hitting me everytime, is the importance of layering as an engineering art, and the importance of recognizing funcionality meant for those layers and keeping them there.&lt;br /&gt;&lt;br /&gt;I'll give a couple of examples.&lt;br /&gt;&lt;br /&gt;First of all, imagine you have a database table with two fields [id, name]. You also have this program that is putting data into the database. Supposing you're reading the data you have, from a couple of CSV files, collected from different secretaries in the same company. As you're about to start running your import script, you're suddenly alerted that there could be duplicate information in those CSV's and you have to ensure it doesn't mess up the database. What do you do?&lt;br /&gt;&lt;br /&gt;I'm not sure what the no brainer answer is for a lot of ppl, but lets look at the alternatives.&lt;br /&gt;&lt;br /&gt;1. Modify your script to (a) Hold the names in memory as it is reading, and compare new names with those already in memory to ensure duplicates don't occur (DONT LAUGH :) )&lt;br /&gt;&lt;br /&gt;2. Before each insert, try to retrieve the same name from the database, just to see if its already there. If its not there (its UNIQUE), then insert.&lt;br /&gt;&lt;br /&gt;3. Just make the stupid field in the database UNIQUE and don't touch you script at all.&lt;br /&gt;&lt;br /&gt;Looking back at the three alternatives now, its almost a no-brainer see which is the most trivial and probably better (at least for me the programmer) solution.&lt;br /&gt;&lt;br /&gt;Let's look at this solutions again before I finalize my point.&lt;br /&gt;&lt;br /&gt;Solution 1.&lt;br /&gt;===========&lt;br /&gt;&lt;br /&gt;In solution 1, we were trying to do EVERYTHING in our code. Without basically, if we like it or not, or we realize it or not, we're going to need to replicate some functionality of a database (in memory data store). Once we commit to that solution, we're introducing a LOT of possible bugs, since our once simple import script will become an import script with an Embedded Database (albeit a poor man's database), and of course since its a poor man's database, our program and we the programmer will suffer from that decision. What will probably save us from this condition is if we realize this, and remember that usually, our programs should STRIVE to DO ONE THING, and DO IT WELL. Also, if there is ANOTHER program/library, that DOES WHAT WE WANT DONE, BETTER than we do it, WE OWE OURSELVES to TRY TO USE IT. Enough said. (Did i hear someone say Opensource?)&lt;br /&gt;&lt;br /&gt;Solution 2&lt;br /&gt;===========&lt;br /&gt;&lt;br /&gt;In solution two, the change to our program is much simpler, because we're exploiting a property of our Database Server (querying for prior existence), before we insert. We can see that once we involve the Database System in anyway, our headaches automagically reduce to a very negligible minimum. This is almost acceptable, and in some cases of software layering is very ok. At least, we've pushed the real data manipulation to the system that was designed for data manipulation... the database itself.&lt;br /&gt;&lt;br /&gt;Solution 3&lt;br /&gt;============&lt;br /&gt;&lt;br /&gt;The only reason why solution 2 is not the best solution is because Solution 3 is possible. Probably not in all cases, as there maybe some stripped down version of an embedded database to be used in a low resource application that will not have the ability we exploit in Solution 3, but as long as it exists, it is a preferred solution. Here, we totally shift EVERYTHING to the database layer. This is true layering. And our first advantage is ultimate simplicity... we DONT ALTER OUR CODE AT ALL. Now, that is a benefit i'm proud of. On the other hand, we have to be aware that this can be done, else we can't benefit from this. This brings to mind one of the nuggets i came across once about being a good programmer. It said to LEARN ABOUT THE ADVANCED FEATURES OF YOUR LANGUAGE(s). The idea being that most of those advanced features are easier ways of solving very real problems.&lt;br /&gt;&lt;br /&gt;Now for a quick summary. &lt;br /&gt;&lt;br /&gt;Its always beneficial for us everyone if we can properly design our solution systems to exploit designed-for strengths of various components of our systems. Infact, if we don't, we almost invariably build weaker systems. This is why working harder is not always a good thing, but working smarter usually translates as a problem solver.&lt;br /&gt;&lt;br /&gt;Now, at times, it is not obvious that there is a better layer to handle your problem, so what do you do? Well, i usually think about my implementations, and everytime i find my self doing too much work, it *smells* wrong. I may not know the best solution immedietly, but i do leave TODO's and other kinds of hints in my code, so if a wiser me or a wiser someone else comes along, that code can be improved latter. Its usually better to roll-out a quick dirty solution within your time constraint than a better solution out of budget time. Your programming buddies may hail you for that, but your boss will chew you out, and you may have cost your company an actual job.&lt;br /&gt;&lt;br /&gt;The key is to COMMIT TO IMPROVEMENT. If you identify a problem that you don't have the mental resources to solve now, not it down, and solve it latter. If on the other hand, you CAN solve it now, please do, or your head WILL Fly :)&lt;br /&gt;&lt;br /&gt;Ok... now, repeat after me... "I am done reading this blog entry for today..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111970420356792670?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111970420356792670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111970420356792670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111970420356792670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111970420356792670'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/solution-layering.html' title='Solution Layering'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111970131244974424</id><published>2005-06-25T12:33:00.000+01:00</published><updated>2005-06-25T13:08:32.456+01:00</updated><title type='text'>More Python and Linux at work</title><content type='html'>Recently, i've been having more and more opportunity to use Python at work... mostly for scripting a lot of stuff for myself, as the needs were arising. Especially data analysis.&lt;br /&gt;&lt;br /&gt;Well, i had another more "official" data transformation or more accurately data migration project recently. I had to migrate a very flat file database built in Access, to a more Relational Model solution, still built in Access. And it was to be a quick job. So here I was, itching to use Python (i mean... there was no way i was going to be doing that in C#... just plain old forget it... its too complicated and error prone.)&lt;br /&gt;&lt;br /&gt;First thing i did to assuage my concience was to state the problem aloud, and ask if anyone had ANY MEANS that would solve this problem elegantly without my use of Python (Everyone knows Stan and I love Python), so well, we brainstormed for sometime, and honestly, there was no simpler faster solution (I knew that already, but i just wanted to be sure i wasn't being merely self-serving).&lt;br /&gt;&lt;br /&gt;Long story short... I did the project in Python. To make things even more interesting, Dan Lash (one of the new consultants at Artemis, and most importantly the consultant on this project), is also a Pythonista, needless to say, we had real fun on this project, and NO BUGS, just suggested implementation changes. Nice wrap up.&lt;br /&gt;&lt;br /&gt;On the case for Linux, i'm still keeping this underwraps a bit, but we've been pursuing a lot of OpenSource solutions for some new projects coming down the line, of which i can't really say much of at the moment. But I'm currently configuring E17 (Yup.. The new Enlightenment), for Dapo. The last week, we were setting up Eclipse/Java/Tomcat/MySql, the whole works on Linux and stuff like that... &lt;br /&gt;&lt;br /&gt;Pretty interesting and cool. I'm getting to do more of what i really love i guess... could still be much more coming the next few weeks too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111970131244974424?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111970131244974424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111970131244974424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111970131244974424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111970131244974424'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/more-python-and-linux-at-work.html' title='More Python and Linux at work'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111945560978938108</id><published>2005-06-22T16:41:00.000+01:00</published><updated>2005-06-22T16:53:29.796+01:00</updated><title type='text'>Truce indeed.. who am i decieving?</title><content type='html'>ahh... i really don't feel too good.&lt;br /&gt;&lt;br /&gt;i'm afraid i'll have to take at least one day off... arrgghh! There goes my stainless record.. anyways... my good friend Ugo put me in perspective, when he told me to stop playing Superman, and just go lie down and get better...&lt;br /&gt;&lt;br /&gt;i think he's right...&lt;br /&gt;&lt;br /&gt;Btw, just some random updates... i have been doing a full recon of website authoring recently... its been a while since i did that. And i'd been really growing tired of Table Kung-Fu (as Ryan neatly described that art!).&lt;br /&gt;&lt;br /&gt;Anyways, DIVS, CSS, Ajax, the whole thing... i'm even thinking of picking up Ruby On Rails... ahh... anyways... this malaria fever thing is slowing me down... this is just why i hate to turn in sick :(&lt;br /&gt;&lt;br /&gt;Bahh... i better just sign off now...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111945560978938108?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111945560978938108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111945560978938108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111945560978938108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111945560978938108'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/truce-indeed-who-am-i-decieving.html' title='Truce indeed.. who am i decieving?'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111935772291569526</id><published>2005-06-21T13:22:00.000+01:00</published><updated>2005-06-21T13:42:02.920+01:00</updated><title type='text'>Malaria, Truce and libnetprog (What the heck!!!)</title><content type='html'>i'm feeling a bit under the weather...&lt;br /&gt;&lt;br /&gt;Its like i have this running bet with Malaria, and every year, it tries to get me down at least once... there were times when i used to be gotten down... but these days... we sort of lock into a stale mate.&lt;br /&gt;&lt;br /&gt;I keep going to work... being slightly affected with a nagging headache, and probably teary eyes that hurt. On my part.. i increase the intensity of my exercises, take more Vitamin C, drink lots of water... and work harder during the day than before.&lt;br /&gt;&lt;br /&gt;This truce of convenience lasts for about 3 or 4 days, and eventually i'm back to normal. This is waaaaay much better than being enBEDDED for about 1wk. #:-s&lt;br /&gt;&lt;br /&gt;Anyways... i'm in the middle of one now... started yesterday, and i still worked till 10.30pm yesterday, on one of those small and interesting utility projects.&lt;br /&gt;&lt;br /&gt;In finishing that project, i had to dig up a library i had started work on a while back, and clean it up, extend it, and use it. I call it 'libnetprog', and was my way of 'pythonizing' or 'c-izing' .NET network programming. I TOTALLY HATE STREAMS!!! why Java, and .NET decide to NOT encapsulate if i will never know. Anyways..., libnetprog.NSTcpClient() [No Streams TcpClient()] is an encapsulation of System.Net.Sockets.TcpClient() but adds Send() and Recv() that allows more natural communication by abstracting the NetworkStream away from the user. That and the conversion that goes on with System.Text.Encoding.ASCII&lt;br /&gt;&lt;br /&gt;libnetprog.SMTPClient() is another cool class. And it has a very usefull static function SendMail(), that is inspired by PHP's mail() function.&lt;br /&gt;&lt;br /&gt;Anyways... lots of UnitTests in that library, and its looking good and stable. Its a 'driven-by-need' library, which i'm only extending as the need arises... i guess i should put this up on my website download area.&lt;br /&gt;&lt;br /&gt;Ahh.... that reminds me... i've stumbled across a very nice way of layering GUI applications... its just a natural extension of Refactoring and Bottoms Up programming (Aggressive Unix Programming), applied to GUI's, and so far, all the stuff i'm building i'm building like that.&lt;br /&gt;&lt;br /&gt;I *think* they're very stable (since i can trivially UnitTest the GUI using this method), and i end up having reusable components too... i'll blog about that latter... let me get the entire picture very clear :)&lt;br /&gt;&lt;br /&gt;btw, good to be back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111935772291569526?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111935772291569526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111935772291569526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111935772291569526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111935772291569526'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/malaria-truce-and-libnetprog-what-heck.html' title='Malaria, Truce and libnetprog (What the heck!!!)'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111869365110964837</id><published>2005-06-13T21:03:00.000+01:00</published><updated>2005-06-13T21:14:11.126+01:00</updated><title type='text'>Alive and Kicking</title><content type='html'>just a short note... i'm still alive and kicking... or well.. coding :)&lt;br /&gt;&lt;br /&gt;fast blog updates coming soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111869365110964837?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111869365110964837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111869365110964837' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111869365110964837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111869365110964837'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/06/alive-and-kicking.html' title='Alive and Kicking'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111562840193341016</id><published>2005-05-09T09:35:00.000+01:00</published><updated>2005-05-09T09:46:42.013+01:00</updated><title type='text'>BOLIVIA!!!</title><content type='html'>WHOOOOO!!!&lt;br /&gt;&lt;br /&gt;Bolivia just came in this morning :)&lt;br /&gt;&lt;br /&gt;She's my new Laptop. A sexy Compaq R4000.&lt;br /&gt;&lt;br /&gt;Right now, its running Windows Only..... Uggh!! I'll fix that over the weekend. Put Archlinux + Enlightenment D17.&lt;br /&gt;&lt;br /&gt;I can hardly wait to see Enlightenment on this baby.... un... one... two... UNO!!&lt;br /&gt;&lt;br /&gt;Right now, i'm paying my last rights to Wendy (My Older Laptop a buxom Dell Inspiron 2500), She served me well too, and stuck with me thru my earliest of Open Source Projects (ALE, PTSP and currently imlib2 python bindings and edje python).&lt;br /&gt;&lt;br /&gt;She's done good, but i'm eager to put Bolivia to the test... with a sweet 15.4" widescreen, coding has never been this good.&lt;br /&gt;&lt;br /&gt;Ahhh...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ok ok ok... let me get back to work now... this week is going to be full of collaborations btw Wendy and Bolivia as I slowly romance Bolivia :D&lt;br /&gt;&lt;br /&gt;ok ok ok....&lt;br /&gt;&lt;br /&gt;I'm off now :)&lt;br /&gt;&lt;br /&gt;Ohh... and yeah... this post is made from Bolivia :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111562840193341016?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111562840193341016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111562840193341016' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111562840193341016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111562840193341016'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/05/bolivia.html' title='BOLIVIA!!!'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111537767702524667</id><published>2005-05-06T12:07:00.000+01:00</published><updated>2005-05-06T12:07:57.070+01:00</updated><title type='text'>XSL Transformations AT WORK - Literally</title><content type='html'>&lt;div class=Section1&gt;  &lt;div&gt;  &lt;div&gt;  &lt;div&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;During our &amp;#8216;Geekify&amp;#8217; session on Wednesday, Stan took us on XSL transformations and it was like&amp;#8230; WOW!!!!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;You know&amp;#8230; XML is cool and all, but probably XSL is really what makes XML sooo usefull. Its so interesting.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;Also, just to satisfy the Geek Child in me, I designed an XML format and accompanying XSL stylesheet for our daily SCRUM updates. Those where beginning to look messy, and I&amp;#8217;d had in mind to write a Python frontend, to generate the report, but once Stan did the XSL tutorials, I was like&amp;#8230; HEY!!! That&amp;#8217;s what I need. Akin is currently using the XML raw, but he&amp;#8217;s interested in Building a GUI frontend, to generate the XML for him. I mean, he takes notes at scrum, so he&amp;#8217;s the one to make his life easier.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;The other part of this is that, with all this &amp;#8216;make_life_easier&amp;#8217; projects I&amp;#8217;m introducing at the office, its interesting to see how other members of my team are reacting&amp;#8230; it seems hacking is back in fashion at the office, and I&amp;#8217;m beginning to notice it in how we&amp;#8217;re working.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;Ahh&amp;#8230; the rise of the hackers :)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;____________________________________________________________________________________&lt;/span&gt;&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&amp;nbsp;&amp;nbsp; [x for x in range(0,200) if (lambda y: len([z for z in range(2,y-1) if y%z == 0]) == 0)(x)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face="Trebuchet MS"&gt;&lt;span style='font-size: 10.0pt;font-family:"Trebuchet MS"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/div&gt;  &lt;/div&gt;  &lt;p class=MsoNormal&gt;&lt;font size=3 face="Times New Roman"&gt;&lt;span style='font-size: 12.0pt'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-111537767702524667?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111537767702524667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111537767702524667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111537767702524667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111537767702524667'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/05/xsl-transformations-at-work-literally.html' title='XSL Transformations AT WORK - Literally'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111521158058709074</id><published>2005-05-04T13:58:00.000+01:00</published><updated>2005-05-04T13:59:40.596+01:00</updated><title type='text'>Python In The Office</title><content type='html'>I’ve been finding ways to make my life easier, more interesting and generally more efficient.&lt;br /&gt;&lt;br /&gt;Ok… that’s just an excuse to introduce my lattest work plaything… Python.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;If you know me at all, you’ll know that I would love to work daily with Python, but I work in a C#/.NET outsourcing, so it’s sort of impossible right? I mean since IronPython is still in early alpha, there’s nothing I can actually do about that, right?&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Well, I’d not been really using my brain earlier. Now that I am actually turning on my brain full force, by aggressively getting lazy about repetitive tasks in any incarnation, I’ve began to really see uses of Python all around what I do almost on a daily basis.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;It started with writing libpm, which is a Python library to interface with a Webservice which we use to do some reporting at work. Well, my next focus was some really dreary analyses I’ve been doing on a database project. I run some huge queries, and produce files and I’m supposed to compare for accuracy and other stuff. Well, when I’m troubleshooting, I get to do a lot of other fancy stuff to those files, and I’d been doing all these visually all this while!!! &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Last week, I had to get back to the project, as it has over-dragged behind other projects, and for the analyses, I said NO NO NO, I’m not doing this visually again. I mean, its not even efficient enough, so I dug up Python and started building up small functions and small programs. As a result of that I now have a little module called ‘kamba’ that does some really interesting text processing. The most exiting is a function align, that if given two lists in the form of:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;            [1,2,3,4,5,6,7,8,9,10,11]&lt;br /&gt;&lt;br /&gt;            [1,3,5,6,9,10]&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Will return a third list which aligns the second one against the first one, like:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;            [1, ,3, ,5,6, , ,9,10, ]&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;This single functionality is a realllll time shaver :D, and combined with other stuff has helped me get more usefull results in my analyses.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;I think I’ve discovered in doing this, that hackability of a platform depends on a lot of factors, but most importantly are the tools available and the mindset of the said hacker.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;I really am not thrilled by Windows generally, but hey, Python on Windows is helping me get some of the fun I normally catch on UNIX.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;The second thing is that flexible tools affect mindset. For instance, If I didn’t have Python available to me, there is no way I would have written those tools in a language like C# or similar. Why? Well… there’s a lot of inherent overhead in setting up the project, and just thinking thru annoying issues like type definitions and other things that are not directly related to the problem you’re trying to solve.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;This is not exactly a bad thing considered on its own, I mean, there’s the argument that you should use another tool to do that kind of thing. Well… this brings me to my point. My point is that a lot of programmers these days (well, at least more than I would like to think about), don’t have any kind of dynamic programming tool at their disposal, because there’s this prevalent all or nothing mindset. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Those kind of people are more apt to resist programmatic changes. They don’t think in terms of scripts and quick solutions. They’re not used to making small programs that do only one thing and do it well, or really to writing small functions that do one thing and do it well.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Basically, by sticking to and working with non-malleable programming languages their mindset is also non-malleable. These kinds of programmers find it hardest to think Agile or think in the dynamic way needed to really drive software development these days.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Ofcourse you could say this is just my opinion, and I’d agree with you, but I’ll point out that I’ve met plenty of these kinds of programmers.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;My recommendation is that every programmer, should learn more than one language. And these languages should be best spread along different programming paradigms. For instance, if someone learnt to program with Java, and has now learnt C#, yeah… that’s ok… but this person has NO IDEA whatsoever of how a program can be written without classes. This programmer also is more likely to have more complex approaches to problems than others that are exposed to say C, Ruby, Python, Perl, and shell scripting.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Anyways…. Work is currently more interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111521158058709074?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111521158058709074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111521158058709074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111521158058709074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111521158058709074'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/05/python-in-office.html' title='Python In The Office'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111521100459885766</id><published>2005-05-04T13:50:00.000+01:00</published><updated>2005-05-04T13:50:04.686+01:00</updated><title type='text'>pyimlib2</title><content type='html'>&lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;Yesterday nite, at the perfect witching hour( 12.00 midnite), myself and stan started work on building a python extension module for imlib2.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;Imlib2 is a very robust and interesting image manipulation library is part of the new generation Enligtenment Family &amp;#8211; Enlightenment Foundation Library.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;It was a very enlightening experience (pun intended &amp;#8211; mfon, I just had to say that :P). Our approach which we&amp;#8217;re trying to keep as Agile as possible so we see quick results, was to pickup the EFL Cook Book, and go thru the examples on imlib2, then for each example, port enough functionality to a python extension to allow the example to be done in Python totally.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;As at yesternite, we have just one function left to complete example one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;So far we have:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;imlib2.load()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;imlib2.clone()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;imlib2.save()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;imlib2.get_size()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;tonite, we&amp;#8217;ll add imlib2.blend().&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;What we&amp;#8217;ve been thinking is that it will be more natural to have an Imlib2Image object(), that will have all these functions as methods. For now, we&amp;#8217;ve not totally decided how to implement this, but I don&amp;#8217;t think we&amp;#8217;ll build the object in C. its more likely that when we have the functions in python completely, then we&amp;#8217;ll build a higher level Python Library abstracting that into an Object. That&amp;#8217;s the more natural way that I&amp;#8217;m thinking of it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;Ahh&amp;#8230; this application layering thing is making lots of sense now.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div&gt;  &lt;div&gt;  &lt;div&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Tahoma&gt;&lt;span style='font-size:10.0pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;____________________________________________________________________________________&lt;/span&gt;&lt;/font&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&amp;nbsp;&amp;nbsp; [x for x in range(0,200) if (lambda y: len([z for z in range(2,y-1) if y%z == 0]) == 0)(x)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=1 face=Tahoma&gt;&lt;span style='font-size:7.5pt; font-family:Tahoma'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face="Trebuchet MS"&gt;&lt;span style='font-size: 10.0pt;font-family:"Trebuchet MS"'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/div&gt;  &lt;/div&gt;  &lt;p class=MsoNormal&gt;&lt;font size=3 face="Times New Roman"&gt;&lt;span style='font-size: 12.0pt'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&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/10244258-111521100459885766?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111521100459885766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111521100459885766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111521100459885766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111521100459885766'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/05/pyimlib2.html' title='pyimlib2'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111521146075845941</id><published>2005-05-04T09:55:00.000+01:00</published><updated>2005-05-04T13:57:40.770+01:00</updated><title type='text'>The Force Is Strong With This One</title><content type='html'>If you've not yet guessed, my favourite programming languages are C,Python and D. I have no real order there, as it depends on what i'm doing, but with those three languages i have a whole spectrum of problem areas covered.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Recently, i've been thinking of adding one more layer to projects i do in C. A python layer.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;The thougt process follows from trying to make a system as programmable and explorable as possible, and to reduce the amount of time needed for a hacker to get to actually hacking the system. What trips me silly about python everytime, is the live intepreter you get with it, so one can interogate libraries while learning about them. You don't have to use the usuall - READ_FIRST-&gt;Code-&gt;Compile-&gt;PRAY_MURPHY_IS_BUSY-&gt;Execute cycle. You can actualy grab a library, and fireup the intepreter, print the __doc__ string, and start figuring out how to go, if you get stuck, google, then come back and continue.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;To a large extent you can do this in other languages, but Python with its live intepreter takes it to a new level... trust me :)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Anyway, this is a model of programming in c i'm trying to formulate:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;[Applications (C-Programs,shellscripts, GUIs,etc)]&lt;br /&gt;&lt;br /&gt;  |         |                                  |&lt;br /&gt;&lt;br /&gt;  | [c-command-line-utility][Python Layer]&lt;br /&gt;&lt;br /&gt;  |         |                                  |&lt;br /&gt;&lt;br /&gt;[       c-library-layer                  ]&lt;br /&gt;&lt;br /&gt;                   |&lt;br /&gt;&lt;br /&gt;[          problem scope                 ]&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;At the bottom-most of this layer, is the problem we're trying to solve. Say for instance, manipulating Netfilter on LInux in userspace.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;The first layer, is made up of a well designed C-Library (in this case, libipq), that properly abstracts every kind of interaction with the linux Netfilter layer. Once the library is in place, theoritically, the problem is solved, but normal users can't use it yet. Applications have to be written.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;On unix, there is a common practice, that these libraries normally are accompanied by command-line utilities, that are almost like proof-of-concepts for the libraries. Some of these tools are so advanced that every single thing doable in the library is doable by the commandline utility with just an option switch and the proper argument. (I should state here that sometimes, probably most times i guess, these libraries are never solo projects, but actually arise while on the path to craft the command-line tools)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Traditionally, after the command-line tool layer is available, it qualifies as an Application, well..., as a System software. At this stage, system administrators can use shell scripting, perl or even python to drive the command-line utility in ways the creators never thought was possible. Finally, GUIs can be tacked on as a Front-end to many of these utilities, and we have a complete appliation stack.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;The problem is that once in a while, there exists a feature that can not by its very nature be exposed by the command-line-utility. Apart from that, it may not be desirable for any reason to write a much higher level application in C. I personally prefer to leave that layer for languages like Python and D... Actually Python ;)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;This is where the other layer, the Python Layer comes in. I placed it at the same layer as the command line utility, because it interacts with the c-library-layer for you, but unlike the command-line-utility, it can have access to every single functionality of the c-library, hence allowing even more to be done at a higher level in the stack, without having to fall back to raw C.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;I'm currently literally putting my money where my mouth is, by building a python layer for 'scode' i call, pyscode. Scode is a personal project of mine (hmm... i should put it up on my website next weekend.)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;I’ve also concluded a python extention to another library I have (a much smaller one I use for managing packed inet addresses and dotted notation), called ‘addrtool’.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;so far, i'm having fun learning how to extend Python with C. It trully a path to increasing the Force withing you :D&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Ok... so much for my ramblings.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;____________________________________________________________________________________&lt;br /&gt;&lt;br /&gt;   [x for x in range(0,200) if (lambda y: len([z for z in range(2,y-1) if y%z == 0]) == 0)(x)]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111521146075845941?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111521146075845941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111521146075845941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111521146075845941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111521146075845941'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/05/force-is-strong-with-this-one.html' title='The Force Is Strong With This One'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111445169742964606</id><published>2005-04-25T18:54:00.000+01:00</published><updated>2005-04-25T18:54:57.433+01:00</updated><title type='text'>Python Windows Services</title><content type='html'>&lt;span style="font-size:85%;"&gt;We had project last friday to write a windows service that would poll an Exchange mail box and write to a database. It was executed in C#. Well... i got thinking... hmmm... can't python be used to do this? Because if it can, then that project would not last more than a couple of hours (actualy, the C# project shouldn't also last more than a couple of hours if you know what you'r doing, but hey.. i have to have something to say about why i decided to do it in Python write? i mean.... I LOVE Python may not cut it for some folks :) )&lt;br /&gt;&lt;br /&gt;OK... lets get to the meat of it.&lt;br /&gt;&lt;br /&gt;I first hit google, looking for links to python and windows services. I then found some mailing list archives and in one of them, there was a reference to a chapter on Windows Services in the book, Programming Python on Win32.&lt;br /&gt;&lt;br /&gt;Well... i had access to the book, and went headlong. Long and short of it, 15 mins of perusing latter, I had a windows service running. Lets attempt to get this stuff to work together now.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First there are two very important modules that helps our lives out. win32service and win32serviceutil&lt;br /&gt;&lt;br /&gt;We're going to write a service that just writes to the event log every 10 seconds. U'll have to stop this service soon or else, you'll run out of EvenLog space ;)&lt;br /&gt;&lt;br /&gt;First some important pre-parations and background on python-windows services. There is a program called pythonservice.exe, that actually handles everything that concerns windows services written in Python. I'm walking a thin rope here with this explanation now, but this is how i understand it, just don't quote me in a conference where there are other Pythonistas and Lords Of the Eggs, I'll deny it vehemently ;)&lt;br /&gt;&lt;br /&gt;The way i figure it, pythonservice.exe is to python services what the usual python.exe is for all other normal python scripts. Normally on windows, once .py is associated with python.exe, each time you run a script, the python intepreter, python.exe is called to 'intepret' it. For services, apparently some funky stuff goes on, so instead of calling python.exe as the intepreter, pythonservice.exe is called as the intepreter (well, not exactly intepreter i guess, but it is the process that runs the services.) You can also look at it like this: You say service start, windows identifies it as a python service, and starts pythonservice.exe passing it parameters to find the service itself. Pythonservice.exe locates the service, and starts it. As far as windows is concerned, it is running a process called PythonService.exe (You'll see that without special tricks, when writting to eventlog, PythonService is the one that does the writing)&lt;br /&gt;&lt;br /&gt;Now the preceeding means that windows has to know to associate python services with pythonservice.exe . This is essentially called registeration. So pythonservice.exe must be registered with windows to handle python windows services. to do that, locate where the python win32 extensions are on your box. They'll probably be in your site-packages folder. Look for the win32\ subdirectory, and you'll locate pythonservice.exe sitting somewhere there:&lt;br /&gt;&lt;br /&gt;Mine is at C:\Python24\Lib\site-packages\win32\pythonservice.exe&lt;br /&gt;&lt;br /&gt;you can change to that directory:&lt;br /&gt;&lt;br /&gt;C:\Python24\Lib\site-packages\win32&lt;br /&gt;&lt;br /&gt;and then do: pythonservice.exe /register&lt;br /&gt;&lt;br /&gt;You should see a message about registering the Python Service Manager.&lt;br /&gt;&lt;br /&gt;After that, if there are no errors, we're ready to plunge.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First, we need to import the two all important modules.&lt;br /&gt;&lt;br /&gt;For those who don't understand Python... the lines beginning with #, are just comments.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import win32service&lt;br /&gt;import win32serviceutil&lt;br /&gt;import time&lt;br /&gt;&lt;br /&gt;#at this point. We're ready to go.&lt;br /&gt;#Put simply, a python windows service inherits from win32serviceutils.ServiceFramework&lt;br /&gt;#simply extending that class, sets up all you ever need to do.&lt;br /&gt;&lt;br /&gt;class aservice(win32serviceutil.ServiceFramework):&lt;br /&gt;   _svc_name_ = "aservice"&lt;br /&gt;   _svc_display_name_ = "aservice - It Does nothing"&lt;br /&gt;&lt;br /&gt;   def __init__(self,args):&lt;br /&gt;       win32serviceutil.ServiceFramework.__init__(self,args)&lt;br /&gt;       #at this point service is created pefectly.&lt;br /&gt;       #you could stop here and jump to setting up the '__main__' section,&lt;br /&gt;       #but you wont be able to stop your service, and it won't do anything.&lt;br /&gt;       #at the very least, you need to implement SvcDoRun() and better still SvcStop():&lt;br /&gt;       #This next attribute is used when its stopping time.&lt;br /&gt;       self.isAlive = True&lt;br /&gt;&lt;br /&gt;   def SvcDoRun(self):&lt;br /&gt;       import servicemanager&lt;br /&gt;       while self.isAlive:&lt;br /&gt;           #remember when i said you needed only two modules?&lt;br /&gt;           #well... i think i lied. If you're going to do anything&lt;br /&gt;           #usefull, you're going to obviously need more modules.&lt;br /&gt;           #This next module servicemanager, has some funny&lt;br /&gt;           #properties that makes it only to be visible when&lt;br /&gt;           #the service is properly setup. This means it can't be imported&lt;br /&gt;           #in normal python programs, and can't even be imported&lt;br /&gt;           #in the Global Namespace, but only in local functions that&lt;br /&gt;           #will be called after the service is setup. Anyway,&lt;br /&gt;           #this module contains some utilities for writing to EventLog.&lt;br /&gt;&lt;br /&gt;           servicemanager.LogInfoMsg("aservice - is alive and well")&lt;br /&gt;           time.sleep(10)&lt;br /&gt;           servicemanager.LogInfoMsg("aservice - Stopped")&lt;br /&gt;&lt;br /&gt;   def SvcStop(self):&lt;br /&gt;       #before you stop, you'll want to inform windows that&lt;br /&gt;       #you've recieved a stop signal, and you're trying to stop.&lt;br /&gt;       #in the windows Service manager, this is what shows the status message as&lt;br /&gt;       #'stopping'. This is important, since SvcDoRun() may take sometime before it stops.&lt;br /&gt;       import servicemanager&lt;br /&gt;       servicemanager.LogInfoMsg("aservice - Recieved stop signal")&lt;br /&gt;       self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)&lt;br /&gt;       self.isAlive = False #this will make SvcDoRun() break the while loop at the next iteration.&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;   win32serviceutil.HandleCommandLine(aservice) #this line sets it all up to run properly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Uhh... just incase you haven't guessed. That is all for the service.&lt;br /&gt;The next part is installing and starting it. You can save this as aservice.py&lt;br /&gt;&lt;br /&gt;cd to the directory where it is saved and do:&lt;br /&gt;&lt;br /&gt;aservice.py install&lt;br /&gt;&lt;br /&gt;Note that 'aservice.py remove' will remove the service&lt;br /&gt;&lt;br /&gt;you can start and stop with Windows Service manager or:&lt;br /&gt;&lt;br /&gt;aservice.py start&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;aservice.py stop&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OK... that's it... play around, flesh out... anything.&lt;br /&gt;&lt;br /&gt;You may or may not have figured out that the entire functionality of the serivice gets started from SvcDoRun()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's all folks... i hope this is usefull :)&lt;br /&gt;Hey... i just had a brainwave. I'll repeat the code here without any comments :)&lt;br /&gt;&lt;br /&gt;import win32service&lt;br /&gt;import win32serviceutil&lt;br /&gt;import time&lt;br /&gt;&lt;br /&gt;class aservice(win32serviceutil.ServiceFramework):&lt;br /&gt;   _svc_name_ = "aservice"&lt;br /&gt;   _svc_display_name_ = "aservice - It Does nothing"&lt;br /&gt;&lt;br /&gt;   def __init__(self,args):&lt;br /&gt;       win32serviceutil.ServiceFramework.__init__(self,args)&lt;br /&gt;       self.isAlive = True&lt;br /&gt;&lt;br /&gt;   def SvcDoRun(self):&lt;br /&gt;   import servicemanager&lt;br /&gt;&lt;br /&gt;       while self.isAlive:&lt;br /&gt;           servicemanager.LogInfoMsg("aservice - is alive and well")&lt;br /&gt;           time.sleep(10)&lt;br /&gt;           servicemanager.LogInfoMsg("aservice - Stopped")&lt;br /&gt;&lt;br /&gt;   def SvcStop(self):&lt;br /&gt;       import servicemanager&lt;br /&gt;&lt;br /&gt;       servicemanager.LogInfoMsg("aservice - Recieved stop signal")&lt;br /&gt;       self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)&lt;br /&gt;       self.isAlive = False&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;   win32serviceutil.HandleCommandLine(aservice)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note that if you're going to copy and paste this stuff, you may have some white space issues, since i'm just typing straight and editing here.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;gtg&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10244258-111445169742964606?l=essiene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://essiene.blogspot.com/feeds/111445169742964606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10244258&amp;postID=111445169742964606' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111445169742964606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10244258/posts/default/111445169742964606'/><link rel='alternate' type='text/html' href='http://essiene.blogspot.com/2005/04/python-windows-services.html' title='Python Windows Services'/><author><name>Essien Ita Essien</name><uri>http://www.blogger.com/profile/07106259413730091120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_71vXvqQL2Io/SPD3qiQkRpI/AAAAAAAAAGU/vJFM8yeMtFw/S220/mevatar-cartoon.jpg'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10244258.post-111374356047786909</id><published>2005-04-17T14:05:00.000+01:00</published><updated>2005-04-17T14:12:40.483+01:00</updated><title type='text'>Software design by Evolution - What Charles Darwin Had to say on programming.</title><content type='html'>&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;Software design by Evolution - What Charles Darwin Had to say on programming.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;p&gt;&lt;br /&gt;There is the age old advice of sitting down to figure out every single thing about a system before attempting to build it. This works in lots of well structures that don't have changing requirements, and are usually cast in stone once the design is&lt;br /&gt;approved. The problem is that in software systems, requirements keep changing, while delivery dates keep sliping. &lt;/p&gt;&lt;p&gt;It seems then that this method that works so well in a field like say, Civil Engineering and Construction is not doing so well in Software Development. A lot of other very intelligent people have talked a lot on the pros and cons of Detailed Initial Design, so I won't give it&lt;br /&gt;much attention here. Instead i will talk about a method i've been using while coding, and has allowed me to challenge my clients with statements like, "This project can pretty much go any direction you want it to go.", "We can change anything, any how you want it". And just incase, you have not yet figured it out yet, i actually have been encouraging scope creep from my clients :). Should I add at this point that once faced with that possibility, they actually didn't take up the offer. (Uhh... don't try this with your clients... you may b biting off much more than you can chew ;) )&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Anyway, the point is that it is possible to code flexibly, in such a way that features are not frowned upon, and the resulting code is still very well built and maintainable. I call this method 'Design By Evolution'. Actually, this is just a fancy name for Bottoms-Up programming, or what i usually love calling, the "UNIX" way, just for the simple reason that I first saw evidence of its existence in the way UNIX programs are written.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;u&gt;So what is Design by Evolution?&lt;/u&gt;&lt;br /&gt;In a nutshell, it is a method of code design, where existing code naturally determines the next evolutionary step (which happens to be new features, etc). Also its most important feature or concept is that you NEVER design what you're not building immmidietly. In Agile development practices, i think this is called deferment or something like that.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Now, let me take it slightly deeper. Traditionally, if we want to design a program that accepts and parses various structure, read from a database, and the results stored into a file. We might want to start by building a super class that all the data&lt;br /&gt;structures will inherit from, that will have methods for reading from the database, writing to file, etc. This is traditionally good OOP design. In 'Design By Evolution', I wont commit to the super class untill the need comes up. For instance, if in my first release, i will only be dealing with one type of data structure, Traditional design will be best served if i already have the super class built, at this first release, but design by evolution begs to leave this decision until it is unavoidable. So i would release my first version with just support for the single data type. &lt;/p&gt;&lt;p&gt;In a second version, if its justifiable to build a super class then i do, but if its not, i still hold off untill it becomes unavoidable. This may seem like concious bad design, but that's because I've already mentioned the constrasting traditional approach. In practice what this means, is to consider ONLY the problem that is before you, with NO THOUGHT of implementation detail on problems that have not yet arisen. My good friend Stan always says, "We'll cross that mountain when we get there". &lt;/p&gt;&lt;p&gt;What this does is many fold.  First of all, it removes the overhead that comes with trying to figure out a solution so that you don't get stuck latter on. I say that this worrying is MOST of the time, premature. If you keep to good coding practices of modularity and small contained non-overlapping units, you'll be able to tear down and rebuild sections of code that need&lt;br /&gt;to be torn down and rebuilt, without breaking other parts of the code. If indeed it ends up being a lot of work to do, i say that its more advantageous to do this work latter when it is needed, than earlier when its not needed.&lt;/p&gt;&lt;p&gt;The other aspect of Design by Evolution is the fact that its easier to build an EarthQuake resistant Airport (like Kansai Airport :D ), if you've actually been exposed to Earth Quakes, than if you learnt about Earth Quakes from School. This is because real life is soooo different from imagination. Relating this to programming and design, its usually easier to have a&lt;br /&gt;code base without a feature, and then work the feature into the code base, within the design limitations afforded by the existing code base, than it is to design a feature complete code base and begin to build it. &lt;/p&gt;&lt;p&gt;This is because no amount of design can envisage every possible situation (except in the most trivial of cases), so there is almost always going to be a need to redesign and change initial design do
