<?xml version="1.0" encoding="utf-8" ?>

<rdf:RDF 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns="http://my.netscape.com/rdf/simple/0.9/">
<channel>
    <title></title>
    <link>http://wersdoerfer.com/~jochen/s9y/</link>
    <description></description>
    <dc:language>de</dc:language>

    <image rdf:resource="http://wersdoerfer.com/~jochen/s9y/templates/bulletproof/img/s9y_banner_small.png" />

    <items>
      <rdf:Seq>
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/109-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/74-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/73-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/72-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/71-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/70-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/69-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/68-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/67-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/66-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/65-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/41-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/64-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/48-guid.html" />
        <rdf:li resource="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/63-guid.html" />
      </rdf:Seq>
    </items>
</channel>

<image rdf:about="http://wersdoerfer.com/~jochen/s9y/templates/bulletproof/img/s9y_banner_small.png">
        <url>http://wersdoerfer.com/~jochen/s9y/templates/bulletproof/img/s9y_banner_small.png</url>
        <title>RSS:  - </title>
        <link>http://wersdoerfer.com/~jochen/s9y/</link>
        <width>100</width>
        <height>21</height>
    </image>


<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/109-guid.html">
    <title>spectral clustering with python</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/109-spectral-clustering-with-python.html</link>
    <description>
    &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=290&amp;amp;entry_id=109&quot;  onmouseover=&quot;window.status=&#039;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.19.8100&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;Paper on Citeseer&quot;&gt;Spectral Clustering&lt;/a&gt; is a method to cluster data, where the clusters are non-convex. Having read the chapter (14.5.3 page 544) about spectral clustering in the recently released second edition of &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=291&amp;amp;entry_id=109&quot;  onmouseover=&quot;window.status=&#039;http://www-stat.stanford.edu/~tibs/ElemStatLearn/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;ELSII fulltext pdf available&quot;&gt;Elements of Statistical Learning II&lt;/a&gt;, i tried to reproduce figure 14.29 using only python and &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=292&amp;amp;entry_id=109&quot;  onmouseover=&quot;window.status=&#039;http://www.scipy.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;scipy homepage&quot;&gt;Scipy&lt;/a&gt;/&lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=293&amp;amp;entry_id=109&quot;  onmouseover=&quot;window.status=&#039;http://matplotlib.sourceforge.net/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;matplotlib homepage&quot;&gt;Matplotlib&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
Well, the &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=294&amp;amp;entry_id=109&quot;  onmouseover=&quot;window.status=&#039;http://www.r-project.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;r-project homepage&quot;&gt;r&lt;/a&gt;-version still looks better, but it&#039;s quite possible to get similar results in python. Here&#039;s the figure:
&lt;br/&gt;&lt;br/&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 617px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:131 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;617&quot; height=&quot;567&quot;  src=&quot;http://wersdoerfer.com/~jochen/s9y/uploads/spectral_clustering.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;I tried to use the same parameters as in the book.&lt;/div&gt;&lt;/div&gt;
&lt;br/&gt;
The final clustering via &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=295&amp;amp;entry_id=109&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/K-means_clustering&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;kmeans wikipedia page&quot;&gt;kmeans&lt;/a&gt; is not very stable. Sometimes it works and sometimes it doesn&#039;t. Maybe you have to run kmeans multiple times and choose the best run, but since this is done for demonstration purposes only, it&#039;s not a big deal.
&lt;br/&gt;&lt;br/&gt;
Here&#039;s the full python-source:
&lt;br/&gt;
&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;
#!/usr/bin/python

import sys

import numpy as np
import matplotlib.pyplot as plt

from scipy.linalg import eig
from scipy.cluster.vq import kmeans2
from scipy.sparse.linalg import eigen
from scipy.spatial.kdtree import KDTree

def get_noise(stddev=0.25, numpoints=150):
    # 2d gaussian random noise
    x = np.random.normal(0, stddev, numpoints)
    y = np.random.normal(0, stddev, numpoints)
    return np.column_stack((x, y))

def get_circle(center=(0.0, 0.0), r=1.0, numpoints=150):
    # use polar coordinates to get uniformly distributed points
    step = np.pi * 2.0 / numpoints
    t = np.arange(0, np.pi * 2.0, step)
    x = center[0] + r * np.cos(t)
    y = center[1] + r * np.sin(t)
    return np.column_stack((x, y))

def radial_kernel(c=1.5):
    def inner(a, b):
        d = a - b
        return np.exp((-1 * (np.sqrt(np.dot(d, d.conj()))**2)) / c)
    return inner

def circle_samples():
    circles = []
    for radius in (1.0, 2.8, 5.0):
        circles.append(get_circle(r=radius) + get_noise())
    return np.vstack(circles)

def mutual_knn(points, n=10, distance=radial_kernel()):
    knn = {}
    kt = KDTree(points)
    for i, point in enumerate(points):
        # cannot use euclidean distance directly
        for neighbour in kt.query(point, n + 1)[1]:
            if i != neighbour:
                knn.setdefault(i, []).append(
                    (distance(point, points[neighbour]), neighbour))
    return knn

def get_distance_matrix(knn):
    n = len(knn)
    W = np.zeros((n, n))
    for point, nearest_neighbours in knn.iteritems():
        for distance, neighbour in nearest_neighbours:
            W[point][neighbour] = distance
    return W

def rename_clusters(idx):
    # so that first cluster has index 0
    num = -1
    seen = {}
    newidx = []
    for id in idx:
        if id not in seen:
            num += 1
            seen[id] = num
        newidx.append(seen[id])
    return np.array(newidx)

