http://raphael.kallensee.name/Journal « Raphael Kallensee2013-05-19T12:58:50ZRaphael Kallenseehttp://raphael.kallensee.nametag:raphael.kallensee.name,2013-05-19:/journal/rsync-music-and-pictures-to-your-synology-diskstation-without-losing-thumbnails-and-metadata/Rsync music and pictures to your Synology DiskStation without losing thumbnails and metadata2013-05-19T12:58:50Z2013-05-19T12:58:50Z<p>I currently keep photos and music on my desktop computer and my Synology DiskStation NAS. I sync them from my desktop computer to the DiskStaion using <a href="http://rsync.samba.org/">rsync</a> (or sometimes <a href="http://www.opbyte.it/grsync/">Grsync</a> when I’m in the mood of using a GUI).</p>
<p>To remove deleted files also from my DiskStation I’m passing the <code>--delete</code> option to rsync. But when I first did this I found out rsync was removing all the hidden “@eaDir” subfolders the DiskStation created for storing thumbnails, album covers and metadata. This caused the DiskStation to recreate all the thumbnails again (if you store many photos on your DiskStation you know this process takes days).</p>
<p>I checked the available exclude and filter options of rsync and found a pretty good way to avoid this problem. Using a filter to ignore the “@eaDir” subfolders on the remote side fixed the problem, but adding just a filter is still problematic because rsync would leave empty folders (well, not really empty – folders with “@eaDir”) on the DiskStation when deleting folders on the desktop PC. But there’s an elegant way to solve this: the “perishable” filter option (which I found in <a href="http://blog.mudflatsoftware.com/blog/2012/10/31/tricks-with-rsync-filter-rules/">this blog post</a>). This filter option ignores the filter rule when a folder gets deleted.</p>
<p>This is the rsync command I currently use to sync my photos to the DiskStation (with dry-run enabled by the <code>-n</code> parameter):</p>
<pre><code data-language="bash">rsync -r -n -t -v --progress --delete --filter="-p @eaDir" /home/raphael/Pictures/ raphael@DiskStation:/volume1/photo/Raphael</code></pre>
<p>Make sure to adjust the path to your needs and do a dry-run (activated with the <code>-n</code> option in the line above – where rsync only reports which files it would transfer/delete without any actual sync) to make sure everything works as expected before running the real sync. If everything looks good, remove the <code>-n</code> option.</p>
tag:raphael.kallensee.name,2013-04-19:/journal/how-to-setup-git-and-git-aliases/How to setup Git and Git aliases2013-04-19T12:51:45Z2013-04-19T12:51:45Z<p>After I switched from Subversion to <a href="http://git-scm.com/">Git</a> (at least for my personal projects) since a while I finally took the time to improve my setup and create various aliases to achieve more using shorter commands.</p>
<p>This is a short reference of various configuration settings I use. Note: all of these settings are made global (which means they are used for all Git repositories of the current system user and are stored in <code>~/.gitconfig</code>). By removing the <code>--global</code> option and firing up the commands in a Git repository only sets these settings for the current project (they’re then stored in <code>.git/config</code> relative to the project root).</p>
<h3>General configuration</h3>
<p>Before using Git for the first time you definitely should configure your name and e-mail address. Both of them are part of every commit.</p>
<pre><code data-language="bash">git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
</code></pre>
<p>After that you can set some more general settings. A good thing is colored output in the terminal, which is activated by setting the <code>color.ui</code> setting to <code>true</code>. Because I want to work more with vim, I configure vim to be my Git text editor by changing the <code>core.editor</code> setting. I also set the <code>merge.tool</code> setting to use <code>vimdiff</code> (even if I’m not yet experienced with it). Another setting is <code>core.filemode</code> which I set to <code>false</code> because I want Git to ignore file mode changes.</p>
<pre><code data-language="bash">git config --global color.ui "true"
git config --global core.editor "vim"
git config --global merge.tool "vimdiff"
git config --global core.filemode false
</code></pre>
<h3>Configuring aliases</h3>
<p>When working with Git on the command line you quicky detect that you’re typing a few commands very often and that it’d be a lot more convenient if these commands would be shorter. Other commands have tons of parameters which are really hard to remember and impossible to type everytime you need them. The good thing is that Git allows you to configure aliases.</p>
<p>This is my current alias configuration:</p>
<pre><code data-language="bash">git config --global alias.st "status"
git config --global alias.ss "status -s"
git config --global alias.aa '!git add -u && git add . && git status'
git config --global alias.ap "add -p"
git config --global alias.co "checkout"
git config --global alias.df "diff"
git config --global alias.lg "log --graph --pretty=format:'%C(bold red)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold green)<%an>%Creset' --abbrev-commit --date=relative"
git config --global alias.cm "commit --verbose"
git config --global alias.ca "commit -a --verbose"
git config --global alias.am "commit --amend"
git config --global alias.ph "push"
git config --global alias.ft "fetch"
git config --global alias.pl "pull"
git config --global alias.pr "pull --rebase"
</code></pre>
<p>These aliases offers a shorter alternative for frequently used commands like “status”, “checkout”, “diff”, “push”, “fetch” and “pull” – instead of typing <code>git status</code> you can now just use <code>git st</code>.</p>
<p>A few more explanations: The alias <code>aa</code> stages all tracked and untracked files and changes. By using the <code>ap</code> alias you can use the <a href="http://johnkary.net/blog/git-add-p-the-most-powerful-git-feature-youre-not-using-yet/">patch mode</a> to stage even parts of changes in files – it presents you all changes and lets you decide if you want to stage them. The alias <code>lg</code> does a lot: it specifies the format of the log and adds some nice colors. Both <code>cm</code> and <code>ca</code> aliases add the <code>--verbose</code> option which I saw first in the great screencast <a href="https://peepcode.com/products/play-by-play-aaroncorey">Play by Play: Aaron Patterson and Corey Haines</a>. This allows you to review a full diff of the commit in your editor when writing the commit message. <code>pr</code> is an alias for doing a <code>pull</code>, but using <a href="http://git-scm.com/book/en/Git-Branching-Rebasing">rebase</a> to integrate your changes.</p>
<h3>Your ~/.gitconfig</h3>
<p>As noted earlier, all these commands add values to your ~/.gitconfig. You can view and change them there, or just editing this file directly. This is how the file looks after applying all these settings:</p>
<pre><code data-language="">[user]
name = John Doe
email = john.doe@example.com
[color]
ui = true
[core]
editor = vim
filemode = false
[merge]
tool = vimdiff
[alias]
st = status
ss = status -s
aa = !git add -u && git add . && git status
ap = add -p
co = checkout
df = diff
lg = log --graph --pretty=format:'%C(bold red)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold green)<%an>%Creset' --abbrev-commit --date=relative
cm = commit --verbose
ca = commit -a --verbose
am = commit --amend
ph = push
ft = fetch
pl = pull
pr = pull --rebase
</code></pre>
<h3>Resume</h3>
<p>Git is a powerful tool – and sometimes hard to learn. But using aliases makes it a lot more convenient.</p>
<p>I found the following links very helpful:</p>
<ul>
<li><a href="http://git-scm.com/book/en/Customizing-Git-Git-Configuration">Official Git documentation</a></li>
<li><a href="http://www.vogella.com/articles/Git/article.html#setup">Git tutorial at vogella.com</a></li>
<li><a href="http://robots.thoughtbot.com/post/4747482956/streamline-your-git-workflow-with-aliases">Article from thoughtbot about aliases</a></li>
</ul>
tag:raphael.kallensee.name,2013-04-07:/journal/from-wordpress-to-nanoc/From WordPress to nanoc2013-04-07T20:11:00Z2013-04-07T20:11:00Z<p>After being tired of updating WordPress more often than writing blog posts, having to deal with increasing comment spam
and the desire to <a href="http://tom.preston-werner.com/2008/11/17/blogging-like-a-hacker.html">blog like a hacker</a>
I now switched my whole website to the static website generator <a href="http://nanoc.ws">nanoc</a>, ending the era of WordPress
blogging after many years. Now I’m able to write my posts in my favorite text editor, use Git for versioning
and do deployments easily via rsync.</p>
<p>I removed blog post categories entirely and tags are only listed at the end of journal posts, but there’s no
functionality behind them yet (which may change sooner or later). The comment functionality was replaced with
<a href="http://disqus.com">Disqus</a>, old comments will appear when the import is done (in a few hours).</p>
<p>I recycled the old layout (with a few improved details) and migrated all my posts with <a href="https://github.com/mconigliaro/website/blob/master/bin/wp2nanoc.rb">wp2nanoc</a>, which was pretty easy. Let me know if you find any errors.</p>
<p>I introduced a few new things: finally I integrated a lightbox for more convenient image viewing – and I found the great
<a href="http://dimsemenov.com/plugins/magnific-popup/">Magnific Popup</a> which is CSS3-only and responsive. Since I wasn’t
able to use my old WordPress syntax highlighting plugin, I switched to a JavaScript highlighter called
<a href="http://craig.is/making/rainbows">Rainbow</a> which is doing a great job so far.</p>
<p>Why nanoc? A few months ago I started to think about switching to <a href="http://octopress.org/">Octopress</a> or plain
<a href="https://github.com/mojombo/jekyll">Jekyll</a> or building a <a href="http://www.sinatrarb.com/">Sinatra</a>-based site
by myself. But then I attended <a href="http://fosdem.org/2013/">FOSDEM 2013</a> and the
<a href="https://fosdem.org/2013/interviews/2013-denis-defreyne/">talk</a> of <a href="http://stoneship.org/">Denis Defreyne</a>
on his static site generator <a href="http://nanoc.ws">nanoc</a>. nanoc looked so easy yet powerful and flexible, so
I started to play around and rebuild my site with it. It turned out nanoc is really a great piece of software.</p>
<p>The basic version is now ready, but there are many open tasks. I didn’t yet integrate Sass/Compass, didn’t clean up
my templates and CSS enough and my layout is still not responsive and mobile-ready.</p>
<p>While I still plan to write a more technical post and release the code of this website, if you want to check out
nanoc I can recommend some related blog posts which were useful to me:</p>
<ul>
<li><a href="http://h3rald.com/articles/take-back-your-site-with-nanoc/">http://h3rald.com/articles/take-back-your-site-with-nanoc/</a></li>
<li><a href="http://clarkdave.net/2012/02/building-a-static-blog-with-nanoc/">http://clarkdave.net/2012/02/building-a-static-blog-with-nanoc/</a></li>
<li><a href="http://el-tramo.be/blog/wordpress-to-nanoc/">http://el-tramo.be/blog/wordpress-to-nanoc/</a></li>
<li><a href="http://www.conigliaro.org/2011/09/08/from-wordpress-to-nanoc/">http://www.conigliaro.org/2011/09/08/from-wordpress-to-nanoc/</a></li>
</ul>
tag:raphael.kallensee.name,2013-03-17:/journal/how-to-backup-an-external-server-with-a-synology-nas-via-rsync/How to backup an external server with a Synology NAS using rsync2013-03-17T19:03:50Z2013-03-17T19:03:50Z<p>I recently bought a Synology NAS and I’m mostly happy with it. Additionally I bought a Raspberry Pi and installed <a href="http://www.raspbmc.com/">Raspbmc</a> on it – this made my setup at home even better.</p>
<p>Recently I thought about how to use my NAS to improve the backup workflow of my (external) VPS servers. Currently they are doing a very simple backup (make a gzipped tar of important files and database dumps, encrypt them with GnuPG and rsync them to the hosters' backup space) every night. I keep the backups of a few days back and remove older backups. To store a few backups locally (just in case…) I used to download a backup manually every week (well, at least that was the plan). I don’t have to tell you – downloading backups manually isn’t much fun and in the last time I didn’t really keep up with this plan.</p>
<p>My solution to improve this manual workflow was to set up the local NAS to fetch all the stored backups from the hosters' backup space (or from the server itself) via rsync so that I have all the backups also on my local NAS. It’s really simple and only requires a few steps. The good thing is that you can add this backup nicely with the <a href="http://www.synology.com/dsm/">Synology DSM</a> user interface since the latest version 4.2, which introduced user-defined scripts in the task scheduler.</p>
<p>Let’s get started. The most important part is the shell script which connects to the backup server, authenticating against the server with a private SSH key and synchronizing the backups with the NAS via rsync. The good thing is that Synology NAS devices run a Linux operating system, making things like this very easy. The bad thing is that the locations of binaries differ from other linux systems (partly because Synology customizes many of the tools to suit their needs) so you have to find the locations of the binaries first.</p>
<p>However, this is the shell script I hacked together:</p>
<pre><code data-language="bash">#!/bin/bash
USER="backupuser123"
SERVER="backupserver.my-vps-hoster.net"
PORT="22"
SSHID="/volume1/homes/admin/server-backups/the-name-of-my-server/filename-of-my.private-key"
SOURCE="/data/"
TARGET="/volume1/homes/admin/server-backups/the-name-of-my-server/backups/"
LOG="/volume1/homes/admin/server-backups/the-name-of-my-server/backup.log"
/usr/syno/bin/rsync -avz --delete --progress -e "ssh -p $PORT -i $SSHID" $USER@$SERVER:$SOURCE $TARGET >> $LOG 2>&1
</code></pre>
<p>Just a few explanations: in the first three lines I’m configuring the user, host and port of the server I want to sync with (in my case this is the backup space of my hoster where I’m storing the encrypted backups). The variable SSHID stores the path to my private SSH key on the NAS which is used to authenticate against the server, so I don’t have to use a password. As you can see in the path I’m using the home directory feature of the Synology NAS which creates a home directory for every NAS user; I added a folder for the backup-related stuff to the home directory of the “admin” (equals <em>partly</em> to root) user. The SOURCE variable stores the absolute path of the remote directory I want to sync. TARGET stores the absolute path to the folder on the NAS where I want to sync the backups to. Just to track down possible problems later I’m writing the output of the rsync status to a file called backup.log, the path to this file is stored in the LOG variable. To find out the appropriate paths on your device you can use the shell of your NAS via SSH access.</p>
<p>I placed the shell script under /volume1/homes/admin/server-backups/the-name-of-my-server/sync-backups.sh and set the file permissions to 700 (as for every script it’s important to make it executable). You can do this by throwing the file to the NAS via CIFS/NFS and change the permissions e.g. via “File Station” in the web-based GUI – or enable SSH access to the NAS, edit the file with vi and set the permissions via the shell. You should create the “backups” folder or use an existing different folder for the backups – but remember that it should be empty, or rsync will delete its contents! Also creating the “backup.log” log file might be a good idea. You should also place the private RSA key for SSH access to the source server on the specified location and remove all permissions except read permissions for the admin user.</p>
<p>Now that everything is in place we’re ready to test this script. At this point you should have SSH access to the NAS (which you can enable in the DSM – Control Panel > Terminal). Log into the device using the admin or root user and using your password. Navigate to the location of the shell script and run e.g. “./sync-backups.sh”. The first time you’re doing this you’ll get asked if you want to trust the host you’re connecting to (at least if you never connected to this server via SSH from your NAS) – this is the reason why you should run it on the shell for the first time. If you say “yes” it will store the public RSA key in the users' home directory in the file ~/.ssh/known<em>hosts. This step is very important, otherwise your automatic syncs won’t work. This is also the point where I had the most problems: I connected via SSH to the NAS with the “admin” user, therefore the host was stored in the known</em>hosts file of the “admin” user. Until this point I thought the “admin” user is somehow identical with the “root” user. I still don’t know how exactly they are related to each other, but what I found out is that even after I added the server key to known_hosts with the admin user and the script ran fine on the shell, I wasn’t able to run the task as scheduled task via DSM (even if I set the task up to run as “admin”). I always got this error:</p>
<p><code>
Host key verification failed.
rsync error: unexplained error (code 255) at io.c(687) [Receiver=3.0.9]
</code></p>
<p>The solution was to log into the NAS with the “root” user (same password as the “admin” user) and run the shell script. I was asked again if I want to trust the server, and then the job ran nicely. Voilá – you should now see your server backup in your backup folder!</p>
<p>Ok. After you placed the script onto the NAS, created the logfile and the backup directory, set the appropriate permissions and added the remote host to known_hosts, the only thing left is to set up the job via Synology DSM. Go to the Control Panel > Task Scheduler and create a task with the type “User-defined script” (as mentioned earlier this requires DSM 4.2, otherwise you have to add the cronjob manually). You just have to assign a name, set the task to run as “admin” and specify the path to the script.</p>
<p><a href="/static/media/journal/2013/03/synology-task-server-backup.png"><img src="/static/media/journal/2013/03/synology-task-server-backup-300x270.png" alt="Scheduled task with user-defined script in Synology DSM 4.2" width="300" height="270" class="aligncenter size-medium wp-image-439" /></a></p>
<p>In the tab “Schedule” I set the task up to run daily – and set the time about one hour after my server does his backup (to make sure it’s always done before Synology starts to sync). To make sure everything works you can select the task in the list (after saving it) and click on the “Run” button. You can check the log file you specified in the shell script a few moments later to make sure no errors are popping up!</p>
tag:raphael.kallensee.name,2013-01-27:/journal/fosdem-2013-updated-apps-for-android-and-webos/FOSDEM 2013: updated apps for Android and WebOS2013-01-27T19:06:55Z2013-01-27T19:06:55Z<p><img src="/static/media/journal/2013/01/google-play-store-appicon-150x150.png" alt="FOSDEM Gear logo" width="150" height="150" class="alignleft size-thumbnail wp-image-417" />As in the last years, I released a slightly updated version of the WebOS app for <a href="http://fosdem.org/">FOSDEM</a> (Free and Open source Software Developers’ European Meeting). FOSDEM 2013 is taking place on February 2nd and 3rd in Brussels (Belgium).</p>
<p><a href="/static/media/journal/2013/01/fosdem-2013-webos.png"><img src="/static/media/journal/2013/01/fosdem-2013-webos-200x300.png" alt="FOSDEM 2013 WebOS (Screenshot)" width="200" height="300" class="alignright size-medium wp-image-422" /></a>The new version of the FOSDEM WebOS app includes the new FOSDEM gear icon and smaller fixes. It allows you to download the schedule to your phone, mark favorite events, display maps and more. It can be downloaded from the <a href="https://developer.palm.com/appredirect/?packageid=net.webpresso.fosdem">HP App Catalog</a>. You can find more information and the source code <a href="http://forge.webpresso.net/projects/fosdem-webos">in this Redmine project</a>, the source code is also mirrored on <a href="https://github.com/rkallensee/fosdem-webos">Github</a>. You can also download the <a href="http://forge.webpresso.net/attachments/download/33/net.webpresso.fosdem_0.2.11_all.ipk">*.ipk package</a> (exactly the same version like in the App Catalog).</p>
<p>The FOSDEM WebOS app is released as free software under <a href="http://www.gnu.org/licenses/gpl.html">GPL</a>.</p>
<p>In addition to the WebOS app I also helped out with the Android app this year. I found out that the existing app didn’t work with the new schedule (because the URL moved from http to https). <a href="/static/media/journal/2013/01/fosdem-2013.android.png"><img src="/static/media/journal/2013/01/fosdem-2013.android-180x300.png" alt="FOSDEM 2013 app for Android (Screenshot)" width="180" height="300" class="alignleft size-medium wp-image-425" /></a> Also there wasn’t an update since ~2 years, so I decided to <a href="http://developer.android.com/design/get-started/ui-overview.html">Holo</a>-ify the user interface of the <a href="https://sourceforge.net/projects/fosdem-android">existing app</a> and make it feel more like a modern Android app. The most recent code I found was the fork from <a href="https://github.com/orrc/fosdem-android">Christopher Orr on Github</a>, so I <a href="https://github.com/rkallensee/fosdem-android">forked his code</a>. I replaced the old logo with the gear icon, made use the new FOSDEM colors and added the <a href="http://developer.android.com/guide/topics/ui/actionbar.html">Action Bar</a> as important tool for navigating through the app. To provide backward compatibility with Android 2.x devices (who don’t ship with the Holo UI) I used the great <a href="http://actionbarsherlock.com/">ActionBarSherlock</a> library.</p>
<p>The Android app is available in the <a href="https://play.google.com/store/apps/details?id=org.fosdem">Google Play Store</a> where Michaël, one of the original creators, pushed my changes to. You can find the source code on <a href="https://github.com/rkallensee/fosdem-android">Github</a> (<a href="http://forge.webpresso.net/projects/fosdem-android">a mirror can be found in my Redmine project</a>). You can also <a href="http://forge.webpresso.net/projects/fosdem-android/files">download the *.apk</a> directly, although it was signed by me and therefore is not compatible (means upgradeable) with the Play Store version.</p>
<p>Links to all FOSDEM apps for multiple platforms are listed on the <a href="https://fosdem.org/2013/schedule/mobile/">FOSDEM website</a>.</p>
tag:raphael.kallensee.name,2012-11-14:/journal/nexus-7-manuell-auf-android-4-2-aktualisieren/Nexus 7 manuell auf Android 4.2 aktualisieren2012-11-14T08:01:49Z2012-11-14T08:01:49Z<p>Seit gestern rollt Google das Update auf Android 4.2 (Build JOP40C) sowohl auf dem Galaxy Nexus als auch dem Nexus 7-Tablet aus. Bis man das Update aber über das Tablet angeboten bekommt, kann es unter Umständen Tage oder Wochen dauern, da es nach und nach auf alle Geräte verteilt wird.</p>
<p>Mittlerweile gibt es eine neue, einfache Möglichkeit, solche Updates manuell einzuspielen – ohne ein Custom Recovery installiert oder root-Rechte haben zu müssen. Auch der Bootloader muss nicht entsperrt sein. Die Methode funktioniert also auf jedem Tablet – man muss nur am PC das <a href="http://developer.android.com/sdk/installing/index.html">Android-SDK installiert haben</a>. Wichtig ist insbesondere das Tool
<a href="http://developer.android.com/tools/help/adb.html">adb</a>, das mit den “platform tools” des SDK installiert wird. Wichtig ist, dass adb aktuell ist, denn wir verwenden das recht neue Kommando “adb sideload”.</p>
<p>Auf dem Nexus 7 sollte Android 4.1.2 ohne Modifikationen installiert sein. Achtung: das Update geschieht natürlich auf eigene Gefahr!</p>
<ul>
<li>Zuerst wird das <a href="http://android.clients.google.com/packages/data/ota/google_nakasi/094f6629314a.signed-nakasi-JOP40C-from-JZO54K.094f6629.zip">Update-Archiv von Google</a> heruntergeladen.</li>
<li>Dann wird das Nexus 7 ausgeschaltet und mit gedrückter “Volume down”-Taste wieder eingeschaltet. Daraufhin sollte das “fastboot”-Menü erscheinen.</li>
<li>Mit den Lautstärketasten zum Punkt “Recovery” navigieren.</li>
<li>Den Power-Button drücken, daraufhin bootet das Gerät in den Recovery-Modus.</li>
<li>Nun sollte ein Android mit rotem Ausrufezeichen zu sehen sein. Jetzt muss die “Volume up”-Taste und der Power-Button gleichzeitig gedrückt werden, sodass ein Menü erscheint. Dieser Schritt benötigte bei mir einige Anläufe.</li>
<li>Mit den Lautstärketasten den zweiten Eintrag “apply update from adb” auswählen.
<li>Nun wird das Nexus 7 an den PC mit installiertem “adb” angeschlossen. Zum Test, ob die Verbindung steht, kann man in der Konsole mit “adb devices” sehen, ob das Gerät angeschlossen wurde. Falls alles funktioniert, sollte hier die Geräte-ID auftauchen.</li>
<li>Ich hatte an der Stelle unter Linux das Problem, dass die Fehlermeldung “insufficient permissions” erschien. Folgendes schaffte Abhilfe: ein “sudo adb kill-server”, ein “sudo adb start-server” und auch anschließend adb mit sudo aufrufen.</li></li>
<li>Nun wird mit dem Kommando “sudo adb sideload 094f6629314a.signed-nakasi-JOP40C-from-JZO54K.094f6629.zip” das Update gestartet. (Hinweise: sudo war bei mir erforderlich. Der letzte Teil ist der Name der Update-Datei – hier muss evtl. ein anderer Pfad angegeben werden. Durch die Verwendung von sudo musste ich statt “adb” den vollen Pfad zum adb-Binary angeben, das unter Linux im Ordner “platform-tools” des Android-SDK liegt.)</li>
<li>Nun sollte das Update auf das Tablet geladen werden und erfolgreich durchlaufen. (Dauerte bei mir etwa fünf Minuten.)</li>
<li>Nach dem Ende wird wieder ein Menü angeboten, dort “Reboot system now” auswählen und mit dem Power-Button bestätigen.</li>
<li>Fertig!</li>
</ul>
<p>Viel Spaß mit Android 4.2, der Mehrbenutzerfähigkeit, Lock-Screen-Widgets und den vielen kleinen Verbesserungen!</p>
<p>Die Original-Anleitung (englisch), nach der ich vorgegangen bin (inklusive Bildern) gibt es bei <a href="http://www.androidpolice.com/2012/11/13/android-4-2-build-jop40c-rolling-out-to-the-nexus-7-now-manual-download-link-available/">Android Police</a>!</p>
tag:raphael.kallensee.name,2012-10-30:/journal/smart-http-transport-fur-git-mit-redmine-2-1/"Smart HTTP transport" für Git mit Redmine 2.12012-10-30T22:12:41Z2012-10-30T22:12:41Z<p>In einem <a href="/journal/installation-von-redmine-und-git-unter-ubuntu/">früheren Artikel</a> habe ich über die Installation von Redmine auf einem Server mit Ubuntu 10.04, Apache und Passenger geschrieben – dort wurde außerdem die Zugriffskontrolle auf <a href="http://git-scm.com/">Git</a>-Repositories eingerichtet.</p>
<p>Die dort verwendete Methode des Zugriffs auf die Git-Repositories via HTTP ist allerdings wenig intelligent: denn hier greifen Clients einfach per WebDAV auf das Repository zu und übertragen Daten relativ uneffizient. Um die Kommunikation via HTTP zu verbessern, gibt es seit einigen Jahren die <a href="http://git-scm.com/2010/03/04/smart-http.html">“Smart HTTP”-Unterstützung</a> in Git, die – um es kurz zu machen – mit Hilfe eines <a href="http://www.kernel.org/pub/software/scm/git/docs/git-http-backend.html">CGI-Backends</a> für eine deutlich effizientere Übertragung sorgt.</p>
<p>Seit der Version 2.1.x <a href="http://www.redmine.org/projects/redmine/repository/revisions/9829/diff/trunk/extra/svn/Redmine.pm">unterstützt auch Redmine.pm</a>, das Authentifizierungs-Modul von Redmine für Apache, die Authentifizierung von Requests über “Smart HTTP”, da diese nicht mehr per WebDAV, sondern nur noch mittels GET und POST funktionieren und Lese- und Schreibzugriffe anderweitig erkannt werden müssen.</p>
<p>Seit Git 1.7 ist das git-http-backend verfügbar – also auch unter Ubuntu 10.04. Es muss nur das Paket <code>git-core</code> installiert sein.</p>
<pre><code data-language="bash">sudo apt-get install git-core
</code></pre>
<p>Ich gehe davon aus, dass Redmine grundsätzlich installiert ist, die Ordnerstruktur für die Repositories angelegt ist, die notwendigen Apache-Module aktiviert sind und das Redmine-Perl-Modul nach /usr/lib/perl5/Apache/Redmine.pm verlinkt ist. Diese Schritte können ansonsten in meinem <a href="/journal/installation-von-redmine-und-git-unter-ubuntu/#git-http-webdav">früheren Artikel</a> nachvollzogen werden.</p>
<p>Unterschiedlich ist eigentlich nur die Konfiguration des Apache-vHosts. Neben dem aus der Standard-Variante bekannten</p>
<pre><code data-language="apache">PerlLoadModule Apache::Redmine
</code></pre>
<p>zum Laden des Authentifizierungs-Moduls müssen für das git-http-backend allerdings noch einige Umgebungsvariablen sowie ein Alias auf das Backend selbst gesetzt werden:</p>
<pre><code data-language="apache">SetEnv GIT_PROJECT_ROOT /var/www/code.example.lit/git/
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
</code></pre>
<p>Achtung: der erste Pfad in der ScriptAlias-Direktive ist das Unterverzeichnis, in dem die Git-Repositories liegen – und der zweite Pfad ist der zum git-http-backend unter Ubuntu. Dieser letzte Pfad weicht ggf. auf anderen Systemen ab.</p>
<p>Die übrige Konfiguration stimmt im Wesentlichen mit der aus dem vorhergehenden Beitrag überein, sehr wichtig ist allerdings noch die Einstellung</p>
<pre><code data-language="apache">RedmineGitSmartHttp yes
</code></pre>
<p>damit die Redmine-Authentifizierung den Smart-HTTP-Modus aktiviert.</p>
<p>Hier ist eine vollständige Beispielkonfiguration:</p>
<pre><code data-language="apache"><virtualhost *:443>
ServerName code.example.lit
ServerAdmin webmaster@localhost
DocumentRoot /var/www/code.example.lit/code
PerlLoadModule Apache::Redmine
SetEnv GIT_PROJECT_ROOT /var/www/code.example.lit/git/
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
<directory /usr/lib/git-core/>
<files "git-http-backend">
Options +ExecCGI
</files>
< /directory>
<location /git>
Order allow,deny
Allow from all
AuthType Basic
AuthName "Git"
Require valid-user
AuthUserFile /dev/null
Options +Indexes -ExecCGI -Includes
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
RedmineDSN "DBI:mysql:database=redmine;host=localhost"
RedmineDbUser "redmine"
RedmineDbPass "pass"
RedmineGitSmartHttp yes
</location>
</virtualhost>
</code></pre>
<p>Damit sollten zukünftige Git-Pulls oder Pushes performanter erfolgen – zumindest wenn der Git-Client nicht älter als Version 1.7 ist!</p>
<p>Weitere Links:</p>
<ul>
<li><a href="http://www.redmine.org/issues/4905">Redmine-Ticket</a> für die “Smart HTTP”-Unterstützung in der Redmine.pm</li>
<li><a href="http://www.redmine.org/projects/redmine/repository/entry/trunk/extra/svn/Redmine.pm#L105">Dokumentation zu Smart HTTP mit Redmine</a> im Kopf der Redmine.pm</li>
<li><a href="http://www.kernel.org/pub/software/scm/git/docs/git-http-backend.html">Manpage zum git-http-backend</a></li>
<li><a href="http://git-scm.com/2010/03/04/smart-http.html">Ausführlicher Artikel zum Git Smart HTTP transport</a></li>
</ul>
tag:raphael.kallensee.name,2012-01-08:/journal/webos-fosdem-schedule-app-for-2012-submitted-to-hp/WebOS FOSDEM schedule app for 2012 submitted to HP2012-01-08T18:00:53Z2012-01-08T18:00:53Z<p><a href="/static/media/journal/2012/01/fosdem2012_0.2.8_en_01.png"><img src="/static/media/journal/2012/01/fosdem2012_0.2.8_en_01-200x300.png" alt="" title="Fosdem for WebOS 0.2.8" width="200" height="300" class="alignleft size-medium wp-image-383" /></a>Today I submitted the 2012 update for the <a href="http://fosdem.org">FOSDEM</a> (Free and Open source Software Developers’ European Meeting) schedule app for WebOS. This year the FOSDEM is taking place on February 4th and 5th in Brussels. You can find it the updated version in the official <a href="http://developer.palm.com/appredirect/?packageid=net.webpresso.fosdem">HP App Catalog</a> sometime next week after it was reviewed by HP – or you can already download the *.ipk package (linked <a href="https://forge.webpresso.net/news/3">here</a>). Like <a href="/journal/fosdem-2010-schedule-application-for-webos/">2010</a> and <a href="/journal/webos-fosdem-schedule-app-for-2011-released/">2011</a>, it’s mainly an application for planning your FOSDEM visit and have a handy offline-working list of the schedule on your WebOS device.</p>
<p>There are several enhancements, as every year. Finally all event details are shown in an own “scene” instead of the drawer view. This makes the list view more snappy and helps for a better structure. As last year, there are room maps for most of the rooms (sadly some are missing because there aren’t available at the FOSDEM website).</p>
<p>The application is released as free and open source software under the <a href="http://www.gnu.org/licenses/gpl.html">GPL v3</a>. You can find the source code, GIT repository, bug tracker, the .ipk package and more at <a href="http://forge.webpresso.net/projects/fosdem-webos">forge.webpresso.net</a>.</p>
<p>As always feel free to share ideas, improvements and bug reports. Just leave a comment or use the <a href="http://forge.webpresso.net/projects/fosdem-webos/issues">bug tracker</a> (registration and manual activation is required to avoid spam – and trust me, there are many spammers…).</p>
tag:raphael.kallensee.name,2011-12-13:/journal/samsung-galaxy-nexus-auf-original-firmware-itl41f-flashen/Samsung Galaxy Nexus auf Original-Firmware ITL41F flashen2011-12-12T23:51:42Z2011-12-12T23:51:42Z<p>Ich bin seit ein paar Tagen stolzer Besitzer eines Samsung Galaxy Nexus mit dem neuen Android 4.0 (ICS). Leider war die Geduld nicht groß genug und ich habe am ersten Tag der Verfügbarkeit in Deutschland die Gelegenheit im Saturn-Markt ergriffen. Das Problem: die erste Charge von Saturn / Media Markt wurde wohl von Samsung eilig vor der Deutschen Markteinführung mit einem eigenen Build (ITL41F.I9250XWKK8) geflasht, in dem das <a href="http://forum.xda-developers.com/showthread.php?t=1353590">Lautstärke-Problem</a> bereits behoben ist. Dieser Build weicht vom offiziellen Google-Build (ITL41F) ab – unter anderem sind die Google-Anwendungen wie Google Maps und Google+ nicht mit dem offiziellen Zertifikat von Google signiert. In der Praxis führt das dazu, dass das Update auf Google Maps 6.0 mit einer Fehlermeldung “Die Paketdatei war nicht richtig signiert.” abbricht. Für das Problem gibt es bereits ein <a href="http://code.google.com/p/android/issues/detail?id=22435">Ticket</a> im Android-Bugtracker. Da neuere Chargen aber alle mittlerweile den “offiziellen” Build haben und Samsung ein <a href="http://www.mobiflip.de/2011/12/samsung-galaxy-nexus-offizielles-update-von-samsung-verfuegbar-fixt-updateprobleme-der-google-apps/">Update-Tool</a> für Windows veröffentlicht hat, mit dem man den offiziellen Build unter Windows flashen kann, ist die Hoffnung gering, dass das Problem mittels OTA-Update behoben wird. Deshalb musste ich mich notgedrungen an die Arbeit machen, mein Galaxy Nexus unter Ubuntu auf das “Stock” image zu flashen, um den kaputten Samsung-Build loszuwerden.</p>
<p><strong>Achtung: bei diesem Vorgang werden sämtliche Daten auf dem Gerät gelöscht! Sie müssen also vorher gesichert werden! Der Vorgang geschieht außerdem auf eigene Gefahr!</strong></p>
<p>Ich hatte bereits das <a href="http://developer.android.com/sdk/installing.html">Android-SDK</a> in meinem Home-Verzeichnis unter <code>~/bin/android-sdk-linux</code> installiert und die Verzeichnisse <code>tools</code> und <code>platform-tools</code> dem PATH hinzugefügt (dies wird u.a. auch in <a href="http://www.android-hilfe.de/root-hacking-modding-fuer-lg-gt540/161667-how-fastboot-unter-linux.html">dieser Anleitung</a> erklärt). Das SDK bringt leider nicht das Tool <a href="http://wiki.cyanogenmod.com/wiki/Fastboot">fastboot</a> mit, das zum Flashen des originalen Android-Images notwendig ist. Die Binaries von Fastboot und ADB (letzteres ist aber auch im SDK enthalten) können über den zuvor genannten Link heruntergeladen werden. Ich habe einfach die fastboot-Binary in mein “platform-tools”-Verzeichnis im SDK-Ordner entpackt und die adb-Binary aus dem aktuellen SDK verwendet.</p>
<p>Nun muss das offizielle Image <a href="http://code.google.com/intl/de-DE/android/nexus/images.html">von Google</a> heruntergeladen und entpackt werden. Wichtig: hier die Version “4.0.1 (ITL41F)” verwenden – denn in dieser ist der Lautstärke-Bug behoben. In diesem Verzeichnis sind Bootloader-, Baseband- und ein Android-Image sowie ein Shell-Skript zum Flashen enthalten.</p>
<p>Die weitere Prozedur kann auch <a href="http://www.pocketpc.ch/galaxy-nexus-root-rom/149030-anleitung-zurueck-werkszustand-itl41f-google-stock-source-image-cwm.html">in diesem Beitrag</a> nachvollzogen werden: Bei den betroffenen Geräten ist der Bootloader bereits entsperrt (was an einem offenen Schloss beim Booten unterhalb des Google-Logos zu sehen ist). Um im Bootloader-Modus zu starten, muss das Gerät ausgeschaltet werden, anschließend Volume-Up- und Down-Regler gedrückt halten und das Gerät bei gedrückten Tasten einschalten. Das Gerät startet mit einem grünen Androiden im Bootloader-Modus. Daraufhin das Gerät per USB an den PC anschließen.</p>
<p>Um festzustellen, ob fastboot das Gerät erkennt, reicht ein <code>fastboot devices</code> auf der Konsole. Wird es nicht erkannt, erfolgt keine Ausgabe – falls doch, folgt eine Ausgabe mit der Seriennummer des Geräts. Bei mir war es notwendig, fastboot mittels <code>sudo</code> aufzurufen – woraufhin fastboot nicht mehr im PATH war – also musste ich ganz ausführlich werden: <code>sudo /home/raphael/bin/android-sdk-linux/platform-tools/fastboot devices</code> – dann wurde das Gerät angezeigt. Jetzt müssen eigentlich nur nacheinander die Befehle aus dem Shell-Skript im entpackten Ordner der Original Google-Images ausgeführt werden. Die Datei “flash-all.sh” kann man einfach in einem Texteditor öffnen und falls nötig die fastboot-Befehle anpassen. Original sieht die Datei so aus:</p>
<pre><code data-language="bash">#!/bin/sh
# Copyright (C) 2011 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
fastboot flash bootloader bootloader-maguro-primekj10.img
fastboot reboot-bootloader
sleep 5
fastboot flash radio radio-maguro-i9250xxkk1.img
fastboot reboot-bootloader
sleep 5
fastboot -w update image-yakju-itl41f.zip
</code></pre>
<p>Ich habe – wie erwähnt – einfach die Befehle einzeln ausgeführt und “fastboot” jeweils ersetzt, also nicht direkt das Shell-Skript verwendet. Ich bin also in den Ordner mit den Images gewechselt, habe einfach folgende Befehle nacheinander auf der Konsole ausgeführt und auf eine positive Bestätigung bzw. den Neustart des Geräts in den Bootloader abgewartet, damit entfallen die <code>sleep</code>-Zeilen aus dem Original-Shellscript.</p>
<pre><code data-language="bash">cd /home/raphael/Downloads/yakju-itl41f # in den Ordner, in den die Images entpackt wurden, wechseln
sudo /home/raphael/bin/android-sdk-linux/platform-tools/fastboot flash bootloader bootloader-maguro-primekj10.img
sudo /home/raphael/bin/android-sdk-linux/platform-tools/fastboot reboot-bootloader
sudo /home/raphael/bin/android-sdk-linux/platform-tools/fastboot flash radio radio-maguro-i9250xxkk1.img
sudo /home/raphael/bin/android-sdk-linux/platform-tools/fastboot reboot-bootloader
sudo /home/raphael/bin/android-sdk-linux/platform-tools/fastboot -w update image-yakju-itl41f.zip
</code></pre>
<p>Das letzte Kommando – das Flashen des Systems – dauerte bei mir etwa zwei Minuten, Bootloader- und Baseband-Flashen dauerte nur wenige Sekungen. Danach startet das Gerät neu – mit dem richtigen Android-Build von Google! Nun beginnt die Arbeit, alles wieder neu einzurichten…</p>
tag:raphael.kallensee.name,2011-09-18:/journal/etherpad-lite-auf-ubuntu-server-apache-upstart/Installation von Etherpad Lite auf Ubuntu 12.04 Server und Apache als Reverse-Proxy + Upstart2011-09-18T19:48:30Z2011-09-18T19:48:30Z<p><a href="/static/media/journal/2011/09/etherpad-lite.png"><img src="/static/media/journal/2011/09/etherpad-lite-300x138.png" alt="Screenshot von Etherpad Lite, einem kollaborativen Texteditor" title="Etherpad Lite" width="300" height="138" class="alignleft size-medium wp-image-358" /></a><a href="http://etherpad.org/">Etherpad Lite</a> ist eine <a href="http://etherpad.org/2011/08/22/major-release-etherpad-lite-v1/">Neuentwicklung</a> des kollaborativen Real-Time-Texteditors Etherpad in <a href="http://nodejs.org/">Node.js</a>. Ausprobiert werden kann Etherpad Lite beispielsweise unter <a href="http://beta.etherpad.org/">beta.etherpad.org</a>.</p>
<p>Die ursprüngliche Etherpad-Software ist enorm ressourcenhungrig und die Codebase sehr umfangreich – insbesondere die hohen Anforderungen an den Arbeitsspeicher (im laufenden Betrieb wohl ca. 1 GB!) hielten mich von der Installation auf meinem Server ab. Etherpad Lite hingegen begnügt sich nach eigenen Angaben im laufenden Betrieb mit <a href="https://github.com/ether/etherpad-lite#readme">rund 30 MB Arbeitsspeicher</a>.</p>
<p>Diese Anleitung beschreibt die Installation von Node.js, NPM und Etherpad Lite auf Ubuntu <del datetime="2013-06-07T23:54:14+02:00">10.04</del> 12.04 Server. Da in den meisten Fällen auf Port 80 eines bestehenden Servers bereits ein Webserver (in meinem Fall Apache) läuft, wird Etherpad Lite hinter Apache als Reverse-Proxy (via mod_proxy) installiert. Sicherlich nicht die beste Lösung, eine “<a href="http://nodejs.org/jsconf.pdf">non-blocking</a>” Node.js-Applikation hinter einem “blocking” Apache-Server zu installieren – <a href="http://de.wikipedia.org/wiki/Nginx">Nginx</a> wäre hier sicherlich eine bessere Wahl. Aber vorerst soll Apache als Reverse-Proxy genügen. Des weiteren richten wir eine Upstart-Konfiguration ein, die Etherpad Lite nach jedem Reboot automatisch startet.</p>
<p><ins datetime="2013-05-20T14:14:14+02:00"><strong>Update vom 07.06.2013:</strong> Anleitung für Ubuntu 12.04 und aktuelle node.js- sowie Etherpad Lite-Version angepasst.</ins></p>
<h3>Installation von Node.js</h3>
<p>Zunächst installieren wir Node.js auf dem Server. Die Version in den Ubuntu-Paketquellen ist deutlich zu alt, deshalb müssen wir selbst kompilieren. Da wir Node.js, den Node-Paketmanager NPM und die Applikation aus Sicherheitsgründen unter einem eigenen User installieren möchten, legen wir diesen zunächst an:</p>
<pre><code data-language="bash">groupadd nodejs
useradd -g nodejs -s /bin/bash -d /var/lib/nodejs nodejs
mkdir /var/lib/nodejs
chown nodejs:nodejs /var/lib/nodejs
</code></pre>
<p>Nun wurde der User nodejs angelegt, sein Home-Verzeichnis ist /var/lib/nodejs. Nun bereiten wir den User für die Installation von Node.js und NPM vor – wir wechseln in den User nodejs:</p>
<pre><code data-language="bash">su nodejs
cd ~
</code></pre>
<p>Der folgende Inhalt muss in die Datei /var/lib/nodejs/.npmrc:</p>
<pre><code data-language="bash">root = /var/lib/nodejs/.node_modules
binroot = /var/lib/nodejs/local/bin
manroot = /var/lib/nodejs/local/share/man
</code></pre>
<p>Die entsprechenden Ordner müssen nun noch angelegt werden:</p>
<pre><code data-language="bash">mkdir ~/local
mkdir ~/local/bin
mkdir ~/local/share
mkdir ~/local/share/man
</code></pre>
<p>Nun fügen wir den Ordner ~/local/bin noch zum PATH hinzu – die folgende Zeile muss zum einen in die Datei /var/lib/nodejs/.bashrc, zum anderen einmal in der Shell eingegeben werden:</p>
<pre><code data-language="bash">export PATH=$HOME/local/bin:$PATH
</code></pre>
<p>Jetzt installieren wir die notwendigen Abhängigkeiten über apt / aptitude:</p>
<pre><code data-language="bash">sudo gzip git-core curl python libssl-dev pkg-config build-essential
</code></pre>
<p>Nun kann Node.js heruntergeladen und kompiliert werden. Dazu “klonen” wir das Git-Repository und checken die letzte stabile Version aus – was spätere Updates erleichtert.</p>
<pre><code data-language="bash">mkdir ~/local/src
cd ~/local/src
git clone git://github.com/joyent/node.git
cd node
git checkout v0.10.9
./configure --prefix=$HOME/local/
make
make install
</code></pre>
<h3>Installation von NPM</h3>
<p>NPM ist mittlerweile in node.js enthalten und muss nicht mehr separat installiert werden.</p>
<p>Wir legen noch einen Symlink an, damit NPM später das Verzeichnis für die Node-Module findet, das wir weiter oben bereits konfiguriert haben:</p>
<pre><code data-language="bash">ln -s ~/local/lib/node_modules ~/.node_modules
</code></pre>
<h3>Installation von Etherpad Lite</h3>
<p>Nun sind endlich die Voraussetzungen gegeben, um Etherpad Lite zu installieren. Dies tun wir ebenfalls aus den GIT-Quellen. Danach rufen wir ein Shell-Script auf, um die Abhängigkeiten zu installieren.</p>
<pre><code data-language="bash">mkdir ~/node-apps
cd ~/node-apps
git clone git://github.com/ether/etherpad-lite.git
cd etherpad-lite
./bin/installDeps.sh
</code></pre>
<p>Jetzt kann die Konfiguration angepasst werden, die sich in der Datei <code>/var/lib/nodejs/node-apps/etherpad-lite/settings.json</code> befindet. Da ich das Etherpad mit MySQL als Datenbank betreiben möchte, kommentiere ich die vorhandene SQLite-Konfiguration aus und füge den MySQL-Benutzer und den Datenbank-Namen hinzu, die ich beide vorher angelegt habe. Den “loglevel” setze ich außerdem auf “WARN”, um nicht zu viele unnötige Log-Meldungen zu schreiben.</p>
<p>Jetzt legen wir gleich eine Upstart-Konfiguration an, um sicherzustellen, dass das Etherpad nach jedem System-Neustart automatisch gestartet wird. Für eine regelmäßige Überwachung und ggf. Neustart des Etherpads im Fehlerfalle bietet sich <a href="http://mmonit.com/monit/">Monit</a> an – was aber nicht Teil dieses Artikels sein soll.</p>
<p>Wir legen nun die Datei <code>/etc/init/etherpad-lite.conf</code> mit folgendem Inhalt an (auf Grundlage <a href="https://github.com/ether/etherpad-lite/wiki/How-to-deploy-Etherpad-Lite-as-a-service">dieser Quelle</a>):</p>
<pre><code data-language="bash">description "etherpad-lite"
start on started networking
stop on runlevel [!2345]
env NODEBIN=/var/lib/nodejs/local/bin/node
env EPHOME=/var/lib/nodejs/node-apps/etherpad-lite
env EPLOGS=/var/log/etherpad-lite
env EPUSER=nodejs
pre-start script
chdir $EPHOME
mkdir $EPLOGS ||true
chown $EPUSER:admin $EPLOGS ||true
chmod 0755 $EPLOGS ||true
chown -R $EPUSER:admin $EPHOME/var ||true
# exec su -s /bin/bash -c 'exec "$0" "$@"' $EPUSER $EPHOME/bin/installDeps.sh >> $EPLOGS/error.log || { stop; exit 1; }
end script
script
cd $EPHOME
exec su -s /bin/bash -c 'exec "$0" "$@"' $EPUSER $NODEBIN node_modules/ep_etherpad-lite/node/server.js \
>> $EPLOGS/access.log \
2>> $EPLOGS/error.log
end script
</code></pre>
<p><em>(Diese Upstart-Konfiguration ist noch nicht optimal – spontan gelang es mir nicht, das Shell-Script <code>installDeps.sh</code> im pre-start erfolgreich auszuführen. Deshalb muss man daran denken, dieses Script nach einem Etherpad-Update manuell auszuführen.)</em></p>
<p>Jetzt kann Etherpad ganz einfach mittels</p>
<pre><code data-language="bash">start etherpad-lite
</code></pre>
<p>gestartet werden.</p>
<h3>Einrichtung des Apache Reverse-Proxys</h3>
<p>Nun richten wir Apache ein, damit Etherpad auf Port 80 erreichbar ist. Dafür verwenden wir z.B. die Subdomain etherpad.example.lit – und folgende virtuelle Host-Konfiguration (beispielsweise in der Datei /etc/apache2/sites-available/etherpad.example.lit):</p>
<pre><code data-language="bash"><virtualhost *:80>
ServerName etherpad.example.lit
ServerAdmin webmaster@localhost
<ifmodule mod_proxy.c>
ProxyVia On
ProxyRequests Off
ProxyPass / http://localhost:9001/
ProxyPassReverse / http://localhost:9001/
ProxyPreserveHost on
<proxy *>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</proxy>
</ifmodule>
ErrorLog /var/log/etherpad-lite/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/etherpad-lite/apache2/access.log combined
ServerSignature Off
</virtualhost>
</code></pre>
<p>Wichtig: das Verzeichnis <code>/var/log/etherpad-lite/apache2/</code> für die Apache-Logs muss angelegt werden!</p>
<p>Daraufhin kann der oben angelegte virtuelle Apache-Host aktiviert werden. Außerdem müssen die Apache-Module mod<em>proxy und mod</em>proxy_http aktiviert sein, danach kann die Apache-Konfiguration neu geladen werden:</p>
<pre><code data-language="bash">a2ensite etherpad.example.lit
a2enmod proxy proxy_http
/etc/init.d/apache2 reload
</code></pre>
<p>Nun sollte das Etherpad unter http://etherpad.example.lit erreichbar sein!</p>
<h3>Konfiguration von Logrotate</h3>
<p>Wir haben nun einige Log-Dateien unterhalb von <code>/var/log/etherpad-lite/</code>, die schnell sehr groß werden können. Deshalb konfigurieren wir Logrotate so, dass diese Dateien wöchentlich rotiert und gepackt und für acht Wochen vorgehalten werden. Dazu fügen wir einfach folgende Zeilen zur <code>/etc/logrotate.conf</code> hinzu – oder legen eine <code>/etc/logrotate.d/etherpadlite</code> mit dem folgenden Inhalt an:</p>
<pre><code data-language="bash"># rotate etherpad lite logs
/var/log/etherpad-lite/*.log {
weekly
missingok
rotate 8
compress
notifempty
}
/var/log/etherpad-lite/apache2/*.log {
weekly
missingok
rotate 8
compress
notifempty
}
</code></pre>
<h3>Installation von Abiword für Import/Export (optional)</h3>
<p>Für den erweiterten Import/Export muss die Textverarbeitungs-Software <a href="http://www.abisource.com/">Abiword</a> installiert werden – deren Binaries benutzt Etherpad zum Lesen und Schreiben von Dokumenten. In Ubuntu 10.04 ist Abiword in den Paketquellen vorhanden, deshalb reicht ein:</p>
<pre><code data-language="bash">apt-get install abiword
</code></pre>
<p>Daraufhin muss in der <code>/var/lib/nodejs/node-apps/etherpad-lite/settings.json</code> der Pfad zum Abiword-Binary angepasst werden:</p>
<pre><code data-language="javascript">/* This is the path to the Abiword executable. Setting it to null, disables abiword.
Abiword is needed to enable the import/export of pads*/
"abiword" : "/usr/bin/abiword",
</code></pre>
<p>Nach einem Neustart mittels</p>
<pre><code data-language="bash">stop etherpad-lite
start etherpad-lite
</code></pre>
<p>stehen die erweiterten Import-/Export-Funktionen zur Verfügung – dann kann ein Pad beispielsweise auch als PDF exportiert werden.</p>
<h3>Abschluss</h3>
<p>Etherpad Lite ist meiner Meinung nach ein sehr nützliches Tool, um gemeinsam Dokumente zu bearbeiten, Protokolle und To-Do-Listen zu erstellen usw. – was durch die Export-Funktion in viele Formate sehr gut ergänzt wird. Es existieren auch bereits viele Bibliotheken und Plugins, welche die HTTP-API von Etherpad nutzen, um Etherpads in eigenen Applikationen bequem einzubinden – Libraries für <a href="https://github.com/jhollinger/ruby-etherpad-lite">Ruby</a>, <a href="https://github.com/tomnomnom/etherpad-lite-client">PHP</a>, ein <a href="https://github.com/johnyma22/etherpad-lite-jquery-plugin">jQuery-Plugin</a>, ein <a href="http://drupal.org/sandbox/webflo/1255474">Drupal-Modul</a> (im Entwicklungsstadium) und viele mehr.</p>
<p>Ein Hinweis zum Schluss: diese Anleitung stellt sicher kein Optimum dar – jedoch war es mir wichtig, Node.JS sowie NPM nicht als <code>root</code>-User zu installieren. Deshalb weicht diese Anleitung zum Teil von den meisten im Netz zu findenden Anleitungen ab. Verbesserungsvorschläge nehme ich gern per Kommentar oder E-Mail entgegen!</p>
<p>Quellen und weiterführende Links:</p>
<ul>
<li><a href="http://mrtopf.de/blog/de/ein-besseres-etherpad-dank-etherpad-lite/">Ein besseres Etherpad dank Etherpad Lite!</a></li>
<li><a href="https://github.com/joyent/node/wiki/Installation">Building and Installing Node.js</a></li>
<li><a href="https://github.com/ether/etherpad-lite#readme">Etherpad Lite Readme</a></li>
<li><a href="http://tnovelli.net/blog/blog.2011-08-27.node-npm-user-install.html">Node.js HOWTO: Install NPM as user (not root)</a></li>
<li><a href="http://mclear.co.uk/2011/08/01/install-etherpad-lite-on-ubuntu/">Install Etherpad Lite on Ubuntu and Debian</a></li>
<li><a href="http://stackoverflow.com/questions/6514621/npm-install-locally">npm install locally</a></li>
<li><a href="https://github.com/ether/etherpad-lite/wiki/How-to-put-Etherpad-Lite-behind-a-reverse-Proxy">How to put Etherpad Lite behind a reverse Proxy</a></li>
<li><a href="http://howtonode.org/deploying-node-upstart-monit">Deploying Node.js With Upstart and Monit</a></li>
<li><a href="http://kevin.vanzonneveld.net/techblog/article/run_nodejs_as_a_service_on_ubuntu_karmic/">Run Node.js as a Service on Ubuntu</a></li>
<li><a href="https://github.com/ether/etherpad-lite/wiki/How-to-deploy-Etherpad-Lite-as-a-service">How to deploy Etherpad Lite as a service</a></li>
</ul>
tag:raphael.kallensee.name,2011-07-16:/journal/geotag-logger-fotos-geotaggen-mit-webos/"Geotag-Logger": Fotos geotaggen mit HP WebOS2011-07-16T18:11:52Z2011-07-16T18:11:52Z<p><a href="http://de.wikipedia.org/wiki/Geo-Imaging">Geo-Tagging</a> bedeutet, Positionsdaten des Aufnahmeorts eines Digitalfotos als Metadaten in der Bilddatei mitzuspeichern. Das klingt zunächst sehr technisch, ermöglicht aber Foto-Anwendungen, interessante Funktionen bereitzustellen: beispielsweise die Anzeige der eigenen Fotos auf einer Weltkarte. Die Foto-Community Flickr zeigt, sofern die Funktion in den Einstellungen aktiviert ist, neben jedem Foto eine kleine Karte mit dem Aufnahmeort an. So weiß man auch später, an welchem Ort man ein Foto aufgenommen hat.</p>
<p>Moderne Smartphones versehen Fotos, die mit der integrierten Kamera aufgenommen wurden, auf Wunsch automatisch mit “Geo-Tags”. Will man jedoch beispielsweise Fotos, die man mit einer Spiegelreflexkamera (DSLR) aufgenommen hat, geotaggen, wird es etwas komplizierter. Die wenigsten Digitalkameras haben derzeit einen integrierten GPS-Sensor, über den sie die aktuelle Position abfragen könnten. Für diesen Einsatzzweck gibt es kleine Geräte – “Geo-Logger”, die man unterwegs zusätzlich zur Kamera mitnimmt. Diese Geräte zeichnen die Position auf und erlauben es später, entweder über eine externe Software am PC oder direkt durch das Einstecken der SDHC-Karte die Positionsdaten in die Fotos zu schreiben. Dabei wird die Aufnahme-Uhrzeit der Bilder mit der vom Geo-Logger aufgezeichneten Position zu dieser Uhrzeit verglichen.</p>
<p>Diese externen Geo-Logger haben aber zwei Nachteile: zum einen hat man ein zusätzliches Gerät, das man mit sich herumtragen muss und bei dem man auch ständig dafür sorgen muss, dass der Akku geladen ist. Zum anderen muss man Geld für ein Gerät ausgeben, obwohl man möglicherweise bereits Gadgets hat, die diese Aufgabe übernehmen könnten. Jedes moderne Smartphone besitzt einen GPS-Sensor und ist in der Lage, die eigene Position regelmäßig zu speichern.</p>
<p><a href="/static/media/journal/2011/07/geotaglogger_0.1_de.png"><img src="/static/media/journal/2011/07/geotaglogger_0.1_de-200x300.png" alt="" title="Geotag-Logger 0.1" width="200" height="300" class="alignleft size-medium wp-image-339" /></a>Hier kommt für Benutzer des Smartphone-Betriebssystems HP/Palm WebOS die von mir geschriebene Anwendung “<a href="http://developer.palm.com/appredirect/?packageid=net.webpresso.geotaglogger">Geotag-Logger</a>” ins Spiel, die im offiziellen HP App Catalog zu finden ist. Es existierten bereits einige Anwendungen, mit denen man die eigene Position tracken konnte – jedoch keine Anwendung, die wirklich gut für diesen Einsatzzweck geeignet war. Denn wenn man zu Fuß unterwegs ist und Fotos macht, braucht man nicht im Sekundentakt die eigene Position zu erfassen – größere Intervalle sorgen für einen deutlich geringeren Akku-Verbrauch und sollten dennoch ausreichend sein.</p>
<p>Mit “Geotag-Logger” für WebOS kann man entweder manuell das Speichern der aktuellen Position auslösen oder über einen automatischen Modus alle fünf Minuten die Position speichern lassen. Die erzeugten Daten können daraufhin im GPX-Format auf die USB-Partition gespeichert und von dort aus auf den PC übertragen werden. Am PC können dann mit Hilfe der GPX-Datei Positionsdaten in die Fotos geschrieben werden. Dazu können Open-Source-Anwendungen wie <a href="http://geotag.sourceforge.net/">Geotag</a> (Linux/Windows), <a href="http://code.google.com/p/gpicsync/">GPicSync</a> (Linux/Windows) oder <a href="http://freefoote.dview.net/linux_gpscorr.html">GPSCorrelate</a> (Linux) verwendet werden. Zum Taggen der Fotos existieren drei Artikel unter <a href="http://www.spiegel.de/netzwelt/tech/0,1518,531694,00.html">spiegel.de</a>, <a href="http://www.awokenmind.de/geotagging-windows-linux/">awokenmind.de</a> und <a href="http://www.schrenk.cc/2009/01/19/geo-tagging-von-fotos-meine-praxisanleitung-part-ii/">schrenk.cc</a>, die einen Überblick über das Vorgehen geben.</p>
<p>Wenn man sich unterwegs schon einmal vergewissern möchte, ob die Anwendung den eigenen Weg korrekt aufgezeichnet hat, kann man bereits zwischendurch schon einmal die Daten als GPX exportieren und die GPX-Datei anschließend mit dem kostenlos im App Catalog erhältlichen <a href="http://developer.palm.com/appredirect/?packageid=com.rustyapps.gpxmapper">GPX Mapper</a> öffnen. Die Anwendung zeichnet die gespeicherten Standortdaten auf eine Google-Maps-Karte.</p>
<p>Geotag-Logger benötigt mindestens WebOS 2.1, da die Anwendung zum Speichern der GPX-Datei auf der USB-Partition des Geräts einen Node.JS-Service verwendet – dieses Feature gibt es erst ab WebOS 2.x.</p>
<p>“Geotag-Logger” ist <a href="http://de.wikipedia.org/wiki/Freie_Software">Freie Software</a>, lizensiert unter der <a href="http://www.gnu.org/licenses/gpl.html">GPL v3</a>. Das bedeutet, die Anwendung ist nicht nur kostenlos, sondern Sie dürfen sie außerdem an andere weitergeben, sich den Quellcode ansehen (für den Fall, dass Sie Softwareentwickler sind), den Quellcode Ihren Bedürfnissen anpassen und Ihre Anpassungen mit anderen teilen. Den Quellcode der Anwendung finden Sie im GIT-Repository der <a href="http://forge.webpresso.net/projects/geotag-logger">Projekt-Website</a> (englisch).</p>
tag:raphael.kallensee.name,2011-03-22:/journal/installation-von-preware-auf-dem-palm-pre-2-mit-webos-2-1-unter-ubuntu/Installation von Preware auf dem HP/Palm Pre 2 mit WebOS 2.1 unter Ubuntu2011-03-22T20:46:01Z2011-03-22T20:46:01Z<p><a href="/static/media/journal/2011/03/preware_2011-22-03_214137.png"><img src="/static/media/journal/2011/03/preware_2011-22-03_214137-200x300.png" alt="" title="Preware 1.5.7" width="200" height="300" class="alignleft size-medium wp-image-327" /></a>Es existiert von mir bereits eine <a href="/journal/palm-pre-installation-von-preware/">ausführliche Anleitung zur Installation von Preware</a> – einer Anwendung, mit der man weitere “Homebrew-Apps” einfach nachinstallieren kann. Die bisherige Anleitung ist allerdings für den “alten” Pre und unter WebOS bis Version 1.4.5.</p>
<p>Da ich nun stolzer Besitzer eines HP/Palm Pre 2 bin, auf dem mittlerweile WebOS 2.1 läuft, habe ich mich entschlossen, eine kurze Anleitung für Besitzer des Pre 2 bzw. WebOS 2.1 zu schreiben. Preware wird in diesem Artikel – im Gegensatz zur <a href="/journal/palm-pre-installation-von-preware/">alten Anleitung</a> – nicht über das Programm “WebOS Quick Install” installiert, sondern über die Kommandozeile. “WebOS Quick Install” ist offensichtlich noch nicht mit WebOS 2.1 kompatibel.</p>
<p>Auch für diese Anleitung gilt: <strong>Die Installation erfolgt auf eigene Gefahr!</strong> Dieser Artikel ist allerdings an die vielseits erprobte, englischsprachige Anleitung von <a href="http://www.webos-internals.org/wiki/Application:Preware#Installing_Preware_on_webOS_2.0">webos-internals.org</a> angelehnt.</p>
<h3>Installationsschritte:</h3>
<p><li>Laut Anleitung im <a href="http://developer.palm.com/index.php?option=com_content&view=article&layout=page&id=1585&Itemid=55">Palm Developer Center</a> muss das aktuelle WebOS-SDK installiert werden. Dazu gehört insbesondere der Novacom-Treiber (<a href="https://cdn.downloads.palm.com/sdkdownloads/2.1.0.519/sdkBinaries/palm-novacom_1.0.64_i386.deb">palm-novacom<em>1.0.64</em>i386.deb</a> für 32-bit-Systeme, <a href="https://cdn.downloads.palm.com/sdkdownloads/2.1.0.519/sdkBinaries/palm-novacom_1.0.64_amd64.deb">palm-novacom<em>1.0.64</em>amd64.deb</a> für 64-bit-Systeme) und das <a href="https://cdn.downloads.palm.com/sdkdownloads/2.1.0.519/sdkBinaries/palm-sdk_2.1.0-svn409992-pho519_i386.deb">SDK-Paket</a>. <em>(Für aktuelle Pakete bitte immer über den Palm Developer Center herunterladen!)</em> Die Installation kann z.B. über die Kommandozeile erfolgen (am Beispiel für 64-bit-Systeme):</p>
<pre><code data-language="bash">sudo dpkg -i --force-architecture palm-sdk_2.1.0-svn409992-pho519_i386.deb
sudo dpkg -i --force-architecture palm-novacom_1.0.64_amd64.deb
</code></pre>
<p></li></p>
<ul>
<li><p>Über <a href="http://get.preware.org/">get.preware.org</a> das aktuelle Preware-IPK-Paket herunterladen (mindestens die Version 1.5.0, z.B. entweder <a href="http://get.preware.org/org.webosinternals.preware_1.5.0_arm.ipk">org.webosinternals.preware<em>1.5.0</em>arm.ipk</a> für den Pre und <a href="http://get.preware.org/org.webosinternals.preware_1.5.0_i686.ipk">org.webosinternals.preware<em>1.5.0</em>i686.ipk</a> für den Emulator).</p></li>
<li><p>Nun muss der Developer-Modus im Pre 2 aktiviert werden. In WebOS 2.1 funktioniert das nicht mehr mit dem aus WebOS 1.x bekannten <a href="http://en.wikipedia.org/wiki/Konami_Code">Konami-Code</a>, sondern über eine andere Tastenkombination. Auf dem Startbildschirm muss folgendes eingegeben werden: <code>webos20090606</code> – dann erscheint wie gewohnt das blaue Icon, mit dem der Developer-Modus eingeschaltet werden kann. Eine angenehme Neuerung: das Gerät muss nicht, wie in älteren WebOS-Versionen, neugestartet werden!</p></li>
<li><p>Das Gerät kann nun via USB an den PC angeschlossen werden – nicht im Massenspeicher-Modus, sondern “Nur aufladen” auswählen.</p></li>
</ul>
<p><li>Nun kann das Preware-IPK-Paket installiert werden. Mittels Konsole wechselt man in das Verzeichnis, in dem man das heruntergeladene Preware-Paket gespeichert hat, und benutzt das Kommando “palm-install”, um das IPK auf dem Gerät zu installieren:</p>
<pre><code data-language="bash">cd ~/Desktop
palm-install org.webosinternals.preware_1.5.0_arm.ipk
</code></pre>
<p></li></p>
<ul>
<li>Preware ist nun installiert und kann benutzt werden. Am Besten gleich Preware öffnen und ggf. auf die aktuelle Version aktualisieren. Außerdem kann der Developer-Modus wieder deaktiviert werden.</li>
</ul>
<p>Nun kann auch auf dem Pre 2 unter WebOS 2.1 die Vielzahl an “Homebrew-Apps” installiert werden!</p>
tag:raphael.kallensee.name,2011-01-27:/journal/webos-fosdem-schedule-app-for-2011-released/WebOS FOSDEM schedule app for 2011 released2011-01-26T23:22:55Z2011-01-26T23:22:55Z<p><a href="/static/media/journal/2011/01/fosdem2011_0.2.2_en_01.png"><img src="/static/media/journal/2011/01/fosdem2011_0.2.2_en_01-200x300.png" alt="" title="FOSDEM 2011 WebOS schedule application" width="200" height="300" class="alignleft size-medium wp-image-315" /></a>I submitted it to Palm yesterday, today it was reviewed and published: the <a href="http://fosdem.org">FOSDEM</a> (Free and Open source Software Developers’ European Meeting, taking place on February 5th and 6th in Brussels) schedule app for WebOS. You can <a href="http://developer.palm.com/appredirect/?packageid=net.webpresso.fosdem">install it on your WebOS device</a> easily by following the link on your WebOS device or searching it in the official Palm App catalog. Like <a href="/journal/fosdem-2010-schedule-application-for-webos/">last year</a>, it’s mainly an application for planning your FOSDEM visit and have a handy offline-working list of the schedule on your WebOS device.</p>
<p>The functionality has grown over the last version. You can now mark items as favorite and switch to the list of your favorites. This should make planning easier. You can also switch to a view with all events in the future – making it easy to see what talks are next. The search functionality is now improved. Also new is a “Feeds” function where you can have a look at FOSDEM website news as well as various identi.ca and Twitter channels. There are also two new maps included. The application is localized for English and German, but the schedule and feed items of course are all English.</p>
<p>Under the hood many parts of the code was rewritten and/or improved. There’s still room for improvement, but the performance should be now better and many bugs should be fixed.</p>
<p>The application is released as free and open source software under the <a href="http://www.gnu.org/licenses/gpl.html">GPL v3</a>. You can find the source code, GIT repository, bug tracker, the .ipk package and more at <a href="http://forge.webpresso.net/projects/fosdem-webos">forge.webpresso.net</a>.</p>
<p>Always feel free to share ideas, improvements, bug reports and your opinion. Just leave a comment or use the <a href="http://forge.webpresso.net/projects/fosdem-webos/issues">bug tracker</a> (sorry, but registration is required to avoid spam).</p>
tag:raphael.kallensee.name,2010-09-03:/journal/navit-eine-freie-navigationslosung-fur-den-palm-pre-und-webos/Navit: eine freie Navigationslösung für den Palm Pre und WebOS2010-09-02T22:28:06Z2010-09-02T22:28:06Z<p><a href="/static/media/journal/2010/09/navit-webos_2010-03-09_002137.png"><img src="/static/media/journal/2010/09/navit-webos_2010-03-09_002137-200x300.png" alt="" title="Navit unter WebOS 1.4.5" width="200" height="300" class="alignleft size-medium wp-image-305" /></a>Mittlerweile ist die freie Navigationssoftware <a href="http://www.navit-project.org/">Navit</a> via Preware für WebOS verfügbar. Zuvor war die Anwendung einige Wochen nur über den separaten Testing-Feed erreichbar. Navit ist für verschiedene Plattformen verfügbar und wurde nun auch auf WebOS portiert. Die Software kann Kartenmaterial von <a href="http://www.openstreetmap.org">OpenStreetMap</a> sowie spezielle proprietäre Kartendaten verarbeiten.</p>
<p>Da es bisher – jedenfalls für europäische WebOS-Nutzer – keine Navigationslösung gibt, ist Navit besonders interessant. Ich muss allerdings gleich vorab warnen: Navit funktioniert zwar mittlerweile, ist jedoch – abhängig von den geladenen Kartendaten – recht langsam und noch nicht wirklich benutzerfreundlich.</p>
<p>Die Installation ist recht einfach – jedoch ist zwingend WebOS 1.4.5 erforderlich! Ist diese Voraussetzung erfüllt, einfach folgende Schritte ausführen:</p>
<ul>
<li>Falls noch nicht geschehen, muss <a href="/journal/palm-pre-installation-von-preware/">Preware installiert werden</a>.</li>
<li>In Preware unter “Komplette Liste” bzw. “Verfügbare Pakete” nach “Navit” suchen und die Anwendung installieren. Für die Anwendung müssen zwei Abhängigkeiten mit installiert werden: “speechd”, eine Sprachsynthese-Bibliothek, sowie “locale” für die Internationalisierung.</li>
<li>Nun muss Navit gestartet werden. Startet die Anwendung nicht, auch nicht nach einem Geräteneustart, liegt das recht wahrscheinlich an einem Fehler von Palm im WebOS-Update auf 1.4.5 (<a href="http://www.nexave.de/forum/39654-fehler-im-ota-1-4-5-update.html">hier näher beschrieben</a>). Die einfachste Lösung des Problems: es muss der “<a href="http://forums.precentral.net/webos-internals/255149-emergency-fstab-fixer-required-fix-webos-1-4-5-ota-update.html">Emergency Fstab Fixer</a>” via Preware installiert werden. Nach der Installation muss der Neustart des Telefons bestätigt werden – danach sollte Navit zumindest starten.</li>
<li>Nach dem Start von Navit sind noch keine Kartendaten vorhanden, da diese nicht mitgeliefert werden. Am Einfachsten installiert man sich das freie Kartenmaterial von OpenStreetMap. Diese können mit verschiedenen Tools detailliert für bestimmte Areale heruntergeladen werden – für viele Länder gibt es vorgefertigte <a href="http://wiki.navit-project.org/index.php/OpenStreetMaps">Links beim Navit-Projekt</a>. Die <a href="http://maps.navit-project.org/api/map/?bbox=5.185546875,46.845703125,15.46875,55.634765625">Karten für Deutschland</a> werden mit ~490MiB angegeben – bei mir waren es im Endeffekt rund 670MB, die man im Pre erst einmal freischaufeln muss. Zum Download erhält man eine *.bin-Datei, die Navit lesen kann. Nach dem Klick auf den Link kann es einen Moment dauern, bis der Download startet. Recht einfach ist jedoch auch der Download eines bestimmten Areals über den <a href="http://maps.navit-project.org/download/">Planet Extractor</a>, durch die Auswahl eines kleineren Bereichs kann man Platz auf dem Gerät sparen.</li>
<li>Nun muss der Pre per USB-Modus an den PC angeschlossen werden. Die heruntergeladene *.bin-Datei muss nun in den Ordner appdata/org.webosinternals.navit/maps kopiert werden, der beim ersten Start von Navit erzeugt wurde (und leer sein müsste).</li>
<li>Nach dem Entfernen des Pre vom PC kann Navit gestartet werden und sollte die Karten anzeigen. Die Performance könnte – wie bereits erwähnt – besser sein, jedoch wird berichtet, dass bei kleineren Kartenausschnitten und/oder weniger enthaltenen POIs im Kartenmaterial die Performance deutlich steigt. Hier kann man sicherlich noch etwas Performance einsparen.</li>
</ul>
<p>Eine englische Installationsanleitung sowie ein paar kurze Bedienungshinweise gibt es bei <a href="http://www.webos-internals.org/wiki/Application:Navit">webos-internals.org</a>, die auch die Anwendung auf WebOS portiert haben sowie für die Entwicklung von Preware verantwortlich sind.</p>
tag:raphael.kallensee.name,2010-08-28:/journal/prodromus-ein-minimaler-javascript-xmpp-client/PRODROMUS, ein minimaler JavaScript-XMPP-Client2010-08-28T01:01:12Z2010-08-28T01:01:12Z<p><a href="/static/media/journal/2010/08/prodromus_de.png"><img src="/static/media/journal/2010/08/prodromus_de-280x300.png" alt="PRODROMUS Mini-XMPP-Client" title="prodromus_de" width="280" height="300" class="alignleft size-medium wp-image-298" /></a>Auf meiner <a href="/kontakt">Kontakt</a>-Seite befindet sich schon eine Weile mein XMPP-MiniChat-Client “PRODROMUS”. Nun habe ich ihn endlich unter der <a href="http://de.wikipedia.org/wiki/GNU_Affero_General_Public_License">AGPL</a> <a href="http://forge.webpresso.net/projects/prodromus">veröffentlicht</a>. “Prodromus” steht lateinisch für “Eilbote”.</p>
<p>PRODROMUS ist ein simpler <a href="http://de.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol">XMPP</a>-Client, der vollständig in JavaScript geschrieben ist. Er benutzt die großartige Bibliothek <a href="http://code.stanziq.com/strophe/">Strophe.js</a> von <a href="http://metajack.im/">Jack Moffit</a>, um sich zu einem XMPP-Server zu verbinden und ermöglicht es somit dem Besucher, mit einer vorkonfigurierten Person via XMPP zu kommunizieren. PRODROMUS ist als Ergänzung zu einem Kontaktformular gedacht – er lässt sich in bestehende Websites einbinden und erweitert die Kontaktmöglichkeiten um Echtzeit-Kommunikation.</p>
<p>Eine kurze Installationsanleitung sowie die erforderlichen Voraussetzungen gibt es <a href="http://forge.webpresso.net/projects/prodromus/wiki">im Wiki</a>.</p>
tag:raphael.kallensee.name,2010-08-20:/journal/location-based-services/Location-based services2010-08-20T11:53:14Z2010-08-20T11:53:14Z<p><a href="http://www.openclipart.org/detail/50329"><img src="/static/media/journal/2010/08/openclipart-compass.png" alt="" title="openclipart-compass" width="130" height="130" class="alignleft size-full wp-image-279" /></a>Location-based services (LBS) sind (derzeit meist mobile) Dienste, die den Standort des Users verwenden und Informationen mit diesen Standort-Informationen anreichern bzw. Informationen über und um diesen Standort anzeigen. Dies soll ein kleiner, unvollständiger Überblick sein.</p>
<p>Diese Anwendungen sind an sich nichts neues, dank geeigneteren und benutzerfreundlicheren Ortungs-Methoden erfahren sie aber erst in den letzten Monaten einen starken Zuwachs. Moderne Smartphones haben mittlerweile Techniken an Bord, um innerhalb weniger Sekunden die Position des Gerätes ziemlich genau zu bestimmen (<a href="http://de.wikipedia.org/wiki/Global_Positioning_System">GPS</a>, <a href="http://de.wikipedia.org/wiki/AGPS">A-GPS</a>, <a href="http://de.wikipedia.org/wiki/GSM-Ortung">GSM-</a> und <a href="http://de.wikipedia.org/wiki/WLAN-basierte_Ortung">WLAN-Ortung</a>).
Auch in Web-Browsern hält das Thema langsam Einzug – Firefox ab Version 3.5, Chrome ab Version 5, Opera ab Version 10.6 sowie der iPhone-Safari-Browser <a href="http://mobile.tutsplus.com/tutorials/html5/html5-geolocation/">unterstützen die Lokalisierung</a>. Dafür zuständig ist eine vom W3C herausgegebene <a href="http://dev.w3.org/geo/api/spec-source.html">Spezifikation</a> – die Browser-Ortung ist allerdings meist noch recht ungenau, da der Benutzer via WLAN-Accesspoints in der Umgebung und Geo-IP geortet wird.</p>
<p>Mittlerweile wächst der Markt an Geo-sensitiven Anwendungen stark – und ihm wird in naher Zukunft ein weiterhin starkes Wachstum zugesagt. Ortsbezogene Social Networks wie <a href="http://gowalla.com/">Gowalla</a>, <a href="http://foursquare.com/">Foursquare</a> und <a href="http://brightkite.com/">Brightkite</a> ermöglichen es, an Orten “einzuchecken” und zu erfahren, wo sich Freunde gerade aufhalten – und verbinden dies teils mit einem <a href="http://news.cnet.com/8301-13577_3-10466302-36.html">spielerischen Effekt</a>. Auch die anderen Dienste im Social web ziehen nach – Microblogging-Dienste wie <a href="http://identi.ca">identi.ca</a> und <a href="http://twitter.com">Twitter</a> speichern auf Wunsch den aktuellen Ort zusammen mit “Tweets”. Facebook <a href="http://mashable.com/2010/08/18/facebook-launches-its-location-features-live/">startete gerade vor zwei Tagen</a> seinen neuen Dienst “Places”, bei dem bereits die Dienste Foursquare, Gowalla, Yelp und MyTown mehr oder weniger eng mit eingebunden sind. Wikipedia-Artikel beinhalten bereits seit einiger Zeit Koordinaten von Orten, mit Positionsdaten angereicherte Fotos erlauben zusätzliche Funktionen bei Foto-Communities wie <a href="http://www.flickr.com/">Flickr</a> und <a href="http://picasaweb.google.com/">Picasa</a>.
Um Positionsdaten zu visualisieren, sind Dienste wie <a href="http://www.openstreetmap.de/">OpenStreetMap</a> und <a href="http://maps.google.de/">Google Maps</a> nützlich – sie bieten eine mehr- oder weniger vollständige Karte der Erde und erlauben beispielsweise über APIs, die Kartenansichten mit weiteren Informationen angereichert darzustellen – Marker, Fotos auf einer Landkarte und vieles mehr.</p>
<p>Was macht diesen Markt so interessant? Zum einen sind natürlich interessante Anwendungen möglich – mit einer entsprechenden Anwendung kann man sich den nächsten Geldautomaten, das nächste Café oder eine gute Bar um die Ecke anzeigen. Man kann sehen, an welchen Orten sich Freunde kürzlich aufgehalten haben oder selbst interessante Orte “markieren”, um sie später wiederzufinden.
Aber auch für <a href="http://mashable.com/2010/03/15/location-based-marketing/">Marketing-Zwecke</a> eignen sich ortsbezogene Dienste. Sie werden außerdem für kleinere, lokale Betriebe interessant. Werbung auf Online-Plattformen kann gezielt Nutzer in der Nähe ansprechen. Ein Café kann an alle User eines LBS im näheren Umkreis Informationen über eine Rabatt-Aktion verteilen, um Gäste anzulocken. Events können Menschen in der Nähe einfach bekannt gemacht werden. Interessante Marketing-Aktionen, wie sie beispielsweise Opel <a href="http://derstandard.at/1280984142525/Monopol-fuehrt-Opel-Kampagne-auf-Geolocation-Dienst-foursquare-durch">durchgeführt hat</a>, werden möglich. Bars in den USA versprechen Foursquare-Usern, die in einem Monat am Häufigsten “eingecheckt” haben, <a href="http://techcrunch.com/2009/08/20/free-beer-foursquare-starts-alerting-users-of-nearby-mayor-deals/">Freibier</a>. Gap gibt Kunden für Check-ins <a href="http://mashable.com/2010/08/14/foursquare-gap/">25% Rabatt</a>.</p>
<p>Bei all diesen Diensten, die es bereits gibt und in Zukunft immer häufiger geben wird, sollte man nie vergessen: die eigene Position ist eine sensible Information – die man nur mit Bedacht verwenden sollte. Vor allem dann, wenn sie für jedermann sichtbar im Netz zu finden ist und auf geschlossenen Plattformen wie Facebook auf ewig gespeichert sein wird.</p>
<p>Zu empfehlen sind noch drei Podcasts von Vorträgen auf der <a href="http://sxsw.com/">SXSW 2010</a>:</p>
<ul>
<li><a href="http://sxsw.com/node/5016">LBS 101: Geolocation On The “Horizon”</a></li>
<li><a href="http://sxsw.com/node/5146">Location-Based Marketing and Advertising: Targeting the Mobile Consumer</a></li>
<li><a href="http://sxsw.com/node/5147">Mapping and Geolocation: Turnkey Approaches You Need to Know</a></li>
</ul>
tag:raphael.kallensee.name,2010-08-16:/journal/freie-lizenzen-freie-inhalte-und-freie-software/Freie Lizenzen, freie Inhalte und freie Software2010-08-16T21:52:27Z2010-08-16T21:52:27Z<p>Besonders in der IT-Branche wird häufig von “<a href="http://de.wikipedia.org/wiki/Open_Source">Open Source</a>” gesprochen. Aber geht es wirklich nur um offen gelegten Quelltext oder darum, dass freie Software kostenlos ist? Gibt es etwas Vergleichbares auch für beliebige andere Inhalte? Dies soll ein kurzer Überblick über dieses Thema sein.</p>
<p>Es geht in diesem Zusammenhang vor allem um <a href="http://de.wikipedia.org/wiki/Freie_Lizenz">freie Lizenzen</a> – Lizenzen, mit denen der Urheber jedem freistellt, die Inhalte zu jedem beliebigen Zweck zu nutzen, Kopien davon weiterzugeben (also zu teilen) und die Inhalte beliebig zu verändern. Es geht also insbesondere um die Freiheit der Nutzer sowie gegen die Einschränkung dieser Freiheit, beispielsweise durch <a href="http://de.wikipedia.org/wiki/Digitale_Rechteverwaltung#DRM_gegen.C3.BCber_freier_Software">Digitales Rechtemanagement</a> (DRM), das dem Benutzer die Kontrolle über Daten und Software auf seinem eigenen Computer nimmt. Endbenutzer-Lizenzverträge – wie beispielsweise die von Microsoft Windows oder Apple MacOS – sind meist darauf ausgelegt, dem Nutzer <a href="http://www.guardian.co.uk/commentisfree/libertycentral/2010/aug/16/get-more-people-using-free-software">die Freiheiten zu entziehen</a>.</p>
<p>Der Ursprung liegt in der <a href="http://de.wikipedia.org/wiki/Freie_Software">Freien Software</a> – eine Bewegung, die sich für quelloffene Software unter freien Lizenzen einsetzt. In diesem Zusammenhang ist vor allem die <a href="http://www.fsf.org/about/">Free Software Foundation</a> zu nennen, die freie Software fördert und für die Einhaltung freier Lizenzen streitet. Eine der bekanntesten Lizenzen für freie Software ist die <a href="http://de.wikipedia.org/wiki/GPL">GPL</a>. Sie gewährt den Benutzern die genannten Freiheiten und beinhaltet darüber hinaus das <a href="http://de.wikipedia.org/wiki/Copyleft">Copyleft</a> – das sicherstellt, dass Software unter dieser Lizenz weitergegeben sowie Veränderungen an der Software unter derselben Lizenz veröffentlicht werden müssen, die Software also frei bleibt. Eine Weiterentwicklung der GPL, die <a href="http://de.wikipedia.org/wiki/AGPL">AGPL</a>, dehnt die Wirkung der GPL auch auf Netzwerkdienste aus, die von der GPL nicht erfasst werden. Nutzern eines Content-Management-Systems, das unter der AGPL steht, muss also beispielsweise der (ggf. veränderte) Quellcode der Anwendung zur Verfügung gestellt werden.</p>
<p>Aber freie Lizenzen gibt es nicht nur für Software. 2001 entwickelte <a href="http://de.wikipedia.org/wiki/Lawrence_Lessig">Lawrence Lessig</a> “<a href="http://de.wikipedia.org/wiki/Creative_Commons">Creative Commons</a>” – ein Lizenzmodell, das sich vom klassischen Urheberrecht abgrenzt und auf Offenheit setzt. Jeder kann diese Lizenzen frei für seine Werke nutzen – und zwar für alle Werke, die durch das Urheberrecht geschützt sind, also unter anderem Musik, Texte, Fotos und Forschungsergebnisse. Creative Commons besteht aus vier Bausteinen, die in verschiedenen Formen miteinander kombiniert werden können:</p>
<ul>
<li><strong>BY</strong> – Namensnennung des Autors erforderlich</li>
<li><strong>NC</strong> – nicht-kommerzielle Nutzung</li>
<li><strong>ND</strong> – keine Änderungen erlaubt</li>
<li><strong>SA</strong> – Weitergabe nach Veränderung nur mit gleicher Lizenz (<a href="http://de.wikipedia.org/wiki/Copyleft">Copyleft</a>)</li>
</ul>
<p>Die Lizenz CC-BY-SA, unter der auch die Inhalte dieses Blogs stehen, erlaubt es beispielsweise jedem, die Inhalte frei zu nutzen – mit der Bedingung der Namensnennung (z.B. Verlinkung zurück auf diesen Beitrag) sowie der Verpflichtung, die davon abgeleiteten Werke auch unter eine CC-BY-SA-Lizenz zu stellen.</p>
<p>Weiterhin gibt es einige Abwandlungen wie Sampling-Lizenzen. Eine weitere Form – wenn auch u.a. in Deutschland rechtlich nicht möglich – ist <a href="http://de.wikipedia.org/wiki/Public_Domain#Public_Domain">Public Domain</a>, ein Totalverzicht auf alle Rechte am eigenen Werk.</p>
<p>CC-Lizenzen sind mittlerweile an vielen Stellen – besonders im Netz – zu finden. <a href="http://www.jamendo.com/de/">Jamendo</a> vertreibt CC-Musik, <a href="http://www.flickr.com">Flickr</a> unterstützt die Verwendung von CC-Lizenzen für Bilder und seit 2009 stehen alle Inhalte der Wikipedia sowie sämtlicher Wikimedia-Inhalte <a href="http://creativecommons.org/weblog/entry/15411">unter der CC-BY-SA-Lizenz</a>.</p>
<p>Ein bekannter Aktivist, der sich für eine Liberalisierung des Urheberrechts einsetzt, ist der Science-Fiction-Author und Blogger <a href="http://de.wikipedia.org/wiki/Cory_Doctorow">Cory Doctorow</a>, bekannt unter anderem als Autor bei <a href="http://boingboing.net/">Boing Boing</a>. Er stellt alle seine Bücher und Werke unter einer Creative Commons-Lizenz ins Netz – was ihm sogar <a href="http://creativecommons.org/weblog/entry/7774">deutlich höhere Verkaufszahlen</a> seiner gedruckten Bücher beschert haben soll.</p>
tag:raphael.kallensee.name,2010-08-14:/journal/froscon-programm-app-fur-webos/FrOSCon-Programm-App für WebOS2010-08-14T21:41:41Z2010-08-14T21:41:41Z<p><a href="/static/media/journal/2010/08/froscon_de_20100814-01.png"><img src="/static/media/journal/2010/08/froscon_de_20100814-01-200x300.png" alt="" title="froscon_de_20100814-01" width="200" height="300" class="alignleft size-medium wp-image-271" /></a>Wer am kommenden Wochenende zur <a href="http://froscon.org/">FrOSCon</a> nach St. Augustin fährt, kann die Programmpunkte, die er besuchen möchte, bequem auf seinem Palm WebOS-Gerät planen.</p>
<p>Ich habe meine ursprünglich für die FOSDEM geschriebene <a href="/journal/fosdem-2010-schedule-application-for-webos/">WebOS-Anwendung</a> erweitert und um eine Favoriten-Funktion ergänzt.</p>
<p>Die Anwendung habe ich zur Prüfung an Palm übermittelt – sie wird hoffentlich noch rechtzeitig bis zum Wochenende veröffentlicht. Wer sie bereits testen möchte, findet die Anwendung im <a href="http://developer.palm.com/appredirect/?packageid=net.webpresso.froscon2010">Palm Beta feed</a> – einfach diesen Link über das WebOS-Smartphone öffnen, dann kann die Anwendung einfach installiert werden.</p>
<p>Die Anwendung ist freie Software und steht unter der <a href="http://www.gnu.org/licenses/gpl.html">GPLv3</a>, der Quelltext ist <a href="http://forge.webpresso.net/projects/fosdem-webos">hier verfügbar</a>.</p>
tag:raphael.kallensee.name,2010-06-30:/journal/server-name-indication-sni-mit-ubuntu-10-04-lucid-lynx/Server Name Indication (SNI) mit Ubuntu 10.04 ("Lucid Lynx")2010-06-29T22:47:04Z2010-06-29T22:47:04Z<p>Bei “Name-based virtual hosts” in Verbindung mit SSL gibt es ein Problem: “by design” war es nicht möglich, mehrere virtuelle SSL-Hosts mit unterschiedlichen Domains und Zertifikaten parallel auf einer IP-Adresse und demselben Port zu betreiben. Problem ist, dass zuerst zwischen Client und Server die verschlüsselte Verbindung aufgebaut wird (bei der das Zertifikat bereits benötigt wird). Erst anschließend werden die HTTP-Header über die verschlüsselte Verbindung gesendet, in denen dann auch der Hostname steht, der jetzt möglicherweise aber gar nicht mehr zum Zertifikat passt. Einzige Lösung war bisher, pro SSL-IP eine eigene IP-Adresse (bzw. notfalls einen anderen Port) zu verwenden.</p>
<p>Abhilfe gibt es theoretisch bereits seit mehreren Jahren: <a href="http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI">Server Name Indication (SNI)</a> ist eine Erweiterung des SSL-Protokolls, bei der einfach bereits beim Verbindungsaufbau vor dem SSL-Handshake der gewünschte Hostname mitgesendet wird.</p>
<p>Serverseitig benötigt diese Erweiterung insbesondere OpenSSL ab Version 0.9.8f sowie Apache ab 2.2.12 – außerdem müssen beim Kompilieren diverse Flags gesetzt sein. Seit Ubuntu 9.10 “Karmic Koala” sind sämtliche Voraussetzungen erfüllt, ich habe SNI nun erstmalig problemlos mit 10.04 “Lucid Lynx” im Einsatz. SNI funktioniert mit Apache und OpenSSL nun ohne Neu-Kompilieren “out of the box”.</p>
<p>Die Vorgehensweise ist im Prinzip ganz einfach: nach einem</p>
<pre><code data-language="apache">NameVirtualHost *:443
</code></pre>
<p>können in den Apache-Konfigurationsdateien mehrere virtuelle SSL-Hosts definiert werden, die jeweils eigene SSL-Zertifikate besitzen. Weitere Infos sind im <a href="http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI#Examples">Apache-Wiki</a> sowie <a href="http://langui.sh/2009/11/03/ssl-vhosting-on-the-same-ip-aka-sni/">hier</a> zu finden.</p>
<p>Eine weitere Option erlaubt das Erzwingen von SNI: übermittelt ein Client nicht die SNI-Header, kann er den jeweiligen virtuellen SSL-Host nicht erreichen. Diese Option ist standardmäßig auf “off”.</p>
<pre><code data-language="apache">SSLStrictSNIVHostCheck on
</code></pre>
<p>Der Haken: neben dem Server muss natürlich auch der Client SNI unterstützen. Internet Explorer unter Windows XP unterstützen SNI generell nicht (wobei es <a href="http://daniel-lange.com/archives/2-Multiple-Apache-VHosts-on-the-same-IP-and-port.html">Berichte</a> gibt, dass mit XP SP3 die Unterstützung vorhanden ist), Konqueror beherrscht SNI ebenfalls nicht. Ein Überblick über die Browser-Unterstützung findet sich <a href="http://www.alexanderkiel.net/2008/04/22/status-of-tls-sni/">hier</a>. Ob ein Browser SNI unterstützt, kann man bei <a href="https://dave.sni.velox.ch/">sni.velox.ch</a> testen.</p>
<p>Zumindest in einigen Bereichen kann man SNI trotz der teilweise fehlenden Client-Kompatibilität bereits einsetzen – die client-seitige Unterstützung wird sich in Zukunft weiterhin verbessern.</p>
<p>Ein Artikel zum Thema ist in der c’t 23/09 erschienen und ebenfalls bei <a href="http://sni.velox.ch/ct_2309_Apache_TLS_SNI.pdf">sni.velox.ch</a> zu finden.</p>
tag:raphael.kallensee.name,2010-03-07:/journal/installation-von-redmine-und-git-unter-ubuntu/Installation von Redmine und Git unter Ubuntu2010-03-07T20:55:52Z2010-03-07T20:55:52Z<p>Auf der Suche nach einer Alternative zur Software-Projektverwaltungssoftware <a href="http://trac.edgewall.org/">Trac</a> landete ich bei <a href="http://www.redmine.org/">Redmine</a>, einer in Ruby bzw. mit Hilfe von Rails geschriebenen Software. Die <a href="http://www.redmine.org/wiki/redmine/Features">Features</a> lassen sich sehen – vor allem die Multiprojekt-Unterstützung, Kalender und Gantt-Diagramm, Zeiterfassung und gute Unterstützung für <a href="http://git-scm.com/">Git</a> sind im Vergleich zur Trac herausragend. Wie sich während der Installation herausstellte, ist auch das Authentifizierungs-Feature für SVN und Git via WebDAV absolut praktisch – über die Rechte der Projektteilnehmer in Redmine wird automatisch auch der Lese- und Schreibzugriff im Versionskontrollsystem gesteuert, die Benutzer müssen also nur an einer Stelle gepflegt werden.</p>
<p>Für alle, die Redmine installieren möchten, hier ein paar meiner Erfahrungen. Die Installation erfolgte auf einem System mit Ubuntu <del datetime="2013-05-20T14:14:14+02:00">9.10</del> 12.04 Server, es wird ein Apache-HTTP-Server und MySQL vorausgesetzt. Es gibt viele Möglichkeiten, eine Ruby/Rails-Anwendung zu installieren – ich habe mich für die Variante mit Apache und <a href="https://www.phusionpassenger.com/">Phusion Passenger</a> entschieden.</p>
<p><ins datetime="2013-05-20T14:14:14+02:00"><strong>Großes Update vom 20.05.2013:</strong> Anleitung für Ubuntu 12.04 und Redmine 2.3.x angepasst. Passenger ist zwar in den Paketquellen von Ubuntu 12.04 enthalten, möchte aber immer das mittlerweile veraltete Ruby 1.8.7 mit installieren, deshalb installieren wir Passenger selbst via Rubygems. Diese Anleitung geht mittlerweile von einer aktuelleren Redmine-Version (2.3+) aus, bei der die Abhängigkeiten von Redmine mittels <a href="http://gembundler.com/">Bundler</a> installiert werden.</ins></p>
<h3>Installation von Passenger unter Ubuntu 12.04</h3>
<p>Zunächst installieren wir einige Abhängigkeiten über die Paketverwaltung – wichtig ist, dass wir Ruby 1.9.3 verwenden (in Ubuntu 12.04 sind sowohl das in Kürze nicht mehr unterstützte 1.8.7 und das aktuellere 1.9.3 in den Paketquellen enthalten). Auch wenn der Paketname “ruby1.9.1-full” irritiert – dahinter verbirgt sich Version 1.9.3:</p>
<pre><code data-language="bash">sudo apt-get install ruby1.9.1-full subversion imagemagick libxslt1-dev libcurl4-openssl-dev libssl-dev libapr1-dev libaprutil1-dev apache2-threaded-dev
</code></pre>
<p><em>Hinweis: Es ist nicht zu empfehlen, Ruby-Abhängigkeiten wie Rake und Rails aus den Paketquellen zu installieren, sondern besser direkt über Rubygems/Bundler, da die Versionen aus den Paketquellen ohnehin zu alt sind.</em></p>
<h3>Installation von Passenger</h3>
<p>Passenger kann einfach via Rubygems installiert werden. Dazu folgendes ausführen:</p>
<pre><code data-language="bash">sudo gem install rack rake passenger
passenger-install-apache2-module
</code></pre>
<p>Sollten bestimmte Abhängigkeiten noch fehlen, gibt der Installer ausführliche Fehlermeldungen mit eventuell noch zu installierenden Paketen. Das Kompilieren des Apache-Moduls kann einige Minuten dauern. Kaffeepause!</p>
<p>Jetzt fügen wir noch die notwendige Apache-Konfiguration hinzu, damit Passenger geladen werden kann:</p>
<p>Die Datei <code>/etc/apache2/mods-available/passenger.load</code> mit folgendem Inhalt anlegen:</p>
<pre><code data-language="apache">LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-4.0.2/libout/apache2/mod_passenger.so
</code></pre>
<p>Und die Datei <code>/etc/apache2/mods-available/passenger.conf</code> mit folgendem Inhalt:</p>
<pre><code data-language="apache">PassengerRoot /var/lib/gems/1.9.1/gems/passenger-4.0.2
PassengerDefaultRuby /usr/bin/ruby1.9.1
PassengerDefaultUser www-data
</code></pre>
<p>Achtung: je nach aktueller Version von Passenger können die Pfade leicht abweichen – daher am Ende der Installation von Passenger auf die Hinweise achten.</p>
<p>Jetzt kann Passenger aktiviert und Apache neu gestartet werden:</p>
<pre><code data-language="bash">sudo a2enmod passenger
sudo service apache2 restart
</code></pre>
<h3>Installation von Redmine</h3>
<p>Jetzt kann Redmine heruntergeladen werden. Für einfache spätere Updates wird das Auschecken des stable-Branchs via SVN oder git empfohlen. Dann reicht später ein Update über das Versionskontrollsystem zur Aktualisierung. <em>Wem die Installation via Paketverwaltung lieber ist, kann Redmine seit Ubuntu 10.04 auch direkt aus den Paketquellen installieren, hat ggf. aber nicht die aktuellste Version. Dafür reicht ein “apt-get install redmine redmine-mysql” (für die Verwendung mit MySQL als Datenbank). Mehr im <a href="http://www.redmine.org/wiki/redmine/HowTo_Install_Redmine_in_Ubuntu#Ubuntu-104-using-Passenger">offiziellen How-To</a>.</em></p>
<p>Für die Installation via SVN wird der aktuelle stabile Zweig ausgecheckt:</p>
<pre><code data-language="bash">svn co http://svn.redmine.org/redmine/branches/2.3-stable/ /var/www/redmine.example.lit/redmine/
</code></pre>
<p>Jetzt stellen wir die Datenbank bereit. Ich habe mich für MySQL als Datenbank entschieden, es steht aber unter anderem auch SQLite zur Verfügung. Die Installation von MySQL ist nicht Teil dieser Anleitung, aber mittels <code>apt-get install mysql-server</code> auch schnell erledigt. Vorbereitend wird nun eine Datenbank (z.B. via phpMyAdmin) erstellt, ggf. mit eigenem DB-Benutzer:</p>
<pre><code data-language="bash">CREATE DATABASE `redmine` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT USAGE ON redmine.* TO redmine@localhost IDENTIFIED BY "mysecretp4ssw0rd";
GRANT ALL PRIVILEGES ON redmine.* TO redmine@localhost;
</code></pre>
<p>Jetzt sollten wir die Datenbankverbindung konfigurieren. Dazu wird im Verzeichnis /var/www/redmine.example.lit/redmine/config/ die Beispieldatei kopiert und im Bereich “production” die richtigen DB-Verbindungsdaten angegeben:</p>
<pre><code data-language="bash">cd /var/www/redmine.example.lit/redmine/config/
cp database.yml.example database.yml
vim database.yml
</code></pre>
<p>Achtung: in der Datei unbedingt auf die korrekte Einrückung mit zwei Leerzeichen achten! Die “production”-Sektion kann dann z.B. so aussehen:</p>
<pre><code data-language="yaml">production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "mysecretp4ssw0rd"
encoding: utf8
</code></pre>
<p>Anschließend wird der Mailversand konfiguriert:</p>
<pre><code data-language="bash">cd /var/www/redmine.example.lit/redmine/config/
cp configuration.yml.example configuration.yml
vim configuration.yml
</code></pre>
<p>Dort muss bei Verwendung von sendmail ganz unten in der Datei in der Sektion “production” folgendes eingetragen werden (auch hier wieder auf die korrekte Einrückung mit zwei Leerzeichen achten):</p>
<pre><code data-language="yaml"># specific configuration options for production environment
# that overrides the default ones
production:
email_delivery:
delivery_method: :sendmail
</code></pre>
<p>Jetzt installieren wir die Abhängigkeiten mit Rubygems/Bundler:</p>
<pre><code data-language="bash">sudo gem install bundler --no-ri --no-rdoc
cd /var/www/redmine.example.lit/redmine/
sudo bundle install --without development test
</code></pre>
<p>Jetzt sollte noch der Besitzer dieses Verzeichnisses und aller Unterordner/Dateien geändert werden, da Passenger als User “www-data” läuft.</p>
<pre><code data-language="bash">sudo chown -R www-data:www-data /var/www/redmine.example.lit/redmine/
</code></pre>
<p>Bei der verwendeten SVN-Version muss noch ein Session-Token erzeugt werden. Dazu im Wurzelverzeichnis der Anwendung (also z.B. /var/www/redmine.example.lit/redmine/) folgendes ausführen:</p>
<pre><code data-language="bash">rake generate_secret_token
</code></pre>
<p>Nun wird die Datenbankstruktur erzeugt und die Standard-Konfiguration in die Datenbank geschrieben. Dazu wird folgendes (im Wurzelverzeichnis der Installation) aufgerufen:</p>
<pre><code data-language="bash">cd /var/www/redmine.example.lit/redmine/
rake db:migrate RAILS_ENV="production"
rake redmine:load_default_data RAILS_ENV="production"
</code></pre>
<p>Nun ist Redmine installiert und es kann der virtuelle Apache-Host nach folgendem Muster konfiguriert werden (z.B. /etc/apache2/sites-available/redmine.example.lit):</p>
<pre><code data-language="apache"><VirtualHost *:80>
ServerName redmine.example.lit
DocumentRoot /var/www/redmine.example.lit/redmine/public
<Directory /var/www/redmine.example.lit/redmine/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
</code></pre>
<p>Nach dem Aktivieren des virtuellen Hosts und dem Neuladen der Apache-Konfiguration mittels</p>
<pre><code data-language="bash">sudo a2ensite redmine.example.lit
sudo service apache2 reload
</code></pre>
<p>ist Redmine über die entsprechende (Sub-)Domain erreichbar. Nun kann Redmine über die Oberfläche konfiguriert werden. Die Administrator-Zugangsdaten sind admin/admin (und sollten gleich geändert werden).</p>
<h3 id="git-http-webdav">Einrichten eines öffentlich lesbaren GIT-Repositorys via HTTP/WebDAV mit Redmine als Zugriffskontrolle</h3>
<p>Nach dem Anlegen einiger Projekte habe ich für diese ein Git-Repository angelegt. Git wird der Einfachheit halber für die Nutzung via HTTP/WebDAV konfiguriert, auch wenn dies deutlich weniger performant als die anderen zur Verfügung stehenden Varianten ist. Ein weiterer Vorteil ist die Erreichbarkeit auch aus Umgebungen mit restriktiven Firewalls. Außerdem kann so die anfangs erwähnte Authentifizierung via Redmine genutzt werden.</p>
<p><strong>Update</strong>: seit Version 2.1 kann Redmine auch mit dem “Smart HTTP transport” von Git umgehen. Eine ergänzende Anleitung dazu gibt es in einem <a href="/journal/smart-http-transport-fur-git-mit-redmine-2-1/">neuen Blogbeitrag</a>.</p>
<p>Falls noch nicht vorhanden, muss git installiert werden.</p>
<pre><code data-language="bash">sudo apt-get install git-core
</code></pre>
<p>Von einem installierten Apache2 mit mod_dav wird ausgegangen. Zuerst wird – am Besten außerhalb der DocumentRoot – ein Verzeichnis für das Repository angelegt. Danach wird ein git-Repository in diesem Ordner erstellt, das durch die Option —bare nicht mit einer Arbeitskopie in Verbindung steht. Anschließend wird der Benutzer und die Gruppe des Webservers als Eigentümer des Verzeichnisses gesetzt, bei Debian und Ubuntu ist dies “www-data”.</p>
<p>Wichtig ist, dass der Name des Repository-Ordners mit dem existierenden GIT-Projekt-Identifier übereinstimmt, damit Redmine später die Zuordnung gelingt.</p>
<pre><code data-language="bash">cd /var/www/redmine.example.lit/
mkdir git
cd git
mkdir example-project
cd example-project
git --bare init
cd ..
sudo chown -R www-data:www-data example-project
</code></pre>
<p>Nun wird die Zugriffskontrolle via Redmine eingerichtet. Dazu wird erst einmal mod<em>perl, mod</em>dav und weitere Abhängigkeiten installiert und die erforderlichen Module aktiviert. Redmine stellt zur Authentifizierung ein Perl-Modul bereit.</p>
<pre><code data-language="bash">sudo apt-get install libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl libdigest-sha1-perl
sudo a2enmod dav
sudo a2enmod dav_fs
sudo a2enmod perl
</code></pre>
<p>Dann wird das Redmine-Perl-Modul an die richtige Stelle verlinkt:</p>
<pre><code data-language="bash">ln -s /var/www/redmine.example.lit/redmine/extra/svn/Redmine.pm /usr/lib/perl5/Apache/Redmine.pm
</code></pre>
<p>Nun muss ein virtueller Apache-Host für den Zugriff konfiguriert werden. Dazu wird z.B. ein neuer virtueller Apache-Host nach folgendem Muster konfiguriert (im unteren Teil den Namen sowie die Zugangsdaten für die Datenbank einsetzen). Das Verzeichnis, das als DocumentRoot angegeben ist, sollte existieren.</p>
<pre><code data-language="apache"> <virtualhost *:80>
ServerName code.example.lit
DocumentRoot /var/www/redmine.example.lit/code
PerlLoadModule Apache::Redmine
Alias /git /var/www/redmine.example.lit/git
<location /git>
DAV on
AuthType Basic
Require valid-user
AuthName "Git"
Options +Indexes -ExecCGI -Includes
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
RedmineDSN "DBI:mysql:database=redmine;host=localhost"
RedmineDbUser "username"
RedmineDbPass "password"
</location>
</virtualhost>
</code></pre>
<p>Anschließend ist das Git-Repository des Projekts “example-project” – jedenfalls laut Beispielkonfiguration – unter code.example.lit/git/example-project erreichbar. Falls das Projekt in Redmine auf “öffentlich” geschaltet ist, kann jeder auf dieses Repository lesend zugreifen. Schreibzugriffe haben alle Redmine-Benutzer, die dem Projekt als Mitglied zugeordnet sind.</p>
<p>Damit der Repository-Browser von Redmine das Repository findet, kann es eventuell nötig sein, in der Projektkonfiguration für das Repository “Git” auszuwählen und den (lokalen!) Pfad anzugeben, z.B. /var/www/redmine.example.lit/git/example-project</p>
<p>Sollte beim Anzeigen des Repositories in Redmine ein Fehler auftreten, kann dies daran liegen, dass es noch keinen Commit gab.</p>
<p>Weiterführende Hinweise finden sich auf folgenden Seiten:</p>
<ul>
<li><a href="http://www.redmine.org/wiki/redmine/RedmineInstall">http://www.redmine.org/wiki/redmine/RedmineInstall</a></li>
<li><a href="http://www.modrails.com/documentation/Users%20guide.html">http://www.modrails.com/documentation/Users%20guide.html</a></li>
<li><a href="http://wiki.ousli.org/index.php/RedmineUbuntu">http://wiki.ousli.org/index.php/RedmineUbuntu</a></li>
<li><a href="http://www.redmine.org/wiki/redmine/HowTo_Install_Redmine_in_Ubuntu">http://www.redmine.org/wiki/redmine/HowTo<em>Install</em>Redmine<em> in</em>Ubuntu</a></li>
<li><a href="https://help.ubuntu.com/community/RubyOnRails">https://help.ubuntu.com/community/RubyOnRails</a></li>
<li><a href="http://www.railsgarden.com/2008/04/12/configurating-passenger-mod_rails-on-slicehost-with-ubuntu-710/">http://www.railsgarden.com/2008/04/12/configurating-passenger-mod_rails-on-slicehost-with-ubuntu-710/</a></li>
<li><a href="http://library.linode.com/development/project-management/redmine/ubuntu-9.10.txt">http://library.linode.com/development/project-management/redmine/ubuntu-9.10.txt</a></li>
<li><a href="http://www.kernel.org/pub/software/scm/git/docs/howto/setup-git-server-over-http.txt">http://www.kernel.org/pub/software/scm/git/docs/howto/setup-git-server-over-http.txt</a></li>
<li><a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#setting-up-a-public-repository">http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#setting-up-a-public-repository</a></li>
<li><a href="http://www.redmine.org/wiki/1/Repositories_access_control_with_apache_mod_dav_svn_and_mod_perl">http://www.redmine.org/wiki/1/Repositories<em>access</em>control<em> with</em>apache<em>mod</em>dav<em>svn</em>and<em>mod</em>perl</a></li>
<li><a href="http://www.redmine.org/wiki/redmine/RedmineRepositories">http://www.redmine.org/wiki/redmine/RedmineRepositories</a></li>
<li><a href="http://www.simonecarletti.com/blog/2009/07/configuring-git-repository-with-redmine/">http://www.simonecarletti.com/blog/2009/07/configuring-git-repository-with-redmine/</a></li>
</ul>