Emacs twittering-mode Benachrichtigungen

Wer sich gern von der Arbeit abhalten lässt oder einfach nichts besseres zu tun hat (wie ich), wird sich über die folgenden Zeilen freuen: Der Emacs twittering-mode (den ich hier und hier bereits vorgestellt habe) kann jetzt maximale Aufmerksamkeit fordern. Ich will kurz zwei Wege vorstellen, mit denen man sich über neue Tweets informieren lassen kann.

Emacs Minibuffer

Diese Variante ist eher unaufdringlich: Bei Eingang eines neuen Tweets, wird dieser mit dem Namen der :Timeline und des [Absender] im Minibuffer am unteren Ende des Emacsfensters angezeigt. Folgende Zeilen müssen hierzu in ~/.emacs eingefügt werden,

(add-hook 'twittering-new-tweets-hook (lambda ()
  (dolist (el twittering-new-tweets-statuses)
    (message
      (concat (twittering-timeline-spec-to-string twittering-new-tweets-spec) " ["
        (cdr (assoc 'user-screen-name el)) "] "
	(cdr (assoc 'text el)))))
    ))

was einen, sogenannten hook erzeugt, der beim eintreffen neuer Tweets ausgeführt wird. Das Ergebnis ist im Bild oben zu sehen.

Update: Emacs Modeline  (Danke an @cvmat)

Noch unaufdringlicher ist es, die Anzahl ungelesener Tweets in der Modeline anzeigen zu lassen (siehe Bild oben, tw(46)). Hierzu nach (require 'twittering-mode) folgende Zeile in ~/.emacs einfügen:

(twittering-enable-unread-status-notifier)

Desktop notification

Für echte Desktop notification benötigt man ein Hilfsprogramm. Unter Linux liegt den meisten Distributionen notify-send bei. Ich benutze hier Scientific Linux 6.2, wo man das Paket libnotify aus dem Standardrepository installieren muss. Folgender Code muss ~/.emacs hinzugefügt werden

(add-hook 'twittering-new-tweets-hook (lambda ()
  (let ((n twittering-new-tweets-count))
    (if (> n 10)
	(start-process "twittering-notify" nil "notify-send"
		       "-i" "/home/%USER%/.emacs.d/twittering-mode/misc/twitter-icon.svg"
	  (twittering-timeline-spec-to-string twittering-new-tweets-spec)
	  (format "You have %d new tweets" n ))
      (dolist (el twittering-new-tweets-statuses)
	(start-process "twittering-notify" nil "notify-send"
		       "-i" "/home/%USER%/.emacs.d/twittering-mode/misc/twitter-icon.svg"
	  (concat
	   (twittering-timeline-spec-to-string twittering-new-tweets-spec)
	   "\n"
	   (cdr (assoc 'user-screen-name el)))
	  (cdr (assoc 'text el))))
      ))))

%USER% muss durch den eigenen Benutzernamen ersetzt werden. Die Pfade im Codesnippet setzen voraus, dass die Installation von twittering-Mode nach dieser Anleitung vorgenommen wurde. Für jeden neuen Tweet (in jeder geöffneten Timeline) wird jetzt eine Sprechblase 5s lang auf dem Bildschirm erscheinen. Man kann selbstverständlich auch beide hooks nacheinander ausführen lassen. Wer offengelassene (Lisp-) Klammern findet, kann sie behalten. Und jetzt, frohes Ablenken-lassen.

Emacs twittering-mode aufhübschen

Hier nur eine kleine Anregung zur Formatierung der Timeline des Emacs twittering-modes: Diese wird über die Variable twittering-status-format kontrolliert. Folgende Zeile in ~/.emacs einfügen und schon wirkt die Timeline aufgeräumter und lesbarer:

(setq twittering-status-format "%i %FACE[bold]{%S} %FACE[shadow]{@%s}\n%FOLD[  ]{%t\n%FACE[shadow]{%RT{Retweeted by @%s} %@}}\n")

%i steht für Avatar-Icon und kann in der Timeline optional mit i ein- und ausgeschaltet werden oder durch setzen von

(setq twittering-icon-mode t)

dauerhaft aktiviert werden. (Ich bevorzuge die Timeline ohne Bilder – siehe Screenshot). Hier noch ein Listing aller Formatierungsanweisungen aus dem Quellcode:

%s - screen_name
%S - name
%i - profile_image
%d - description
%l - location
%L - \" [location]\"
%r - \" sent to user\" (use on direct_messages{,_sent})
%r - \" in reply to user\" (use on other standard timeline)
%R - \" (retweeted by user)\"
%RT{...} - strings rendered only when the tweet is a retweet.
 The braced strings are rendered with the information of the
 retweet itself instead of that of the retweeted original tweet.
 For example, %s for a retweet means who posted the original
 tweet, but %RT{%s} means who retweeted it.
%u - url
%j - user.id
%p - protected?
%c - created_at (raw UTC string)
%C{time-format-str} - created_at (formatted with time-format-str)
%@ - X seconds ago
%T - raw text
%t - text filled as one paragraph
%' - truncated
%FACE[face-name]{...} - strings decorated with the specified face.
%FILL[prefix]{...} - strings filled as a paragraph. The prefix is optional.
You can use any other specifiers in braces.
%FOLD[prefix]{...} - strings folded within the frame width.
 The prefix is optional. This keeps newlines and does not
 squeeze a series of white spaces.
 You can use any other specifiers in braces.
%f - source
%# - id

Update: GEMA-Scareware

Heute traf mich eine Neuauflage der bekannten GEMA-Scareware, die ich bereits in einem früheren Blog-Post beschrieben habe: Der Zugang zu Ihrem Computer wurde gesperrt. Viel hat sich auf den ersten Blick nicht geändert: Der Text ist etwas anders formatiert und das offizielle Logo von paysafecard ist verschwunden (Es wird aber immernoch über diesen Service abgerechnet.). Neu ist, dass die Scareware jetzt alle Benutzer belästigt und, was noch viel schlimmer ist, sie funktioniert auch im abgesicherten Modus. Glücklicherweise ist der befallene Rechner recht langsam, so dass es mir gelingt den Taskmanager aufzurufen und ich kann gerade noch erkennen, dass eine gema.exe mehrfach gestartet wird. Da der abgesicherte Modus ebenfalls betroffen ist, boote ich den Rechner von der Windows XP-Installations-CD und starte die Notfallkonsole. Ich finde die gesuchte Datei an vier verschiedenen Orten, einmal im Systemordner, dann im Profil aller Benutzer, die seit der Infektion angemeldet waren und im Standardprofilordner:

C:\Windows\System32\gema.exe
C:\Dokumente und Einstellungen\Administrator\Anwendungsdaten\gema\gema.exe
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\gema\gema.exe
C:\Dokumente und Einstellungen\Verwaltung\Anwendungsdaten\gema\gema.exe

Ich kopiere mir ein Exemplar und lösche anschließend alle vier Funde. Nach dem Neustart kann ich mich wieder einloggen und durchsuche die Windowsregistrierung nach gema.exe. Hier eine kleine Auswahl prominenter Treffer:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\gema
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\gema
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\gema.

Prinzipiell kann jeder Schlüssel, der auf eine gema.exe verweist gelöscht werden; Einer muss  allerdings repariert werden. Unter

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit

muss als Wert des Schlüssels wieder der Pfad zur C:\Windows\system32\userinit.exe mit einem abschließenden Komma eingetragen werden (siehe Bild).

Der Virencheck bei VirusTotal liefert zwei Treffer:

Comodo
TrojWare.Win32.Trojan.XPACK.Gen
DrWeb
HEUR:Trojan.DownLoader5.61021

Emacs twittering-mode

An Twitter-Clients für Linux mangelt es eigentlich nicht. Wer aber schon immer gern einen Command-Line-Client haben wollte, oder beim täglichen arbeiten den Emacs ungern verlässt, dem sei twittering-mode (twmode) empfohlen. Ich will die Installation unter Linux (Scientific Linux 6.2) kurz umreißen (sollte auf dem Mac ähnlich funktionieren; unter Windows muss man auf die mitgelieferten Command-Line-Tools zurückgreifen):

Voraussetzungen:

Als erstes die benötigten Abhängigkeiten (Emacs-23 *lol*, curl, wget, gnutls-utils, openssl, gnupg) installieren. Weiterhin wird ein Webbrowser gebraucht — Auf dem Desktop sicher kein Problem; auf der Konsole empfiehlt sich w3m mit w3m.el. Folgender Befehl installiert die Abhängigkeiten unter RHEL 6

# yum install emacs curl wget gnutls-utils openssl gnupg2

Wenn twittering-mode vom Github-Repository installiert werden soll (was ich empfehle), muss ausserdem Git installiert werden:

# yum install git

Installation

Es empfiehlt sich Emacserweiterungen nach ~/.emacs.d zu installieren, was im folgenden auch beherzigt werden soll.

$ cd ~/.emacs.d
$ git clone git://github.com/hayamiz/twittering-mode.git

Zur Emacs-Konfigurationsdatei ~/.emacs muss folgendes hinzugefügt werden:

(add-to-list 'load-path "~/.emacs.d/twittering-mode")
(require 'twittering-mode)

Jetzt Emacs starten und den Twittering-Mode mit M+x twit[1] starten. TWmode meldet sich mit Authorization via OAuth.

Wer browse-url-generic-program in der Emacskonfiguration gesetzt hat, kann hier y drücken, ansonsten n drücken und den Link unter 1. anklicken oder via Copypaste im Browser der Wahl öffnen. Den angezeigten PIN-Code in den Emacs-Minibuffer eingeben und los geht’s mit Twitter im Emacs:

Dauerhafte Authorisierung:

Um nicht bei jedem Start von twmode erneut gegen Twitter autorisieren zu müssen, kann man folgende Zeilen in die Emacskonfiguration ~/.emacs aufnehmen:

(require 'epa-file)
(epa-file-enable)
(setq twittering-use-master-password t)

Hierzu wird GnuPG und EasyPG benötigt. Zumindest letzteres ist in Emacs 23 standardmäßig integeriert und kann durch die beiden führenden Zeilen im obigen Listing aktiviert werden [Update: Für Emacs 23 werden die zwei führenden Zeilen nicht benötigt — Sie schaden aber auch nicht. Dank an @cvmat]. Der oauth-access-token wird verschlüsselt unter ~/.twittering-mode.gpg gespeichert. Beim Start von twmode fragt pinentry die Passphrase zum Tokenfile ab und erlaubt hiermit die automatische Authorisierung gegen Twitter.

Wichtige Kommandos:

u
Neuer Tweet
d
Neue Direct Message
Enter
Reply
F4
URL Verkürzung via tinyurl
C-c Enter
Retweet mit Zitat
C-u C-c Enter
Retweet
g
Timeline aktualisieren
g
Timeline aktualisieren
f
Timelines durchblättern
V
Beliebige Timeline
L
Timeline beliebiger Liste
C-c C-u
Eigene Timeline
C-c C-f
Following Timeline
C-c C-r
Reply Timeline (Antworten auf eigene Tweets)
C-c C-d
Direct Messages Timeline

C bedeutet Control. Zum Suchen von Begriffen in Tweets öffnet man eine neue Timeline (V) mit :search/SUCHBEGRIFF/.

[1] M+x bedeutet Meta und x gleichzeitig drücken. Meta ist auf PC-Tastaturen meistens auf der Alt und auf Mac-Tastauren auf cmd. In jedem Fall sollte die Tastenfolge Esc, x (nacheinander) funktionieren.

Scareware: Der Zugang zu Ihrem Computer wurde gesperrt.

[Update: Hier noch eine neuere Variante der GEMA-Scareware]

Wieder erreicht mich ein Hilferuf zu einer Geiselnahme. Diesmal gibt sich der Erpresser als GEMA aus und erklärt: „Auf Ihrem Computer wurden illegal heruntergeladene Musikstücke („Raubkopien“) gefunden.“ Man hat nun die Möglichkeit das Lösegeld in Höhe von 50 Euro via paysafecard zu entrichten. Gut. Als erstes den Rechner im Abgesicherten Modus starten (F8 drücken vor dem Start von Windows). Im Profilordner des Benutzers unter

C:\Benutzer\<Benutzername>\AppData\Roaming

fällt mir schnell eine Datei mit dem nichts sagenden Namen k8rdift659c.exe auf, die sich mit dem GEMA-Logo als Icon schmückt. In der Windows-Registrierung unter

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

findet sich Eintrag mit dem kryptischen Namen 7Rxb5FismTZydeX, der auf o. g. Datei im Profilordner verweist und für den Start der Scareware bei der Benutzeranmeldung sorgt. Nach dem Löschen der besagten Datei und dem Schlüssel aus der Registrierung konnte der Benutzer sich wieder wie gewohnt anmelden. Ein Check bei VirusTotal offenbart, dass diese Scareware recht neu ist; sie wird von lediglich 2 von 43 Scannern identifiziert:

AntiVir
TR/Crypt.XPACK.Gen2
Kaspersky
HEUR:Trojan.Win32.Generic

Update:

Ich habe den Rechner noch einmal unter die Lupe genommen und weitere Schlüssel in der Windows-Registrierung gefunden, die auf die Datei k8rdift659c.exe  verweisen:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit

Beide Einträge können bedenkenlos gelöscht werden.

Königsberger Klopse, klassisch

Zutaten:

  • 500 g Rinderhack
  • 2 (alte) Brötchen
  • 3 Eier
  • 2 Schalotten
  • 3 eingesalzene Sardellen (Anchovis)
  • 1 L Gemüsebrühe
  • Butter
  • 1 EL Mehl
  • 1 TL Senf
  • 1 Glas Weißwein
  • 2 EL Kapern
  • 1 Zitrone
  • 1 Lorbeerblatt
  • Pfeffer
  • Salz

Zubereitung:

Die Brötchen in Wasser einweichen, Schalotten und Sardellen klein schneiden. In einem großen Topf (min. 3 Liter) die fein gehackten Schalotten anschwitzen, aus dem Topf nehmen und abkühlen lassen. Das Hackfleisch, die ausgedrückten Brötchen, zwei klein geschnittene Sardellen, die Hälfte der angeschwitzten Schalotten, zwei Eier, Salz und Pfeffer zu einem glatten Brei kneten. Butter in den Topf geben und bei geringer Hitze zergehen lassen, einen gehäuften EL Mehl dazugeben und mit einen Schneebesen gut verrühren (Mehlschwitze). Die heiße Gemüsebrühe unter Rühren dazugeben, die restlichen Schalotten und Sardellen, zwei Scheiben Zitrone, Senf, Weißwein und das Lorbeerblatt zufügen. Während die Sauce aufkocht aus dem Fleischbrei 12 kleine (Ø 5 cm) Klopse formen und in den Topf geben. Bei schwacher Hitze, zugedeckt 30 min. ziehen lassen. Die Wartezeit zur Zubereitung der Beilage — am beste passen Salzkartoffeln — nutzen. Die Klopse mit einer Schaumkelle aus dem Topf nehmen und die Sauce durch ein Sieb schlagen. Die Feststoffe entfernen, die Sauce wieder in den Topf geben, Kapern zufügen, erneut aufkochen und den Topf vom Herd nehmen. Ein Eigelb und etwas Butter mit dem Schneebesen einrühren, die Klopse wieder in die Sauce geben und servieren.

(nach Mary Hahn, Illustriertes Kochbuch für die einfache und feine Küche, 1912)

Tagliatelle mit Brokkoli

Zutaten:

  • 1 kg Brokkoli (oder 750g Brokkoliröschen)
  • 1 Becher Schmand
  • 1 Schalotte
  • 2 TL Gemüsebrühe
  • 500 g Tagliatelle

Zubereitung:

Brokkoliröschen in reichlich Salzwasser mit der Gemüsebrühe weich kochen und anschießend aus dem Wasser nehmen. In die Brokkolibrühe die Tagliatelle geben und al dente kochen (mit etwas Übung kann man Brokkoli und Nudeln auch gleichzeitig im selben Topf garen). Nebenbei die Schalotte fein hacken, mit Butter in einer großen Pfanne anschwitzen, anschließend mit Schmand ablöschen und mit Pfeffer und Salz würzen. Die Pfanne vom Herd nehmen, Nudeln und Brokkoli hineingeben und vermengen. In einer Pastaschale oder der Pfanne servieren.

Mac OS X 10.6 Snow Leopard und Canon iR2270 (UFR II)

Ich habe heute versucht einen Canon imageRunner 2270 (iR2270) älteren Baujahrs auf Mac OS X 10.4 (Tiger) und 10.6 (Snow Leopard) zu installieren. Die Postscript-Treiber von der Canon-Website werden von diesem Drucker nicht unterstützt. Wenn man auf selbiger Website etwas nach unten rollt, findet sich ein, sogenannter UFR II Treiber v1.80. Unter Tiger ließ sich der Drucker anschließend installieren, wenn man im Dialog Drucker hinzufügen auf Weitere Drucker klickt. Wie im Bild gezeigt, wird der Drucker dann über Apple Talk gefunden und kann hinzugefügt werden. Hierzu ist es selbstverständlich nötig, dass Apple Talk sowohl vom Drucker als auch vom Mac unterstützt werden.

Die selbe Vorgehensweise führte unter Snow Leopard zu einem Dialog, bei dem der Hinzufügen-Knopf nicht funktioniert (wahrscheinlicher ist, das der UFR II Treiber v1.80 nicht 10.6-kompatibel ist). Auf der Website von Canon USA fand ich einen aktuelleren UFR II Treiber in Version 2.30. Dummerweise gab es jetzt keine Apple Talk-Option mehr (richtig, das wurde ja mit Snow Leopard eingestellt). Also habe ich den Drucker IP-basiert via LPD eingebunden und den UFR-Treiber aus der Liste ausgewählt (siehe Bild). Hierzu muss die IP-Adresse des Druckers bekannt sein, die man aber über sein Konfigurationsmenü erfahren bzw. einstellten kann.

Automatischer Neustart eines Jobs bei Absturz

Manchmal hat man Jobs die einfach nur laufen müssen (z. b. NIS Server, Name Server). Und wenn sie einmal abstürzen, interessiert mich erst einmal gar nicht das Warum. Vielmehr möchte ich das der Jobs einfach wieder los läuft – Am besten von allein. Die näheren Umstände des Absturzes kann ich ja später noch anhand des Logfiles untersuchen. Unter Solaris gibt es hierzu die Service Management Facility (SMF), die sicher stellt, dass Systemdienste laufen und nötigenfalls auch einen (oder mehrere) Neustart(s) des Dienstes versucht, falls dieser abstürzen sollte. Unter Linux habe ich noch kein Äquivalent dazu gefunden. Eine brutale Methode einen Job bei gelegentlichen Abstürzen automatisch erneut zu starten, ist, ihn in einer Endlosschleife aufzurufen:

while true; do ./jobs.sh; done

Diese Methode geht allerdings nach hinten los, falls jobs.sh ein ernsthaftes Problem hat und sofort nach dem Start wieder terminiert. Zur Sicherheit sollte man also die Neustartorgie durch einen Zähler begrenzen, z. B. auf 1000 Versuche:

for i in {1..1000}; do ./jobs.sh; done

Das ist nicht elegant, hilft aber gelegentlich abstürzende Programme am Laufen zu halten.  Ist der kritische Zählerstand erreicht, wird nicht weiter versucht den Job neu zu starten. Man kann sich hierüber z. B. per Mail an root an  informieren lassen:

for i in {1..1000}; do ./jobs.sh; done ; echo "Message" | mail -s "Job died." root