|
|
Sunday, 31st October 10
compton |
Matt Zadstra's book, PHP Objects, Patterns and Practice, aims to give an overview of sound OOP design in PHP applications, with a direct focus on Design Patterns. Until PHP5, OOP was not really possible with the language. Object and class support was sketchy, in many ways little more than a clumsy afterthought. Even now, the OOP mechanisms that exist are not complete, however they are at last adequate for the implementation of an entirely OOP design.
Let's begin with a quick rundown of some general design basics. Often, we start our design process with a requirements analysis, where we examine what the system must achieve, what its scope will be (the domain it will operate on), and what its outputs should be.
In an OO system, we have a structure that lends itself to atomicy, encouraging us to divide and conquer our problem. We think about the data domain each object must work on, which often guides us when |
... ... |
|
|
|
Tuesday, 24th January 12
compton |
Before starting, it's a good idea to run a disk check. Run the following command to create the necessary file and then reboot:
sudo touch /forcefsck
The following command converts the filesystem to EXT3, by creating the necessary journal.
tune2fs -c 0 -i 30 -j /dev/sda1
Edit /etc/fstab replacing ext2 with ext3 for the root filesystem mount.
Next we need to rebuild the Linux boot image using the mkinitrd tool.
Unrolling the Change
If it goes wrong, and you need to convert back to EXT2, your best bet is to do it unmounted. In other words, boot into a different OS installed elsewhere. The simple choice is a Linux Live CD for pretty much any distro.
umount /dev/sda1
tune2fs -O ^has_journal /dev/sda1
e2fsck /dev/sda1
Edit /etc/fstab to change /dev/sda1 to mount as ext2
mount /dev/sda1 |
|
|
|
Friday, 9th April 10
compton |
|
The PEAR PHP_CodeSniffer project provides an invaluable tool for enforcing a consistent set of coding standards across a whole PHP project. Thanks to the guys at PHPsrc, it can now be installed as an Eclipse plug-in, to provide annotations about code standard violations right in your editor:

In order to get this set up and running, you first need Eclipse 3.3 or greater. You can download the package with PDT incorporated from the eclipse site. Get any other tools you need, such as subclipse for SVN.
Now you're ready to install the PHP tools from PHPsrc, which is accomplished by adding http://www.phpsrc.org/eclipse/pti/ as a new update site to the Eclipse plug-in finder found at Help > Install New Software...
Once that's complete and you've
... ... |
|
|
|
Monday, 25th April 11
compton |
|
The Open Source Code::Blocks IDE is the recommended choice on Linux systems, and it's available in Ubuntu's Software Centre. Install this first if you don't already have it.
On Ubuntu, you need to add the Ogre PPA and update your package list before installing the libogre-dev package (containing the Ogre 3D development libraries) and the sample projects:
sudo add-apt-repository ppa:ogre-team/ogre
sudo apt-get update
sudo apt-get install libogre-dev ogre-samples-source
The sample projects are not just useful for examples, but they contain resources used by the skeleton Ogre project in Code::Blocks. Once Ogre is installed, Code::Blocks will offer a new project type called Ogre Project when creating a new project:

