Oprydning på bogreolen – Fagbøger

Det er efterhånden blevet på tide at ryde lidt ud i samlingen af bøger. De fleste har vis nok mest historisk interesse, men hvis der er nogen der kan bruge en eller flere af dem, så er det bedre end at smide dem ud.

Følgende bøger ligger i øjeblikket i bunken:

  • Programming Erlang, Joe Amstrong (2007)
  • Haskel – The Craft of Functional Programming, Simon Thompson (1996)
  • Sensation and Perception, Margaret W. Matlin & Hugh J. Foley (1997)
  • DSP First – A Multimedia Approach, James H. McClellan et al (1999)
  • Games, Diversions & Perl Culture, edited by Jon Orwant (2003)
  • Computer Science & Perl Programming, edited by Jon Orwant (2003)
  • Advanced Perl Programming, Sriram Srinivasan (1997)
  • Learning the vi Editor, Linda Lamb & Arnold Robbins (1998)
  • MacOS X Panther for Unix Geeks, Brian Jepson & Ernest E. Robman (2004)
  • C Pocket Reference, Peter Prinz & Ulla Kirch-Prinz (2002)
  • Inside XML, Steven Holzner (2001)
  • The LaTeX Companion, Goossems et al (1994)
  • LaTeX User’s Guide and Reference Manual, Leslie Lamport (1994)
  • Ruby in a Nutshell, Yukihiro Matsumoto (2002)
  • Practical Unix & Internet Security, Simon Garfinkel et al (2003)

Det skal helst ikke være for besværligt for mig, men ellers skal jeg bare af med dem… Bøgerne kan for eksempel afhentes i Københavnsområdet.

Comments

Reviewing my own regular expressions

Regular expressions are a wonderful tool, but as many other powerful tools they tend to be misused. If I had a penny for everytime I recommended against using regular expressions for parsing HTML fragments …. yeah you know what I mean.

This time made me think a bit about my own use of regular expressions. Do I ever fall in the trap of misusing regular expressions myself? Looking at my current code base I couldn’t find any glaring misuses, if I could only get a list of all the regular expressions in my current project.

Regular expressions to the rescue? No, that would probably be quite an horrible adventure. Luckily I have tools to parse Perl: PPI to the rescue:

A few hundred regular expressions. Most of them just matching simple substrings (in some cases case insensitive) or just short hand for testing a handful of equalities in one go. The only zero-width assertions we are using are the word boundary and quantifiers are mostly used on simple character classes like \d, \s, [0-9a-f] and a few “anything but this one or two characters” ([^>]).

Lessons learned: 1) PPI is cool. 2) I really do use regular expressions as I preach.

Comments (2)

Nej, jeg vil ikke hjælpe dig…

Åhhh, glæderne ved at have domænet hacking.dk:

Hej Peter .. jeg fandt din mail på nettet … kan du muligvis hjælpe mig? .. jeg er en ung pige der tror min fyr er utro … jeg vil gerne hacke hans facebook!!!

Hvis jeg er i et rigtig bittert humør, så kunne jeg række ud efter straffelovens §263 og slå hende i hovedet med strafferammen. Det er nok overkill, selvom jeg ville fortjene en straf medvirkened. Men nu er jeg rent faktisk ikke specielt bitter idag (om det så er fordi det er forår eller fordi mailen faktisk er forholdsvis velformlueret og velskrevet?)

Jeg kender selvfølgelig en ung dame der med jævne mellemrum “hacker” hendes fars facebook. Men mon ikke at afsenderes kæreste dog har lidt bedre styr på basal IT-sikkerhed end den stakkels far.

Comments (1)

Et spørgsmål om skala

Da jeg dagligt har kontakt med mine indiske kollegaer, lægger jeg ofte specielt mærke til når nyheder fra Indien suser forbi i min daglige nyhedsstrøm. For eksemple artiklen på pol.dk “Bus styrter ned fra bro i Indien: 32 er dræbt“. Artiklen indeholder følgende beskrivelse af den indiske trafiksikkerhed:

I 2011 blev omkring 110.000 personer dræbt i den tætte indiske trafik – det er flere end 300 om dagen. Dårlige veje, høje hastigheder og ringe køreevner er blandt årsagerne til de mange ulykker.

300 dræbte om dagen lyder godt nok slemt, ikke?

Fra en anden artikel kan jeg finde de tilsvarende tal for Danmark. I 2012 døde der 180 danskere i trafikken (rekord-få dræbte) og for kun 10 år siden var tallet omkring 500 dræbte om året.

