~ Doorhacking: Opening a Door With Your Cellphone

The problem: There is a group of people that want access to Hackerspace Ghent but there is only one remote to open the gate.

The solution: Build a system that reacts to a phone call by opening the gate if the number of the caller is whitelisted.

What you need:

  • A BeagleBoard or some BeagleBoard alternative with a Linux distribution running on it. Any server running a unix like operating system should be usable.
  • A Huaweii e220 or an alternative GSM that supports (a subset of) AT commands and has a USB port.
  • A team of hackers that know how to solder something togeher. E.g. The hardware guys of hackerspace Ghent.
  • A python script that reacts to calls.

The Hack: First of all try to get caller id working by following the Caller ID with Linux and Huawei e220 tutorial. If this works you can listen to the serial communication using pySerial and react to a call. The following python code shows the wait for call method:

1
2
3
4
5
6
7
8
9
10
def wait_for_call(self):
  self.data_channel.open()
  call_id_pattern = re.compile('.*CLIP.*"\+([0-9]+)",.*')
  while True:
    bytes = self.data_channel.inWaiting()
    buffer = self.data_channel.readline(bytes)
    call_id_match = call_id_pattern.match(buffer)
    if call_id_match:
      number = call_id_match.group(1)
      self.handle_call(number)

The handle_call method … handles the call.

The second thing that is needed is a way to send a signal from the beagle board to the remote. Sending a signal from the beagle board using Linux is really simple. The following bash commands initialize, activate and deactivate a pin.

1
2
3
echo 168 > /sys/class/gpio/export
echo "high" > /sys/class/gpio/gpio168/direction
echo "low" > /sys/class/gpio/gpio168/direction

 

~ Jobsopschool.be beter beveiligd

SSL iconOmdat er op jobsopschool gevoellige informatie te vinden is (bijvoorbeeld C.V.’s van kandidaten) is de beveiliging ervan belangrijk. Om die veiligheid te garanderen werd de vacaturesite voor onderwijzers op een volledig dichtgetimmerde aparte virtuele server geplaatst. Een server met enkel de broodnodige software zorgt voor een veilige en snelle afhandeling van requests.

Ook werd er voor gezorgd dat alle verkeer versleuteld wordt via SSL. De lighttpd webserver server werd geconfigureerd met deze tutorial die de configuratie van lighttpd met SSL bespreekt. Er werd een SSL certificaat van godaddy aangekocht omdat het root certificaat van godaddy in zowat alle browsers aanwezig is en omdat ze een redelijke prijs vragen.

~ Caller ID with Linux and Huawei e220

This is the scenario: you have a Huawei e220, a linux computer and you want to react to a call from a set of predefined numbers. E.g. ordering a pizza when you receive a call from a certain number.

The Huawei e220 supports a subset of the AT commands, which subset is an enterprise secret of te Huawei company. So there is no documentation available for the device I bought, thanks Huawei. Anyhow when you attach the e220 to a Linux machine you should get two serial ports:

1
2
/dev/ttyUSB0
/dev/ttyUSB1

To connect to the devices you can use a serial client. GNU Screen can be used as a serial client like this: screen /dev/ttyUSB0 115200. The first device, ttyUSB0 is used to control ttyUSB1, so to enable caller ID on te Huawei e220 you need to send this message to ttyUSB0:


AT+CLIP=1

To check for calls you should listen to ttyUSB1. A serial session for ttyUSB1 looks like:

1
2
3
4
5
^BOOT:44594282,0,0,0,6
^RSSI:18
RING
+CLIP: "+33499311152",145,,,,0
^BOOT:44594282,0,0,0,6

The RING and CLIP messages are the most interesting. The RING signifies an incoming call, the CLIP is the caller ID. The BOOT and RSSI are some kind of ping messages. The following Python script demonstrates a complete session that enables caller ID, waits for a phone call and prints the number of the caller.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
import serial, re

command_channel = serial.Serial(
        port='/dev/ttyUSB0',
        baudrate=115200,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS
)
command_channel.open()
#enable caller id
command_channel.write("AT+CLIP=1" + "\r\n")
command_channel.close()

ser = serial.Serial(
        port='/dev/ttyUSB1',
        baudrate=9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS
)

ser.open()

pattern = re.compile('.*CLIP.*"\+([0-9]+)",.*')

while 1:
        buffer = ser.read(ser.inWaiting()).strip()
        buffer = buffer.replace("\n","")
        match = pattern.match(buffer)
        if match:
                number = match.group(1)
                print number

~ YIN Pitch Tracker in JAVA

To make Tarsos more portable I wrote a pitch tracker in pure JAVA using the YIN algorithm based on the implementation in C of aubio. The implementation also uses some code written by Karl Helgasson and Teun de Lange of the Jazzperiments project.

It can be used to perform real time pitch detection or to analyse files. To use it as a real time pitch detector just start the JAR-file by double clicking. To analyse a file execute one of the following. The first results in a list of annotations (text), the second shows the annotations graphically.

1
2
java -jar pitch_detector_yin.jar  flute.novib.mf.C5B5.wav
java -jar pitch_detector_yin.jar  --file flute.novib.mf.C5B5.wav

The provided flute sample is from The Musical Samples library of the University of Iowa and converted to mono wav. The source code of the pitch tracker can be found below.

 

~ Boids 3D with Processing

~ Order Pizza with USB Pizza Button

Recently I bought a big shiny red USB-button. It is big, red and shiny. Initially I planned to use it to deploy new versions of websites to a server but I found a much better use: ordering pizza. Graphically the use case translates to something akin to:

If you would like to enhance your life quality leveraging the power of a USB pizza-button: you can! This is what you need:

  1. A PC running Linux. This tutorial is specifically geared towards Debian-based distos. YMMV.
  2. A big, shiny red USB button. Just google “USB panic button” if you want one.
  3. A location where you can order pizzas via a website. I live in Ghent, Belgium and use just-eat.be. Other websites can be supported by modifying a Ruby script.

Technically we need a driver to check when the button was pushed, a way to communicate the fact that the button was pushed and lastly we need to be able to react to the request.

The driver: on the internets I found a driver for the button. Another modification was done to make the driver process a daemon.

The communication: The original Python script executed another script on the local pc. A more flexible approach is possible using sockets. With sockets it is possible to notify any computer on a network.

1
2
3
4
5
6
7
if PanicButton().pressed():
  # create a TCP socket
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  # connect to server on the port
  s.connect((SERVER, SERVER_TCP_PORT))
  # send the order (margherita at restaurant mario)
  s.send("mario:  [margherita_big]\n")

The reaction: a ruby TCP server waits for message from the driver. When it does it automates a HTTP session on a website. It executes a series of HTTP-GET’s and POST’s. It uses the mechanize library.

1
2
3
4
5
6
7
8
9
login_url = "http://www.just-eat.be/pages/member/login.aspx"
a = WWW::Mechanize.new
a.get(login_url) do |login_page|   
  #post login_form
  login_form = login_page.forms.first
  login_form.txtUser = "username"
  login_form.txtPass  = "password"
  a.submit(login_form, login_form.buttons[1])
end

Some libraries are needed. For python you need the usb library, the python deamons lib needs to be installed seperatly. Setuptools are needed to install the deamons package.


sudo apt-get install python-usb python-setuptools

Ruby needs rubygems to install the needed mechanize and daemons library. Mechanize needs the libxslt-dev package. You also need the build-essential package to build mechanize.

1
2
sudo apt-get install rubygems libxslt-dev
sudo gem install mechanize daemons

To automatically start the daemons on boot you can use the crontab @reboot directive of the root user. E.g.:

1
2
@reboot /opt/pizza_service/pizza_daemon.rb
@reboot /opt/pizza_service/pizza_button_driver.py

~ Touchatag RFID reader and Ubuntu Linux

Touchatag Logo

This blog post is about how to use the Touchatag RFID reader hardware on Ubuntu Linux without using the Touchatag web service.

An RFID reader with tags can used to fire events. With a bit of scripting the events can be handled to do practically any task.

Normally a Touchatag reader is used together with the Touchatag web service but for some RFID applications the web service is just not practical. E.g. for embedded Linux devices without an Internet connection. In this tutorial I wil document how I got the Touchatag hardware working under Ubuntu Linux.

To follow this tutorial you will need:

  • Touchatag hardware: the USB reader and some tags
  • A Ubuntu Linux computer (I tested 9.10 Karmic Koala and 8.04 )
  • SVN to download source code from a repository

The touchatag USB reader works at 13.56MHz (High Frequency RFID) and has a readout distance of about 4 cm (1.5 inch) when used with the touchatag RFID tags. Internally it uses an ACS ACR122U reader with a SAM card. A Linux driver is readily available so when you plug it in lsusb you should get something like this:

