Archiv ‘Linux’

Sonntag, 4. März 2012

Aktuell geöffnetes Fenster unter Mac OS X minütlich aufzeichnen

Seit mehreren Jahren zeichne ich jede Minute auf, welches Fenster auf meinem Mac OS X-Desktop aktiv ist. Ich nutze diese Aufzeichnungen nicht zuletzt dazu, um bei ungefähr zu wissen, wie lange ich für Kundenaufträge gearbeitet habe — und dementsprechend Rechnung zu stellen.

Das AppleScript lautet folgendermassen:

tell application "System Events"
	set app_name to name of item 1 of (every process whose frontmost is true)
end tell

tell application app_name
	try
		if (count of windows) > 0 then
			set mouseToolsPath to "usr:local:bin:MouseTools"
			set {mouseX, mouseY} to paragraphs of (do shell script quoted form of POSIX path of mouseToolsPath & " -location")
			
			set title to (app_name & "&title=" & name of window 1 & "&x=" & mouseX & "&y=" & mouseY)
		end if
	on error
		set title to app_name
	end try
end tell

Damit das Script auch gleichzeitig die Position des Mauszeigers erfasst, müssen noch die MouseTools heruntergeladen und — in meinem Fall — unter /usr/local/bin/ abgelegt werden.

Um dieses Script regelmässig auszuführen, habe ich mit der kostenpflichtigen Applikation Lingon einen launchd-Job erstellt (in der Steinzeit hat man noch auf Cron-Jobs zurückgegriffen), der jede Minute ausgeführt wird. Hierzu verwende ich ein bash-Script als Wrapper, um die Informationen an ein PHP-Script auf einem im Intranet stehenden Linux-Server weiterzuleiten:

#!/bin/sh

LOGGEDIN=`who | grep "^mario" | grep console | wc -l`
WGET="/opt/local/bin/wget"
#WGET=`which wget`

if [ $LOGGEDIN -lt 1 ];
then
        echo "User mario not logged in. Exiting."
        exit 0
fi

if [ ! -x "$WGET" ];
then
	echo "wget executable '$WGET' not found. Exiting."
	exit 1
fi

APP=`/usr/bin/osascript /usr/local/bin/FrontMostApplication.scpt`
#echo $APP

URL="http://tld/save.php?app=$APP"

#echo "Accessing URL '$URL' using $WGET"

$WGET -q -O /dev/null "$URL"

exit 0

Tags: , , , ,
Labels: Apple, Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 25. Februar 2012

youtube-dl meldet „no fmt_url_map or conn information found in video info“

Wer Youtube-Videos auf seinen Rechner herunterladen möchte, um sie später ohne Internetverbindung anschauen zu können, wird das Python-Script youtube-dl längst kennen.

Wenn das Ding aber den Fehler

$ ~/youtube-dl.sh http://www.youtube.com/watch?v=QhhFQ-3w5tE
[youtube] Setting language
[youtube] QhhFQ-3w5tE: Downloading video webpage
[youtube] QhhFQ-3w5tE: Downloading video info webpage
[youtube] QhhFQ-3w5tE: Extracting video information
ERROR: no fmt_url_map or conn information found in video info

meldet, sollte man sich den Fork von Philipp Hagemeister herunterladen, welcher den Bug behebt:

youtube-dl (Philipp Hagemeisters Fork)

Youtube-Video als MP3 herunterladen

Wenn wir gerade dabei sind: Wer obiges Tool einsetzt, sollte auch zwingend nachfolgende Web-Site kennen, welche Youtube-Videos in MP3-Dateien umwandelt:

www.youtube-mp3.org

Tags: , , , , ,
Labels: Linux

2 Kommentare | neuen Kommentar verfassen

Sonntag, 12. Februar 2012

Den bash Prompt den eigenen Bedürfnissen anpassen

Wegen der im vorgängigen Post erwähnten Anpassung an der /etc/hosts schaute mein Bash Shell Prompt plötzlich folgendermassen aus:

mario@192:/ $

Ich habe mich deshalb daran gemacht, das Prompt meinen eigenen Bedürfnissen anzupassen. Folgendermassen schaut es nun aus:

[mario@192.168.0.102:/] $ 

Die Ausgabe beim root-User sieht identisch aus, ausser dass das $ durch ein # ersetzt wurde und der Prompt in roter Farbe hervorgehoben ist.

Für die Einstellungen des root-Users habe ich /etc/bash.bashrc angepasst:

...#PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS1="\\[$(tput setaf 1)\\]\\u@\\H:\\w # \\[$(tput sgr0)\\]"

Für die Einstellungen aller anderen User muss man sich in die /etc/profiles bemühen:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"
fi

if [ "$PS1" ]; then
  if [ "$BASH" ]; then
    #PS1='\u@\h:\w\$ '
    PS1="[\\u@\\H:\\w] $ "
  else
    if [ "`id -u`" -eq 0 ]; then
      #PS1='# '
      PS1="[\\u@\\H:\\w] # "
    else
      #PS1='$ '
      PS1="[\\u@\\H:\\w] $ "
    fi
  fi
