Sim Karte dauerhaft in Ubuntu / Linux Mint entsperren / dauerhaft deaktivieren.

Mein Laptop ist mit einer fest eingebauten Datenwanze namens Ericsson Business Mobile Networks BV zu mir gekommen. Ein nerviges Feature des Modems ist das ständige Nachfragen des Netzwerkmanagers nach der PIN wenn eine SIM Karte einliegt – auch wenn man bei der Option “Automatisch entsperren” einen Haken setzt. Das ist auf Dauer recht nervig, da ich 1,2 mal die Woche mobiles Internet benötige, aber dafür ständig belästigt werde. Um die Karte zu entfernen muß der Akku des Laptops entfernt werden (uptime im Eimer) und kleine Dinge wie SIM-Karten gehen bei mir schnell verloren. Eine Softwarelösung muß also her!

Die Pin läßt sich dauerhaft mit dem Befehl gsmctl aus dem Paket gsm-utils speichern. Dafür muß erst das Device File mit

ms@w530 ~ $ for n in `ls /sys/class/*/*{ACM,wdm}*/device/interface`;do echo $(echo $n|awk -F '/' '{print $5}') : $(cat $n);done

gefunden werden.

ttyACM0 : H5321 gw Mobile Broadband Modem
ttyACM1 : H5321 gw Mobile Broadband Data Modem
ttyACM2 : H5321 gw Mobile Broadband GPS Port
cdc-wdm0 : H5321 gw Mobile Broadband Device Management
cdc-wdm1 : H5321 gw Mobile Broadband USIM Port

In meinem Fall kann man über /dev/ttyACM0 mit dem Modem sprechen und die Pin mit dem Befehl

sudo gsmctl -d /dev/ttyACM0 -o unlock sc all 1234

dauerhaft setzen.

Das Modem kann auch deaktiviert werden. Dafür als Superuser

rfkill block wwan

in die /etc/rc.local eintragen.

Die Seite zu dem Modem im ThinkWiki verrät noch mehr über dieses Modem, auch wie man den GPS Chip in Gang setzten kann – hab ich noch nicht gemacht und nicht so schnell vor.

Ergonomisches arbeiten mit 16:9 Displays

Heute geht es nicht um Ubuntu / Linux Basteleien, sondern um komfortables Lesen und Arbeiten mit dem Rechner. Schon seit längerem bietet der Markt eigentlich nur noch LC-Displays im Format 16:9 an. Dieses Format eignet sich hervorragend zum Anschauen von Spielfilmen, dem Spielen von Computerspielen und – was eigentlich? Das Layout der meisten Texte in meinem Kulturkreis ist auf Seitenverhältnis von 1:1,41 Hochkant ausgelegt.
Das harmonisiert nicht wirklich mit den Verhältnis 1:1,78 der meisten Computerbildschirme. Den größten Teil des Tages verbringe ich mit dem Lesen und Schreiben von Texten und nicht mit Spielen oder Filme schauen – 16:9 geht also klar an meinen Bedürfnissen vorbei.
Da heute Sonntag ist habe ich ein wenig an meinen Monitoreinstellungen herumgebastelt und gearbeitet.
Bisher habe ich 3 Displays (1* 15,6″, 1* 23″, 1*24″) mit einer jeweiligen Auflösung 1920 * 1080 Pixel genutzt. Nun habe ich ein Display im Uhrzeigersinn nach rechts gedreht und Screenshots gemacht. Im unteren Display sind die Bildschirmeinstellungen.

Im ersten Screenshot ist eine normale Newsseite im Netz zu sehen. Bemerkenswert ist der graue Rand, dieser ist sichtbar, da ich zu Testzwecken die Werbung auf der Seite ausgeblendet habe. Auffällig ist das schlechte Verhältnis von grauer Fläche zu Inhalt. Im Hochformat sieht die Sache schon ganz anders aus – weniger Grau und viel mehr Text. Informationen gehen nicht verloren. Das Rumklicken und Lesen auf der Seite macht deutlich mehr Spaß auch wenn die Darstellung ein wenig ungewohnt ist.

Internetseite einmal im Hoch- und einmal im Querformat

Viel interessanter ist der zweite Screenshot. Damit verbringe ich den größten Teil meiner Arbeitstage, dem Erstellen von unformatiertem Text. Rechts und Links ist der gleiche Code dargestellt. Der graue Balken zeigt den rechten Rand nach 120 Zeichen an. Diese Größe ist für mich sehr wichtig, da ich sehr selten und auch ungern Zeilen schreibe die länger sind.

2 mal der gleiche C Code, einmal im Hoch und einmal im Querformat.
2 mal der gleiche C Code, einmal im Hoch und einmal im Querformat.

Hier überzeugt das Hochformat! Man erkennt mehr Zeilen und muß nich so sehr am Mausrad drehen. Zum rechten Rand ist noch ein wenig Platz für Ausnahmen von der Regel und statt magerer 54 Zeilen sieht man 104 Zeilen!

Reiner Text ist meiner Meinung nach auch angenehmer zu lesen.

Faust im Browser
Faust im Browser

Zum Schluss bleibt die Frage, wie Ihr Eure Displays eingestellt habt. Arbeitet Ihr nur im Hoch oder Querformat oder nutzt Ihr beides?

Serielle Kommunikation über Bluetooth

Für ein kleines Projekt (Mobiltelefon steuert Arduino) habe ich mir ein HC-06 Bluetooth Modul für wenig Geld in China besorgt. Bluetooth habe ich nie gemocht, weil ich nie viel Freude daran hatte diese Gerätschaften unter Linux zu konfigurieren, aber der Preisunterschied zu Arduino WLAN Modulen hatte dann doch den Ausschlag gegeben:).
 Über GUI ließ sich das Gerät leider nicht konfigurieren, aber  mit den bluez-utils auf der Kommandozeile ließ sich das Problem rasch beheben.

Zuerst muß die MAC Adresse des Moduls in Erfahrung gebracht werden.

ms@debian:~/$ hcitool scan
Scanning ...
	0C:DF:A4:DE:01:54	S3350
	20:14:04:11:15:16	HC-06

Das File rfcomm.conf anpassen

root@debian:/# cat /etc/bluetooth/rfcomm.conf 
#
# RFCOMM configuration file.
#
 
rfcomm0 {
#	# Automatically bind the device at startup
	bind yes;
#
#	# Bluetooth address of the device
	device 20:14:04:11:15:16;
#	# RFCOMM channel for the connection
	channel	1;
#
#	# Description of the connection
	comment "HC-06";
}

Nun die Pin des Geräts (Default ist 1234) setzen – Mac Adresse am Besten per Tabulator vervollständigen
root@debian:/# sudo echo “20:14:04:11:15:16 1234″ >> /var/lib/bluetooth/08\:3E\:8E\:E5\:1C\:5E/pincodes

Und den Bluetooth Daemon neu starten.

root@debian:/# sudo /etc/init.d/bluetooth restart

Befehle an den Bluetooth Client senden

Strings kann man nun einfach an das Gerät redirecten
ms@debian:~$ echo “beep” >/dev/rfcomm0

Ausgabe des Bluetooth Clients lesen

Einfach mit cat die Gerätedatei ausgeben

ms@debian:~$ cat /dev/rfcomm0
==Commands==
led on
led off
beep
beep_d [duration]
==Commands==
led on
led off
beep
beep_d [duration]

fin.

Click’N’Load per Tunnelbau an die Pyload Maschine weiterleiten

Wer ab und an bei Sharehostern Dateien lädt kennt sicherlich Click’n’Load. Nach dem Klick auf einen Button im Browser füllt sich die Queue des Downloadmanagers mit neuen Files. Dabei werden Informationen zu Dateien per Http POST vom lokal laufenden Download Programm wie jDownloader oder PyLoad entegengenommen. Dies geschieht durch einen kleinen Webserver der auf dem Port 9666 lauscht. Wenn der Downloadmanager nicht lokal läuft funktioniert der Mechanismus leider nicht.

Mit einem SSH-Tunnel kann man den POST Request an einen anderen Rechner weitleiten. Dort muß neben dem Downloadmanager auch ein SSH-Server laufen.

In meinem kleinen Beispiel läuft Pyload auf einem Pi mit der Ip 192.168.0.110. Um den Tunnel nachzubauen mußt Du also nur die Ip anpassen:

ms@debian:/home/ms# ssh -L 127.0.0.1:9666:192.168.0.110:9666  pi@192.168.0.110 -N

Den Tunnel kannst du mit diesem Link testen.

Nachtrag 21.06.2014
Die Arbeit mit ssh kann man sich generell einfacher machen wenn man ein Configfile für das Tool benutzt. Dort kann man Aliase für Server definieren, deklarieren auf welchem Port sshd läuft oder welcher Key zur Authentifizierung genutzt werden soll. Nähere Informationen dazu gibt es bei den Ubuntuusers oder Nerderati.

Debian Wheezy auf dem Raspberry Pi installieren

