BenBE's humble thoughts Thoughts the world doesn't need yet …

26.03.2012

RRDTool mit PHP nutzen

Filed under: Software — Schlagwörter: , , , , , — BenBE @ 00:03:40

Wer meinen Blog bereits ein wenig verfolgt hat, wird mitbekommen haben, dass manchmal Graphen auftauchen, die mit RRDTool erzeugt wurden. Nun habe ich ja bereits einmal zu RRDTool etwas geschrieben, aber den von mir geschriebenen Wrapper, sowie den aktuellen Code-Stand (nach angewendetem Patch) hatte ich bisher noch nicht weiter veröffentlicht. Das werde ich hier jetzt einfach mal nachholen, damit sich keine weiter beschweren kann, dass RRDTool mit PHP so kompliziert zu nutzen geht.

Das Projekt besteht hierbei aus zwei Teilen: Neben der PHP-Extension, die sich um die Anbindung an librrd4 kümmert, zusätzlich aus einem Userland-Teil, der einen Wrapper um die API bildet und eine ganze Menge der Operationen in OOP kapselt. Die API dazu ist zwar nicht die schönste, aber für meine Projekte hatte das bisher immer vollkommen gereicht und die wichtigsten Funktionen sind leicht nutzbar. Zusätzlich hab ich einen Log-Parser basierend auf meinem Wrapper als eine kleine Demo-Anwendung eingebaut, so dass man sich die Funktionsweise etwas anschauen kann. (more…)

Flattr this!

25.02.2012

Printer Music

Filed under: Fun — Schlagwörter: , , , — BenBE @ 21:12:36

Hier mal die Laufschrift auf dem kleinen Display am unteren Rand, da die doch an einigen Stellen recht schnell durchscrollt:

Loading …

Welcome to this oldskool demo presented at DreamHack Winter 2002 in Elmia. Jönkoping, Sweden.

The hardware you see is an old typewriter from the mid 80’s (probably 1985) called Brother BP-30.

It is interfaced through a home built platform based on two 8-bit microcontrollers and a TINI, an ethernet-connected microcontroller running Java. The music you hear (if you ignore the noise made by the typewriter) is a stripped-down XM file and is loaded into one of the two 8-bit microcontrollers, making it a true chiptune (har har), namely an Atmel mega163 running at 3.69 Mhz with a memory of 16 kB flash and 1 kB SRAM.

The XM playing code itself takes 1084 bytes and generates music at a sample rate of 11025 Hz, leaving only 334 clock cycles for each sample. The sound is converted from digital to analogue output through a custom built DAC consisting of 27 resistors and an amplifier from an old soundcard. The air is energized with sound waves using an old PC-speaker.

The microcontroller interfacing the typewriter motors and LCD controller is an Atmel 9098515 also running at 3.69 MHz. The demo code itself is loaded into the TINI as compressed Java bytecode and makes together with graphics data up a total of 17 kB.

TINI runs a very stripped-down Java environment (no built-in sine functions for instance) based on JRE 1.1.8 and stores both file system and program memory on 1 MB of RAM.

***

Credits:
Idea, hardware, code: psykotron

Music: flydoe

Drawn art: psychonaut

Additional code & art: treo

Special thanks to Flare for releasing XM player source to the public.

***

Well, what can we fill this scroller now then..? Perhaps some project history.

The project started this summer when the typewriter motors were successfully interfaced using a BS2SX microcontroller which was later abondoned for the Atmel microcontroller.

Java based demo parts were continiously added during the fall.

Creation of the XM player started 20 days ago.

The final hardware platform was soldered last weekend. Music and graphics were created the last days before DreamHack. The final composition started some hours before the deadline.

***

Greetz to Razor 1911, Fyllecell, Scania, DRM, d4rkn3ss, Kaotix and all other oldskoolers out there.

***

Ok, now let’s do a complete round-up of the hardware. Brother BP-30 typewriter, ATmega163, AT9098515, 3.6864 MHz oscillator, TL074CN Op-Amp, a number of resistors, 0.5 W 8 Ohm PC-speaker, DSTINI1+1MB, TINI Socket E10, prototyping PCB, wires (for instance some old IDE and floppy cables).

As you probably have noticed, the typewriter loads four differently coloured pens, which are cycled automatically by taking the pen to the rightmost position and then back. The pens have been used sparingly during testing as a large quantity of replacement pens cannot be guaranteed to exist.

