QBASIC Primzahlgenerator

Programmiersprache BASIC auseinander gesetzt. Um genau zu sein, mit der Microsoft-Implementation QBASIC, die mit den DOS-Versionen 5 und 6.x kostenlos ausgeliefert wurde. Irgendwann bekam ich auch ein seinerzeit schon ein völlig veraltetes Lehrbuch zu QBASIC in die Hände, welchem eine Diskette mit Beispielprogrammen im Sourcecode beilagen. Eines davon war ein Generator für Primzahlen. Irgendwann hatte mir ein Bekannter geholfen, diesen Generator so auszubauen, dass er etwas flexibler mit den Start- und Endwerten war. Ein Riesen Nachteil von QBASIC zu dem etwas grösseren und kostenpflichtigen Quickbasic war, dass es keinen Compiler besass um aus dem Code einen direkten für die DOS-Shell ausführbaren Maschienencode zu erzeugen. Das erstellte Programm kann nur im BASIC-Interpreter selbst ausgeführt werden. Und so habe ich QBASIC und den Primzahlgenerator über die Zeit bis heute auf allen meinen Computerplattformen mit dem DOS-Emulator DOSBox mitgeschleift.

Neulich kam ich aber dann doch mal auf die Idee, dass man den Generator mit einer populäreren Sprache auf eine aktuelle Plattform implementiert. Der Hauptbewegpunkt dabei ist, dass der Generator so direkt die Rechenleistung des Computer nutzen kann und nicht noch eine Emulationsebene zwischen Programm und Hardware die ganze Geschichte ausbremst. Kurzum: so arbeitet er viel schneller.
Interessant war aber dann doch die Möglichkeit, welche Compiler und IDE’s es so gibt, die mit dem Q(uick)BASIC-Dialekt noch zurechtkommen und so ein Kompilat für ein aktuelles Mac OS, Linux oder Windows erstellen können. Hier bin ich mit QB64 fündig geworden. Es läuft auf allen diesen Plattformen, zuzüglich der Android-Plattform für Mobilgeräten.

Aber vielleicht werde ich mich dennoch mal hinsetzen und den Generator in einer aktuellen und populäreren Sprach wie zum Beispiel C, Erlang oder Python neu implementieren. Wobei letzteres nicht so toll performen wird, da Python eine Interpretersprache ist. Obwohl ich mir sicher bin, dass es da bereits Lösungen gibt.

Anbei hier der Sourcecode des Generator in QBASIC

Advertisements

Verschlüsselten USB-Stick mit Mac OS X erstellen

Da ein USB-Stick gerne mal verloren geht oder auch längere Zeit z.B. am Arbeitsplatz für jeden erreichbar liegt und entwendet werden kann (z.B. Mittagspause, Meetings), ist es nur von Vorteil wenn der USB-Stick verschlüsselt ist und somit nicht für andere einsehbar ist.

Hier gibt einem Apple seit Mac OS in der Version 10.7 Lion mit Core Storage eine nützliche Funktion in die Hand, verschlüsselte Partitionen auch auf externen Datenträgern zu erstellen, um sich vor ungewollter Einsicht in seine Daten zu schützen.

Korrektes Medium ermitteln

Im ersten Schritt muss das korrekte Medium ermittelt werden. Hier im Beispiel verwende ich meinen USB-Stick mit 64 MiB Kapazität, der unter /dev/disk2 angesprochen werden kann.

Shell_1

CoreStorage logical volume group erstellen

Nun muss eine CoreStorage logical volume group erstellt werden.

Shell_2

Die Core Storage LVG UUID sollte notiert werden, da diese für den nächsten Schritt in dem eine CoreStorage logical volume erstellt wird benötigt wird.

CoreStorage logical volume erstellen

In der CoreStorage logical volume group wird nun ein CoreStorage logical volume erstellt. Als UUID wird die vom vorherigen Befehl ausgegebene EA1AFCC1-D33A-4948-B210-8A765E0BE902 angegeben. Der Parameter jhfs+ steht für HFS+ mit Journaling, danach folgt der Name des Volumes und die Grösse (hier 100%). Der letzte Parameter -passphrase sorgt dafür, dass ein verschlüsseltes Volume angelegt wird. Das Passwort wird beim erstellen des Volumes eingegeben und wird immer abgefragt, wenn das Volume gemountet wird.