Use this to get the minimum set of files and stubs for an Ogre project, along with linker
... ... |
|
|
|
Saturday, 6th March 10
compton |
|
The MySQL SET datatype is a very space-efficient way to store sets of binary flags. It's a little like the ENUM type, in that you define a range of possible string values, but unlike the ENUM, a column that holds a SET can have any number of the string values at one time.
It's useful to consider how MySQL stores SETs and ENUMs in order to appreciate what benefits they can bring.
Here's a simple table with an ENUM column and a SET column:
CREATE TEMPORARY TABLE critters (
species ENUM ('cat', 'dog', 'mouse', 'bear', 'elephant') NOT NULL DEFAULT 'cat',
eats SET ('cat', 'dog', 'mouse', 'ant', 'bear') NOT NULL DEFAULT 'mouse'
);
Any ENUM column always occupies a single byte in a table, and each string defined for the ENUM is mapped to one of the possible values that an 8-bit byte may hold. The string values can be arbitrarily long, and may even contain spaces if desired. Because the ENUM
... ... |
|
|
|
Tuesday, 13th September 11
compton |
|
Web pages have become increasingly dynamic in recent years, with more and more content being fetched, manipulated and saved in the background with AJAX. This breaks the traditional connection between the URL and the displayed document: no longer does a URL refer uniquely to one single document. This causes problems for users, because browsers use the URL when storing pages in history. Browser history is implemented as a stack, a last-in, first-out (FIFO) structure. As you navigate through the world wide web, the browser pushes the URLs that you visit on to the history stack. When you click back, it pops URLs off this stack, and pushes URLs onto the 'forward' stack.
With AJAX however, it's common to offer a range of functionality on a single page, and oftentimes that functionality can dramatically affect what content is shown on a specific URL. For instance, an AJAX-driven email page might initially show a list of items in the user's inbox. As they click links or buttons on
... ... |
|
|
There's a lot of articles on the web explaining how to move a Linux home folder (containing all the user accounts) from the system partition onto its own partition.
I wanted to do the reverse procedure, and move my separate home partition to a regular home folder on the system partition. The only problem is that home can contain a variety of files and symlinks that wouldn't all get copied correctly with the mv command. The
... ... |
|
|
Can now be done via PECL. PECL is a part of PEAR, so install that first:
sudo apt-get install php-pear
PECL also requires the PHP development libraries, which have to be installed separately on Ubuntu. On many distros, such as Arch Linux, you can skip this step.
sudo apt-get install php5-dev
Now you're ready to get Xdebug:
... ... |
|
|
If you're running Alsa on your Linux distro, without pulseaudio (e.g. Arch Linux, SUSE), and your onboard audio only has 3 Jacks - Line In, Speaker, and Mic - but supports 5.1 audio, follow these steps to enable it.
Add the line below to a file called /etc/modprobe.d/options. If the file doesn't exist, create it.
options snd-hda-intel model=3stack-6ch
Note that the model identifier
... ... |
|
|
With later versions of Eclipse and/or the SVN plugin, you have the option of using the Java native interface (JNI) library for Subversion support. For performance and platform independence, Subversion is written in C. The JavaHL library is written by the Subversion team, and basically provides Java wrappers for Subversion's C API. You can use SVNkit, which is a pure Java Subversion library, but until you've sorted it out one way or the other, you're likely to see lots of error messages reading
... ... |
|
If you're on Mac, you can throttle your own bandwidth with the following two commands:
sudo ipfw pipe 1 config bw 200KByte/s
sudo ipfw add 1 pipe 1 src-port 80
To remove the throttle, use:
sudo ipfw delete 1
PS Macs suck and are grotesquely horrible contraptions. Making intelligent heterosexual people use them is inhuman and illegal in many countries. If you have the choice, switch to Linux and regain ownership of your development platform. |
|
|
There are a myriad free libraries out there that offer JQuery image rotator functionality. The idea is simple enough - cycle through a series of images, smoothly transitioning between each using some effect or other.
So why code your own? Simplicity and control are the main reasons. Unless you're already loading up a 3rd-party rotator library, why add to the bandwidth overhead? Some of those libraries can be quite time-consuming to get to grips with, so a roll-your-own solution can
... ... |
|
|
JQuery has a few transition animations built in, such as the 'blinds' effect. This lets you unhide content by revealing it as if a blind were being pulled open in front of it, and vice versa to hide content.
I've built a variant on this idea that gives the effect of a venetian blind:
<div id="blindbox">
<img src="../../images/sockfather.jpg"
... ... |
|
|
phpDocumentor is a tool written in PHP to create complete documentation directly from both PHP code and external documentation. Well-written PHP source code practically serves as its own documentation. phpDocumentor taps into this by examining code for all kinds of structural hints, such as files, classes, functions, constant definitions, global variables, and class variables/methods. From this, it creates basic documentation in a traditional manual format. Note that you will need at least
... ... |
|
|
Oolite is an open source space trading sim based on the original Elite game written by David Braben and Ian Bell in the mid 1980s. At its time, Elite was a ground-breaking game, with a seemingly enormous galactic map of stars to navigate, and loose open-ended gameplay.
The Oolite project has recreated the original game using OpenGL textured models, and the source code can be downloaded from
... ... |
|
|
If you are setting up version control, and have access to a managed server, you may decide to create your central repositories on that server, so that all developers can access the repo from wherever they are: in the office, at home, on the beach etc etc
Many managed servers use CentOS, the commercial version of RedHat Linux. If you can find a source repo with git in it, you can install using yum:
yum install
... ... |
|
|
The following list details the PHP string functions which could cause problems when handling multi-byte strings. The multi-byte safe alternative is given when available:
... ... |
|
|
With all the plug-ins freely available for it, Eclipse is rapidly becoming the one-stop IDE of choice for all your programming needs. The Perl plug-in from EPIC (Eclipse Perl Integration) is compatible with Eclipse v3.1 and higher:

