JeeNode
posted 2009-12-25 01:12:43
My JeeNode arrived today, just in time for Christmas!
The JeeNode is a small microcontroller board, with an RFM12 radio module, it is compatible with the Arduino IDE, which is a Good Thing.
For more information about this cool piece of kit, have a look at jeelabs.org.
Less than 30 minutes after arriving home, I started soldering the JeeNode kit together. I'm impressed with the quality of the PCB of these units.
Below are two pictures of my finished JeeNode.
speed up debugging with viline
posted 2009-12-03 16:11:20
This is a practical hack to speed up your coding-debugging cycles:
Most programming languages tell you that some error occurred in some file on line 666 like so:
Blah, blah. Some error in /some/file.foo:666. Blah.
Viline is a simple bash function that lets you copy and paste the file:linenumber combo from error messages as an argument to vi.
Vi will then start with the cursor at the offending line. Handy, eh? :-)
To use viline, add the following to your .bashrc:
# viline: start vi with file:line
function f_viline { vim $(sed -r 's/:([0-9]+)$/ +\1/'<<<$1); }
alias viline=f_viline
alias vi=f_viline
The alias for vi itself is optional, myself, I never give vi any arguments but filenames, so this is pretty safe for me.
Otherwise just type viline instead of vi when you want to edit a file with a file:line style argument.
UKNC Success
posted 2009-11-25 23:27:57
The video port pinout from my previous post led to some succes with my UKNC (Elektronika MS 0511) Soviet-Russian computer.
Today I made a SCART cable to connect the UKNC to my old Bang&Olufsen CRT TV. (that still needs replacement with an equally pretty LCD TV ;) )
It seems the B&O does understand the video signals from behind the iron curtain. :)
The SCART wiring is pretty simple, I've connected RGB, sync and composite-video and used a common ground on the SCART video ground line.
I think the TV is using the RGB inputs, because when I tried feeding the composite video with a cinch plug earlier, I didn't get the TV to sync.
Soviet Russian UKNC Video connector pinout
posted 2009-11-23 00:22:08
I recently bought a old Soviet PDP-11 compatible computer on Ebay, the UKNC (УКНЦ in Russian) an educational computer system with a formfactor somewhat like the Amiga 500.
I'm still struggling to bring the machine back to life, the biggest hurdle is that most of the documentation about this machine is (of course) in Russian only, and I don't speak any Russian at all.
Google translate is a big help, and translating to Russian to Google for information helps a lot.
This way, I finally found the pinout of the video connectors on the machine, these are 10-pin headers on the back of the machine, labeled "вм".
To document this for myself, and maybe for someone else whom might benefit from this, I've posted the pinout of these connectors here:
---
1 |o o| 2 1 - blue 2 - gnd
3 |o o| 4 3 - green 4 - gnd
5 |o o| 6 5 - red 6 - gnd
7 |o o| 8 7 - sound 8 - gnd
9 |o o| 10 9 - composite 10 - sync?
---
Probing a SecurID Token
posted 2009-10-25 18:20:59
Read full article
Today I peeked inside a RSA SecurID token and made a little test jig to probe some test pads that are inside.

