Christian's Blog

Ich bin ein Fan vom “Herumstöbern” und dem Finden neuer, interessanter Dinge. Das passiert oft “im Fluss” im Netzwerk: Man mag Seite X, dort ist Person Y verlinkt. Also liest man sich deren Beiträge mal etwas genauer durch. Das Internet bietet prinzipiell beste Voraussetzungen zum Herumstöbern und kreativ werden. Eine schier unendliche Menge an Dingen, die es kennenzulernen gilt. Ebenso, das Potential des Vernetzens mit anderen Menschen ist groß. Diesen Aspekt werde ich jedoch in einem folgenden Wunsch-Post beleuchten.

Wunsch

Ich würde mir ein Werkzeug wünschen, das es mir erlaubt, verwandte Dinge im Internet aufzuspüren. Ich finde Ding X klasse und bin auf der Suche nach ähnlichen Dingen, von denen ich mir erhoffe, dass ich sie ebenso toll finde. Dafür ist das Internet doch wie geschaffen: Dinge werden beschrieben, und von Menschen verlinkt. Jedoch scheint mir das klassische “Finden”-Werkzeug (die Suchmaschine) hier zu fokussiert auf das Finden einzelner Dinge, die einer bestimmten Beschreibung folgen. Das Finden von Vergleichbarem zu einer gegebenen Sache ist dagegen nicht vorgesehen. Beispielsweise weiß ich, dass ich Musiker M mag, also suche ich nach ähnlichen Künstlnern in der Hoffnung, dass sich darunter auch einige Perlen verbergen.

Das Prinzip “Person X und Y mögen ähnliche Dinge, also können sie ihr Interessens-Netzwerk ergänzen “, finde ich äußerst überzeugend. Im Internet fehlt mir bis dato jedoch das passende Werkzeug, um es zu praktizieren.

Was existiert?

  • Eine Website im Netz erlaubt es, eine Software einzugeben, um Alternativen ausfindig zu machen. Etwas vergleichbares suche ich für beliebige Dinge: Gemälde, Geschichten, Bücher, Lieder, Ideen, …
  • Knowledge Graph von Google müsste unter der Haube genau dies sein. Aber aus mir unerfindlichen Gründen, gibt es keinen öffentlichen Zugang zum Graph selbst.

Lösungsvorschlag

Das ganze sollte über eine Website mit Datenbank einfach zu lösen sein:

  • Implementiere eine Datenbank, die eine Liste von Dingen und deren Vernetzungen beinhaltet.
  • Registrierte Personen sollten Dinge vernetzen können.
  • Besucher der Website werden mit einem Suchfeld präsentiert, über das sie nach einem Ding suchen können.
  • Als Suchergebnis erhalten sie entweder eine Visualisierung des gefundenen Dings, mitsamt der Dinge mit denen es vernetzt wurde, oder die Möglichkeit, das Ding selbst in die Datenbank einzutragen.
  • Visualisieren könnte man das Suchergebnis entweder als Liste oder als Graph.
  • Verfeinern kann man die Vorschläge zu ähnlichen Dingen, indem man nicht nur diejenigen Dinge zeigt, die zueinander vernetzt wurden, sondern die insgesamt zu ähnlichen Dingen vernetzt wurden.

Ich möchte meinen Blog in Zukunft als Platform für Ideen nutzen, die ich selbst gerne implementiert sähe, zu deren Umsetzung mir jedoch die Zeit fehlt. Gerne würde ich an dieser Stelle sehen, wie ihr den vorgestellten Wunsch realisiert habt oder wie ihr ihn lösen würdet. Kommentare und Ideen sind gerne gesehen! Vielleicht habt ihr auch bessere Ideen / Ansätze, die den vorgestellten Wunsch überflüssig machen.

Wunsch

Der erste Wunsch, den ich vorstellen möchte ist, erhaltene Informationen zu priorisieren. Die Unmengen an Informationen, in Form von beispielsweise e-Mails oder Feeds, die auf mich einprasseln führen bei mir oft zu einer Überforderung, alle Informationen durchzugehen und sinnvoll auszusortieren. Ich hätte gerne eine semi-automatisierte Lösung, die durch Training durch mich meine Prioritäten lernt und anschließend neue Informationen entsprechend klassifiziert.

Ich habe bereits von Googlemails “Priority Inbox” gehört. Jedoch würde ich meine Daten ungern aus der Hand geben. Ich verwende seit langem Thunderbird und würde aus diesem Grund ein Thunderbird Addon bevorzugen.

Lösungsvorschlag

Mein intuitiver Ansatz wäre folgender:

  • Verwende einen Klassifikator/Predictor, um für eine eingehende Information eine Priorität vorherzusagen. Ein simpler Ansatz wäre ein Naive Bayes Klassifikator.
  • Trainiere den Klassifikator mit meinen eigenen Prioritäten: Eingehende e-Mails werden entweder auf einer kontinuierlichen Skala (von minimaler bis maximaler Priorität) oder in Kategorien (zwischen Wichtig, Interessant, ..., Unwichtig) bewertet. Im Falle eines Naive Bayes Klassifikators wird die eingehende e-Mail in ihre Einzelwörter zerlegt, und für jedes Wort die Wahrscheinlichkeit aktualisiert, dass sie Teil einer e-Mail ist, die der gewählten Priorität zugeordnet wird.
  • Neue eingehende e-Mails werden dann basierend auf den Wahrscheinlichkeiten der Einzelwörter in bestimmte Klassen zugeordnet.

Alternativ zum Naive Bayes Klassifikator, und von mir eigentlich bevorzugt, könnte man einen Predictor verwenden, der Prioritäten einer kontinuierlichen Prioritäten-Skala vorhersagt. Beispielsweise ein Lineares Regressions Modell.

Außerdem wird beim Einzelwort-Klassifikator vernachlässigt, dass Kombinationen von Wörtern andere Bedeutungen (sprich Prioritäten) haben könnten, als die der Einzelwörter. Dies könnte in komplexeren Modellen berücksichtigt werden.

