BlackBody spectrum generator

Ich habe ein kleines Tool zum Erstellen von Schwarkörper-Spektren erstellt. Das Tool inklusive Binary (zur Zeit nur x64) ist auf GitHub.

Screenshot vom Tool
Screenshot vom Tool

Es kann gleich mehrerer Graphen in einem Plot darstellen.

Beispielspektrum
Beispielspektrum

Geschrieben in Qt4, mit QCustomPlot, eine sehr praktisches Widget im Übrigen, das ich nur empfehlen kann!
Das vorkompilierte Binary ist für Linux 64 gemacht. Noch sind keine weiteren Binaries verfügbar.

English version

I have written a small tool to create custom blackbody spectra using Planck's law.

The tool (Qt4 using QCustomPlot)is available on GitHub. Binaries for Linux (x64) also included on GitHub.

Planck function snippet

The following C++ snipped implements the Planck function. It has found it's way to this blog because of I want to archive it

Have phun!

Einfaches C++ Socket

English version below

Ein weiteres C++ Template für Linux ist fertig: TcpSocket und TcpServerSocket. [Download]

Beides sind sehr einfache Implementierungen für Character-Stream Sockets unter Linux. Sie implementieren istream und ostream, daher kann ähnlich wie auf den Standart-input und Standart-output operiert werden.

Netter Screenshot
Netter Screenshot

Das Archiv inklusive kleinen Beispielprogram (ECHO-Server und Client) steht unter MIT-Lizenz im Repository. Direktlink für den Download hier.

English

I've create a new, very usefull C++ Template: Implementation of a simple and easy-to-use Tcp socket for character streams (Linux only currently). [Download]

What make it so beautiful is the simplicity: It comes basically without dependencies, is C++11 compliant (and you should use the C++11 Standart!) and implements the istream and ostream basic classes.
Reading and writing data from and to your socket becomes as easy as reading to stdin and stdout.
But see this simple example snippet:

The download of the socket package (including a small example program) is in the repository. Or you use the directlink here.

Keywords: C++, Cpp, Linux, TCP, Socket, Server, Client, istream, ostream, Easy TCP, Simple TCP

osmpng

English version below

Für mein SEGeo-Projekt habe ich gerade an einem neuen Tool gebastelt: osmpng

osmpng erstellt große PNG-Karten basierend auf den Kartenmaterial von OpenStreetMap (OSM).
Im Grunde lädt es kleine Kartenausschnitte von OSM-Servern herunter und erstellt aus diesen Teilausschnitten ("tiles") dann eine große Karte.

osmpng lädt einen Kartenausschnitt herunter
osmpng lädt einen Kartenausschnitt herunter

Getestet habe ich das Tool mit einem recht großen Kartenausschnitt von Innsbruck. Resultat ist eine tadellose PNG-Datei von etwa 50MB. Straßennamen und Häusernummer sind klar ersichtlich, lediglich das Laden der Datei ist etwas mühsam 🙂

Das Tool ist ein eigenes Repository auf GitHub und auf der osmpng-Seite des Blogs.

 

English version

My SEGeo-Project is growing. Today I've written a new tool for the project: osmpng.

osmpng is a simple C++ program that creates arbitrary huge PNG maps based on the data of OpenStreetMap (OSM).
In particular it downloads small map pieces ("tiles") from OSM servers and merges them to a single, possibly giant map.

The test osmpng was a ~50MB big PNG map of Innsbruck (Austria). Street names and house numbers are clear visible, only the loading of the PNG file was a bit annoying.

osmpng is found as a repository on GitHub and at the osmpng page of the blog.

Mit dem Raspberry Pi Internet Radio horchen

Ein weiterer Einsatzzweck für euren Raspberry: Empfangsstation für Internet-Radio!

Wir realisieren das ganze mit dem Music Player Daemon und einem schicken kleinen Webinterface

Web Interface um die Radiostation zu steuern
Web Interface um die Radiostation zu steuern

Los gehts!