1
2
3
4
lsusb 

Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 004: ID 072e:90dd Advanced Card Systems, Ltd

lsusb recognizes the device incorrectly but that’s not a problem. To read RFID-tags and respond to events additional software is needed: tagEventor is a software library that does just that. It can be downloaded using an svn command:


svn export http://tageventor.googlecode.com svn/trunk/ tageventor

To compile tagEventor a couple of other software packages or header files should be available on your system. Te tagEventor software dependencies are described on the tagEventor wiki. On Ubuntu (and possibly other Debian based distro’s the installation is simple:

1
2
3
sudo aptitude install build-essential libpcsclite-dev build-essential pcscd libccid
#if you need gnome support
#sudo aptitude install libgtk2.0-dev

Now the tricky part. Two header files of the pcsclite package need to be modified (update: this bug is fixed see here). tagEventor builds and can be installed:

1
2
3
4
5
6
7
cd tageventor
make
...
tagEventor BUILT (./bin/Release/tagEventor)

sudo ./install.sh
...

When tagEventor is correctly installed the only thing left is … to build your application. When an event is fired tagEventor executes the /etc/tageventor/generic script with three parameters (see below). Using some kind of IPC an application can react to events. A simple and flexible way to propagate events (inter-processes, over a network, platform and programming language independent) uses sockets. The code below is the /etc/tageventor/generic script (make sure it is executable), it communicates with the server: the second script. To run the server execute ruby /name/of/server.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/ruby

# $1 = SAM (unique ID of the SAM chip in the smart card reader if exists, "NoSAM" otherwise
# $2 = UID (unique ID of the tag, as later we may use wildcard naming)
# $3 = Event Type (IN for new tag placed on reader, OUT for tag removed from reader)

require 'socket'

data = ARGV.join('|')
puts data

streamSock = TCPSocket.new( "127.0.0.1", 20000 )
streamSock.send(data, 0)
streamSock.close
1
2
3
4
5
6
7
8
require "socket"  
dts = TCPServer.new('localhost', 20000) 
loop do  
   Thread.start(dts.accept) do |s|
     puts s.gets
     s.close  
   end  
end

The tagEventor software is made by the Autelic Association a Non-Profit association dedicated to making technology easier to use for all. I would like to thank Andrew Mackenzie, the founder and president of the association for creating the software and the support.

Touchatag hardware

Touchatag hardware

 

~ Jobsopschool

Ik heb in opdracht van scholengroep Sperregem een website gemaakt die het vinden van kandidaten voor korte vervangingen vlotter doet verlopen. Mensen met interesse voor een job in het onderwijs in de omgeving van Torhout, Kortrijk, Zedelgem kunnen zich er op inschrijven.

De website heeft enkele voordelen voor verschillende scholen in de scholengroep:

  • Het zoeken van kandidaten is erg eenvoudig: na het invoeren van een vacature komt er een lijst met kandidaten met een geschikt profiel die tijdens de vacature beschikbaar zijn.
  • Er kunnen e-mail of SMS-berichten verstuurd worden om kandidaten op de hoogte te brengen van een vacature.
  • Profielen van kandidaten zijn altijd up-to-date: de kandidaten zijn er zelf verantwoordelijk voor en kandidaten lange tijd niets van zich laten horen worden automatisch op non-actief gezet.
  • De historiek van kandidaten wordt automatisch bijgehouden en kan opgezocht worden.

Ook voor de aspirant onderwijzers is de website handig:

  • De vacatures zijn publiek zichtbaar, kandidaten kunnen dus actief solliciteren.
  • Ze kunnen zelf hun profiel beheren en bijvoorbeeld een vernieuwde versie van hun C.V. uploaden.
  • Voor elke kandidaat is een gepersonaliseerde lijst met vacatures beschikbaar (ook via RSS), afgestemd op hun profiel.

Daarnaast is het ook voor de personeelsdienst een handige tool: die kan nu een beter overzicht bewaren over de vacatures en de invulling ervan in de verschillende scholen.

Hieronder staan enkele screenshots.

Startpagina

Startpagina

Nieuwe vacature

Nieuwe vacature

 

~ Vooruit.be vernieuwd

Vooruit Logo

Vandaag is de vernieuwde vooruitwebsite gelanceerd:

We bieden je nog meer video’s, foto’s, audiotracks en tekstmateriaal en hebben ook jouw persoonlijke voordelen uitgebreid. Wanneer je lid wordt van www.vooruit.be, kan je nog steeds je kalender aanvullen, vrienden maken en reacties posten, maar daarnaast krijg je ook aanbevelingen op maat, kan je voorstellingen tippen en kan je berichten sturen naar vrienden *.

Het gepersonaliseerde aanbevelingssysteem is door Greet Dolvelde en mezelf in het kader van onze thesis: Collaborative Filtering: Onderzoek & implementatie [pdf] ontwikkeld. Dus waar wacht je nog op? Word lid, check de aanbevelingen bij concerten en vooral je gepersonaliseerde aanbevelingen.

Voor de iets minder enthousiaste doorklikkikkers staan hieronder wat screenshots van de verschillende soorten aanbevelingen op www.vooruit.be:

Gebruikersprofielpagina

Gebruikersprofielpagina

Aanbevolen evenementen

Aanbevolen evenementen

Buren

Buren

Aanbevolen artiesten

Aanbevolen artiesten

Evenementpagina

Evenementpagina

Aanbevelingen bij evenement

Aanbevelingen bij evenement

Gelijkaardigheid tussen gebruikers

Gelijkaardigheid tussen gebruikers

 

~ Verhuis naar VPS

VPS

Waarschijnlijk heb je het al gemerkt: deze site gaat nu heel wat sneller. Dit is te danken aan een verhuis. 0110.be wordt nu gehost op een VPS.

De virtuele server heeft Ubuntu 8.04 LTS Server als besturingssysteem en draait op een Xen hypervisor. De fysieke server zelf bevat een achttal Intel® Xeon® E5440 @ 2.83GHz CPU’s.

De server staat in Amsterdam en is rechtstreeks verbonden met het grootste internetknooppunt ter wereld: AMS-IX.

~ Halte-R vernieuwd

Ik heb een nieuwe, ditmaal dynamische, site gemaakt voor Halte-R. Als je er enkele bouwstenen van deze site er in ziet: dat is geen toeval het werkt op hetzelfde CMS.

halte-r.be

halte-r.be

CMS

CMS

 

~ SQL-bestand met een lijst van alle Belgische postcodes en steden

Logo de Post

Uit de lijst van postcodes van alle Belgische steden heb ik een SQL-bestand samengesteld. De gegevens bevatten de postcode zelf, de naam van de stad, de naam van de stad in hoofdletters en een veld “structure” waaruit de gemeente-deelgemeente relatie gehaald kan worden als er op gesorteerd wordt. Dit zijn bijvoorbeeld de deelgemeentes van Chimay.

6460   CHIMAY
6460        Bailièvre
6460        Robechies
6460        Saint-Remy (Ht.)
6460        Salles
6460        Villers-la-Tour
6461        Virelles
6462        Vaulx-lez-Chimay
6463        Lompret
6464        Baileux
6464        Bourlers
6464        Forges
6464        l'Escaillère
6464        Rièzes


Het sorteren kan in PostgreSQL met deze SQL instructie: order by translate(structure, ' ', 'z'). Het SQL-script zelf is een lijst van INSERT INTO SQL-Statements.

insert into cities(zipcode,name,up,structure)  VALUES ('1790','Affligem','AFFLIGEM','1790   AFFLIGEM');
insert into cities(zipcode,name,up,structure)  VALUES ('9051','Afsnee','AFSNEE','9051        Afsnee');
insert into cities(zipcode,name,up,structure)  VALUES ('5544','Agimont','AGIMONT','5544        Agimont');
...

Dit is het SQL-bestand met een lijst van alle Belgische postcodes en steden. Hopelijk is hier iemand ooit iets mee.

~ Query Tool

Vooruit Logo

While working at the Vooruit Arts Centre I got the assignment to create a tool to query an Oracle database with ticketing data. There were a few requirements for the Query Tool, in the current version all of these are met:

  • First of all it had to be easy to execute complex queries, no knowledge of SQL should be required for the end user.
  • The results of the queries should be exportable to an easy to analyse format. * Editing queries or adding new ones should be doable, by someone knowledgeable with SQL.
  • The Query Tool should be easy to configure and database independent.
  • Should work on Windows, Mac OS X and Linux.

By publishing the Query Tool on my website I hope that the fruits of my labour can be enjoyed by a wider audience. To see it in action you can give it a spin. A recent version, version 6, of the JRE is needed.

How Do I Use The Query Tool?

The program supports two ways to query a database:

  • A number of predefined queries can be selected and executed. Depending on the selected query, zero or more parameters are required. E.g. the screen shot below depicts a query with one parameter: a product category. When the query is executed all the products in the selected category are fetched.
  • The tab “SQL” can be used to execute arbitrary SQL-instructions.

The two buttons below are self explanatory. When the button “CVS Export” is hit a CVS file is created in a configured directory.

Depending on the complexity of a query it can take a long time before results are returned. Because the application is multithreaded the user interface remains responsive and the query can be stopped at any time.

The contents of the tab “log” gives you an idea what the application does. When something goes awry while executing a query a message appears in this tab.

The tab “Config” can be used to set configuration parameters. The tab “Help” contains… helpful information.

Screenshot

How Do I Add My Own Queries?

The list of predefined queries is constructed by iterating over SQL-files in a configured directory. Adding additional queries to the program is easy, just add an extra SQL-file to the directory. An SQL-file should have the following format, otherwise it is ignored:

TITEL
----
DESCRIPTION
----
SQL-INSTRUCTION with zero or more !{PARAMETERS}!

In the screen shot above this query is visible:

Select products in category
----
Select all the products in a category.
----
SELECT * FROM  
products WHERE categoryid = !{category}!  

To make the queries dynamic the Query Tool supports different kinds of parameters. A parameter has this form: !{type name}!, the name is optional. If there is a name specified it is used as a label in the interface, otherwise type is used. There are three types of parameters:

  1. Parameters that define a type. For each type a corresponding user interface is rendered. E.g. for the type string a text field is rendered. The supported types are:
    • !{string}!
    • !{boolean}!
    • !{double}!
    • !{date}!
    • !{integer}!
  2. Parameters for raw SQL. A textfield is rendered, the contents is directly injected in the SQL-query. It has this format: !{sql}!
  3. Parameters for lists. In the example above a list parameter is used. These lists are fetched from the database. E.g. a list of categories. The SQL-instruction and name of the list parameters can be configured.

If you want to use your own database you need to configure the database connection string. The program uses JDBC to connect to the database. It uses metadata provided by the JDBC layer. If your database has a JDBC driver with support for metadata the Query Tool will work correctly. The JDBC driver must be included in the classpath.

Credits

The Query Tool uses the famfamfam mini icons.

For demoing purposes the executable contains a lightweight hsql database. The data in the database is a modified version of the Microsoft Northwind database. The northwind hsql database is created with this SQL-script.

Downloads

  • ~ Hoeveelheid spam hangt af van eerste letter mailadres

    Volgens een onderzoek die enkele dagen geleden verscheen op o.a. de morgen en slashdot is er een verband tussen de eerste letter van een email-adres en de hoeveelheid spam er op terecht komt. Ik host mijn eigen mail server voor 0110.be en ik krijg heel wat spam. Als er een email verstuurd wordt naar een onbestaand email adres dan komt dit in een logbestand terecht:

    550 5.1.1 <abernathy@0110.be>: Recipient address rejected: User unknown in virtual mailbox table

    Aangezien er maar enkele @0110.be adressen in gebruik zijn kan met zo’n logbestand gekeken worden welke letters het meeste spam te verduren krijgen:

    spam letter frequentietabel

    De resultaten zijn dus nogal verrassend: enkel de adressen die starten met a,b,c en in mindere mate d worden gespammed. De rest nagenoeg niet. Mijn spammers zitten dus met een zeer beperkte namenlijst, of zijn het spammen beu na 3 letters. Misschien kunnen ze beter de namenlijst niet alfabetisch maar willekeurig overlopen. Met beter bedoel ik beter niet. Dit steekproefje, waarbij een week aan log files werden geanalyseerd, maakt duidelijk dat er bij 0110.be wel degelijk een verband is tussen de eerste letter en het aantal spam mails. Dit is het script dat gebruikt werd voor de analyse:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    frequencies = Hash.new
    ('a'..'z').each {|l| frequencies[l]=0}
    
    File.open("syslog", "r") do |infile|
      while (line = infile.gets)
        if(line =~ /.*<(.*)@0110.be>: Recipient address rejected.*/) then
          frequencies[$1[0,1]]=frequencies[$1[0,1]]+1
        end
      end
    end
    
    frequencies.sort.each{ |pair| puts "#{pair[0]};#{pair[1]}" }

    ~ Boids in Python

    Python Logo

    Na het bekijken van het onderstaande filmpje van een zwerm spreeuwen vroeg ik mij af of die bewegingen zich aan een bepaald algoritme houden en of ik een programma kon schrijven die dit gedrag simuleerde. Na wat onderzoek bleek dat zowat alle dieren die zich in kudde voortbewegen dit doen volgens gelijkaardige, relatief eenvoudige processen.



    Er zijn drie basisregels waaraan onder andere scholen vissen, zwermen vogels en kuddes gnoes zich houden:

    1. Voorkom botsingen met de dichtste buren door de andere kant op te gaan.
    2. Beweeg ongeveer in de zelfde richting en even snel als het gemiddelde van de buren.
    3. Beweeg naar het midden van de groep.

    De paper Flocks, Herds, and Schools:
    A Distributed Behavioral Model – 1987
    van Craig W. Reynolds was de eerste die deze regels formeel omschreef. Aan de hand van die documentatie en een praktische omschrijving kon ik aan een implementatie beginnen. De boids implementatie in Python gebruikt pygame om een groep creaturen voor te stellen met een gekleurd vierkantje. De creaturen bewegen zich volgens de drie bovenstaande regels. Daarnaast proberen ze om binnen het zichtbare kader te blijven en begeven ze zich naar het midden van het kader. Om de boel wat interactiever te maken wordt de muisaanwijzer gezien als een gevaarlijk roofdier die niets liever lust dan vierkantjes. De vierkantjes proberen de roof-muis dus te ontlopen. De zesde en laatste regel legt een maximum snelheid op, zodat de bewegingen realistisch blijven.

    De huidige implementatie is O(n²), terwijl het O(nk) zou moeten zijn, met k de grootte van de burenlijst. Een vloeiende simulatie van een zwerm van duizenden is dus momenteel niet mogelijk. De berekeningen voor een extra dimensie zijn erg eenvoudig te implementeren, helaas is de visualisatie van de resultaten dat niet. Ik heb geprobeerd om met de OpenGL bindingen voor Python te werken maar veel resultaat heeft dat niet opgeleverd. Dit is de 3D-versie, maar dan met een 2D visualsatie.

    Ik heb er voor het gemak ook een uitvoerbaar bestand voor Windows van gemaakt.

    ~ Vergelijking Ruby VMs

    Ruby Logo

    Ik heb een B-Tree en een Red-Black tree geschreven in Ruby. Om die datastructuren te testen heb ik een programma geschreven dat alle woorden uit een grote tekst inleest in een b-tree met het woord als sleutel en de frequentie als waarde en daarna een red black tree gebruikt als priority queue met als sleutel de frequentie en als waarde het woord. Op die manier kunnen de meest voorkomende woorden bepaald worden. De broncode is hier neer te laden.

    Het programma is een ideale test voor Ruby VM’s: het is redelijk intensief en gevarieerd. IronRuby, JRuby, Ruby 1.8 en Ruby 1.9 werden getest op een Intel Core 2 Duo E6660 en dit zijn de resultaten:

    VM Duur Geheugen VM details
    JRuby 28.79 sec 162MB jruby 1.1.3 (ruby 1.8.6 patchlevel 114) (2008-07-20 rev 7243) [x86-java]
    IronRuby 88.15 sec 195MB IronRuby 1.0.0.1 on .NET 2.0.50727.1433
    Ruby 1.8 104.1 sec 102MB ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
    Ruby 1.8 66.8 sec 96MB ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
    Ruby 1.9 33.42 sec 88MB ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-darwin9.2.0]

    De verschillen zijn dus erg groot. Zowel in geheugengebruik als in duur. Ruby 1.8 is blijkbaar erg traag maar gebruikt relatief weinig geheugen. JRuby is in deze test drie keer sneller maar gebruikt meer geheugen. Ook IronRuby is sneller dan de standaard Ruby VM maar gebruikt net niet het dubbele aan geheugen. Hierbij moet wel verteld worden dat IronRuby een alfa build is, de resultaten kunnen dus nog veel veranderen.

    Ruby 1.9 werd later getest op Mac OS X, met dezelfde pc. De nieuwe Ruby lijkt toch enkele beloften in te lossen. Ter vergelijking werd de voor Mac OS X geoptimaliseerde Ruby 1.8 VM die standaard met het besturingssysteem meegeleverd wordt ook nog getest.

    ~ Bash Script to Backup Remote Postgres Databases via Cron with Password Authentication

    PostgreSQL Logo

    I have modified a bash-script to backup PostgreSQL databases, this is the original script. The modified version can be used to backup databases on a remote or local database server. Also this script does not need a trust relationship but uses a login and password. To get started you need to:

    1. Modify the directory and database variables to suit your needs.
    2. Add an entry to crontab to perform the backups nightly or whenever you wish.
    3. Have fun.

    The script empties ~/.pgpass and writes login info for the system databases. Then it logs in and fetches an up-to-date list of databases. For every database an entry is made in ~/.pgpass and every database is backed up. The results are logged to $logfile.

    ~ Collaborative Filtering: Onderzoek & implementatie

    Vooruit Logo

    Gisteren werd de laatste hand gelegd aan de thesis over collaborative filtering (CF) waar Greet Dolvelde en ikzelf een jaar mee bezig zijn geweest. Als je hier meer over wilt weten dan kan je het werk Collaborative Filtering: Onderzoek & implementatie [pdf] downloaden. De intiemste details van verschillende CF-benaderingen worden er in geuren en kleuren uit de doeken gedaan. Uit de poster zou moeten duidelijk zijn waarover de thesis eigenlijk gaat:

    Poster Collaborative filtering: onderzoek & implementatie

    De poster is ook verkrijgbaar in pdf-formaat.

    ~ Genetisch algoritme in Python

    Python Logo

    Maandag heb ik een examen over A.I. Dat gaat onder ander over genetische algoritmen. Om dat principe in werking te zien heb ik een eenvoudig programmatje geschreven in Python: er zitten enkele beestjes (vierkantjes) in een omgeving. Als de beestjes opvallen, witte beestjes zie je goed zitten op een zwarte achtergrond, worden ze verslonden. De beestjes die minder opvallen overleven, muteren of planten zich voort. Overlevenden gaan een generatie langer mee. Bij het muteren verandert de huidskleur willekeurig. Bij voortplanten wordt er een kind gemaakt die het gemiddelde van de huidskleuren van zijn ouders als kleur heeft. Als het meerendeel van de beestjes uiteindelijk een goeie schutkleur aangenomen hebben kan de achtergrond veranderd worden en begint alles van voor af aan.

    Screenshot genetisch algoritme.

    Dit is de broncode van het programma, het werkt enkel met grijswaarden. Er is ook een uitvoerbaar bestand voor Windows. De .exe is gemaakt met PyInstaller. De achtergrondkleur kan veranderd worden door er op te klikken. Dit is broncode van de versie met kleur.

    ~ Text To Speech Recognition

    Python Logo

    Om Python wat te leren kennen heb ik een “Text To Speech Recognition” programma geschreven. Het roept SAPI 5.1 aan om een tekst voor te laten lezen door Microsoft Sam. Het voorgelezen stuk tekst wordt daarna meteen via microfoon opgenomen en Sam probeert het zelf, via Speech Recognition, te verstaan. Het resultaat van de speech recognition wordt dan gelezen door Sam enzovoort… Dit is een voorbeeld van Sam in dialoog met zichzelf:

    I am sitting in a room different from the one you are in now. I am recording the sound of my speaking voice and I am going to play it back into the room again.

    I’m sitting in a room different from the one U.N. NA I’m recording the sound of my speak English and I’m going to play it back into the room against

    I’m sitting in a room different from the one you could in a LAN recording the sound of my speak English and I’m going to clamp back into the room against

    I’m sitting in a room different from the one you put in a LAN recording the sound and I speak English and I’m going to clamp back into the room against

    I’m sitting in a room different from the one you put in a LAN recording the sound and I speak a Mac into ghent

    I’m sitting in a room different from the one you put in a LAN recording the sound and I speak a match into ghent

    De broncode is hier te vinden.

    ~ TED - Ideas Worth Spreading

    TED Logo

    Ik heb onlangs de website ted.com ontdekt. Op die site kan je lezingen beluisteren en bekijken. Dit klinkt behoorlijk saai maar het tegendeel is waar. De lezingen behandelen een heel breed spectrum aan onderwerpen, voor iedereen is er wel iets interessants te vinden. Elke lezing wordt gehouden door iemand die aan de top van zijn vakgebied staat en de lezingen zijn ook niet langdradig. Ze duren maximaal twintig minuten, te kort om te vervelen. Hieronder staat een lijstje met de beste lezingen die ik gezien heb:

    ~ Stage bij kunstencentrum Vooruit

    Vooruit Logo

    Kunstencentrum Vooruit heeft sinds kort een nieuwe site opgericht. Aan de site is een community luik gekoppeld waarop gebruikers een profiel kunnen aanmaken en evenementen op een persoonlijke wishlist kunnen plaatsen. Daarnaast kunnen ze er ook tickets voor voorstellingen kopen. Ook kunnen de gebruikers relaties tussen zichzelf en vrienden leggen.

    Aan de hand van die gegevens en de gegevens van in het back-office systeem zou het mogelijk moeten zijn om een cultureel profiel op te stellen van de gebruikers en ze gepersonaliseerde, relevante tips geven. De voordelen van zo’n Customer Intelligence systeem zijn legio:

    • Kunstencentrum Vooruit leert zijn klanten beter kennen
    • De klanten krijgen gepersonaliseerde tips en hierdoor wordt hun culturele interesse geprikkeld
    • Trends kunnen makkelijker ontdekt worden
    • Er kan gerichter reclame gevoerd worden

    En dat C.I. systeem gaan wij volgend jaar ontwikkelen. Er zal een uitgebreid onderzoek gebeuren naar de manier waarop en daarna wordt een implementatie gekoppeld met de in Ruby on Rails ontwikkelde website.

    ~ Sorteeralgoritmes in c++

    Voor het vak algoritmen hebben we enkele sorteeralgoritmes besproken en in c++ geïmplementeerd. Dit is mijn versie van de algoritmes het gebruikt een interface SortAlgorithm en het Strategy design pattern om zijn werk te doen.

    Sorteer algoritmes en het Strategy design pattern

    In principe kan om het even wat gesorteerd worden maar sommige sorteeralgoritmes (Counting Sort) werken enkel met int’s. Om strings te sorteren kan gebruik gemaakt worden van de Nstring klasse.

    Elk sorteeralgoritme kan getest en gemeten worden, dit is de uitvoor voor het shell sort algoritme met de Sedgewick incrementen:

    
    Measuring sorting algorithm: Shell Sort: Sedgewick increments
                                Random           Sorted         Reversed
                  128                0                0                0
                  230                0                0                0
                  414                0                0                0
                  745                0                0                0
                 1341                0                0                0
                 2413                0                0                0
                 4343                0                0                0
                 7817                0                0                0
                14070             0.01                0                0
                25326             0.01                0             0.01
                45586             0.01             0.01             0.01
                82054             0.03             0.01             0.02
               147697             0.07             0.02             0.03
               265854             0.12             0.05             0.06
               478537             0.22             0.09             0.12
               861366             0.44             0.15             0.22
    
    

    Hier kan de code gedownload worden: download. Niet alle algoritmes werken even goed dit is een lijst van werkende algoritmes die het wel doen:

    • Heap sort
    • Selection sort
    • Insertion sort
    • Counting sort (enkel met int’s)
    • Quicksort
    • Shell sort met
      • Sedgewick incrementen
      • Twee incrementen
      • veelvouden van drie als incrementen

    ~ Vakantiejob bij Encima

    Ik werk momenteel bij Encima. Encima maakt websites en andere toepassingen in Java. Mijn eerste week zit er al op en ik heb me bezig gehouden met een module voor www.weekendesk.com. Maandag wordt de module, samen met de nieuwe versie van de site, in gebruik genomen. Weekenddesk doet het volgende:

    Weekendesk.com is een B2C e-commerce site die weekend- en dagtrips on line verkoopt en zich hierbij in eerste instantie op de Belgische en Nederlandse markt richt. Weekendesk fungeert hierbij als tussenpersoon tussen de consument en de organisator van de vrijetijdsactiviteit. De website biedt de klant op een frisse en overzichtelijke manier alle nodige informatie over de vrijetijdsactiviteiten.
    De activiteiten zijn onderverdeeld in twee types: cadeaubonnen en weekendideeën. De prijs en beschikbaarheid van elke activiteit is steeds up-to-date. On line boeken is snel, eenvoudig en veilig. Betalen kan via creditcard of per overschrijving.
    Via een on line content management module kan Weekendesk alle activiteiten en de gerelateerde informatie (beschrijving, fotoboek, prijzen, beschikbaarheid, promotie, ...) beheren. Een order management module laat hen toe de bestellingen on line op te volgen.
    Ook de leveranciers (organisatoren) van de activiteiten kunnen via een private on line module de beschikbaarheid, prijzen en promoties inbrengen.
    En net die module voor de leveranciers, organisatoren (meestal hotels) heb ik in elkaar gestoken.

    ~ Vakantie, Övning.nu

    Vanmiddag hielden we, ik en Mel, onze presentatie van Övning.nu. Alles verliep goed. Nu is het ook veilig om ons stageverslag op deze website te plaatsten. Bij deze: het rapport in pdf en de presentatie in pdf.

    ~ Google summer of code application

    niet stereo

    Ik heb gesolliciteerd om mee te doen aan de google summer of code 2006. Ik had me ingeschreven om te helpen aan een c# bittorent library en monodevelop, de IDE van Mono. Mono is een open source .Net omgeving. Dit is de officiële reactie die ik daarop kreeg:

    Dear Applicant,

    First of all, Google and the open source organizations taking part in the Summer of Code would like to thank for applying to take part in this year's Summer of Code. Unfortunately, your application was no tone of those selected to take part in this year's program. Universally,the quality of the submitted applications was very high, but we had a limited number of slots available. This often difficult decision was made by the organization you applied to, so any questions regarding application selection should be directed at them.

    We hope you'll consider applying next year.

    Some of you may have received an email with incorrect text stating that one of your applications was accepted. For this, we are deeply sorry for the confusion.

    Kind regards,The Summer of Code Program Administration Team

    Volgend jaar beter dus.

    ~ C.O.A.L.A: The Code Observing and Analyzing Learning Application

    een coala

    Voor BIT4, een cursus die Mel en ik hier volgen, hebben we een edutainment applicatie gemaakt. Het is gemaakt in Flash 8. De bedoeling is dat je zo snel en correct mogelijk stukjes code verwerkt. Je krijgt 15 punten bij een goed antwoord plus het aantal overblijvende seconden, bij een verkeerde gok gaan er 10 punten af dus gok niet te veel. Speel het hier!

    ~ Het weer in Zweden, game critique & project

    Het is hier al een week te warm om te werken. Ik ben de laatste dagen enkele keren gaan zwemmen in de zee, ja die zee die een goeie maand geleden nog bevroren was. Momenteel zit ik op het balkon te bakken, het is hier 32° volgens een schatting van Mel. Na een officiële meting bleek deze schatting correct. Tot op de milligraad correct. En ja ma ik heb zonnebrandolie aangedaan. Om deze post toch wat inhoud te geven: ik heb een game critique geschreven over Starcraft. Read all 'bout it:


    Ohja over ons werk deze morgen hadden we een meeting en Torben, onze mentor, was tevreden. Hij beloofde een nice grade en een USB harde schijf voor de geleverde inspanningen happy ([8)]).

    ~ Övning.nu

    Ik heb een recente versie van ons project op de server geplaatst. Het is beschikbaar op http://www.ovning.nu. Het grootste deel van de functionaliteit is aanwezig maar het is nog helemaal niet afgewerkt.

    Je er kan ofwel een nieuwe organisatie registeren en een war game organizeren ofwel kan je meteen inloggen met de gebruikersnaam "joren" en het paswoord "joren" wink ([;)]). Voor de geïnteresseerden dit is de documentatie van het domain en van de data laag.

    ~ Wat we in Halmstad doen

    Halmstad University

    Mel en ik zijn bezig aan een systeem om war games te ondersteunen. War games zijn grootschalige ramp-oefeningen.

    Bijvoorbeeld een aanval van terroristen op een kerncentrale. Er wordt een bepaald scenario opgesteld: terroristen gijzelen werknemers en dreigen de boel op te blazen. Er wordt op deze situatie gereageerd door iedereen die daar in het echt ook mee zou te maken hebben: politie, swat teams, er worden fake nieuwsberichten gemaakt door de media, de werknemers van de centrale zelf,....
    Tijdens die simulatie wordt adhv vragenlijsten gepolst hoe goed (of slecht) alles verloopt. Die vragenlijsten komen op een beveiligde website die wij aan het programmeren zijn. Die data is dan de basis voor een rapport met de bevindingen: wat verliep er goed en wat kan beter.

    We gebruiken het ASP.NET 2.0 platform in samenwerking met een sql express 2005 database én een object database: db4o. Daarmee zijn we aan het experimenteren. Daarbij horen unit tests en load tests. Daaruit blijkt dat Db4o zijn beloftes waar maakt:

    Embed db4o's native Java and .NET open source object database engine into your product and store even the most complex object structures with only one line of code. db4o slashes development cost and time, provides superior performance, and requires no DBA.

    blijkbaar zijn we verplicht een access database te gebruiken, hoe 1994, zucht.

    ~ Certified!

    Deze ochtend heb ik in Roeselare via prometric.com en syntra een examen gedaan en wel deze:

    Developing and Implementing Web Applications with Microsoft Visual C# .NET and Microsoft Visual Studio.NET

    Ik ben ervoor geslaagd dus ben ik nu een "MCP".
    Ik heb nu een brevet voor:
    • Drie minuten watertrappelen
    • 25m zwemmen
    • Developing and Implementing Web Applications with Microsoft Visual C# .NET and Microsoft Visual Studio.NET

    ~ Over 0110.be

    Hieronder staat kort het doel van deze website, wat je er van mag verwachten en vooral wat je er zeker niet mag van mag verwachten. Ook wordt kort de geschiedenis van 0110.be aangehaald.

    0110 concerten

    Het domain 0110.be werd tijdelijk gebruikt om reclame te maken voor een reeks van concerten voor verdraagzaamheid.

    Wat is 0110.be

    0110.be is mijn digitale nest, hier kan ik experimenteren met allerlei internettechnologieën. Het is mijn speelplaats, waarmee ik databases, frameworks, programmeertalen, … test. Het is pas in de tweede plaats een blog, dus verwacht niet te veel van de inhoud. Wie ik ben kan je lezen in over Joren Six.

    Waarom 0110.be

    0110 is het getal 6 in een nibble (een halve byte). En zes verwijst dan weer naar mijn achternaam.
    0110 is ook het begin van een merkwaardige wiskundige reeks. De 0110 reeks bestaat uit een bit gevolgd door zijn omgekeerde:

    • 0
    • 0 1
    • 01 10
    • 0110 1001
    • 01101001 10010110
    • 0110100110010110 1001011001101001
    • 01101001100101101001011001101001 10010110011010010110100110010110

    Dit getal is gekend als de Thue-Morse Sequence, het is naast irrationeel ook bewezen dat het net als π transcendentaal is. Ik wist dit ook niet totdat ik dit las wink ([;)]).

    Technologie

    De website is geschreven in de taal Ruby met het
    Ruby on Rails framework.
    Als database gebruik het PostgreSQL 8.3. Het wordt gehost op een virtuele Ubuntu 8.04 server gehost bij xlshosting. De paginas worden geserveerd via FCGI door lighttpd .

    Het is ontwikkeld met een IDE die gebaseerd is op eclipse: aptana. De website wordt automatisch op de server gedeployed met capistrano.

    ~ Email-adressen checken met Regular Expressions

    Dit is een aanvulling op dit artikel. Daar wordt deze RegEx gebruikt: "(?[^@]+)@(?.+)" wat vreemd is omdat deze check ook "bar@foo" ziet als een geldig email-adres. Wat in mijn ogen niet het geval is.

    Onderstaande code haalt e-mail adressen uit een met een puntcomma gescheiden lijst en controleert daarna of het geldige e-mail adressen zijn:



    using System;
    using System.Text.RegularExpressions;


    ///
    /// Checkt Email adressen
    ///
    class EmailChecker
    {
    [STAThread]
    static void Main(string[] args)
    {
    string emailAdressen="jorensix@msn.com;bla@blaat.com;bla@blasdf;dfmlkqjf;test@pi.be";

    Regex emailregex = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");

    string[] adressen=emailAdressen.Split(';');

    Match m;

    foreach(string adres in adressen)
    {
    m = emailregex.Match(adres);
    if(!m.Success)
    Console.WriteLine("{0} is ongeldig",adres);
    else
    Console.WriteLine("{0} is geldig",adres);
    }
    Console.ReadLine();
    }
    }


    Dit is dan wat er uit komt:

    jorensix@msn.com is geldig
    bla@blaat.com is geldig
    bla@blasdf is ongeldig
    dfmlkqjf is ongeldig
    test@pi.be is geldig

    ~ FolderRenamer in c#

    Ik heb een prog gemaak om mappen een nieuwe naam te geven. De mapnaam kan veranderd worden in Pascal Case, UPPERCASE of lowercase:



    het maakt een logfile van de aangebrachte veranderingen die er zo uit ziet:

    code:
    1
    2
    3
    Map:               D:\een map
    Hernoemd naar: D:\Een Map
    Tijdstip: 6/06/2004 @ 20:49:00

    Het vs.net project in een zip.

    Het is geschreven in c#. Het werkt niet met mappen waarin bestanden staan die in gebruik zijn of systeemmappen zoals de prullenbak.

    disclaimer: gebruik op eigen risico! Bij mij is alles goed gegaan maar dat is geen garantie dat bij jou ook alles goed gaat!

    ~ Boekingssysteem

    Wat?

    Voor de projectwerking in het eerste jaar Toegepaste Informatica kregen we de keuze uit 4 opdrachten. We hebben gekozen voor het boekingssysteem, omdat we vinden dat we met deze opdracht het meest zouden leren (denk bijvoorbeeld aan de integratie van een database, die bij sommige andere projecten niet aanwezig is). Ook gingen we er van uit dat we bij deze opdracht de meeste mogelijkheden hadden tot uitbreiden, en implementeren van eigen ideeën.

    De volgende alinea is een korte omschrijving van de opdracht die we kregen.

    In een complex zijn verschillende zalen waar film-, theater- en concertvoorstellingen kunnen plaatsvinden. De klant (Nederlands-, Frans- of Engelstalig) moet een aantal stoelen kunnen reserveren voor één van deze voorstellingen. Daartoe moet het mogelijk zijn om een alfabetische lijst van de evenementen die op een bepaalde dag plaatsvinden of van alle evenementen te raadplegen. Het is ook mogelijk de evenementen per type op te vragen (film, theater of concert).

    Screenshots:

    Dit is in het engels omdat we een engelstalige website moesten maken en ik geen zin heb om nieuwe screenschots te maken. Dus ik heb die gecopy-pased

    Language choice




    This is the first frame of our application. In this frame the user has to choose a language before he can continue. After the user has done this, the second frame shows up:

    Choose show





    In this frame the user has to select a manner to order the shows. (by date or by kind of show). In the dropdown box, she or he can select the correct date or what kind of show she/he wants to be listed. (concert, film, play, ect.) In this frame the user has to select a manner to order the shows. (by date or by kind of show). In the dropdown box, she/he can select the correct date or what kind of show she/he wants to be listed. (concert, film, play, ect.)

    Choose costumer





    The user has to type in her or his name, press enter and then choose her/his name from the dropdown list. When her/his name isn’t in the list yet, there has to be made a new customer. Which can be done in the following frame:




    Reservation





    In this screen the user chooses her or his seats. The gray buttons are available seats. The seats in dark gray are occupied. The green seats are the ones the user has just chosen.

    Type of Ticket





    Dans cette fenêtre vous choississez le sorte du ticket: un ticket pour des enfants, des étudiants, des groupes,...

    Summary





    The last frame is an overview of your reservation. With prices, your seat-numbers, practical information, and so on. On this screen the user confirms her or his booking.

    Werking:

    Het programa is uit verschillende lagen opgebouwd, die zitten elk in een package:



    < Default >

    BoekingsSysteem

    GUI

    BL

    ErrorHandling

    Dal

    Downloads:

    ~ Verveldende Windows Bug

    Vanavond ben ik op een vreemde windows bug gestoten: Ik heb een programma een map laten maken met als mapnaam iets met twee puntjes erin. Dus bvb "D:\test..\". Allemaal goed en wel tot je er tracht in te geraken via explorer. Dan krijg je namelijk deze error:



    Owkeey dus deleten?


    Dat gaat dus ook niet.

    DOS proberen? Daar krijg ik ongeveer dezelfde error: "The System cannot find the path specified". Ook deleten gaat niet in DOS.

    Verklaring: ".." wordt gebruikt om de bovenligende map aan te duiden. Windows en dos weten dus niet goed wat te doen met een map met als mapnaam iets met ".." erin. Je zou je kunnen afvragen waarom het dan mogelijk is een map te maken met ".." in de mapnaam. En waarom het mogelijk is er nog data in te schrijven ook (via een programma). In de map "D:\test..\" staat hier nu meer dan een gigabyte. Die ik dus niet kan verwijderen zonder mijn harde schijf te formatteren.

    *zucht*

    ~ Boekingsysteem bijna af

    Als soort van eerstejaars-eindwerk-iets moeten wij (ik & Pieter Van Leuven (http://pietervanleuven.be)) een boekingsysteem schrijven. Dus iets om tickets (en dus ook stoelen) te reserveren voor bvb een film, een theatervoorstelling, een concert, ...

    Dit is een verkorte versie van de opdracht:

    Boekingssysteem

    Doel: boekingen / reservaties in een zaal beheren

    In een complex zijn verschillende zalen waar film-, theater- en concertvoorstellingen kunnen plaatsvinden. De klant (Nederlands-, Frans- of Engelstalig) moet een aantal stoelen kunnen reserveren voor één van deze voorstellingen. Daartoe moet het mogelijk zijn om een alfabetische lijst van de evenementen die op een bepaalde dag plaatsvinden of van alle evenementen te raadplegen. Het is ook mogelijk de evenementen per type op te vragen (film, theater of concert

    En daar zijn we bijna mee klaar. Nadat we het moeten indienen komt de java broncode hier. Nu is het nog iets te gevaarlijk. Er zijn er namelijk nog die dit project doen...

    Dit is het werk van deze namiddag (rood = bezet, groen is de door de gebruiker gekozen stoelen):

    ~ ASP.NET: dynamische datagrid in usercontrol

    Voorkennis:

    • Basiskennis van VB.NET;
    • Notie van events in .NET;
    • Basiskennis van Visual Studio.NET;
    • Weten hoe je, met behulp van Visual Studio, een ASP.NET project maakt.

    Inleiding:

    Hieronder staat een beschrijving hoe je in een usercontrol een datagrid kunt creëren waarvan het aantal kolommen afhangt van een of meerdere variabelen.

    Het probleem situeert zich in het doorgeven van die variabelen aan een usercontrol. Met propory's (attributen) kun je niet werken om dat die nog niet geinitialiseert zijn in de Page_Init methode. In deze methode worden de kolommen aan de datagrid toegevoegd.

    Als je dan nog eens afhankelijk van die variabelen verschillende commands met je datagrid wil uitvoeren (SortCommand, UpdateCommand, EditCommand,...) of net niet dan is het niet mogelijk om met de designer van visual studio te werken.

    Werkwijze

    1. Voeg een nieuwe usercontrol toe aan je asp.net project. Mijn usercontrol heet rekeningControl2.
    2. Verwijder alle code in de codebehind file, in mijn geval rekeningControl2.vb. Ik hield alleen dit over:
      Public Class rekeningControl2
      Inherits System.Web.UI.UserControl
      End Class
    3. Declareer je attributen en maak de constructor(s):
      #Region " Attributen"
      Private datum As DateTime
      Private klasNummer As Integer
      Private isBeveiligd As Boolean
      Private dataGridRekening As DataGrid
      #End Region
      #Region " Constructors"
      Public Sub New(ByVal datum As DateTime, ByVal klasNummer As Int16, ByVal isBeveiligd As Boolean)
      Me.datum = datum
      Me.klasNummer = klasNummer
      Me.isBeveiligd = isBeveiligd
      End Sub
      Public Sub New(ByVal datum As DateTime, ByVal klasNummer As Integer)
      Me.new(datum, klasNummer, True)
      End Sub
      #End Region
    4. Maak een Page_Init methode die de methode om de datagrid te initialiseren oproept. In de datagrid_Init() methode worden de kolomen toegevoegd.
      Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Init
      DataGrid_Init()
      End Sub
      Private Sub DataGrid_Init()
      dataGridRekening = New DataGrid
      dataGridRekening.AutoGenerateColumns = False

      Dim DataGridRekeningDataTable As DataTable = 'haalt datasource op

      AddHandler dataGridRekening.UpdateCommand, AddressOf Me.HandleUpdateCommand
      AddHandler dataGridRekening.CancelCommand, AddressOf Me.HandleCancelCommand
      AddHandler dataGridRekening.EditCommand, AddressOf Me.HandleEditCommand

      Dim editCol As New EditCommandColumn
      editCol.HeaderText = "Opdrachten"
      editCol.FooterText = editCol.HeaderText
      editCol.EditText = "Veranderen"
      editCol.CancelText = "Annuleren"
      editCol.UpdateText = "Update"
      editCol.ButtonType = ButtonColumnType.LinkButton
      editCol.ItemStyle.HorizontalAlign = HorizontalAlign.Center
      editCol.HeaderStyle.HorizontalAlign = HorizontalAlign.Center
      dataGridRekening.Columns.Add(editCol)

      If isBeveiligd = False Then
      editCol.Visible = False
      End If

      For Each kolom As DataColumn In DataGridRekeningDataTable.Columns
      Dim Col As BoundColumn = New BoundColumn
      Col.DataField = kolom.ColumnName
      Col.HeaderText = kolom.ColumnName
      Col.FooterText = kolom.ColumnName
      Col.ReadOnly = True
      dataGridRekening.Columns.Add(Col)
      Next

      Me.Controls.Add(dataGridRekening)

    Resultaat

    Een makkelijk herbruikbaar component, als je de events op deze manier doorgeeft aan de aspx pagina.

    ~ Website broncode

    Hier staat de broncode van deze website.
    Het is een Visual Studio.net 2003 project, er zit een database create script in.Het heeft de volgende eigenschappen/kenmerken:
    • Een dynamische layout door het gebruik van css.
    • Door het gebruik van een rich textbox is deze site volledig te onderhouden zonder enige kennis van HTML.
    • Door het gebruik van forms authentication en een role based security model is deze site redelijk schaalbaar, er kunnen makkelijk moderators, nieuwsposters, admins,.. toegevoegd worden.
    • Er zit een filmdatabase in die alleen voor de gebruikers met bepaalde rechten zichtbaar is.
    • Er kan een poll gepost worden, die kan ook aangepast worden.
    • Er wordt een rss-feed gemaakt van de nieuwsberichten.
    Hieronder staat een screenshot van de textbox die alleen voor nieuwsposters toegankelijk is:



    Alle code is beschikbaar onder een creative commons licentie.

    ~ De RSS-feed is er

    Er staat nu een link naar een RSS feed, zoals gisteren aangekondigd, onderaan deze pagina . Het is nog niet volledig valid RSS 2.0 omdat er nog ergens een script tag in de nieuwsberichten zit.

    Wat Is RSS?

    Om maar eens blogs.law.harvard.edu/tech/rss te quoten:

    RSS is a Web content syndication format.

    Its name is an acronym for
    Really Simple Syndication.

    RSS is a dialect of XML. All RSS files must conform to the XML 1.0 specification, as published on the World Wide Web Consortium (W3C) website.

    At the top level, a RSS document is a element, with a mandatory attribute called version, that specifies the version of RSS that the document conforms to. If it conforms to this specification, the version attribute must be 2.0.

    Subordinate to the element is a single element, which contains information about the channel (metadata) and its contents.RSS is a Web content syndication format.

    Wat Kan ik ermee?

    Je kan er makkelijker de updates of veranderingen mee volgen van alle sites met RSS feeds

    ~ Nieuwe versie six.servebeer.com

    Ik heb zopas een nieuwe versie van deze site op de server geplaatst dit is er veranderd :

    • Het comentaar wordt nu niet meer in een tabel gerenderd. Maar in mooiere (X)HTML.
    • Het is onmogelijk dat het klikken op "willekeurig Artikel" een runtimefout veroorzaakt.
    • De cssfiles worden nu willekeurig uit een map gekozen, als ik in die map een css-file bijplaats dan wordt die ook af en toe gekozen.
    Wat er op korte/middellange termijn nog moet bijkomen:

    • Een zoek functie waarmee je kunt zoeken , zoals met de meeste zoekfuncties eigenlijk;
    • Een smilie parser voor het commentaar;
    • Een poll systeem; (zie commentaar )
    • Een RSS feed voor de artikels. (zie commentaar )

    ~ Towers of hanoi

    Een zekere Amit Singh heeft in 108 verschillende programmeertalen het "Towers of hanoi" porbleem opgelost. Op zijn website vind je er meer info over. Hieronder volgt een beschrijving van het probleem:

    Problem Definition

    Francoise Edouard Anatole Lucas

    The object of the problem is to move all the disks over to the rightmost tower, one at a time, so that they end up in the original order on that tower. You may use the middle tower as temporary storage, but at no time during the transfer should a larger disk be on top of a smaller one.

    The puzzle was invented by a Frenchman called Francoise Edouard Anatole Lucas (1842 - 1891), although many "legends" (like the one below) are often mentioned regarding the puzzle. The puzzle appeared in 1883 under the name of M. Claus. Notice that Claus is an anagram of Lucas! Lucas' four volume work on recreational mathematics is a classic.

    A bit of "history" about the puzzle can be found in the hanoi.el LISP file in the GNU Emacs distribution. Quoting verbatim from there:

    The puzzle is called "Towers of Hanoi" because an early popular presentation wove a fanciful legend around it. According to this myth (uttered long before the Vietnam War), there is a Buddhist monastery at Hanoi which contains a large room with three time-worn posts in it surrounded by 21 golden discs. Monks, acting out the command of an ancient prophecy, have been moving these disks, in accordance with the rules of the puzzle, once every day since the monastery was founded over a thousand years ago. They are said to believe that when the last move of the puzzle is completed, the world will end in a clap of thunder. Fortunately, they are nowhere even close to being done.

    There is a similar "myth" about similar towers in the Hindu city of Benaras in India.

    Een voorbeeldje in c# maakt alles duidelijk. Nog een quote uit zijn FAQ:

    I feel sorry for you - you must have no life.

    I appreciate the sympathy. I have quite a decent life though :)

    I feel sorry for you - you must have no sex life.

    I am happily married. Very happily.


    ~ Windows 1.0

    Donderdag installeerde ik windows 1.0 Vraag niet waarom.

    First things first: in dos 3.21 geraken (met een opstartdisketje van 720 KB):



    Daarna fdisken, windows diskette 1 erin en setup.exe uitvoeren:



    Invoerapparaat kiezen (werkte helaas niet )









    Het grote moment is aangebroken hier zie je de calendar al bij al niet veel veranderdt. Ook het windows-blauw heeft sinds 1987 nog niet veel verandering gekend. Merk ook op dat zelfs windows 1.0 geen last heeft van de Y2K bug!



    Ook aan paint is er niet veel veranderd



    Na nog wat er mee gespeeld te hebben ben ik het gestopt:



    En dit alles zonder BSOD (Blue Screen Of Death). Ik wil terug naar windows 1.

    ~ Image resize script

    Ik heb een image resize script geschreven voornamelijk voor mezelf: ik ben het beu om alle foto's manueel te resizen. Maar om dat dit ook handig zou kunnen zijn voor andere mensen dacht ik ik zet het op het grote boze internet.

    Dit is het.

    Hieronder kun je het ook testen:




    de huidige versie is: 1.0.1261.33053

    het script heeft de volgende eigenschappen:
    • Het kan procentueel het beeld verkleinen
    • Als je de gewenste breedte invoert wordt de hoogte automatisch berekend
    • je kunt de kwaliteit van de figuur(dus de grootte) aanpassen
    • beperking: het werkt alleen met jpg files
    • volledig failsave, foolproof en narrensecher
    • 100% compatibel met mozilla en waarschijnlijk ook met alle andere browsers die javascript ondersteunen.
    • Er worden mooie userfriendly errors getoont.


    wat er nog aan moet gebeuren:
    • De figuuren automatisch verwijderen na een bepaalde tijd
    • Support voor png
    • De hoogte instellen en de breedte laten berekenen


    De broncode voor versie 1.0.1261.33053 staat hier

    ~ Eindwerk over AM-FM Radio is af!

    Gemoduleerde golf met modulatiediepte 100

    Het Eindwerk over AM-FM radio in PDF formaat. Hieronder volgt de inleiding, om een idee te geven waarover het eigenlijk gaat:

    De radio heeft in de 1ste helft van de twintigste eeuw de wereld totaal veroverd en op vele gebieden sterk veranderd. Dag na dag en in alle delen van de wereld luisteren mensen naar de radio en dag na dag zijn miljoenen radio’s in bedrijf. Het is een niet te verslaan medium geworden om snel informatie door te geven. Daarom vroegen wij ons af hoe zo’n radio nu juist werkt. Het lijkt ons een uitdaging om dit zo gestructureerd en duidelijk mogelijk uit te leggen.


    In de aanvang van ons project zijn we eerst op zoek gegaan naar informatie over het verschijnsel elektromagnetische golven, omdat geluid bij de radio via deze golven wordt overgedragen. Daarna zijn we gaan kijken hoe je een geluidssignaal via die elektromagnetische golven kunt verzenden. Men maakt de omzetting van geluid naar elektromagnetische golf met modulatie. Met demodulatie kan je het omgekeerde doen. Dit moduleren en demoduleren proberen we wiskundig én elektronisch te verklaren. Ook gaan we dit via labo metingen deze theorie in praktijk brengen.

    Hopelijk heeft iemand hier ooit nog eens iets aan.

    ~ Softwarematig Raid-0

    Ik heb me vandaag geamuseerd met het opzetten van een softwarematige raid-0 ofwel stripping configuratie:


      RAID 0: Striped Disk Array without Fault Tolerance




      Characteristics/Advantages

      RAID 0 implements a striped disk array, the data is broken down into blocks and each block is written to a separate disk drive

      I/O performance is greatly improved by spreading the I/O load across many channels and drives

      Best performance is achieved when data is striped across multiple controllers with only one drive per controller

      No parity calculation overhead is involved

      Very simple design

      Easy to implement


      Disadvantages

      Not a "True" RAID because it is NOT fault-tolerant

      The failure of just one drive will result in all data in an array being lost

      Should never be used in mission critical environments


    Bron:http://www.acnc.com/04_01_00.html

    Daar deze site wel een "mission critical environment" is maak ik nog een shadow copy van deze 2*2gig grote disk. Mijn configuratie ziet er dan ongeveer zo uit:



    op de geraid-0'de g: staat deze site en de mssql database voor deze site
    op de c: de windows install
    op de h: een paar programma's
    op de f: een shadow copy van de g:

    ~ MSSQL en veiligheid

    Ik had gisteren problemen met mijn database: hij bleef paketjes verzenden zonder dat ik dat wilde daardoor kon ik niets downloaden. Eerst had ik dat niet door, zocht ik naar verkeerde netwerkinstellingen en andere mogelijke oorzaken (moeder, broers, ...)Maar vond niets. Toen ik toch een minuut of twee op internet geraakte vond ik dit:


      Diverse bronnen op internet, waaronder CNN, maken melding van grote vertragingen op internet als gevolg van een virus-achtige uitbraak. Op dit moment worden er over het hele internet enorme aantallen scans uitgevoerd naar een lek in Microsoft SQL Server, waardoor een groot aantal sites verminderd bereikbaar zijn. Ook de DNS root-servers hebben bereikbaarheidsproblemen en tot wel 30 procent packetloss. Inmiddels heeft de worm een naam gekregen: W32/SQLSlammer.worm. Serverbeheerders worden aangeraden onmiddellijk de patch uit te voeren en de poorten 1432 tot en met 1434 voorlopig af te sluiten.

      Het gaat om een bekend lek in SQL Server, dat werkt op UDP-poort 1434 (ms-sql-m). Voor dit lek is reeds enige maanden geleden een patch uitgebracht, die veel systeembeheerders echter nog niet hebben toegepast. De worm verzendt een pakketje van 376 bytes naar deze poort, waarop de geïnfecteerde server het pakketje naar willekeurige servers gaat vermenigvuldigen. Er is verder geen schade aan besmette servers: het enige wat de worm doet is zichzelf verder verspreiden. Bij het verzenden van UDP-pakketjes wordt geen pakketje teruggestuurd, waardoor met grote snelheid pakketjes op servers kunnen worden afgevuurd en netwerken kunnen komen plat te liggen.

      Ook het Trueserver-netwerk is veel zwaarder belast dan normaal, de filters in de routers van TrueServer onderscheppen op dit moment maar liefst 16 terabyte verkeer per uur (!) als gevolg van de uitbraak. De uitbraak lijkt op die van "Code Red" in de zomer van 2001, toen er ook grote bereikbaarheidsproblemen optraden. Volgens Symantec zijn minimaal 22000 systemen wereldwijd het slachtoffer geworden van de aanval. Inmiddels verbetert de bereikbaarheid weer langzaam, maar met name in Azië zijn er nog problemen. Ook de Amerikaanse veiligheidsdiensten zijn zich ermee gaan bemoeien. Volgens hen is het mogelijk dat Noord-Korea betrokken is bij de uitbraak, maar dit gerucht lijkt vooralsnog niet gefundeerd:

        "It's not debilitating," said Howard Schmidt, President Bush's No. 2 cyber-security adviser. "Everybody seems to be getting it under control." Schmidt said the FBI's National Infrastructure Protection Center and private experts at the CERT Coordination Center were monitoring the attacks. The latest attack was likely to revive debate within the technology industry about the need for an Internet-wide monitoring center, which the Bush administration has proposed. Some Internet industry executives and lawyers said they would raise serious civil liberties concerns if the U.S. government, not an industry consortium, operated such a powerful monitoring center.





    Bron : T.net

    Ik heb dan mijn mssql service uitgezet, daarna heb ik een firewall aangezet. Maar om dat ik toch eens wilde zien wat het effect was zette ik alles weer zoals het was. En maakte dit screenshot:



    Ook pieter vanleuven heeft enkele pakketjes tegen zijn hardwarematige firewall zien botsen.

    Ondertussen zit ik hier terug achter een firewall en kan niemand aan deze site/aan poort 1436. En ben ik aan het twijfelen of ik terug naar het access tijdperk ga of niet.

    Hier zie je wat ik aan data versast heb op 25/01 let vooral op de verhouding upload/download door die hoge upload heb ik mijn datalimiet overschreden en zit ik nu op smalband


    25/01/2003 10:53:35 1u 09m 55s 39.708.740 bytes 208.034 bytes
    25/01/2003 12:03:32 0u 13m 36s 9.027.295 bytes 211.085 bytes
    25/01/2003 12:17:10 0u 09m 09s 7.414.961 bytes 31.748 bytes
    25/01/2003 12:26:22 0u 03m 43s 608.106 bytes 962 bytes
    25/01/2003 12:30:06 1u 19m 47s 60.814.177 bytes 443.071 bytes
    25/01/2003 13:49:55 0u 02m 36s 2.026.908 bytes 5.374 bytes
    25/01/2003 13:52:35 1u 12m 59s 60.223.770 bytes 163.578 bytes
    25/01/2003 15:06:18 0u 12m 55s 8.401.935 bytes 15.675 bytes
    25/01/2003 15:19:14 0u 12m 07s 4.791.179 bytes 10.107 bytes
    25/01/2003 15:31:23 0u 03m 08s 2.329.379 bytes 6.136 bytes
    25/01/2003 15:34:34 0u 00m 38s 511.963 bytes 2.061 bytes
    25/01/2003 15:35:26 0u 05m 30s 1.140.376 bytes 50.932 bytes
    25/01/2003 15:41:48 0u 08m 11s 1.855.295 bytes 555.490 bytes
    25/01/2003 15:50:01 0u 03m 51s 1.150.344 bytes 2.077 bytes
    25/01/2003 15:53:55 0u 04m 02s 1.567.500 bytes 167.611 bytes
    25/01/2003 15:57:59 0u 03m 24s 2.766.309 bytes 5.582 bytes
    25/01/2003 16:01:41 0u 02m 38s 1.001.825 bytes 3.328 bytes
    25/01/2003 16:04:21 0u 07m 21s 4.667.579 bytes 10.496 bytes
    25/01/2003 16:11:44 0u 09m 38s 282.999 bytes 1.300.786 bytes
    25/01/2003 16:21:34 0u 09m 54s 137.196 bytes 973.921 bytes
    25/01/2003 17:42:09 0u 13m 23s 108.100 bytes 184.766 bytes
    25/01/2003 17:55:58 0u 08m 00s 5.996.469 bytes 16.417 bytes
    25/01/2003 18:04:27 0u 02m 24s 1.464.129 bytes 2.427 bytes
    25/01/2003 18:06:54 0u 02m 44s 1.197.208 bytes 2.544 bytes
    25/01/2003 18:09:40 0u 05m 30s 378.416 bytes 853 bytes
    25/01/2003 18:52:06 20u 54m 51s 24.401.260 bytes 81.553.199 bytes


    Das dus 232MB upload en 82MB download

    Ook no-ip Lag er even uit waardoor de omzetting van mijn ip naar six.servebeer.com niet werkte. Ook Thesix.tk werkte toen niet.


    Dit zegt men op de site van Microsoft over de evaluation version van mssql 2000:

      Due to the recent "Slammer" worm, Microsoft has temporarily removed the SQL Server trial software.

      SQL Server 2000 Evaluation Editions are intended for short-term testing and should not be used in production environments. For this reason, the Evaluation Editions do not support security patches and service packs.

      Any computers running SQL Server 2000 Evaluation Editions should be kept in a test environment separate from network access.

      If computers are running SQL Server 2000 Evaluation Editions are part of a corporate network, they should be taken offline and updated to released versions with the appropriate security patches.




    ~ first post :p

    first post :d
     
    © 2010 0110.be