I Indien bor der lige omkring 1,2 milliarder mod cirka 5.5 millioner i Danmark. Der er altså cirka 200 gange så mange indere som der er danskere. Hvis vi tager det ti år gamle antal for trafikdræbte i Danmark og ganger med 200, så får vi sjovt nok præcis det antal dræbte som artiklen forfærdes over der er i den indiske trafik.

Den indiske trafik er slem og en trafikdræbt er absolut en for mange. Men man skal passe på med at blive alt for forfærdet bare ved at sammenligne danske og indiske tale en-til-en.

Comments

Installing Linux on MyAudio Tablet Series9

Recently I recieved a MyAudio Tablet Series9 as a gift. From the factory it runs some version of Android, but I already got enough Android devices. Instead I wanted to play a bit with a basic Linux install.

This tablet is based on the AllWinner A10 System on a Chip. Some of these instructions might work for other systems based on the same chip set:

Step 1: Install the rescue system from http://forum.doozan.com/read.php?6,9396 on a SD-card.

You can configure network settings in rescue/interfaces and rescue/wpa_supplicant.conf.

Step 2: Boot the rescue system.

The MyAudio table will boot from the SD-card if it contains a bootable system, so this is quite easy. The first time you boot the rescue system tries to locate a system.bin file from the tablet. this file contains the hardware configuration and is needed for initializing all the hardware. This means that the screen can’t be initialized the first time you boot and will just appear off.

Unless the system automatically boots again you need to locate the system.bin yourself from the tablet. It is usually located on /dev/nanda and have names like system.bin, script.bin, or evb.bin. To find the file you can use the log the rescue system places in log/deviceinfo.log on the SD-card during boot.

You should now have console access to the tablet and using a USB keyboard you should be able to work in the console.

Step 3: Setting up the network

Having configured rescue/interfaces and rescue/wpa_supplicant.conf the network ought to work. I am experiencing some problems getting it to connect to my Access Point (using WPA2). Patience works, but you might need to monitor the status with wpa_cli(8) and then run udhcp -i wlan0 when it succeeds.

Step 4: Install Debian using the installer at http://forum.doozan.com/read.php?6,8906

This just worked fine…

Step 5: Getting the touch screen to work.

The system.bin file can be decoded with the fexc utility either available on the rescue system (compiled for arm) of from https://github.com/linux-sunxi/sunxi-tools. Finding the ctp_para section we can see that this tablet uses a ft5x touch screen.

Adding ft5x_ts to /etc/modules on our installed system will make sure that the correct kernel module gets loaded on boot time. But for some reason the kernel driver and the X11 evdev driver will not talk together. So we need to compile our own kernel patched as described on https://www.miniand.com/forums/forums/development/topics/how-do-i-get-the-lcd-display-and-touch-screen-working-on-an-a10-tablet#post-1225.

I have made kernel packages for Debian available at http://hacking.dk/files/linux-image-3.0.57-sun4i+_1.0+nomultitouch_armhf.deb or http://hacking.dk/files/linux-image-3.4.24-sun4i+_1.0+nomultitouch_armhf.deb.

Install the kernel package you want and run this as root:

# KERNEL_VERSION=3.4.24-sun4i+
# /usr/bin/mkimage -A arm -O linux -T kernel  -C none -a 0x40008000 -e 0x40008000 -n Linux-$KERNEL_VERSION -d /boot/vmlinuz-$KERNEL_VERSION /boot/uImage
# /usr/bin/mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initramfs-$KERNEL_VERSION -d /boot/initrd.img-$KERNEL_VERSION /boot/uInitrd

After a reboot X11 will respond to the touch screen, but …

Step 6: Configure the touch screen

… the pointer does not point where I touch the screen. The transformation between the points are wrong. This is fixed by adding this to your xorg.conf:

Section "InputClass"
    Identifier     "touchscreen"
    MatchProduct   "ft5x_ts"
    Option    "TransformationMatrix" "0 1 0 1 0 0 0 0 1"
    Option    "Calibration" "0 768 0 1024"
EndSection

or more dynamically by running:

$ xinput set-prop ft5x_ts "Coordinate Transformation Matrix" 0 1 0 1 0 0 0 0 1
$ xinput set-prop ft5x_ts "Evdev Axis Calibration" 0 768 0 1024

For more information about the Transformation Matrix, see the X.Org Wiki

Step 7: Install a on-screen keyboard.

I have not found the perfect keyboard application yet. Currently I am using matchbox-keyboard

Comments (3)

Deploying “Half of CPAN” on Debian using Carton

