Um 7 Uhr hat der Wecker geklingelt, ich drehe mich im Bett um, und der erste Gedanke, der mir durch den Kopf geht: "Ich habe in der CXyzFile-Klasse ein Memory Leak beim Anlegen von CFooIterator-Objekten". Was dann auch gestimmt hat, und das erste, was ich heute in der Arbeit gefixt habe. Sehr schräg.
Sonntag hab ich mich spontan entschlossen, mit einem Freund übers Osterwochenende nach Amsterdam zu fliegen. Lange haben wir gehadert, um einen passenden Flug zu kriegen (Sky Europe hat irgendwann Montag vormittag die Preise für Wien-Schwechat - Amsterdam-Schiphol drastisch erhöht, und auch die AUA hat am Montag abend die Preise für die Strecke während des Buchens geändert), und lange haben gezittert, um überhaupt eine angemessene Schlafgelegenheit zu finden (so spontan über Ostern nach Amsterdam zu fahren war buchungstechnisch keine gute Idee), aber letzten Endes hat's dann doch geklappt, und wir haben ein Appartment zu einem fairen Prais in der Grachtengordel ergattert. Der AK freut sich, dass die Umsetzung einer spontanen Idee so gut geklappt hat, und ist auf Amsterdam gespannt. In die Niederlande hab ich's bisher ja noch nie geschafft, und gemeinsam mit der 3-wöchigen Reise nach Argentinien im Juni/Juli wird 2007 wohl das Jahr des Reisens werden.
Gestern haben Ska Bucks im Planet Music in Wien am Viertelfinale des Austrian Band Contest teilgenommen. Nachdem die Band einen Bus organisiert hat, war ich dabei, und habe ein paar Eindrücke des Auftritts gesammelt. Leider sind sie nur 7. von 9 Bands geworden, allerdings waren einige Bedingungen, unter denen der Auftritt erfolgte, eher nicht so toll.
Einen Videomitschnitt von einem Song hab ich ebenfalls gemacht, sobald der bei Youtube online ist, werde ich ihn entsprechend verlinken.
Heute geht's mit ein paar Arbeitskollegen, nämlich Hilli, Udo und Jeid, ins City-Kino, auf zwei in Zusammenhang stehende Filme hintereinander (neudeutsch heisst das wohl "Double Feature"), und zwar einerseits Letters from Iwo Jima, andererseits Flags of Our Fathers, beides Filme von Clint Eastwood, die von der Schlacht um Iwojima im 2. Weltkrieg handeln. Nachdem ich ja schon länger nicht mehr im Kino war, weil länger nix mehr war, das mich auch nur annähernd interessiert hätte, bin ich schon ziemlich gespannt darauf.
Eines der Features, das newsbeuter 0.3 haben wird, ist eine sprachliche Lokalisierung. gettext-Support ist schon im SVN-Head, was jetzt noch fehlt, sind passende Übersetzungen. Die einzigen natürlichen Sprachen, die ich spreche, sind Deutsch und Englisch, und dementsprechend gibt es gerade mal eine Übersetzung, nämlich die ins Deutsche.
Deswegen hier der Aufruf: wenn irgendjemand noch eine andere Sprache als die beiden oben genannten spricht, und newsbeuter übersetzen will, wäre ich sehr dankbar. Derzeit sind es gerade mal knapp über 90 Zeichenketten, die zu übersetzen wären, also kein zu großer Aufwand. Das Template für die Übersetzung findet sich hier, als Beispiel, wie das resultierende File nach der Übersetzung aussieht, kann man sich das bereits existierende de.po anschauen. Für jegliche Einsendungen an ak-newsbeuter@synflood.at bin ich herzlich dankbar.
Debian-Pakete gibt's bald, nion hat die neuen Pakete schon fertig (danke für die Mühe!).
Und schon geht's mit der Entwicklung für das neue Release 0.3 weiter. Wer Featurewünsche oder sonstige Ideen hat, der möge sie bitte in den Issue Tracker eintragen.
Update: nion fasst in diesem Artikel noch mal schön zusammen, was newsbeuter 0.2 so sexy macht.
Endlich ist es soweit, lange haben viele darauf gewartet: newsbeuter 0.1.1 hat endlich seinen Weg in Debian unstable gefunden. Mein herzlicher Dank dafür geht an nion, der das Debian-Paket von newsbeuter gemacht hat. Falls jemand Fehler oder andere Probleme in newsbeuter findet, bitte ich sie in den newsbeuter issue tracker einzutragen.
Version 0.2, die dann alle coolen Features enthält, wird übrigens bald(tm) (voraussichtlich morgen abend) released werden.
Manche Emails kriegt man, von denen glaubt man garnicht, dass es sowas gibt. In diesem Fall meinte wohl jemand, aus meiner Domain "synflood.at" und seinem vermeintlichen Problem mit einem Österreicher schließen zu können, ich wäre Experte für SYN Floods, die aus Österreich stammen.
From: Milan1 XXXXXXXX <XXXXXXXX@hotmail.com>
Date: Sun, 18 Feb 2007 20:40:27 +0000
To: ak@synflood.at
Subject: Hi
Hi ,
my name is Milan and i am from Sweden. My english is bad but i think you will understand me.
I have problem with one man from Austria. He have atack with syn flood to me 5 days. I try change IP,
but he change atack to new IP. I have one litle dc++ hub. I try everything but nathing.
Feb 18 04:10:11 DOS [TCP]: Attack Incoming 85.126.XX.XXX->81.232.XX.XXX [TCP SYN Flood]
This is log from my router. I have to much log from f-secure and kaspersky anty hack.
My configuration:
DSL connection 8/1 mgb
Router D-link Dl-524up
cpu Pentium 4 2.6 512 mgb RAM
cpu 2 Pentium 4 2.0 512 mgb RAM
DOS [TCP]: Attack Incoming 62.178.XX.XXX->81.232.XX.XXX [TCP SYN Flood]
This adress is from he`s home Computer.
He have server and home cpu and he have atack to me from two place.
I think , you are expert for syn flood and do you want help me?
Nachdem meine verehrte Leserschaft über meine Berichte über die Entwicklung von newsbeuter das ncurses-UI-Toolkit STFL zumindest vom Namen her kennt, möchte ich ein wenig mehr über die Eigenschaften und Features dieser genialen Library schreiben, da sie mir bisher sehr beim Erstellen von Konsolen-UIs geholfen hat.
Die Basis von STFL ist die Layout-Beschreibungssprache, mit der man die grundsätzliche Ausrichtung und Positionierung sämtlicher Controls inklusive (optional) des Inhalts und der Farbgebung. Diese Beschreibungssprache wird in eine Datenstruktur geparsed, die dann später zur Laufzeit einfach modifiziert und abgefragt werden kann. Ein wichtiges Prinzip des Layouting bei STFL sind dabei Horizontal und Vertical Boxes. Man stelle sich z.B. den gesamten Bildschirm vor, den man zuerst in mehrere Boxen "untereinander" teilt. In so eine Box kann man dann ein Control platzieren, oder eine weitere vbox (macht nicht sehr viel Sinn), oder aber eine hbox, welche die Box wiederum in mehrere Boxen nebeneinander teilt, usw. usf. Zusätzlich kann man jeder Box noch die Information mitgeben, in welche Richtung sie expandieren soll. Mit diesem simplen Konzept hat man ein mächtiges Werkzeug bei der Hand, um brauchbare und komplexe Layouts für Konsolen-UIs zu designen.
Zur Laufzeit wird diese Layoutbeschreibung dann eingelesen (entweder aus einer Zeichenkette oder aus einem externen File, ich persönlich verwende dieses Skript um STFL-Layouts direkt in Programme einzubinden, aber trotzdem die Layouts in schönen externen Files im Sourcetree liegen zu haben), und die resultierende Datenstruktur wird dem Programmierer dann als opakes "stfl_form *" zur Verfügung gestellt. Dieses Handle kann dann verwendet werden, um den aktuellen Inhalt von Controls auszulesen, zu verändern, den aktuellen Fokus zu bestimmen und zu ändern, und auch um die Datenstruktur selbst zu modifizieren (damit ließe sich theoretisch zur Laufzeit das Layout umstellen, auch wenn das in der Praxis i.A. wenig zielführend ist). Und natürlich kann man das Formular starten und kriegt Benutzereingaben weitergereicht, auf die man entsprechend reagieren kann.
Eine derartige Layoutbeschreibung sieht übrigens so aus:
vbox
@style_normal:bg=black,fg=white
@info#style_normal:bg=blue,fg=yellow,attr=bold
label#info
text[head]:"Your feeds"
.expand:h
list[feeds]
style_normal:bg=black,fg=white
style_focus:fg=yellow,bg=blue,attr=bold
.expand:vh
pos_name[feedposname]:
pos[feedpos]:0
label#info
text[help]:"q:Quit ENTER:Open r:Reload R:Reload All A:Mark All Read C:Catchup All"
.expand:h
label
text[msg]:""
.expand:h
Das ist das Layout der Feedlist, wie sie bei newsbeuter beim Programmstart erscheint. Es besteht aus einer vbox, welches von oben nach unten ein Label für die Überschrift, eine Liste mit den Feeds, ein Label mit Keyboard Shortcuts sowie ein Label für Information und Fehler enthält, alles gespickt mit diversen Details wie Farbgebung und der Information für die Labels, dass sie horizontal expandieren sollen, sowie für die Liste, dass sie horizontal und vertikal expandieren soll (und damit den meisten Platz ausfüllt).
Insgesamt ist das Interface von STFL sehr kompakt (14 API-Funktionen). Die Konstruktion eines Programms erfolgt meistens nach dem gleichen Prinzip: Initialisierung - Event Loop - Ressourcenfreigabe. Die Initialisierung ist bei STFL eine ganz simple:
Der erste Schritt ist immer, ein Formular anzulegen, und zwar mit stfl_create(). Dabei gibt es zwei Varianten, und zwar, einen normalen String mitzugeben, dann wird der String als Layoutbeschreibung geparsed, oder aber, man übergibt einen String, der mit '<' anfängt, und mit '>' endet, dann wird der Inhalt der Datei, deren Name zwischen '<' und '>' steht, als Layoutbeschreibung verwendet. Damit kann man auch Layouts aus externen Dateien laden, ohne diese Datei selbst öffnen und auslesen zu müssen, und man muss auch keinen extra API-Call bedienen.
Der nächste Schritt ist dann, das Formular zu starten, und optional auch auf Eingaben des Users zu warten. Und zwar funktioniert das mit stfl_run().
char * event = NULL;
event = stfl_run(f1, 0);
stfl_run(f1, -1);
Der zweite Parameter gibt dabei, wie lange auf Benutzereingabe gewartet werden soll, welche dann zurückgegeben wird. Der Wert "-1" bedeutet, dass keine Benutzereingaben eingelesen werden (wenn man z.B. lediglich das Formular neu zeichnen will), und 0 bedeutet, dass unendlich lange auf Benutzereingabe gewartet wird. Bei einem Wert > 0 wird soviele Sekunden gewartet. Findet bis dahin keine Benutzereingabe statt, so wird von stfl_run() NULL zurückgeliefert. Hierbei sollte man allerdings auf jeden Fall beachten, dass es auch sein kann, dass auch bei einer Wartezeit von 0 NULL als Rückgabewert zurückkommen kann, weil z.B. ein Tastendruck von dem Widget, das den Fokus hat, "konsumiert" wurde.
Die zurückgegebene Eingabe kann folgendes sein:
"TIMEOUT": bei einem Timeout
"ENTER": wenn die Eingabetaste gedrückt wurde
"ESC": wenn die Escape-Taste gedrückt wurde
"F0" .. "F63": wenn eine F-Taste gedrückt wurde
"CHAR(%u)" (wobei %u einem unsigned integer entspricht): eine andere Taste wurde gedrückt, und der numerische Wert dieser Taste befindet sich zwischen den Klammern. Der numerische Werte für die Taste "a" ist z.B. 97. Und auch Ctrl-Tastenkombination sind damit abfragbar, so ist etwa Ctrl-A der numerische Wert 1, Ctrl-B der Wert 2, usw.
Am Ende eines Programmes ist es dann noch zweckmäßig, die Funktion stfl_reset() aufzurufen, um den Bildschirm entsprechend zu resetten. Mit diesem Wissen kann man schon ein nettes kleines Programm schreiben, das so eine typische Event Loop demonstriert, und zusätzlich führe ich auch noch ein paar weitere Funktionen ein:
Was man hier sieht, ist eine klassische Event Loop, wobei auf die Tasten a bis e sowie q reagiert wird. Es werden ja nach Tastendruck ein Label bzw. die Liste modifiziert. Mit der Taste e enthält man zusätzlich noch Informationen über die aktuelle Auswahl in der Liste.
Man kann noch wesentlich mehr mit der STFL machen, und dieser Artikel soll nur einen kleinen Einblick in die grundsätzliche Funktionsweise von STFL bringen, um dem einen oder anderen unter euch das Entwickeln von eigenen, neuen Texttools schmackhaft zu machen. Für mehr Informationen sowie andere Widgets wie Eingabefelder oder mehrzeige Text Views ist es ratsam, in die STFL-Dokumentation sowie die existierenden Beispielprogramme reinzuschauen. Es lohnt sich.
Wer übrigens die STFL "C++iger" verwenden will, den kann ich nur auf meinen "stflpp"-Wrapper hinweisen, den man hier (Header) und hier (Source) findet (MIT/X-Lizenz, BTW). Die STFL selbst unterstützt neben C übrigens auch SPL, Ruby, Python und Perl.
Bald(tm) wird es ein neues Release von newsbeuter geben, und so hab ich einen Screencast gemacht, um zu zeigen, was denn so die wichtigsten Features von newsbeuter sind, und wie man es so benutzt:
Mein Englisch ist relativ schlecht, der Redefluss manchmal unterbrochen, aber wer will schon eine Demo von ueber 10 Minuten ganz exakt skripten, und beim kleinsten Versprecher sofort von neuem anfangen? Ich nicht.
Gestern hab ich meine Digicam ein wenig bei meiner Tante ausprobiert, herausgekommen ist dieses Panorama (man verzeihe mir die vielen Fehler, aber das Panorama hab ich halt so schnell-schnell gemacht):
Im Sommer, wenn alles blüht, sieht der Garten sicher noch wesentlich besser aus.
Nachdem ich meine Digicam letzten Dezember beim Fortgehen in der Linzer Altstadt verschmissen habe, hab ich seit gestern endlich ein neues Teil, und zwar eine Sony Cybershot DSC-H2. Das erste Herumprobieren war ganz nett, der Zoom ist gewaltig (12x optisch), jetzt müsste ich nur noch dazukommen, ein paar ordentliche Tests damit zu machen. Bisher hab ich gestern nur mit Blitz bei mir sinnlos in der Wohnung herumfotografiert.
Folgendes Problem: newsbeuter, mein RSS-Feedreader, benützt zum Reloaden aller Feeds einen Thread, der im Hintergrund läuft, und dabei den Fortschritt im mit STFL gezeichneten UI updated. Unter Linux funktioniert das alles perfekt, lediglich unter OSX beobachte ich das absolut schräge Verhalten, dass der Thread nur weiterarbeitet, wenn ich im Vordergrund irgendwelche Sachen mache, wie z.B. mit dem Cursor in der Liste rauf- und runterscrollen, oder zufällige Tasten drücken. Das lässt ja schlimmes vermuten, deswegen die Frage, ob da wer Details kennt. Anyone?