Quick & Dirty

Ich behelfe mir nun notdürftig, indem ich meine e-Mails / Feeds in 5 Klassen (Tags) einordnen lasse. Dazu verwende ich das TaQuilla Addon für Thunderbird, welches mithilfe eines Naive Bayes Klassifikators und der Einzelwörter der Mails / Feeds Wahrscheinlichkeiten für jeden Tag vorhersagt und dann die Mails automatisch entsprechend tagged. Dies funktioniert aus den oben genannten Gründen semi-gut. Häufiges Problem ist, dass für eine Mail / einen Feed mehrere Prioritäten verhergesagt werden. Außerdem werden Wort-Kombinationen nicht berücksichtigt.

In the meantime, 31 people took part in tolerance (again) (after we had to encourage you to do it again, as our first version had a bug and didn’t store your nationality tipps):

  • 1 Dutch
  • 1 Brazilian
  • 2 Swiss
  • 1 British
  • 1 Australian
  • 1 Canadian
  • 1 French
  • and the rest Germans.

Now, the percentages of guesses look as follows:

The percentages of correct guesses are definitely higher than we expected. And that has a simple explanation: Up to now approximately 95% of all participants originate from Germany, Denmark, Switzerland and Austria. That is, because Yannic and I spread the message only in our social networks.

We are currently thinking how we can spread the message better to other countries.

We already took another step: We improved part of tolerances code and made it easy to extend with new languages. We started (of course) by adding a German translation (additionally to previously existing English). We will put the new version up during the next days, until then the version hosted under https://tolerance.cwiwie.org and https://tolerance.yhaupenthal.org are still providing the original version. Soon we will also add Danish as another language. These languages will help mostly help the older generation to also take part.

However, we are aware, that the weakest point is not yet tackled. We need more participants of non-EU-countries, if tolerance should be representative at some point. Soon, we will publish more details about the nationalities of participants so far; at this point I can already so as much: non-EU-participants can be counted on one hand.

To make tolerance more known in non-EU-countries, we plan to translate it into even more languages. We could start with

  • Spanish
  • Arabic
  • Syrian
  • Chinese

And for that we need your help! If you speak a language not yet integrated into tolerance (so almost any :-D), contact us or send us a pull request on GitHub.

Thanks!

Update:

Leider sind aufgrund eines Bugs (shit happens) eure getippten Nationalitaeten nicht in der Datenbank gespeichert worden; nur eure Antworten auf die Fragen. Wir bitten euch deshalb, den Fragebogen nochmals zu wiederholen. Eure Antworten kennt ihr ja noch – es sollte also schnell gehen. Sorry & Vielen Dank!

Generelle Idee

Vor ein oder zwei Monaten hatte ich folgende Idee:

Eine Website mit einer Umfrage zu bauen, auf der Menschen aus allen Teilen dieser Welt Fragen beantworten sollen, die eine lebensbedrohliche Situation beschreiben und einige Antwortmoeglichkeiten aufzeigen. Der Sinn dahinter ist recht einfach: Ich wollte zeigen, dass alle Menschen sich so oder so aehnlich verhalten wuerden wie die Fluechtlinge, die gerade aus Laendern, in denen Krieg herrscht, fluechten.

Der Witz an der Sache: Nachdem auf der Website 10 Fragen beantwortet wurden, werden 10 Fragen-Antwort-Paare von einer anderen Person praesentiert und es soll deren Nationalitaet (entsprechender Kontinent) erraten werden.

Ich schlug die Idee Y. vor, weil ich dachte dass wir das gut zusammen aufbauen koennten :–) Er mochte die Idee und wir diskutierten, wie man die Idee am besten realisiert.

Im Kern: Wir denken, dass man die Nationalitaet der teilnehmenden Personen aus den gegebenen Antworten nicht ableiten kann und hoffen mit unserer Website verdeutlichen zu koennen, dass Menschen unterschiedlicher Nationalitaet bei existentiellen Fragen meist der gleichen Meinung sind.

Um dies auf der Website noch zu verdeutlichen, visualisieren wir die Prozentzahl der korrekt und inkorrekt geratenen Nationalitaeten (Kontinente) in einem Chart an.

Open Borders

Da wir gedenken in Zukunft noch weitere solcher Projekte zu starten, haben wir uns kurzerhand “Open Borders” getauft. Unter diesem Namen werden wir in Zukunft weitere Projekte veroeffentlichen:

Designphase

Die Idee dahinter war also recht klar, und wir fingen damit an, auf einem Pad bei Riseup ein paar Szenarios zu entwickeln, mit den dazugehoerigen Antwortmoeglichkeiten. Noch am selben Tag machten wir uns Gedanken, welches System wir nutzen wollen und wo wir es hosten koennen. Yannic schlug Limesurvey und erstmal seinen Server vor. Gesagt, getan, wir installierten Limesurvey, kamen aber recht sehr schnell zu dem Schluss, dass das nicht das richtige Tool unserer Wahl ist. Limesurvey war zu sehr zugeschnitten auf klassische Umfragen. Unsere Idee vor dem Stellen einer Frage zunaechst die Situation ausfuehrlich zu beschreiben um Mitgefuehl zu erzeugen liess sich hiermit nicht realisieren.

Deshalb entschloss ich mich in den Tagen darauf, das ganze selbst in Ruby-on-Rails zu basteln, und erstellte ein Repository bei GitHub. Nach einigen Tagen Coden gab es schon eine erste Version lokal, die wir dann ein wenig austesteten und schonmal sehr cool fanden. Wegen Zeitmangel baute ich ich erst ein paar Wochen spaeter nochmal weiter und hatte recht schnell eine erste Version fertig, die zur Veroeffentlichung bereit war.

Als groesste Herausforderung dabei stellte sich heraus, dass wir keine

  • Literaren
  • Grafiker oder
  • Psychologen sind.

