08 März 2010

GPS-Skyview mit GnomeCanvas und Ruby

Um mir GnomeCanvas mal ein bisschen anzusehen und das ein oder andere auszuprobieren hab ich mal ein kleines Testprogramm zusammengebastelt, das aus den Daten von gpsd einen Skyview erstellt, wie man ihn z.B. aus xgps kennt. Für die Daten habe ich dabei das gps gem von Nolan Darilek benutzt, das leider von sich aus nur die Anzahl der zur Zeit "aktiven" Satelliten durchreicht. Ich habe die Schnittstelle, die sich die Daten von gpds via localhost:2947 holt, also etwas aufgebohrt, damit ich schließlich auf die vollständige Liste der Satelliten (incl. PRN, SNR, Elevation, Azimuth) zugreifen konnte.

In meinem kleinen Programm werden die Satelliten dann als Ellipsen dargestellt, die zur Positionsbestimmung aktiven Satelliten mit schwarzer Umrandung, die anderen mit grauer (im Bild z.B. die 28). In der Ellipse wird jeweils die PRN angezeigt, je nach SNR sind die Ellipsen rot, gelb oder grün gefüllt. "Abhanden gekommene" Satelliten werden mit ihrer letzten Position in grau dargestellt (im Bild z.B. 2 und 4). Unter dem Canvas befindet sich noch ein Label mit der aktuellen Uhrzeit und lat und lon.

Die Umrechnung von Elevation und Azimuth ins karthesische Koordinatensystem hab ich aus dem Plasmoid GPSD client von "palo" von C++ nach Ruby übersetzt, auch das kleine Satelliten-Window-Icon stammt aus diesem Programm.

Die verwendeten Programme und Codeschnipsel stehen zwar alle unter GPL, ich werde mein Resultat trotzdem nicht veröffentlichen - u.a., weil mein Script ein schrecklich unsortierter Codehaufen ist, aber es tut. Wer trotzdem Interesse an meinem kleinen Script haben sollte, darf sich aber gerne melden.

Sollte ich demnächst (hoffen wir mal auf den Frühling und nettere Temperaturen) mal wieder mit Fahrrad, Netbook und tangoGPS unterwegs sein, nehm ich mein kleines Script natürlich mit.

Labels: , , ,

05 Dezember 2009

Ruby, GTK und TreeView

Aus aktuellem Anlaß habe ich mir mal angesehen, wie man mit Ruby und Gtk eine GUI zusammenschraubt. Ein Teil der Daten, mit denen ich arbeite, soll tabellarisch angezeigt werden, weshalb ich mich damit beschäftigt habe, wie man so eine Tabelle baut und mit Daten füttert. Als kleine Beispielanwendung hab ich mir eine Wettervorhersage geschrieben, die ihre Daten (für Trier) per RSS von yr.no bezieht. Den mit RSS::Parser.parse ausgelesenen Feed habe ich mit ein paar Datumsmethoden, Stringmethoden und regulären Ausdrücken vorverarbeitet und ins Deutsche übersetzt, diese Daten werden dann im GUI als Tabelle angezeigt.
Als Grundgerüst gibt es erst einmal ein normales Fenster mit Gtk::Window.new mit dem einzigen verbundenen Event für ein Gtk.main_quit, darin dann ein Gtk::ScrolledWindow - also alles ganz simpel und beispielhaft gehalten.
Die eigentliche Tabelle als Gtk::TreeView liegt in dem Scrollfenster und beinhaltet vier einfache Textspalten und eine, in der zusätzlich ein Icon angezeigt wird. Für die Texte nutzt man den Gtk::CellRendererText, für das Icon den Gtk::CellRendererPixbuf. Die ganze Spalte wird dann z.B. so erzeugt:

spalte = Gtk::TreeViewColumn.new # neue Spalte
spalte.title = "Wetter" # Spaltentitel setzen
renderer_pix = Gtk::CellRendererPixbuf.new # renderer für das Icon
spalte.pack_start(renderer_pix, false)
spalte.add_attribute(renderer_pix, 'pixbuf', 1) # Icon zur Spalte hinzufügen
renderer_txt = Gtk::CellRendererText.new # renderer für den Text
spalte.pack_start(renderer_txt, true)
spalte.add_attribute(renderer_txt, "text", 2) # Text zur Spalte hinzufügen
treeview.append_column(spalte) # Spalte zum treeview hinzufügen

Für unsere Daten legen wir dann einen einfachen Gtk::ListStore an, in diesem speziellen Fall mit store = Gtk::ListStore.new(String, Gdk::Pixbuf, String, String, String) für die vier Strings und das Icon. Das letzte Attribut in spalte.add_attribute (s.o.) steht dann jeweils für die Position der Daten in dem ListStore.
Die Daten werden Zeile für Zeile mit store.append und store.set_value (einfach per each) in den ListStore geschrieben und danach das Model mit dem View verbunden (treeview.model = store).
Wie man auf dem Bild erkennen kann, werden dann die Wetterdaten in den entsprechenden Zeilen und Spalten der Tabelle angezeigt. Die zweite Spalte enthält den Text aus dem Store (Index 2) und das Icon (Index 1). Die dritte und vierte Spalte sind mit set_property('xalign',1.0) (an den Renderer) jeweils rechtsbündig ausgerichtet.
Die Icons stammen aus dem schönen silk iconset von famfamfam.com.
Tutorials gibt es beim Ruby-Gnome2 Projekt: The TreeView Widget und Ruby/GTK Treeview Tutorial.

