Delicious is a useful tool. I use it in an unconventional way sometimes: I bookmark some resources with tags which serve as indicators for my backup tools. As an example, when I tag my Gliffy diagram pages with the my-diagrams tag, my backup tool grabs the corresponding diagrams and makes local copies on my server.
Thursday, December 18, 2008
Monday, December 8, 2008
I use MindMeister almost daily. I wanted an easy way to backup my numerous mindmaps so I crafted a Python command-line tool for this purpose. It is available through this link and works under both Windows and Linux environments. The tool performs logging in Windows registry or Linux /var/log/mm.log . For easier usage, the installer copies the command-line file to the designated python script directory.
Wednesday, December 3, 2008
Tuesday, November 25, 2008
I use MindMeister mindmapping online application quite a lot. Very often, I need to embed an exported PNG image version of a mindmap in an other document. This operation is cumbersome with the MindMeister currently so I decided to craft one solution available here.
Thursday, November 6, 2008
Friday, October 31, 2008
Tuesday, October 28, 2008
I confess: I am a recycling freak. When it comes to better our environment, I am all ears.
Monday, October 27, 2008
With the advent of Microsoft's Azure service, I can see network operators have yet another good reason to ponder a Cloud VPN service.
Wednesday, October 15, 2008
Too many times I had to dig the web to find how the Subclipse Eclipse plugin could be configured for auto-properties so I decided I would keep a record here.
3) Finally, go to Windows->Preferences->Team->SVN and the Configuration Location to Use Directory and browse to the aforementioned directory created in step 1.
Wednesday, October 8, 2008
Wednesday, September 3, 2008
Wow! Google Chrome is out and of course I couldn't wait to try it out... that was until I discovered that automatic RSS/ATOM feed detection wasn't part of the deal. I wrote a quick bookmarklet for addressing this situation: just drag-and-drop the following bookmarklet to your bookmarks (works on Chrome, Firefox and IE):
Thursday, July 31, 2008
Thursday, July 17, 2008
Still working on my AOP framework for PHP, I stumble upon an interesting problem: when there are many files that require weaving, at some point memory usage was spiking very high (north of 256M) . For environments where memory is a scarce resource, I needed object recycling.
Here is what I came up with:
Friday, June 13, 2008
Thursday, June 12, 2008
Thursday, June 5, 2008
The factory pattern is most interesting when Testing and Refactoring because one can substitute a class implementation for another without changing the core code.
In the example below, I have demonstrated a versatile factory method which sports object instance creation with a variable parameter list.
- Base::factory( $className /*optional parameters*/ ) creates an object of class $className with, optionally, a list of parameters passed to the constructor
- E.g. $object = Base::factory( 'TestClass', 'param1', 'param2' );
- Base::mapClass( $sourceClassName, $targetClassName ) adds a mapping entry so that the factory builds an object instance of $targetClassName instead of $sourceClassName when asked to build for $sourceClassName
- E.g. Base::mapClass( 'TestClass', 'TestDebugClass' );
The project is located at GoogleCode.
Tuesday, June 3, 2008
This next design pattern should not be mistaken with the common template conception (see Web template) more commonly found in web-technologies.
The template method pattern is designed with a base class which contains an high-level recipe and relies on sub-classes to specify the ingredients. An example would be a template for publishing a table of objects: the template method base class would implement the publishing logic whilst the sub-class would extract the relevant data pieces to expose in the table.
The project is located at GoogleCode.
Friday, May 30, 2008
I recently struggled a bit with Yahoo! Pipes when playing with this great tool trying to form a properly updating RSS feed from a WEB-Service source. The WEB-Service in question is available through one of Ohloh's API : Project.
The issue was related to the <guid> field required by (most?) RSS Aggregators (I use the excellent GoogleReader): fetching a data feed from a WEB-Service API usually means that no "proper" feed is in place and an RSS item must be created on-the-fly. This is no problem as such but when the RSS aggregator comes fetching updates, the <guid> field isn't updated dynamically by Yahoo! Pipes.
Part of the solution comes from using a mostly undocumented feature of Pipes: the y:id.value item tag.
After fetching the data from the data source, copy a field that can serve as good <guid> into the y:id.value field. In the example above, I used the updated_at field which, of course, isn't a <guid> per-se by not being global ; I'll find a better way next time around.
Finally, before connecting the "pipe output", insert the y:id.value in the pipes results as shown above.
For the interested, here is the pipe's address: Ohloh Project Summary as well as a link to all my pipes.
Have fun with Pipes... I know I do!
Thursday, May 29, 2008
I thought about sharing some design patterns (expressed in PHP) I have documented. The first one is the borg. This design pattern serves as a good alternative option to the well-known singleton pattern.
The advantages of the borg are:
- no need in client classes for special creation / access methods
- easily sub-classed
- more easily testable
The project is located at GoogleCode.
Friday, May 9, 2008
There are 3 basic type of communication as illustrated in the following diagram:
A message consists in a sequence of symbols, purposely chosen, from a lexicon. Note that the time-domain is not part of the information conveyed.
An open sequence of messages carries information through the messages themselves but also through the order of the sequence i.e. the order in which the messages must be interpretated matters.
In a timed sequence, the time-domain adds information to the communication. Each symbol occupies, purposely, a temporal position in the ordered sequence. The receiving-end of the communication expects this timing to be respected in order to interpret the communication.
Wednesday, May 7, 2008
Communication networks are usually modeled the following way:
This plane supports the transport function i.e. the forwarding of traffic-units to end-point(s). The User-plane provides transport for the Control and Management planes.
This plane supports the control of the User-Plane with regards to the following aspects:
- Topology ( virtual )
- Resources ( access etc.)
This plane supports the management of the User and Control planes. The management functionality includes (see also FCAPS):
The following diagram serves as reference. One communication path is illustrated between the end-point E1 and E2. The communication traffic enters intermediate system A, is physically transmitted over to System B.
Wednesday, April 23, 2008
Friday, April 11, 2008
With the advent of Google AppEngine, I am starting to look into Python programming because, let's face it, PHP support on AppEngine might be a long way off (feature requests).
It would appear that a good way of distributing Python Modules is through eggs which, from what I can understand, offer similar functionality as PEAR packages.
PythonEggs documentation can be found here.
Thursday, April 10, 2008
Monday, March 31, 2008
PROXY for PEAR channel
I recently submitted a bug report on PEAR regarding a long standing issue with the PEAR installer tool: there is no support for HTTP 302 (redirect). This condition effectively limits the hosting possibilities of PEAR channels e.g. a PEAR channel can not be accessible through a DNS cname aliases.
ProblemSuppose I have hosted a PEAR REST channel on Google Project @ http://mediawiki.googlecode.com/svn and now I would like to make this channel friendly through a nicer URL like " mediawiki.pear.jldupont.com ".
(note that the above is just an example: the channel on which I used the method described below in not yet publicly available)
SolutionThe solution involves setting up a PROXY. This time around I have managed the feat with Apache using proxy_module 'mod_proxy.so' : in my vhost configuration, I have added:
#NOTE: not strictly required for the PROXY functionality
ProxyPass / http://mediawiki.googlecode.com/svn/
ProxyPassReverse / http://mediawiki.googlecode.com/svn/
Friday, March 28, 2008
Wednesday, March 26, 2008
Tuesday, March 25, 2008
Here is a quick tutorial on how to install PEAR's WEB Frontend installer.
1) Shell command: pear install PEAR_Frontend_WEB
2) Create file pear.php in the desired web directory with the following content:
I suggest putting this file in a separate folder with proper web server access permissions (i.e. htaccess, htpasswd etc.)
3) Adjust directory permissions for the PEAR system folders download and temp (on my LINUX system, these are located in /tmp/pear)
4) Adjust directory permissions for the PEAR classes folder (on my LINUX system, these are located in /usr/share/pear)
Thursday, March 13, 2008
A marvelous new tool is available to the general public since yesterday: SproutBuilder. I decided to give it a try:
Above is a sprout automatically updated of all the PHP PEAR channels I know. The list is composed of entries I add to my Del.icio.us links with the tag pear-channel. Then this list is processed through a YAHOO! Pipe and finally embedded in the ''sprout''.
Wednesday, March 12, 2008
Monday, March 10, 2008
It would appear that 1AND1 Linux VPS come now with Fedora Core 6 - 64bits. I really don't mind except when:
- PEAR isn't installed
- PECL neither (of course) ... and does not work even after fixing PEAR
Some good news though: yum is installed by default. Hooray!
Step 1: cd /tmp
Step 2: wget http://pear.php.net/go-pear
Step 3: php go-pear
Step 4: When prompted for the installation prefix, use /usr/share
Step 5: Try-out the pear command: pear
Installing PECL extensions
Getting PECL extensions to compile is a little bit more tricky...
Step 1: yum install gcc
Step 2: yum install php-devel
Even with this effort, I wasn't able to use the pecl command and had to resort to go through the pear command instead. See example next.
Installing PECL / APC
Step 1: pear install pecl/apc
Step 2: cp /usr/lib/php/modules/apc.so /usr/lib64/modules/php/apc.so
Step 3: vi /etc/php.d/apc.ini
Step 4: following step 3, edit apc.ini with extension=apc.so
Sunday, March 9, 2008
Say one needs to create objects in one namespace in a controlled fashion (i.e. avoid duplicates, avoid loss); what strategy can one employ?
The basic issue one has to deal with comes from the fact that possibly multiple processes are actively accessing a given namespace thereby collisions can occur: in namespace N, process 1 creates object O1 whilst process 2 does the same (i.e. creates object O1).
The left-hand side diagram illustrates the problem: the competing processes race to win the creation event during which time a meta-stable state exists i.e. no one process can be certain (to a reasonable degree) which will win the race.
Two main strategies
There are (at least) two main strategies to address the problem: an optimistic and a pessimistic one.
The optimistic strategy can be used in patterns where a process is considered reasonably alone in accessing a given namespace. Example: a user accessing is private file folder.
The pessimistic strategy must be employed in situations where multiple processes potentially access a given namespace. Example: an application's user creation flow.
The optimistic strategy consists in a simple procedure. The system:
- verifies if object[X] exists
- creates object[X] if it does not exist
The pessimistic strategy is outfitted with a probabilistic equivocation reduction process. The system:
- verifies if object X exists in the namespace
- generate a reasonable unique identifier UID
- creates a new identifier [X;UID]
- verifies if an object with for identifier [X;UID] exists in the namespace
- following #4, if no object exists, wait for Y units of time
- verifies if any object with identifier prefix X exists
- if the process' object with [X:UID] comes as first created (assuming multiple hits), then the process wins the creation race
Say an application must be crafted with a system for registering users. Obviously, this process must be controlled: the system must be designed to deal with conditions such as:
Use Case: user X tries to register to the application with user-name UN1 at the same time as user Y goes for UN1.
One way to deal with the creation of unique user records on Amazon S3 I propose is:
- Generate a long unique identifier (e.g. 32bytes)
- Prepare a string identifier I/UID where I is the wanted identifier
- PUT-OBJECT with for URI /I/UID
- Wait for Y seconds (e.g. 3seconds)
- LIST-OBJECTS with for prefix /I
- If the object with for prefix /I/UID comes out to be the first created, then the process wins
Thursday, March 6, 2008
Include the following lines in the php.ini script corresponding to the one used by PHP for running CLI scripts:
apc.enable_cli = 1
Don't forget that the initialization file for the CLI operation of PHP is most probably different than the one used with Apache.
One irritant on the WEB I found a solution for: have you ever posted questions or comments to a site that didn't include automatic email notification when the question/comment got feedback? It happens to me all the time.
Google Alerts to the rescue!
I now use GoogleAlerts to track my whereabouts on the WEB. The usage pattern is simple: just form the habit of always signing your post with a distinctive mark and set an alert on this mark. With my name, this is easy as it is not so common.
I have to sift through countless RSS feeds all day seeking more information based on keywords I find. I wanted to automate the process just a bit so I devised a GreaseMonkey Firefox user script.
Usage is simple: just select the text to search and press " alt c " which will automatically bring-up the result page on Google Search.
One can find the script here on UserScripts.org.
Tuesday, March 4, 2008
FreeMind is a very handy (and free ;-) tool. I recently started playing around Google Mashup Editor and wanted to document in my way the API; I thus used FreeMind yet again.
I have embedded the mindmap in a Google Page available here.
Embedding the mindmap is easy:
Wednesday, February 27, 2008