15th May 2008, 03:39 pm
Messing around with CompizConfig the other day and discovered a nifty tweak: blur your transparent terminal windows!

To do this you need CompizConfig installed:
sudo apt-get install compizconfig-settings-manager
Once installed, go to System > Preferences > Advanced Desktop Effects Settings. Scroll down to Effects and enabled Blur Windows. Then click the Blur Windows button to open the configuration panel. Set "Alpha blur windows" to (class=Gnome-terminal), Check Alpha Blur, set "Blur Filter" to Gaussian, and set "Gaussian Radius" to 9.

15th May 2008, 02:08 pm
I just rolled out some new automation tools for a few projects here at work and so far I've been extremely happy.
Much to my embarrassment, development has previously been outside of source control due to the fact that we develop sites, we don't deploy packaged applications, and we don't have a cohesive IT setup (everyone sets up their desktop to their liking so maintaining consistent development environments across all computers is difficult).
However, thanks to SVN, Xinc and Phing (and DBDeploy), this has changed! Now everything is in source control and automatically deployed to our dev server upon commit. I am currently talking with Arno about perfecting svn tag monitoring to automate staging and (possibly) live deployments, so I'll post about what I did when that's finished.
The great thing about this setup is all pieces are technically interchangeable. If you don't like Xinc you can use CruiseControl. If you don't like Phing you can use Pake, or a shell script even. If you don't like DBDeploy you can roll your own setup or swap it out for your database versioning system of your choice!
However this post will cover Xinc, Phing, and DBDeploy as (a) I have experience with them and none of the others, and (b) they integrate extremely well (Xinc and Phing's primary distribution method of choice are PEAR channels).
Continue reading ‘Automating the Development Workflow’ »
10th May 2008, 07:47 pm
from indiana import jones
import whip
import ruins
cave = new Ruins()
trap = indiana.steal( cave.treasure )
indiana.escape( trap )
ImportError: Snakes? I hate snakes!
1st May 2008, 04:37 am
One of my favorite features of C# is Partial Classes. For the uninitiated, it is a way of defining a class in two separate locations. Very useful when you have code generation utilities such as LINQ.
Unfortunately, PHP has no such feature (though if anyone's listening it would be a great feature to add to the PHP6 feature list), however thanks to the magic of __call($method, $args), __get($key), and __set($key, $value) overload functions as well as passing by reference (aah the good ol' &) we can imitate partial classes.
The idea behind this partial class hack is to instance a copy of the partial class in question and have our magic functions forward any undefined requests to the partial class.
The partial class (probably with the naming convention Partial_CLASSNAME) will contain a reference to the main class and also have magic functions forwarding undefined requests to the main class. The reason why we have our magic functions in the partial class is so that any internal references can still be made (methods in Partial_CLASSNAME must have access to the methods and members in CLASSNAME).
The constructor in the main class will automatically seek out the partial class (and additional coding can be done to seek out more than 1 partial class as well as do some integrity checking) so that the programmer does not have to intervene to form the 'full class'.
Continue reading ‘Partial Classes in PHP’ »
17th April 2008, 11:03 am
At the risk of being marked as blog-spam, I got some pretty funny spam messages in my junk folder recently:
Annoyed by fiasco in bed? Light up now! Leave tiresome experience behind! nice escape is attainable! Flood of feelings is just a few clicks away!
Had enough of problem in bed? Cheer up now! Leave harrassing experience behind! urgent rescue is almoust there! Wow emotions is just minutes away!
Bored about trouble in bed? Liven up now! Leave tedious experience behind! quick help is within reach! Awesome bedtime is just a blink away!
Feeling uneasy about problem in bed? Cheer up now! Leave unnecessary experience behind! emergency is almoust there! Perfect date is just minutes away!
Frustrated disaster in bed? Perk up now! Leave odd experience behind! your magic remedy is available! Emotional breakthrough is just inches away!
Bored about problems in bed? Liven up now! Leave monotonous experience behind! your salvation is accessable! Unforgettable sensation is just inches away!
Disappointed at troubles in bed? Get up now! Leave worrying experience behind! helping uplift is within reach! Emotional breakthrough is just a few steps away!
It's a fun game trying to figure out what each message is peddling. Is it mortgage refinancing, watches, or penis enlargement pills? It's like a mystery!
16th April 2008, 12:51 am
My copy of Pro PHP: Patterns, Frameworks, Testing and More by Kevin McArthur has already been worth the money I spent on it.
In our, albeit slow, upgrade to more modern development practices (code version and unit testing being the last elements on my list), I was particularly fearful of code versioning namely concerning issues of automating a build process to export a copy of the repository to our shared development server, or just have a local server installed for everyone one.
However Chapter 8 has pointed me to two programs that I sincerely regret not having heard of until now: Phing and Xinc.
Phing is a build system written in PHP that works extremely well with PHP and PHPUnit. You can configure your own build targets, for example like "get" (SVN update essentially), "test" (run PHPUnit or any other unit testing), "try" (copy to a development server), and "deploy" (copy to your live server).
Xinc is a continuous integration server. Essentially, it monitors an SVN repo and performs a user defined action (usually running a phing buildscript) on any changes to the repo. Which is awesome because its solves the issue of updating the dev server. Having Xinc run a > phing try on SVN updates is exactly what we need! I'm even having delusions of grandeur of having it monitor tags for doing live deployments as well.
Don't take my word as gospel, I haven't actually installed and tested these systems out, but when I do you can rest assured I will be writing about it.
1st April 2008, 01:34 pm
I am by no means a database expert, such titles are best left to people like Peter Zaitsev and Vadim Tkachenko, however one of my co workers has been asking me for some help on how I come about my database designs, particularly issues concerning normal form.
Whlie I could spend several posts going over the intricacies of 1st, 2nd, 3rd, and 4th normal form as well as "The key, the whole key, and nothing but the key so help me Codd" Boyce-Codd normal form, however reality dictates that time spent strictly to these academic levels is either time wasted (projects with due dates unfortunately cannot spend forever on the database design) or pointless as being reasonably intelligent will bring you very close, if not within 3rd normal form.
If you're really interested, Wikipedia provides a great resource to get started learning the more academic aspects.
I'm going to assume that you have done a bit of database work and at least understand the concept of a join.
The one of the goals of database normalization is to reduce the repetition of information and thereby reduce the complexity of an update of said information. If the same string is in the database N times, we should abstract it so that if we need to update said string due to a typo or anything else, we need to only change but one location.
Continue reading ‘Database Normalization And Design: A Primer’ »
28th March 2008, 01:46 pm
In my previous article (Microsoft Access and PHP), I discussed getting mdbtools setup and dynamically interacting with a instance of mdb-sql. Well it turns out somewhere in the pipeline (probably mdb-tools), we're either not getting an EOF or reading an EOF right and as such I can read lines from the program's STDOUT stream, but as soon as I hit the end of the output my script hangs indefinitely waiting for something and all my attempts at detecting an EOF failed. Sorry to disappoint.
On lighter news, my coworker got the greatest error ever:
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
Turns out according to these guys it's Hebrew and refers to the double colon (::) operator.
Right...
24th March 2008, 11:32 pm
Microsoft products can really be a big wrench in the finely oiled machine that is your development environment. While Microsoft does offer some excellent products and development tools, when you work from an open source context, these great tools become great hazards and headaches.
Case in point, access databases. Take as a recent example, a client that gets its data from a third party. That data comes in a Access (.mdb) format, probably convenient for the producing company as well as the assumption that chances are very likely that the person receiving the data will be able to read it (due to the widespread availability of Microsoft Office).
Importing said .mdb in PHP is not so nice or convenient, that is if you aren't running your server on Windows (which chances are you aren't). In Windows you merely need to either create an ADO object (or use ADODB), or use COM to communicate with a local install of Microsoft Office to trigger an export. In Linux, neither of those choices are even available. However we thankfully have some good command line utilities, for example: MDB Tools. (Tip: Check out a copy from CVS if 0.5 is segfaulting on your database)
In addition to some unixODBC drivers, it provides some very nice command line utilities like mdb-tables (which prints the tables in a .mdb file), mdb-schema (which prints the schema for all or a specific table), mdb-export (which produces a CSV output of a specific table in the .mdb), and mdb-sql (which provides a subset of SQL interface to the .mdb file). All of these tools come together to form a very nice tool set to import a .mdb file.
Fun things however, as I was working on my import script (I was just using simple exec() commands and getting full output and parsing from there), I decided to play around with stream programming and provide an interface to mdb-sql using proc_open() to make the import less memory intensive. I ran into some snags using fgets() on the STDIN stream and when I solve those I'll post my code and a tutorial.