Mehrere Bildschirme mit dem Thinkpad W530

Eines der nervigsten Bastelthemen die mich jemals beschäftigt haben war die Konfiguration dieses Laptops für den Linuxbetrieb. Die Installation von Debian verlief problemlos – das Thinkpad wollte jedoch auf Gedeih und Verderb nicht mit mehreren Displays arbeiten. In dem Thinkpad arbeiten 2 Grafikkarten, eine von Intel und eine NVIDIA Optimus. Da mir das Umschalten mit Bumblebee zu umständlich war habe ich im BIOS die NVIDIA Karte als Default ausgewählt – siehe Screenshots und den proprietären NVIDIA Treiber installiert.

Diese Konfiguration läuft jedoch nur bedingt – ab und an bootet das System und manchmal leider nicht. Das Stichwort lautet waiting for /dev to be fully populated. Die Lösung ist dieses Problems ist absolut logisch und selbst für den Laien verständlich – im BIOS einfach die Virtualisierung deaktivieren und alles ist gut.

Da ich die letzten 12 Monate wenig Zeit und noch mehr Arbeit hatte begleitete mich dieses Problem wirklich sehr lange – zeitweise mußte ich sogar einen sehr bizarren KDE Klon zum Arbeiten verwenden.

Die Früchte dieser merkwürdigen Konfigurationsarbeit sehen dann so aus:

 

4 mal Slayer

 

2 Displays sind via DisplayPort angeschlossen und eines über VGA. Einen sinnvollen Verwendungszweck habe ich für soviele Displays noch nicht gefunden. Aber auf 3 Screens läßt sich wunderbar Java schreiben:)

Howto – Daydream / Screensaver App erstellen

Ab Android 4.2 – Api Level 17 bietet Android die Möglichkeit mit Daydream einen Screensaver einzurichten. Daydream startet wenn das Gerät
am Netz hängt oder in einer Dockingstation steckt. Daydream kann man in den Systemeinstellungen unter Display -> Daydream aktivieren.
Ich beschreibe an dieser Stelle wie man einen einfachen DayDream Service implementiert der bei Aktivierung ein Video abspielt, damit alles schön übersichtlich bleibt.

Daydream wird als Service implementiert der von android.service.dreams.DreamService erbt, man hat den vollen Zugriff auf die UI, kann also Layouts, Canvas, 3d und Animationen nutzen.

Manifest

Im Manifest muß nur der Service deklariert werden. Falls ein Settingsmenü benötigt wird muß die Klasse im Meta gesetzt werden gesetzt werden.

<service
    android:name=".VideoDreamService"
    android:exported="true"
    android:label="@string/my_daydream_name" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
 
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
 
    <meta-data
        android:name="android.service.dream"
        android:resource="@xml/dream_info" />
</service>

Layout

Zum einfacheren Testen benutze ich ein ganz normales Layout mit einer VideoView .

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity" >
 
    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />
 
</RelativeLayout>

Service

In meinem Beispiel wird ein Video ohne Ton in einer Endlosschleife abgespielt.

package de.schmitt.michael.daydream;
 
/******* imports ***********/
/** ...**/
 
public class VideoDreamService extends DreamService {
 
 
	public void onDreamingStarted() {
		super.onDreamingStarted();
 
		setContentView(R.layout.activity_main);
 
 
		VideoView vv = (VideoView)findViewById(R.id.videoView1);
		vv.setVideoURI(Uri.parse("android.resource://" + getPackageName() +"/"+R.raw.video));
 
		Log.i(TAG,  Environment.getExternalStorageDirectory().toString());
		Log.i(TAG,  getApplicationContext().getPackageName() );
		vv.setOnPreparedListener(new OnPreparedListener() {
		    @Override
		    public void onPrepared(MediaPlayer mp) {
		        mp.setLooping(true);
 
		    }
		});
 
		vv.setSoundEffectsEnabled(false);
 
		vv.start();
	}
	public void onDreamingStopped() {
		// Wird aufgerufen wenn der Service beendet wird. 
 
        }
 
}

Links

http://android-developers.blogspot.de/2012/12/daydream-interactive-screen-savers.html

Node.js Notizen & Mongodb – Konfiguration + Tools

Im Moment schaue ich mir Node.js und Mongodb. Hier sammle ich für mich nützliche Informationen bzgl. der Einrichtung und Konfiguration.
Der Webspace kommt von Uberspace, entsprechend sind ein Paar Links in das ordentlich geschriebene Wiki von denen drin.

