Tags: Artikel mit dem Tag «Shell» durchstöbern
Fix subverison error: Valid UTF-8 data followed by invalid UTF-8 sequence
This is a solution to fix problems with SVN when you can't update your working copy for some rather odd reason. Everything you get is an obscure error message like this:
svn: Valid UTF-8 data (hex: 65 64 69 74 65 64) followed by invalid UTF-8 sequence (hex: ad 6c 69 73)
This does not only appear when doing svn update but even pops up while svn status.
Since Subverion can handle binary files this is quite confusing. At luck, after some googling I found out that these errors are caused by file names with e.g. Chinese characters.
Unfortunately the error message can't display the corrupt file name because it contains non-UTF-8 data. So I figured that the „Valid UTF-8 data“ (In this case the hex sequence 0x65, 0x64, 0x69, 0x74, 0x65, 0x64) translates to the string „edited“ using some UTF-8 table.
Since there were way too many files with this string I had to look for the 0xAD 0x6C sequence. This could be the asian symbol 구, but you can't grep for this, because it is not UTF-8 encoded. However we can look for the byte sequence using some perl magic:
find /path/to/workingcopy | perl -n -e "print if /\xAD\x6C/" | less
Note the hex-regexp used here to scan binary content in file names. It outputs a nice (and in this case rather short) list like:
/path/to/workingcopy/folder/of/colleque/edited<AD>list.txt
Interestingly, less tries to expose the binary data. Now you just have to rename the file and you're good to go and able to update your working copy again.
Howto: Start using Subversion

Subversion
Sometimes you want to start using Subversion code control with an existing project. This tutorial explains the steps required to create a repository and add the files of the existing project.
Start by creating a repository:
svnadmin create /dir/to/store/repo/repository-name
This will create a directory „repository-name“ containing the database of files and revisions.
Then let's add some internal directories to our repository:
svn mkdir file:///dir/to/store/repo/repository-name/trunk \ -m "Creating repo directory structure"
Now that you have created the repo-directory that should contain all the files, import the existing project files. Start by checking out the empty repo-dir to into your project dir. This will make your project dir a working copy (that is: create a dir named „.svn“ containig some internal info) but won't change anything else.
cd /existing/poject/dir svn checkout file:///dir/to/store/repo/repository-name/trunk .
Then go on adding (or planing to add) all the files:
svn add *
This command will list all the files that will be loaded into the repository. You can always look at the planned changes with svn st.
You probably want to exclude some files such as configuration files, runtime data. You just have to revert the add-command again:
svn revert runtimedata # exclude whole dir svn revert config/my.ini # exclude single file
Then apply the changes to your repository (commit it):
svn commit \ -m "initial import"
And that's it. You project is added to the repository without extra files. That can be crucial if your runtime data has a huge file size. If you're paranoid or just curious check the repository for success:
svnlook tree /dir/to/store/repo/repository-name
This should show the imported directory tree. Now you can start making changes to your files and commit them as usual.
vim app.cpp svn commit -m "typo" svn log -r 1:HEAD #show full revision history
If you ever got stuck, you may use the built in help:
svn help #list commands svn help commit #list options svnlook help tree #works too
I will start using subversion for everything... soon.
Pimp deine MOTD
Jedes mal, wenn man eine Shell öffnet und sich einloggt, begrüßt die Message of the Day. Diese habe ich mit einem „coolen“ Schriftzug „aufgewertet“.
Viele Systemadministratoren lassen die MOTD einfach leer. Ich habe bisher meist einen Begrüßungssatz hineingesetzt, so dass ich (und andere), beim Arbeiten an vielen Computern gleichzeitig über remote shells, wie ssh, leichter die Übersicht behalten kann. Bei Computern, die von vielen verschiedenen Anwendern benutzt werden (z.B. an der Uni) findet man dort Benutzungsregeln, Hinweise auf Downtime und was die IT-Abteilung gerade neues installiert hat. Wenn der Administrator einen Clown gefrühstückt hat, auch mal einen guten Witz.
Als ich vor kurzem frisch eingeloggt auf ein langwieriges rekursives grep wartete, habe ich mir nach einem Routinecheck sämtlicher Logfiles beim Betrachten der nicht sehr kreativen MOTD gedacht, ich könnte sie doch etwas ausschmücken, „make it pop out“, damit die Programmierer zu Beginn ihrer Arbeit motivierend begrüßt werden.
Wie wäre es mit einem ASCII-Art-Schriftzug? Bei Google ganz oben stand der ASCII-Generator. Man kann bei diesem Generator auch eine Schrift „_all fonts with your text_“ auswählen, sodass man nicht ständig klicken muss. Damit die Chefetage nicht die ganze IT-Fraktion als kindisch abstempelt, wählte ich die Schrift „big“.
Dann habe ich mir kurz die Privilegien verschafft, um die /etc/motd zu bearbeiten, und siehe da... jeder, der sich seither auf dem Server tummelt, bekommt sein halbes Terminal mit einem protzigen Schriftzug vollgespammt. Das scheint glücklicherweise niemanden gestört zu haben... eher im Gegenteil. Zumindest passiert jetzt hoffentlich nicht mehr das wohl jedem bekannte „Oh ich habe gedacht ich arbeite auf Aquarium.Buckelwal und aus versehen auf Pool.Badeente die ganzen Backups gelöscht“. Und nicht vergessen:
o8o . oooo .o. `"' .o8 `888 888 oooo .o888oo oooo d8b .ooooo. .ooooo. 888 oooo .oooo.o 888 `888 888 `888""8P d88' `88b d88' `"Y8 888 .8P' d88( "8 Y8P 888 888 888 888 888 888 888888. `"Y88b. `8' 888 888 . 888 888 888 888 .o8 888 `88b. o. )88b .o. o888o "888" d888b `Y8bod8P' `Y8bod8P' o888o o888o 8""888P' Y8P
Oh das ist ja zweideutig...
KDE4 Twitter Benachrichtigungen
Da ich gerne das Webinterface von twitter benutze, aber auch gleich wissen will, ob jemand etwas neues getwittert hat, habe ich ein kleines Bash-Script geschrieben, welches eine Meldung aufploppen lässt, sollte jemand einen neuen tweet schreiben.
Es benutzt kdialog, die Meldungen integrieren sich also Problemlos in den KDE-Desktop. Es ist auch recht kurz und einfach.
Einfach herunterladen und in $PATH ablegen. Zum Starten genügt:
nohup twitterNotify.sh &
Da es nicht sonderlich viel Aufwand betreibt, um die XML-Antworten der Twitter-API zu parsen kann nicht zu viel Information übermittelt werden, außer woher die tweets kommen.
Howto: PHP5.3 parallel zu PHP5 installieren
Wenn man die neuen PHP-5.3-Funktionen testen will, aber trotzdem für die meisten Projekte aus Kompatibilitätsgründen eine ältere PHP(5)-Version benutzen will, kann man PHP 5.3 parallel als CGI-Modul installieren. Dazu sind folgende Schritte möglich:
Zunächst benötigt man den Quelltext (Sourcecode) der aktuellen php5.3-stable Version. Er ist zu finden auf der PHP-Download-Seite bzw. Version 5.3.0 kann so direkt heruntergeladen werden:
wget http://de2.php.net/get/php-5.3.0.tar.gz/from/this/mirror tar xzfv php-5.3.0.tar.gz cd php-5.3.0/
Dann muss die PHP-Installation konfiguriert werden. Dazu benutzt man zunächst in der Ausgabe von phpinfo() das "Configure Command" als Basis. In diesem ändert man dann in den Dateipfaden php5 zu php53 und man setzt --bindir=/usr/bin/php53, um Konflikte mit anderen php5-Binaries zu vermeiden. Das sieht z.B. so aus:
./configure --prefix=/usr/share/php53\ --datadir=/usr/share/php53\ --mandir=/usr/share/man\ --bindir=/usr/bin/php53\ --with-libdir=lib64\ --includedir=/usr/include\ --sysconfdir=/etc/php53/apache2\ --with-config-file-path=/etc/php53/apache2\ --with-config-file-scan-dir=/etc/php53/conf.d\ --enable-libxml\ --enable-session\ --with-pcre-regex=/usr\ --enable-xml\ --enable-simplexml\ --enable-filter\ --disable-debug\ --enable-inline-optimization\ --disable-rpath\ --disable-static\ --enable-shared\ --with-pic\ --with-gnu-ld
Eine Liste mit allen Optionen zeigt ./configure --help. Das Konfigurieren überprüft alle Einstellungen und wird eine Weile laufen - und meistens nicht beim ersten Mal klappen, was meistens bedeutet, dass --with-xyz verwendet wurde, ohne dass die entsprechenden Libraries gefunden wurden. Dann muss man das Modul deaktivieren oder nach einer Lösung googeln/bingen. Manchmal fehlen auch Header, welche, je nach Distribution, in einem Paket ähnlich wie [lib]xyz-dev[el] zu finden sind.
Als nächstes wird das ganze kompiliert und (als root/superuser) die neue PHP-Version installiert:
make # optional, dauert, findet aber Fehler: make test # bringt die Dateien an ihren Platz: sudo make install
Jetzt muss noch Apache über das neue CGI-Modul informiert werden. Dazu müssen die folgenden Konfigurationen gesetzt werden (z.B. elegant in einer neuen Datei /etc/apache2/conf.d/php53cgi.conf):
# Damit mod_mime die neue Dateierweiterung erkennt:
AddHandler php53-cgi .php53
# Damit die Binaries aufgerufen, nicht versendet, werden:
ScriptAlias /bin-php53 /usr/bin/php53/
# Was eigentlich passieren soll:
Action php53-cgi /bin-php53/php-cgi
# Und noch ein paar Einstellungen für die Binaries:
<Directory /usr/bin/php53>
# Kein .htaccess:
AllowOverride None
# CGI aktivieren, softlinks folgen
Options +ExecCGI +FollowSymLinks
# normalerweise ist der Zugriff auf alle „sonstigen“ Dateien gesperrt,
# daher hier wieder freigeben:
Order allow,deny
Allow from all
</Directory>
Zum Testen kann man z.B. eine phpinfo.php53-Datei anlegen und man sollte die neue PHP-Verion angezeigt bekommen. Auf dieser Info-Seite kann man dann prüfen, ob alle Module verwendbar sind, die Zeitzone gesetzt ist und anderen potentielle Konfigurationsfehler auf die Schliche kommen. PHP 5.3 wird auch seine eigene php.ini in /etc/php53/apache2/php.ini verwenden, wohin man vielleicht zunächst die alte Konfigurationsdatei kopieren will.
# php.ini replazieren: sudo cp /etc/php5/apache2/php.ini /etc/php53/apache2/php.ini # im Webroot phpinfo mit namespace-Spielerei anlegen :) echo "<?php namespace YEEES; phpinfo();" > phpinfo.php53
Nach den Schritten dieses Tutorials dürfte dann PHP 5.3 mehr oder weniger optimal laufen, ohne dass die Funktion alter Scripte eingeschränkt werden muss, und es lässt sich einfach die Interkompatibilität zwischen den Versionen testen.
Keine Garantie, Verwenden auf eigenes Risiko.
Edit 2009-10-28: On-the-fly zu PHP5.3 Wechseln
Das ständige Umbenennen von Dateien kann natürlich sehr mühsam sein. Leicht wechselt man ganze Verzeichnisse zu PHP5.3 indem man folgendes in ihrer .htaccess-Datei einfügt:
AddHandler php53-cgi .php
So kann man dann auch zum Testen schnell den ganzen Server zwischen den Versionen wechseln.



