Andrés Blog

Krams. Und so.

Mai 13, 2016

Screenshot'n'Upload

Dieses kleine Script startet scrot -s, um einen Screenshot von einem Bereich des Monitors anzufertigen. Anschließend wird das Bild per ssh auf den eigenen Server hochgeladen, wobei der Dateiname durch den eigenen SHA256-Hash ersetzt wird. Die URL, unter der das Bild nun abrufbar ist, wird in die Zwischenablage geschrieben und kann schnell geteilt werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env bash

# bash strict mode
set -euo pipefail
IFS=$'\n\t'

# Ending of temporary filename decides filetype
filename=$(mktemp tmp.XXXXXXXXXX.png)
ext=${filename##*.}

function finish {
    rm -f "$filename"
    unset IFS
}
trap finish EXIT

sleep 0.1 # scrot is not able to grab the pointer without this sleep
notify-send --urgency=low "Screenshot ready" "Select area to screenshot and upload."
scrot -s ${filename}
shasum=$(sha256sum ${filename} | awk '{print $1}')

rsync --chmod=g-rwx,o=r "${filename}" "wgmd:public_html/share/${shasum}.${ext}"
url="https://share.wgmd.de/${shasum}.${ext}"

notify-send --urgency=low "Screenshot uploaded" "Upload successful.\nUse clipboard to access URL."
echo ${url} | xclip -selection clipboard

ctrlmedia.sh

Um den von mir genutzten Mediaplayer bequem bedienen zu können, benutze ich verschiedene Tastenkombinationen (und, falls vorhanden, die Mediatasten) für Play/Pause/Stop und Nächstes/Vorheriges. Wenn man jedoch den Player wechselt oder mehrere Programme für verschiedene Formate (z.B. Audio und Video) benutzt, so ist das umständlich. Zur Zeit benutze ich cmus, um Musik abzuspielen, und mpv, um Filme, Serien, Musik- oder Youtubevideos zu gucken. Diese Programme laufen öfters im Hintergrund und es lässt sich immer nur eines davon über die Tastenkombinationen steuern. Man hat die Wahl, ob man das Fenster des anderen Programmes jedes mal sucht oder ob man einen weiteren Satz an Tasten für das zweite Programm festlegt.

Oder aber, man schreibt sich ein kleines Wrapperscript! Dieses kann verschiedene Player gleichzeitig unterstützen und es kann festgelegt werden, welcher Player wann kontrolliert werden soll. Für meine bisherigen Anwendungsfälle lässt sich das super umsetzen!

  1. Ich kann mit den gleichen Tastenkombinationen cmus und mpv kontrollieren.
  2. Falls beide Programme gestartet wurden, so wird mpv gesteuert.
  3. Falls keines lokal läuft, wird ein anderer Rechner im Netzwerk kontrolliert.

cmus läuft meistens im Hintergrund, auch wenn ich gerade keine Musik höre. mpv wird immer zum Abspielen einer (oder mehrerer) Dateien gestartet und beendet sich nach erfolgter Wiedergabe. Eine laufende Instanz deutet also auf aktive Benutzung hin und soll in dem Fall gesteuert werden.

Wenn ich mit meinem Laptop auf dem Bett liege und Musik hören möchte - dann benutze ich cmus auf meinem Rechner. Die Lautsprecher sind denen des Laptops weit überlegen und fangen nicht schon knapp über Flüsterlautstärke an zu knarzen. Mit dem Wrapperscript kann ich cmus über ssh steuern, genau wie ich den lokalen cmus steuern würde.

Wenn man cmus über ssh eine höhere Priorität als der lokalen Instanz einräumt, dann kann dies zu spürbaren Verzögerungen führen. Um diese zu reduzieren, wird zunächst mit einem Ping überprüft, ob der Host erreichbar ist. Dazu dient die Funktion hostonline. Das Tool ping aus den iputils wartet mindestens eine Sekunde auf einen Timeout. Das Tool fping ermöglicht es, den Timeout auf 50ms zu reduzieren. Fürs lokale Netzwerk reicht das aus und die Verzögerung ist kaum mehr zu spüren.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env bash

# "bash strict mode" ohne -e
set -uo pipefail
IFS=$'\n\t'

if [ $# -lt 1 ]; then
    echo "Usage: $0 <play|pause|prev|next>"
    echo "This script looks for running media players and controls them."
    exit 1
fi

case "$1" in
    play|pause|stop|next|prev)
        cmd=$1
        ;;

    *)
        echo "Command not found."
        exit 1