1. Einrichtung Uberspace

Anweisungen im Wiki folgen

Subdomain

Node Applikation auf Port 80 weiterleiten:

[schmimi@ara node.radikalblogger.de]$ cat .htaccess
RewriteEngine On
RewriteRule (.*) http://localhost:61667/$1 [P]

2. NPM konfigurieren

cat >  ~/.npmrc >> __EOF__
prefix = $HOME
umask = 077
__EOF__

 

3. Watch for Filechanges

Sehr praktisch zum entwickeln ist Supervisor

npm install supervisor -g
#Nun das Script mit dem Befehl supervisor starten.
[schmimi@ara ~]$ supervisor node/example.js

4. Node.js Tutorials

5. Mongo DB konfigurieren

Anleitung im Uberspace Wiki
Mongodb Handbuch

User und Datenbank anlegen

[schmimi4@octans nodejs]$ mongo admin --port 20522 -u schmimi4_mongoadmin -p
MongoDB shell version: 2.4.8
Enter password: 
connecting to: 127.0.0.1:20522/admin
> use node-mongo-blog
switched to db node-mongo-blog
use products
db.addUser( { user: "Alice",
              pwd: "Moon1234",
              roles: [ "readWrite", "dbAdmin" ]
            } )
> quit

Verbindung testen

mongo node-mongo-blog --port 20522 -u mongoblog -p

Datenbank löschen

> use mydb; 
> db.dropDatabase();

Ein (aus Anfängersicht) brauchbares Webinterface um mit der Datenbank rumzumachen scheint RockMongo zu sein. Konfiguration problemlos.

6. Auf Produktivbetriebumstellen

Interessanter Blogartikel

[schm@bla blog]export NODE_ENV=production

Led Lampen mit WLAN Anbindung

Ein Thema das mich immer wieder fasziniert ist die Vernetzung von Gegenständen des Alltags. Meine Wohnzimmerlampe glänzt nicht nur durch hässliche Form sondern auch durch kaltes Licht und Quecksilber im Leuchtmittel. Deshalb ersetze ich nach und nach Kompaktleuchtstofflampen durch LED Lampen. Der Zufall brachte mich zu diesem Lampenset mit WLAN Anbindung (Affiliate) vom Hersteller LimitlessLED. Die Lampen passen in E27 Sockel, haben 6 Watt Leistung und können mit 230V ~  betrieben werden. Die Grundidee ist die Lampen via Smartphone oder auf anderen Wegen einzuschalten, die Farben zu ändern und dimmen.Neben den 3 Lampen werden eine Fernbedienung und was viel interessanter ist einem Controller mit dokumentierter API geliefert. Apps gibt es auch! Pro Fernbedienung und Controller kann man 4 Lampen steuern. Dabei kann man die Parameter Helligkeit, Farbe regeln.

2013-10-15 16.56.18

 

Impressionen

Inbetriebnahme

Lampen

Jede Lampe muß konfiguriert werden. Dabei spielt es keine Rolle, ob man sie der Fernbedienung oder in der App konfiguriert.

Lampe in Fassung drehen und binnen 2 Sekunden nach Anlegen von Spannung auf der Fernbedienung einen Kanal aktivieren – die Lampe ist nun dem entsprechenden Kanal zugewiesen. Die erfolgreiche Zuweisung  wird durch Blinken quittiert. Um die Lampe aus dem Kanal zu lösen innerhalb von 2 Sekunden nach dem Einschalten 5 mal den entsprechenden Kanal auf der Fernbedienung aktivieren.

Controller

Der Controller wird per Micro-USB Kabel mit Spannung versorgt. Ich nutze ein Ladegerät für Smartphones. Nach dem Booten sollte man ein WLAN mit der SSID milight finden. Nun kann man der Anleitung folgen oder was ich als angenehmer per Webinterface konfigurieren. Dazu ins eigene WLAN verbinden und http://192.168.0.100/home.html aufrufen – ob die IP immer die gleiche ist kann ich nicht sagen. Hier muß in den STA Interface Settings das eigene WLAN konfiguriert werden.

App

Momentan nutze ich die in der Anleitung vorgeschlagene App Es gibt auch noch eine puristischere Version mit
Anbindung an Tasker – die  ohne Anpassungen leider nicht läuft.