Labels: , , , ,

16 Oktober 2009

Neues vom OCR Feeder

...es gibt Neuigkeiten vom schönen Programm OCRFeeder, das ich hier schon einmal ausprobiert hatte. Damals ging es insbesondere darum, wie man in OCRFeeder Tesseract als OCR-Engine benutzen kann und ich kam um ein bisschen Gebastel nicht drum rum.
Renard Voß hat mich nun netterweise in den Kommentaren des alten Artikels darauf aufmerksam gemacht, daß Joaquim Rocha noch an dem Programm arbeitet: Inzwischen gibt es ein git-Repository und neuere Versionen des Programms arbeiten nun auch ohne viel Aufwand mit Tesseract zusammen, worauf Rocha auch in seinem Blog hinweist - hatte ich bislang leider übersehen. Den Hilfswrapper von damals kann man nun also ruhig in die Tonne schieben - es genügt nun, für Tesseract eine funktionierende Konfigurationsdatei zu erstellen (geht auch per GUI).
Anbei ein Screenshot von OCRFeeder Studio mit dem OCR-Ergebnis von Tesseract.

Update: Inzwischen gibt es in den Repos auch eine deutsche Übersetzung. Außerdem lohnt es sich, hier auch die Kommentare zu lesen (Installation/OCR dt. Texte/Sonderzeichen).

Labels: , , , ,

10 März 2009

OSM 3D

...neulich hab ich mich noch gefragt, ob es wohl ein verfügbares Geländemodell von Deutschland gibt, das man mal mit den OpenStreetMap-Daten verschneiden könnte. Daß diese (zugegeben naheliegende) Idee nicht von mir stammt, zeigt mein heutiger Internetfund: Die Kartographie in Bonn arbeitet an einer offenene (juhu!) 3D-Geodateninfrastruktur für Deutschland und nutzt dabei die Daten von OSM und SRTM. Besonders hübsch: Für so 'show and tell'-affine Leute wie mich liegt sogar schon ein (durch Java Webstart) nutzbares Programm (XNavigator) bereit. Das Laden der Daten durchs Netz dauert zwar noch ein wenig und die GUI rendert bei mir auch teils falsch, aber das sind ja alles Kleinigkeiten... Hach, sowas freut mich irgendwie immer.
(Bild: Screenshotausschnitt XNavigator)

Labels: , , , ,

15 Januar 2008

plotdrop

...auch sehr praktisch ist das kleine Programm plotdrop, mit dem man schnell und einfach (per drag, drop und plot) Dateien mit irgendwelchen berechneten Daten an gnuplot weiterreichen kann, um sich mal eben den Graph anzusehen.
Das Bild zeigt das plotdrop-GUI und den resultierenden gnuplot-Graph. Der Graph zeigt (soweit ich mich richtig erinnere) die Wachstumsrate der Token in Kafkas 'Blumfeld'.
Wörterzählen ist ein schönes Hobby - vielleicht nicht ganz so ekstatisch und alpin wie Gipfelmoshen, aber sicherlich schonender für den Nackenwirbelbereich.

Labels: , ,

16 November 2007

GUIuiui


...heute bau ich mir mal ein kleines GUI für ein ebenso kleines PHP-CLI-Script. Nur so - um zu sehen, wie das so geht. Als Script habe ich ich hier 42 Zeilen PHP, die eine einfache Textdatei einlesen, die Daten umwandeln und in eine andere Textdatei schreiben. Die Namen der Dateien werden als Parameter übergeben. Nur zur Info: Die Ausgangsdaten sind eine zeilenweise Liste von Part-of-Speech-Tags, die erzeugte Datei ist eine Sequenzdatei, die man dem esthmm-Programm (Hidden Morkov Model) aus Tapas Kanungos UMDHMM-Paket übergeben kann. Das GUI bastel ich mit dem Kommander Dialog Editor - der liegt hier eh rum und mit dem klick ich mir jetzt ein paar Bedienelemente zusammen. Was wird gebraucht? Je ein FileSelector ('infile' und 'outfile') für die Auswahl der Ein- und Ausgabedatei, ein Knopf, der das Script starten soll und dann noch zwei Textfelder zur Anzeige der Dateiinhalte. In den Kommander Text des Knopfes kommt die Scriptausführung mittels @exec(php pos2seq.php -i @infile.text -o @outfile.text) - das Script pos2seq nimmt die Parameter -i und -o, @infile.text und @outfile.text sind die Dateinamen, die die Fileselektoren infile und outfile zurückliefern. Jetzt noch dafür sorgen, daß die Textdateien in den Textfeldern angezeigt werden. Das erste Textfeld verbinden ich mit dem ersten Fileselector - als Signal TextChanged, als Slot populate das Textfeld fülle ich bei populate mit @File.read(@infile.text), also dem Inhalt der ausgewählten Datei. Nun binde ich noch das zweite Textfeld an den Knopf und erstelle eine Connection, die dieses Textfeld löscht, wenn eine andere Ausgabedatei ausgewählt werden sollte. Fertig. Und hübsch. Das GUI funktioniert auch tatsächlich - man übergibt dem kmdr-executor einfach die kmdr-Datei - das Bild zeigt das Ergebnis nach Scriptaufruf.

Labels: , , , ,