***

***

Unfortunately, our 5 minutes are up. We hope you have enjoyed this oldskool demo and thank you for watching.

Auf jeden Fall genial gemacht!

Flattr this!

29.01.2012

Zu faul zum Suchen

Filed under: Server — Schlagwörter: , , , , , , , — BenBE @ 02:07:54

Hätte ich nicht schon wieder zwei Abende damit zugebracht, die Ursache für einen Fehler bei einem Joomla-Update zu suchen, würde ich es ja unter der Kategorie „Running Gag“ verbuchen, dass die Joomla-Entwickler jedes Mal auf’s Neue sich in der Kreativität ihrer Bugs übertreffen. War es beim einem Komponenten-Update noch das Unvermögen konsistente Datenstände zu halten, so ist es in Sachen Software-Update die Abwärtskompatibilität zu seinen eigenen, früheren Versionen. (more…)

Flattr this!

30.09.2011

Thread Pools

Filed under: Software — Schlagwörter: , , — BenBE @ 10:38:24

Neuere Prozessoren bieten immer mehr Leistung durch immer mehr parallele Kerne bei aber seit längerem nahezu gleich gebliebener Taktrate. Somit bleibt einem ohne Anpassung seiner Programme diese zusätzliche Leistung verwehrt. Nur in dem man sein Programm in mehrere Teile spaltet, die parallel ablaufen können, kann man sein Programm auch auf heutigen Prozessoren in optimaler Geschwindigkeit ausführen.

Für die Parallelisierung gibt es hierbei je nach Betriebssystem verschiedene Mittel. Die wohl bekanntesten Mittel stellen hierbei Threads unter Windows, bzw. das Forken unter Linux dar. Aber auch etwas exotischere Mittel wie PThreads oder Fibers bieten gute Möglichkeiten, um ein Programm auf mehrere CPUs zu verteilen.

Die verschiedenen Ansätze haben dabei gemeinsam, dass für verschiedene Aufgaben jeweils mehr oder weniger Umfangreiche Objekte erzeugt werden müssen, die für jede Aufgabe einen Zwischenstand enthalten, den sogenannten Kontext. Dieser ist bei Fibers (Windows) sehr klein, bei Multitasking mittels Prozessen aber durchaus sehr groß. Je größer dabei solch ein Kontext wird, desto langsamer wird das Umschalten zwischen mehreren Aufgaben. Außerdem steigt mit der Größe des Kontext oftmals auch der Aufwand für die Erzeugung eines neuen Kontextes, was insbesondere, wenn man viele kleinere Aufgaben parallelisieren möchte von großer Bedeutung ist.

Eine relativ gute Einführung (leider hinter einer via BugMeNot umgehbaren Paywall *sigh*) gibt es beim Linux Magazine. Auch die beiden Videos mit der Erklärung kann ich wärmstens ans Herz legen.

Nach diesem kurzen Abstecher nun wieder zurück zum eigentlichen Thema dieses Beitrages, denn wie auch im verlinkten Beitrag, sowie den beiden darin enthaltenen Videos erklärt, möchte man in aller Regel den Setup-Aufwand für viele kleine Aufgaben möglichst gering halten. Zu diesem Zweck bietet Windows sogenannte Threadpools. Etwas ähnliches bietet Linux nicht von Haus aus; doch das lässt sich recht einfach ändern.

Für ein eigenes Projekt unter Linux war ich nämlich selber auf der Suche und wurde nach etwas Suchen auch bereits fündig. Die gefundene Implementation ist zwar funktional und minimalistisch gehalten, hat jedoch ein paar kleinere Ecken und Kanten, weshalb ich sie für meine Zwecke noch einmal überarbeitet habe.

Da der Source somit eh einmal komplett bearbeitet wurde, nutze ich die Chance (insbesondere auf Grund des vielfachen Wunsches eines einzelnen Herren), um die Funktionsweise einmal direkt am Source des Thread Pools zu erklären. Eine Vorwarnung möchte ich aber bereits jetzt geben: Das wird etwas technisch 😉 (more…)

Flattr this!

28.09.2011

Überblick über Projektaktivität gewinnen

Filed under: Software — Schlagwörter: , , , , — BenBE @ 22:13:15

Manchmal hat man ein Projekt, von dem man gerne wissen möchte, ob noch aktiv an diesem entwickelt wird. Aber nicht immer sind entsprechende Grafiken mit aussagekräftigen Zahlen verfügbar. Eine recht einfache Möglichkeit, dennoch einen Überblick zu bekommen, ist ein Blick in die Commit Logs des Projektes. Wenn diese viel Aktivität zeigen, ist ein Projekt mit sehr hoher Wahrscheinlichkeit noch aktiv. Aber stupide Datumswerte sind oftmals recht schwer zu überblicken. Etwas mehr Grafik wäre hier wünschenswert. Und genau hier kann man mit etwas Bash Magic und ein wenig RRDTool nachhelfen. (more…)

Flattr this!

15.09.2011

Automatisches Link Quality Management für OLSR+Tinc

Filed under: Software — Schlagwörter: , , , , , — BenBE @ 20:26:07

Möchte man mehrere dezentrale Standpunkte in einem Mesh-Network miteinander verbinden, so bieten sich in der Regel Lösungen mittels eines VPN an. Diese sind oftmals auch mit wenig Aufwand eingerichtet, können aber mitunter gewisse Nachteile mit sich bringen. Einer dieser Nachteile betrifft zum Beispiel den Aufbau der Routing-Tabelle, wenn sich das VPN nicht vollständig wie der physikalische Counterpart verhält. Dies ist bei Tinc, einer sehr einfach nutzbaren VPN-Software der Fall, die bei Nutzung des Switch-Modus das gesamte VPN als eine Broadcast-Domäne betrachtet. Da in der Regel aber nicht wirklich jeder VPN-Client mit jedem anderen kommuniziert, führt dies zum Verlust von Struktur-Informationen bei Mesh-Netzwerken, die mittels Broadcast versuchen, die Netzwerk-Struktur zu erkunden. Einer der bekanntesten Vertreter ist hierbei OLSR, was auf Grund dieses Verhaltens haufenweise „virtuelle“ Verbindungen zwischen den VPN-Clients sieht, die real nicht existieren, was mitunter zu ungünstigen Verhaltensweisen beim Aufbau der Routingtabelle führt. (more…)

Flattr this!

24.08.2011

Schleifchen erwartet

Filed under: Software — Schlagwörter: , , , — BenBE @ 12:30:50

Unter der Kategorie Kuriositäten kann man glaube folgenden GCC-Bug abhandeln, der bei mir mit folgendem Source auftrat:

        // Run the job we've taken
        if(cleanup_func) {
            pthread_cleanup_push(cleanup_func, cleanup_arg);
        }

        job_func(job_arg);

        if(cleanup_func) {
            pthread_cleanup_pop(1);
        }

Wobei job_func ein normaler Callback-Typ der Form

typedef void (* dispatch_func_t)(void *);