def cluster_points(L):
    # sparse eigen is a little bit faster than eig
    #evals, evcts = eigen(L, k=15, which=&quot;SM&quot;)
    evals, evcts = eig(L)
    evals, evcts = evals.real, evcts.real
    edict = dict(zip(evals, evcts.transpose()))
    evals = sorted(edict.keys())
    # second and third smallest eigenvalue + vector
    Y = np.array([edict[k] for k in evals[1:3]]).transpose()
    res, idx = kmeans2(Y, 3, minit=&#039;random&#039;)
    return evals[:15], Y, rename_clusters(idx)

def change_tick_fontsize(ax, size):
    for tl in ax.get_xticklabels():
        tl.set_fontsize(size)
    for tl in ax.get_yticklabels():
        tl.set_fontsize(size)

def get_colormap():
    # map cluster label to color (0, 1, 2) -&gt; (orange, blue, green)
    from matplotlib.colors import ListedColormap
    orange = (0.918, 0.545, 0.0)
    blue = (0.169, 0.651, 0.914)
    green = (0.0, 0.58, 0.365)
    return ListedColormap([orange, blue, green])

def plot_circles(ax, points, idx, colormap):
    plt.scatter(points[:,0], points[:,1], s=10, c=idx, cmap=colormap,
        alpha=0.9, facecolors=&quot;none&quot;)
    plt.xlabel(&quot;x1&quot;, fontsize=8)
    plt.ylabel(&quot;x2&quot;, fontsize=8)
    change_tick_fontsize(ax, 8 )
    plt.ylim(-6, 6)
    plt.xlim(-6, 6)

def plot_eigenvalues(ax, evals):
    plt.scatter(np.arange(0, len(evals)), evals,
        c=(0.0, 0.58, 0.365), linewidth=0)
    plt.xlabel(&quot;Number&quot;, fontsize=8)
    plt.ylabel(&quot;Eigenvalue&quot;, fontsize=8)
    plt.axhline(0, ls=&quot;--&quot;, c=&quot;k&quot;)
    change_tick_fontsize(ax, 8 )

def plot_eigenvectors(ax, Y, idx, colormap):
    from matplotlib.ticker import MaxNLocator
    from mpl_toolkits.axes_grid import make_axes_locatable
    divider = make_axes_locatable(ax)
    ax2 = divider.new_vertical(size=&quot;100%&quot;, pad=0.05)
    fig1 = ax.get_figure()
    fig1.add_axes(ax2)
    ax2.set_title(&quot;Eigenvectors&quot;, fontsize=10)
    ax2.scatter(np.arange(0, len(Y)), Y[:,0], s=10, c=idx, cmap=colormap,
        alpha=0.9, facecolors=&quot;none&quot;)
    ax2.axhline(0, ls=&quot;--&quot;, c=&quot;k&quot;)
    ax2.yaxis.set_major_locator(MaxNLocator(4))
    ax.yaxis.set_major_locator(MaxNLocator(4))
    ax.axhline(0, ls=&quot;--&quot;, c=&quot;k&quot;)
    ax.scatter(np.arange(0, len(Y)), Y[:,1], s=10, c=idx, cmap=colormap,
        alpha=0.9, facecolors=&quot;none&quot;)
    ax.set_xlabel(&quot;index&quot;, fontsize=8)
    ax2.set_ylabel(&quot;2nd Smallest&quot;, fontsize=8)
    ax.set_ylabel(&quot;3nd Smallest&quot;, fontsize=8)
    change_tick_fontsize(ax, 8 )
    change_tick_fontsize(ax2, 8 )
    for tl in ax2.get_xticklabels():
        tl.set_visible(False)

def plot_spec_clustering(ax, Y, idx, colormap):
    plt.title(&quot;Spectral Clustering&quot;, fontsize=10)
    plt.scatter(Y[:,0], Y[:,1], c=idx, cmap=colormap, s=10, alpha=0.9,
        facecolors=&quot;none&quot;)
    plt.xlabel(&quot;Second Smallest Eigenvector&quot;, fontsize=8)
    plt.ylabel(&quot;Third Smallest Eigenvector&quot;, fontsize=8)
    change_tick_fontsize(ax, 8 )

def plot_figure(points, evals, Y, idx):
    colormap = get_colormap()
    fig = plt.figure(figsize=(6, 5.5))

    fig.subplots_adjust(wspace=0.4, hspace=0.3)
    ax = fig.add_subplot(2, 2, 1)
    plot_circles(ax, points, idx, colormap)

    ax = fig.add_subplot(2, 2, 2)
    plot_eigenvalues(ax, evals)

    ax = fig.add_subplot(2, 2, 3)
    plot_eigenvectors(ax, Y, idx, colormap)

    ax = fig.add_subplot(2, 2, 4)
    plot_spec_clustering(ax, Y, idx, colormap)

    plt.show()

def main(args):
    points = circle_samples()
    knn_points = mutual_knn(points)
    W = get_distance_matrix(knn_points)
    G = np.diag([sum(Wi) for Wi in W])

    # unnormalized graph Laplacian
    L = G - W
    evals, Y, idx = cluster_points(L)

    plot_figure(points, evals, Y, idx)

if __name__ == &quot;__main__&quot;:
    main(sys.argv)
&lt;/pre&gt;
&lt;br/&gt;
The plotting part is quite messy and i had to learn some ugly details about the matplotlib-api. If it&#039;s possible to do this in a simpler way, please let me know. With the mac os x binary, the source should work out of the box. On Ubuntu, i had to recompile matplotlib, which is another thing that you shouldn&#039;t do if you can avoid it (major pain in the ass). 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    machine learning, </dc:subject>
    <dc:date>2009-11-09T18:59:05Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=109</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=109</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/74-guid.html">
    <title>more on less</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/74-more-on-less.html</link>
    <description>
    When you view text files in less, sometimes you can simply
triple-click on a line and it just gets marked as a whole.
But sometimes, only the first viewable line on your terminal
gets marked and the rest of the real line is omitted. Well,
for me this is often quite frustrating, because i usually
have to copy&amp;paste large sql-statements which won&#039;t fit on
one visible line. After playing around with this obstacle, i figured
out that if you only use page-down to browse in a file, every triple
click will mark the whole line. If you use page-up, then only the
visible line gets marked... if you use page-down again, everything
works like before. Hmm, really strange - maybe it&#039;s a bug, a feature,
or both... can&#039;t decide... 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    rant, </dc:subject>
    <dc:date>2009-03-14T00:13:50Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=74</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=74</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/73-guid.html">
    <title>playing around with binary classification part 1</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/73-playing-around-with-binary-classification-part-1.html</link>
    <description>
    &lt;h4&gt;binary classification&lt;/h4&gt;
The goal in &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=286&amp;amp;entry_id=73&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Binary_classification&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;binary classification - wikipedia&quot;&gt;binary classification&lt;/a&gt; is 
to take an input vector &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20%5Cvec%7Bx%7D&quot; title=&quot;\Large \vec{x}&quot; alt=&quot;\Large \vec{x}&quot; \/&gt; and to assign it to one of two discrete classes &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20C&quot; title=&quot;\Large C&quot; alt=&quot;\Large C&quot; \/&gt; where &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20C%20%5Cin%20%5C%7B-1%2C%201%5C%7D&quot; title=&quot;\Large C \in \{-1, 1\}&quot; alt=&quot;\Large C \in \{-1, 1\}&quot; \/&gt;. Given some training sample of vectors each labeled -1 or 1, the aim is to learn a discriminant function, which predicts the correct label for previously unseen vectors. Filtering spam is probably the most studied example of binary classification in practice. A linear discriminant function is easily obtained by taking a linear function of the input vectors:
&lt;p/&gt;
&lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20f%28x%29%20%3D%20w%5ET%20x%20%2B%20b&quot; title=&quot;\Large f(x) = w^T x + b&quot; alt=&quot;\Large f(x) = w^T x + b&quot; \/&gt;
&lt;p/&gt;
Vector w is called the weight vector and b is the bias. The sign of &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20f%28x%29&quot; title=&quot;\Large f(x)&quot; alt=&quot;\Large f(x)&quot; \/&gt; determines the class of an input vector &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20%5Cvec%7Bx%7D&quot; title=&quot;\Large \vec{x}&quot; alt=&quot;\Large \vec{x}&quot; \/&gt;.

&lt;h4&gt;example python source&lt;/h4&gt;
To make things even more simple, let&#039;s assume that the vectors in the training sample have only two dimensions and are more or less linear seperable, so that we can use a simple line to distinguish between both classes. Let&#039;s see how far we can get with a few lines of python and &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=287&amp;amp;entry_id=73&quot;  onmouseover=&quot;window.status=&#039;http://www.scipy.org/PyLab&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;pylab homepage&quot;&gt;pylab/matplotlib&lt;/a&gt;. Well, ok here&#039;s a small script to generate a random line and make it visible:

&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;
from random import random
from math import sqrt
from pylab import plot, show, axis

def dot(x, y):
    # return inner product for x and y
    return sum(i * j for i, j in zip(x, y))

def normalize(x):
    # return unit length version of x in euclidean space
    norm = 1.0 / sqrt(sum(i**2 for i in x))
    return [i * norm for i in x]

def get_random_line(p0, width, height):
    # given p0, return a random line through p0 in normal form wx - b = 0

    # get a random point from the square-area around p0 - lower left
    # corner is (0, 0) upper right corner is (width, height)
    p1 = (random() * width, random() * height)

    # direction vector
    v = (p0[0] - p1[0], p0[1] - p1[1])

    # w is orthogonal to v and has unit length
    w = normalize((v[1], -v[0]))

    # wx - b = 0 is true for every point lying on the line
    # so bias -b is simply the inner product of w and p1
    b = -dot(w, p1)
    return w, b

def plot_line(w, b, width, style):
    y = []
    n1, n2 = w
    # convert wx + b = 0 to y : f(x) = ax + b
    f = lambda x: -((n1 / n2) * x) - (b / n2)
    for x in range(0, width + 1):
        y.append(f(x))
    plot(y, style)

def main():
    p0 = (5, 5)
    maxwidth, maxheight = 2 * p0[0], 3 * p0[1]
    w, b = get_random_line(p0, maxwidth, maxheight)
    margin = 0.5
    plot_line(w, b, maxwidth, &quot;r-&quot;)
    axis([0.0, maxwidth, 0.0, maxheight])
    show()

if __name__ == &#039;__main__&#039;:
    main()
&lt;/pre&gt;
We start with an arbitrary point p0 ((5, 5) in our case), draw a rectangle around it with the origin at the lower left corner and a multiple of p0 in the upper right, choose a second point p1 inside this rectangle randomly and build the line based upon those two points. Ok, the script fails, if the resulting line is parallel to the y-axis, but this is, ahem, unlikely &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;.
&lt;p/&gt;
Running the script should show something like this:
&lt;p/&gt;
&lt;!-- s9ymdb:128 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;616&quot; height=&quot;532&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://wersdoerfer.com/~jochen/s9y/uploads/random_line1.png&quot; alt=&quot;&quot; /&gt;
&lt;p/&gt;
The normal form &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20w%5ET%20x%20-%20b%20%3D%200&quot; title=&quot;\Large w^T x - b = 0&quot; alt=&quot;\Large w^T x - b = 0&quot; \/&gt; is used because it makes the calculation of distances between the line and arbitrary points easy. It&#039;s also used by the classifier showed later on, so we have to be able to plot lines of this type anyway.

&lt;h4&gt;training sample&lt;/h4&gt;
Now, let&#039;s generate some training vectors (points). The points are generated randomly - if the distance between a generated point and the line is smaller than the margin, the point is disgarded. Depending on which side of the line a point lies, it is assigned the label 1 or -1. If the label is 1, the point is blue, otherwise it&#039;s red. To make this more interesting, we also add some noise:

&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;
def get_points(w, b, width, height, numpoints=500,  mindist=1.0):
    points = []
    for i in range(numpoints):
        x = (random() * width, random() * height)
        dist = dot(w, x) + b
        if abs(dist) &gt; mindist:
            points.append([(-1.0, 1.0)[dist &gt; 0.0], x])
            # add some noise
            if abs(dist) &lt; 2 * mindist and random() &lt; 0.2:
                points[-1][0] = points[-1][0] * -1.0
    return points

def get_dim(x, dim):
    return [i[dim] for i in x]

def plot_points(points):
    red, blue = [], []
    for label, p in points:
        if label &gt; 0:
            blue.append(p)
        else:
            red.append(p)
    plot(get_dim(blue, 0), get_dim(blue, 1), &quot;b.&quot;)
    plot(get_dim(red, 0), get_dim(red, 1), &quot;r.&quot;)

def main():
    p0 = (5, 5)
    maxwidth, maxheight = 2 * p0[0], 3 * p0[1]
    w, b = get_random_line(p0, maxwidth, maxheight)
    margin = 0.5
    plot_line(w, b, maxwidth, &quot;r-&quot;)
    points = get_points(w, b, maxwidth, maxheight, mindist=margin)
    plot_points(points)
    axis([.0, maxwidth, 0.0, maxheight])
    show()
&lt;/pre&gt;
The resulting image should look like this:
&lt;p/&gt;
&lt;!-- s9ymdb:129 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;628&quot; height=&quot;531&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://wersdoerfer.com/~jochen/s9y/uploads/random_points.png&quot; alt=&quot;&quot; /&gt;
&lt;p/&gt;
Nice.

&lt;h4&gt;mlpy - learning a linear discriminant function&lt;/h4&gt;
Now that we&#039;re able to generate random training data, let&#039;s test it &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;! So we need a classifier which learns the decision boundary between the two classes. A really neat framework for building such classifiers is &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=288&amp;amp;entry_id=73&quot;  onmouseover=&quot;window.status=&#039;https://mlpy.fbk.eu/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;mlpy homepage&quot;&gt;mlpy&lt;/a&gt;. Adding just one more function does the trick:
&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;
def mlpy(points):
    from numpy import array
    from mlpy import svm
    labels, training = [], []
    for label, p in points:
        labels.append(int(label))
        training.append(p)
    mysvm = svm(maxloops=1000)
    mysvm.compute(array(training), array(labels))
    return mysvm._svm__w.tolist(), -mysvm._svm__b

def main():
    p0 = (5, 5)
    maxwidth, maxheight = 2 * p0[0], 3 * p0[1]
    w, b = get_random_line(p0, maxwidth, maxheight)
    margin = 0.5
    plot_line(w, b, maxwidth, &quot;r-&quot;)
    plot_line(w, b + margin, maxwidth, &quot;b--&quot;)
    plot_line(w, b - margin, maxwidth, &quot;b--&quot;)
    points = get_points(w, b, maxwidth, maxheight, mindist=margin)
    plot_points(points)
    mw, mb = mlpy(points)
    plot_line(mw, mb, maxwidth, &quot;m-&quot;)
    axis([.0, maxwidth, 0.0, maxheight])
    show()
&lt;/pre&gt;
&lt;p/&gt;
There are two additional lines to denote the margin, and the resulting hypothesis is showed as a magenta line. It&#039;s not that far away from the original line, which generated the test data:
&lt;p/&gt;
&lt;!-- s9ymdb:130 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;613&quot; height=&quot;530&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://wersdoerfer.com/~jochen/s9y/uploads/mlpy_fit.png&quot; alt=&quot;&quot; /&gt;
&lt;p/&gt;
Mlpy is used to train a linear &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=289&amp;amp;entry_id=73&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Support_vector_machine&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;SVM - wikipedia&quot;&gt;Support Vector Machine&lt;/a&gt; which tries to maximize the margin between the two different classes. The resulting classifier is just a line in the normal form of &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/plugin/mimetex.php?q=%5CLarge%20w%5ET%20x%20-%20b%20%3D%200&quot; title=&quot;\Large w^T x - b = 0&quot; alt=&quot;\Large w^T x - b = 0&quot; \/&gt;.  
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    machine learning, </dc:subject>
    <dc:date>2009-03-06T21:40:00Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=73</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=73</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/72-guid.html">
    <title>small backup script</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/72-small-backup-script.html</link>
    <description>
    Today i wrote a small python-script to collect data from my various machines and backup them with &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=213&amp;amp;entry_id=72&quot;  onmouseover=&quot;window.status=&#039;http://www.nongnu.org/rdiff-backup/index.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;rdiff-backup homepage&quot;&gt;rdiff-backup&lt;/a&gt;. Just in case someone finds it useful, here&#039;s the source:
&lt;pre&gt;
#!/usr/bin/python

import os
import rdiff_backup.Main
from rdiff_backup.Main import Main as backup

BACKUP_ROOT = &quot;/mnt/backup/&quot;

def get_jobs(config):
    src_prefix = &quot;&quot;
    target_prefix = &quot;%s%s&quot; % (BACKUP_ROOT,
                              config.get(&quot;target&quot;, &quot;localhost&quot;))
    if &quot;remote&quot; in config:
        src_prefix = &quot;%s@%s::&quot; % (config.get(&quot;user&quot;, &quot;root&quot;),
                                  config[&quot;remote&quot;])
        target_prefix = &quot;%s%s&quot; % (BACKUP_ROOT, config[&quot;remote&quot;])
    for item in config[&quot;entries&quot;]:
        job = []
        for (option, value) in item[&quot;options&quot;]:
            job.append(option)
            job.append(value)
        job.append(&quot;%s%s&quot; % (src_prefix, item[&quot;path&quot;]))
        target_dir = &quot;%s%s&quot; % (target_prefix, item[&quot;path&quot;])
        if not os.path.exists(target_dir):
            os.makedirs(target_dir)
        job.append(target_dir)
        yield job

configs = [
    {&quot;remote&quot;: &quot;foobar.com&quot;,
     &quot;user&quot;: &quot;root&quot;,
     &quot;entries&quot;: [
         {&quot;options&quot;: [],
          &quot;path&quot;: &quot;/etc&quot;,
         },
         {&quot;options&quot;: [
             (&quot;--exclude&quot;, &quot;**src&quot;),
             (&quot;--exclude&quot;, &quot;**svn*&quot;),
             (&quot;--exclude&quot;, &quot;**csv&quot;),
          ],
          &quot;path&quot;: &quot;/home/user&quot;,
         },
     ],
    },
    {&quot;entries&quot;: [
         {&quot;options&quot;: [],
          &quot;path&quot;: &quot;/etc&quot;,
         },
         {&quot;options&quot;: [
             (&quot;--include&quot;, &quot;**src/google_appengine&quot;),
             (&quot;--exclude&quot;, &quot;**src&quot;),
             (&quot;--exclude&quot;, &quot;**mp3&quot;),
             (&quot;--exclude&quot;, &quot;**iso&quot;),
          ],
          &quot;path&quot;: &quot;/home/user&quot;,
         },
     ],
    },
]

for config in configs:
    for job in get_jobs(config):
        print &quot;rdiff-backup %s&quot; % &quot; &quot;.join(job)
        reload(rdiff_backup.Main)
        backup(job)
&lt;/pre&gt;
Hmm, the config section is really messy, but the order of options is relevant - dunno how to make it simpler...

To avoid getting asked for your ssh passphrase over and over again, you could use screen and ssh-agent:
&lt;pre&gt;
screen -S backup ssh-agent bash
ssh-add
time ./backup.py
&lt;/pre&gt; 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    code, </dc:subject>
    <dc:date>2008-05-11T17:34:40Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=72</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=72</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/71-guid.html">
    <title>quiz + phrack release party, gestern</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/71-quiz-+-phrack-release-party,-gestern.html</link>
    <description>
    &lt;img width=&#039;722&#039; height=&#039;480&#039; border=&#039;0&#039; hspace=&#039;5&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/dsc_0102.jpg&#039; alt=&#039;&#039; /&gt;Hier mal kommentarlos ein paar Bilder... &lt;br /&gt;&lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/index.php?/archives/71-quiz-+-phrack-release-party,-gestern.html#extended&quot;&gt;&quot;quiz + phrack release party, gestern&quot; vollständig lesen&lt;/a&gt;
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    </dc:subject>
    <dc:date>2005-07-30T15:19:01Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=71</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=71</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/70-guid.html">
    <title>about mp3s and african farmers</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/70-about-mp3s-and-african-farmers.html</link>
    <description>
    &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=211&amp;amp;entry_id=70&quot; title=&quot;http://program.whatthehack.org/event/126.en.html&quot;  onmouseover=&quot;window.status=&#039;http://program.whatthehack.org/event/126.en.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;&lt;img border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/dsc030.jpg&#039; alt=&#039;&#039; /&gt;&lt;/a&gt;Tjo, auch bei dem  Vortrag von &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=212&amp;amp;entry_id=70&quot; title=&quot;http://www.julian-finn.de/blog/&quot;  onmouseover=&quot;window.status=&#039;http://www.julian-finn.de/blog/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Nachbar Julian&lt;/a&gt; war für mich nicht so schrecklich viel neu.  Daß die Regierungen die Drittweltstaaten und die Konzerne die Arbeitnehmer zum eigenen Vorteil auspressen und dagegen etwas unternommen werden müsse, mag ja sein. Aber eigentlich ist das ja nur die halbe Wahrheit. Irgendwie kommt es mir bei dieser Debatte immer so vor, als würde die chancenreiche, fortschrittliche Richtung, in die sich die &quot;Wissensgesellschaft&quot; eben auch bewegen kann, bagatellisiert oder bewußt ignoriert. Hmm, wenn ich mal Zeit habe, muß ich dazu nochmal was posten... 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    </dc:subject>
    <dc:date>2005-07-29T17:14:39Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=70</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=70</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/69-guid.html">
    <title>anonymous communication for the united states department of defense...and you</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/69-anonymous-communication-for-the-united-states-department-of-defense...and-you.html</link>
    <description>
    &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=230&amp;amp;entry_id=69&quot; title=&quot;http://program.whatthehack.org/event/28.en.html&quot;  onmouseover=&quot;window.status=&#039;http://program.whatthehack.org/event/28.en.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;&lt;img width=&#039;110&#039; height=&#039;110&#039; border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/165.serendipityThumb.png&#039; alt=&#039;&#039; /&gt;&lt;/a&gt;Einen sehr schönen Vortrag habe ich heute zu Tor (next generation onion router) gesehen. Tor ist überhaupt ein sehr schickes Projekt und wird anscheinend allmählich so richtig erfolgreich. Schade nur, daß Tor nicht wirklich gegen starke Angreifer (Trafficanalyse) schützt. Dummerweise scheint es aber eher nichttrivial zu sein, Echtzeitanforderungen mit Sicherheit zu verbinden.
&lt;br/&gt;&lt;br/&gt;
In den USA scheinen die übrigens die vielen Spammer-Netze mit tausenden aufgemachter Zombiwindosen zu einem Umdenken seitens der Bedarfsträger geführt zu haben. Man geht dort wohl mittlerweile nicht mehr automatisch davon aus, daß der Betreiber eines Rechners unmittelbar schuld ist, wenn Spam o.ä.  über seine Kiste verteilt wurde. D.h. man hat auch als Betreiber eines Anonymisierungsdienstes eine realistische Chance zu erklären, was man da macht, und daß das alles vollkommen legal ist, bevor einem von den Cops die Bude ausgeräumt wird. Hoffen wir mal, daß sich das auch beizeiten in .de rumspricht... 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    </dc:subject>
    <dc:date>2005-07-29T16:29:47Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=69</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=69</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/68-guid.html">
    <title>modeling world energy - a proposal</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/68-modeling-world-energy-a-proposal.html</link>
    <description>
    &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=209&amp;amp;entry_id=68&quot; title=&quot;http://program.whatthehack.org/event/172.en.html&quot;  onmouseover=&quot;window.status=&#039;http://program.whatthehack.org/event/172.en.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;&lt;img width=&#039;110&#039; height=&#039;110&#039; border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/165.serendipityThumb.png&#039; alt=&#039;&#039; /&gt;&lt;/a&gt;Der zweite Vortrag beschäftige sich mit &quot;Peak Oil&quot; und den Problemen, die eine Zivilisation so bekommt, wenn sie festgestellt, daß es plötzlich kein Öl mehr gibt. Da waren ein paar schöne Beispiele dabei - so haben Anfang des letzten Jahrhunderts die zur Landwirtschaft nötigen Pferde einen Großteil der Ernte weggefuttert. Wenn man dann ausrechnet, wieviel Pferde man bräuchte, um bei der gestiegenen Bevölkerungsanzahl ausreichend Nahrungsmittel zu produzieren, wird schnell klar, daß man dahin nicht zurückkann. Überhaupt korrellieren die Zunahme der Ölförderung und die Zunahme der Weltbevölkerung auf erschreckende Weise. Hoffentlich ist das mal keine Kausalität, denn eine der beiden Kurven wird unweigerlich einen heftigen Abschwung nach unten erleben - ist nur eine Frage der Zeit. Andererseits hatte der Vortrag deutliche Längen - naja, ging so. 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    </dc:subject>
    <dc:date>2005-07-29T16:21:14Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=68</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=68</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/67-guid.html">
    <title>search machine internals</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/67-search-machine-internals.html</link>
    <description>
    &lt;img width=&#039;110&#039; height=&#039;110&#039; border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/165.serendipityThumb.png&#039; alt=&#039;&#039; /&gt;Der erste Vortrag heute morgen beschäftigte sich mit Information-Retrieval. D.h. dem Finden von Dokumenten, die einem bestimmten Informationsbedürfniss am besten entsprechen. Für mich gab es da eher weniger Neuigkeiten.

 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    </dc:subject>
    <dc:date>2005-07-29T16:11:48Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=67</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=67</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/66-guid.html">
    <title>wth</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/66-wth.html</link>
    <description>
    &lt;a href=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/Logo_WTH.jpg&#039;&gt;&lt;img width=&#039;110&#039; height=&#039;102&#039; border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/Logo_WTH.serendipityThumb.jpg&#039; alt=&#039;&#039; /&gt;&lt;/a&gt;So, bin mittlerweile auf der &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=208&amp;amp;entry_id=66&quot; title=&quot;http://whatthehack.org&quot;  onmouseover=&quot;window.status=&#039;http://whatthehack.org&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;wth&lt;/a&gt; angekommen. Puh, man sollte da auf gar keinen Fall per Bahn anreisen, wenn man noch andere Möglichkeiten hat. Mußte 6 Mal umsteigen, was jedesmal ein nerviges Gehetze war, weil die Züge natürlich immer Verspätung hatten. Habe dann in der Eile eine falsche Bahn erwischt und einen kleinen unfreiwilligen Abstecher nach Amsterdam unternommen. Bin dann irgendwann nachts angekommen, als es schon so dunkel war, daß ich mein Zelt nicht mehr aufbauen konnte.
&lt;br/&gt;&lt;br/&gt;
Nungut, die Nacht in einer Hängematte unter einem Sonnensegel war dann gar nicht so übel. Heute morgen dann flugs das Zelt aufgebaut und bezogen. Die Leute hier sind natürlich wie immer sehr recovery. Kaum war ich mit dem Zeltaufbau fertig, drückte mir ein Campingnachbar kommentarlos ein Twistedpair und ein Stromkabel in die Hand und sagte nur, nachdem ich ihn wohl etwas verständnisslos angesehen haben mußte:&quot;Internet!&quot; Wow, jetzt noch Kaffee und frische Brötchen und wir können dicke Freunde werden &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;. Internet ohne Kabel geht hier wohl nicht, aber das wäre ja auch mal was ganz Neues - wirklich ordentlich funktioniert hat Wavelan noch auf keiner Großveranstaltung, die ich bisher besucht habe.
&lt;br/&gt;&lt;br/&gt;
Die Sanitärinfrastruktur ist ganz ok und damit Welten besser als die auf dem CCCamp vor 2 Jahren. Schluck und Mampftechnisch sieht es nicht so gut aus. Es gibt ein seltsames Bon-System, wo man statt Pfandmarken oder einfach Geld riesige neonfarbene Plastikknöpfe verwenden muß, d.h. man läuft immer mit einem Riesenbeutel voller Plastikchips rum, nicht wirklich clever. Und dann kann man auch irgendwie nix dafür kaufen. Der nächste Supermarkt ist Kilometer entfernt... nunja, vielleicht wirds ja gegen abend besser... ...ugh, hatte zwischenzeitlich kein Netz, abends wurde es nicht besser &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;. Man hat die Wahl zwischen halbaufgetauten Hamburgern in Milchbrötchen mit rohen Zwiebel oder höchstens vorfrittierten Fritten mit Tunke. Irgendwie scheint die Fritöse nicht mit dem Durchsatz klarzukommen. 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    </dc:subject>
    <dc:date>2005-07-29T15:47:45Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=66</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=66</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/65-guid.html">
    <title>Parkohr</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/65-Parkohr.html</link>
    <description>
    Parkuhren vollzuquatschen ist ja heutzutage ein ebenso günstiges, wie sinnfreies Unterfangen. Doch das muß ja nicht so bleiben. Auch an solch scheinbar trostlosen Orten könnten die Errungenschaften der modernen Informationstechnik segensreiche Wirkung entfalten. Vorreiter in diesem Bereich ist, wie so oft, auch diesmal wieder London. Dort werden in Zukunft &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=203&amp;amp;entry_id=65&quot; title=&quot;http://society.guardian.co.uk/drugsandalcohol/story/0,8150,1476223,00.html?=rss&quot;  onmouseover=&quot;window.status=&#039;http://society.guardian.co.uk/drugsandalcohol/story/0,8150,1476223,00.html?=rss&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;horchende Laternenpfähle&lt;/a&gt; dafür sorgen, daß öffentlich vorgetragene Unmutsbekundungen nicht unerhört bleiben... via &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=204&amp;amp;entry_id=65&quot; title=&quot;http://blog.koehntopp.de/archives/777-Statt-Parkuhr.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.koehntopp.de/archives/777-Statt-Parkuhr.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;isotopp&lt;/a&gt;
&lt;a href=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/fas.jpg&#039;&gt;&lt;img width=&#039;110&#039; height=&#039;81&#039; border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/fas.serendipityThumb.jpg&#039; alt=&#039;&#039; /&gt;&lt;/a&gt;
Wer jetzt aber keine Lust hat, dafür extra nach London zu fahren, für den gibt es natürlich auch ein &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=206&amp;amp;entry_id=65&quot; title=&quot;http://parkuhr.net&quot;  onmouseover=&quot;window.status=&#039;http://parkuhr.net&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;virtuelles Pendant&lt;/a&gt;, das seit einiger Zeit von einem ehemaligen WG-Mitbewohner betrieben wird (für den Text auf das Bild klicken...). 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    1984, </dc:subject>
    <dc:date>2005-05-06T21:05:00Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=65</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=65</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/41-guid.html">
    <title>Am Ende der Nacht</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/41-Am-Ende-der-Nacht.html</link>
    <description>
    Ok, jeden Monat ein Gedicht - hier ein weiteres Exemplar dieser Serie. Gelegenheit, einen kleinen Kontrapunkt zur aktuellen Nachrichtenlage zu setzen. Zugegeben, nicht ganz so adrett wie beim letzten Mal ;):&lt;br/&gt;&lt;br/&gt;