LED Lampen ansteuern

Beim Hersteller gibt es eine Dokumentation.  Die Beispiele sind leider ein wenig inkonsistent, da irgendwann die Portnummer von 50000 auf 8899 umgestellt wurde.

Die Lampen werden per UDP Kommandos gesteuert. Dabei werden immer 3 Byte übertragen.

Byte 1 ist das Kommando an welches immer der Suffix 0x00  0x55 angehängt werden muß.

In PHP kann mit diesen Zeilen alle Kanäle einschalten:

&lt;?php
define("CONTROLLER_IP", "192.168.0.100");
function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){
	fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2)));
}
 
executeCommand(CONTROLLER_IP, 42);

Wer php5-cli installiert hat kann das Script auch auf der Kommandozeile nutzen. Für Freunde der Bash gibt es auch ein Script (geklaut bei Smileytechadventures)

#!/bin/bash 
 
if [ -z "$1" ] ; then 
    echo "You must enter a parameter: "  
    echo "  e.g. $0 allon" 
    exit 1 
fi 
 
incmd="$1" 
ipaddress="192.168.0.201" 
portnum="50000" 
 
allon="\x35\00\x55" 
alloff="\x39\00\x55" 
zone1on="\x38\00\x55" 
zone1off="\x3B\00\x55" 
zone2on="\x3D\00\x55" 
zone2off="\x33\00\x55" 
zone3on="\x37\00\x55" 
zone3off="\x3A\00\x55" 
zone4on="\x32\00\x55" 
zone4off="\x36\00\x55" 
 
eval incmd=\$$incmd 
 
echo -n -e "$incmd" &gt;/dev/udp/"$ipaddress"/"$portnum"

Ein wenig Heimautomatisierung ist auch schnell betrieben. Dieses Skript prüft, ob die Sonne untergegangen ist und schaltet in diesem Fall alle Lampen ein.

#!/usr/bin/php
&lt;?php define("CONTROLLER_IP", "192.168.0.100"); define("ZEIT_FUER_BETT", "23:59"); function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){ fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2))); } function getIp(){ return file_get_contents("http://icanhazip.com/"); } function getLatLongByIp($ip){ $geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip) ); if ( is_numeric($geoplugin['geoplugin_latitude']) &amp;&amp; is_numeric($geoplugin['geoplugin_longitude']) ) { $ret['lat']= $geoplugin['geoplugin_latitude']; $ret['lon']=$geoplugin['geoplugin_longitude']; return $ret; } } $ret= getLatLongByIp(getIp()); $dateSunset=date_sunset(time(), SUNFUNCS_RET_TIMESTAMP,$ret['lat'], $ret['lon'], 90, 1); $dateSunrise=date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, $ret['lat'], $ret['lon'], 90, 1); //Zu einer festen Uhrzeit ausschalten if(date("H:i")&gt;= date(ZEIT_FUER_BETT)){
echo "schlafen";
	executeCommand(CONTROLLER_IP, 41);
	exit;
}  
//Nach Sonnenuntergang und vor Aufgang
if ( time() &gt;=$dateSunset &amp;&amp; $dateSunset &gt;$dateSunrise){
 
	executeCommand(CONTROLLER_IP, 42);
}else {
	executeCommand(CONTROLLER_IP, 41);
}

Das kleine Skript fühlt sich auf kleinen Linuxrechnern im eigenen Netzwerk sehr wohl und sollte per Cronjob alle 1 Minuten angestoßen werden.

*/1 *    * * *   /home/pi/sunrise.php

Inzwischen habe ich die Lampen seit einer Woche in Betrieb und viel Spaß damit. Die Lichtausbeute ist ausreichend, der Stromverbrauch in Ordnung. Der Preis ist mit 99 EUR schon sehr happig, aber es macht auch sehr sehr viel Spaß Skripte für die Lampen zu schreiben.

Facebook SDK für Android einrichten

Quelle: Facebook Developers

 

  •  SDK runterladen 
  • Zip entpacken, alles nach Eclipse exportieren (ohne in den Workspace zu kopieren)
  •  Evtl. Project -> Clean ausführen
  • Developer Account anlegen
  • Key Hash mit dem keytool  (liegt in <JDK Folder>/bin) erzeugen
  • (Linux, Mac) keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
  • (Windows) keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
  • Im Profil Key Hash unter Sample App Settings eintragen.

 

Beispiele Testen.

Skeleton für Webviews in Android

package de.schmitt.michael.webview;
 
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
@SuppressLint("SetJavaScriptEnabled")
public class ActivityMain extends Activity {
	protected WebView wv;
	private final static String URL="http://www.google.de/";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
 
		 WebView w = new WebView(this);
		 w.setWebViewClient(new WebViewClient());
		 w.getSettings().setJavaScriptEnabled(true);
		 w.loadUrl(URL);
		 setContentView(w);
 
 
	}
}

Mehr zum Thema in der Android Dokumentation

Google Cloud Messaging (GCM) Tutorial

In diesem Beitrag geht es darum wie man Nachrichten via GCM an Apps verschicken kann.

Viele Android Apps sind klassische Client/Server Anwendungen. Der Client tätigt Requests an einen Server und bekommt im besten Fall eine vernünftige Antwort. In anderer Richtung ist dies jedoch nicht so einfach. Wenn der Server Daten an 1 bis n Clients senden möchte ist das in diesem Szenario nicht so einfach. Mobiltelefone sind meist nicht über eine statische IP zu erreichen, es ist nicht sichergestellt, daß das Gerät mit dem Internet verbunden ist wenn eine Nachricht versendet wird. Wenn der Client regelmäßig den Server anpollt kostet das Bandbreite und elektische Leistung.

Continue reading

Und noch ein Rechner in der Bude – Raspberry Pi

Ich mag ja kleine Rechner mit und auch ohne Linux drauf, egal ob das Ding jetzt Pogoplug,Nslu2 oder mbed heißt. Inzwischen habe ich mehr Rechner – mit ARM Cpu am laufen als klassische x86. Deshalb habe ich das Erscheinen des Raspberry Pi sehr entspannt verfolgt. Es gibt hier einfach zuviele davon…

Meine Meinung änderte sich jedoch mit dem Erscheinen einer stabilen Version von Raspbmc, einer Linux Distribution mit der XBMC Software. Das wollte ich schon immer haben und wartete eigentlich nur auf den Hack der aktuellen AppleTV Generation.

Der Pi war schneller und für den Preis einer mittelschweren Zecherei  ~ 60 Eur hab ich nun so ein Teil, inklusive Netzteil, Gehäuse und Kühlrippen (wer’s denn braucht).

Gekauft habe ich beim PI3g Shop (kein subventionierter Link).

Die Installation ging leicht von der Hand – Image auf eine SD-Karte schreiben, rein in den Pi, Netzwerk dran, HDMI, Spannung anlegen und einen Kaffee trinken.

Kaffee grabben

Im Anschluss erstmal ein xvid und einen mkv (1080p DTS) Container getestet – läuft tadellos. Die ARD Mediathek ist einfach zu installieren und  läßt sich sehr gut bedienen. Youtube streikt, aber das scheint bekannt zu sein und leicht behebbar. Damit kann das Gerät schon mehr als mein jetziger Player, der mir in seiner Beschissenheit echt die Lust am Basteln geraubt hat. Bedienen tue ich den Spaß mit der Official XBMC Remote. Geht gut von der Hand. Um Texteingaben vom Mobiltelefon an das  Xbmc zu senden mußte ich Username + Passwort festelegen. Das manifestiert sich praktischerweise in einem .htaccess Zugriffsschutz, womit ich den Port sorgenlos in die Weiten des Netzes forwarden kann.  Per ssh kommt man per usr=pwd=raspberry auf den Rechner. Hier ein paar interessante Ausgaben:

 

pi@raspbmc:~$ uname -a
Linux raspbmc 3.6.11 #1 PREEMPT Sun Feb 3 04:42:21 UTC 2013 armv6l GNU/Linux
pi@raspbmc:~$ cat /etc/issue
Raspbmc by Sam Nazarko
http://www.raspbmc.com
pi@raspbmc:~$ cat /proc/cpuinfo
Processor       : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 531.66
Features        : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7
 
Hardware        : BCM2708
Revision        : 000e
Serial          : 0000000063099a57
pi@raspbmc:~$ ssh
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

Ich habe noch die Skriptsprache meiner Wahl in der Cli Version installiert – dank Wheezy sogar in Version 5.4.4-12. Samba läuft bereits und gibt /home/pi sowie USB Laufwerke lesend wie schreibend frei.