fi

export PATH

umask 022

Damit dies bei den einzelnen Benutzern auch wirklich so ausschaut, müssen diese in ~/.bashrc und ~/.bash_profile jegliche Definition der PS1-Variable verhindern.

Fazit: Ein riesiges Chaos mit unzähligen Overrides und verschachtelten Abhängigkeiten, welches eines Linux-Betriebssystems im Grunde unwürdig ist.

Tags: ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 12. Februar 2012

Apache kann den FQDN des Servers nicht festlegen

Seit Jahren ärgere ich mich damit herum, dass meine Cron-Logs jedes Wochenende mit folgendem Fehler aufwarten:

apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.0.101 for ServerName

Diese Meldung taucht auch auf, wenn ich den Server mit apache2ctl graceful respektive apache2ctl restart neu starte.

Heute nun habe ich mich endlich des Problems angenommen und teile die Lösung gerne mit der ganzen Online-Welt.

Der vom lokalen BIND (DNS-Server) geliefert Hostname meines Web-Servers lautete wie folgt:

$ host 192.168.0.101
101.0.168.192.in-addr.arpa domain name pointer alpha.emeidi.local.

In meiner /etc/hosts stand aber nur folgendes:

127.0.0.1	localhost

192.168.0.101	ALPHA
...

Nach einigem Googlen wechselte ich die Zeile beginnend mit 192.168.0.101 folgendermassen aus:

192.168.0.101	ALPHA ALPHA.emeidi.local mad4you.homeip.net

Und siehe da, ab sofort kann Apache den Fully Qualified Domain Name des Servers selber erraten.

Tags: , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 11. Februar 2012

curlftps mit Zeichensatz-Problemen

Ich ziehe mir wöchentlich ein Backup eines produktiven Web-Servers auf meinen Testserver. Da Endbenutzer Dateien auf die Web-Site laden und Ordner erstellen können, gibt es dort mittlerweile auch Dateinamen mit Sonderzeichen wie äöü.

Die Kombination aus curlftps (zur Bereistellung eines FTP-Mounts welcher wie eine lokale Festplatte angesprochen werden kann, zu Gunsten von rsync, mit welchem ich nur neu hinzugekommene Dateien übertrage) hat nun aber zu Problemen bei der Darstellung der Dateien mit Sonderzeichen geführt. Anstelle des ä bei „Bräteln“ sah ich auf der Kommandozeile mit ls nur „Br?teln“.

Seit ich curlftps mit folgenden Optionen aufrufe, klappt es auch mit der korrekten Übertragung der Dateinamen mit Sonderzeichen:

/usr/bin/curlftpfs -o codepage=latin1 -o iocharset=utf8 -r -s 'server.tld' '/mnt/ftpBackup/server.tld'

Damit wird tarsnap hoffentlich auch nicht mehr mit folgenden Fehlermeldungen auffallen:

...
tarsnap: var/www/sites/server.tld/Bilder/T�ftelwettbewerb/: Can't translate pathname 'var/www/sites/server.tld/Bilder/T�ftelwettbewerb/' to UTF-8
...

Übrigens: Meine locale-Einstellungen schauen folgender massen aus:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Tags: ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 22. Januar 2012

Eine Dropbox Gallery automatisiert herunterladen

Vor kurzem erhielt ich den Link auf die Bilder einer Weihnachtsfeier des vergangenen Jahres. Der Photograph benutzte dabei die Funktion von Dropbox, einen auf den Fileshare-Dienst geladenen Bilderordner über einen Link als Galerie zu veröffentlichen.

Da es mir zu blöd war, die hochauflösenden Bilder von Hand herunterzuladen, machte ich mich auf die Suche nach einem entsprechenden Script. Nach einigem Suchen wurde ich in einem Forumsartikel auf Dropbox selber fündig. Der in den Posts ursprünglich genannte Link auf eine Wiki-Seite von Dropbox funktionierte zwar nicht mehr, aber eine gute Seele hatte sich mittlerweile erbarmt und den Quellcode des Bash-Scriptes in einen Post geladen:

#!/bin/bash
#
# Call this with the URL of a public dropbox photo gallery as the first
# argument, a destination directory as the second argument, and optionally
# give a size (thumbnail|large|extralarge|original) for the third argument
# (defaults to original)
#
# Initial version written 1st June 2010, by Andrew Scheller
#
# Added quoting (so it works if urls or paths contain spaces) on 10th July 2010
#
# Tweaked to use either wget or curl, 17th January 2011
# Updated to current encoding of URLS, 11th October 2011 (python needed)
#

# get binary locations
WGET=$(which wget)
CURL=$(which curl)
if [ -z "$WGET" ] && [ -z "$CURL" ]
then
echo "Please install either wget or curl" >&2
exit 1
fi