Not much interesting found so far, but hit the read link to read about my journey to the SecurID's deepest secrets... ;)
Driving 7-segment displays with a MM5480 and Arduino
posted 2009-10-18 22:38:08
Read full article
For the last year, up until a couple of months ago my heater was pretty unreliable, probably because of a flaky relay in its control unit, or maybe some bad capacitors, something that nowadays seems to kill almost all electronics prematurely.
Well getting bored of hitting the poor machine until it started
working again about every day, I finally replaced its Econgas
control unit and, of course, I tore the old unit apart.
It's a nice piece of kit, It seems to be made by a Dutch firm
called Pijnenburg, a name that I only associated with a
particular brand of Dutch cakes before. ;-)
Maybe more later about the internals of that unit, or maybe
never, it depends on whether I find any other interesting stuff
inside.
But wat got me started was its nice control panel,
containing three red 7-segment LED displays, three buttons and
a Micrel MM5480BN shift-register based LED driver. Something
that just screamed to be hooked up to my trusty Arduinos!
Follow the read link above to read the whole story.
Progress bars in Bash
posted 2009-08-10 08:20:31
Today a colleague reminded me to dig up a script that I wrote some years ago to generate progress bars (or actually generic horizontal bar graphs) in Bash.
The script is, in this state, more like a proof of concept. It displays an bar that increments until full and then decrements again, this cycle is repeated forever. It should not be too hard to rewrite it to be used in something more useful.
I think it's also trivial to rewrite this to display vertical bar graphs as well. I might write a small Bash library to include in other scripts later, if and when I feel the need to. ;-)
The code of the script follows below, enjoy...
#!/bin/bash
# progress bar
# Hessel Schut, VPRO Automatisering, 2004-04-02
cols=$(tput cols)
bold=$(tput smso)
norm=$(tput rmso)
trap cleanup EXIT TERM INT
cleanup() {
norm
tput clear
tput cnorm
exit
}
hor_line() {
for ((i=1; i < cols - 2; i++)); do
echo -n '-'
done
}
draw_frame() {
tput cup 2 2; hor_line
tput cup 3 1; echo -n '|'
tput cup 3 ${cols}; echo -n '|'
tput cup 4 2; hor_line
}
tput clear
tput civis
draw_frame
d=1; pos=2; plen=0
while [ == ]; do
[ $d -eq 1 ] && face=${bold}
tput cup 3 $pos
echo -n ${face}' '
face=${norm}
sts='pos: '${pos}' dir: '${d}
tput cup 1 1; echo -n ${norm}${sts}
[ ${plen} -gt ${#sts} ] && for ((i=0; i < plen - ${#sts}; i++)); do
echo -n ' '
done
plen=${#sts}
((pos += d))
[ $pos -gt 2 ] && [ $pos -lt $((cols - 2 )) ] || ((d=-d))
done
GSM IMSI, MCC and MNC lookup tool
posted 2009-06-28 19:59:33
Read full article
I've written a small tool to decode (or well, that is a big word for taking some substrings ;) ) GSM IMSI (International Mobile Subscriber Identity) numbers.
It then takes the MCC (Mobile Country Code) and MNC (Mobile Network Code) pair, looks it up, and presents you a mobile operator name and country.
Alternatively, you can search by just a MCC or MNC value, or both, and again, it lists all matches.
Follow the read link to give it a try.
DriveReady SeekComplete Error
posted 2009-06-28 10:17:33
Oops, isquared.nl had some unscheduled downtime last night after the telltale signs of a dying disk:
Jun 28 01:09:07 c3 kernel: [ 184.700869] hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jun 28 01:09:07 c3 kernel: [ 184.700869] hda: dma_intr: error=0x10 { SectorIdNotFound }, LBAsect=20586, sector=20407
Jun 28 01:09:07 c3 kernel: [ 184.700869] ide: failed opcode was: unknown
One emergency dd to a disk, stolen from my old TV set-top box, later and we're up and running again.
Only a shame that due to the layout of the partitions on the dead disk, I can't grow my filesystems easily to make use of the much larger disk that is transplanted to the server.
Patch for Gammu's DCT3 debug trace
posted 2009-06-27 21:06:43
I've written a quick and dirty patch for Gammu's nokiadebug command. Normally, nokiadebug writes debug traces to a hardcoded out.xml file, which is not really practical.
With my patch applied to gammu-1.24.0, the output of nokiadebug that was previously sent to stdout is now written to stderr. The debug traces are now written to stdout. This way it is much easier to follow the debug traces 'live'.
You might need to rebuffer gammu's stdout to emit the complete protocol hierarchy per message at once. The following (pretty ugly) awk does this for you, to add some clarity I've added line breaks to what was an even uglier one-liner before:
hessch@c3:~/gsm$ gammu nokiadebug nhm5_587.txt v18-19 2>/dev/null | awk '
/^\<l1/ {i=0}
/^\<\/l1/ { end = 1 }
{
if ( i>=0 ) {
buf[i] = $0;
i++
};
if (end == 1){
end = 0;
for (j = 0; j < i; j++) {
print buf[j];
};
i = 0;
}
}
'
You can download my patch for Gammu at http://isquared.nl/src/gammu-xmlstdout.patch..
UDGBUF, Part 1.5 : Adventures with the HD44780
posted 2009-06-16 20:57:31
Yesterday (and today when I confirmed this), I noticed that it can be helpful to actually understand what you're doing. :) What I didn't knew when I was POKEing bytes in my Psion Organiser's address space at first, is that when you access addresses 0x180 and 0x181, you're actually addressing the HD44780 LCD controller in the Organiser.
The address 0x180 is the instruction register of the HD44780 LCD controller, the address 0x181 is its data register. I should have wondered already why it was possible to write subsequent rows in a UDG to the same address 0x181 to define a character.
If we look at the code of defining a user defined character again:
udg:(udgnum%, b0%, b1%, b2%, b3%, b4%, b5%, b6%, b7%)
pokeb $180, 64 + udgnum%*8
pokeb $181, b0%; pokeb $181, b1%
pokeb $181, b2%; pokeb $181, b3%
pokeb $181, b4%; pokeb $181, b5%
pokeb $181, b6%; pokeb $181, b7%
You see that first the argument 64 + udgnum%*8 is written to the address 0x180. The term 64 (or 0x40) is the instruction to the HD44780 LCD controller to set the CG (character generator) RAM address. The least significant 6-bits of the instruction contain the address itself, this is the udgnum% * 8 term. udgnum% In this case, is the character to define. A character contains 8 rows of pixels, so to reach the next character you multiply this by 8.
Poking to 0x181 writes the bit pattern poked to this address in the CG RAM, the magic part is that after writing this pattern, the CG RAM address is automatically incremented by the controller!
Knowing this, I realized that it must be possible to use this to read from the CG RAM as well as writing, but it's not possible to use the autoincrement magic then. This morning, in the train to work I wrote a small OPL program to test this assumption:
rlcdreg:
local char%, row%, byte%
rem dump UDGs from HD44780 CG RAM
char% = 0
while char% <= 7
row% = 0
while row% <= 7
rem hd44780 instr reg is at 180h
rem instr 40h addresses CG RAM
pokeb $180, $40 + char%*8 + row%
rem data reg is at 181h
byte% = peekb($181)
print "chr"; char%,
print "row"; row%,
print "val"; byte%
row% = row% + 1
endwh
char% = char% + 1
endwh
And the character definitions came scrolling down my Psion's little screen!
Pretty useless, maybe. But it means that it is possible to manipulate the UDG definitions in the LCD controller directly, without using some shadow copy in the Psion's RAM. I think that I will experiment with this in OPL first and when succesful port it to machine code instead for speed, would be a nice opportunity to learn the instruction set of an ancient processor. ;)
To be continued.
UDGBUF: a poor man's framebuffer on Psion Organiser II, Part 1
posted 2009-06-13 22:57:15
Today I had some more fun with my rediscovered Psion Organiser II. It's about time to get my hands on a model LZ or LZ64 to enjoy twice the amount of screen real estate. ;)
This time I toyed with UDG (user defined characters) again. As the Psion reference manual states you can use these to make small animations as updating these changes them on screen immediately. That gave me the idea to implement some minimalistic framebuffer using all eight UDGs. I print four static UDGs in screen row 1, the other four in screen row 2, this way you get a whopping 40x16 pixel space for graphics!
It would be nice to read/write to the display controller directly and provide some convenience functions to do basic drawing, but I don't feel like learning to write HD6303 machine code just yet, so for now I plan to pass a pointer to some shadow memory (which I plan to allocate by creating a large global array or string) around where you do your graphics stuff, this will be then copied to the UDGs.
As a first test, I wrote a small program that walks through the memory of the Psion and displays it in the UDGs, with this result:
Tomorrow, I'll try to write some functions to provide a few basic graphics operations to set and get a pixel value. And maybe even some Bressenham line/circle drawing after that.
JavaScript unit conversion gadget brings lots of RegEx fun
posted 2009-06-07 21:39:38
My girlfriend started a cooking blog recently, if you want to keep track of what I eat, I suggest you subscribe to her feed. ;)
To help her American followers (and others suffering under the burden of a unit system from the
middle ages), I kludged together a little gadget to add to her Blogger pages. The gadget tries
to convert a few metric units to something equivalent in stones, feet and that Fahrenheit thing.
Doing so, I learned a nifty thing about JavaScript regular expressions. The replace method in JavaScript 3 makes it possible to call a function to return the replacement string. This way, I can match value, a possible prefix and unit, make backreferences and pass those to a conversion function and replace the matched text in the blog posts with converted values in one go, like so:
var re = /(\d+|\u00bd) ?([mcdk]|(?:mili|centi|deci|kilo))?(g(?:r|ram)?|l(?:iter)?|c(?:elcius)?)\b/gi;
function knvrtit() {
var entries = document.getElementsByClassName('entry-content');
for (var i = 0; i < entries.length; i++) {
entries[i].innerHTML = entries[i].innerHTML.replace(re, das_Konvertor);
};
}
But, what is that unicode \u00bd, you say? Oh, well as it happens some keyboard layouts have a 1/2 character and some people like to use it as well....
Das_Konvertor() then does it's magic using a case construct to multiply values based on the
prefix of a unit, and then uses a second case construct to decide to convert in what way based on the
type of unit encountered.
The code for das_Konvertor() is a bit long, but it looks somewhat like this:
function das_Konvertor (str, value, prefix, unit, offset, s) {
// do stuff
return string_in_imperical_units;
}
It would be fun, and very web2.0ish to, instead of doing my own ugly conversions, pass the calculation to be done to the almighty Google calculator in an XMLHttpRequest and display the result. If it keeps raining in the weekends, I might do so. ;)
Psion Organiser II bargraphs
posted 2009-06-07 17:48:12
Today, when searching for some other stuff, I came across some OPL (Organiser Programming Language, some sort of Pascal-ish bastard child of BASIC) code that I must have written around 2000, or so.
One of the programs was a set of functions to display bargraphs using user-defined characters on the two line text LCD of the Psion Organiser II. So I dug out my trusty old Psion Organiser II XP and cleaned up the code a bit.

This might be of use to someone, therefore I publish it here.
udg:(x%, b0%, b1%, b2%, b3%, b4%, b5%, b6%, b7%) pokeb $180, 64 + x%*8 pokeb $181, b0%; pokeb $181, b1% pokeb $181, b2%; pokeb $181, b3% pokeb $181, b4%; pokeb $181, b5% pokeb $181, b6%; pokeb $181, b7% bargudg: udg:(0, 0, 0, 0, 0, 0, 0, 0,31) udg:(1, 0, 0, 0, 0, 0, 0,31,31) udg:(2, 0, 0, 0, 0, 0,31,31,31) udg:(3, 0, 0, 0, 0,31,31,31,31) udg:(4, 0, 0, 0,31,31,31,31,31) udg:(5, 0, 0,31,31,31,31,31,31) udg:(6, 0,31,31,31,31,31,31,31) udg:(7,31,31,31,31,31,31,31,31) barchr$:(n%) if n% > 8 n% = 8 endif if n% = 0 return " " endif return chr$(n% - 1)
When you add these functions to your Organiser, after calling bargudg: you can call barchr$:() just like chr$() to print bargraph characters to the screen or to concatenate them to a string. barchr$:() accepts integers in the range 0..8, 0 being actually a space, not an UDG.
JavaScript Cellular Automata Simulation of Fluid-flow
posted 2009-05-23 12:13:28
Read full article
Yesterday, I tried to make a simple Cellular Automaton-like discrete simulation of fluid-flow. Or I am not even sure flow is the right word, it simulates waves coming from the left, with an adjustable frequency, hitting obstacles in their path.
My simulation is by no means attempting to be correct in any way but it is nice to play with and I even spotted something resembling the canceling of waves when passing to a double slit.
Most of the work went into convincing JavaScript to do what I wanted, without being able to use Firebug due to some obscure bug. Maybe I'll write some more about the code behind this in a later article.
I also plan to make it possible to save the configuration of the obstacles in a later version.
Follow the read link to give it a try.
TagPop: the making of
posted 2009-05-19 13:28:36
Read full article
As promised before, here is a description of the inner workings of TagPop.
TagPop is a tag cloud of all tags used on this website, in which the size of each tag represent its popularity among the visitors of this site. The popularity is measured based on pageviews of individual articles.
NS Zet bussen in (in Dutch)
posted 2009-05-17 11:18:13
"NS zet bussen in" is een iCal feed gemaakt van de aankondigingen van werkzaamheden op de NS website.
De aankondigingen op de NS site zijn slecht te lezen door computers, ik heb geprobeerd deze zo goed en zo kwaad mogelijk om te zetten naar "all-day" events.
De feed is beschikbaar op http://isquared.nl/nszetbussenin.ics, deze feed is (bijvoorbeeld) in Google Calendar als gedeelde agenda toe te voegen. Op deze manier weet je de volgende keer vooraf of er werkzaamheden zijn op weg naar de afspraak die je probeert te maken.
Perl anonymous hashes as lookup-tables
posted 2009-05-16 17:36:57
Today when munging some data in Perl I came up with a elegant way to use anonymous hashes as lookup tables.
In this case I wanted to translate month names to integers. Of course you could use a bunch of regular expressions to do so. But adhering to the Perl motto "there is more than one way to do it" I tried using an anonymous hash as a lookup table, like this:
$month = ${{
'jan' => 1, 'feb' => 2, 'mar' => 3,
'apr' => 4, 'may' => 5, 'jun' => 6,
'jul' => 7, 'aug' => 8, 'sep' => 9,
'oct' => 10, 'nov' => 11, 'dec' => 12}}{$month};
I quite like this method as no extra variables are needed and you can use this to map many types of data to others.
TagPop Visualizes tags by popularity
posted 2009-04-22 18:59:45
Read full article
The tag cloud on the left side of this page displays tags assigned to articles. The size of each tag is determined on the number of articles to which this tag is assigned.
I was interested how this tag cloud looks like when the size is determined by the popularity of articles tagged with a certain tag among readers of isquared.nl.
To visualize this I have hacked together a quick application, called TagPop, to display the tags based on popularity, this is available here.
In a later post I will write more about the inner workings of TagPop.
New version of Squa.sh
posted 2009-04-20 23:57:28
I've made some changes to squa.sh, my Bash script Pong clone.
The first version made extensivce use of tput(1) to update
the terminal cursor position.
I compared the resulting control sequences sent to various terminal
versions, and all seemed to be in the format:
^[${row};${column}H
Therefore this new version uses pre cooked control sequences instead of forking tput like mad. dd(1) is still spawned each iteration of the main loop to capture user input, read(1) smallest timeout is 1 second, so this is no option, or the game would be no much fun. ;)
Also terminal size detection is fixed for NetBSD now, which means that the new version of squa.sh runs on all hardware in my house right now!
You can grab a copy of the new version at http://isquared.nl/src/squa.sh-ng/squa.sh.
squa.sh
posted 2009-04-19 20:37:58
Read full article
Squa.sh is a litte squash game in a Bash shell script that I wrote this evening.
Follow the read link for more information or you can download the complete script from here.
Converting dotted-quad IP addresses to integers
posted 2009-04-18 10:18:18
Some years ago, before I was lazy enough to just grab a module from CPAN, I wrote this handy Perl function to convert a dotted quad IP address to an integer.
sub dotquadToInt($) {
my ($e, $m, $r) = (24,,);
my @octet = split(/\./, $_[0]);
foreach $m (@octet) {
$r += $m*2**$e;
$e -= 8;
};
return $r;
}
I think the above is pretty, because it is easy to adapt to different bases etc. But it is also needlessly complex, a more elegant way to achieve the same is something like this:
sub dotquadToInt($) {
my @octet = split(/\./, $_[0]);
return $octet[0]*2**24 + $octet[1]*2**16 + $octet[2]*2**8 + $octet[3];
}
Maybe these functions are of use to someone, though I would recommend everybody to use the excellent Net::IP Perl module instead!
Dreft
posted 2009-04-18 09:38:53
Dreft is a quick and dirty tool that I wrote some time ago to do a bunch of reverse DNS lookups for a CIDR block.Its a pretty simple script, the most interesting part is the ugly workaround to create an in-addr.arpa address from a Net::IP object, somehow I couldn't convince Net::IP to do this for me when iterating addresses.
Usage is pretty straightforward too:
hessch@blokje:~$ dreft 4.2.2.0/29 4.2.2.1 -> vnsc-pri.sys.gtei.net. 4.2.2.2 -> vnsc-bak.sys.gtei.net. 4.2.2.3 -> vnsc-lc.sys.gtei.net. 4.2.2.4 -> vnsc-pri-dsl.genuity.net. 4.2.2.5 -> vnsc-bak-dsl.genuity.net. 4.2.2.6 -> vnsc-lc-dsl.genuity.net.
Below you'll find the complete script, or as a handy downloadable link here.
#!/usr/bin/perl -w
# dreft - reverse dns enumerator
# Hessel Schut, hessel@isquared.nl, 2008-06-24
use strict;
use Net::DNS;
use Net::IP;
my $ip = new Net::IP ($ARGV[0]) or die (Net::IP::Error());
my $res = Net::DNS::Resolver->new;
do {
# $ip->reverse_ip doesn't work when iterating IP addresses
# horrible kludge to in-addr.arpafy the current IP:
my $ptr = join('.', reverse(split /\./, $ip->ip()));
$ptr .= ".in-addr.arpa";
my $rr = $res->query($ptr, qw(PTR));
if ($rr) {
print $ip->ip()." -> ".(($rr->answer)[0]->rdatastr)."\n";
};
} while (++$ip);
Sorting IP addresses
posted 2009-04-13 10:28:03
Ever noticed how the Unix sort command can't make anything of IP addresses when you use just a numeric sort, like this:
hessch@galileo:~$ sort -n ip.txt 1.2.3.4 5.6.7.8 10.200.219.5 10.20.30.40 10.3.5.6 89.2.177.21 193.18.4.1
As you notice, for instance 10.20.30.40 is listed below 10.200.219.5, which is wrong, of course. The trick is to define every octect in the dotted quad notation as a key for sort like this:
hessch@galileo:~$ sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 ip.txt 1.2.3.4 5.6.7.8 10.3.5.6 10.20.30.40 10.200.219.5 89.2.177.21 193.18.4.1
There you have it, using sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 all addresses are sorted properly.
PostgreSQL Enums for fun and profit
posted 2009-04-12 23:24:03
Once in a while I find the need to reinvent the wheel when programming, when working on some project recently, the wheel happened to be syslog.Nothing wrong with syslog, but I felt the need to write my own logging to a table in a Postgres database.
While doing so I found a great way for deciding whether an event can be logged at a certain log level using an enumerated datatype in Postgres.
First we define the log levels (severities) as an Enum:
CREATE TYPE eventseverity AS ENUM (
'debug',
'notice',
'warn',
'error'
);
Every event in the database will have a severity assigned to it.
Now, to decide whether a event can be logged when a certain threshold
is set, we can make use of this enumerated datatype:
SELECT enum_range(
log_threshold::eventseverity,
enum_last(null::eventseverity)) @> '{notice}'
FROM eventconfig
;
Where '{notice}' is the current log level to be tested.
This returns a boolean that tells whether the tested log level is above or below the threshold.
This can of course be integrated into more complicated queries.
For example in my project this does a boolean OR over rows returned for
different thresholds.
Online MAC Address Vendor lookup
posted 2008-11-23 02:59:42
Read full article
I have made an online version of my MAC address vendor lookup script.
Of course there are many of these already, but well, choice is good, right?
You can query my vendor lookup tool here: http://isquared.nl/doapp.html?appid=mac2vendor
Cobalt status LCD, NetBSD version
posted 2008-11-09 01:18:41
Here is a NetBSD/Cobalt version of my Cobalt Qube/Raq LCD status screen updater.The Debian linux version is described in an earlier post on this page, here: Cobalt Qube status LCD system monitor. This script works fine on NetBSD/Cobalt 3.0, I haven't tested it on other versions yet. You can download the new NetBSD version at http://isquared.nl/src/lcdbanner-netbsd.sh
MAC address vendor lookup
posted 2008-11-01 23:19:12
Read full article
There are a couple of webpages where you can lookup the manufacturer of a piece of network equipment based on the OUI part of its MAC-address.
That's neat, but not really if the device that you're trying to identify is, for instance, the rogue DHCP-server that knocked you off the Internet.
And apart from that, I rather do as much as I can from within the shell instead of mousing to some website.
That is why I've written a small shell-script that does the work for you.
SQLite based Bluetooth device logger
posted 2008-11-01 23:16:40
Read full article
Btsql is a simple Bluetooth device logger, originally written in Perl, but later I rewrote it in C to support multiple Bluetooth (HCI) devices. The C source is very rough, but it basically works. :-)
All application logic resides within the SQLite3 database, that way the logger doesn't need to do more than blindly inserting values in the database. A couple of triggers do the rest.
Cobalt Qube status LCD system monitor
posted 2008-11-01 22:58:29
Read full article
This is a handy framework to monitor several system parameters on Cobalt hardware running Debian GNU/Linux.
arduino SLx-2016 display driver
posted 2008-11-01 22:54:26
Read full article
The Osram SLx-2016 displays look great, and they are quite easy to interface. I bought one to play with at Conrad some time ago. It was gathering dust for a while, but I stubled upon it again today and kludged together a small piece of Arduino code to talk to my nice and shiny green display.
Durable circuits on perfboard
posted 2008-11-01 22:51:38
Read full article
Ok, I have a love-hate relationship with perfboard. It's easy to prototype on it, but wiring your circuit can be a very tedious job.
And because of the exposed wiring your circuit board can be a bit fragile (or this might be due to my lousy soldering, of course.)
A handy way to make your circuit a bit more durable, and lots more presentable too, you can use cheap commonly available two-component epoxy glue to encase the solder side of your circuit boards. The downside is that you can't make any modifications afterwards, but for some of my projects this is not really a problem.
Bourne/ Bash Shell CGI Scripts
posted 2008-11-01 22:49:09
Read full article
Usually I do my server-side scripting in Perl, but some time ago when writing CGI scripts for an embedded system I ran into memory and flash space contraints. Because the system used Busybox, I had the Bourne compatible ash shell available.
So I wrote a very small Bourne shell script to include in my CGI scripts, which I share here, maybe it is of use to someone.
802.11 Wifi Radio spectrograms
posted 2008-11-01 22:45:30
Read full article
I've written a small program to plot the 802.11 (b/g) wifi radio spectrum from data collected from a Linksys WAP-54G access point running OpenWRT.
Follow the read link to read more...
Old items repost
posted 2008-11-01 22:41:35
Since the new site is built somewhat like a blog, I'll repost the old content as blog entries from here.New page design
posted 2008-11-01 22:36:17
Welcome to the new design for isquared.nl.The old layout didn´t render properly on some browsers and wasn't too user-friendly anyway. So I decided on less form over function and tried to make it a bit easier to maintain at the same time.
This is still a work in progress, so some features may misbehave or don´t work at all, this should be fixed soon, depending on my spare time. ;-)
isquared.nl rss (atom)