Shell_3

Einstellungen prüfen

Shell_4

Wie an Has Encrypted Extents: YES zu erkennen ist, wurde erfolgreich ein verschlüsseltes Volume angelegt. Wurde der Parameter -passphrase beim Anlegen der CoreStorage logical volume vergessen, so steht hier no.
Und wie ich schon zu Anfang erwähnte, habe ich für den Versuch einen uralten USB-Stick mit 64 Megabyte verwendet. Das Kuriose dabei ist, dass das GUI- „Festplattendienstprogramm“ (engl.: Disk Utility) unter Mac OS X Lion prinzipiell beim Versuch ein Logical Volume zu erstellen immer abstürzte. Deswegen habe ich das ganze Prozedere auf dem Terminal mit dem Befehl diskutil durchgeführt. Man muss ausserdem dazu sagen, dass je geringer die Speicherkapazität des Medium ist, umso weniger für die restlich verfügbare Kapazität bleibt. Im Fall meines USB-Stick bleiben von den 64 nur noch 28 Megabyte an nutzbaren Speicher übrig. Der Rest geht für die Metadaten drauf. Das macht mir aber in diesem Fall nichts aus, da ich diesen Stick als ein weiteres Backup-Medium für die KeyChain der Schlüsselbundsoftware von Mac OS und für weitere asymmetrische Schlüsselpaare der SSH und OpenVPN nutze. Das macht bei mir nur ein bis zwei Megabyte aus.

Bei Mac OS X Montain Lion hat zwar Apple die Stabilität vom Festplattendienstprogramm verbessert, aber der kleine USB-Stick lässt sich sowohl unter diesen als auch mit dem diskutil-Terminalbefehl nicht mehr zu einem logical Volume verwandeln. Hier moniert das Programm, dass das Medium dafür über zu wenig Speicher verfüge. Einen Sinneswandel, den ich technisch überhaupt nicht verstehen kann.

Endlich auch mal eine SSD

Nachdem ab heute die dreijährige Garantie von meinem Apple MacBook Pro abgelaufen ist, habe ich mich entschieden, das Gerät ein wenig zu pimpen. Neben dem Austausch des Arbeitspeicher – von insgesamt vier auf acht Gigabyte – werde ich die 320 Gigabyte grosse Festplatte durch eine etwas kleinere 250 Gigabyte grosse Solid State Disk (SSD) ersetzen. Diese Maßnahmen sollen dem Gerät noch einmal einen kleinen Speedpump geben. Wurde uns ja schliesslich seit Jahren erzählt, dass wir immer schnellere Prozessoren brauchen, hat sich in den letzten Jahren doch heraus kristallisiert, dass doch die Festplatten mit ihren drehenden und sonstig bewegenden Teilen den Flaschenhals in einem Computer bilden.

Für meinen Laptop habe ich mich nun also für die Samsung 840 Basic-Variante mit 250 Gigabyte entschieden. Da der Computer, in der sie verbaut wird, schon eben drei Jahre alt ist, gibt sich allerdings schon eine kleine Einschränkung: Die Disk ist für die aktuelle Serial-ATA-Schnittstelle mit bis zu einer Transferrate von 6 Gigabit pro Sekunde konzipiert, während die Schnittstelle im Computer maximal 3 Gigabit pro Sekunde in der Lage zu transferieren ist. Zum Glück ist aber der S-ATA-Bus gegeneinander auf- und abwärts kompatibel. So kann ich zwar nicht die volle Leistung der SSD ausschöpfen, aber sie liegt deutlich über die einer konventionellen Festplatte, so dass zumindest der Bus bis zum Maximum ausgenutzt wird. So liegen die Lese- und Schreibgeschwindigkeit in einem Benchmark beide bei 210 bis 220 Megabyte pro Sekunde. Obwohl sie laut Datenblatt bis zu 540 Megabyte pro Sekunde lesen und 250 Megabyte pro Sekunde schreiben kann. Die herkömmliche Festplatte schaffte in dem selben Benchmark nur 210 Megabyte pro Sekunde im Lesen und 65 Megabyte pro Sekunde im schreiben.

Benchmark HDD

Benchmark HDD

Benchmark SSD

Benchmark SSD