esac

function hostonline {
    # fping can set smaller timeouts (50ms vs 1s)
    command -v fping > /dev/null
    if [ $? -eq 0 ]; then
        local pingcmd="fping -q $1 -t50"
    else
        local pingcmd="ping -q $1 -c 1 -W 1"
    fi

    $pingcmd > /dev/null
    if [ $? -eq 0 ]; then
        echo 1
    else
        echo 0
    fi
}

function media-mpv {
    mpvid=$(xdotool search --class mpv)
    if [ $? -eq 0 ]; then
        case "$1" in
            play|pause)
                xdotool key --window ${mpvid} space > /dev/null
                ;;
            stop)
                xdotool key --window ${mpvid} q > /dev/null
                ;;
            prev)
                xdotool type --window ${mpvid} '<' > /dev/null
                ;;
            next)
                xdotool type --window ${mpvid} '>' > /dev/null
                ;;

            *)
                echo "Command not found."
                exit 1
        esac
        exit 0
    fi
}

function media-cmus {
    if [ $(pidof cmus) ]; then
        case "$1" in
            play|pause)
                cmus-remote -u
                ;;
            stop)
                cmus-remote -s
                ;;
            prev)
                cmus-remote -r
                ;;
            next)
                cmus-remote -n
                ;;

            *)
                echo "Command not found."
                exit 1
        esac
        exit 0
    fi
}

function media-cmus-remote {
    if [ $HOSTNAME != $2 ]; then
        if [ $(ssh $2 pidof cmus) ]; then
            case "$1" in
                play|pause)
                    ssh $2 cmus-remote -u
                    ;;
                stop)
                    ssh $2 cmus-remote -s
                    ;;
                prev)
                    ssh $2 cmus-remote -r
                    ;;
                next)
                    ssh $2 cmus-remote -n
                    ;;

                *)
                    echo "Command not found."
                    exit 1
            esac
            exit 0
        fi
    fi
}

# Sort this list to change priorities
media-mpv $1
if [ $(hostonline computername) -eq 1 ]; then
    media-cmus-remote $1 computername
fi
media-cmus $1

echo "No supported media player running."
exit 1

Jetzt ärgere ich mich nur noch darüber, dass ich nicht wesentlich eher auf diese Idee gekommen bin! ;)

Update: Mir ist ein Fehler unterlaufen, da der "bash strict mode" beim prüfen auf laufende Programme das Script abbricht. set -e lässt das Bashscript abbrechen, sobald ein aufgerufenes Programm einen Fehlercode != 0 zurückgibt. Da hier keine kritischen Befehle aufgerufen werden, entschärfe ich hier den "bash strict mode" erstmal.

Mär 22, 2016

Shutdownscript Nr. 2

Eine neue Iteration des Shutdownscripts, welches die Shell blockiert, bis kein Traffic mehr fliesst. Diesmal sind alle Einstellmöglichkeiten rausgeworfen worden, da diese zum Teil hinderlich oder unnötig waren. So wird jetzt der Traffic aller Netzwerkschnittstellen summiert und ein fester Schwellwert von 1kb/s ist zu unterschreiten als Mittelwert über 5 Sekunden. Auch ist der Befehl zum Shutdown verschwunden. Einfach das Script mit

scriptname && systemctl suspend

aufrufen, um den gewünschten Effekt zu erzielen ;)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

