Freitag, August 10, 2012

XMonad and Org-Mode

After a while playing with XMonad and Org-Mode in Emacs I wrote a function for XMonad to start a Note-File with Emacs in XMonad.

First of all I will have a prompt which shows me all the current org-files in a given directory and then I will select one of the shown files or create a new one.

The following function will produce this prompt and shows me alle available org-files in a given directory.

firingOrgPrompt :: FilePath -> X ()
firingOrgPrompt path = do
  files <- liftIO $ getDirectoryContents path
  inputPromptWithCompl defaultXP "Org" 
    (mkComplFunFromList $ filterOrg files) ?+ (openOrgFile path)
    where openOrgFile p f = spawn (emacsClient ++ p ++ "/" ++ f)
          filterOrg f = filter (endswith ".org") f

After writing this function you will define some keyboard shortcuts in your xmonad.hs file.

myKeys = \c -> newKeys c `M.union` keys defaultConfig c
newKeys (XConfig {modMask = modm}) = M.fromList $
   [ ((modm, xK_n), firingOrgPrompt (wikiRootPath ++ "notes")) ]

After that you have to define the variable emacsClient and wikiRootPath. The variable emacsClient could alse be the function getEditor.

After reloading your XMonad you could hit M-n and you get a prompt where you could select one of those org-files.

Montag, Juni 18, 2012

Labels in Mutt

Nachdem ich wieder zu Mutt gewechselt bin, wollte ich jetzt endlich meine Emails auch über Labels verwalten. Leider funktioniert das in Mutt nicht out-of-the-box, aber auch nicht schwer umzusetzen.

Mutt unterstützt seit einiger Zeit das Arbeiten mit dem Header X-Label. Das heißt man kann nach diesem mit ~y filtern und auch über %y diese Labels im Index anzeigen lassen. Das heißt es muß nur noch eine Möglichkeit geschaffen werden diese Labels zu setzen. Es gibt auch einen Patch dazu für Mutt aber ich wollte meinen Mutt nicht patchen und deshalb entschied ich mich zu einer selbst geschriebenen Lösung. Folgendes stellt ein ganz einfaches Skript dar dies umzusetzen.

file=$1
tmpfile=$file.$$

old_labels=`formail -x "X-Label:" < $file | tr -d '\n' | sed 's/^[ \t]*//'`

read -e -p "Edit Labels: " -i "$old_labels" new_labels

formail -I "X-Label: $new_labels" < $file > $tmpfile
mv $tmpfile $file

Hier wird mit dem Programm formail gearbeitet, das mit procmail mitgeliefert wird und das Bearbeiten von Emails unterstützt. Hier werden zunächst alle Labels die in diesem Email gesetzt sind ermittelt und danach von der Kommandozeile gefragt welche Labels hinzugefügt werden sollen. Danach werden diese gesammelten Labels wieder in dieser Nachricht geschrieben.

Jetzt muß man Mutt nur noch einen Keyboard-Shortcut lernen damit man mit diesem Script arbeiten kann.

macro index Y ':set editor=mutt_label_editor<return><edit>:set \
editor="emacsclient -c"<return><sync-mailbox>' "edit X-Label for message"

Diese definiert ein Macro in Mutt, welches man mit Y aufruft. Hier wird dann das Skript muttlabeleditor aufgerufen, das den obigen Inhalt hat. Wichtig zu erwähnen ist hier noch das ich am Schluß auch noch die Mailbox synchronisiere. Das kann zu Problemen führen wenn vor dem Starten dieses Skriptes schon Nachrichten zum löschen markiert wurden. Diese sind danach gelöscht. Wenn man nun folgende Zeile in die .muttrc einträgt sieht man auch die definierten Labels im Index.

set index_format="%4C|%?M?+& ?%2M|%Z|%2N|%D| %-30.30F %s %> %?y?%.30y?|%4c"

Danach kann man schon recht komfortabel mit den Labels arbeiten.

Back to Mutt

Nachdem ich von Vim auf Emacs umgestiegen bin, wollte ich natürlich auch meine Emails mit Emacs schreiben, betrachten und vor allem verwalten. Ich hatte in den letzten Monaten einige Email-Clients für Emacs ausprobiert, dazu gehören Gnus, RMail, VM und Wanderlust.

Begonnen hatte ich mit Gnus. Es ist meiner Meinung der bekannteste Email-Client für Emacs und läßt sich auch äußerst gut konfigurieren. Man kann so ziemlich alles was man sich wünscht damit anstellen. Manche Dinge gehen leichter und manche wieder umständlicher. Nachdem Gnus immer langsamer wurde und ich auch nach Monaten noch keine zufriedenstellende Konfiguration für mich hatte sah ich mich um Alternativen um. Wie schon oben erwähnt sah ich mir danach RMail, VM und Wanderlust an.

RMail ist in Emacs standardmäßig enthalten und verwendet standardmäßig, seit Emacs 23, das mbox-Format. Hier habe ich es nicht geschafft eine für mich arbeitsfähige Konfiguration zu erstellen, damit ich gut mit RMail arbeiten konnte.

Danach sah ich mir VM an. VM sollte RMail ablösen und dieses verbessern und auch noch Wanderlust, welches eine sehr gute IMAP-Unterstützung haben soll. Da ich diese aber nicht brauche, weil ich meine Emails per POP auf meinen Rechner hole war dies nicht relevant für mich.

Alles in Allem kam ich aber mit keinen der genannten Mailclients zurecht. Entweder unterstützte einer das von mir gewünschte Format nicht oder die Konfiguration war zu umständlich. Das hieß ich wechselte wieder zurück zu der Kombination procmail, mutt und Emacs als Editor. In Gnus habe ich die Emails direkt in Gnus in verschiedenste Ordner einsortiert, dies geschieht jetzt wieder mit procmail und ich bin sehr zufrieden damit weil ich z.B. durch folgende Regel allen Emails die von einer speziellen Mailingliste kommen einen Header-Eintrag hinzufügen.

:0
* ^(TO|CC).*mailing-list.*
{
   LABELS=`formail -x "X-Label:" | tr -d '\n'`
   :0
   | /usr/bin/formail -I"X-Label: $LABELS lists" \
   >> $MAILDIR/inbox
}

In dieser Rule wird von einer bestimmten Mailinglist der Header nach X-Label durchsucht und diese Labels gespeichert und ein neuer Header-Eintrag erstellt mit den alten Labels und einen neuen Label lists.

Mutt habe ich schon sehr lange verwendet und diesen auch sehr gerne genutzt. Da ich von Vim auf Emacs gewechselt bin wollte ich mir auch einen Email-Client ansehen der direkt in elisp geschrieben wurde. Leider bin ich mit keinen dieser klar gekommen und bin jetzt wieder sehr zufriedener Mutt-User. Als Editor für neue Emails verwende ich nach wie vor Emacs. Wenn man folgende Einstellung in der .muttrc macht wird auch der Emacs schnell gestartet.

set editor = "emacsclient -c"

Hier wird Emacs in einem neuen Frame gestartet und dies geschieht bei einer laufenden Emacs-Instanz sehr schnell.

Mittwoch, April 04, 2012

Scrum und Org-Mode II

Ich habe zuletzt einen Artikel geschrieben, wie man mit dem org-Mode von Emacs mit Scrum arbeiten kann. Da Bilder so etwas erstaunliches haben, möchte ich hier einen Screenshot posten von einem Testprojekt wie ich mit Scrum und dem org-Mode von Emacs arbeite.
Hier kann man sehen wie ich einen Sprint angegt habe, dazu sämtliche Informationen in dieser Datei sammle und auch den Product-Backlog mitführe. Auf der rechten Seite sieht man das Burndown-Chart eines laufenden Sprintes. Dieses Chart ist mit Gnuplot erstellt worden und man sieht den Inline-Code am Screenshot.