Unterm Strich habe ich mit 0 Aufwand ein funktionierendes System zum Abspielen von Webinhalten und Sachen die ich aus dem Internet gezogen habe eingerichtet. Als Nächstes werde ich schauen, wie es mit DVB-* aussieht und ob die kleine Kiste auch noch Pyload schafft. Sehr interessant scheint webiopi damit lassen sich die I/O Pins des PI sehr leicht per Web ansteuern was sehr zum Basteln motiviert.

Neue Fonts auf dem Kobo Touch installieren

Ich nutze meinen Ebook Reader nun seit knapp 2 Monaten und möchte das Gerät für kein Geld in der Welt mehr hergeben. Nach 10.000 gelesenen Seiten habe ich jedoch Lust das Gerät zu modifizieren und ein wenig zu basteln. Neben einer angepassten Firmware habe ich auch ein paar neue Schriftarten auf dem Gerät installiert.

Das Prinzip ist simpel:

  •  Reader mit dem Rechner verbinden
  • Verzeichniss fonts auf dem Kobo erstellen
  • gewünschte Fonts kopieren
  • auf dem Gerät die Schriftart wechseln – siehe Screenshots

Ich nutze im Moment DroidSans weil ich serifenlose Schriften mag. Hier der Schnelldurchgang, um den Font unter Linux zu installieren  – ich nutze Ubuntu 10*?:

ms@nostromo:/media/KOBOeReader$ mkdir fonts
ms@nostromo:/media/KOBOeReader$ cp /usr/share/fonts/truetype/ttf-droid/DroidSans.ttf ./
ms@nostromo:/media/KOBOeReader$ sync

Ich habe bis jetzt nur TrueType Fonts getestet – zu PS Fonts kann ich nichts sagen.

Weitere Fonts findest Du in Deinem System unter /usr/share/fonts/ oder im Netz, z.B. bei den Google Webfonts.

 

Hier noch ein paar Screenshots:

 

 

Am Ende bleibt noch die Frage, welche Schriftarten Ihr als besonders angenehm auf Ebookreadern empfindet. Ich nutze am Rechner primär Consolas,  Courier, falls mal ein Dokument raus muß Meta FF. Auf dem EInk Display gefallen die mir leider nicht so gut.

 

 

Kobo Reader Touch unter Ubuntu Linux einrichten

Heieiei nach gefühlten 1000 Jahren schreibe ich mal wieder etwas, das im Planeten der lieben Ubuntuuser auftaucht.

In diesem Artikel will ich zeigen, wie man mit einem einfachen Trick das initiale Setup, Updates und Büchereinkäufe für den Kobo Reader Touch unter Linux durchführen kann.

Das Gerät habe ich eben für 99 € im Elektromarkt mit der extra dummen Reklame erworben weil mir der Kindle zu Amazon-lastig ist und auch kein Epub kann.

Nach dem initialen Einschalten und auch sonst werde ich aufgefordert, das Setup auf dem PC durchzuführen – die Software gibt es leider nur für Macintosh und Microsoft Systeme.

So etwas ist natürlich absolut inakzeptabel – wer will seinen Rechenknecht schon mit mieser Software zumüllen nur um Hardware einzurichten und zu registrieren?

Die Software von Kobo (http://www.kobosetup.de/) läßt sich problemlos mit Wine installieren, bleibt aber beim Punkt bitte Gerät anschließen hängen.

Der Umstand, daß das Setup nicht versucht Treiber zu installieren und auf dem Display des Geräts bei Verbindung zum PC die Meldung erscheint, daß man den Reader vor Trennung auswerfen müsse ließen einen vagen Verdacht in mir wachsen.

Mittels Softlink ins Verzeichniss ~/.wine/dosdevices/ kann man in Wine neue „Windows-Laufwerke“ anlegen.  Das einbinden des Reader Speichers reichte jedoch noch nicht.

Im Reiter Laufwerke von winecfg gibt es eine schöne Übersicht über Laufwerke. Dort kann man auch bequem neue Laufwerke anlegen. Mein Kobo wird per default in

/media/KOBOeReader  

eingehangen. Wenn Ihr die Verknüpfung angelegt habt, müßt Ihr nur noch auf „Erweitert“ klicken und dort als Typ „Diskette“ auswählen.

Nun sollte die Registrierung ohne Probleme laufen

 

Ich hoffe ich konnte mehr als einem Datenreisenden mit dieser kleinen Anleitung helfen 🙂