Hosenscheißer und Pissnelken&lt;br/&gt;
Handtücher voll Menstruationsblut&lt;br/&gt;
und dazwischen&lt;br/&gt;
die Liebe&lt;br/&gt;
der leuchtende Pfad&lt;br/&gt;
der rote Faden&lt;br/&gt;
und was zu hassen&lt;br/&gt;
die Verachtung&lt;br/&gt;
das Magengeschwür&lt;br/&gt;
und alle Menschen werden Brüder&lt;br/&gt;
im Altersheim&lt;br/&gt;
auch auf dem Sterbebett&lt;br/&gt;
sprechen sie noch holdne Worte&lt;br/&gt;
mit Röcheln als Begleitakkord&lt;br/&gt;
Raucherhusten, Hämohorroiden&lt;br/&gt;
Prostata, Humptata&lt;br/&gt;
Fuspilz, Rheuma&lt;br/&gt;
dreckge Ecken&lt;br/&gt;
Einsthin fallen uns die Augen zu&lt;br/&gt;
mit Illusion und Kommunion&lt;br/&gt;
und alles nichts.&lt;br/&gt; 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    gedichte, </dc:subject>
    <dc:date>2005-04-09T05:00:00Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=41</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=41</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/64-guid.html">
    <title>untie!</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/64-untie!.html</link>
    <description>
    &lt;a href=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/vc20.jpg&#039;&gt;&lt;img width=&#039;80&#039; height=&#039;110&#039; border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/vc20.serendipityThumb.jpg&#039; alt=&#039;&#039; /&gt;&lt;/a&gt;Ok, ist nicht so gemeint, aber zu &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=189&amp;amp;entry_id=64&quot; title=&quot;http://loco.nerdcamp.net/blog/archives/32-Unite!.html&quot;  onmouseover=&quot;window.status=&#039;http://loco.nerdcamp.net/blog/archives/32-Unite!.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;naheliegend&lt;/a&gt;, um die Pointe auszulassen &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;. Wie schon &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=188&amp;amp;entry_id=64&quot; title=&quot;http://blog.koehntopp.de/archives/736-Travelling-without-moving.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.koehntopp.de/archives/736-Travelling-without-moving.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;hier&lt;/a&gt; und &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=189&amp;amp;entry_id=64&quot; title=&quot;http://loco.nerdcamp.net/blog/archives/32-Unite!.html&quot;  onmouseover=&quot;window.status=&#039;http://loco.nerdcamp.net/blog/archives/32-Unite!.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;hier&lt;/a&gt; verbloggt, wechselt web.de wohl den Besitzer. Ist zwar nur ein &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=190&amp;amp;entry_id=64&quot; title=&quot;http://contracts.onecle.com/istorm/garden-botanika.jv.shtml&quot;  onmouseover=&quot;window.status=&#039;http://contracts.onecle.com/istorm/garden-botanika.jv.shtml&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Loi&lt;/a&gt;, aber gegärt hat es ja schon länger... auf diesem Wege möchte ich nur noch mal auf die &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=191&amp;amp;entry_id=64&quot; title=&quot;http://ex-webde-ag.de&quot;  onmouseover=&quot;window.status=&#039;http://ex-webde-ag.de&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;ex-webde-ag.de mailingliste&lt;/a&gt; hinweisen, die keineswegs nur vollkommen Losgelösten offensteht. Bedarf scheint es ja jedenfalls zu geben... 