Freitag, März 23, 2012

Landesführertagung der PfadfinderInnen NÖ

Am Wochenende ist Landesführertagung (LFT) und ich freue mich schon auf ein nettes und umfangreiches Programm und interessante Diskussionen. Die Landesführertagung in diesem Jahr steht ganz im Zeichen unseres Bundesthemas Fünf vor 12.

Das Programm für diese Landesführertagung findet ihr auf der Homepage des Landesverbandes NÖ.

Scrum und Org-Mode

Um Scrum in der Entwicklung durchführen zu können benötigt man 3 unterschiedliche Phasen.

  • Sprint Planung
  • Sprint Review
  • Daily Scrum

Hier möchte ich mich mit der dritten Phase, dem Daily Scrum, beschäftigen und wie man mit Emacs und dem Org-Mode diese Prozess durchführen kann. Es gibt sicherlich verschiedenste Ansätze, hier nur ein möglicher. Für das 'Daily Scrum' wird als Werkzeug das Taskboard verwendet, wo alle Tasks eines Sprintes aufgelistet werden. Ein Task ist eine Aufgabe die eine oder mehrer Personen durchführen können.

Ein Task hat einen Titel, eine oder mehrere Personen die diesen Task durchführen und einen Sprint dem er eingeordnet ist. Ein Sprint ist eine zeitliche Abgrenzung von mehreren Tasks. Überlicherweise dauert ein Sprint 2 oder 3 Wochen.

Wir müssen zunächst den Status eines Tasks definieren. Der Status eines Tasks kann sein Planing, Processing oder Done. Also 'In Planung', 'In Arbeit' oder 'Erledigt'. Diese können wir jetzt in einer Datei folgendermaßen definieren:

#+TODO: Planning(p!) Processing(r!) | Done(d!)

Zusätzlich muß man die Personen die an einem Projekt arbeiten mitführen. Dies mache ich über Tags. Die Tasks kann man auf global für eine Datei festlegen mit

#+TAGS: odi(o) franz(f) max(m)

Danach bekommt man immer eine Auswahl von Personen wenn man ein Tag einem Task zuordnet. Jetzt können wir unseren ersten Sprint planen und legen einen ersten Sprint an und fügen ihm ein Tag mit C-c C-q mit dem Namen 'sprint1' hinzu.

* Sprint 1 [/]        :sprint1:

Das Element '[/]' wird durch die Anzahl von Tasks die in dem Sprint vorhanden sind bzw alle erledigten ersetzt. Das geschieht automatisch. Das kann dann folgendermaßen aussehen:

* Sprint 1 [1/1]      :sprint1:
** Planning Aufgabe 1     :odi:
** Done Aufgabe 2         :max:

Jetzt kann man alle Tasks die man anlegt und verschiedene Stati haben auswerten. Das kann man mit der Tastenkombination C-c a t machen. Damit kommt man in die Agenda-View wo man nach allen möglichen Aspekten filtern kann. Man kann sich z.B. ansehen Welche Tasks in dem Sprint 1 gerade in Arbeit sind.

C-c a t / <TAB> sprint1 2 r

Zusätzlich kann man dann natürlich auch noch nach den einzelnen Personen filtern die gerade Tasks in diesem Sprint in Arbeit haben.

Mythos Motivation

Für alle sich mit Motivation von MitarbeiternInnen beschäftigen oder beschäftigen müssen möchte ich folgendes Buch ans Herz legen.

Mythos Motivation - Reinhard K. Sprenger - ISBN13: 9783593368948

Reinhard K. Sprenger geht hier seinen ganz eigenen Weg bezüglich der Motivation und Motivierung von Menschen. Er zeigt auch auf warum Anreizsysteme böse sind und was es mit den Begriffen Motivation, Motivierung und Demotivation bzw Manipulation auf sich hat.

Es war für mich auf jeden Fall sehr lesenswert.