As systems developer I like just being able to pick the most useful Perl modules from CPAN and preferably use quite recent versions of the modules I need. On the other hand our systems administrators prefer running Debian Stable and deploy software using .deb packages.

I do not want to maintain hundred small packages by hand. I just want a single package with all needed the Perl dependencies for a given project. After looking at different possibilities for bundling Perl dependencies I finally found Carton written by Tatsuhiko Miyagawa.

Given a list of your direct Perl dependencies, Carton can maintain the full dependency chain and manage which versions of each module you deploy. One of the nice features is that you get a reproducible set of versions each time and not just the latest, greatest, and recently broken versions.

The initial step is to set Carton up to install the dependencies for my project. This part is done just like the Carton documentation describes. To ensure independence from whatever is available on CPAN I end by calling carton bundle.

The next step is to write a small Perl module making sure you load modules from the right place. I end up with installing modules in /usr/lib/projectname. My module looks like this:

package My::Bundle::ProjectName;

=head1 NAME

My::Bundle::ProjectName - Bundle of CPAN modules used by ProjectName

=cut

our $VERSION = 1.0;

use Config;
use Carp;
use Carp::Heavy;  # Ensure that all parts of Carp are loaded before @INC mangling
use File::Spec;

our $BASE = '/usr/lib/projectname';

sub import {
    carp (__PACKAGE__ . " bundle not installed")
        unless -d $BASE;

    unshift @INC, 
        File::Spec->catdir( $BASE, 'lib', 'perl5' ),
        File::Spec->catdir( $BASE, 'lib', 'perl5', $Config{archname});
}

1;

Now I need to install this module and all the modules maintained by Carton. I do this by a enhanced Module::Build script:

use v5.10.0;
use strict;
use warnings;

use Module::Build;

my $class = Module::Build->subclass(
    class => "My::Builder",
    code  => q{
        sub ACTION_build {
            my $self = shift;
            $self->SUPER::ACTION_build;

            !system 'carton', 'install', '--cached';
        }

        sub ACTION_install {
            my $self = shift;
            $self->SUPER::ACTION_install;
            
            my $installdir = $self->destdir . "/usr/lib/projectname";

            system 'install', '-d', $installdir;
            !system 'cp', '-a', 'local/lib', $installdir;
        }
    },
);

$class->new(
    module_name       => 'My::Bundle::ProjectName',
    dist_author       => 'Peter Makholm ',
    dist_version_from => 'lib/My/Bundle/ProjectName.pm',
    add_to_cleanup    => [ 'local/lib', 'local/bin' ],
)->create_build_script;

The last step is to create a .deb package. This is mostly just a standard debian/ directory using debhelper. You just need to override the dh_perl to pick up the correct binary dependencies. So this is my debian/rules:

#!/usr/bin/make -f

%:
        dh $@

override_dh_perl:
        dh_perl /usr/lib/projectname/lib

That’s it. Then all the scripts and applications making up my project just needes to use My::Bundle::ProjectName and the rest is automatic.

I am thinking about enhancing Carton to provide individual .deb packages instead of just installing the modules. This would make it quite easy to maintain the packages in a more The Debian Perl Group-compatible way. That could be cool.

Comments (4)

Creating a negative match RegExp object

It is a frequently asked Perl question how to write a regular expression that matches anything but “something”. The usual answer is that it can’t be done or that you need to use the !~ operator instead of the =~ operator. But when you are using API’s that passes regular expressions around as objects this might not be entirely helpful answers.

By digging a bit around in the scarier parts of the perlre manual page I worked out this quite Perl specific solution: qr/(?:(?:something(*COMMIT)(*FAIL))|.)*/.

I am not sure that it works in all possible corner cases and I certainly don’t want to write the much needed comment that makes the code using the regexp maintainable.

In the end it might be possible, but it is just one of those “Now you have two problems” scenarios.

Comments (5)

Atlas Shrugged

Som lidt hyggelæsning i løbet af min ferie har jeg endelig fået læst Ayn Rands “Atlas Shrugged”. Den har ligget i min bunke af ulæste bøger et stykke tid. Rent litterært var de første 1000 sider ganske fornøjelige, John Galts 60 sider lange monolog dræbende tung læsning og resten rent sjusk der tydeligt udståler at Ayn Rand bare skulle have overstået bogen.

Hvis man holder af de sociologiske aspekter af blød science fiction, utopier og dystopier kan jeg anbefale at man læser de første 1000 sider og så stopper ved Galts store monolog i radioen. Derefter kan man lade sin egen fantasi og ideologi udfylde resten.

ObXKCD:
Bookshelf

