Hide Toolbars in Firefox 4

With the new Firefox 4 release mozilla has introduced some interesting new features and improvements. Particularly the changes to the GUI are interesting. Now you can pin a Tab as “App Tab” and so the tab is pinned on the left side of the tab-panel and you only see the favicon of this tab. I really like this for applications like google mail and google calender but also for news pages I regularly read.

But there are also problems with this approach. Sometimes I forget that I’m in an AppTab and that I don’t want to switch to another page in this Tab. But because I have the URL-bar available it happens that I found another page in the Tab where my “App” should be.

Another issue is that the main goal of the AppTabs is saving space. To support this, wouldn’t it be cool to hide the URL-bar and other toolbars when you are in an AppTab? You also couldn’t change the location by accident. This is what I thought and so I begun to write a little extension to enable this.

Happily mozilla introduced a technique to do exactly this. For example when you open the new Addon-Manager you see that it is opened in a new tab. If you have set your tabpanel to be on top of the URL-bar you will see the toolbars hidden when you are inside of the Addon-Manager-tab. You can use this technique for every page you want … at least on paper. Sadly there is no GUI with which you could enable hiding for a specified URL. This is what my extension is doing.

With my extension “Hide Toolbars by URL” you have a new entry in the context menu of every tab with which you can hide this URL. The hiding is connected to the URL, not to the tab. So if you open the same URL in another tab it will also be hidden. But because the exact URL will change when you use the page (i.e. when you follow a link on this domain you will be at another URL) it wouldn’t be really cool. So only the first part of the URL is used to determine if the tab should be hidden. I only use “http://www.google.de” - everything behind is cut of. So every “subpage” of “http://www.google.de” will be hidden. I’m not sure if this approach is the bests so I would love to get feedback for this. Probably I will change this in the future.

Of cause the code is free and open source - you can get the code at github.com. There is also the xpi-file you need to install. I will give this extension to the addon-page of mozilla and probably they will add this to there page so you can easily install it the same way you install every extension.

more...

Fortschritte beim Musikplayer

Eine ganze weile schon habe ich hier nichts mehr geschrieben, was jedoch nicht heisst, dass ich völlig untätig war. Ich habe in den letzten Wochen immer wieder Zeit gefunden, um an meiner Idee weiter zu arbeiten, eine eigene Musik-Abspielsoftware zu entwickeln. Diese Fortschritte möchte ich nun auch hier im Blog kommunizieren.

Zunächst einmal etwas ernüchternd: Mein Programm spielt noch keine Musik ab. In der derzeitigen Form ist das Programm nach wie vor eher eine Art Mockup oder GUI-Prototyp dar. Es zeigt, wie ich mir die Programmoberfläche vorstelle und stellt auch einige Bedienkonzepte vor.

Realisiert ist der Player zur Zeit als Firefox-Addon und noch nicht als eigenständige Anwendung. Später wird der Player aber auch ohne Firefox lauffähig sein. Ich möchte aber auch die Variante als Addon beibehalten, weil ich dies fǘr eine Interessante Alternative halte.

Ich werde in den nächsten Tagen noch einmal in einem Artikel zusammenfassen, welche Ziele ich mir für das Projekt gesetzt habe und welche Anforderungen ich erfüllen möchte. Auch werde ich dann erklären, warum ich einen eigenen Player entwickeln möchte, obwohl es ja schon eine ganze Reihe von Playersoftware gibt. Ich möchte in der nächsten Zeit öffters den aktuellen Stand des Projekts hier beschreiben und so den Projektverlauf dokumentieren. Daneben habe ich ein Projekt auf github.com für den Player gestartet. Wer github.com nicht kennt: Dies ist eine Projekt-Hostingseite, die auf dem Verteilten Versionsverwaltungssystem git aufsetzt. Git ist von seinem Funktionsumfang und den dahinter liegenden Konzepten mit Mercurial vergleichbar, welches ich bisher verwendet habe. Ich bin nach wie vor ein Fan von Mercurial, wollte aber aus verschiedenen Gründen auch einmal git und auch github ausprobieren.

more...

Log4xul - Erste Version fertig gestellt.

Ich habe nun eine erste Version von log4xul fertig gestellt und bei bitbucket hochgeladen. Bisher ist nur ein ein Log-Modus implementiert, bei dem die Meldungen ganz normal auf die JavaScript-Fehlerkonsole geschrieben werden. Ich habe als Log-Level DEBUG, INFO, WARN, ERROR sowie OFF vorgesehen. DEBUG ist für reine Debugging-Meldungen vorgesehen, die während der Entwicklung bei der Fehlersuche interessant sind. In der Regel könnte man diese Meldungen nach dem Finden des entsprechenden Fehlers wieder entfernen.