if [ -z "$1" ]
then
echo "Required argument (gallery URL) not given"
exit 1
fi
GALLERY_URL=$1
if [ -z "$2" ]
then
echo "Required argument (destination dir) not given"
exit 1
else
if [ ! -d "$2" ]
then
echo "Destination dir '$2' doesn't exist"
exit 1
fi
fi
DESTDIR=$2
SIZE=original
if [ ! -z "$3" ]
then
if [[ "$3" == "thumbnail" || "$3" == "large" || "$3" == "extralarge" || "$3" == "original" ]]
then
SIZE=$3
else
echo "Size must be one of (thumbnail|large|extralarge|original)"
exit 1
fi
fi

TEMP=$(mktemp)
if [ "$WGET" ]
then
"$WGET" -q "$GALLERY_URL" -O "$TEMP"
elif [ "$CURL" ]
then
"$CURL" "$GALLERY_URL" -o "$TEMP" -s
fi
if [ $? -ne 0 ]
then
echo "Something went wrong! Couldn't download the gallery index page"
rm "$TEMP"
exit 1
fi
IFS='
'
FILENAMES=( $(grep "'filename': " "$TEMP" | cut -d"'" -f4) )
IMAGE_URLS=( $(grep "'$SIZE': " "$TEMP" | cut -d"'" -f4) )
rm "$TEMP"
TOTAL_FILENAMES=${#FILENAMES[@]}
TOTAL_IMAGES=${#IMAGE_URLS[@]}
if [ $TOTAL_FILENAMES -ne $TOTAL_IMAGES ]
then
echo "Something went wrong! Got list of $TOTAL_FILENAMES filenames but $TOTAL_IMAGES images"
exit 1
fi

for ((i=0;i<$TOTAL_IMAGES;i++))
do
FILENAME=$(python -c "print '${FILENAMES[$i]}'")
IMAGE_URL=$(python -c "print '${IMAGE_URLS[$i]}'")
echo "Downloading $FILENAME ($(($i + 1))/$TOTAL_IMAGES)"
if [ "$WGET" ]
then
"$WGET" -q "$IMAGE_URL" -O "$DESTDIR/$FILENAME"
elif [ "$CURL" ]
then
"$CURL" "$IMAGE_URLS" -o "$DESTDIR/$FILENAMES" -s
fi
done
exit 0

Wer das Script als Datei herunterladen möchte, bedient sich des folgenden Links:

2012-01-22-dropbox-gallery-download.sh

Tags: , , , ,
Labels: Linux

3 Kommentare | neuen Kommentar verfassen

Sonntag, 13. November 2011

Rekursives chmod von Dateien in einem Web-Verzeichnis mittels FTP-Kommandozeile

Weil der mit Mac OS X mitgelieferte Kommandozeilenclient ftp Dateiberechtigungen nicht rekursiv anpassen kann, wird lftp benötigt:

$ sudo port install lftp

Nach der Installation öffnet man folgendermassen die FTP-Verbindung zum betreffenden Server:

$ lftp
lftp :~> open emeidi.com
lftp emeidi.com:~> user benutzer passwort
lftp benutzer@emeidi.com:~> ls
...

Nachdem man sich in das entsprechende Verzeichnis durchgehangelt hat, reich ein

lftp benutzer@emeidi.com:~> chmod -R 777 .

aus, um die Anpassungen vorzunehmen. Da der entsprechende Ordner fast 10’000 Dateien enthielt, kam jedes GUI ins stottern — der Kommandozeilenclient verrichtete seine Arbeit wie erwartet rasch und ohne Komplikationen.

Tags: , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 11. September 2011

MySQL meldet „Got error 28 from storage engine“

Tritt dieser Fehler in den Error-Logs auf, handelt es sich höchstwahrscheinlich um eine volle /tmp-Partition:

...
/dev/sda8             361M  359M     0 100% /tmp
...

Quelle: database error „Got error 28 from storage engine query: SELECT DISTINCT(p.perm)“

Tags:
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 4. September 2011

Wie man Finnen so richtig ärgert

people started sending Linus money directly. I’m not sure they did it out of gratitude, however, since they usually sent personal checks from the US. As Linus quickly learned, Finnish banks really, really hate checks. Especially personal checks. Particularly personal checks from the US. They invent all sorts of bureaucratic pit-falls and rules and fees to make it difficult and expensive to use checks. If you want to make trouble for a Finn, send him a personal check from the US. And that’s not a joke.

Quelle: Linux Anecdotes

Tags: ,
Labels: Funny, Linux, USA

Keine Kommentare | neuen Kommentar verfassen

Samstag, 27. August 2011

Mehrere private SSH-Schlüssel auf einem Rechner?

Kein Problem! Man benutze hierzu einfach Einträge in der Datei ~/.ssh/config à la:

Host github github.com
Hostname github.com
IdentityFile ~/.ssh/id_rsa_git

Quelle: Best way to use multiple ssh private keys on one client

Tags: , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen