Seiten

Dienstag, 6. November 2012

systemctl als normaler Benutzer - II

Nachdem mein erster Versuch, systemctl als normaler Benutzer vollständig weiter nutzen zu können etwas ... gescheitert ist (probiert mal TAB Vervollständigung bei meiner ersten "Lösung") hier nun die neue, bessere und soweit ich bisher getestet habe funktionierende Lösung:

    
14 function systemctl ()
15 {
16   case "$1" in
17     enable|disable|start|stop|restart)
18       /usr/bin/systemctl -P "$@"
19       ;;
20     *)
21       /usr/bin/systemctl "$@"
22       ;;
23   esac
24 } 
Das nett in .bashrc oder .bash_profile und es funktioniert, zumindest bei mir ;-P

Samstag, 3. November 2012

synaptics Touchpad deaktivieren

Als eher grobmotorischer Mensch hasse ich es, wenn ein Touchpad auch zum Klicken verwendet werden kann.
Aus einer gewollten Zeigerbewegung werden bei mir dann gerne mal viele viele ungewollte Klicks auf allerei Buttons und der gleichen.

Deshalb deaktivere ich das Klicken per Touchpad. Bisher sah das in meiner .xinitrc so aus:

xinput set-prop "SynPS/2 Synaptics TouchPad" "Synaptics Tap Action" 0 0 0 0 0 0 0

Das war, gelinde gesagt, unschön und funktionierte auch nicht immer.
Anständig funktioniert dagegen:

synclient TapButton1=0
synclient TapButton2=0
synclient TapButton3=0


Ich meine mich zwar zu erinnern, dass synclient irgendein Problem mit sich bringt, bis ich das aber gefunden habe bleibt obiges Bestandteil meiner .xinitrc :)

Freitag, 2. November 2012

systemctl als normaler Benutzer

<UPDATE: Bessere Lösung>

In einer älteren systemd Version konnte ich per
systemctl start hdapsd.service
als normaler Benutzer den Dienst starten, ich wurde nur um mein Passwort gebeten. Das gefiel mir soweit eigentlich ganz gut, funktionierte auf meinem aktuellen System (systemd 195 arch +PAM -LIBWRAP -AUDIT -SELINUX -IMA -SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ ) allerdings nicht.
Alles, was ich immer bekommen habe, ist folgendes:
"Failed to issue method call: Access denied"

systemctl poweroff fragte jedoch nach meinem Passwort, wenn z.B. mehrere Benutzer gleichzeitig eingeloggt waren.

Die Lösung des Problems fand ich nach langem Google-Suchen eher per Zufall in der man-page von systemctl:

Die Option -P dient dazu, nach erforderlichen Berechtigungen (permissions) zu fragen.

Ein
alias systemctl='systemctl -P'
in ~/.bashrc später bekomme ich nun folgende, schöne Meldung:


[daniel@camino ~]$ systemctl start hdapsd.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.bus-access ===
Authentication is required to access the system and service manager.
Authenticating as: Daniel Oertwig (daniel)
Password:
==== AUTHENTICATION COMPLETE ===
[daniel@camino ~]$

Samstag, 20. Oktober 2012

Hintergrundprozesse zum Schweigen bringen

Ich teste gerade uzbl. Gestartet habe ich den Browser über ein xterm, um auch zu sehen, welche Meldungen (Debugging, Errors) das Programm ausgibt.
Das sind mitunter (gerade auf Blogger, GMail und Youtube) einige.

Da uzbl im Hintergrund läuft, ich es nicht beenden will, und die Meldungen von uzbl mich dabei stören, mit vim eine Konfigurationsdatei zu bearbeiten, muss uzbl jetzt sozusagen im Nachhinein zum Schweigen gebracht werden.

Das geht, wenn auch nur mit ein paar Tricks, erstaunlich gut:

#> uzbl-tabbed &
[3] 16611
#> vim config

Hier wird es jetzt nervig, uzbl stört vim mit seiner Ausgabe erheblich. Also weg mit der Ausgabe:

# CTRL - Z (Tastenkombination)
#          vim ist nun angehalten im Hintergrund)
#> jobs -pl

[2]+ 16542 Angehalten              vim config
[3]- 16611 Läuft                  uzbl-tabbed &
#> gdb -p 16611
(gdb) p dup2(open("/dev/null",0),1)
(gdb) p dup2(open("/dev/null",0),2)
(gdb) detach
(gdb) quit
#> fg

Und schon herrscht Stille :)

Was hier im Einzelnen passiert:
jobs -pl liefert mir die PID der nervigen Prozesses, danach kann per GDB an diesen Prozess "angedockt" werden. Dabei wird die Ausführung des Prozesses angehalten (der Browser bleibt also stehen, reagiert nicht mehr). Die folgenden Anweisungen zeigen (print) das Ergebnis des jeweiligen Ausdrucks dahinter.
Das ist jeweils der Aufruf einer Funktion dup2(int old, int new), welche bewirkt, dass der File Descriptor new (wenn nötig, was es in unserem Fall ist) geschlossen und anschließend zur Kopie des File Descriptors old gemacht wird.
Die Folge davon ist, dass danach in new zu schreiben effektiv das Gleiche ist, wie in old zu schreiben.

Wenn nach diesen beiden Zeilen also in File Descriptor 1 (stdout) bzw. 2 (stderr) geschrieben wird, ist dies der gleiche Vorgang wie nach /dev/null (den File Descriptor für diese "Datei" erhalten wir dank open) zu schreiben.

Die Ausgabe an stdout und stderr wird somit also nachträglich, ohne das Programm beenden zu müssen, nach /dev/null umgeleitet. Damit das nun verstummte Programm weiterläuft muss GDB mittels detach wieder "abgekoppelt" werden.

Ein quit führt zurück auf die Konsole / das Terminal und mittels fg kommt vim wieder in den Vordergrund.


Quellen:


Freitag, 19. Oktober 2012

systemd und dkms

Da mein Laptop nun mit systemd und einem neuen System läuft ist es Zeit, so langsam mal alles zum funktionieren zu bringen.

Dazu gehört auch mein Festplattenschutz, der über hdapsd und tp_smapi läuft. Beides ist unter Arch Linux einfach aus dem Repository zu installieren, hat aber folgenden Haken:
Die Module werden bei einem Kernelupdate nicht unbedingt gleich aktualisiert.

Da ist DKMS schon bequemer: Wenn ein neuer Kernel installiert wurde, werden die Module automatisch für den neuen Kernel gebaut.
Automatisch? Nur, wenn dkms autoinstall ausgeführt wird, was aber Dank der beiliegenden systemd Unit einwandfrei funktioniert.

Anstatt tp_smapi muss also einfach nur tp_smapi-dkms aus dem AUR installiert werden.

Bei mir braucht es dann noch ein
options thinkpad_ec force_io=1
unter /etc/modprobe.d/thinkpad_ec.conf und eben systemctl enable hdapsd.service und systemctl enable dkms.service.

Toll, wenn etwas einfach mal funktioniert!

Mittwoch, 17. Oktober 2012

systemd - Ein erster Versuch

systemd ist nun quasi Standard in Arch Linux, der Distribution meiner Wahl. Zeit, darauf umzustellen, dachte ich mir dann letzte Woche.

Normalerweise teste ich "so neues Zeug" gerne möglichst früh, habe das bei systemd aber aus zwei Gründen hinausgeschoben:

1) Mein Laptop ist mein Produktivsystem. Ohne funktionierendes System bin ich ziemlich aufgeschmissen, gerade, was das Studium angeht.

2) Ich gehöre mit zu den Nutzern, die die Umstellung auf pulseaudio unter Ubuntu Hardy "hautnah" miterlebt haben (Bis Gnome endlich OHNE pulseaudio lief hatte ich mich fast schon an die absolute Stille gewöhnt). Der Name "Lennart Poettering" war mir also noch in etwas negativer Erinnerung (was nichts über seine Person aussagt, ich kenne ihn nicht, erlaube mir deshalb anders als einige andere auch kein Urteil).

Ich wollte einfach sicher gehen, dass ich nicht das gleiche Debakel wie bei pulseaudio erlebe. Gerade so "neuartige" (was die umgesetzten Ideen und Konzepte angeht) Software bringt ja zu Beginn gerne einen Haufen Probleme beim Zusammenspiel mit dem restlichen Programmen. Nach und nach integriert sich solche Software ja aber auch (wie bei pulseaudio) bzw. die Umgebung passt sich daran an.

Ich bin also nach der Anleitung im Wiki von archlinux.org vorgegangen, Schritt für Schritt. Meine Konfigurationsdateien habe ich geändert, sprich den Hostnamen in /etc/hostname eingetragen, Konsolenschriftart usw. in /etc/vconsole.conf gesetzt, Lokalisierung und Zeitzone eingestellt und die zum Starten (nicht zwingend) notwendigen Kernelmodule in Dateien unter /etc/modules-load.d/ eingetragen.

Zu den tmpfiles gehört auch noch eine andere Geschichte ...

Dann systemd installiert und init=/bin/systemd an die Kernelparameter angehängt.

Neugestartet...

... und eine mit lauter grünen "OK"s gespickte Bootausgabe gesehen, aber kein getty / Login.

Ok, STRG + ALT + ENTF löste glücklicherweise einen Reboot aus, also habe ich im Bootloader die Kernel cmdline geändert und mit dem "alten" Init gebootet. Einige systemctl enable später folgte dann Versuch 2, mit selbigen Ergebnis. Mit einer gewissen Frustration habe ich dann den Laptop erstmal in Ruhe gelassen, fand dann aber bei meiner Rückkehr einen fertig gebootetes System samt Login wieder.

Ein systemd-analyse plot ergab dann Folgendes:
(In voller Größe, ca 1,2 MB)

Mehr als 100 Sekunden, um meinen Laptop zu starten? o.O
Irgendwas läuft da doch gewaltig schief, mit dem alten Init ging es immerhin in rund 14 Sekunden bis zum getty ...

Es schien / scheint auch irgendwie mit dem Networkmanager zusammenzuhängen, also habe ich wieder versucht weitere Services zu aktivieren.

Mit dem Resultat, dass bei einem Neustart das System eingefroren ist. Angezeigt wurde mir wieder die mit lauter "OK"s gespickte Konsole, das System reagierte aber weder auf irgendwelche Tastenkombinationen (MagicSysRq hatte ich deaktiviert ...) noch auf andere Ereignisse (Laptop-Deckel schließen, Hardwareschalter für Drahtlos-Verbindungen etc)

Da mir kein Weg eingefallen ist, das zu lösen, ist das System nun immernoch in diesem Zustand. Starten kann man es glücklicherweise ja noch ohne systemd.

Das heißt aber nicht, dass ich jetzt ohne systemd arbeite, eine Neuinstallation von Arch Linux mit systemd funktioniert jetzt ohne größere Probleme zu machen.

Das alte System habe ich aber noch auf einen USB Stick kopiert, vielleicht finde ich noch die Lösung...

Montag, 10. September 2012

Laptop vs. Hund oder der Kampf um das Sofa

Hund auf Sofa finde ich vollkommen ok. Hund auf Laptop ist allerdings nicht so toll. Leider passiert das jedoch sehr häufig, wenn ich auf dem Sofa gearbeitet und den Laptop dann dort liegen gelassen habe.
Hier also eine kleine Hunde- (oder Katzen-) Abwehr in Bash:


 1 #!/bin/bash
 2 
 3 
 4 sudo tail -f -n 0 /var/log/messages.log | \
 5        while read; do
 6          if echo "$REPLY" | grep ': parking'; then
 7            aplay /home/daniel/Musik/alarm.wav
 8          fi
 9        done
10 

Donnerstag, 30. August 2012

Gefährlicher Java7 ZeroDay Exploit

Java 7 (also Version 1.7) sollte man beim Surfen im Web wohl eher nicht verwenden. Grund dafür ist eine Sicherheitslücke, die aus dem Design der JRE hervorgeht. Mit deren Hilfe ist es einem Angreifer möglich, Schadprogramme nach Belieben auf den Rechner des Opfers zu bringen.

Die Sicherheitslücke betrifft dabei soweit bisher bekannt alle Web Browser sowie alle Betriebssysteme (mit installierter Java 7 JRE).

Dienstag, 14. August 2012

xz Kompression für schnelleren Linux Boot

Eine einfache, und doch auch recht ergiebige Methode, um den Bootvorgang unter Linux - bei mir Arch Linux - zu beschleunigen ist, das System weniger Daten von der Festplatte laden zu lassen.

Um dieses Ziel schon zu Beginn des Startvorgangs umzusetzen, ist das initramfs meist komprimiert. Dadurch wird der Flaschenhals Festplatte auf Kosten von mehr CPU Rechenzeit umgangen. Bei einer einigermaßen schnellen CPU lohnt sich das dann auch ganz gut!

Per Default wird dieses Image mittels gzip komprimiert. Das rührt vermutlich daher, dass gzip etablierter Standard in der Linux Welt ist.

xz bietet jedoch eine höhere Kompression. Natürlich auf Kosten von noch mehr CPU Rechenzeit. Wer also eine "schnelle" (bei mir ein Intel(R) Core(TM)2 Duo T9400 ... also nichts weltbewegendes) CPU hat, sollte mal versuchen, auf xz Kompression beim Booten zu setzen.

Unter Arch Linux lässt sich diese Einstellung in /etc/mkinitcpio.conf vornehmen:

# COMPRESSION
# Use this to compress the initramfs image. By default, gzip compression
# is used. Use 'cat' to create an uncompressed image.
#COMPRESSION="gzip"
#COMPRESSION="bzip2"
#COMPRESSION="lzma"
COMPRESSION="xz"
#COMPRESSION="lzop"

# COMPRESSION_OPTIONS
# Additional options for the compressor
#COMPRESSION_OPTIONS=""

Eventuell lassen sich noch weitere Verbesserungen erzielen, in dem die --extreme Option übergeben wird. Dadurch dauert die Komprimierung länger, dafür ergibt sich aber (unter Umständen) ein besserer Kompressionsgrad.

Durch obige Anpassung spare ich mir etwa eine Sekunde beim Hochfahren.

Liebe Grüße,
Daniel

networkmanager/modemmanager und Ericsson F3507g

nm-applet unter gnome3
Das Ericsson F3507g, was in meinem Thinkpad verbaut ist, funktioniert (zum Glück) eigentlich einwandfrei zusammen mit Linux bzw. dem aktuellen NetworkManager.

Die Verbindung klappt und NetworkManager kann das Modem auch aus dem Standby holen.

Nur wieder in den Standby zurückbringen, das ging bisher nicht. Der entsprechende Button (siehe Bild rechts) ließ sich natürlich anklicken, die Oberfläche suggerierte (wie im Bild) dann auch, dass das Modem aus sei, aber die zugehörige LED enttarnte den Schwindel.

Also habe ich dazu einen Bug Report geschrieben, der lange Zeit ... naja, einfach nur existierte.

Vor ein paar Tagen habe ich dann die Mail bekommen, dass mein Report ein Duplikat von einem anderen Report sei, worauf hin ich auf die Sache wieder aufmerksam geworden bin.

Also auf Aufforderung / Anleitung eines der Entwickler von Modemmanager (die dafür zuständige Komponente, bzw. das Backend) ein paar Tests durchgeführt, den möglichen Fix überprüft und bestätigt und wieder funktioniert ein Teil meines Laptops besser :)

Wer nun auch so ein Modem hat und unter dem gleichen Problem leidet, der kann Modemmanager aus dem Quelltext selbst kompilieren und hat so die Verbesserung gleich verfügbar.

Für Arch Linux habe ich hier auch gleich ein leicht modifiziertes PKGBUILD, das Original ist von modemmanager-git:
PKGBUILD

Die einzige Änderung ist in Zeile 27, und dient dazu den Branch mit dem Fix auszuwählen:
git clone -b MM_05 $_gitroot $_gitname

Liebe Grüße,
Daniel

Samstag, 4. August 2012

Quaternionen, 3D Welten (und mehr)

Ich verzweifle gerade etwas an den Umrechnungen zwischen unterschiedlichen Referenzsystemen des Quadrocopters.

Da ist zum einen das "globale" Referenzsystem, das sich im Falle das Quadrocopters z.B. gut auf eine Karte der Umgebung abbilden ließe (z.B. 10 Meter nördlich vom Startpunkt)

Auf der anderen Seite bekommen die Sensoren allerdings nur das lokale Referenzsystem des Quadrocopters mit, die Sensoren können also z.B. nur messen "Beschleunigung mit 5m/s² nach vorne".
Um dieses "nach vorne" nun in das globale Referenzsystem umzurechnen (um letztendlich die neue Lage bestimmen zu können) benötigt man die aktuelle Rotation (Orientierung) des Quadrocopters und damit der Sensoren.

Die Orientierung lässt sich hervorragend mit Quaternionen beschreiben, vor Allem lassen sich so mehrere Rotationen in eine einzige Rotation zusammenfassen.

Z.B. drehe ich mich erst um 33° um X, dann um 65° um Z, dann um 199° um Y, dann wieder 12° um X, dann nochmal 50° um Z und schließlich 20° um Y.
Wo ich jetzt bin kann ich berechnen, in dem ich jede der Rotationen nacheinander ausführe. Einfacher ist es jedoch, all diese Rotationen (in der richtigen Reihenfolge) zusammenzufassen, sodass am Ende 1 Drehung um eine Achse (a, b, c) zum gleichen Ergebnis führt.

Diese zusammengefasste Information ist in einem Quaternion gespeichert.

Will ich nun einen Vektor (z.B. den Vektor der Beschleunigung, geliefert von einer IMU) aus seinem lokalen Referenzsystem in das globale transformieren, dann muss ich "nur" das Sandwichprodukt mit dem Quaternion welches die Lage beschreibt berechnen.

Das Sandwichprodukt ist dabei:

v2 = q' * v1 * q

v1 := Vektor im lokalen System
v2 := Vektor im globalen System
q := Quaternion der aktuellen Lage
q' := konjugiertes Quaternion
* := Quaternionenmultiplikation

Klingt einfach, ist in der Praxis dann aber doch ziemliches Formelwirrwarr.

Eine Seite, die dem Ganzen einen Sinn und einen Hintergrund geben kann, ist z.B. folgende:

www.euclideanspace.com

(speziell hier, die Navigation auf der Seite ist etwas missglückt)

Mittwoch, 1. August 2012

git letzten commit rückgängig machen

Leider vergesse ich oft noch kleine Änderungen, wenn ich einen commit mache. Die sind dann natürlich nicht im commit enthalten, einen extra commit a la "Ach übrigens das fehlt noch" halte ich für Unsinnig, also muss der letzte Commit rückgängig gemacht werden:

Die Erklärung ist eine kurze Zusammenfassung / Übersetzung von dieser stackoverflow.com Antwort.

git fast forward merge rückgängig machen

Ich arbeite gerade mit git und wollte die Änderungen aus einem Branch (speziell für ein Issue) nach master übernehmen.

# On branch master
git merge ISS#NR

Hat auch soweit funktioniert, allerdings hat git ein fast forward merge daraus gemacht. D.h., die commits vom branch ISS#NR sind nun auch in master zu finden.

Da mir das nicht gefällt habe ich den merge rückgängig gemacht:

git reflog show master

Die Ausgabe sieht z.B. so aus:

##### master@{0}: merge ISS#NR: Fast-forward
##### master@{1}: commit: ....
 

Ein

git reset --keep master@{1}

hat mich dann in die Ausgangslage vor dem merge gebracht.

Einen merge mit commit (also ohne fast forward) konnte ich dann so erreichen:

git merge --no-ff ISS#NR

Vielleicht hilft es ja noch jemanden :)

Mittwoch, 25. Juli 2012

Syntaxhighlighting in Blogger

In meinem letzten Post wollte ich zum ersten mal hier auf blogger Quelltext posten. Damit der Code auch schön lesbar ist, sollte farbige Untermalung durch Syntaxhighlighting natürlich nicht fehlen.

1 int main( int argc, char * * argv )
2 {
3   return 0;
4 }

Da blogger das allerdings nicht von Haus aus unterstützt, habe ich mich auf die Suche nach Lösungen gemacht:

Dienstag, 24. Juli 2012

Code zum Verwalten verschiedener Zustände

In bin gerade darüber, Aufgaben für Luft- und Raumfahrtlabor auf einem EVK1000 zu lösen.
Dabei geht es um die Steuerung eines Quadrocopters. Die Aufgabe gliedert sich in 3 Teile, im ersten Teil werden nur die Messwerte erfasst, dann wird eine Lageregelung (Roll & Pitch) hinzugefügt und schließlich sollen Gierbewegungen (Yaw) noch kompensiert werden.

Das System befindet sich dabei in verschiedenen Zuständen (Initialisierung, reine Anzeige der Messwerte, Lageregelung, Gierregelung, komplette Regelung) welche nicht direkt miteinander zu tun haben.

Der Code soll schön übersichtlich bleiben, also will ich das so gut es geht aufspalten.

Um die Verwaltung der Zustände zu regeln, hatte ich in einer vorherigen Aufgabe (Kontrolle einer Wippe mit 1/2 Motoren) schon eine "Zustandsmaschine" implementiert, auf deren Basis nun der folgende Code entstanden ist.

Samstag, 21. Juli 2012

Wie es mit diesem Blog anfing ...


Erstellt habe ich diesen Blog eigentlich nicht mit dem Hintergedanken, einen Blog zu führen. Dazu "angestiftet" hat mich die Hilfeseite von Google Adsense, denn ein Adsense Konto ohne Angabe einer Webseite zu eröffnen ist nicht möglich. Die freundliche Google Hilfe schlug mir vor, entweder über Google Webseiten eine Seite zu erstellen oder doch einen Blog zu erstellen.

Ich entschied mich, wie man sieht, für Letzteres.

Da stellt sich natürlich die Frage: Wieso möchte ich ein Konto bei Google Adsense ohne eine Webseite eröffnen, wo doch der Sinn des Google Dienstes darin besteht, Werbung auf eigenen Webseiten anzuzeigen?

Die Antwort ist einfach: Um Apps auf Google Play verkaufen zu können. Dass ich dazu kein Adsense Konto brauche wusste ich aber erst im Nachhinein :D

... und warum er auch weitergehen wird :)

 Nachdem ich nun aber mit einem "fertig" eingerichteten Blog da stehe und so wieso schon "immer mal irgendwann einen Blog schreiben" will, werde ich nun auch mal mehr und mal weniger häufig ein paar Posts schreiben.

Dabei wird es sich hauptsächlich um Informatik drehen, immerhin studiere ich auch (freiwillig und gerne) eine Abwandlung (Luft- und Raumfahrtinformatik) an der Universität Würzburg. Außerdem bin ich überzeugter (Arch) Linux Benutzer, werde also auch zu diesem Themengebiet ab und an ein Wort verlieren.

Liebe Grüße,
Daniel