Seit etwa einem Jahr nutze ich einen Raspberry Pi um mir damit Filme und Serien anzuschauen.Läuft ganz gut und mit OpenElec etwas flüssiger in der Menüführung als Raspbmc.Wenn weitere Dienste laufen wird das Filmvergnügen leider ein wenig ausgebremst weshalb ich mir ein zweites Gerät zugelegt habe.Auf dem neuen Raspberry Pi soll nun Debian seine Dienste verrichten und mir als Pyload Server und digitales Tor zu meiner Bude via sshd dienen.

Ich habe keine Lust den Pi mit Monitor und Tastatur zu schmücken, deshalb wird das System als Image auf eine SD Karte geschrieben und gut ist.

Die Debian Version für den Pi nennt sich Raspbian und läßt sich auf der Homepage des Projekts downloaden.

Eine Variante von Debian für den Pi nennt sich Raspbian und läßt sich auf der Homepage des Projekts downloaden.

1. Image auf die SD Karte schreiben, Pi starten

Die Blocksize war in der offiziellen Anleitung leider falsch angegeben.

root@debian:/home/ms/Downloads# dd bs=1M if=2014-01-07-wheezy-raspbian.img of=/dev/mmcblk0
root@debian:/home/ms/Downloads# sync

Pi vom Stromnetz trennen, Karte einstecken. Wenn nur eine rote LED leuchtet ist etwas schief gegangen
Nun dem Pi ein wenig Zeit zum booten geben und per nmap nach neuen Geräten suchen

ms@debian:~$ nmap -sP 192.168.0/24

2. Initiale Konfiguration

Per SSH einloggen, Konfiguration ausführen

#default password raspberry
ms@debian:~/Downloads$ ssh pi@192.168.0.110
pi@raspberrypi ~ $ sudo raspi-config

Erstmal Vim und Screen installieren

pi@raspberrypi ~ $ sudo su
root@raspberrypi:/home/pi# apt-get update
root@raspberrypi:/home/pi# apt-get install vim screen

Swap anpassen

root@raspipy:/home/pi# echo "CONF_SWAPSIZE=512" > /etc/dphys-swapfile
root@raspipy:/home/pi# dphys-swapfile setup
want /var/swap=512MByte, checking existing: deleting wrong size file (104857600), generating swapfile ... of 512MBytes
root@raspipy:/home/pi# dphys-swapfile swapon

3. NFS Freigaben einrichten

Ich nutze für Dateifreigaben nur noch nfs, das ist schneller als Samba und man hält sich den M$ Mist aus dem Netz. Mußte den Daemon ein wenig anpassen (Kernel Version 3.10 vom 2014-01-07).

NEED_STATD auf YES setzen in /etc/init.d/nfs-common
Einmal alles bezüglich NFS neustarten oder rebooten.

Die Shares einrichten und mounten (die uninteressanten Dinge aus fstab habe ich entfernt):

root@raspipy:/home/pi# cat /etc/fstab
192.168.0.50:/media_movies /media/nfs_movies nfs auto,rw 0 0 
192.168.0.50:/media_serien /media/nfs_serien nfs auto,rw 0 0
192.168.0.50:/downloads /media/downloads nfs auto,rw 0 0
root@raspipy:/home/pi# mkdir /media/nfs_movies
root@raspipy:/home/pi# mkdir /media/nfs_serien
root@raspipy:/home/pi# mkdir /media/downloads
root@raspipy:/home/pi# mount -a

Das wars soweit mit der Einrichtung von Debian. Ich habe zusätzlich den Port 22 am Router auf den Pi weitergeleitet und in /etc/ssh/sshd_config Logins mit Passwort verboten. Demnächst gehts weiter mit der Einrichtung von Pyload oder was Anderem wenn es mir nicht taugt :).

Wireless Access Point mit DD-WRT

Netzwerkequipment ist die Infrastruktur unserer vernetzten Welt. Sie muß sicher sein, tadellos funktionieren und so sicher wie nur möglich sein. Nichts ist ärgerlicher als eine instabile Internetverbindung oder Router die regelmäßig Wartung und Pflege benötigen. Der Nachteil von solch guter Hardware ist, daß man schnell vergisst was man wie eingestellt hat und nach Monaten oder Jahren grübelnd vor kleinen schwarzen oder grauen Kisten steht :). Womit wir schon beim Thema meines Posts sind. Vor einem Jahr habe ich mir aus der Not heraus einen Buffalo AirStation WZR-HP-G300NH2EU NFINITI HighPower Gigabit Wireless-LAN Router 300Mbps als WLAN Repeater konfiguriert. Auf dem Gerät läuft DD-WRT.

Da ich in diesem Zeitraum nichts mit dem Gerät gemacht habe brauchte es ein wenig Zeit bis der Access Point lief. Deshalb für die Nachwelt und Zukunft ein paar Anmerkungen und Screenshots zu den Einstellungen.
Der Access Point soll weder routen noch als DHCP Server dienen. Ich will alle Geräte in 192.168.0.0/24 haben. Die Einrichtung ist recht schnell erledigt.


Zuerst muß unter Setup -> Basic Setup das Grobe eingerichtet werden.

Grundlegende Einrichtung
Grundlegende Einrichtung

Die Wan Verbindung wird über den Router abgewickelt der auch das Gateway macht. Da ich inzwischen fast nur noch DHCP nutze muß das als Forwarder eingerichtet werden. 2 DHCP Server im Netzwerk machen keinen Spaß und in meinem Fall wenig Sinn.

 

Im Anschluss die Eckdaten des WLAN einrichten

Punkt WLAN

 

Und für Sicherheit sorgen

WLAN Security

 

Da die Kiste nicht routen soll muß noch der Punkt Routing unter Administration ausgeschaltet werden…

Über Shared Preferences mit einem Service kommunizieren

Für ein Live Wallpaper mit Settings-Dialog brauche ich einen Callback im Service um Änderungen in den Einstellungen so schnell wie möglich  zu verarbeiten. Periodisches Pollen zur Laufzeit ist nicht nur unelegant sondern braucht auch CPU Zeit. Der einfachste Weg für micht geht über SharedPreferences und einem OnSharedPreferenceChanceListener Interface.

 
private class MyWallpaperEngine extends Engine implements OnHttpRequestResultListener, OnSharedPreferenceChangeListener {
 
        public MyWallpaperEngine() {
		    //get the image
		    SharedPreferences sp = getApplicationContext().getSharedPreferences(
					Constants.NAMESPACE_SETTINGS, Activity.MODE_PRIVATE);
			sp.registerOnSharedPreferenceChangeListener(this);
	}
 
        /* .... */
	@Override
	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
		draw();
 
	}
}

In der implementierten Methode onSharedPreferenceChanged wird einmal neu gezeichnet. Fertig.

Mysql INSERT if not exists

Für ein kleines Projekt speichere Auflösungen von Geräten in einer Tabelle ab um Bildbearbeitungen im vorraus zu erledigen und nicht erst wenn das Bild angefragt wird.
Um die Datenbank sauber zu halten möchte ich natürlich jeden Datensatz genau einmal haben und das mit so wenig Sql Queries wie möglich erledigen.
Dies ist die einfachste Lösung auf die ich gestoßen bin:

INSERT INTO resolutions (w, h) 
 
SELECT  100, 100 FROM resolutions
WHERE NOT EXISTS(
        SELECT w, h FROM resolutions WHERE w=100 AND h=100
 
) LIMIT 1;

Prüfen ob Service aktiv ist

Ich schreibe momentan ein Live Wallpaper für Android, mit einer Activity um Infos zum aktuellen Bild darzustellen. Um komfortabel das Live Wallpaper zu aktivieren brauche ich eine Prüfung, ob das auch läuft. WallpaperService ist von Service abgeleitet und damit ist dies kein Problem:

    /* ..... */
	private boolean isMyServiceRunning(String className) {
	    ActivityManager manager = (ActivityManager) getActivity().getSystemService(Context.ACTIVITY_SERVICE);
	    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
	        if (className.equals(service.service.getClassName())) {
	            return true;
	        }
	    }
	    return false;
	}
    /* ..... */

Nun kann bei Bedarf der Wallpaper Picker angezeigt werden:

	if(isMyServiceRunning(MyWallpaperService.class.getName())){
			Log.d(TAG, "active" );
	} else {
			Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER);
			startActivity(Intent.createChooser(intent, getActivity().getString(R.string.title_for_wallpaper_chooser)));
	}

Fin.

Links in TextView clickbar machen

Html Markup bringt man am einfachsten auf diesem Weg in TextViews:

/***** .... *****/
TextView mContent;
mContent.setText(Html.fromHtml("<a href=\"http://www.giftimessen.de\">Link</a>"));
/***** .... *****/

Beim Draufdrücken passiert leider noch nicht soviel. Um die Links gangbar zu machen einfach die MovementMethod setzen:

 
mContent.setMovementMethod(LinkMovementMethod.getInstance());

fertig :).