Langt hen ad vejen deler jeg en række af Ayn Rands præmisser.

Jeg afskyer anti-elitisme og den medfølgende stræben efter det middelmådige. Jeg er stolt af mine evner på de områder hvor jeg hæver mig over gennemsnittet og jeg mener at vi i samfundet skal gøre mere for at fremelske toppen.

Jeg tror ikke at “yde efter evne, nyde efter behov” er en levedygtig samfundsmodel. For det første tror jeg igen at det medfører en stræben efter det middelmådige og for det andet, hvem bestemer hvad folks behov er? Hvilke kontrolinstanser skal sørger for at vores opfattelse af behov ikke bare stiger og pålægger de evnefulde at yde mere og mere?

Jeg tror ikke at blind altruisme er vejen til success. Vi skal være bekendt at vi handler for at opnå en værdi og dermed tage et eget ansvar for at handlen giver mening. Hvis ingen af os er vores egen værdi bekendt, hvem kan så tage reelt ansvar for at vi opnår et rigt samfund?

Ayn Rands konklussion fylder meget lidt i forhold til dystopien baseret på præmisserne. Men jeg tror ikke på den rene laissez-faire ideologi som Ayn Rand fremhæver. Jeg tror at staten kan gøre mere nytte end bare at håndhæve ejendomsretten. Jeg tror der er opgaver der bliver løst mere effektivt hvis vi alle løfter i samlet flok, istedet for at overlade alt til konkurrencen på det frie marked.

John Galt ville afsky mig…

Comments

PostDanmark: Next stop tilsynet

Atter engang med et PostDanmark-distribueret reklameomslag i postkassen på trods af at jeg er tilmeldt “Reklamer Nej Tak” ordningen og mærkaten sidder tydeligt på min postkasse. Efter to klager til Post Danmarks kundeservice uden success må jeg prøve noget nyt, så efter lidt søgen…

Kære Jens Hork, (cc: skrivpost@post.dk att: Katrin Carlsen)

Jeg søger efter det rette sted at klage over Post Danmarks virker som
reklamedistributør i forhold til overholdelse af “Reklamer, Nej Tak”
ordningen. På forbrug.dk bliver jeg henvist til Traffikstyrelsen, hvor
du står som Kontaktperson vedrørende Tilsyn med Post Danmark.

Jeg har gentagende gange klaget direkte til Post Danmark via deres
“Service Center Kunde” på skrivpost@post.dk. Umidelbart har jeg kopier af
klager og svar dateret omkring 8. februar 2012 og 12. marts 2012.

Jeg er tilmeldt “Reklamer Nej Tak” ordningen, modtog automatisk en ny
mærkat i løbet af foråret og mærkaten sidder tydeligt på min
postkasse. På trods af dette har jeg gentagende gange, i hvert fald
omkring ovenstående datoer samt idag den 26. juni, modtaget
reklameomslag distribueret af Post Danmark indenholdende reklamer.

Omslaget er adresseret til den efterfølgende opgang på ruten. Jeg er
derfor ikke i tvivl om at jeg er korrekt tilmeldt ordningen. Der er
derfor efter min mening klart tale om at Post Danmark ikke overholder
ordningen.

Min adresse er “Tinderhøj Vænge 31, 1 tv, 2610 Rødovre”, de fejlleverede
reklamer er gerne addreseret til “Tinderhøj Vænge 33, 1 tv, 2610
Rødovre”. En enkelt gang har jeg vist yderligere fået et sæt til
“Tinderhøj Vænge 31, 1th, 2610 Rødovre”.

Med venlig hilsen,
Peter Makholm

Comments (3)

Dansk spam? Gitte fra DanishSEO

Here we go again….

Gitte Møller <gitte.moller@danishseo.com> writes:

Mit navn er Gitte Møller og jeg vil med glæde fortælle dig hvordan peter.makholm.net kan rangere endnu højere i Google.

Du skriver på din LinkedIn-profil at du stræber efter at være
ekspert. Men…

  • du sender uanmodet reklame i strid med Markedføringslovens §6.
  • dit websted mangler kontaktinformation, herunder CVR-nummer.
  • dit websted er en tom skal uden reelt indhold.
  • hvis man googler dit domænenavn er et af de øverste hits en Amino-debat om din spam
  • havde du gjort dit hjemmearbejde ville du have kendt min holdning til spammere…

//Peter Makholm

UPDATE: Hmmm, mail bouncer efter at være vidersendt til en Sandeep. Spammen forekommer også på norsk

Comments (1)

« Previous entries Next Page » Next Page »