Eine Anwendung, wo dieses Kernfeature schon deutlich zum Tragen kam, war das Verschlüsseln des Datenträgers auf Dateisystemebene. Hat diese mit FileVault2 bei der 320 Gigabyte grossen Festplatte über fünf Stunden gedauert, so waren es mit der 250 Gigabyte SSD nur noch 45 Minuten.
Ausserdem ergeben sich durch den Einsatz einer Solid State Disk noch zwei weitere Effekte: Zum einem ist eine SSD vom Gewicht viel leichter als eine herkömmliche Festplatte. Gemessen habe ich 45 Gramm (SSD) zu 104 Gramm (HDD). Das macht auch den tragbaren Computer insgesamt um circa 60 Gramm leichter. Ausserdem kommen hier keine beweglichen Teile mehr zum Einsatz, welche angetrieben werden müssen. So eine SSD verbraucht also auch weniger Strom. Was dazu führt, dass zum einem der Akku ein klein wenig mehr geschont wird und zum anderen, wenn sie extern über USB konnektiert werden, sie damit mal endlich die USB-Spezifikation hinsichtlich der Stromaufnahme nicht überschreiten.

Erwähnenswert wäre noch, welche Software ich für den „Plattentausch“ genutzt habe. Mit dem Carbon Copy Cloner habe ich die ursprüngliche Festplatte auf die Zielplatte, welche über FireWire oder USB extern an dem Rechner angeschlossen ist, eins zu eins geklont. So braucht diese dann nur noch einfach getauscht werden, ohne dass irgendetwas neu installiert werden muss.
Da es sich aber nicht um eine original von Apple verbaute SSD handelt, schaltet das Mac OS X den Trim-Befehl nicht ein. Obwohl der Befehl im Betriebssystem vorhanden ist, muss er manuell eingeschaltet werden. Hier empfiehlt sich das Programm Trim Enabler.

ZEVO ZFS Community Edition für Macintosh

Nach ewigen Hin und Her gibt es nun den Treiber für ZFS in einer kostenlos downloadbaren Community Edition. Der Nachteil von dieser gegenüber der vorherigen Kaufversion ist allerdings, dass man über das GUI-Frontend in den Systemeinstellungen keine Volumes erstellen kann, sondern nur den Intigritäts-Check durchführen kann.
Also werde ich hier mal einen kurzen Workaround aufstellen, wie man sich unter der Konsole ZFS-volumes erstellt und verwaltet.

Mit dem Befehl ls -l /dev/disk* lässt man sich erstmal alle verfügbaren Datenträger anzeigen.


sommteck:~ franky$ ls -l /dev/disk*
598 0 brw-r----- 1 root operator 1, 0 27 Jul 21:26 /dev/disk0
600 0 brw-r----- 1 root operator 1, 1 27 Jul 21:26 /dev/disk0s1
602 0 brw-r----- 1 root operator 1, 2 27 Jul 21:26 /dev/disk0s2
604 0 brw-r----- 1 root operator 1, 3 27 Jul 21:26 /dev/disk0s3
606 0 brw-r----- 1 root operator 1, 4 27 Jul 21:26 /dev/disk1
835 0 brw-r----- 1 root operator 1, 5 19 Aug 10:42 /dev/disk2
839 0 brw-r----- 1 root operator 1, 6 19 Aug 10:42 /dev/disk2s1

Für eine detaillierte Auflistung aller Datenträger benutz man die Funktion list des Kommandozeilenprogramm diskutil.


sommteck:~ franky$ diskutil list
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *320.1 GB disk0
1: EFI 209.7 MB disk0s1
2: Apple_CoreStorage 319.2 GB disk0s2
3: Apple_Boot Recovery HD 650.0 MB disk0s3
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: Apple_HFS Simba *318.9 GB disk1
/dev/disk2
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *2.1 GB disk2
1: Windows_NTFS Ohne Titel 2.1 GB disk2s1

In der Ausgabe sieht man drei Datenträger.
/dev/disk0 ist der Erste und gleichzeitig die Festplatte des Computer auf der ich das hier veranstalte. Auf ihm liegt die Partitionstabelle, die EFI-Firmware des Computer selbst, die Partition mit dem Computerbetriebssystem und allerlei Daten, und eine spezielle Recovery-Partition für das Mac OS.
/dev/disk1 wird als ein weiteres Laufwerk angezeigt, ist aber in Wirklichkeit die Computerfestplatte und deshalb noch einmal aufgelistet, da es sich um ein LogicalVolume von Apple’s CoreStorage handelt, welches verschlüsselt ist.
/dev/disk2 ist schlussendlich der 2 Gigabyte große USB-Stick den ich für das ZFS verwenden möchte. Er beherbergt erst einmal ein Windows-Dateisystem.

Da die bisherige Community-Edition bisher keine bootfahigen ZFS-Volumes erstellen kann, zeigt der Befehl zpool showdisks nur die Laufwerksgeräte an, die für den Treiber in Frage kommen und man sollte nicht in der Lage sein, seine Systempartition zu zerschiessen. Also wird nur der USB-Stick angezeigt, der in Frage kommt und den ich verwenden will.


sommteck:~ franky$ zpool showdisks

DISK DEVICE SIZE CONNECTION DESCRIPTION
/dev/disk2 1,91GiB USB SanDisk U3 Titanium Media

Jetzt ans Eingemachte! Mit zpool create wird ein ZFS-Volume mit einer Disk erstellt.


sommteck:~ franky$ sudo zpool create -f ZFS-Disk /dev/disk2

Da jetzt nun ein Laufwerk mit ZFS vorhanden ist, wird der Befehl zpool list eine Ausgabe geben.


sommteck:~ franky$ zpool list
NAME SIZE ALLOC FREE CAP HEALTH ALTROOT
ZFS-Disk 1,78Gi 672Ki 1,78Gi 0% ONLINE -

Mit zpool status und dem Namen des gewünschten Pool lassen sich die Informationen vertiefen.


sommteck:~ franky$ zpool status ZFS-Disk
pool: ZFS-Disk
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
ZFS-Disk ONLINE 0 0 0
GPTE_20835C0B-2B01-4E41-B117-3E88498CD134 ONLINE 0 0 0 at disk2s1

errors: No known data errors

Disclaimer:
Für meine Übungsbeispiele habe ich bewusst USB-Sticks genommen, weil sie einfach, leicht und handlicher als Festplatten sind. Allerdings performen sie so überhaupt nicht. Das Kopieren einer ca 700 MB grossen Filmdatei dauert mit ZFS auf ihnen ein vielfaches an Zeit, als wenn auf einem Stick ein FAT oder HFS+ betrieben wird. Beim Versuch, ZFS auf eine 250 Gigabyte grosse externe Platte zu bringen, wurden die Daten tatsächlich mit der Geschwindigkeit geschrieben, die auch der Bus zu leisten vermag. In dem Fall eine IDE-Platte.

USBIP auf einem Raspberry Pi starten

Innerhalb meiner Peergroup hatte die Tage jemand versucht, mit Hilfe der Linux-Software USBIP Geräte, welche an einem USB-Port hängen, auch für ein Netzwerk nutzbar zu machen. Im Gegensatz zu einem normalen Debian-Kernel für Standart-PC’s, sind die entsprechenden USBIP-Module aber für die ARM-Architektur im Kernel nicht enthalten. Und irgendwie scheint es prinzipiell wohl Probleme zu geben, die Treiber für den Kernel zu bauen. Dies trifft also nicht nur auf den Raspberry Pi, sondern auch so netter Embeded-Hardware wie der Dockstar. Nach ein bischen stöbern über die allseits bekannten Suchmaschienen bin ich aber hier auf eine – für’s erste funktionierende Lösung gestossen. Sie ist auf ein Debian Wheezy abgestimmt.

Als erstes sollte man sich vergewissern, dass man für sein Raspberry Pi sowohl den aktuellsten Kernel, als auch die neuen Firmware-Treiber und Module geladen hat. Dann wie folgt:

sudo apt-get install git
git clone git://github.com/raspberrypi/linux.git kernel
cd kernel
wget https://raw.github.com/raspberrypi/firmware/master/extra/Module.symvers
zcat /proc/config.gz > .config

Als nächstes öffnet man mit einem Editor die .config und fügt am Ende folgendes hinzu:

CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
CONFIG_USBIP_DEBUG=n

Danach auf der Kommandozeile folgende Befehle absetzen:

make oldconfig
make LOCALVERSION=+ modules_prepare
make SUBDIRS=drivers/staging/usbip
sudo make SUBDIRS=drivers/staging/usbip modules_install
sudo depmod -a

Jetzt USBIP installieren:

sudo apt-get install usbip

Nun den Host-Treiber laden (um USB-Geräte teilen zu können)

sudo modprobe usbip-host

Zum Geräte auflisten:

sudo usbip list -l

Man sollte sich die Bus-ID merken, damit man das Gerät dann zum Teilen frei geben kann:

sudo usbip bind --busid 'BUSID'

Als Antwort kommt dann:

bind device on busid 'BUSID': complete

Für den Client wird dann folgendes ausgelöst:

sudo modprobe vhci-hcd
usbip list --remote 'pi ip'
sudo usbip attach --host 'pi ip' --busid 'BUSID'
lsusb

Kaputter Papierkorb

Neulich hatte mich der Finder auf dem Mac geärgert. Plötzlich konnte ich als Systemadministrator keine Daten ohne eine Passwortabfrage löschen. Dies betraf Daten die Systemweit verfügbar waren, als auch die Dateien im eigenen Benutzerverzeichnis. Die erste Vermutung war, dass irgend etwas mit den Rechten des gesammten eigenen Benutzerverzeichnis nicht stimmte. Eine kleine Recherche im Internet ergab aber, dass dies Problem schon öfter bei Nutzern auftrat. Das Problem war, dass die eigenen Schreib- und Leserechte für den eigenen Papierkorbordner gänzlich fehlten und so der Finder die zu löschenden Daten in den Papierkorb nicht verschieben konnte und sie stattdessen direkt löschen musste. Deswegen die Passwortabfrage.
Um jetzt den Papierkorb aber wieder benutzbar zu machen, gibt es eine Möglichkeit, bei der man auf dem Terminal folgenden Befehl absetzt, um sich die versteckten Ordner und Dateien im Finder anzuzeigen lassen.:

defaults write com.apple.finder AppleShowAllFiles -boolean true;killall Finder

Alternativ kann man dies auch mit hübschen GUI-Programmen wie Onyx machen.

Ist der Ordner des Papierkorb im Finder sichtbar, so kann man nun über die Ordnerinformationen ihn die nötigen Rechte zurück geben.

Tor-Server unter OpenBSD

Da ich schon seit längerer Zeit meine Irssi-Instanz von meinem ALix-Homeserver auf einem V-Server verlegt habe, kann man die ungenutzte Bandbreite zu Hause für andere gemeinnützige Dienste nutzen. Deswegen habe ich mal auf den Rechner einen Tor-Server aufgesetzt um den Privacy-bewussten Computernutzer zu unterstützen.

Anbei erst einmal die Installationsanleitung unter OpenBSD.:

1. mit pkg_add installieren:

   # pkg_add tor

2. Tor beim Booten starten:

Dazu muss die /etc/rc.local editiert werden

if [ -x /usr/local/bin/tor ];
then
echo -n ' tor';
/usr/local/bin/tor -f /etc/tor/torrc
fi

3. Konfigurieren

Damit Tor beim booten in den Hintergrund forked, muss folgendes in der /etc/etc/tor/torrc aktiviert werden:

   RunAsDaemon 1

Als nächstes muss ein Verzeichnis für Tor’s Daten in der torrc festgelegt werden:

   DataDirectory /var/spool/tor

Weiterhin muss ein Verzeichnis für Tor’s Logfiles in der torrc festgelegt werden:

   Log notice syslog /var/log/tor

Dann müssen diese Verzeichnise noch erstellt und den Benutzern tor und root müssen die Rechte dafür gegeben werden:

# mkdir /var/spool/tor
# chmod 40700 /var/spool/tor
# chown _tor:_tor /var/spool/tor
# mkdir /var/log/tor
# chmod 40700 /var/log/tor
# chown _tor:_tor /var/log/tor

Die ganze Server-Geschichte lasse ich erst einmal weiterhin als Entry-Node laufen, bis ich mir eventuell mal ein paar Gedanken dazu gemacht habe, wie ich den Dienst für bestimmte Services weiterhin öffnen kann, ohne in Konflikt mit Ermittlungsbehörden zu kommen.
Entsprechend sieht der Abschnitt zur Exit-Policy in der /etc/tor/torrc wie folgt aus.:

   ExitPolicy reject *:* # no exits allowed