ist, also einen Pointer entgegen nimmt und nix zurückliefert. Nunja. Versucht man obigen Source (im Zusammenhang mit etwas mehr Source eines Thread-Pools zu compilieren, erhält man recht überraschend eine Fehlermeldung vom GCC (4.6.1-4):

gcc -g -Wall -Werror -std=c99 -I./src -O9 -o ./obj/threadpool.o -c ./src/threadpool.c
./src/threadpool.c: In Funktion »_threadpool_dowork«:
./src/threadpool.c:120:9: Fehler: expected »while« before »job_func«

Und ja: Der will da wirklich ne While-Schleife haben! Geben wir sie ihm also:

        // Run the job we've taken
        if(cleanup_func) {
            pthread_cleanup_push(cleanup_func, cleanup_arg);
        }

        //GCC fails if I DON'T write a while loop here. Let's make it happy!
        while(0);

        job_func(job_arg);

        if(cleanup_func) {
            pthread_cleanup_pop(1);
        }

Und der GCC ist zufrieden.

Flattr this!

02.08.2011

FizzBuzz BrainFuck

Filed under: Fun,GeSHi — Schlagwörter: , , — BenBE @ 01:17:35

Well yeah, after some nasty person dropped a link about why programmers are so bad at programming I somehow got to have a look at the Rosetta Code project’s site detailling this task and found (not to my surprise) that noone had solved that task — yet! So I sat down and implemented it. Usually this task should take you only about a few minutes but since I hardly ever programm anything in BrainFuck it took me roughly 45 minutes to complete. But well: Here’s the result (Beware: Ugly code)! (more…)

Flattr this!

12.07.2011

Es funktioniert doch!

Filed under: Software — Schlagwörter: , , , , , , , — BenBE @ 15:31:26

Eine der schlimmsten Krankenheiten, wenn nicht gar Geschwüre unter Programmierern ist der Satz „Aber es funktioniert doch!“, wenn man sie darauf hinweist, dass ihre Software fehlerhaft implementiert ist. Unabhängig davon, was wirklich falsch ist, oder wie groß die nötige Änderung ist. So aus Prinzip halt. (more…)

Flattr this!

14.06.2011

Komponenten-Update mit sehr viel Fail

Filed under: Software — Schlagwörter: , , , — BenBE @ 01:50:56

Heute gibt es wiedermal ein Leckerli aus der Kategorie „Soviel Fail gibt’s nur bei Joomla“. Wer also schon immer über Joomla lästert, findet hier nun genau einen weiteren Punkt, wie Software nicht aussehen sollte. Aber gehen wir einmal der Reihe nach.

Für ein Projekt baue ich derzeit eine Komponente in Joomla, die eine Reihe von Erweiterungen in der Oberfläche implementiert. Die Komponente ist auch soweit fast fertig und ist im Backend wunderbar angebunden. Da im Laufe der Entwicklung noch zwei Menüpunkte zu ergänzen waren, musste diese kurzzeitig deinstalliert und wieder neuinstalliert werden, was an sich auch kein Problem darstellt, wäre da nicht … ähhhm … Joomla.

Die Komponente implementiert im Frontend nämlich die Erzeugung von SEO-freundlichen Links, die – aus einem Vorgängerprojekt stammend – auch bereits wunderbar funktionierten und im Produktiveinsatz keinerlei Probleme zeigten. Seitdem die Komponente jedoch zwischenzeitlich neu im Joomla eingebunden wurde, um die Anpassungen im Menü des Backends zu übernehmen, sah man nur die Joomla-typischen ItemId-Parameter in der Adresszeile. Die vormals funktionierenden Routen (wie die SEO-URLs im Joomla-Slang heißen) wurden nicht einmal mehr noch beachtet. Aufrufbar waren die Links dennoch. Auch ein erneutes Abspeichern der Menüeinträge, nachdem der Item-Type neu gesetzt wurde, bewegte Joomla nicht dazu, wieder SEO-URLs anzuzeigen.

Also fängt das Debugging an. Und wer jetzt als Admin nicht zumindest die Postfix-Konfiguration oder eine Einsendung zum IOCCC gewohnt ist, sollte u.U. erstmal was essen; auf nüchternen Magen verträgt man das nämlich sonst nicht. Also gut: Schauen wir zuerst einmal in die Joomla-Datenbank, um zu sehen, was Joomla bei der Komponenten-Installation so feines anstellt. Als erster Kandidat erweist sich hier die Tabelle jos_extensions. In dieser stehen alle Komponenten, Themes, Plugins und wie die Teile im Joomla-Slang wohl noch so alle heißen. U.a. findet sich hier auch ein Eintrag unserer Komponente, die nicht mehr geht. Nunja: Normal wäre ein Eintrag, seltsamer Weise hat es Joomla aber geschafft, hier mehrere Einträge draus zu machen, weshalb die Komponente zwei Mal auftaucht. Auch übrigens im Admin-Panel. Naja, passiert. Löschen wir also beide Einträge, deinstallieren die Dateien aus dem Joomla-Verzeichnis, die unsere Komponente betreffen und spielen die Update-Datei erneut ein.

Wer nun mit einer Meldung „Juhu, erfolgreich installiert“ gerechnet hat, darf bitte noch einmal das Thema dieses Posts verinnerlichen: Joomla! Stattdessen wirft einem Joomla eine Meldung „Error building admin menu“ an den Kopf. Naja, schauen wir noch mal in die Datenbank und finden da eine Tabelle jos_menu. Ja, hier handelt es sich, wie der Name vermuten lässt, um die Tabelle, in der jegliche Menüeinträge aufgeführt werden. Und wie es sich für ein unsauber konzipiertes System wie Joomla gehört, auch anwendungsübergreifend Frontend und Backend gemischt. Wer also mal so richtig sein Backend zerschießen will, darf in der jos_menu-Tabelle gerne anfangen. In besagter Tabelle fanden sich nun die von der Komponente in der XML-Datei registrierten Menü-Punkte. Jedoch nicht von der aktuellen Installation, sondern – fein säuberlich aufgehoben – von der Erstinstallation der Komponente. Also jos_menu aufräumen, die Komponente aus jos_extensions deinstallieren UND die Komponente wieder aus der Joomla-Installation entfernen.

Womit wir den nächsten Anlauf starten können. Komponenten-Package hochladen und auf die Meldung warten. Diese teilte uns diesmal (rot untermalt) mit, dass kein Fehler aufgetreten sei … bei der Ausführung einer Datenbank-Funktion. Womit wir bei vielsagenden Fehlermeldungen wären, denn in einer Fehlermeldung mitzuteilen, dass kein Fehler aufgetreten sei, ist nur bei Status-Code 0 unter Windows witzig, weil es dort zumindest der Erwartungshaltung des Anwenders entspricht. Denn wenn kein Fehler aufgetreten ist, obwohl man einen erwartet, spricht das entweder dafür, dass man sein Programm in die Tonne hauen sollte, oder etwas schief gelaufen ist, was einfach nicht bedacht wurde. Da die Fehlermeldung leider den Informationsgehalt einer Nachricht über einen umgefallenen Sack Reis in China hatte, ging der Weg erstmal zur Suchmaschine der Wahl, wo gleich der 3. Treffer aus einer Bündelung von Forendiskussionen zu dieser Fehlermeldung auf die 3. Tabelle in der Joomla-Datenbank verwies: jos_asset, die manchmal, unter nicht ganz nachvollziehbaren Umständen, noch Datenmüll beinhaltet, den Joomla selber nicht aufräumen will. Also auch hier kurz mit dem Datenbank-Tool der Wahl kurz gekehrt, die beiden anderen Tabellen wieder gereinigt und die Komponente nochmals installiert. Überraschenderweise diesmal sogar ohne Fehlermeldung.

Einzig die SEO-URLs, wegen derer ich diesen ganzen Aufriss angestellt hatte, waren immer noch nicht in Sichtweite.

Wobei, nicht ganz. Ich erwähnte ja besagte Tabelle jos_menu, in der Joomla jeglichen Datenmüll, der Menüeinträge betrifft, hinterlegt. Unter anderem finden sich hier die URL des Menüeintrags, die Art des Menüeintrags, sowie eine seltsame Zahl, die mit der Spaltenüberschrift component_id versehen ist. Wie jetzt? Sagt euch nix? Naja, schauen wir mal, ob sich da was finden lässt?

Ein Ansatzpunkt für die Lösung des Rätsels stellte – nahezu offensichtlich, wenn man sich die Werte anguckte – die Tabelle jos_extensions dar. Ja, DIE Tabelle jos_extensions, in der wir vorhin angefangen haben. Und nein, wir haben vorhin auch nicht die falsche der doppelten Komponenten-Registrierungen gelöscht, wie man zuerst vermuten könnte. Das ließ sich nämlich recht einfach anhand der – richtig – component_id feststellen, die es zum Ausgangszeitpunkt nämlich auch schon nicht (mehr) gab.

Was passiert war, ist an sich nämlich recht einfach – und genauso hirnrissig so zu implementieren; aber wir reden ja grad über Joomla, die tun sowas einfach: Menüeinträge sind statt auf den component_name (also ‚com_foo‘) auf die (installationsabhängige) component_id fixiert. Diese wird jedoch nicht aktualisiert, wenn eine Komponente nicht über den Upgrade-Mechanismus aktualisiert werden kann. Stattdessen zeigt diese dann ins Leere, obwohl anhand der URL die Beziehung zur zuständigen Komponente wieder hergestellt werden kann. Auch ein erneutes Speichern des Menüeintrags sorgt bei Joomla nicht dafür, dass dieser offensichtliche Integritätsfehler korrigiert wird. Wenn Joomla also die SEO-URL für diese URL erzeugen soll, beachtet es ein Feld, dessen Integrität offensichtlich defekt ist, statt die im Router eh ausgewertete Information zur Komponente heranzuziehen. Ändert man manuell für alle Menüeinträge, die noch auf eine alte, ungültige component_id zeigen, diese auf die aktuelle Kennung, so geht es. Ach ja: Wer Spaß haben will, darf das Routing übrigens auch sein Template machen lassen; man muss nur die richtigen IDs in die DB und Dateien auf die Platte schreiben.

Was immer die bei Joomla rauchen: Das Zeug muss gut sein!

Flattr this!

« Newer PostsOlder Posts »

Powered by WordPress