You need Perl installed on your system in order to make use of all the plug-in's features, such as syntax highlighting and source
... ... |
|
|
Recently I changed the name of the mountpoint where my Eclipse projects are located, and while a lot of my projects opened without any problem, others would not, instead generating the error message:
The project description file (.project) for PROJECTNAME is missing
By default, Eclipse will look for the .project file in the root directory of the project itself. In some cases though, you may want to have the
... ... |
|
Natural vs Surrogate Primary Keys
The primary key (PK) of a table is a column or set of columns which uniquely identifies each row of the table. A natural primary key uses actual properties (ie columns) of an item. For instance, if you have a table of cars, you might choose to use the registration number as primary key. This would be a natural primary key.
A surrogate primary key on the other hand is one which has been created specifically for the purpose. Generally
... ... |
|
|
I would like to have the following features in Jabber chatrooms:
- system notification when user says any one of a list of trigger words (i.e. nicknames)
- ability to 'silence' selected people, so that their messages do not trigger sounds
- ability to mark people as 'special', so that whatever they say a system notification will be created (regardless of whether or not they use one of the trigger sounds mentioned above)
The last two could be combined into a
... ... |
|
|
The differences between these two plugins are varied but subtle. After having used phpEclipse for the last couple of years, I decided to give PDT a proper try as I needed to do a fresh install in order to get the PHP CodeSniffer Plugin working fully.
PDT
- Excellent HTML validation, and built-in CSS support (code highlighting, intellisense and autocompletion for
... ... |
|
Firefox's so-called browser chrome is written using JavaScript and XUL; XUL being an XML dialect that defines UI components, aka widgets. So it's logical that the functionality of Firefox extensions should itself be coded using a combination of JS and XUL. In addition, you need an RDF file, another XML dialect, to describe the extension so that it can be correctly installed.
Your XUL files will define a XUL Overlay, which is merged with Firefox's built-in 'master' XUL. |
|
Closing HTML Tags for a snippet
The XML DOM class which comes built-in to PHP as standard offers the ability to fix the markup in an HTML snippet. Say for instance you have a string of HTML code $htmlCode and wish to show a preview on a webpage, you could do the following:
$htmlSnippet = substr($htmlCode, 0, 500);
$snippetMaker = new DOMDocument();
@$snippetMaker->loadHTML($htmlSnippet);
echo
... ... |
|
|
Note that when using grub commands, spaces are important. In particular, a space is required after the commands root and setup (but before the first bracket) and no spaces should be used inside the brackets.
1) Boot from a Live CD
2) Open a terminal window or switch to a TTY and enter:
sudo grub
3) At the grub prompt, use the following command to determine
... ... |
|
|
Mailman is a tried-and-tested Open Source mailing list manager. It's robust and reasonably efficient when running, however it organises lists internally by their local name only. In other words, you can't have one list called maillist@domain.org on the same server as another list called maillist@somewhereelse.com on the same machine, unless you have a separate mailman installation for each domain.
Many production environments do appear to use the separate installation per domain
... ... |
|
The ezmlm mailing list stores configuration options for a list as files on the file system (rather than using a config table in a database, or even a single config file).
In order to migrate a list from ezmlm to another list manager, such as mailman, it's necessary to understand the file structure in order to work out how the list is configured. |
|
|
From http://www.webmasterworld.com/forum92/3366.htm:
The situation is this: A single server with multiple IP addresses and related hostnames acts as a mailman server. Mailman is a mailing list manager with a builtin web archive and subscription management system written in php. As shipped it injects a file called mailman.conf into /etc/httpd/conf.d that uses mod_alias to redirect
... ... |
|
|
The pspell_* functions are a very useful feature of PHP, allowing you to scan text and highlight words which are potentially misspelt. Pspell implements the open source aspell spell-checking routines in PHP.
Basic UsageBefore using the functions, you need to open up the dictionary you're going to use by calling the pspell_new() function, specifying at least the language to use. You can also
... ... |
|
Compiling from .tar.gz
The archive contains the source code files and supporting resources (bitmaps etc). So we'll need to compile this to make our executable program.
First extract the archive somewhere. I use a subdirectory off my home called src:
cd ~/src
tar -zxvf ~/download/newapp.tar.gz
If the archive is compressed with bzip (extension is
... ... |
|
|
My first task is to investigate how we can create a single consistent look & feel for the admin GUI. I'll need to get a good understanding of how the admin GUI works and is organised.
When the admin first logs in, you have a grid of square buttons on the left, and some stats on the right. The page shows as index2.php in the address bar.
index2.php has the following structure:
... ... |
|
|
The aim is to provide a resource where developers can go in order to get code for a specific task.
Objectives
- To reduce time from design to deployment
- to help maintain code quality
- to reduce need for maintanence and support
- to help ensure code meets specific requirements (including FF support, security, performance)
- to facilitate group work through standardization
- to grant designers the ability to
... ... |
|
|
The MDSN samples include a C++ project for building a ISAPI DLL which performs authentication for web resources against a text file. This project, AuthFilt, is one of the samples supplied with the .NET Platform SDK, available from here. Once you've installed the SDK, the sample code is located in the AuthFilt folder at
... ... |
|
|
The main problem this car has suffered since I bought it has been its poor idle. For the first six or so months, it ran absolutely fine, but then it began to stall regularly when idling, and it's steadily got worse. Even now it's got warmer has not improved, and happens equally whether the engine is warm or cold.
The stalling problem did not appear to be a physical issue with the overall running of the engine which remained smooth and even when under power. It appeared to be more to
... ... |
|
|
Right, so now I've checked everything is set up correctly, I've decided to take a look at the examples that come with the G3D library.
There are seemingly eight, described on the G3D web site; it's not clear if there's any natural progression through them.
- ArticulatedModel
loads models from files in 3DS, IFS, and PLY2 formats. Creates a scene graph, uses 'Pixel Shader 2.0' and 'fixed
... ... |
|
The example I'd like to look at next is the ArticulatedDemo. It does a whole load of things, like loading a variety of models and placing them in a scene graph. It's this scene graph thing that I think I need to understand properly.
Unfortunately, I can't get ArticulatedDemo to run - it compiles and links ok, but fails an assertion, then crashes.
The next most interesting demo is Collision_Demo, which has a set of static objects in a box, then drops a load of different sized balls in, which bounce around the place.
It compiles and runs fine. |
|
|
This little program allows you to create IFS models suitable for use in G3D programs. An IFS model can be built from an array of vertices with an associated array of indicies. The indices refer to offsets in the vertex array, and are grouped in sets of three - representing the triangular faces of the model.
So far, my program allows you to:
-
Add a new vertex at the origin
-
Select a vertex with the TAB
... ... |
|
|
I now feel I'm ready to have a go at creating my first simple OpenGL game. It's going to be pretty simple - there'll be no scene graph, just a simple array for storing objects in the world. I won't implement frustum culling either, at least not in the first instance.
My game will be based on space flight, so I will start with the player's ship. It should appear just in front and below of the camera, i.e. third person. It should turn and dive/climb in response to keyboard input, and
... ... |
|
G3D is an open source graphics engine that can be used from VC++ 7. This means G3D projects can be developed in VS.NET, and make use of Intellisense and its debugger.
It requires the SDL library, which I've installed OK. G3D is also installed, but the test program isn't as simple as the SDL one, so I have not yet confirmed it is installed and available to VS.NET. |
|
Regular Expression Principles
| . |
Dot |
Matches every character |
| [] |
Set |
Matches the specified set of characters (hyphens may be used to specify a range of characters) |
| () |
Brackets |
Groups patterns together so they can be treated as |
... ... |
|
|
G3D is a cross-platform OpenGL library in C++. I haven't used it in a couple of years, when I first experimented with 3D C++ programming. The current version is 8 beta 2.
To install on Linux, you'll need to compile the G3D code from source. In my case, on Ubuntu 9.10, I had to install the following dependencies first:
sudo apt-get install libsdl1.2-dev xorg-dev libglu1-mesa-dev libzip-dev libavutil-dev
Then
... ... |
|
|
First set up the tunnel like so:
ssh -D 8080 -N REMOTEUSER@REMOTEHOST
You can also add the -f switch to make this run in the background. What this does is to forward connections to port 8080 on the local machine to the remote server over SSH (i.e. encrypted).
Once it's active, you can configure applications to use the tunnel by setting up a SOCKS 4 or 5 proxy for them.
In Firefox, go to
... ... |
|
 Data Storage
Data Centers today require high performance, highly scalable designs. The options available to re-architect networks have grown dramatically in the last 3 years. Spanning Tree Protocol (STP) is a link layer network protocol that allows only a single link to be active between any two nodes. This helps ensure a loop-free topology but limits the total bandwidth of the network. Switch architectures were designed
... ... |
|
|
mencoder [options] file INPUTFILE -o OUTPUTFILE
crop[=w:h:x:y]
Crops the given part of the image and discards the rest. Useful
to remove black bands from widescreen movies.
<w>,<h>
Cropped width and height, defaults to original width and
height.
... ... |
|
|
Editing a book about creating VPNs on Linux with IPsec. 200-300 pages long, which works out at about £450. |
|
|
The AMD 64 comes in two primary types, the standard AMD 64, and the AMD 64 FX. The former uses a socket 754 connection, while the latter uses 940 (which is the same as the Opteron, AMD's 64-bit server CPU). The 64 FX is designed with high-end 3D games in mind. Early nForce3 boards had issues, which may or may not be resolved now. VIA also made an early AMD 64 chipset, the K8T800, which did not suffer from such drawbacks.
The different pin count of the two Hammer CPUs is due to the
... ... |
|
So my new DVD burner should arrive today. I hope I'll finally be able to just put a DVD in and play the damn thing. I have always had problems with CD and DVD drives. They seem to be much more sensitive on my computer than anyone else's! The slightest dirt or tiniest scratch renders disks useless.
The drive coming today is an LG - the reviews I've read of it seem to suggest it'll pretty much play (and burn) most disks. A Microsoft mouse arrives as well - allegedly. I'm looking forward to trying it out anyway. The other thing is a SIM card for Sheryl's phone, very cheap at £3.50. |
|