Wir mussten deshalb unseren Perfektionismus etwas zuegeln und einige Situationsbeschreibungen, Fragen und Antworten haetten deshalb wahrscheinlich besser formuliert werden koennen. Wir entschlossen uns dann, eine erste Version recht schnell zu veroeffentlichen (auch da zur Zeit das Fluechtlings-Thema so stark debatiert ist), und auf der Website Leute zum Mitmachen aufzurufen.

Ruby on Rails App

Da Ruby on Rails auf dem MVC (Model-View-Controller) Designmuster basiert, koennen die Einheiten, die in der App modelliert werden sollen, direkt umsetzen. Sie besteht deshalb aus den folgenden Modellen:

  • User
  • Situation
  • Question
  • Answer (UniversalAnswer)
  • Nationality
  • Continent
  • Survey

Zwischen diesen Modellen gibt es die folgenden Beziehungen (png generiert aus modes.dot, welche wiederum mit dem Ruby-Gem railroady aus meinem RoR Model Definitionen generiert wurde):

UML Diagram der RoR Modelle generiert mit railroady

Fuer die Templates verwenden wir Twitter Bootstrap, sodass das ganze schon direkt recht ansehnlich aussieht. Wir nutzen (wegen Einfachheit) SQLite fuer die Datenbank und die JavaScript LibraryHighcharts zum Visualisieren der Verteilung richtig geratener Nationalitaeten. Zu Beginn des Surveys versuchten wir im Stil von “The Stanley Parable” mit einem Erzaehler namens “Line” etwas Emotion zu erzeugen. Da wir keine Schriftsteller sind, ist fraglich ob uns das so gut gelungen ist ?

Wir suchen u.a. daher nach Unterstuetzung!

Yannic richtete die App dann auf seinem Server ein und startete – mit einem Fehler. Nachdem wir ein paar Tage nichts weiter daran gemacht haben, fanden wir den sehr dummen Bug (falsche IDs in der DB seed.rb) und die Seite ging online.

Selbst-Werbung

Wir kommunizierten das ganze auf Twitter und Facebook. Wir bekamen sofort positives Feedback, und dass die Idee

“awesome” — Facebook user (a.k.a Nicky Cordua Mattsson)
ist. Dennoch: Bislang hat leider kaum jemand abgestimmt. Der Erfolg unseres Projekts haengt jedoch leider davon ab, dass wir genuegend Teilnehmende haben. Daher schreiben wir hier noch einmal etwas ausfuehrlicher darueber und hoffen, dass ein paar von euch unsere Idee cool finden und am Projekt teilnehmen bzw. es weiterverbreiten.

Hier nochmal der Aufruf von der Projekt-Website:

Links: http://tolerance.cwiwie.org oder http://tolerance.yhaupenthal.org (demnaechst dank Let’s Encrypt dann auch mit einem SSL-Zertifikat)

Danke! :–)

Nachdem gestern der Ubuntu-Upgrade-Prozess (mal wieder) die Ubuntu Installation auf meinem alten Laptop zerschoss, hatte ich vor der Neuinstallation noch Gelegenheit, Sicherungen der wichtigsten Ordner anzulegen. Dabei stellte ich fest, dass die Ordner viel größer waren, als erwartet und dies überwiegend bedingt durch überflüssige Dateien, die ich ewig nicht mehr angerührt hatte.

Mich packte der Aufräumwahn und ich suchte nach einem simplen Tool, welches mir anzeigt, in welchen Ordnern ich am meisten Dateileichen liegen habe. Diese Dateien würde ich dann von der Sicherung ausschließen und löschen.

Dateileichen = Dateien, vor Ewigkeiten heruntergeladen, und seitdem nie wieder angefasst. Das heißt, access_time(Leiche) < now – x_days

Diese Leichen möchte ich finden, um sie hinterher (nach manueller Überprüfung) zu löschen. Meist sind das verhaltete Installationsdateien irgendwelcher Software (die ich meist gar nicht mehr benötige) oder Ergebnisse alter abgeschlossener Analysen. Im Allgemeinen, oft jede Menge Schrott, den ich bedenkenlos löschen kann.

Whitelist

Manchmal sind es jedoch auch Dateien/Ordner, die ich gerne für später aufheben würde (“es kann ja sein, dass man es nochmal braucht” – hehehe). Das bedeutet, ich möchte eine Whitelist mit Dateien und Ordnern führen, die ich von der Suche per se ausschließe, da ich sie für wichtig erachte.

Verzeichnis-Gruppierung

Außerdem stellte ich schnell fest, dass die Übersichtlichkeit schnell flöten geht, wenn ich einfach alle solche Dateien nach STDOUT schreibe. Daher wollte ich die Dateien nach Verzeichnis gruppieren und pro Verzeichnis nur die Anzahl solcher Leichen ausgeben.

Da ich im Netz nur spartanische Skripte ohne Whitelist Funktionalität gefunden hab, hab ich kurzerhand selbst ein kleines Bash Skript geschrieben, basierend auf find, grep und gawk.

  • Zunächst sucht find im angegebenen Verzeichnisbaum nach allen Dateien (nicht Ordnern), auf die mindestens seit x Tagen nicht zugegriffen wurde.
  • Dann testet grep, welche dieser Dateien gegen mindestens eins der Whitelist-Pattern matched und filtert diese heraus.
  • Schließlich ist gawk für das Gruppieren der Leichen pro Verzeichnis zuständig. Hierzu iteriert es über jede Dateileiche, und erhöht für jedes seiner Oberverzeichnisse bis hin zu root die Leichen-Zahl um eins.

Beispiel:

Ist die Datei /home/user/Downloads/test.txt eine Leiche, so wird die Leichenzahl für

  • /
  • /home
  • /home/user
  • /home/user/Downloads

je um eins erhöht. Am Ende schreibt gawk die Counts pro Verzeichnis sortiert nach Verzeichnis nach STDOUT.

Das Skript

#! /bin/bash

[ $# == 2 ] || (echo "Two arguments expected" && exit)

printf "Finding subfolders in %s with files not accessed at least %d days\n" $1 $2
touch ausmisten.whitelist
# look for files in given folder which are older than given number of days 
find $1 -atime +$2 -type f > ausmisten.result
# filter files based on whitelist
grep -vf ausmisten.whitelist ausmisten.result > ausmisten.filtered
# print number of such files per folder
printf "#files\tIn Directory\n"
gawk ' BEGIN{OFS="\t"} { i=0; while((newPos = index(substr($0,i+1),"/")) && newPos > 0) { i=i+newPos; counts[substr($0,1,i)]++; }; } END{ asorti(counts,sorted); for (i = 1; i <= length(counts); i=i+1) { elem = sorted[i]; print counts[elem],elem } }' ausmisten.filtered

Argumente des Skripts sind

  • das Base-Verzeichnis in dem gesucht werden soll
  • die Anzahl Tage, die der letzte Zugriff auf eine Datei zurückliegen muss, sodass sie als Leiche betrachtet wird.

Die Whitelist Datei befindet sich im gleichen Verzeichnis wie das Skript und enthält pro Zeile einen absoluten Pfad:

/.
/usr/
/opt/

Die erste Zeile bewirkt, dass keine versteckten Ordner/Dateien betrachtet werden. Außerdem ist es wichtig, die Ordner mit einem endenden / anzugeben, da ansonsten Ordner die nur einen zusätzlichen Postfix haben ebenfalls ausgeschlossen werden: /home/user/test würde auch den Ordner /home/user/test2 ausschließen.

In meinem Download-Verzeichnis findet das Skript mit sh ausmisten.sh /home/USERNAME/Downloads 100 die folgenden Leichen (länger als 100 Tage kein Zugriff):

Finding subfolders in /home/USERNAME/Downloads with files not accessed at least 100 days
# files In Directory
53 /
53 /home/
53 /home/USERNAME/
53 /home/USERNAME/Downloads/
10 /home/USERNAME/Downloads/RRW/
1 /home/USERNAME/Downloads/RRW/META-INF/
28 /home/USERNAME/Downloads/freduce/
3 /home/USERNAME/Downloads/freduce/R.packages/
25 /home/USERNAME/Downloads/freduce/bin/
2 /home/USERNAME/Downloads/gecko-1.2.1/
2 /home/USERNAME/Downloads/kual/
4 /home/USERNAME/Downloads/ncbi-blast-2.2.29+/
2 /home/USERNAME/Downloads/ncbi-blast-2.2.29+/bin/
1 /home/USERNAME/Downloads/ncbi-blast-2.2.29+/doc/

Dieses Skript führe ich nun einmal wöchentlich aus, sodass ich regelmäßig ausmiste und beim nächsten Backup nicht wieder vor einem Berg von unnötigen Dateien stehe :–)

Heute möchte ich ein wenig aus meinem Privatleben berichten und wie ich versuche, es zu einer für mich erstrebenswerteren Form zu führen. Übrigens impliziert erstrebenswerter für mich insbesondere naturverbundener, woraus indirekt auch “gesünder” und “ausgeglichener” folgt.

Die größte und wichtigste Herausforderung...

...eines Menschen zu einem glücklicheren und erfüllten Leben ist meiner Überzeugung nach, dass er/sie sein Leben nach den eigenen Idealen lebt. Wie, das war’s schon? Ja. Auch wenn der Satz trivial klingt, ist er gar nicht so einfach umzusetzen. Wohin man auch schaut, mit wem auch immer man sich unterhält, die meisten Probleme der Erdenbewohner sind hausgemacht in dem Sinne, dass es eine zu große Diskrepanz gibt zwischen (1) dem was man als erstrebenswert und als sein Idealleben erachtet und (2) dem was man tatsächlich lebt. Eine solche “Lebens-Diskrepanz” in gesunden Maßen (wie immer) ist nicht schädlich sondern führt dazu, dass der Mensch sich auf einem gesunden  Pfad seinen Zielen nach weiterentwickelt. Ein Mensch mit einer zu großen Lebens-Diskrepanz ist jedoch selten glücklich, denn er muss sich ständig messen mit seinen Idealen die ach so hoch hängen und feststellen, dass er stetig daran scheitert sich ihnen anzunähern.

Eine Lebens-Diskrepanz kann interne und externe Ursachen haben. Gegen beide Arten können wir etwas unternehmen: Als interne Ursache bezeichne ich beispielsweise ein übertrieben hohes Ansiedeln der Ideale, die jedes Erreichen von vornherein ausschließen oder frustrierend unrealistisch machen. Der innere Schweinehund ist eine weitere innere Ursache. Diese Ursachen haben wir direkt selbst in der Hand, indem wir das Problem erkennen und unsere Einstellung zum Problem ändern: den Schweinehund überwinden oder unsere Erwartungen niedriger ansiedeln.

Externe Ursachen sind erst einmal bestimmt durch äußere Einflussfaktoren und nicht durch uns selbst: Die Menschen um uns herum, Freunde, Familie, unsere Arbeit, die Gesellschaft mit ihren Erwartungen und sozialen Normen, aber auch die (technologischen) Möglichkeiten der Zeit. All dies beeinflusst sowohl die Art wie wir Leben (wir verbringen Freizeit am PC/vor dem TV und weniger in geselligen Runden mit Gesellschaftsspielen, fahren mit dem Auto/dem Bus/der Bahn zur Arbeit und gehen weniger zu Fuß) als auch unsere Normen und Werte, Ideale und Ziele. Dies kann zur Folge haben, dass (1) wir wegen äußerer Einflüsse davon abgehalten werden unseren Idealen und Zielen nachzugehen oder (2) sich wegen der äußeren Einflüsse unsere Ideale und Ziele in das Unwirkliche verschieben. Im Allgemeinen kann man externe Ursachen lösen, indem man sich von diesen äußeren Einflussfaktoren unabhängiger macht, mit ihnen Kompromisse aushandelt oder, falls dies nicht möglich ist, sich gänzlich von ihnen löst. Dies ist in manchen Situationen sicher sehr schwierig, beispielsweise falls die Arbeitsstelle der Hauptgrund dafür ist, dass man seinen Zielen nicht folgt. Von Beispielen für solche extremen Loslösungen von der Gesellschaft liest man immer wieder und hört sich in meinen Ohren zwar sehr verlockend an, ist jedoch sicherlich mit vielen Nachteilen verbunden. Für mich scheint ein Kompromiss erstrebenswerter.

Ich möchte meine Situation anhand zweier Grafiken verdeutlichen:

Die Gründe

Kurz zusammengefasst ist meine Lebens-Diskrepanz größtenteils bedingt durch die fehlerhafte Priorisierung von “PC/Internet” und “Leben ohne PC”. Diese Diskrepanz vermittelt mir über lange Zeiträume das Gefühl, dass ich meine Zeit verschwende und nicht hundertprozentig das richtige mit meinem Leben anfange. Ich tue viele Dinge, um meinen Idealen nachzueifern (Menschen helfen, der Menschheit etwas gutes tun/sie weiterbringen), aber dabei bleibt meine eigene Entfaltung und Sehnsüchte größtenteils auf der Strecke (mehr Nähe zur Natur, wandern, ein paar einsame Stunden). Die Ursachen sind eine Mischung aus internen und externen Faktoren, wobei die externen Faktoren überwiegen: Zu den internen Faktoren zähle ich Introvertiertheit und der daraus folgende Schweinehund. Die gewichtigen externen Faktoren sind die Art wie unsere Gesellschaft funktioniert und welche Formen sie heute annimmt. Alles ist jetzt schon und wird immer bequemer gestaltet (Transportmittel verleiten zu weniger körperlicher Bewegung), das Internet als soziales Medium verleitet dazu, weniger nach draußen zu gehen und Menschen in der Realität zu treffen, insgesamt haben alle technologischen Errungenschaften wie der PC, das Internet, Spielekonsolen einen hohen Suchtfaktor. Letzteres ist für mich der Hauptgrund, warum ich aus dem Digital-Sumpf nur schwer herauskomme: Ich bin süchtig! Und nicht nur ich, sondern auch viele Menschen um mich herum.

Aber ist das wirklich die Ursache?

Nein. Denn verfolge ich die kausale Kette weiter, muss ich mir eingestehen, dass die Gründe warum ich diesen externen Faulheits-Sucht-Gelüsten verfalle und nicht aus dem Digital-Sumpf herauskomme oft mein Stresspegel und “Hamsterradlebensstil” sind. Es gibt Wochen und Monate, da falle ich von einer Deadline zur nächsten und habe ständig das Gefühl, allem hinterher zu rennen und nichts zu 100% machen zu können. In diesen Zeiten leidet meine Gesundheit (Neurodermitis), meine soziale Aktivität (gehe nicht raus), aber auch das Gleichgewicht meiner Aktivitäten und Prioritäten. Ich verbringe in diesen Phasen wesentlich mehr Zeit am PC (nicht nur arbeitsbedingt, sondern auch weil ich dann besonders wenig Energie übrig habe um mich sozial zu aktivieren) und esse wesentlich mehr ungesunde Lebensmittel, auf die ich eigentlich laut meiner Ideale gerne verzichten würde. Doch auch das ist nicht der Kern des Problems, denn warum spanne ich mich beruflich überhaupt so ein? Dies sind ebenfalls Ideale, jedoch diejenigen, die sehr stark von der Gesellschaft/Familie indoktriniert werden, nämlich: Sei fleißig, hab Erfolg auf der Arbeit, es ist gut der Menschheit zu helfen!

Zusammengefasst: Ich verfolge in meinen Stressphasen überwiegend extern-gegebene Ideale und vernachlässige deshalb meine instinktiven und tiefen Wünsche, nämlich ein naturverbundeneres, bewussteres, PC/Internet-unabhängigeres Leben.

Mit meinem guten Freund Y. teile ich diese “Gradwanderung” zwischen den Extremen Technik und Naturverbundenheit schon seit langem. Wir arbeiten nicht nur beide im IT-Bereich, sondern wir sind auch privat leidenschaftliche Nerds. Es macht uns Spaß, mit dem PC zu basteln, neue Software/Skripte zu schreiben oder auszuprobieren. Womit wir wieder bei der Sucht wären. Wir haben beide bereits einige Ansätze ausprobiert, um beide Leidenschaften miteinander zu vereinbaren.

Für mich kristallisiert sich jedoch mehr und mehr heraus, dass beides (für mich) nicht direkt miteinander vereinbar ist. Deshalb hege ich schon seit langem den Wunsch, meine PC-Zeit zu beschneiden und mein Leben zu einer natürlicheren Weise zurückzuführen. Besser gesagt: Erstmalig hinzuführen, denn eigentlich war ich noch nie dort: Ich bin 1986 geboren und in einem nicht armen Elternhaus aufgewachsen, weshalb ich mich in der damaligen Zeit ungehindert in die Technikwelt zurückziehen konnte. Ich wuchs damit auf und suchte mir PC-affine Freunde. Nach Jahren dieser Lebensweise war und bin ich nachwievor so stark in den PC-Denkweisen verwurzelt, dass ich mich nur mit Anstrengung daraus befreien kann. Zu den Extremzeiten musste sich jede andere Aktivität stets daran messen, wie gerne ich gerade den PC oder Laptop beiseite legen wollte.

Mittlerweile beginnen sich in mir (Gott sei Dank) abseits der gedanklichen Überzeugung auch innere, unbewusste Widerstände gegen den ständigen PC-Konsum zu entwickeln. Dies umfasst beispielsweise das ständige Online-Sein in diversen Messengern, das zeitfressende Spielen von MMORPGs oder sonstigen Spielen im Multiplayer (die ja prinzipiell unendlich lange weitergespielt werden können). Die Art der Spiele die ich spiele hat sich ebenfalls geändert. Während ich früher noch Shooter, Aufbaustrategie, Rollenspiele und so ziemlich alles andere gespielt habe, was mir vor die Linse kam, beschränke ich mich nun auf (1) Indie-Titel, die in mir ein tiefes Verlangen ansprechen (meist haben sie mit Naturverbundenheit zu tun, wie zB “The Long Dark”), (2) sehr komplexe Spiele, bei denen ich nachdenken muss und die nicht nach Schema-F ablaufen und (3) Multiplayer-Titel, die ich mit realen Freunden spiele. Dies ist nur ein Aspekt meines digitalen Lebens, der sich für mich auf eine natürlichere und wichtige Art gewandelt hat.

Ein Plan

Während meines letzten Besuchs bei Y. haben wir einige dieser Aspekte diskutiert und nachdem ich mich (wieder einmal) lauthals über meine eigene Lebensweise aufgeregt habe, haben wir einen Plan aufgestellt.

Da es schwer ist, sich aus eigener Kraft aus dem PC/Internet-Sumpf zu befreien, arbeiten wir zusammen. Wir beide protokollieren und kontrollieren mithilfe von workrave, wie viel Zeit wir am jeweiligen Tag am PC verbracht haben. Dabei wird zwischen Arbeits- und Privatzeit unterschieden. Der Plan umfasst dabei für mich folgende Punkte an die ich mich jeden Tag halte:

  • An Arbeitstagen beschränke ich mich auf 1,5h Freizeit am PC.
  • An Nicht-Arbeitstagen verbringe ich höchstens 3h am PC.

Belohnungen (Zuckerbrot)

Für jede Stunde, die wir weniger am PC verbringen, dürfen wir am selbigen Tag (mit gutem Gewissen!) zwei Folgen Serie oder einen Film schauen.

Bestrafungen (und Peitsche)

Für jede angefangene Stunde, die wir länger am PC sitzen zahlen wir 1€ in die gemeinsame Reisekasse (heute habe ich 5€ zu zahlen).

Wie nutzen wir die neue Zeit?

Wir haben beide eine Priorisierung aufgestellt, wie wir die neugewonnene Zeit nutzen möchten. Meine umfassen auf den ersten Rängen (1) mehr soziale Unternehmungen, (2) mehr Sport, (3) mehr Natur (z.B.: Gewächshaus) und (4) mehr Lesen.

Gegenseitiger Austausch

Wir wollen uns regelmäßig austauschen, wie es läuft und woran es hapert. Um sich zu motivieren ist es wichtig, dass man gerade dann darüber spricht, wenn man scheitert. Alle zwei Wochen werden wir den Plan reevaluieren und gegebenenfalls verbessern.

Wie es bei uns beiden läuft, werdet ihr hier und auf Y.’s Blog (link folgt) bald nachlesen können! :–)

Angespornt durch einen Artikel mit dem provokanten Titel “Sitzen ist das neue Rauchen”, beschäftigte ich mich mit einem Thema, über das ich in letzter Zeit bereits häufiger schlechtes gehört hatte. Die jedoch recht provokant gehaltenen Titel über das Thema machten mich zunächst einmal misstrauisch, und ich machte mich sodann auf die Suche nach wissenschaftlich fundierten Arbeiten und wurde fündig.

Wie viel Zeit verbringen wir im Sitzen?

Sitzen ist für den modernen Menschen das normalste von der Welt, insbesondere während der Arbeitszeit im Büro. Als Wissenschaftler (der Bioinformatik) bewältige ich 90% meiner Arbeit am PC und daher bislang gezwungenermaßen im Sitzen auf dem Bürostuhl. Die restlichen 10% (geschätzt) entfallen auf Meetings, während denen ich zwar von A nach B laufen muss, dort jedoch auch wieder sitze. Zudem bin ich auch in meiner Freizeit ein PC-affiner Mensch, der gerne mal am PC zockt, Filme und Serien schaut oder sich über Online-Zeitungen auf den aktuellen Stand bringt. Sprich: Ich verbringe so ziemlich meinen ganzen Tag im Sitzen.

Obgleich ich durch sportliche Betätigungen wie Joggen, Badminton und Aikido-Dehnübungen meinem Körper Ausgleich gebe, sind diese prozentual und ehrlich betrachtet nur ein Tropfen auf den Heißen Stein. Diese summieren sich pro Tag nämlich maximal auf eine Stunde.

Die körperlichen Auswirkungen des Sitzens

Instinktiv betrachtet kann der Mensch nicht für langes Herumsitzen oder -liegen gemacht sein, da wir uns in grauer Vorzeit im Laufe der späteren Evolution überwiegend auf der Suche nach Beeren, Kräutern, Wasser und anderen Nahrungsmitteln oder im Konflikt mit unseren nächsten Nachbarn befunden haben. Natürlich kann ich dies nicht belegen, instinktiv ist in meinen Augen jedoch der Umstand des langen Herumsitzens eine Erscheinung unserer technologisierten Zeit und nicht etwa schon immer so gewesen. Tatsächlich wird auch der Anti-Sitz-Befürworter James A. Levine mit den Worten zitiert

Evolutionär sind wir darauf ausgerichtet zu jagen und zu sammeln, zu säen und zu ernten, also darauf, den ganzen Tag in Bewegung zu sein und Tausende von Kalorien zu verbrennen. Und nicht darauf, wie verrückt eine halbe Stunde auf dem Laufband zu rennen und anschließend 15 Stunden zu sitzen. 2

Laut ihm ist es also nicht genug, morgens und abends Sport zu treiben, sondern die einzige Lösung zur Sitzproblematik ist, sich das Sitzen so weit wie möglich abzugewöhnen.

Unter dieser Prämisse kann man sich leicht vorstellen, dass langes Herumsitzen auf den Körper durchaus negative und ungesunde Auswirkungen haben kann.

Nach einer Stunde Sitzen sinkt die Produktion von Enzymen im Körper, die für die Fettverbrennung sorgen, um rund 90 Prozent. Ausgedehntes Sitzen verlangsamt unseren Stoffwechsel und verringert so zum Beispiel den Pegel von Lipoprotein hoher Dichte, das überflüssiges Cholesterin zurück zur Leber transportiert. 1

Eine in diesem Artikel zitierte Publikation bezieht diesen Umstand direkt auf moderne Krankheiten unserer Zeit

Strong evidence shows that physical inactivity increases the risk of many adverse health conditions, including major non-communicable diseases such as coronary heart disease, type 2 diabetes, and breast and colon cancers, and shortens life expectancy. 3

Mögliche Ansätze

Im Laufe der Zeit bin ich bereits einigen möglichen Lösungsansätzen über den Weg gelaufen.

  • “Wander Meetings” 1: Eine äußerst interessante Idee aus, bei der alle Meetings während einer kleinen Wandertour abgehalten werden. Ich bezweifle jedoch einerseits, dass hier alle meine Meeting-Partner mitmachen würden und andererseits ist dies oft für unsere Meetings schlichtweg nicht möglich, da wir auf einen Computer zur Präsentation angewiesen sind.
  • Stehhocker in Büros: Statt sich auf herkömmliche Stühle zu setzen, lehnt man sich gegen einen Stehhocker. Dieser stabilisiert den Körper und ermöglicht so ein “einfacheres” Sitzen, das die Schmerzen in Gliedern und Beinen nach zu langem Stehen ersparen soll. Die Frage ist jedoch, ob dies exakt die selben physiologischen, metabolischen Auswirkungen hat, wie ein “echtes” Stehen. Zudem erfordert dies einen hohen Tisch.
  • Laufband-Schreibtisch: Statt sich den PC auf einen herkömmlichen Schreibtisch zu stellen, kann man diesen auch auf einem Laufband montieren und so stets während der Arbeit laufen (Linus Torvalds rulz). Dies ist übrigens auch das Ideal von James A. Levine, der sich erhofft dass in Zukunft alle Amerikaner in ihren Büros nur noch an solchen Bändern arbeiten.
  • Höhenverstellbare Schreibtische: In vielen Büros mittlerweile Vorschrift sind höhenverstellbare Schreibtische, die sich der individuellen Körpergröße anpassen lassen. Oft sind diese jedoch nicht dafür gedacht, von den Personen im Stehen verwendet zu werden und können nicht hoch genug eingestellt werden. Zudem waren mir diese Schreibtische für den Privatgebrauch zu teuer, sodass ich mir kurzer Hand einen manuellen Stehtisch gebaut habe :–)

Persönliche Konsequenzen

Da ich des Öfteren Home-Office betreibe und ich zu geizig bin, mir für zu viel Geld einen höhenverstellbaren Schreibtisch anzuschaffen, habe ich mir kurzerhand einen Arbeits-Tisch gebastelt, der zufälligerweise ideal auf meine Körpergröße passt. An diesem Schreibtisch arbeite ich nun seit ein paar Tagen und mein Gehirn kommt in dieser Arbeitsposition wesentlich besser in die Gänge, als im Sitzen. Ich werde diese Arbeitsweise noch ein paar Wochen lang austesten und sehen, ob sie sich auch auf Dauer bewährt. Falls ja, werde ich mir die Sache mit einem teureren höhenverstellbaren Schreibtisch eventuell doch noch einmal überlegen und meinen Stuhl durch einen Lehnhocker ersetzen.

Stehschreibtisch im Eigenbau

Frohes Arbeiten! :–)

Whenever I had to do mechanical text parsing work in the past, involving lot of copying, applying the same change to copied lines and pasting  over and over again, I wondered why there isn't any tool which allows me to apply a certain parsing command to a text in an automatized way. Often, I had to apply the same command to tens or hundreds of lines, which made it faster to just write a little parser script.

Finally, I tackled the issue when I was facing the following two problems:

Problem 1

Given the output text file of tool A which contains lines such as these:

1 0.118 0.039 0.627 0.216 G
2 0.118 0.020 0.824 0.039 G
3 0.078 0.059 0.863 0.000 G
4 0.706 0.196 0.098 0.000 A
5 0.647 0.020 0.255 0.078 A
6 0.059 0.294 0.627 0.020 G
7 0.529 0.118 0.353 0.000 A
8 0.314 0.451 0.235 0.000 C
9 0.549 0.059 0.157 0.235 A
10 0.000 0.294 0.686 0.020 G

Take only the information of the sixth column and concatenate the characters into one string from top to bottom. The result for the above example would be: GGGAAGACAG The output of the program actually represents a PWM (position weight matrix) for a DNA sequence motif as well as the corresponding consensus sequence:

  • column 1 contains the position in the motif
  • column 2 holds the probability of seeing base (nucleotide) A at that position
  • column 3: probability of seeing base C
  • column 4: probability of seeing base G
  • column 5: probability of seeing base T
  • column 6: the most probable base at that position

Basic solution using awk

Using awk we can extract the sixth column from the given output and concatenate the characters into a single string:

awk 'BEGIN{ORS=""} {print $6}'

This alone does not do the trick for me in terms of usability. Of course I could paste the output into a text file and apply awk to the file.

Advanced solution using xclip and awk

Instead, we are going to use xclip to improve on the above approach:

  • Copy (ctrl-c) the relevant part from the tools output into the clipboard
  • use xclip to read out the clipboard, pipe it into the awk command above and write the result back into the clipboard
  • Paste (ctrl-v) the clipboard content to wherever you need the parsed/converted text (in this example the consensus sequence).

We can do this by using the following command: xclip -o -selection clipboard | awk 'BEGIN{ORS=""} {print $6}' | xclip -i -selection clipboard

Sugar

To make it even better,

  • I wrote a little python GUI allowing me to select between different such commands and
  • created a shortcut that executes the selected command.

I did this as follows:

  • create a directory ~/.fastCommands
  • create bash script ~/.fastCommands/pwm_to_consensus_sequence.sh containing the above advanced command
  • create a symlink ~/.fastCommands/activeCommand.sh pointing at the currently active “fast command”, in my case ~/.fastCommands/pwm_to_consensus_sequence.sh
  • and create a shortcut that executes bash ~/.fastCommands/activeCommand.sh (I used the custom shortcut functionality of gnome shell).

The GUI is a simple python script (Warning, dirty!, based on this) which just redirects the activeCommand.sh symlink to one of the available commands.

import ntpath
from os import listdir
from os.path import isfile, join, realpath
from subprocess import call
import wx

TRAY_TOOLTIP = 'System Tray Demo'
TRAY_ICON = 'icon.png'
FAST_COMMAND_DIR = '/home/USER/.fastCommands/'


def create_menu_item(menu, label, func):
    item = wx.MenuItem(menu, -1, label)
    menu.Bind(wx.EVT_MENU, func, id=item.GetId())
    menu.AppendItem(item)
    return item


class TaskBarIcon(wx.TaskBarIcon):
    def __init__(self):
        super(TaskBarIcon, self).__init__()
        self.set_icon(TRAY_ICON)
        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
	self.menuMap = {} 

    def CreatePopupMenu(self):
        menu = wx.Menu()
	mypath = FAST_COMMAND_DIR
	activeCommand = ntpath.basename(realpath(mypath+'activeCommand.sh'))
	
	onlyfiles = [ f for f in listdir(mypath) if isfile(join(mypath,f)) and f != 'activeCommand.sh' ]
	for file in onlyfiles:
		item = create_menu_item(menu, file, self.on_hello)
		self.menuMap[item.GetId()] = file
		if file == activeCommand:
			item.Enable(False)
        menu.AppendSeparator()
        create_menu_item(menu, 'Exit', self.on_exit)
        return menu

    def set_icon(self, path):
        icon = wx.IconFromBitmap(wx.Bitmap(path))
        self.SetIcon(icon, TRAY_TOOLTIP)

    def on_left_down(self, event):
        print 'Tray icon was left-clicked.'

    def on_hello(self, event):
	call(["ln","-s","-f",FAST_COMMAND_DIR+self.menuMap[event.GetId()],FAST_COMMAND_DIR+"activeCommand.sh"])

    def on_exit(self, event):
        wx.CallAfter(self.Destroy)


def main():
    app = wx.PySimpleApp()
    TaskBarIcon()
    app.MainLoop()


if __name__ == '__main__':
    main()

My shortcut is ctrl-alt-f, such that I press ctrl-c, ctrl-alt-f and ctrl-v and I have my converted text pasted where I want it.

Easy, fast and saving a lot of time! :–)

Problem 2

I created a second script the same way as before for another problem:

Given a text following the format chrN_startpos_endpos convert it to the slightly different format chrN:startpos-endpos

We can achieve this conversion again, using awk: awk '!x{x=sub("_",":")}7 !x{x=sub("_","-")}7' And again, as before, we parse from the clipboard using xclip and write it back: xclip -o -selection clipboard | awk '!x{x=sub("_",":")}7 !x{x=sub("_","-")}7' | xclip -i -selection clipboard The string describes a genomic region including the chromosome as well as start and endposition of the region of interest. The first format is the format internally used in a database, the second format is compatible to the USCS genome browser.

Hey folks,

two reasons why I wanted to replace the Samsung ROM on my Galaxy SII with cyanogenmod:

  • Samsung does not provide updates anymore and the latest released version for the i9100 is based on Android 4.1.2. I am a security fanatic, thus I prefer to use current versions.
  • In context of NSA and the global privacy/surveillance issues, I don't trust any major corporation – including Google. Thus I want to keep the number of Google apps on my phone as small as possible. Many (non-essential) Google Apps cannot be uninstalled from a standard installation.

Official infos about cyanogenmod on the I9100 can be found here and the official installation instructions here.

Download latest snapshot of CM11: click Download nightly of CM11: click

The overall procedure is as follows:

  • Install a (recent!) recovery on Galaxy S II.
    • A recovery is a special boot environment from which you can make administrative changes to your phone, which you cannot from within a booted Android (e.g. format cache,data,system,backup,restore,replace installed Android by custom ROM). The preinstalled recovery is NOT recent enough to install CM11.
    • I used the ClockworkMod recovery (CWM-KitKatCompatible-i9100.zip)
  • Download recovery (zip) and cm11 build (zip) from the above links and copy them to the SD card of your I9100.
  • Boot into recovery
    • Restart/Shutdown your phone. Turn it on again by holding the buttons Power+Home+VolumeUp
  • Update recovery
    • Click ”install from zip file” and select the recovery zip file (CWM-KitKatCompatible-i9100.zip)
  • Restart phone into new recovery
    • Choose restart from the menu and follow the same procedure as in 3. to boot into the newly installed recovery
  • Install CyanogenMod
    • Again, “install from zip file” and choose the CM11 zip file
  • If desired, install gapps package containing official Google apps e.g. Google Play Store, Google Maps...
    • The most recent version of the official gapps package is available here. However, the most recent version is only compatible to latest nightlies of CM and not to the Snapshot M7! Overall, it's preferable to install patched versions available in this thread, which also has links to older versions.
    • Warning: Snapshot M7 requires version 4.4.2, latest nightlies require 4.4.3! Thus, the linked version on the official site only works for the nightlies. Installing the wrong version will lead to various errors including crashing Play Store (also “no connection”), crashing Browser/Hangouts/Play Service.. Also, I was not able to register my google account anymore and it terminated with an error like could not connect to the google servers.
    • Some of the error messages I encountered:
      • Unfortunately, Google Play Store has stopped
      • Unfortunately, Google Play Services has stopped
      • No connection" in Google Play Store

Symptom: yed is not starting under lubuntu with the error message .../jre/lib/i386/xawt/libmawt.so: libXtst.so.6: cannot open shared object file: No such file or directory

Solution: Install package ia32-libs