Wir brauchen für den Betrieb drei Pakete: alsa-utils, mpd und mpc

Bei der Installation vom Music Player Daemon (mpd) taucht folgende Fehlermeldung auf, die wir getrost ignorieren können

Starting Music Player Daemon: mpdlisten: bind to ‘[::1]:6600′ failed: Failed to create socket: Address family not supported by protocol (continuing anyway, because binding to ’127.0.0.1:6600′ succeeded)
Failed to load database: Failed to open database file “/var/lib/mpd/tag_cache”: No such file or directory

 Der Dienst läuft nun. Wir müssen ihn nur noch konfigurieren. Dazu editieren wir die Datei /etc/mpd.conf wie folgt:

  • bind_to_address "localhost" mit bind_to_address "127.0.0.1" erstetzen
  • Auskommentieren von audio_buffer_size  und buffer_before_play

Die Änderungen werden erst nach einem Neustart vom mpd wirksam.

Als nächstes müssen wir noch die Radiosender einstellen. Dies geschieht über eine Playlist. Dazu legen wir die Datei /var/lib/mpd/playlists/radio.m3u an. Die Datei beinhaltet lediglich Links zu den Radiosender und kann ganz einfach geschrieben werden:

Eine passable Auswahl an Radiosender findet sich unter http://www.surfmusik.de/

Um die Musik zu starten, muss noch die Playlist geladen werden und der (erste?) Eintrag abgespielt werden. Dazu gebt ihr einfach in die Konsole ein

