<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Andreas Happe</title>
	<atom:link href="http://snikt.net/index.php/feed" rel="self" type="application/rss+xml" />
	<link>http://snikt.net</link>
	<description>Vi veri ueniversum vivus vici</description>
	<lastBuildDate>Tue, 06 Jul 2010 21:54:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>July, 7th</title>
		<link>http://snikt.net/index.php/2010/07/06/july-7th</link>
		<comments>http://snikt.net/index.php/2010/07/06/july-7th#comments</comments>
		<pubDate>Tue, 06 Jul 2010 21:54:07 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://snikt.net/?p=825</guid>
		<description><![CDATA[Days are long, but years are short.]]></description>
			<content:encoded><![CDATA[<p>
  <img src="http://www.creativereview.co.uk/images/uploads/2009/07/finalplaqueday_5jun09_9_0.jpg" alt="Never forget" width="500px"/>
</p>
<p><i>Days are long, but years are short.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/07/06/july-7th/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>After Week One with a Kindle</title>
		<link>http://snikt.net/index.php/2010/05/11/after-week-one-with-a-kindle</link>
		<comments>http://snikt.net/index.php/2010/05/11/after-week-one-with-a-kindle#comments</comments>
		<pubDate>Tue, 11 May 2010 15:44:44 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://snikt.net/?p=822</guid>
		<description><![CDATA[So finally I&#8217;ve got myself an eBook-Reader. As I already own some Amazon eBooks the Amazon.com Kindle International Edition (which is almost the same as the Kindle 2) was the obvious choice. As I wasn&#8217;t too sure that I&#8217;m into eBooks I got one from ebay.at for around 130 Euro. How was the first week? [...]]]></description>
			<content:encoded><![CDATA[<p>So finally I&#8217;ve got myself an eBook-Reader. As I already own some Amazon eBooks the <a href="http://www.amazon.com/gp/product/B0015T963C?amp%3Brw_absolute=y">Amazon.com Kindle International Edition</a> (which is almost the same as the Kindle 2) was the obvious choice. As I wasn&#8217;t too sure that I&#8217;m into eBooks I got one from ebay.at for around 130 Euro. How was the first week?</p>
<p><span id="more-822"></span>The Kindle is a no-nonsense product. it&#8217;s sole purpose is providing me with readable eBooks.. and it does this near perfect: I&#8217;ve just entered my Amazon account, books got automatically synchronised and the Big Reading was started. Connectivity is provided through Amazon Whispernet so no further configuration is needed: no activation, no SIM card, no mandatory initialisation with a computer. Just start reading.</p>
<p>The product feels very much as an anti iPad: it has one use-case and solves this perfectly. It does not try to stun by beauty but inspires it through its pure usability. Except it&#8217;s linkage to the Amazon account it is more open than expected, e.g. how to get files onto it? Connect a micro-USB cable and copy mp3s or pdfs on the USB device. done.</p>
<p>The hardware itself fades into the background. The screen is gorgeous, the plastic on it&#8217;s back less so. But after you&#8217;ve read one page you stop to notice. The keyboard, which at first looked de-placed for this kind of device, is well placed: it allows to hold the Kindle in an easy and natural manner. Without it the Kindle would &#8220;feel&#8221; to top-heavy or my hand would get in the way of the display. To be completely honest, I actually prefer reading the Kindle to traditional books.</p>
<p>The kindle was designed for reading, every other use cases seem to have been neglected: the obvious example is the mp3 playback support.  understand that some engineer thought that background audio might be a sweet feature but the current implementation? Mediocre at best, farcical at worst. Very weak, at least they have hidden it away under the &#8216;experimental&#8217; section.</p>
<p>Is it stylish? It depends. It&#8217;s not a dark library with heavy tome after tome, lightened by reading lights. It won&#8217;t impress visitors. But it provides zen-like access to books. From everywhere. The three words that describe the experience best are: Purposeful, pure Simplicity and Independence.</p>
<p>Count me in.</p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/05/11/after-week-one-with-a-kindle/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Provenance on Rails</title>
		<link>http://snikt.net/index.php/2010/04/29/provenance-on-rails-2</link>
		<comments>http://snikt.net/index.php/2010/04/29/provenance-on-rails-2#comments</comments>
		<pubDate>Thu, 29 Apr 2010 19:02:10 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Provenance]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[University]]></category>
		<category><![CDATA[master thesis]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://snikt.net/?p=802</guid>
		<description><![CDATA[First of all, what is provenance? The common description is that provenance describes how an object came into its current state. Think of it as versioning on crack: in addition to performed changes it also detects how and by whom those changes were performed. ..but do I need it? Well that depends: do you have [...]]]></description>
			<content:encoded><![CDATA[<h1><span style="font-weight: normal; font-size: 13px;">First of all, what is provenance? The common description is that <em>provenance describes how an object came into its current state</em>. Think of it as versioning on crack: in addition to performed changes it also detects how and by whom those changes were performed.</span></h1>
<h2>..but do I need it?</h2>
<p>Well that depends:</p>
<ul>
<li>do you have any objects in whose alteration history you&#8217;re interested in? Think about any financial or business object.</li>
<li>social network app? think automatic activity feeds..</li>
<li>do you have any analysis workflow that produces a single output from multiple input data points? Provenance can retroactively create the relationships between the input and output datums.</li>
<li>do you want to monitor a given object&#8217;s access patterns temporary? Think debugging.</li>
</ul>
<p>Actually, the longer you think the more use cases appear.</p>
<p>After the break I&#8217;ll talk about my master thesis (that dealt with provenance), the corresponding RoR prototype and future plans w.r.t. provenance within Ruby on Rails.</p>
<p><span id="more-802"></span></p>
<h2>Background Information</h2>
<p>I&#8217;ve spend some time with<a href="http://snikt.net/wp-content/provenance/master_thesis.pdf"> my master thesis</a> focusing on provenance. It&#8217;s academic so do not expect readability or real-world usability. For that there&#8217;s a <a href="http://www.snikt.net/wp-content/provenance/short_paper.pdf">short paper detailing the rails prototype</a>, an additional use case was detailed<a href="http://snikt.net/wp-content/provenance/genesis.pdf"> in another paper</a>. All source code can be found on <a href="http://github.com/andreashappe">github</a>, it might take some days to get the newest versions into the repositories.</p>
<p>My basic idea was that developers do not want to deal with the details of provenance gathering or storage. They should focus upon their domain application. I developed a system that allowed automatic provenance capturing (through a rails plugin), networked storage and dedicated network query facilities.</p>
<p>The prototype did work, unobtrusive provenance capturing is perfectly possible in Ruby on Rails.  Why do I believe that the master thesis prototype is not perfectly suited for real-world applications? Well,</p>
<ul>
<li>storage was done through a separated RDF graph engine, encapsulated within an <a>own RoR application</a>. This is well suited for large academic test applications but I believe that something using an embedded storage solution (thus easier to integrate within existing systems) might be better suited for Rails.</li>
<li>provenance queries had to be done through SPARQL or a special (easy) REST-based interface. An interface directly integrated within Ruby would be preferable.</li>
<li>It&#8217;s all still Rails 2.3 based. I&#8217;ve finished the prototype some time ago and did work the last months mostly on the documentation. So the prototype should be forward-ported to Rails 3.0.0beta3.</li>
</ul>
<h2>Towards a bright new future!</h2>
<p>So I have finally finished my master thesis and would need a embeddable provenance solution for one of my side-projects. I will base it upon the work done during my master thesis but it will differentiate in various points:</p>
<ul>
<li><em>use embedded storage</em>. Application developers should be able to install the plugin, call a rake task and enjoy the benefits of automatic provenance gathering. Does anyone know a good ruby only RDF/graph engine?</li>
<li>no more special query language.. users should not have to learn a new query language nor interfaces. Provenance should be be provided through virtual <em>ActionModel</em> methods and act as &#8216;normal&#8217; object methods.</li>
<li>update the plugin to work with Rails 3.0, investigate <em>Rack</em> and <em>ActionModel</em></li>
<li>keep the plugin as simple as possible.. so other people can play with it too.</li>
</ul>
<p>I&#8217;m not perfectly sure when my side-project will need need that functionality (or if it even gets towards that point), but if you&#8217;re interested in provenance on rails just <a href="http://github.com/andreashappe/provenance-on-rails-sensor">watch the repository</a> or, even better, branch it and get involved..</p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/04/29/provenance-on-rails-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Howto use cmake with C/C++ projects</title>
		<link>http://snikt.net/index.php/2010/04/01/howto-use-cmake-with-cc-projects</link>
		<comments>http://snikt.net/index.php/2010/04/01/howto-use-cmake-with-cc-projects#comments</comments>
		<pubDate>Thu, 01 Apr 2010 13:53:04 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://snikt.net/?p=753</guid>
		<description><![CDATA[Writing code ain&#8217;t the end of a C/C++ software developer&#8217;s task, it&#8217;s merely the start of endless compile and debug sessions. Compiling is the build system&#8217;s job: Visual Studio users might just click on the &#8220;Build&#8221; button, UNIX users mostly depend upon Makefiles. The conventional way of creating Makefiles involves GNU&#8217;s autotools. They check the [...]]]></description>
			<content:encoded><![CDATA[<p>Writing code ain&#8217;t the end of a C/C++ software developer&#8217;s task, it&#8217;s merely the start of endless compile and debug sessions. Compiling is the build system&#8217;s job: Visual Studio users might just click on the &#8220;Build&#8221; button, UNIX users mostly depend upon <a href="http://en.wikipedia.org/wiki/Makefile">Makefiles</a>. The conventional way of creating Makefiles involves <a title="GNU autoconf" href="http://www.gnu.org/software/autoconf/">GNU&#8217;s autotools</a>. They check the computer system&#8217;s installed resources (mostly installed libraries and compilers) and generate system-dependant Makfiles. Being fed up with autotools wrt. readability and performance I searched alternatives and found <a title="cross-plattform make" href="http://www.cmake.org/">cmake</a>. The conversation from autotools to cmake did shred away thousands of lines of build code while improving the build performance tremendously. In addition creating distribution-dependent packages gets a lot easier.</p>
<p>Alas I did not find too many introductions so I thought that I&#8217;ll write a bit about my experience with cmake. As I continue to find out more stuff about cmake the post will be updated with new findings.</p>
<p>Read after the fold for an introduction into cmake. We&#8217;ll create a build system capable of creating debian or redhat (RPM) packages. It will include advanced stuff as automatically creating and installing documentation, subversion-derived version numbers and creating optional features.</p>
<h1><span id="more-753"></span>Basic Project Layout</h1>
<p>We have a fairly standard project layout (currently using autotools):</p>
<table>
<tbody>
<tr>
<th>Files</th>
<th>Location</th>
<th>Installed Location</th>
</tr>
<tr>
<td>boilerplate text files (README, LICENSE, etc.)</td>
<td><em>project root</em></td>
<td><em>/usr/share/doc/</em></td>
</tr>
<tr>
<td>Doxygen-generated docs</td>
<td><em>api-doc (after doxygen was called)</em></td>
<td><em>/usr/share/man/man3/</em></td>
</tr>
<tr>
<td>source code for executables</td>
<td><em>bin/*.c</em></td>
<td><em>/usr/bin</em></td>
</tr>
<tr>
<td>support libraries</td>
<td><em>/lib/*.c</em></td>
<td><em>/usr/libs</em></td>
</tr>
<tr>
<td>include files</td>
<td><em>/include/</em></td>
<td><em>/usr/include</em></td>
</tr>
</tbody>
</table>
<p>All files are stored within a <a title="Apache Subversion" href="http://subversion.tigris.org/">subversion software repository</a>. The final package should include the current subversion revision number in their package description (as well as output it from within the executable) to improve bug report&#8217;s quality.</p>
<p>The build system should generate the support library, the binary and utilize Doxygen to generate documentation. All those files need to find their way into automatically build distribution packages (Debian and Redhat packages in our case).</p>
<h1>Basic cmake setup</h1>
<p>We start with a skeleton cmake file that only tests various standard compile flags. We name our project, search for various default libraries (through <em>find_package</em>) and set various compile flags.</p>
<p>The simple boilderplate text files are also installed. At this time the destination directory is hard-coded, this will change in the future.</p>
<pre>project(test-program)
cmake_minimum_required(VERSION 2.6)

# check libs and packages (headers + lib)

# std C libraries
find_package(stdlibs REQUIRED)

# libpthread with pthread.h
find_package(pthread REQUIRED)

check_include_file(argp.h HAVE_ARGP_H)

# additional compiler flags
add_definitions(-Wall -Wextra -pedantic -Werror -std=c99 -D_BSD_SOURCE)

# 'other' documentation files
set(DOC_FILES AUTHORS NEWS README)
set(DOC_PATH "share/doc/testprogram-0.1")
install(FILES ${DOC_FILES}
        DESTINATION ${DOC_PATH})</pre>
<p>So far we have the skeleton outline of a cmake project that just sets some compile information about our project and finally installs some documentation. Let&#8217;s add some &#8220;real&#8221; stuff.</p>
<h1>Adding support libaries</h1>
<p>Our project contains one library that is needed for compilation of the executable file. To build the lib a new <em>CMakeLists.txt</em> was added to <em>/lib</em> and the <em>/lib</em> directory was added to the main CMakeLists.txt by:</p>
<pre>add_subdirectory(lib)</pre>
<p>The cmake library definition is pretty straightforward: we define the needed source files (through the <em>EXAMPLE_LIB_SRC</em> variable) and add a new shared library named &#8216;example-lib&#8217; to the build targets. The only &#8220;weird&#8221; thing is that we have to add the library to the linker flags manually (by setting <em>CMAKE_REQUIRED_LIBRARIES</em>): it would be nice if this could happen automatically.</p>
<pre># sources and linkage

# define the sources
set(EXAMPLE_LIB_SRC  lib_a.c lib_b.c)
add_library(example-lib SHARED ${QKD_APP_SRC})
target_link_libraries(example-lib ${CMAKE_REQUIRED_LIBRARIES})

# additional includes
include_directories(. ..)

# enable gcc specific stuff
if (CMAKE_COMPILER_IS_GNUCC)
    set_source_files_properties(${EXAMPLE_LIB_SRC} PROPERTIES COMPILE_FLAGS "-std=c99 -Werror -Wall -pedantic")
endif ()

set(CMAKE_REQUIRED_LIBRARIES "example-lib;${CMAKE_REQUIRED_LIBRARIES}")

# install
install(TARGETS example-lib LIBRARY DESTINATION lib)</pre>
<h1>Adding executables</h1>
<p>Now we add the executable file to the build. To achieve this we add a CMakeLists.txt to the <em>/bin</em> directory. Within it we define our executeable (consisting of <em>part_a.c</em> and <em>part_b.c</em>) and its compile flags. The <em>include</em> directive states where the compiler should search for header files. With the <em>install</em> command we define it&#8217;s final position when being installed as part of a package.</p>
<p>We also add a manual dependency of example-prog upon example-lib. Cmake now always builds example-lib before it attempts to build example-lib. Alas we still had to manually add the example-lib linker flags to <em>CMAKE_REQUIRED_LIBRARIES</em> at the <em>/lib</em> section</p>
<pre>include_directories(
    .
    ..
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_SOURCE_DIR}
    ${CMAKE_BINARY_DIR}
    ${CMAKE_SOURCE_DIR}/bin/
   )

# define the sources
set(EXAMPLE_SRC part_a.c part_b.c)

# define executable
add_executable(example-prog ${EXAMPLE_SRC})
target_link_libraries(example-prog ${CMAKE_REQUIRED_LIBRARIES})
add_dependencies(example-prog example-lib)

# compiler switches

# enable gcc specific stuff
if (CMAKE_COMPILER_IS_GNUCC)
    set_source_files_properties(${EXAMPLE_SRC} PROPERTIES COMPILE_FLAGS "-std=c99 -Werror -Wall -pedantic")
endif ()

# install binaries
install(TARGETS example-program RUNTIME DESTINATION bin)</pre>
<h1>Test it</h1>
<p>This would actually be a good time to test our build system. cmake supports two different ways of separating source code from build programs: out-of-tree builds and in-tree builds. With in-tree builds source code and generated files are always stored within the same project directories. This is the way of building that you might know from autotools. With out-of-tree builds all generated files are placed into a separated directory: this keeps your project directory clean (and you can do interesting stuff as speeding up build time by placing the out-of-tree build directory on a ramdrive/tmpfs). So we will try to do an out-of-tree build:</p>
<pre>$ cd $PROJECT_DIRECTORY
$ mkdir build
$ cd build
$ cmake ./..
$ make</pre>
<p>This will build all binaries within the <em>build</em> directory. Partey!</p>
<h1>Create debian and redhat packages</h1>
<p>We won&#8217;t distribute a tar-ball or plain pre-compiled binaries to our users but want distribution-specific packages. They provide a better user experience through features as dependency tracking (which other packages must be installed to run this program) or easy package management (install, reinstall, uninstall packages).</p>
<p>cmake provides <em>CPack</em> for package creation. To enable it our main <em>CMakeLists.txt</em> was adapted in the following way:</p>
<pre>set(CPACK_PACKAGE_DESCRIPTION "Do the example thingie")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A longer description about our example app.")
set(CPACK_PACKAGE_NAME "example-app")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (&gt;= 2.3.6), libgcc1 (&gt;= 1:4.1)")

set(CPACK_PACKAGE_CONTACT "Andreas Happe ")
set(CPACK_PACKAGE_VENDOR "Andreas Happe Inc.")
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "1")
set(VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")

set(CPACK_GENERATOR "DEB;RPM;")
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}-${CMAKE_SYSTEM_PROCESSOR}")

include(CPack)</pre>
<p>The variables contain package descriptions and version information that will be converted into the new packages meta-information. <em>CPACK_GENERATOR</em> specifies for which output types the generated packages should have. We have chosen DEB (Debian, Ubuntu) and RPM (Redhat, Suse, Fedora) packages to be generated. They should suffice for the vast majority of installed Linux distributions. We also added some package dependencies for debian distributions: this ensures that libc and libgcc1 will be installed with their correct versions before our package is installed.</p>
<p>To finally build our distribution packages just change into the build directory and enter <em>cpack</em>:</p>
<pre>$ cd build
$ cpack</pre>
<p>The resulting distribution packages will lie within the <em>build</em> directory.</p>
<p>Another advantage is that we can use those cpack variables throughout the whole <em>CMakeLists.txt</em> file. For example: instead of installing documentation files into a fixed directory through:</p>
<pre>set(DOC_PATH "share/doc/testprogram-0.1")</pre>
<p>we can install them into a properly versioned directory:</p>
<pre>set(DOC_PATH "share/doc/${CPACK_PACKAGE_NAME}-${VERSION}")</pre>
<h1>Add include files to distribution package</h1>
<p>Other programs might link against our <em>example-lib</em> but they will need some header files to learn about the lib&#8217;s available (exported) function signatures. To install them we add the &#8220;include&#8221; subdirectory to our build by adding the following to the main <em>CMakeLists.txt</em>:</p>
<pre>add_subdirectory(include)</pre>
<p>Now we need a &#8220;/include/CMakeLists.txt&#8221; that specifies which header files need to be installed into our distribution package. As we want this to happen for all existing header files we just add a catchall install statement:</p>
<pre>install(DIRECTORY example-lib-headers
        DESTINATION include
        FILES_MATCHING PATTERN "*.h"
                       PATTERN ".svn" EXCLUDE
       )</pre>
<p>This installs all &#8220;*.h&#8221; files (ie. header files) from the directory &#8220;/include/example-lib-headers&#8221; into the package&#8217;s <em>include</em> directory (which will later be installed into the system&#8217;s include files directories). Notice the <em>EXCLUDE</em>-pattern: as we are using Subversion as a SCM we do have various internal subversion files lying around in our source code tree. Those include copies of header files. Without this <em>EXCLUDE</em> those copies would also be installed into our distribution package what we do certainly not want.</p>
<h1>Add current subversion revision</h1>
<p>As all programs our example program contains bugs. To improve bug reports we want to include a reference to the exact subversion release this package was build from. This information should be included within the package meta-information as well as within the compiled program itself</p>
<p>First of all we need to gather the subversion revision information. To achieve this we utilize the <em>Subversion</em> module that is installed with cmake (you can find those modules under <em>/usr/share/cmake/modules*</em>, there are lots of useful tools within that directory). It&#8217;s configuration and usage within the main <em>CMakeLists.txt</em> can be seen in the following code snipplet:</p>
<pre>find_package(Subversion)
if(Subversion_FOUND)
  Subversion_WC_INFO(${CMAKE_CURRENT_SOURCE_DIR} ER)
  set(SUBVERSION_REVISION ${ER_WC_REVISION})
endif(Subversion_FOUND)</pre>
<p>Now we have the current subversion revision stored within the <em>SUBVERSION_REVISION</em> variable and can easily use it to set our packages patch level (the patch level is the most insignificant part of the whole package version):</p>
<pre>set(CPACK_PACKAGE_VERSION_PATCH "${SUBVERSION_REVISION}")</pre>
<p>To reference this information from within a compiled program we want a header file that contains a <em>#define</em> that acts as a placeholder for the current subversion revision string. To achieve this we utilize the cmake <em>configure_file</em> directive. The directive states a source and a destination file: the source file is read, processed and stored as the stated destination file. During processing all cmake variables can be accessed and output into the destination file, ie.:</p>
<pre>configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/revision.h.in ${CMAKE_CURRENT_BINARY_DIR}/revision.h)</pre>
<p>With an <em>config.h.in</em> file of:</p>
<pre>#ifndef __REVISION_H
#define __REVISION_H
#define SVN_REVISION "${SUBVERSION_REVISION}"
#endif</pre>
<p>The cmake variable <em>SUBVERSION_REVISION</em> is used as value for the <em>SVN_REVISION</em> #define. The <em>#ifndef</em> guards are just thrown in for good style and are not mandatory.</p>
<h1>Automatically create man pages/documentation with Doxygen</h1>
<p>We can utilize the same <em>configure_file</em>-mechanism to automatically generate documentation through <a href="http://www.doxygen.org/">Doxygen</a>. We already have a doxygen file describing the documentation extraction but need to adapt it to the actual build directory, ie:</p>
<pre>PROJECT_NAME           = ${CPACK_PACKAGE_NAME}
PROJECT_NUMBER         = ${VERSION}
OUTPUT_DIRECTORY       = api-doc
INPUT                  = ${CMAKE_CURRENT_SOURCE_DIR}</pre>
<p>Now we need to include Doxygen within our build configuration. We achieve this through including the following into our main <em>CMakeLists.txt</em>:</p>
<pre># check if doxygen is even installed
find_package(Doxygen)
if (DOXYGEN_FOUND STREQUAL "NO")
    message(FATAL_ERROR "Doxygen not found. Please get a copy http://www.doxygen.org")
endif (DOXYGEN_FOUND STREQUAL "NO")

# prepare doxygen configuration file
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)

# add doxygen as target
add_custom_target(doxygen ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)

# cleanup $build/api-doc on "make clean"
set_property(DIRECTORY APPEND PROPERTY
	     ADDITIONAL_MAKE_CLEAN_FILES api-doc)

# add doxygen as dependency to doc-target
get_target_property(DOC_TARGET doc TYPE)
if(NOT DOC_TARGET)
	add_custom_target(doc)
endif()
add_dependencies(doc doxygen)

# install HTML API documentation and manual pages
set(DOC_PATH "share/doc/${CPACK_PACKAGE_NAME}-${VERSION}")

install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/api-doc/html
         DESTINATION ${DOC_PATH}
       )

# install man pages into packages, scope is now project root..
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/api-doc/man/man3
         DESTINATION share/man/man3/
       )</pre>
<p>First of all we verify that Doxygen is even installed. Afterwards we automatically adopt the Doxygen.in configuration file to our needs (<em>configure_file</em>). This makes sure that generated documentation is always placed within the <em>build</em> directory. To make sure that current documentation is always available we add a custom target called &#8220;doxygen&#8221; and let the &#8220;doc&#8221; target depend upon it. The &#8220;doc&#8221; target will automatically be called after compiling and through the dependence doxygen will be called then too. In addition we add the &#8220;api-doc&#8221; directory (which will contain all generated files as specified within <em>Doxygen.in</em>) to the lsit of files that should be removed after a &#8220;make clean&#8221; run.</p>
<p>This is sufficient to create documentation but we also want it to appear within the generated distribution packages. The two <em>install</em> statements at the end achieve exactly that: they install HTML documentation into the official /usr/share/doc/ directory and generated man pages into their corresponding directories.</p>
<h1>Add some optional parts</h1>
<p>So far our build environment has been pretty monolithic: it always builds everything. Sometimes you do not want that as some features are only needed in special circumstances. As an example we do not want to add header files to the distribution package all the time.</p>
<p>Optional features are supported by <em>cmake</em> through the <em>option</em> statement. An option consists of a variable name and a short description. The user is displayed the option description and if he enables it the option variable is set. A short example illustrates this far better:</p>
<pre>option(ADD_INCLUDE_FILES "Add include files to the generated distribution packages")
if (ADD_INCLUDE_FILES)
    add_subdirectory(include)
else(ADD_INCLUDE_FILES)
    message(WARNING "include files will not be included within the distribution packages")
endif(ADD_INCLUDE_FILES)</pre>
<p>The include directory is only processed if the user selects the option. But how can an user actually enable an option? cmake provides various user interfaces, i prefer the ncurses-based ccmake:</p>
<pre>$ cd build
$ ccmake ./..
# enable the wanted options and build it afterwards..
$ make</pre>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/04/01/howto-use-cmake-with-cc-projects/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Nikon D40 NEF/RAW images with Linux</title>
		<link>http://snikt.net/index.php/2010/03/03/nikon-d40-nefraw-images-with-linux</link>
		<comments>http://snikt.net/index.php/2010/03/03/nikon-d40-nefraw-images-with-linux#comments</comments>
		<pubDate>Wed, 03 Mar 2010 18:30:10 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Desktop-related]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://snikt.net/?p=504</guid>
		<description><![CDATA[Caveat: I&#8217;m not too much into photography so everything I posted here might be wrong. It&#8217;s just my opinion as an end-user. I&#8217;ve bought myself a Nikon D40 some time ago and finally had enough spare time to shoot some images and post-process them. My environment of choice is Ubuntu Linux so the obvious image [...]]]></description>
			<content:encoded><![CDATA[<p><em>Caveat: I&#8217;m not too much into photography so everything I posted here might be wrong. It&#8217;s just my opinion as an end-user.</em></p>
<p>I&#8217;ve bought myself a <a href="http://www.dpreview.com/reviews/nikond40/">Nikon D40</a> some time ago and finally had enough spare time to shoot some images and post-process them. My environment of choice is <a href="http://www.ubuntu.com">Ubuntu Linux</a> so the obvious image management/edit tools were <a href="http://www.gimp.org">gimp</a> and <a href="http://www.f-spot.org">f-spot</a>.</p>
<p>An first attempt did show some strange behaviour: f-spot did display NEF/RAW images quite different than gimp. It seems as if the (gimp) NEF import step did something to the white-balance and gamma so that imported images did look worse. The worst thing is: while f-spot does display beautiful images it is not able to export them to a more sharable format as JPEG.</p>
<p>GIMP is using ufraw to convert the NEF images, after playing with its parameters I&#8217;ve discovered that using a downloaded color profile for the D40 and some custom Gamma and Continuity values does provice a near approximation of the f-spot results. The used values are:</p>
<table>
<tbody>
<tr>
<th>Gamma</th>
<td>0.4</td>
</tr>
<tr>
<th>Continuity</th>
<td>0.01-0.04</td>
</tr>
<tr>
<th>ICC</th>
<td><a href="http://ufraw.sourceforge.net/Colors/nkx-d40.icm">got it here</a></td>
</tr>
<tr>
<th>White-Balance</th>
<td>use camera</td>
</tr>
</tbody>
</table>
<p>A drawback of using ufraw is it&#8217;s slow processing speed. Interestingly using <em>ufraw-batch</em> on the command line does not exhibit this problem, so just use:</p>
<pre>ufraw-batch --gamma 0.4 --contuinity 0.02 --wb=camera *.NEF</pre>
<p>While not being a problem at all, this is something that should work out-of-the-box, ie. the user should not be irritated by photos being displayed differently between applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/03/03/nikon-d40-nefraw-images-with-linux/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generating PDFs from Ruby on Rails</title>
		<link>http://snikt.net/index.php/2010/03/03/generating-pdfs-from-ruby-on-rails</link>
		<comments>http://snikt.net/index.php/2010/03/03/generating-pdfs-from-ruby-on-rails#comments</comments>
		<pubDate>Wed, 03 Mar 2010 12:25:45 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[adobe pdf]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[prawn]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[wicked_pdf]]></category>
		<category><![CDATA[wkthmltopdf]]></category>

		<guid isPermaLink="false">http://snikt.net/?p=491</guid>
		<description><![CDATA[The problem Ruby on Rails provides various helpers for generating dynamic web content but sometimes you need documents that users can easily store and share between them. The ubiquitous file format for this is Adobe PDF nowadays. The common solution fro this problem is Prawn [github, introduction]. Alas it requires a custom DSL for document description, no [...]]]></description>
			<content:encoded><![CDATA[<h2>The problem</h2>
<p><a href="http://rubyonrails.org/">Ruby on Rails</a> provides various helpers for generating dynamic web content but sometimes you need documents that users can easily store and share between them. The ubiquitous file format for this is <a href="http://en.wikipedia.org/wiki/Adobe_PDF">Adobe PDF</a> nowadays.</p>
<p>The common solution fro this problem is Prawn [<a href="http://wiki.github.com/sandal/prawn/">github</a>, <a href="http://railscasts.com/episodes/153-pdfs-with-prawn">introduction</a>]. Alas it requires a custom DSL for document description, no existing Rails views or partials can be reused. An alternative is <a href="http://www.princexml.com/">princeXML</a> which transforms HTML/CSS into pdf through an external binary. This would allow reuse of existing templates and knowledge (think CSS designers) but has the downside of its price tag of $3800.</p>
<h2>The solution</h2>
<p>Enters <a href="http://github.com/mileszs/wicked_pdf">wicked_pdf</a>: it utilizes <a href="http://code.google.com/p/wkhtmltopdf/">wkhtmltopdf</a> to create a PDF document from a Rails HTML template. HTML rendering is done through the well-known webkit-engine. This allows developers to do PDFs in the right way™: define the document&#8217;s structure through a simple HTML document and theme them through CSS. You&#8217;ll get the automatic benefit of themability: exchange the CSS and you have another format. There are also lots of CSS artists out there that can supply you with different designs.</p>
<p><span id="more-491"></span></p>
<p>I&#8217;ve used this solution with a test Ruby on Rails 3.0-beta application, the steps involved were:</p>
<h3>Install <em>wkhtmltopdf:</em></h3>
<p><strong><span style="font-weight: normal; font-size: 13px;">This program will convert the HTML into the PDF format. To make it work you&#8217;ll need at least version 0.9 which isn&#8217;t installed in Ubuntu 9.10 by default. Just download the <a href="http://code.google.com/p/wkhtmltopdf/downloads/list">static compiled version</a> from the <a href="http://code.google.com/p/wkhtmltopdf/downloads/list">wkhtmltopdf website</a> and place it under <em>/usr/local/bin</em>. </span></strong></p>
<h3>Install the wicked_pdf plugin:</h3>
<p>Just install it in the usual Rails way:</p>
<pre>git submodule add ﻿git://github.com/mileszs/wicked_pdf.git vendor/plugins/wicked_pdf</pre>
<p>Additionally a sample configuration file is needed. You could use the plugin&#8217;s generator script for it but alas this didn&#8217;t work for me with Rails 3.0. Let&#8217;s just copy it form the plugin&#8217;s directory into config/initializers.</p>
<pre>$ cp vendor/plugins/wicked_pdf/generators/wicked_pdf/templates/wicked_pdf.rb config/initializers</pre>
<p>and alter the wkhtmltopdf path within it:</p>
<pre>  WICKED_PDF = {
       :exe_path =&gt; '/usr/local/bin/wkhtmltopdf-amd64'
  }</pre>
<h3>﻿﻿Add pdf instructions to your controller..</h3>
<p>For example I&#8217;m using the <em>invoice#index</em> action to render a simple PDF document.</p>
<pre>  format.pdf do
          @example_text = "some text"
          render :pdf =&gt; "file_name",
                 :template =&gt; 'offers/show.pdf.erb',
                 :layout =&gt; 'pdf',
                 :footer =&gt; {
                    :center =&gt; "Center",
                    :left =&gt; "Left",
                    :right =&gt; "Right"
                 }
  end</pre>
<p>We are rendering the view with a predefined footer containing some sample &#8220;center&#8221;, &#8220;left&#8221; and &#8220;right&#8221; strings. The <em>render :pdf</em> call has various options which can be seen on the wicked_pdf homepage.</p>
<h3>.. and create PDF templates</h3>
<p>The other half of the PDF templates is the view code consisting of a special layout and template for pdf generation.</p>
<p>The layout (<em>app/views/layouts/pdf.html.erb</em>) resembles a normal Ruby on Rails layout file:</p>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
    &lt;%= wicked_pdf_stylesheet_link_tag "pdf" %&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="content"&gt;
      &lt;%= yield %&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>The view code should not be too surprising, just place it under <em>app/views/offers/index.pdf.erb</em> :</p>
<pre>&lt;div id="someid"&gt;&lt;%= @example_text %&gt;&lt;/div&gt;</pre>
<p>Lets also create a simple CSS file (<span style="font-style: normal;"><em>public/stylesheets/pdf.css</em></span><span style="font-style: normal;">):</span></p>
<pre>#someid {
  margin-left: 430px;
  display: float;
  height: 150px;
  background-color: green;
  width: 250px;
}</pre>
<p><span style="font-style: normal;"> </span></p>
<p>This is the whole rendering code.</p>
<h3>Reference the PDF view and download it</h3>
<p><span style="font-style: normal;">We still need a reference to the newly created rendernig link, we can easily create this through:</span></p>
<pre><span style="font-style: normal;">link_to 'Create PDF document', invoice_path(@invoice, :format =&gt; :pdf)</span></pre>
<p><span style="font-style: normal;">When the link is clicked a pdf document will be generated and downloaded.</span></p>
<h2>Conclusion</h2>
<p>wicked_pdf allows easy pdf generation in a very Ruby on Rails&#8217; way. It&#8217;s free, it works and is easy to employ..</p>
<p><span style="font-style: normal;">..but not everything is perfect within the wicked_pdf world, especially error handlnig is lacking sometimes. When you&#8217;ve debugging initial problems you can expect the only error feedback to be a HTTP return code of 406. Just start with limited controller (rendering) options and double check that you&#8217;ve referenced the right view and layout paths and you should be fine.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/03/03/generating-pdfs-from-ruby-on-rails/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Smoking..</title>
		<link>http://snikt.net/index.php/2010/02/01/smoking</link>
		<comments>http://snikt.net/index.php/2010/02/01/smoking#comments</comments>
		<pubDate>Mon, 01 Feb 2010 19:08:50 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://snikt.net/?p=472</guid>
		<description><![CDATA[I&#8217;m within my sixth week of non-smoking, it gets better but still I do feel the urge to smoke sometimes, restrained only by the knowledge that I&#8217;ll become hooked again as soon as I lighten up another one. The permanent cravings  are gone, conversations with smokers tend to be strain my will but are easily [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m within my sixth week of non-smoking, it gets better but still I do feel the urge to smoke sometimes, restrained only by the knowledge that I&#8217;ll become hooked again as soon as I lighten up another one.</p>
<p>The permanent cravings  are gone, conversations with smokers tend to be strain my will but are easily survivable. Standing in the blue smoke still tempts.</p>
<p>But why? I don&#8217;t even like the taste. I&#8217;ve left behind the illusion that smoking calmes me down or teaches me how to breathe more slowly. My in-official title for smokers, suicidal ﻿misanthrope, remains to sound good. Temptation arises from time to time.</p>
<p>Slowly I understand those aggressive ex-smokers. Through a general smoking ban temptations would get rarer. Distrusting collectivism and state-imposed regulations my non-smoking gets a game against myself: do I need higher interventions to finally quit?</p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/02/01/smoking/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Howto integrate Skype and Ubuntu&#8217;s indicator-applet</title>
		<link>http://snikt.net/index.php/2010/01/21/howto-integrate-skype-and-ubuntus-indicator-applet</link>
		<comments>http://snikt.net/index.php/2010/01/21/howto-integrate-skype-and-ubuntus-indicator-applet#comments</comments>
		<pubDate>Thu, 21 Jan 2010 16:41:10 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Desktop-related]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[indication-applet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[notifications]]></category>
		<category><![CDATA[skype]]></category>

		<guid isPermaLink="false">http://happiness-is-slavery.net/?p=457</guid>
		<description><![CDATA[Computers provide users with various communication channels (as facebook, twitter, chat programs like ICQ, jabber, Skype). Each channel usually provides an own program for interacting with other users using that channel. To prevent users from being overwhelmed Ubuntu added the notifier-applet. It unifies all different communication notifications into one simple panel applet. I am using [...]]]></description>
			<content:encoded><![CDATA[<p>Computers provide users with various communication channels (as facebook, twitter, chat programs like ICQ, jabber, Skype). Each channel usually provides an own program for interacting with other users using that channel. To prevent users from being overwhelmed Ubuntu added the <a title="Plans for the MessagingMenu within Ubuntu" href="https://wiki.ubuntu.com/MessagingMenu/">notifier-applet</a>. It unifies all different communication notifications into one simple panel applet.</p>
<p>I am using <a title="skype for linux" href="http://share.skype.com/sites/linux/">Skype</a> for most of my online communication, mostly because other people are using it and there are strange firewalls at work preventing most other protocols. Alas there&#8217;s no support for Skype out of the box and the skype linux crew is kinda slow (Skype 2.1, anyone?). Enters me who needed some diversion from master thesis writing..</p>
<div id="attachment_454" class="wp-caption alignright" style="width: 310px"><a href="http://happiness-is-slavery.net/wp-content/uploads/2010/01/screenshot.jpg"><img class="size-medium wp-image-454" title="Screenshot of the Indicator-Applet Skype plugin" src="http://happiness-is-slavery.net/wp-content/uploads/2010/01/screenshot-300x191.jpg" alt="Screenshot of the Indicator-Applet Skype plugin" width="300" height="191" /></a><p class="wp-caption-text">indicator-applet with skype</p></div>
<p>May I introduce <a title="indicator plugin for skype" href="http://github.com/andreashappe/indicator-applet-skype">indicator-skype-client.py</a>: it&#8217;s a small script, written in two or three hours (most of the time spent upon finding strange bugs in python-indicate). It currently provides a list of unread messages. When a username is clicked the corresponding skype window is opened or created. By clicking on the Skype label its main window is displayed. So far it works.. various updates will follow.</p>
<p><strong>How to install?</strong><br />
Just start the python script while skype is already running. Skype will ask if you want to allow the script to access its data, just answer yes. The script will do the rest. It does not install itself into the user session, so you&#8217;ll have to start it if you want skype notifications.</p>
<p><strong>TODOs</strong></p>
<ul>
<li>There are various workarounds in the code (for example I needed an empty callback to get things displayed), work out those bugs</li>
<li>currently there&#8217;s a hard refresh every 5 seconds (in addition to incoming message detection). This will have to go and be replaced with a more dynamic scheme.</li>
<li>detect if an unread conversation was openend within Skype and do not display this conversation</li>
<li>somehow automatically start the script when Skype or the indication-applet starts</li>
</ul>
<p>So some things are missing, but the script is already workable. Have fun (and please provide patches if you fix problems (: ).</p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2010/01/21/howto-integrate-skype-and-ubuntus-indicator-applet/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>blog is moving</title>
		<link>http://snikt.net/index.php/2009/10/26/blog-is-moving</link>
		<comments>http://snikt.net/index.php/2009/10/26/blog-is-moving#comments</comments>
		<pubDate>Mon, 26 Oct 2009 12:28:18 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Admin-stuff]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://happiness-is-slavery.net/?p=447</guid>
		<description><![CDATA[Or rather evolving into a new system. I just haven&#8217;t enough time at my hands to create regular blog posts. This might change after my master thesis will eventually be finished but letting a web page lying dormant ain&#8217;t best style. As I was down with the flu the last days I wrote a small [...]]]></description>
			<content:encoded><![CDATA[<p>Or rather evolving into a new <a href="http://github.com/andreashappe/narcissism">system</a>.</p>
<p>I just haven&#8217;t enough time at my hands to create regular blog posts. This might change after my master thesis will eventually be finished but letting a web page lying dormant ain&#8217;t best style.</p>
<p>As I was down with the flu the last days I wrote a small replacement system: it&#8217;s just around 150 lines of rails code that captures my twitter feed and allows me to write write longer posts/memos.</p>
<p>The idea is that tweets are aggregated through the day and presented as formatted RSS feed (so there should be no RSS spamming). Longer stuff (as the typical &#8220;how did I get x working under Linux&#8221; things that happen from time to time) will be integrated with the tweets (yeah, not done yet).</p>
<p>After all coding it was pretty straightforward and fun.. the only drawback is that the RSS feed URL will change, ie. your newsreader will loose my feed.</p>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2009/10/26/blog-is-moving/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>another month has passed..</title>
		<link>http://snikt.net/index.php/2009/09/25/another-month-has-passed</link>
		<comments>http://snikt.net/index.php/2009/09/25/another-month-has-passed#comments</comments>
		<pubDate>Fri, 25 Sep 2009 11:41:04 +0000</pubDate>
		<dc:creator>andy</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[University]]></category>

		<guid isPermaLink="false">http://happiness-is-slavery.net/?p=445</guid>
		<description><![CDATA[Time flies by.. the last six week were more of the same: master thesis and other smallish stuff. The master thesis is getting along nicely albeit slow. At least I&#8217;ve got the first credentials for the practical part (Praktikum in German) now the two missing things are the Seminar and the Thesis itself. The later [...]]]></description>
			<content:encoded><![CDATA[<p>Time flies by.. the last six week were more of the same: master thesis and other smallish stuff. The master thesis is getting along nicely albeit slow. At least I&#8217;ve got the first credentials for the practical part (Praktikum in German) now the two missing things are the Seminar and the Thesis itself. The later is currently around 95pages, its content slowly gets in shape. I still hope to finish somewhere around the middle of October.</p>
<p>I&#8217;ve just discovered an expired life insurance plan which will be reinvested into new stocks. Over the last year I had loses in the one-digit percent range, let&#8217;s see how the next year goes.</p>
<p>So far life&#8217;s good, I&#8217;m stocked up on concert tickets again. You can find me at the following shows:</p>
<table border="0">
<tbody>
<tr>
<th>Date</th>
<th>Location</th>
<th>Band</th>
</tr>
<tr>
<td>26.10.</td>
<td>Arena</td>
<td>Dredg</td>
</tr>
<tr>
<td>4.11.</td>
<td>Porgy&amp;Bess</td>
<td>Max Herre</td>
</tr>
<tr></tr>
<tr>
<td>8.11.</td>
<td>Szene</td>
<td>Blumentopf</td>
</tr>
<tr>
<td>10.11.</td>
<td>Arena</td>
<td>White Lies</td>
</tr>
<tr>
<td>22.11.</td>
<td>Flex</td>
<td>Silversun Pickups</td>
</tr>
<tr>
<td>29.11.</td>
<td>Gasometer</td>
<td>Alice In Chains</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://snikt.net/index.php/2009/09/25/another-month-has-passed/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
