There's so much work in this week that I can't publish a article in the next days.
But Natalie Jost from A List Apart just published a very nice article which you really should read if you're (like me) working from home read on.. ... you'll like it.
7/15/2008
Working from home.
7/10/2008
track time for a subroutine within a shell-script
The following code-snippet is a shell-script which does the following:
- Track the time for a block of shell commands
- Check if the time was less than x seconds (the example uses 10 seconds)
- If the block run through too fast the script waits/sleeps a few seconds
- Run all this within a loop so that the block of shell-commands is executed periodically
The waiting-block is necessary because now and then the queue is empty ... but I think there are lot's of situations where a script like this can be usefull:
#!/bin/bash
while [ 1 -ge 0 ]; do
time_begin=`date +%s`
###BLOCK 2 TRACK - BEGIN
number=$RANDOM
let "number %= 20"
sleep $number
###BLOCK 2 TRACK - END
time_end=`date +%s`
total=$((time_end-time_begin))
if [[ $total -ge 10 ]]; then
echo "time taken was: $number : $total"
else
echo "time take was too less $number : $total"
sleep 10
fi
done
7/07/2008
Iterator [GoF]
Lot's of people like to write down things into lists, so that they can go through that list later and check whether everything was fine. Normally every recipe has a list ~ there's always a list of ingredients at the beginning of the recipe.
This short example shows how such a list can be processed in PHP. So why would you want to have something else than a array to hold your objects? - My example still uses a array to hold the objects (uni- or bidirectional lists would also be possible) but it adds a kind of a facade to the array so that the common managements-tasks are handled within the List-Object. Everything you need for this example is present in PHP since version 5.0. The basic steps you need to do is to provide a "Object" and an "ObjectList" which implements the native "Iterator" interface and then you're able to have very handy lists :)
Show PHP Source Code
class Incredient {
public $name,$amount;
public function __construct($name,$amount) {
$this->name = $name;
$this->amount = $amount;
}
}
class Recipe implements Iterator {
public $title;
private $ingredients;
public function __construct ($title) {
$this->title = $title;
}
public function addIncredient(Incredient $in) {
$this->ingredients[] = $in;
}
public function current () { return current ($this->ingredients); }
public function key () { return key($this->ingredients); }
public function valid () { return current ($this->ingredients); }
public function rewind () { return reset ($this->ingredients); }
public function next () { return next ($this->ingredients); }
}
$cookieRecipe = new Recipe("Chocolate Cookie");
$cookieRecipe->addIncredient(new Incredient('Flour','2.5 cups'));
$cookieRecipe->addIncredient(new Incredient('Baking soda','1 teaspoon'));
$cookieRecipe->addIncredient(new Incredient('Salt','0.5 teaspoon'));
$cookieRecipe->addIncredient(new Incredient('Butter','1 cup'));
$cookieRecipe->addIncredient(new Incredient('Sugar','1 cup'));
$cookieRecipe->addIncredient(new Incredient('Brown Sugar','0.5 cup'));
$cookieRecipe->addIncredient(new Incredient('Vanilla extract','1 teaspoon'));
$cookieRecipe->addIncredient(new Incredient('Egg','1-2'));
$cookieRecipe->addIncredient(new Incredient('Chocolate chips','2 cups'));
// process recipe:
foreach($cookieRecipe as $inc) {
echo $inc->name." => ".$inc->amount."<br/>";
}
As you see it's pretty easy to have lists of objects in PHP. You might also think that always creating to some list-object over and over again is very odd and you're right. For the most common tasks like iterating through arrays, directory-lists and a few more task you can use objects which are shipped with the Standard PHP Library ,which is also part of PHP since version 5 and mandatory in 5.3. So the example shown above could also look like this:
$recipe = array();
$recipe[] = new Incredient('Flour','2.5 cups');
$recipe[] = new Incredient('Baking soda','1 teaspoon');
$recipe[] = new Incredient('Salt','0.5 teaspoon');
$recipe[] = new Incredient('Butter','1 cup');
$recipe[] = new Incredient('Sugar','1 cup');
$recipe[] = new Incredient('Brown Sugar','0.5 cup');
$recipe[] = new Incredient('Vanilla extract','1 teaspoon');
$recipe[] = new Incredient('Egg','1-2');
$recipe[] = new Incredient('Chocolate chips','2 cups');
$recipeIncObj = new ArrayObject($recipe);
$ingredientsIt = $recipeIncObj->getIterator();
foreach($ingredientsIt as $inc) {
echo $inc->name." => ".$inc->amount."<br/>";
}
As I said at the beginning, there are lots of situations where you might want to have a list for something and if you store that list in PHP the Iterator-pattern can keep your code clean and tasty :)
7/01/2008
Null-Object Pattern
Very often you create a object with a factory and before you really start using it, you check if your factory really created a object or returned NULL. Or maybe you have a method where a object is passed in and in this situation you'll have to do this check also.
Instead of typing the "if(object == null)" phrase again and again, you could use the Null-Object pattern, you'll see that this can make some situations much clearer.
Basically Null-Object ensures that the client always receives a valid object for it's interaction, so that there's no need to do the check shown above again and again. This happens since your concrete Null-Object just shares the interface, or inherits from the same class as it's effective counterpart, but it's implementation just leaves out any effectiveness.
So a code-example could look like this:
class CookieFactory {
public function makeInstance() {
if(date('l')=='Monday') return new NullCookie();
return new RealCookie();
}
}
interface iCookie {
function getCalories();
}
class RealCookie implements iCookie {
protected $calories=250;
public function getCalories() {
return $this->calories;
}
}
class NullCookie implements iCookie {
public function getCalories() {
return 0;
}
}
I think you can imagine what happens when you make use of the CookieFactory - diet on monday ;)
There're also some disadvantages, your clients normally don't have a chance to react that there's something special happening, also the clients must "share" the same expectation what "do nothing" means, the number of required Null-Objects might be very large and unhandy and the Null-Object shares a very deep knowledge with the real one, so that it might be a large effort to create it if the real object is complex too.
I'm so glad that today is tuesday :P