# "bash strict mode"
set -euo pipefail
IFS=$'\n\t'

verbose=1

function networkidle() {
    local traffic_last=$(awk '/:/ {if ($1 != "lo:") {SUM += $2}} END {print SUM}' /proc/net/dev)
    while true; do
        sleep 5
        local traffic_now=$(awk '/:/ {if ($1 != "lo:") {SUM += $2}} END {print SUM}' /proc/net/dev)
        local traffic_diff=$(( (${traffic_now} - ${traffic_last}) / 1024 / 5 ))
        local traffic_last=${traffic_now}
        if [[ ${verbose} -ne 0 ]]; then echo "${traffic_diff} kb/s"; fi
        if [[ ${traffic_diff} -le 1 ]]; then
            if [[ ${verbose} -ne 0 ]]; then echo "Traffic below 1 kb/s."; fi
            return
        fi
    done
}

networkidle

Den inoffiziellen "bash strict mode" habe ich übrigens im Blog von Aaron Maxwell gefunden. Werde ich in Zukunft wohl öfters in meine Scripte einbinden.

Dez 28, 2015

Das System automatisch herunterfahren, sobald alle Downloads abgeschlossen sind

Ich bin über die Feiertage und den Jahreswechsel bei meinen Eltern. Dort ist die Internetleitung nicht so breitbandig, wie ich es zuhause gewohnt bin. Da gerade der 32c3 läuft und ich mir ein paar der Talks gerne ansehen möchte, stößt die Leitung bei den Downloads der Aufzeichnungen schnell an ihre Grenze - zumal ich nicht der alleinige Nutzer bin. Daher habe ich ein kleines Script geschrieben, welches den Rechner nach (hoffentlich erfolgreichem) Download automatisch in den Ruhezustand schickt. So kann der Download über Nacht laufen und der Rechner ist nicht länger an, als benötigt. Dazu wird alle paar Sekunden der Traffic einer Netzwerkschnittstelle ausgelesen und wenn dieser unter einen Schwellwert sinkt, dann wird ein definierter Befehl ausgeführt. So muss man nicht von vornherein die Downloads genau planen, sondern legt einfach los ;)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

function networkidle() {
    local device=enp4s0
    local traffic_last=$(grep $device /proc/net/dev | awk '{print $2}')
    local framesize=5
    local traffic_min=20
    local shutdowncommand="systemctl suspend"

    while true; do
        sleep $framesize
        traffic_now=$(grep $device /proc/net/dev | awk '{print $2}')
        traffic_diff=$(expr ${traffic_now} - ${traffic_last})
        traffic_diff=$(expr ${traffic_diff} / 1024)
        traffic_persec=$(expr ${traffic_diff} / $framesize)
        traffic_last=$traffic_now
        echo $traffic_diff kb in $framesize seconds ~ $traffic_persec kb/s
        if [[ $traffic_persec -lt $traffic_min ]];
        then
            echo "Traffic below ${traffic_min} kb/s. Suspending!"
            $shutdowncommand
            return
        fi
    done
}

networkidle

Sep 12, 2015

Adé Wordpress

Neuer Eintrag, neue Blogsoftware. Kennt man ja mittlerweile. Nach langer Pause gibt es wieder neue Blogsoftware. Letztes mal habe ich auf Wordpress umgestellt und das hat anfangs auch gut funktioniert. Jedoch waren die Updates nach einer Zeit doch nervig (obwohl die ein Update zu einer neuen Minor-Version sogar automatisch stattfinden kann).

Da ich auf dieser Seite nur sehr wenig Benutzerinteraktion habe, braucht es eigentlich auch keine dynamischen Seiten. Daher habe ich jetzt auf eine statische Seite gewechselt. Die braucht man auch garnicht updaten, wenn man keine Lust auf Blog hat (und dass kommt bei mir ja mal vor, hat man so gehört).

Im Einsatz befindet sich jetzt die Software Pelican, welche aus Texten im z.B. Markdown Format ein statisches Blog bastelt. Das kann ich lokal bauen, die resultierenden Dateien per rsync auf den Server schieben und fertig :)

Jul 16, 2013

Google Maps API auf gerootetem Android installieren

Mal wieder ein neuer Eintrag! Wieder einmal hatte ich ein einfach zu lösendes Problem, wobei die Lösung wiederum gewohnt schwer zu finden war. Zumindest, wenn es mal wieder schnell gehen soll ;)

Folgende Situation: Ich habe mein Android Smartphone (Samsung Galaxy Ace) bereits vor einiger Zeit gerootet, wollte nun jedoch mal den CyanogenMod ausprobieren. Kein Problem soweit, schnell ein Backup der bisherigen ROM gemacht (Stocklite v8) und CM7.2 nightly aufgespielt. Ersteindruck: Flott unterwegs und schön viel RAM frei :)

CyanogenMod hat von Haus aus keine Google Apps installiert, was mir zunächst sehr gut gefällt. Allerdings sind damit auch einige Einschränkungen verbunden. So können nicht wie üblich Apps einfach im Play Store gesucht und geladen werden - dieser ist ja nicht vorhanden. Abhilfe können dort proprietäre Angebote, wie AndroidPit, oder Open Source Angebote, wie F-Droid, bieten.

Zwei Apps jedoch, welche ich gerne wieder mein Eigen nennen würde, ließen sich nicht auf diese Weise installieren. Zum einen möchte ich die App der Bahn nutzen, zum anderen Öffi. Bei beiden Apps schlug die Installation zunächst fehl und es wurde keine genauere Fehlerbeschreibung seitens Android geliefert.

Erst der Versuch, eine der Apps über ADB zu installieren, meldete den Fehler [INSTALL_FAILED_MISSING_SHARED_LIBRARY]. Ein Blick in logcat konnte das genaue Problem aufzeigen: ERROR/PackageManager(58): Package xyz requires unavailable shared library com.google.android.maps; failing! Beide Apps benötigen die Google Maps API! Öffi gibt es zwar auch ohne Goole Maps API-Abhängigkeit zum Download, aber die Bahn-App nicht.

Mein erster Gedanke: Okay, dann fehlt sicherlich Google Maps, das sollte auch ohne Play Store etc. funktionieren. Also habe ich mir eine .apk für Google Maps besorgt (Version 6, für Version 7 ist mein CM7.2 dann doch zu alt). Die Installation hat funktioniert; Google Maps startet und funktioniert. Aber die gwünschten Apps ließen sich weiterhin nicht Installieren - gleiche Fehlermeldung.

Nach kurzer Recherche stand fest: Die API ist Bestandteil der GApps. Diese habe ich (nach einem Backup) dann doch installiert und wurde (nach Android Startup/Einrichtungsassistenten) direkt darauf hingewiesen, dass nun kaum mehr Speicherplatz vorhanden ist - na klasse. Aber immerhin ließen sich die Apps jetzt installieren. Aber so ist das ja kein Zustand, daher das Backup ohne GApps wieder eingespielt - das muss doch auch anders zu lösen sein!

Das Durchsuchen der GApps*.zip zeigt in system/framework und in system/etc/permissions 2 Dateien mit dem Namen com.google.android.maps.(jar|xml). Vielleicht reichen diese Dateien aus? Also habe ich diese Dateien in den jeweiligen Pfad auf meinem Smartphone kopiert und nach einem Reboot ließen sich die beiden Apps dann auch starten und (bislang ohne Probleme) benutzen. Es hätte so viel einfacher sein können, hätte es auch von der Bahn eine Alternative ohne Abhängigkeit gegeben. Oder würde Android direkt beim Installieren sagen, was ihm fehlt. Oder hätte ich direkt gewusst/gefunden, wie man nur die Google Maps API nachinstalliert.