Jo, bis denn...  
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    website, </dc:subject>
    <dc:date>2005-03-16T23:18:08Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=64</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=64</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/48-guid.html">
    <title>Irischer Sommer</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/48-Irischer-Sommer.html</link>
    <description>
    Ach was solls - ich fang halt einfach mal damit an. Habe das eh schon lang genug vor mir hergeschoben. Ab jetzt werde ich etwa jeden Monat oder so ein Gedicht veröffentlichen. Fangen wir mal mit einem ganz &quot;harmlosen&quot; Ding an, das sich sogar reimt und auch sonst ganz adrett daherkommt. Wer Zynismus findet, darf ihn behalten &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;. Tjo.&lt;br/&gt;
&lt;br/&gt;
Irischer Sommer&lt;br/&gt;
&lt;br/&gt;
Ein gespannter Draht flüstert im Wind&lt;br/&gt;
der Straße sein hohes A entgegen.&lt;br/&gt;
Entfernter im Auto ein himmlisches Kind&lt;br/&gt;
hat den Atem der Welt angehalten.&lt;br/&gt;
&lt;br/&gt;
Die Schafe grasen im Grünen der Hügel&lt;br/&gt;
die Wolken ziehen ganz in Weiss&lt;br/&gt;
und Pferdestärken ohne Zügel&lt;br/&gt;
gleiten auf unbestimmt gewissem Gleis&lt;br/&gt;
&lt;br/&gt;
Der Fahrtwind herrscht das Fahrzeug an&lt;br/&gt;
und wie ein verlorenes Echo&lt;br/&gt;
dringt aus dem Auto gedämpfter Gesang&lt;br/&gt;
und reimt sich zum tosend Karracho&lt;br/&gt;
&lt;br/&gt;
Nah ist&#039;s, näher noch ist nur der Ort&lt;br/&gt;
und Feld und Wald und Wiesenträume&lt;br/&gt;
der Draht zerspringt - ein Knall, kein Wort&lt;br/&gt;
und Ruh ist im Wald der Bombenbäume&lt;br/&gt; 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    gedichte, </dc:subject>
    <dc:date>2005-03-10T01:02:00Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=48</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=48</wfw:commentRss>
    
    