Beachte: mpc load Lädt m3u-Playlists (ohne Erweiterung eingeben!) vom Ordner /var(lib/mpd/playlist. Die Eingabe von mpc load radio ist damit absolut ausreichend!

Schickes Webinterface

Ich verwende das MPD-Webinterface von sn0opy (GitHub). Die Lösung benötigt einen Webserver mit PHP.

Wir müssen das ganze Downloaden und ins /var/www-Verzeichnis packen. Ich benenne den Ordner noch um, damit ich das ganze unter raspberry/radio finden kann

Fertig 🙂

Fix Ubuntu

Ubuntu ab Version 12.10 wird datenschutzrechtlich bedenklich. Jede Eingabe im Dashboard wird an Drittanbieter gesendet, mehrere davon (z.B. Amazon) benuzten die Daten für personalisierte Werbung.

Abhilfe verschafft das Projekt Fix Ubuntu mit dem folgenden Shell-Script

Das Script ist hier auf meinem Blog ge-mirrored.

MTP in Ubuntu 12.04 und 12.10

Bei neueren Androiden ist der Zugriff auf das Dateisystem mittels einer USB-Partition nicht mehr möglich. Google entschied sich, das von Microsoft und Canon vorgestellte MTP Protokoll einzubauen, das leider nicht bei allen Betriebssystemen einwandfrei Out-of-the-box unterstützt wird.

 

Abhilfe in Ubuntu 12.04 und 12.10

Dieser Workaround geht über ein Update des virtuellen Gnome Filesystems gvfs.

Eine direkte Implementierung ist erst in Ubuntu 13. 04 "Raring Ringtail". Bis dahin, und bis sich ein Umstieg lohnt steht jedoch ein PPA für 12.04+ zur Verfügung, in dem das ganze nachinstalliert werden kann. Folgende Befehle sollten das ganze nachinstallieren:

sudo add-apt-repository ppa:langdalepl/gvfs-mtp
sudo apt-get dist-upgrade
sudo apt-get upgrade

Abmelden und neu anmelden sollte das ganze aktivieren. Ein Neustart ist meistens nicht erforderlich.

Ich habe das Procedere auf meinem Lenovo x220 Tablet und einem Samsung Galaxy Note 2 Tab getestet. Funktioniert ohne Probleme

Zurücksetzen

Einfach das PPA wieder entfernen und das Dateisystem gtvfs downgraden:


sudo ppa-purge ppa:langdalepl/gvfs-mtp
sudo apt-get update

Fertig! 🙂

Achtung: Windows 8, NTFS-3G und Schnellstart

Achtung: Der Zugriff auf eine NTFS-Partition von Windows 8 kann zum Datenverlust führen, wenn das Schnellstart-Feature von Windows 8 aktiviert wurde.

Konkret: Ein Teil der Metadaten aller Partitionen wird nach dem erneuten Booten von Windows wiederhergestellt. Werden diese Metadaten wiederhergestellt, sind Änderungen die nach dem Herunterfahren von Windows gemacht wurden, nicht mehr sichtbar. Folglich könnten dadurch alle neu erstellten Datein, die in Linux erstellt/gelöscht/bearbeitet wurden, verloren gehen.

Einer der Entwickler des NTFS-3G Treibers spricht die Problematik auf seiner Homepage an.

Workaround

Schnellstar-Feature unter Windows deaktivieren. Als Administratur muss dazu folgender Befehl in einer Kommandozeile ausgeführt werden

powercfg /h off

 

http://www.heise.de/open/artikel/Die-Woche-Gefahren-beseitigen-nicht-ignorieren-1780899.html

 

Hello World Kernel Module

Heute geht's um Linux Kernel Module.

Ich zeige euch, wie ihr ein ganz simples "Hello World!" Modul erstellen könnt.

Ich benutze die Shell und einen Texteditor. Mehr brauchst du nicht für dein erstes Kernel-Modul!

 

Benötigte Vorkenntnisse

  • Linux - sudo und Root-Rechte
  • Texteditor
  • gcc
  • Makefile
  • C

Los geht's!

Und wir legen los. Am besten erstellst du ein neues Verzeichnis (ich arbeite im temp/hello_kernel Ordner) für das ganze

Und genau hier wird nun die datei module.c mit dem folgenden Inhalt erstellt. Die Datei könnt ihr hier downloaden.

Damit öffnet ihr vi als Texteditor und schreibt nun folgenden Inhalt in die Datei (i eingeben, um in den INSERT-Mode zu kommen).
(Randbemerkung: Hier gibt die Vi-Cheat Sheats. Ausdrucken und an die Wand nageln!!)
#include <linux/module.h>
MODULE_AUTHOR("Flex");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("Hello World module");
static int start__module(void) {
/* Use printk for debug prints of a kernel module */
printk(KERN_INFO " *** Hello linux! *** \n");
/* There are eight Loglevel-Strings, defined in <linux/kernel.h> */
/* (More precise: /linux/printk.h) */
/*
* #define KERN_EMERG
* #define KERN_ALERT
* #define KERN_CRIT
* #define KERN_ERR
* #define KERN_WARNING
* #define KERN_NOTICE
* #define KERN_INFO
* #define KERN_DEBUG
*
*/
/* Always use return 0 instant of EXIT_SUCCESS. On the
* kernel level, we return with 0 on success!
*/
return 0;
}
static void end__module(void) {
printk(KERN_INFO " *** Hello module exit *** \n");
}
/* This pointers design the entrance end exit functions of the module */
module_init(start__module);
module_exit(end__module);

Die Kommentare sollten für sich sprechen. mit STRG+C wechselt ihr in den Kommando-Modus von vi, und mit

Wird die Datei geschrieben und vi geschlossen.

Nur brauchen wir noch eine Makefile. Die Datei könnt ihr hier downloaden. Los gehts:

mit dem folgenden Inhalt

obj-m := module.o
PWD := $(shell pwd)
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean

 

Auf den genauen Inhalt will ich jetzt hier nicht eingehen. Betrachtet es einfach mal als von Gott gegeben, und benutzt die File. 😉

OK, nun wird das Modul kompiliert:

Fertig! Die Modul-Datei ist die module.ko, die brauchen wir nun.

 

Modul einbinden

Wir benutzen insmod mit Superuser-Rechten. Unter Ubuntu läuft mit sudo alles wunderbar

Und überprüft, ob das Modul geladen wurde

Sollte euch euer geladenes Modul anzeigen.

 

Nun wollen wir aber noch den Output vom printk anschauen. Das tool dazu ist dmesg. Wir pipen dmesg an tail, damit wir nur die letzten Zeilen erhalten.

gibt euch hoffentlich soetwas ähnliches wie die folgende Zeile aus:

Say hello to your little friend 🙂

 

Modul entfernen

Fertig. Wir pipen wieder dmesg an tail (Aber mit zwei Zeilen, damit wir sehen, wie lange das Modul gelaufen ist)

das Resultat schaut (hoffentlich) ungefähr so aus

Und so schaut das ganze am Bildschirm aus

Viel Spass beim Kernel-Hacking 🙂

Diavolino und Ubuntu

Diavolino. Von Evil Mad Science.

Das Diavolino ist ein freier, programmierbarer Mikrocontroller. Er ist Arduino-Kompatibel und muss selber zusamengelötet werden. Vorteile gegenüber einem zusammengebastelten Arduino

  • billiger (wenn man einen FTDI-Kabel/FTDI-Friend! besitzt)
  • Komponente können bei Bedarf aufgemotzt werden
  • Löten macht Spass 🙂

Zum Beginnen empfehle ich trotzdem einen Arduino. Ich habe selbst gemerkt, dass vor allem in der Anfangsphase etwas Frust unausweichlich ist ...

Karge beiliegende Beschreibung, die völlig ausreicht. Sofern man schon einmal gelötet hat ...

Nach ein paar wirklich nicht schweren Lötarbeiten, sollte der Controller fertig sein. Nochmals: Zum Einstieg Arduino verwenden. Diavolino ist sehr cool, aber man sollte vorher schon mal gelötet haben und sich mit dem Arduino auskennen, sonst ist Frust vorprogrammiert.

Assembly done. Diavolino rocking for action!

 

Diavolino und Ubuntu

Leidiges Kapitel. Hat mich etwa 2 Wochen gekostet bis ich das Teil endlich laufen hatte. Bis zum Schluss waren doch ein paar Tweak nötig, die ich hier kurz festhalten.

Ich gehe hier davon aus, dass der Leser sich bereits grundlegend mit dem Arduino auskennt sund schon mal ein Sketchbook kompiliert und geuploaded hat. Ansonsten könnt ihr das hier nachlesen.

OK. Zunächst braucht ihr einen FTDI Kabel oder ähnliches. Ich verwende den FTDI Friend! von Adafruit.
Damit ist zunächst einmal eine physische Verbindung zum Diavolino möglich. Leider funktionierte diese von Haus aus nicht mit dem Arduino von Ubuntu.

Ein Upload zum Diavolino endete stets mit

oder mit

Zunächst einmal wurde der FTDI-Friend nicht erkannt. Merkbar daran, dass das ls /dev/tty*-Kommando mit zwar mein Arduino angezeigt hat (ttyACM0), aber keinen FTDI-Friend (später als ttyUSB0)

ttyACM0 wird angezeigt, ttyUSB0 scheint nicht da zu sein.

Nach ein paar Recherchen hat mir dieser Beitrag geholfen, den FTDI Friend! mit Ubuntu zu koppeln:
Zunächst Vendor und Produkt-ID mit lsusb rausfinden

Notieren. Bei mir ist das also (Achtung! In HEX)

VENDOR-ID: 0x0403
PRODUCT-ID: 0x6001

Diese mit modprobe benutzen, um das ftdi-sio Kernel Modul richtig zu laden

Ohne vendor=0x0401 und product=0x06001 hat's bei mir nicht geklappt. Danach war jedoch ttyUSB0 zu finden:

Hurra! Doch ich hatte noch ein Problem: Auf ttypUSB0 konnte Arduino nicht schreiben. Merkbar daran, dass ttyUSB0 nicht unter "Tools->Serial Port" auftauchte ... Ein simples chmod reicht.

OK, ist grundsätzlich nicht gut, dass ALLE Benutzer lesend und Schreibend darauf zugreifen können. Consider it a temporary hack, and this should be removed soon! 😉

Viel Spass!