Wie auch immer, es ist geschafft. Und ich hoffe, ich konnte mit diesem Eintrag vielleicht noch jemandem beim gleichen Problem etwas (Such-)Arbeit abnehmen :)

TL;DR:

  • GApps runterladen

  • Entpacken
  • per adb shell als root /system mit Schreibrechten neu mounten: mount -o remount,rw /system
  • adb push gapps-jb-20130812-signed/system/framework/com.google.android.maps.jar /system/framework/com.google.android.maps.jar
  • adb push gapps-jb-20130812-signed/system/etc/permissions/com.google.android.maps.xml /system/etc/permissions/com.google.android.maps.xml
  • Reboot!
  • Fertig.

Okt 24, 2012

Fehler mit git svn clone

In einem französischen Blog bin ich auf die Lösung/einen einfachen Workaround für das svn_delta-Problem von git svn gestoßen. Wenn man ein SVN-Repository mithilfe von git svn klonen möchte, kommt es zumindest bei der in Debian testing/sid vorliegenden Versionen von svn/git/libsvn-perl mitten im Vorgang zu folgender Fehlermeldung:

Temp file with moniker 'svn_delta' already in use at /usr/share/perl5/Git.pm line 1024.

Dieses Problem lässt sich einfach lösen, indem man in der Konfigurationsdatei ~/.subversion/servers die Einstellung zur benutzten http-library auskommentiert oder löscht.

[global]
# http-library=serf

Apr 05, 2012

Ein Hoch auf die Matekarte!

Logo der Matekarte

"Wo gibts denn hier Club Mate?" war schon zu Beginn meines Studiums ein nicht-triviales Problem. Hatte ich von dem Kultgetränk zu der Zeit lediglich gehört und es noch nie probiert, so wurde es doch langsam mal Zeit. Die erste Maßnahme war dann die Bestellung über den http://www.club-mate-shop.de/. Am Geschmack habe ich relativ schnell gefallen gefunden. Die ersten 1-2 Flaschen waren noch "naja", aber man gewöhnt sich dran ;).

Leider sind die Flaschen über den Onlineshop teurer und ich hatte zudem Probleme, den Flaschenpfand wieder einzutreiben. Daher hab ich nicht so oft bestellt. Bis ich eines Tages im Edeka um die Ecke 1-2 gelbe Kästen sichten durfte. Mittlerweile steht dort auch meist eine ganze Palette, scheint also doch mehrere Abnehmer zu finden.

Durch den gesteigerten Konsum des koffeinhaltigen Erfrischungsgetränks wurde der Suchtfaktor in einem Maße erhöht, dass ich bei einem mehrwöchentlichen Aufenthalt bei meinen Eltern gezwungen war, die lokalen Getränkemärkte abzuklappern - ohne Erfolg. Nach einer (erneuten) Internetrecherche bin ich dann auf das Projekt matekarte gestoßen. Die zu der Zeit noch relativ leere Karte hat mir zumindest einen Getränkehandel in etwa 25km Entfernung gefunden, welcher nach kurzem Telefonat auch noch Club Mate vorrätig hatte. Da wir eh für einen Einkauf in die Richtung wollten, haben wir dort kurz gehalten :)

Mittlerweile sieht es auf der Karte hier in Magdeburg schon bunter aus - in meiner Heimat noch immer Mau. Aber vielleicht ist die Karte auch noch zu unbekannt. Denn diese wird mit den Einsendungen der Besucher gefüllt. Daher: Spread the word!

Also wann immer jemand irgendwo Club Mate kauft oder klaut: Hinterher brav auf matekarte.de den Fundort eingeben oder aktualisieren! Irgendwer irgendwo wird euch dafür sehr dankbar sein!

Feb 02, 2012

IMAP über SSH (in claws-mail)

Ich hab mal wieder unverhältnismäßig Lange nach einer Lösung für ein eigentlich simples Problem gesucht. Und diese Lösung möchte ich hier verewigen, um anderen Suchenden (und natürlich meinem zukünftigen Ich) Zeit bei der Suche zu sparen.