INFO ist für allgemeine Informationen zum Ablauf des Programms gedacht. Für Warnungen, die zwar kritisch sein können, jedoch das Programm nicht unbedingt am weiteren Ausführen hindern, ist das Level WARN gedacht. Sinnvoll ist dies auch beim Auftreten von Exceptions, die jedoch noch behandelt werden konnten.

Mit ERROR werden Fehlermeldungen gekennzeichnet, die ein weiteres Ausführen des Programms in der Regel unmöglich machen.

Die Level sind hierarchisch in der Reihenfolge DEBUG > INFO > WARN > ERROR > OFF gestaffelt wobei DEBUG das allgemeinste Level ist und alle anderen Level einschließt. Ist das Level beispielsweise auf DEBUG gestellt, werden alle Meldungen angezeigt. Ist das Level dagegen beispielsweise auf WARN gestellt, werden nur Meldungen der Stufe WARN und ERROR angezeigt, die darüber liegenden Meldungen der Stufe Info und Debug jedoch nicht.

Somit kann man beispielsweise während dem Entwickeln das Level auf DEBUG stellen und damit sämtliche Meldungen anzeigen lassen. Wenn die Entwicklung abgeschlossen ist, stellt man das Level zurück auf WARN und blendet damit alle DEBUG- und INFO-Meldungen aus und lässt nur die kritischen ERROR- und WARN-Meldungen anzeigen. Mit OFF wird das Logging komplett abgestellt.

Demo-Addon

Log4xul ansich ist kein Addon sondern nur eine JavaScript-Bibliothek, die in ein Addon eingebunden werden kann. Um dies zu demonstrieren, habe ich ein Demo-Addon geschrieben, welches die Bibliothek verwendet. Dabei sind in der GUI bereits weitere Logging-Modi (bei Log4j werden diese “Appender” genannt weshalb ich die Bezeichnung übernommen habe) vorgesehen, die aber erst noch implementiert werden müssen.

Man wählt in der Demo die Appender aus, die man testen möchte und stellt den LogLevel ein. Mit einem Klick auf “Log” wird die Meldung, die man in das Textfeld eingibt, geloggt. Intern werden dabei log-Aufrufe für alle Level ausgeführt, es werden aber nur die jenigen angezeigt, dessen Level eingestellt ist.

Um auf die Demo zuzugreifen muss diese mit der xpi-Datei installiert werden. Danach kann die Demo über die Adresszeile unter der URL “chrome://log4xul/content/log4xul_demo.xul” aufgerufen werden. Das Addon ist zwar prinzipiell kompatibel zur Firefox-Version 4, allerdings ist dort die JavaScript-Konsole wohl etwas umgebaut worden, sodass aktuell keine Meldungen angezeigt werden. Ausserdem fehlen noch Addons wie Console2 für FF4, die einen vernünftigen Umgang mit der JavaScript-Console bieten.

Zu finden ist das Addon inklusive der Bibliothek unter https://bitbucket.org/lestard/log4xul/overview

Viel Spaß beim Ausprobieren.

more...

Promote JS

Heute bin ich auf ein interessantes Projekt namens “Promote JS” aufmerksam geworden, welches sich zum Ziel gesetzt hat, gute JavaScript-Dokumentationen zu fördern. Das Problem ist dabei nicht, dass es nicht solche erstklassigen Dokumentationen gäbe, sondern dass diese bei der normalen Sucher in den Googleergebnissen ziemlich weit hinten erscheinen. In den ersten Ergebnissen sind dagegen meistens nur mittelmäßige, mit Werbung überflutete und unübersichtliche Hilfeseiten. Erstklassige Dokumentationen wie die vom Mozilla-Developer-Center (MDC) sind oft erst weiter unten zu finden.

logo

Da die Suchergebnisse bei Google bekanntlich unter anderem von der Anzahl der Verlinkungen abhängen, soll durch PromoteJS dazu aufgerufen werden, eben diese guten Dokumentationen auf dem eigenem Blog zu verlinken. Auf diese Weise soll die Dokumentation von MDC in den Suchergebnissen nach oben steigen. Da mir das MDC schon unzählige Male weiter geholfen hat und ich von der Qualität der Dokumentation überzeugt bin, halte ich das für eine gute Idee und möchte mich daran beteiligen. An der Seite gibts deshalb ab sofort einen Button, der auf ein Thema in der MDC-Dokumentation verlinkt.

Den Link zum PromoteJS-Projekt gibts hier: http://promotejs.com/

more...

Log4xul - Projekt bei Bitbucket angelegt

Vor kurzem hatte ich schon die Idee für ein XUL-Logging-Framework geäussert. In der vergangenen Woche habe ich schon ein wenig daran gearbeitet und bin auch zu ersten Ergebnissen gekommen. Ein solches Projekt macht aber natürlich nur dann Sinn, wenn es als OpenSource für jedermann zur Verfügung steht. Um das zu ermöglichen, habe ich heute bei bitbucket.org dafür ein Projekt erzeugt.

Für die, die bitbucket nicht kennen: Bitbucket.org ist eine Plattform zur gemeinsamen Entwicklung von freier Software, vergleichbar mit github oder dem etwas älteren sourceforge. Bitbucket setzt auf das verteilte Versionsverwaltungssystem Mercurial (kurz ‘hg’ genannt). Jeder kann den Programmcode online im Browser betrachten oder ihn sich per hg auf den eigenen Rechner ziehen.

Zum gegenwärtigen Zeitpunkt ist aber noch kein Code im Repository zu finden. Dies werde ich entweder heute Abend oder am Wochenende noch erledigen.

Die URL zum Projekt ist: https://bitbucket.org/lestard/log4xul

more...

Logging in XUL-Anwendungen

In meiner Freizeit bastel ich ja öffters mal mit XUL und Firefox-Addons herum. Da ich ja eigentlich Java-Programmierer bin, habe ich mich auch an die ein oder andere Annehmlichkeit gewöhnt, die dort üblich ist. Eine dieser Annehmlichkeiten ist das Logging, das ja quasi in jedem Projekt wie selbstverständlich mit benutzt wird.

Der Logger ist ein Programmteil, dem man einfache Meldungen mitgeben kann, welche dieser bei der Ausführung anzeigt. Man kann dabei verschiedene Wichtigkeits-Stufen für einzelne Meldungen bestimmen und so festlegen, ob eine Meldung nun “nur” ein Debug-Hinweis ist oder gar einen schweren Fehler anzeigt. Vor der Ausführung kann man dann auch einstellen, ob man diesmal nur schwere Fehler sehen möchte oder auch unwichtige Meldungen. Wenn man seine Software z.B. fertig zum Kunden gibt, sollte man diesen schließlich vor reinen Entwickler-Hinweisen verschonen, während man beim Entwickeln gerne die ein oder andere Statusmeldung sehen möchte.

Wie gesagt: In Java üblich, bei XUL aber zumindest in der Standardausführung des XUL-Runners nicht vorgesehen bzw. zumindest nicht in diesem Funktionsumfang. Bei meinen bisherigen Basteleien in XUL war einer der Ersten Schritte deshalb immer, mir erstmal eine eigene kleine Logger-Funktion zu schreiben, die Meldungen in einem Text-Feld in der GUI ausgibt. Den Funktionsumfang wie oben beschrieben hatte ich dabei natürlich nicht, obwohl das ja eigentlich schon auch praktisch wäre.

Aus diesem Grund bin ich der Sache mal nachgegangen und bin auf zwei Logging-Frameworks für JavaScript gestoßen. Zum einen Log4JS, welches ebenfalls wie Log4J - der Quasi-Standard bei JAVA - vom Apache-Team entwickelt wird. Zum anderen Log4JavaScript. Beide machten beim testen in einer Webseite eine gute Figur jedoch funktionierte die Einbindung in XUL nicht so wirklich. Das ist natürlich verständlich, da der Fokus der Frameworks natürlich bei HTML-Dokumenten liegt und diese darauf ausgelegt sind. Ein Großteil der Funktionalität der Frameworks wird für XUL auch nicht benötigt. So kann Log4JS z.B. Logmeldungen über AJAX an einen Server übertragen. Dies ist für Webseiten durchaus interessant, macht aus meiner Sicht für XUL-Anwendungen oder BrowserAddons aber wenig Sinn.

Die Überlegung ging deshalb in die Richtung, aus meinen eigenen kleinen Logger-Basteleien eventuell ein auf XUL angepasstes Logging-Framework zu entwickeln. Wenn die Freizeit das zulässt, wäre dies eins meiner nächsten Projekte.

more...

Konsolen-Spaceshooter in C++

Die letzten zwei Wochen habe ich an einem C’/C++-Kurs an der Hochschule teilgenommen und dabei einiges gelernt. In der zweiten Woche war es angedacht, während der Übungsstunden ein eigenes Projekt in C++ zu entwickeln. Ich habe mich dafür entschieden einen Konsolenbasierten Raumschiff-Shooter zu entwickeln. Man steuert sein Raumschiff und muss ankommende Gegner abschießen. Anfangs kommen nur einzelne Gegner ins Sichtfeld aber im späteren Spielverlauf werden es immer mehr. Der Spieler darf dabei keinen Gegner vorbei lassen und natürlich jeden Zusammenstoß vermeiden. Screenshot vom Spiel

Screenshot

Entwickelt habe ich das Spiel wie gesagt in C++. Wer sich den Quellcode anschauen möchte, kann dies natürlich gerne tun, da das Spiel wie immer als freie OpenSource-Software zur Verfügung gestellt wird. Leider war ich während der Übung auf die Hochschul-Rechner beschränkt, welche nur mit Windows laufen. Folglich ist das Spiel auf einem Windows-System entwickelt und kompiliert worden. Vermutlich ist es in diesem Zustand nicht unter Linux kompilierbar, da einige Windows-Spezifische Funktionen benutzt wurden. Wenn es die Zeit zulässt, möchte ich aber noch Linux-Kompatibilität sicherstellen.

Download Spiel + Sources

Link zum C-Kurs

more...

Mp3 nach Ogg konvertieren unter Linux

Neulich hatte ich das Verlangen, meine digitale Musiksammlung mal etwas genauer unter die Lupe zu nehmen und etwas auszumisten. Ich wollte nicht direkt die Musikdateien löschen sondern nur all die anderen Dateien, die dort noch so rumspuken und eigentlich nicht benötigt werden, wie z.B. Albumcover, Playlisten und Text/NFO-Dateien. Mit der Kommandozeile unter Linux und Befehlen wie

find . -type f -iname "*.mp3" | wc -l (gibt die Anzahl aller mp3-Dateien an)

war es leicht, ein paar Statistische Aussagen zu meiner Sammlung zu treffen. Letztlich musste ich feststellen, dass 95 % meiner Musikdateien im mp3-Format vorliegen und nur 1% im freien ogg-vorbis-Format. Damit war die Idee geboren, meine gesamte Musiksammlung in eben dieses freie Format umzuwandeln. Warum? 1. Weil ich es kann. 2. Weil ich es interessant finde, auf die suche nach (halb-)automatischen Möglichkeiten für diese Aufgabe zu gehen und 3. Weil Freie Formate Rocken.

Nun gibt es natürlich Programme, die solche Konvertierungen in einem Rutsch ausführen können. Dummer weise sind oft die Möglichkeiten der Einflussnahme etwas begrenzt. Vor allem die Bitrate bereitete mir Sorgen. Natürlich wird die Audio-Qualität bei so einem Vorgang nicht besser - im Gegenteil. Um dieses Problem möglichst gering zu halten, könnte man natürlich einfach alle Dateien mit 320 kbps oder mehr konvertieren. Nur stellt sich hier die Frage, ob sich das bei Dateien, die im Ausgangsformat lediglich 128 kbps besitzen, überhaupt lohnt. Der Unterschied bei der Dateigröße ist schließlich beträchtlich.

Ideal wäre also, wenn man festlegen kann, das z.B. Dateien mit einer Ausgangsbitrate von 128 kbps dann mit 192 kbps ins OGG-Format konvertiert werden. Dateien mit 192 Ausgangsbitrate werden nach 256 kbps gewandelt und Dateien mit höherer Bitrate (320 z.B.) bekommen eine noch höhere neue Bitrate.

Eine solche Abstufung erlauben die üblichen Programme leider nicht. Als Informatiker öffnet man bei solchen Gelegenheiten natürlich sofort die Entwicklungsumgebung und versucht etwas eigenes zu basteln. Ich habe mir in dem Zusammenhang zum ersten mal die Programmiersprache Python angeschaut. Nach einigem Rumprobieren bin ich dem Ziel sogar etwas näher gekommen - mein Script konnte alle Mp3s rekursiv einlesen und zumindest schonmal ins WAV-Format zwischenspeichern und die ID3-Tags aufheben. Die OGG-Konvertieren hätte hier nur noch angeschlossen werden müssen. Allerdings hat mich dann doch die Lust verlassen und ich habe mir vorgenommen, das ganze später weiter zubasteln.

Am Ende kam mir dann jedoch noch eine andere Idee: Foobar2000. Foobar ist nämlich nicht nur ein super Abspielprogramm sondern kann auch alle möglichen Formate in alle möglichen anderen Formate konvertieren. Und was hier wichtig ist: Ich kann natürlich auch meine gesamte Mp3-Sammlung auf einmal einlesen und dann nach der Bitrate Sortieren. Und schon kann ich selektiv konvertieren. Und direkt wurde mir wieder bewusst, wie sehr foobar2000 unter Linux fehlt.

more...

Musikplayer

Hin und wieder habe ich in der letzten Woche Zeit gefunden, um an meinem Musikplayer weiter zu werkeln. Der Grund, warum ich das Projekt wieder hervorgekramt habe ist, dass ich vor einiger Zeit sowohl auf dem Notebook als auch auf meinem PC komplett auf Linux Mint umgestiegen bin und Windows nur noch ein Schattendasein fristet und ich deshalb wieder aufs neue feststellen muss, dass die Linux-Musikplayer leider nicht meinen Geschmack treffen und Foobar2000 über Wine auch nicht sonderlich gut läuft.

Einen eigenen Musikplayer zu entwickeln ist allerdings auch nicht ganz so einfach. Vor allem die Grund-Funktionalität, nämlich das Abspielen einer mp3 ist nicht so ohne weiteres hinprogrammiert, zumindest wenn man wie ich wenig Ahnung von C oder C++ hat, denn mit bloßem JavaScript lässt sich keine Mp3 abspielen. Da mein Player aber in jedem Fall frei und OpenSource sein wird, ergeben sich einige Vorteile bei der Entwicklung. Ich kann auf Programmcode anderer freier Projekte zurückgreifen und mir anschauen, wie andere Leute das machen.

Es gibt ein paar ähnliche Projekte, die ebenfalls auf Mozillas XUL aufbauen. Hier ist als erstes natürlich Songbird zu nennen, der jedoch von seinem Konzept und der Funktionalität her nicht meinen Vorstellungen entspricht. Es war jedoch trotzdem interessant, den Quellcode zu lesen, allerdings ist es nicht so einfach, den Überblick zu behalten bei der großen Anzahl an Funktionen, die Songbird mitbringt.

Es existieren aber noch weitere freie Multimedia-Player auf XUL-Basis. “XULPlayer” ist ein universeller Video- und Audio-Player, der auf der MPlayer-Bibliothek aufbaut. Leider wird der XULPlayer auch nur für Windows entwickelt.

Eine weitere Alternative wäre XULMusic, der noch am ehesten meinen Vorstellungen entspricht, wenn es darum geht, auf dem Code aufzubauen. Leider ist genau dieser nicht mehr Verfügbar. Zwar kann man auf den XUL- und JavaScript-Code direkt zugreifen, da dieser ja nicht kompiliert wird, jedoch auf den Code der zugrunde liegenden GStreamer-Bibliothek kann nicht so einfach zu gegriffen werden. Leider funktioniert die Version nicht korrekt, was vermutlich daran liegt, dass dieses Projekt schon ein paar Jahre ohne Aktualisierungen auf dem Buckel hat.

Aktuell teste ich deshalb einige Varianten, um innerhalb einer XUL-Applikation Audio-Dateien abzuspielen und dies per JavaScript zu steuern.

more...

Snake Game in JavaScript

Die Langeweile am Wochenende hat mich dazu gebracht, einen Snake-Klon zu schreiben. Wer einmal ein altes Nokia-Handy besessen hat. kennt das Spiel sicher noch, aber auch auf anderen Plattformen ist das Spiel - manchmal in Abgewandter Form - anzutreffen. Aktuell gibt es im Netz jede Menge Flash-Klone und auch im Ubuntu-Repository befinden sich einige Varianten (KTron z.B.).

Wirklich zufrieden bin ich damit aber nicht so ganz. Oft wird das simple Spielkonzept durch anderes Zeugs erweitert oder gar verfälscht. Ich persönlich mag da lieber das alte simple Snake haben. Eine Schlage, ein Spielfeld an dessen Rändern man durch schlüpfen kann um an der anderen Seite wieder heraus zu kommen und ein einfaches kleines Etwas, das man fressen kann um zu wachsen.

Hier gibt es zwar Flashvarianten, die genau das mitbringen aber … naja es ist halt nur Flash. Irgendwie Uncool halt. Deshalb und vor allem eben wie Eingangs erwähnt aus Langeweile hab ich mich an eine HTML+JavaScript-Variante gesetzt.

Das Spiel funktioniert soweit, es kann aber sein, dass noch hier und da Fehler stecken. Zwar ist es bei dieser Art von Onlinegames für die meisten unerheblich aber ich sags trotzdem dazu: Der Quellcode steht natürlich frei zur Verfügung und kann von jedem angeschaut und verändert werden. Auch kann das Spiel gerne auf eigene Webseiten hochgeladen werden. Über Feedback freue ich mich natürlich auch sehr. Viel Spaß

Link zum Spiel

more...