</item>
<item rdf:about="http://wersdoerfer.com/~jochen/s9y/index.php?/archives/63-guid.html">
    <title>chili</title>
    <link>http://wersdoerfer.com/~jochen/s9y/index.php?/archives/63-chili.html</link>
    <description>
    &lt;a href=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/209-0998_IMG.jpg&#039;&gt;&lt;img width=&#039;110&#039; height=&#039;83&#039; border=&#039;0&#039; hspace=&#039;5&#039; align=&#039;right&#039; src=&#039;http://wersdoerfer.com/~jochen/s9y/uploads/209-0998_IMG.serendipityThumb.jpg&#039; alt=&#039;&#039; /&gt;&lt;/a&gt;
Wie schon &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=181&amp;amp;entry_id=63&quot; title=&quot;http://www.eichenberg-online.de/blog/archives/82-Scharf.html&quot;  onmouseover=&quot;window.status=&#039;http://www.eichenberg-online.de/blog/archives/82-Scharf.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;hier&lt;/a&gt;, &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=182&amp;amp;entry_id=63&quot; title=&quot;http://blog.koehntopp.de/archives/732-Ist-der-Ruf-erst-ruiniert....html&quot;  onmouseover=&quot;window.status=&#039;http://blog.koehntopp.de/archives/732-Ist-der-Ruf-erst-ruiniert....html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;hier&lt;/a&gt; oder &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=183&amp;amp;entry_id=63&quot; title=&quot;http://blog.jochen-lillich.de/index.php?/archives/77-Fachliteratur.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.jochen-lillich.de/index.php?/archives/77-Fachliteratur.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;hier&lt;/a&gt; erwähnt, zieht der Chili-Machismo immer weitere Kreise. Er ist sogar interkulturell durchaus salonfähig. Letzten Sommer hatte ich beispielsweise die Gelegenheit, &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=184&amp;amp;entry_id=63&quot; title=&quot;http://shop3.webmailer.de/cgi-bin/ePages.storefront/422f8fdd001fbdb52717ac172c270678/Product/View/514184&amp;amp;2D549902&quot;  onmouseover=&quot;window.status=&#039;http://shop3.webmailer.de/cgi-bin/ePages.storefront/422f8fdd001fbdb52717ac172c270678/Product/View/514184&amp;amp;2D549902&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt; pure cap&lt;/a&gt; an ein paar unerschrockenen Chinesen auszuprobieren. Ich habe nichts beschönigt, eindringlich gewarnt und mir selbst eine stattliche Dosis verabreicht und mitgelitten. Aber diese &lt;a href=&quot;http://wersdoerfer.com/~jochen/s9y/exit.php?url_id=185&amp;amp;entry_id=63&quot; title=&quot;http://wersdoerfer.com/bilder/?Keywords=6&quot;  onmouseover=&quot;window.status=&#039;http://wersdoerfer.com/bilder/?Keywords=6&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Bilder&lt;/a&gt; waren es wert &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;.
&lt;br/&gt;&lt;br/&gt;
Etwas frustrierend fand ich, daß die Wirkung nur beschränkt skaliert. Ob man sich mehr als 6 Pipettentropfen &quot;pure cap&quot; auf einen Teller Nahrung träufelt oder sich in der Jackentasche vertut und statt Odol das Pfefferspray in den Rachen jagt, ist relativ unerheblich, da eh alle Nervenzellen feuern, was das Zeug hält. Und selbst das läßt sich aushalten...
&lt;br/&gt;&lt;br/&gt;
Für Ungeübte ist das aber ein echt abendfüllender Spaß &lt;img src=&quot;http://wersdoerfer.com/~jochen/s9y/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;. 
    </description>

    <dc:publisher></dc:publisher>
    <dc:creator>nospam@example.com (jochen)</dc:creator>
    <dc:subject>
    fun, </dc:subject>
    <dc:date>2005-03-09T23:57:06Z</dc:date>
    <wfw:comment>http://wersdoerfer.com/~jochen/s9y/wfwcomment.php?cid=63</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://wersdoerfer.com/~jochen/s9y/rss.php?version=1.0&amp;type=comments&amp;cid=63</wfw:commentRss>
    
    
</item>

</rdf:RDF>