TL;DR: "Use command to communicate with server" -> ssh -q ssh.server.com nc localhost 143

Zunächst möchte ich mich bei meinem aktuellen Mail-Setup bedanken, welches dieses Problem überhaupt erst möglich gemacht hat. ;) Das Setup besteht primär aus einem IMAP-Server, welcher via fetchmail mit den Mails verschiedener Konten versorgt wird. Diese werden vorher durch Spamassassin gejagd und via Sieve grob sortiert (nur grob, da eine feine Sortierung Zeit kostet, und das Suchen erschwert). Um von überall Zugriff auf meine Mails zu haben, habe ich mich für das Webmailfrontend Roundcube entschieden. Roundcube ermöglicht es außerdem, Mails über einen SMTP-Server zu verschicken. So kann ich nicht nur problemlos von einem Server mit dynamischer IP-Adresse aus Mails verschicken, sondern hab sogar meine Mailadresse als Absender ;) Genauer gesagt eine meiner Mailadressen. Für den meisten Mailverkehr nutze ich zwar ohnehin die Mailadresse der Uni, dennoch verspüre mittlerweile das Bedürfnis, bei der Beantwortung diverser Mails mit der entsprechenden Adresse zu antworten. Und genau dort lag mein Problem.

Nun gibt es verschiedene Wege, dieses Problem anzugehen.

  • Roundcubes Config jedes mal ändern
  • Webmailfrontends der anderen Anbieter
  • Roundcube Plugin schreiben
  • claws-mail mit SMTP only Konten

Das Ändern der Konfiguration vorm Versenden scheidet offensichtlich aus.

Die Webmailfrontends der anderen Konten nutzen ist aus meiner Sicht ebenfalls umständlich. Außerdem löscht meine fetchmail-Konfiguration alle Mails nach dem Abrufen, so dass IDs beim Reply verloren gehen würden.

Ein Plugin für Roundcube habe ich sogar mal geschrieben, welches mir die Einstellung eines SMTP-Servers für jede Identität innerhalb eines Roundcube-Logins (man kann dort beliebig viele angeben) ermöglicht. Leider ist dieses Plugin mehr ein sehr fieser Hack gewesen als ein sauberes Plugin. Daher nutze ich das nicht mehr. (Ich glaube, die Sourcen hab ich auch verlegt. Sollte ich diese wiederfinden und dran denken, werde ich die hier nachträglich verlinken...) Man könnte nun sicherlich ein neues Plugin schreiben, welches diese Funktionalität bietet und schöner geschrieben ist, jedoch fehlts da gerade an Motivation.

Und als letzte Lösung - gleichzeitig ein Schritt in Richtung des ursprünglich angekündigten Problems - bietet die Nutzung von einem Mail-Client wie z.B. claws-mail, welcher Mail-Konten als SMTP only unterstützt. Somit rufe ich die Mails über IMAP ab und habe pro gewünschter, ausgehender Mailadresse ein SMTP only Konto.

claws-mail lässt sich zwar nicht wie ein Webfrontend von überall aus aufrufen, dieses Manko nehme ich aber in Kauf, da ich zum einen eh meistens mein Laptop griffbereit habe und andererseits das Webfrontend mit meiner UniMail als Absender für den meisten Mailverkehr weiterhin erreichbar ist. Ein anderes, größeres Problem sehe ich im externen Zugriff auf IMAP, denn irgendwie muss claws-mail ja auch an die Daten kommen. Auch von unterwegs. Laut der claws-mail features Seite unterstützt der Client von Haus aus IMAP over SSH Tunnel. Super! Damit muss ich keinen zusätzlichen Port öffnen. Und verschlüsselt wird auch direkt! Nur wo zum Henker findet sich diese Option? Und warum wird das Feature weder im Manual noch im Wiki erwähnt?

Daher hier für Mitleidende die Lösung, die ich zur Zeit verwende: Unter den Account-Preferences in claws-mail findet sich unter Advanced ein Punkt "Use command to communicate with server". Hier trägt man einen ssh-Befehl wie z.B. dem folgenden ein: ssh -q ssh.server.com nc localhost 143 Dazu sollte der IMAP-Server natürlich auch unter localhost auf Port 143 erreichbar sein. Außerdem sollte die Verbindung zum Server ohne Passwortabfrage funktionieren (wobei ich es nicht mit probiert habe - gehe aber nicht davon aus, dass claws-mail dann nach dem Passwort fragt). Das kann man mithilfe von SSH-Keys erreichen. Sofern man dem Key ein Passwort gibt, kann man diesen per ssh-agent bereitstellen, um das Passwort nicht für jede Verbindung eingeben zu müssen.

Ich hoffe, das ich dem ein oder anderen hiermit die Suche nach der "IMAP over SSH tunnel"-Option vereinfache und vielleicht sucht ja auch jemand nach ein paar Anregungen für ein eigenes Mail-Setup ;)

posted at 02:56  ·   ·  imap  mail  server  ssh

Sep 01, 2009

RAM-Disk für mehr Speed

RAM ist günstig und meist viel vorhanden. Komplett genutzt wird er selten. Mein Laptop hat (nur) 2 GB und selbst die nutz ich fast nie komplett. Was läge also näher, als diverse Anwendungen mithilfe von etwas RAM ein bisschen auf die Sprünge zu helfen?

Zum Beispiel greift Firefox relativ viel auf das Profilverzeichnis zu. Um diesen Zugriff via RAM-Disk zu Beschleunigen muss man bloß der Anleitung im Ubuntuforum folgen: http://ubuntuforums.org/showthread.php?t=1120475 Dort wird das Profil in ein anderes Verzeichnis ausgelagert und das ursprüngliche Verzeichnis wird dann zum Mountpunkt für die RAM-Disk. Ein cronjob sorgt via rsync dafür, dass das Profil beim Start in die RAM-Disk kopiert wird und Änderungen in der RAM-Disk regelmäßig wieder auf die Platte geschrieben werden. Firefox selbst merkt keinen Unterschied und kann weiterhin normal bedient werden.

Kleine Zusammenfassung der Vorgehensweise:

  • Cache vom Firefox aktivieren / Größe festlegen
  • Script anlegen und anpassen an Profilname
  • RAM-Disk erstellen (mit Größe > Cache+Addons+...)
  • Script in Crontab / Gnome Schedule / ... eintragen

Das Script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# Change this to match your correct profile
PROFILE="xxxxxxxx.default"

cd "${HOME}/.mozilla/firefox"

if test -z "$(mount | grep -F "${HOME}/.mozilla/firefox/${PROFILE}" )"
then
    mount "${HOME}/.mozilla/firefox/${PROFILE}"
fi

if test -f "${PROFILE}/.unpacked"
then
    rsync -av --delete --exclude .unpacked ./"$PROFILE"/ ./profile/
else
    rsync -av ./profile/ ./"$PROFILE"/
    touch "${PROFILE}/.unpacked"
fi

exit

Das gleich Prinzip lässt sich auch bei anderen Programmen anwenden. Zum Beispiel habe ich das bei Liferea gemacht. Meine dortige liferea.db umfasst immerhin 26MB und ein Auslagern in den RAM zeigt schon seine Wirkung!

Nach diesen beiden Änderungen startet nun Liferea schneller als der Firefox! Vorher musste ich noch ein weilchen auf Liferea warten. Firefox selbst startet auch etwas schneller, muss aber noch einiges an Addons etc laden, was scheinbar länger dauert. Der Zugriff auf die "Superbar" / die "Multifunktionsadressleiste" ist aber wesentlich fixer und auch das Surfen geht flüssiger.

Next → Page 1 of 2