<?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>teenage mutant ninja hero coders</title>
	<atom:link href="http://blogs.23.nu/c0re/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.23.nu/c0re</link>
	<description>Just another blogs.23.nu TNG weblog</description>
	<lastBuildDate>Sun, 14 Feb 2010 11:55:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Builders guide to Shipping Containers</title>
		<link>http://blogs.23.nu/c0re/2010/02/builders-guide-to-shipping-containers/</link>
		<comments>http://blogs.23.nu/c0re/2010/02/builders-guide-to-shipping-containers/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 00:15:54 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=807</guid>
		<description><![CDATA[The ISO Shipping Container is a terrific pice of hardware. Cheap (500-3000 €), sturdy (structure can carry 200-350 tonnes), corrosion resistant (usually made of CORTEN) and good looking.
They are terrific for building things and while it is an urban legend that &#8220;it&#8217;s cheaper to scrap them then to send them back to Asia&#8221; (hint: the [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://en.wikipedia.org/wiki/Intermodal_freight_shipping_container">ISO Shipping Container</a> is a terrific pice of hardware. Cheap (500-3000 €), sturdy (structure can carry 200-350 tonnes), corrosion resistant (usually made of <a href="http://en.wikipedia.org/wiki/Weathering_steel">CORTEN</a>) and <a href="http://vimeo.com/5137183">good looking</a>.</p>
<p>They are terrific for building things and while it is an urban legend that &#8220;it&#8217;s cheaper to scrap them then to send them back to Asia&#8221; (hint: the ships have to drive back to Asia anyway) new containers are produced in China or Korea and used containers are cheap and easy to get in Europe and the US.</p>
<p><img src="http://static.23.nu/md/Pictures/allimpossible.jpg" alt=""></p>
<p><strong>Things you can&#8217;t do with shipping Containers</strong></p>
<p><img src="http://static.23.nu/md/Pictures/crossstack.jpg" alt="" width="240" align="right" />All these great features come with a bunch of restrictions. Containers come with 8 <a href="http://krisryinc.com/cornercasting/blr20100blr20000.html">Corner Casings</a> which are the only points where a Shipping Container is meant to be anchored. This makes a container can only rest on it&#8217;s 4 bottom Corners and can only support loads from above on it&#8217;s 4 top corners. </p>
<p><img src="http://static.23.nu/md/Pictures/smallonbig.jpg" alt="" width="240" align="right" />Everything else on a container is <b>not</b> meant to carry any significant load.</p>
<p>This meant you can only stack containers in configurations where all for bottom corner casings of the upper container are supported by four top corner casings of lower containers.</p>
<p><img src="http://static.23.nu/md/Pictures/2smallonbig.jpg" alt="" width="240" align="right" />This results in many desirable stacking configurations being impossible from a stability standpoint. See for examples on the right. </p>
<p>Nearly all configurations where the upper container is rotated by 90 degrees are impossible. Putting 20&#8243; on 40&#8243; containers is in most cases impossible. </p>
<p><img src="http://static.23.nu/md/Pictures/bigonsmall.jpg" alt="" width="240" align="right" />Putting a 40&#8243; on a single 20&#8243; container is impossible. Most overhang configurations are impossible.</p>
<p>Now you know the reason why there is so <a href="http://www.flickr.com/photos/leidorf/2576865335/">little</a> <a href="http://www.flickr.com/photos/33027180@N00/2145648673/">creativity</a> in <a href="http://www.flickr.com/photos/leidorf/2731680927/">professional</a> <a href="http://www.flickr.com/photos/38992637@N02/3865035069/">Container</a> <a href="http://www.flickr.com/photos/bcnbits/2859509269/sizes/o/">Stacking</a>.</p>
<p>What works is putting a 40&#8243; Container on two 20&#8243; containers, but there is little reason to do that.</p>
<p><a href="http://www.flickr.com/photos/mdornseif/4352929925/"><img src="http://static.23.nu/md/Pictures/ZZ6018A1B3.jpg"></a></p>
<p><b>The Roof Problem</b></p>
<p>While the floors of a Container are meant to carry loads from more than a ton per square meter the roofs are little more than weather protection than a few dozen kg per square meter.  See <a href="http://www.flickr.com/photos/mdornseif/4352883315/">this video</a> of me seesawing my toes and the effect on the roof.</p>
<p>Walking on the Roof for a single person is slightly uncomfortable and for a group it is something in-between scary and dangerous. The high quality steel sheeting of the roof will not break but the whole thing is very shaky.</p>
<p><a href="http://www.flickr.com/photos/mdornseif/4352951585/"><img src="http://static.23.nu/md/Pictures/ZZ2298580D.jpg" alt="" align="right" /></a>Also the roofs of pre-owned containers are usually not flat anymore. Being the most fragile part of the structure they have a tendency to bent and get into a wobbly state. </p>
<p>So if you plan to walk regularly on them you need to put additional flooring on top of the containers to distribute the load and stiffen the floor. We used two layers of 1 cm plywood which is fine, but still the walking experience is not totally solid.</p>
<p>If you plan to put heavier loads on the roofs you probably need to discuss this with a structural engineer. An approach we where contemplating was to add an additional layer of containers on top and remove roof and walls from them to keep only the ultra rigid container floor. <a href="http://www.flickr.com/photos/ajf-2000/3495511474/">Puma City this this for their balcony</a></p>
<p><b>Steel on Steel</b></p>
<p>You might or might not be aware, that steel on steel usually results in an excellent plate bearing. Meaning that <a href="http://www.flickr.com/photos/mdornseif/4353407484/in/photostream/">Corner Casings</a> on top of each other result in astonishing easy movability of the upper container. As in &#8220;Slam the door and it falls nearly down&#8221;. Even a pice of carton between the corner casings helps somewhat. But on the long run you need to fix your containers onto each other.</p>
<p><img src="http://static.23.nu/md/Pictures/containerschloesser.jpg" alt="" align="right" />So it&#8217;t imperative that you fix the upper container to the lower containers. The best way is to use <a href="http://commons.wikimedia.org/wiki/Category:Twistlocks"> Twistlocks</a> as the Pros do. Marine grade Twistlocks can secure a stack of 4 fully loaded containers on a rolling ship without additional help. (Usually contianers are stacked 6-8 levels high, which results in the need for additional securing. We bought our Twistlocks at <A href="http://www.wader-mcp.de/">Willi Wader Group</a>. </p>
<p>You might be tempted to save the expense of twistlocks (15-30 € per lock) and instead screw or weld the containers together. But keep in might that the twistlocks are mass produced to rigid quality standards &#8211; while it is hard to assess the integrity of your home grown connection approach. </p>
<p><b>Doors</b></p>
<p><img src="http://static.23.nu/md/Pictures/IMG_7051.jpg" alt="" align="left" />Doors of shipping containers are hard to open by design. Even on a brand new container you have to operate two handles with considerable strength at once and at different speeds to open and close a container. And you can not open the left dor unless the right door is already open (although you might bee able to change that with a welding touch, a knife and in 20 minutes).</p>
<p>On a pre-owned container being 10 years or so old it is usually much harder to operate the doors because the frame of the door and the container itself is always bent to a certain degree. These doors can not replace a normal door if you are planning to pass it several times a day.</p>
<p>If you receive more than one container sort them by door quality. If you are able to choose the containers before purchase, always check the doors.</p>
<p><b>Structural integrity</b></p>
<p>Shipping Containers are <a href="http://en.wikipedia.org/wiki/Monocoque">unibody constructions</a>. This means the whole hull is used to contribute to load distribution.</p>
<p>In case you didn&#8217;t suspect: this means bad things™ happen, if you cut substantial holes in the hull.</p>
<p>If you spot something with big openings it is no shipping container. Or it is a shipping container which has extensively upgraded structural components &#8211; which is possible but defeats the purpose of &#8220;standardized, cheap, reusable&#8221;.</p>
<p>Even if you leave the door open the container is less sturdy than one wit a closed door. Most containers seem to be able to withstand removing the back wall opposite to the door I wouldn&#8217;t like to have any load on such a container.</p>
<p><img src="http://static.23.nu/md/Pictures/hudora161209_4.jpg" alt="" align="right" />We opted for <a href="http://www.flickr.com/photos/mdornseif/4353817619/">leaving about 30 cm on the top and about 15 cm at the sides</a> to keep some reinforcement. But in our application we are quite sure that there are only minimal shear forces. I would not feel comfortable in removing the back walls in any container which would have to carry substantial load.</p>
<p>If you remove one of the longer walls your container is toast. Or at least it has as much integrity as toast. We <a href="http://www.flickr.com/photos/mdornseif/4354531158/">removed a complete wall</a> of a container and found out that the container lost all stability.</p>
<p>While all containers conform to <a href="http://www.flickr.com/photos/reinvented/3432685966/in/set-72157616641048824/">rigid standards</a> (ocean carriers hate delays due to broken containers)  not all containers are created equal. Some are a <a href="http://www.flickr.com/photos/mdornseif/4353845639/">little less unibody by having additional reinforcement along the top</a>. Use this type for cutting holes in the sides &#8211; they even can keep a somewhat stable roof when a whole wall is removed.</p>
<p>What feels like a relative comfortable solution is <a href="http://www.flickr.com/photos/mdornseif/4354618560/">removing about 20% of the side wall at the right and at the left end</a> while leaving the upper 30 cm of the wall intact. The result is a still very stable container.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ0E1B54BD.jpg" alt="" /></p>
<p><b>Where to get containers and what to get</b></p>
<p>You can get containers at shipping companies and ad specialized container providers. The only ISO containers we where able to get at decent prices where 20&#8243; 40&#8243; and 40&#8243; &#8220;high cube&#8221; containers. Keep in mind that the &#8220;modular space&#8221; container type is very different from shipping containers and usualy much less sturdy.</p>
<p>We bought containers still sea-worthy and with next <A href="http://www.flickr.com/photos/reinvented/3431869905/in/set-72157616641048824/">CSC inspection</a> scheduled for 2011 or 2012. The Containers where commissioned 1994-1997 and considered &#8220;C&#8221; quality (on a ABC scale) by the shipping company. Because of the doors and possible holes (in C quality containers or in containers not sea worthy) you should inspect the containers before buying if possible.</p>
<p>The floors differ much between containers and usually are contaminated by pesticides, plan to remove them if humans will spend serious time inside. Some of our containers where freshly painted on the inside and it took several weeks of venting to get the smell to a bearable level.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ5243D086.jpg" alt="" /></p>
<p><b>How to move the containers</b></p>
<p>Usually the party selling you the containers has the equipment for hauling them to your side. The first issue is getting them of the tuck and the second issue is getting them where you want them.</p>
<p>We rented a 8 ton fork lift for all the handling which was adequate but not over powered for the task. <img src="http://static.23.nu/md/Pictures/IMG_7073.jpg" alt="" align="right" /> When carrying two containers at once (nominal weight 5 tons) the machine had considerable effort. While considering my self an seasoned fork lift driver (30 years of experience) I had to learn that a huge forklift with a huge container is something very different than the kind of forklift you drive in warehouses. A Container has lot&#8217;s of momentum and you see absolutely nothing in the direction you are driving at. For a 20&#8243; container assume every corner with less than 8 m space requires artistic driving capabilities. We had to get around a 6.5 m corner and through a 4 m door. We handled that by carrying the containers between the big 8 t forklift and one of our own 1.5 t warehouse-forklifts.</p>
<p>When renting a forklift be sure to get one which can spread it&#8217;s forks wide enough to fit into the carrying lashes at the belly of a container. They are 2.5 m or so apart.   </p>
<p>Big forklifts can only operate on relatively even ground. Alternatively you can use a crane. The main problem with a crane and especially 40&#8243; containers is that you can not introduce big horizontal forces by the attachment cables running from all for corners to the hook. Since you probably don&#8217;t have <A href="http://de.wikipedia.org/w/index.php?title=Datei:Hamburg_hafen_containerverladung_01.jpg&amp;filetimestamp=20060515150627">a spreader available</a> to distribute the load you either need a very tall crane or <a href="http://www.architecturelist.com/2008/04/21/container-home-in-new-zealand/">two cranes</a>. Your crane operator probably can tell you more.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ7B13E58B.jpg" alt="" /></p>
<p><b>Placement</b></p>
<p>Containers are build to stand on their four lower corner casings. If you don&#8217;t have a flat sturdy surface to put them on you should build a foundation at the four corners.  Directly insert twistlocks into the foundation during pouring for perfect stability.</p>
<p>Containers are not insulated against heat, cold, noise and vibrations. If you insulate them on the outside you loose the feature of the weatherproof shell and if you insulate them on the inside your rooms get very small. It&#8217;s also hard to make the connection between two containers waterproof. Therefore it seems very popular to put the containers into another building to provide heating and shelter.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ7DBB1E7F.jpg" alt="" /></p>
<p><b>Further Reading</b></p>
<p>More information on the real world issues of container construction can be found at <a href="http://www.jetsongreen.com/2010/02/ten-things-consider-shipping-container-projects.html#disqus_thread">10 Things to Consider in Using Shipping Containers for Your Next Project</a>. Preston Koerner  has good points although we where able to get the containers much cheaper than his estimate of 2000-4000 U$. We payed less than 1000 € per 20&#8243; (including delivery).</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2010/02/builders-guide-to-shipping-containers/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Running a CouchDB cluster on Amazon EC2</title>
		<link>http://blogs.23.nu/c0re/2009/12/running-a-couchdb-cluster-on-amazon-ec2/</link>
		<comments>http://blogs.23.nu/c0re/2009/12/running-a-couchdb-cluster-on-amazon-ec2/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 21:38:59 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[couchdb]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=797</guid>
		<description><![CDATA[CouchDB is a nearly zero-configuration multi-master document oriented database. It is a awsome product build by an awsome team.
So far I have been using CouchDB like we would have used any other modern Document Datastore: in a centraized fashion. One Server at our premises. For backup purposes we replicated on a second couchdb instance running [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://couchdb.apache.org/">CouchDB</a> is a nearly zero-configuration multi-master document oriented database. It is a awsome product build by an awsome team.</p>
<p>So far I <a href="http://blogs.23.nu/c0re/2008/12/building-a-track-and-trace-application-with-couchdb/">have been using CouchDB</a> like we would have used any other modern Document Datastore: in a centraized fashion. One Server at our premises. For backup purposes we replicated on a second couchdb instance running on our backup server.</p>
<p>Hosting about 300 GB of data a small 2.6 GHz Server with consumer-grade disks we started seeing preformance issues. Also we see latency issues since we are hosting some application at Amazon EC2 &#8220;in the cloud&#8221; which<br />
results an an addiotional 40 ms delay for all queries to our locally hosted server.</p>
<p>So this is the right time to use some more of CouchDBs capabilities and spin up additional instances on demand at Amazon EC2. I assume you have already set up an Amazon EC2 account and are comfortable with the general concepts.</p>
<p>There are some tutorials out there which threat EC2 like a regular hosting provider. This is a seriously misguided approach. If you don&#8217;t use EC2 in a way that you always can loose one or two instances, you are using it wrong. If you are not spinning up servers in a way that it takes the same time to set up one instance than it takes to set up 10 instances you are using it wrong.</p>
<p>To use EC2 as it meant to be used, we need automation. We will use <a href="http://reductivelabs.com/trac/puppet">puppet</a> in this example.</p>
<p>I assume that you have installed a &#8220;puppetmaster&#8221; on a machine called puppet.example.com. I also assume the puppet configuration on the puppetmaster is at <code>/etc/puppet</code>. On BSD ist might be located instead at <code>/usr/local/etc/puppet</code>. Place the following content at <code>/etc/puppet/files/etc/couchdb/local.ini</code>:</p>
<p><code></p>
<pre>
[couchdb]
database_dir = /mnt/couchdb
view_index_dir = /mnt/couchdb

[httpd]
bind_address = 0.0.0.0

[couch_httpd_auth]
require_valid_user=true

[admins]
admin = sekrit
</pre>
<p></code></p>
<p>This ensures that only clients which authenticate as user &#8220;admin&#8221; with the password &#8220;sekrit&#8221; are allowed to access the server. You might want to change &#8220;sekrit&#8221; to something more suble.</p>
<p>Add <code>/etc/puppet/fileserver.conf</code> to make sure the local.ini file can be moved the clients:</p>
<p><code>
<pre>
[files]
  path /etc/puppet/files
  allow *
</pre>
<p></code></p>
<p>Then add <code>/etc/puppet/manifests/site.pp</code> to allow automatic installation and configuration:</p>
<p><code></p>
<pre>
class couchserver {
  package { "couchdb": ensure =&gt; latest }
  package { "python-couchdb": ensure =&gt; installed }
  group { "couchdb": ensure =&gt; present }
  user { "couchdb": ensure =&gt; present, groups =&gt; "couchdb",
    comment =&gt; "CouchDB Administrator",
    home =&gt; "/mnt/couchdb" }
  file { "/etc/couchdb": ensure =&gt; directory,
    owner  =&gt; couchdb, group  =&gt; couchdb,
    mode   =&gt; 755 }
  file { "/mnt/couchdb": ensure =&gt; directory,
    owner  =&gt; couchdb, group  =&gt; couchdb,
    mode   =&gt; 700 }
  file {"local.ini":
    mode =&gt; 774,
    owner =&gt; couchdb, group =&gt; couchdb,
    path =&gt; "/etc/couchdb/local.ini",
    source =&gt;
      "puppet://puppet.exmple.com/files/etc/couchdb/local.ini"
  }
  service { couchdb:
    ensure    =&gt; running,
    subscribe =&gt; [Package[couchdb],
                  File["local.ini"],
                  File["/mnt/couchdb"]]
}}

node "PLACEHOLDER" {
    include couchserver
}
</pre>
<p></code></p>
<p>Now we have to create a Amazon &#8220;security group&#8221; to firewall our CouchDB servers. Since I like the belt and suspenders way of doing things we not only will use HTTP-Auth in CouchDB but also firewall rules. You have to have the EC2 commandline tools installed. I assume your comapny has a public IP range at 17.18.19.0/24.</p>
<p><code>
<pre>
$ ec2-add-group couchserver -d 'couchdb server'
$ ec2-authorize couchserver -P tcp -p 5984 -s 17.18.19.0/24
</pre>
<p></code></p>
<p>Next step is starting a EC2 instance. We use a Small Ubuntu 9.10 AMI since it comes with a decent version of CouchDB. We then log in and install Puppet.</p>
<p><code>
<pre>
$ ec2-run-instances ami-a62a01d2 --key YOUR_EC2_SSH_KEY \
  --instance-type m1.small --region eu-west-1 \
  --group default --group couchdb
INSTANCE       <b>i-ec985e9b</b>   ...
$ sleep 120
# get the id from the output of ec2-run-instances
$ ec2-describe-instances <b>i-ec985e9b</b>
INSTANCE       i-ec985e9b      <b>79.125.56.43</b>   10.227.94.80
# get the ip from the output of ec2-describe-instances
$ ssh -i ~/.ssh/YOUR_EC2_SSH_KEY ubuntu@<b>79.125.56.43</b>
# on the EC2 instance:
$ sudo apt-get update -y
$ sudo apt-get install -y puppet
$ puppetd --test --server puppet.example.com
</pre>
<p></code></p>
<p>This will result in a Error message about certificates. The puppet client requested a certificate and you have to sign this certificate at the puppet server. There is still some room for automatation. Log into the puppetmaster and list the signature requests with <code>puppetca -l</code>. You&#8217; see the name of your newly created instance. Sign that name by using <code>puppetca -s</code>:</p>
<p><code>
<pre>
root@puppet:~# puppetca -l
ip-10-20-30-40.eu-west-1.compute.internal
root@puppet:~# puppetca -s ip-10-20-30-40.compute.internal
Signed ip-10-20-30-40.eu-west-1.compute.internal
root@puppet:~# perl -npe 's//ip-10-20-30-40.compute.internal/;' \
   -i.bak /etc/puppet/manifests/site.pp
</pre>
<p></code></p>
<p>The last line automatically edits <code>/etc/puppet/manifests/site.pp</code> to contian configuration information for the new instance. That&#8217;s all there is to do on the puppet master.</p>
<p>Now back on the new instance you can make puppet configure your CouchDB by typing <code>puppetd --test --server puppet.example.com</code>. This should install CouchDB and configure it to use the &#8220;big&#8221; 140 GB disk of your instance and to require password authentication.</p>
<p>You can test if CouchDB is up, running and secured by using cURL:</p>
<p><code>
<pre>
$ curl http://127.0.0.1:5984
{"error":"unauthorized","reason":"Authentication required."}
</pre>
<p></code></p>
<p>This is the point in time where we can start replication from our internal, behind-the-firewall CouchDB to the new box running at Amazon. Since there are some issues regarding commandline tools and authentication I created <a href="http://github.com/mdornseif/couchdb-python/tree/79e9433cab0b27293173849b75f2d0cadda6c8b5">a patched version of python-couchdb at GitHub</a>. Download it <a href="http://github.com/mdornseif/couchdb-python/archives/master">from here</a> to a machine in your internal network, untar it and change in the couchddb-python directory. Then initiate replication:</p>
<p><code>
<pre>
$ PYTHONPATH=. python ./couchdb/tools/manual_replication.py \
  --source=http://couchdb.internal.example.com:5984 \
  --target=http://admin:sekrit@79.125.56.43:5984/ --push \
  --continuous
</pre>
<p></code></p>
<p>After this ran, set up permanent two-way replication between the two Servers:</p>
<p><code>
<pre>
$ PYTHONPATH=. python ./couchdb/tools/manual_replication.py \
  --source=http://couchdb.internal.example.com:5984 \
  --target=http://admin:sekrit@79.125.56.43:5984/ --push
$ PYTHONPATH=. python ./couchdb/tools/manual_replication.py \
  --source=http://admin:sekrit@79.125.56.43:5984/ \
  --target=http://couchdb.internal.example.com:5984 \
  --continuous
</pre>
<p></code></p>
<p>Basicaly that&#8217;s it. We are still missing a few bit&#8217;s and pices to get full automation, but we are nearly there. and for a cluster you probably want more than one CouchDB instance running at Amazon.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2009/12/running-a-couchdb-cluster-on-amazon-ec2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Hoptoad with Django</title>
		<link>http://blogs.23.nu/c0re/2009/12/hoptoad-with-django/</link>
		<comments>http://blogs.23.nu/c0re/2009/12/hoptoad-with-django/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 18:54:56 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=793</guid>
		<description><![CDATA[hoptoad is a hosted web application for filtering and sorting errors from Web Applications. It is very much integrated with the Ruby on Rails community.
For Django there are similar Applications like django-db-log but to my Knowledge there is no hosted solution for Django. Hosted solutions are nice, because some types of errors might prevent you [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hoptoadapp.com">hoptoad</a> is a hosted web application for filtering and sorting errors from Web Applications. It is very much integrated with the Ruby on Rails community.</p>
<p>For Django there are similar Applications like <a href="http://github.com/dcramer/django-db-log">django-db-log</a> but to my Knowledge there is no hosted solution for Django. Hosted solutions are nice, because some types of errors might prevent you from saving information in the local database.</p>
<p><a href="http://static.23.nu/md/Pictures/ZZ7B0C27FE.png"><img src="http://static.23.nu/md/Pictures/ZZ7B0C27FE.png" alt="" width="450" /></a></p>
<p>But there is <a href="http://stevelosh.com/projects/django-hoptoad/">django-hoptoad</a> which brings basic hoptoad functionality to Django.</p>
<p>To use it, got to a href=&#8221;http://hoptoadapp.com&#8221;&gt;hoptoadapp.com</a>, sign up and create a Project. Go to &#8220;Edit Project and tou should see something like &#8220;Current API key: 3c81d132d2f28749eab2043bb4c987a5&#8243;.<br />
There seems an other type of &#8220;auth_token&#8221; which is not per project but per user. Don&#8217;t use this.</p>
<p>If you use the <a href="http://lighthouseapp.com/">Lighthouse Bugtracker</a>, you can add it to your Hotoad configuration at this point to integrate the two Applications.</p>
<p>Now download django-hoptoad form <a href="http://stevelosh.com/projects/django-hoptoad/">it&#8217;s homepage</a> and install it on your server.</p>
<p>Then add something like this to your settings.py:</p>
<p><code>
<pre>
HOPTOAD_NOTIFY_WHILE_DEBUG = True
HOPTOAD_API_KEY = '6c2...b3'
HOPTOAD_NOTIFY_404 = True
HOPTOAD_NOTIFY_403 = True
HOPTOAD_IGNORE_AGENTS = ['Googlebot', 'Yahoo! Slurp']
MIDDLEWARE_CLASSES = list(MIDDLEWARE_CLASSES).append( \
    'hoptoad.middleware.HoptoadNotifierMiddleware')
</pre>
<p></code></p>
<p>That&#8217;s all!</p>
<p>You now can see your issues aggregated by cause, create Lighthouse-Tickets from them and have peace of mind that your exceptions aren&#8217;t lost, even when your servers hard disks are full.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2009/12/hoptoad-with-django/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>VPN between a Fritz!Box Fon and racoon/BSD</title>
		<link>http://blogs.23.nu/c0re/2009/09/vpn-between-a-fritzbox-fon-and-racoonbsd/</link>
		<comments>http://blogs.23.nu/c0re/2009/09/vpn-between-a-fritzbox-fon-and-racoonbsd/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 05:56:50 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=782</guid>
		<description><![CDATA[Fritzbox is an nice WLAN,DSL/VoIP/DECT router from AVM with VPN capabilities. They have a VPN information page but no Information on setting up a VPN to the Kame IPsec stack. To my understanding the Stack is used in OpenBSD, NetBSD and FReeBSD and in some Linux Distributions.
I&#8217;ll setup a VPN between a BSD router with [...]]]></description>
			<content:encoded><![CDATA[<p>Fritzbox is an nice WLAN,DSL/VoIP/DECT router from AVM with VPN capabilities. They <a href="http://www.avm.de/">have a VPN information page</a> but no Information on setting up a VPN to the Kame IPsec stack. To my understanding the Stack is used in OpenBSD, NetBSD and FReeBSD and in some Linux Distributions.</p>
<p>I&#8217;ll setup a VPN between a BSD router with a static IP Address and the Fritz!Box with a dynamically changing IP. Sometimes this is called a &#8220;road warrior&#8221; setup.</p>
<p>Get a Dyndns.org name for your Fritzbox and configure it.</p>
<p>First you need a configuration file for the Fritzbox. Replace A.B.C.D with the IP of your gateway. Also replace the <code>key</code> with something more secret. <code>phase2localid</code> needs to describe the local net of the Fritzbox. <code> accesslist</code> needs to be the remote (BSD) network. Put  your Dyndns Name into <code>localid { fqdn }</code>.</p>
<pre>
/*
 * C:\fritzbox_kame.cfg
 * Thu Sep 24 23:36:34 CEST 2009
 */
vpncfg {
        connections {
                enabled = yes;
                conn_type = conntype_lan;
                name = "BSD";
                always_renew = no;
                reject_not_encrypted = no;
                dont_filter_netbios = yes;
                localip = 0.0.0.0;
                local_virtualip = 0.0.0.0;
                remoteip = A.B.C.D;
                remote_virtualip = 0.0.0.0;
                localid {
                        fqdn = "example.ath.cx";
                }
                remoteid {
                        fqdn = "A.B.C.D";
                }
                mode = phase1_mode_aggressive;
                phase1ss = "all/all/all";
                keytype = connkeytype_pre_shared;
                key = "sekritt";
                cert_do_server_auth = no;
                use_nat_t = no;
                use_xauth = no;
                use_cfgmode = no;
                phase2localid {
                        ipnet {
                                ipaddr = 172.30.20.0;
                                mask = 255.255.255.0;
                        }
                }
                phase2ss = "esp-3des-sha/ah-no/comp-no/pfs";
                accesslist = "permit ip any 192.168.0.0 255.255.0.0";
        }
        ike_forward_rules = "udp 0.0.0.0:500 0.0.0.0:500",
                            "udp 0.0.0.0:4500 0.0.0.0:4500";
}
</pre>
<p>Now you have to set up your Unix Box. I used FreeBSD but to my understanding it&#8217;s the same with OpenBSD and probably also with some Linux Variants and NetBSD. You need to install <code>ipsec-tools</code> and <code>racoon</code>. They might come in two packages or in one or might be already installed. On my FreeBSD box I added something like this in <code>/etc/rc.conf</code>:</p>
<pre>
racoon_enable="YES"
racoon_flags="-l /var/log/racoon.log"
racoon_create_dirs="YES"
</pre>
<p>Next thing is to save your IPsec &#8220;shared secret&#8221; (Password) somewhere:</p>
<pre>
echo "example.ath.cx sekritt" &gt; /usr/local/etc/racoon/psk.txt
</pre>
<p>The last Part missing is <code>/usr/local/etc/racoon/racoon.conf</code>:</p>
<pre>
# racoon.conf
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
log info; # notify info debug;
padding {
        maximum_length 20;
        randomize off;
        strict_check off;
        exclusive_tail off;
      }
listen { isakmp A.B.C.D [500]; # add your public IP here }
timer {
        counter 5;
        interval 20 sec;
        persend 1;
        phase1 30 sec;
        phase2 15 sec;
      }
remote anonymous { # we don't know the peers IP during phase 1
        exchange_mode main, aggressive;
        nonce_size 16;
        lifetime time 140 min;   # sec,min,hour
        initial_contact on;
        proposal_check obey;    # obey, strict or claim
        support_proxy on;
        ike_frag on;
        weak_phase1_check on;
        # important for automatically configuring
        # the Security Policy Database (SPD)
        generate_policy on;
        passive on;
        # Fritz!box
        proposal {
                encryption_algorithm aes;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group 2 ;
        }
      }
 # local net - Fritz net
sainfo address 192.168.0.0/16 any address 172.30.20.0/24 any {
	pfs_group 2;
	lifetime time 8 hour;
	encryption_algorithm aes, 3des, des;
	authentication_algorithm hmac_sha256, hmac_sha1, hmac_md5 ;
	compression_algorithm deflate;
}
</pre>
<p>If you use pf for Packet Filtering you need something like this in <code>/etc/pf.conf</code>:</p>
<pre>
pass on $ext_if proto udp from any port 500 to A.B.C.D port 500 keep state
pass on $ext_if proto udp from A.B.C.D port 500 to any keep state
pass quick on $ext_if proto { esp ah ipencap } from any to A.B.C.D
pass quick on $ext_if proto { esp ah ipencap } from A.B.C.D to any
</pre>
<p>This Configuration still has issues but works.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2009/09/vpn-between-a-fritzbox-fon-and-racoonbsd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HighPoint Rocket Raid driver breaks FreeBSD</title>
		<link>http://blogs.23.nu/c0re/2009/07/the-highpoint-rocket-raid-driver-breaks-freebsd/</link>
		<comments>http://blogs.23.nu/c0re/2009/07/the-highpoint-rocket-raid-driver-breaks-freebsd/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 18:34:48 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=777</guid>
		<description><![CDATA[I run a FreeBSD box with two  SuperMicro AOC-SAT2-MV8 SATA controller providing 8 SATA ports each. Nice setup for a ZFS fileserver.
Unfortunately since 6.3 or so, FreeBSD comes with the hptrr binary blob driver from Highpoint. The hptrr driver breaks detection of the SuperMicro AOC-SAT2-MV8 controllers (which are handled by the ata driver).
Unfortunately the [...]]]></description>
			<content:encoded><![CDATA[<p>I run a FreeBSD box with two  SuperMicro AOC-SAT2-MV8 SATA controller providing 8 SATA ports each. Nice setup for a ZFS fileserver.</p>
<p>Unfortunately since 6.3 or so, FreeBSD comes with the hptrr binary blob driver from Highpoint. The hptrr driver breaks detection of the SuperMicro AOC-SAT2-MV8 controllers (which are handled by the ata driver).</p>
<p>Unfortunately the hptrr is compiled in into recent GENERIC cernels and can not be disabled. To disable it you have to edit the kernel configuration and comment out the &#8220;device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx&#8221; line and rebuild the kernel.</p>
<p>You also have to add the line &#8216;hptrr_load=&#8221;NO&#8221;&#8216; to /boot/loader.conf.</p>
<p>Very annoying.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2009/07/the-highpoint-rocket-raid-driver-breaks-freebsd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Simple &#8220;full text&#8221; search with CouchDB</title>
		<link>http://blogs.23.nu/c0re/2009/01/simple-full-text-search-with-couchdb/</link>
		<comments>http://blogs.23.nu/c0re/2009/01/simple-full-text-search-with-couchdb/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 19:24:17 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[couchdb]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=760</guid>
		<description><![CDATA[To have a shiny application you need domain specific search. E.g. if our call center wants to enter a new order, they might not have the customer number ready. So they need a snappy way to get the customer number based on name, city or whatever.
We did experiment with lot&#8217;s of LIKE queries to our [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ3A62E4E5.png" width="150" height="163" align="right" />To have a shiny application you need domain specific search. E.g. if our call center wants to enter a new order, they might not have the customer number ready. So they need a snappy way to get the customer number based on name, city or whatever.</p>
<p>We did experiment with lot&#8217;s of <code>LIKE</code> queries to our In our <a href="http://en.wikipedia.org/wiki/AS400">legacy</a> ERP database system. This didn&#8217;t feel good, had some SQL injection vulnerabilities and required lot&#8217;s of full table scans. </p>
<p>Looking for alternatives we decided to use <a href="http://couchdb.apache.org/">CouchDB</a>. There is <a href="http://wiki.apache.org/couchdb/Full_text_search">some work</a> on full text indexing for CouchDB you can build something much more simple yourself.</p>
<p>Once a day we copy all customer data from the legacy system into CouchDB. Then we use the map function to <code>emit</code> a line for each word in each data field of each document. It looks like this:</p>
<pre>
function(doc) {
    function output(value) {
        // Split into search terms
        if(value &amp;&amp; (value != "-") &amp;&amp; (value.length &gt; 2)) {
            emit(value, 1);
            for(var word in value.split(" ")) {
                if(word &amp;&amp; (word != "-") &amp;&amp; (word.length &gt; 2)) {
                    emit(word, 1);
                }
            }
        }
    }
    output(doc.kundennr);
    output(doc.name1);
    output(doc.name2);
    output(doc.ort);
    output(doc.land + "-" + doc.plz);
}
</pre>
<p>This basically generates a view (index) containing every word and the document it occurs in. </p>
<p>You now can use that for a prefix based search in a function like this:</p>
<pre>
from couchdb.client import *

def finde_kundendaten(searchstring):
    server = Server('http://couchdb.local.hudora.biz:5984/')
    db = server['kunden']
    rows = []
    while len(rows) &lt; 1 and len(searchstring) &gt; 2:
        rows = db.view('suche/alle_felder', startkey=searchstring, limit=25)
        if rows:
            break
        searchsting = searchstring[:-1]
    return [(x.id, x.key) for x in rows]
</pre>
<pre>
&gt;&gt;&gt; finde_kundendaten("Sport Dornseif") # no exact match in the DB
[(u'51320', u'Sport Alm SysIntersport'),
 (u'27094', u'Sport Freizeit'),
 (u'31071', u'SPORT FREIZEIT  TREFF'),
...]
</pre>
<p>Nifty!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2009/01/simple-full-text-search-with-couchdb/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CouchDB: Improving the interval API</title>
		<link>http://blogs.23.nu/c0re/2008/12/couchdb-improving-the-interval-api/</link>
		<comments>http://blogs.23.nu/c0re/2008/12/couchdb-improving-the-interval-api/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 14:33:06 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[couchdb]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=756</guid>
		<description><![CDATA[I posted this to the couchdb-dev mailinglist but so far it didn&#8217;t arrive. So I store it here
While writing something about using CouchDB I came across the issue of &#8220;slice indexes&#8221; (called startkey and endkey in CouchDB lingo). 
I found no exact definition of startkey and endkey anywhere in the documentation. Testing reveals that access [...]]]></description>
			<content:encoded><![CDATA[<p>I posted this to the <a href="http://mail-archives.apache.org/mod_mbox/couchdb-dev/">couchdb-dev mailinglist</a> but so far it didn&#8217;t arrive. So I store it here</p>
<p>While writing something about using CouchDB I came across the issue of &#8220;slice indexes&#8221; (called startkey and endkey in CouchDB lingo). </p>
<p>I found no exact definition of startkey and endkey anywhere in the documentation. Testing reveals that access on _all_docs and on views documents are retuned in the interval</p>
<p>[startkey, endkey] = (startkey &lt;= k &lt;= endkey).</p>
<p>I don&#8217;t know if this was a conscious design decision. But I like to promote a slightly different interpretation (and thus API change):</p>
<p>[startkey, endkey[ = (startkey &lt;= k &lt; endkey).</p>
<p>Both approaches are valid and used in the real world. Ruby uses the inclusive ("right-closed" in math speak) first approach:</p>
<p>&gt;&gt; l = [1,2,3,4]<br />
&gt;&gt; l.slice(1,2)<br />
=&gt; [2, 3]</p>
<p>Python uses the exclusive (&#8221;right-open&#8221; in math speak) second approach:</p>
<p>&gt;&gt;&gt; l = [1,2,3,4]<br />
&gt;&gt;&gt; l[1:2]<br />
[2]</p>
<p>For array indices both work fine and which one to prefer is mostly an issue of habit. In spoken language both approaches are used: &#8220;Have the Software done until saturday&#8221; probably means right-open to the client and right-closed to the coder.</p>
<p>But if you are working with keys that are more than array indexes, then right-open is much easier to handle. That is because you have to *guess* the biggest value you want to get. The Wiki at http://wiki.apache.org/couchdb/View_collation contains an example of that problem:</p>
<p>It is suggested that you use<br />
startkey=&#8221;_design/&#8221;&amp;endkey=&#8221;_design/ZZZZZZZZZ&#8221;<br />
or<br />
startkey=&#8221;_design/&#8221;&amp;endkey=&#8221;_design/\u9999&#8243;<br />
to get a list of all design documents</p>
<p>This breaks if a design document is named &#8220;ZZZZZZZZZTop&#8221; or &#8220;\9999Iñtërnâtiônàlizætiøn&#8221;. Such names might be unlikely but we are computer scientists; &#8220;unlikely&#8221; is a bad approach to software engineering.</p>
<p>The think what we really want to ask CouchDB is to &#8220;get all documents with keys starting with &#8216;_design/&#8217;&#8221;.</p>
<p>This is basically impossible to do with right-closed intervals. We could use startkey=&#8221;_design/&#8221;&amp;endkey=&#8221;_design0&#8243; (&#8217;0&#8242; is the ASCII character after &#8216;/&#8217;) and this will work fine &#8230; until there is actually a document with the key &#8220;_design0&#8243; in the system. Unlikely, but &#8230;</p>
<p>To make selection by intervals reliable currently clients have to guess the last key (the ZZZZ approach) or use the fist key not to include (the _design0 approach) and then post process the result to remove the last element returned if it exactly matches the given endkey value.</p>
<p>If couchdb would change to a right-open interval approach post processing would go away in most cases. See http://blogs.23.nu/c0re/2008/12/building-a-track-and-trace-application-with-couchdb/ for two real world examples.</p>
<p>At least for string keys and float keys changing the meaning to [startkey, endkey[ would allow selections like</p>
<p>* &#8220;all strings starting with &#8216;abc&#8217;&#8221;<br />
* all numbers between 10.5 and 11</p>
<p>It also would hopefully break not to much existing code. Since the notion of endkey seems to be already considered &#8220;fishy&#8221; (see the ZZZZZ approach) most code seems to try to avoid that issue. For example &#8217;startkey=&#8221;_design/&#8221;&amp;endkey=&#8221;_design/ZZZZZZZZZ&#8221;&#8216; still would work unless you have a design document being named exactly &#8220;ZZZZZZZZZ&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/12/couchdb-improving-the-interval-api/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Building a Track and Trace Application with CouchDB</title>
		<link>http://blogs.23.nu/c0re/2008/12/building-a-track-and-trace-application-with-couchdb/</link>
		<comments>http://blogs.23.nu/c0re/2008/12/building-a-track-and-trace-application-with-couchdb/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 10:28:40 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[couchdb]]></category>
		<category><![CDATA[write code]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=750</guid>
		<description><![CDATA[Background
In my compay we use a logistics application called huLOG. Part of huLOGs (award winning) functionality is to aggregate track and trace events from about two dozen sources. The events are schema free in there nature: some might contain a ZIP code, some may geographic coordinates attached, some relate to a certain packet or pallet [...]]]></description>
			<content:encoded><![CDATA[<p><b>Background</b></p>
<p>In <a href="http://www.hudora.de/">my compay</a> we use a logistics application called <a href="http://blogs.23.nu/disLEXia/tag/hulog/">huLOG</a>. Part of huLOGs (<a href="http://www.prozeus.de/prozeus/daten/broschueren/ean/prozeus_doc03360.htm">award winning</a>) functionality is to aggregate track and trace events from about two dozen sources. The events are <a href="http://books.couchdb.org/relax/why-couchdb">schema free</a> in there nature: <img src="http://static.23.nu/md/Pictures/ZZ4820DF42.jpg" width="250" height="175" align="right" />some might contain a ZIP code, some may geographic coordinates attached, some relate to a certain packet or pallet (called &#8220;movable unit&#8221; in huLOG-spreak) some relate to a certain shipment (which is a group of movable units). Some have file attachments, e.g. Images of the packages, signatures proofing delivery or pictures of the number plates of the trucks.</p>
<p>My first approach was an SQL database. Later I coupled it with a self-designed Document store called <a href="https://cybernetics.hudora.biz/projects/wiki/DoDoStorage">DoDoStorage</a>. For background on that project see <a href="http://blogs.23.nu/c0re/2007/06/antville-15255/">here</a>, <a href="http://blogs.23.nu/c0re/2007/06/antville-15256/">here</a> and <a href="http://blogs.23.nu/c0re/2007/06/antville-15294/">here</a>.</p>
<p>In summer 2007 we experienced severe performance problems with DoDoStorage. I started a rewrite in <a href="http://www.erlang.org/">Erlang</a> and came across Damien Katz and his <a href="http://damienkatz.net/2007/08/">then obscure</a> CouchDB project. It was just in the transition from XML to JSON and Damion assured me that &#8220;it will not be production ready for an other two years&#8221;.</p>
<p>So we decided to solve the DoDoStorage speed issues with more hardware for the time being.</p>
<p>In Fall 2008 the landscape for CouchDB hat changed: it was now <em>the</em> hot thing in database technology and everybody&#8217;s darling. <img src="http://static.23.nu/md/Pictures/ZZ08891B4B.png" width="300" height="99" align="left" />CouchDB 0.9 came around and it started to look usable for serious use. We hired <a href="http://jan.prima.de/">Jan Lenhardt</a>, one of the CouchDB core team to work with us on moving huLOG from PostgreSQL and DoDoStorage to CouchDB.</p>
<p>In December we started migrating services and data over to a CouchDB based system. While CouchDB has its wards we are very happy with it so far.</p>
<p><b>Data Model</b></p>
<p>As stated above tracking data comes in many different flavors ad colors. It might reference an MUI (&#8221;movable unit ID&#8221;), a shipment or both. Let&#8217;s concentrate on events referencing a MUI. Some typical tracking events might look like this:</p>
<pre>
{
   "_id": "01420000000378-20061005T064500.000000",
   "mui": "01420000000378",
   "shipment": 572,
   "message": "Processing, 0132-Vlotho, Route 0132, Code 101",
   "code": "410",
   "timestamp": "20061005T064500.000000",
   "facility": "DPD Depot 0132",
   "ort": "Vlotho (DE)",
   "plz": "32657"
},
{
   "_id": "01420000000378-20061005T085400.000000",
   "mui": "01420000000378",
   "shipment": 572,
   "message": "proof of delivery",
   "code": "421",
   "timestamp": "20061005T085400.000000",
   "plz": "32634",
   "_attachments": {
       "POD.pdf": {
           "stub": true,
           "content_type": "application/pdf",
           "length": 136446
       }
   }
}
</pre>
<p>One thing about my choice of keys (the <code>_id</code> field). I have choosen a &#8220;meaningful&#8221; ID over traditional &#8220;random&#8221; <a href="http://en.wikipedia.org/wiki/Uuid">UUIDs</a>. The IDs we use consist of <code>MUI-Timestamp</code> The Timestamp is the time the event was generated (e.g. the pallet was loaded). The good news is that this automatically keeps my database free of duplicates. <img src="http://static.23.nu/md/Pictures/ZZ7E379DE6.jpg" width="250" height="150" align="right" />If I import the same file with events twice, the events will have the same IDs during both imports and thus the second import will overwrite the first one: exactly what I want.</p>
<p>The bad news is that while physically there can&#8217;t really happen two events at once due to clock drift etc. I might get two different events for a MUI with exactly the same timestamp. This would result in the same key being generated for both events and thus the second event would overwrite the first one. With the relatively sparse populated space of timestamps I expect this to happen once in 10.000 events or so.</p>
<p>For huLOG it is acceptable to use one in 10.000 events &#8211; especially if it is the earlier one. We only get about 95% of the events we should get due to problems in the track and trace infrastructure of the freight companies. As long as the all important &#8220;has been handed to the customer&#8221; messages arrive, our system has to be able to handle missing messages.</p>
<p><b>Data Access by MUI</b></p>
<p>With that we just need a few view functions to work with the data. Most obvious we want to get all documents for a certain MUI. </p>
<p>This is easy since our document IDs already contain the MUI. We only have to get a list of all IDs starting with MUI. The CouchDB <a href="http://wiki.apache.org/couchdb/HTTP_Document_API">Document API</a> already provides that functionality:</p>
<pre>
$ curl -s 'http://localhost:5984/hulog_events/_all_docs
  ?startkey=%22094147562251-0%22
  &amp;endkey=%2209445147562253-9%22
  &amp;include_docs=true' 

{"total_rows":184708,"offset":184705,"rows":[
{"id":"09445147562251-20081114T165600.000000",
 "key":"09445147562251-20081114T165600.000000",
 "value":{"rev":"463392510"},
 "doc": {..., "message":"Einrollung, 0147, Route 0280, Code 461 105",
        "mui":"09445147562251", "shipment":124524}},
{"id":"09445147562253-20081114T165700.000000",
 "key":"09445147562253-20081114T165700.000000",
 "value":{"rev":"2436256439"},
 "doc":  {..., "message":"Einrollung, 0280, Route 0234, Code 461 105",
          "mui":"09445147562253", "shipment":124524}}
]}
</pre>
<p>Some things to note: <code>startkey</code> and <code>endkey</code> must be set to valid <a href="http://www.json.org/">JSON objects</a>. We want a <em>string</em> containing the mui so we have to put &#8220;quotes&#8221; arround it. <img src="http://static.23.nu/md/Pictures/ZZ7947F22D.jpg" width="250" height="187" align="right" />After URL-encoding we end up with <code>%22094147562251%22</code>.</p>
<p>The returned documents are within the interval <code>[startkey:endkey]</code>. If we choose a startkey which is guaranteed same or smaller than the key we want to retrieve. That&#8217;s easy: <code>09445147562251</code> is smaller than any string which has more characters and starts with <code>09445147562251</code>. Endkey is somewhat more tricky. What is the biggest value? <code>0944514756225<b>2</b></code>? This might catch one record to much, because there actually might be a key <code>0944514756225<b>2</b></code>.</p>
<p>A common idiom used in the Erlang community is to use something like <code>09445147562251Z</code> as the endkey. But then what is if there actually is a key <code>09445147562251Zabc</code>? So use <code>09445147562251ZZZZZ</code>, but &#8230;</p>
<p>An other suggestion is using a &#8220;high unicode character&#8221; like <code>\u9999</code>. But at least there is no highest unicode code point and you are well of in considering the sorting rules for obscure unicode characters as indetermistic. See <a href="http://wiki.apache.org/couchdb/View_collation">the CouchDB Wiki</a> for further information.</p>
<p>In our case all this is no problem. The MUI is followed by a ISO 8601 timestamp. So<br />
<code>startkey=094147562251-0, endkey=09445147562253-9</code> should work fine until the end of year 8999.</p>
<p><b>Data Access by Shipment</b></p>
<p>That was easy. Now we want to access data based on something which is not encoded in the document ID. Say the &#8220;shipment&#8221; number. For that we need a map function which gives us shipment numbers.</p>
<pre>
map: function(doc) {
    if(doc.shipment) {
        emit(doc.shipment, null);
    }
}
</pre>
<p>We permanently save this function in the server to allow CouchDB to play its clever optimization tricks. See <A href="http://wiki.apache.org/couchdb/HTTP_view_API">the CouchDB wiki</a> for more information on the HTTP View API. You could use the Futon GUI at http://localhost:5984/_utils/ for that or curl:</p>
<pre>
 curl -X PUT -H 'Content-Type: applicatioe": "javascript",
  "views": {"all":{"map":"function(doc){if(doc.shipment)
                          {emit(doc.shipment, null);}}"}}}
  ' http://localhost:5984/hulog_events/_design%2fsendung

{"ok":true,"id":"_design/sendung","rev":"23237918"}
</pre>
<p><img src="http://static.23.nu/md/Pictures/ZZ7356C227.png" width="250" height="221" align="left" />Now we can query the view and with the startkey and endkey parameters. Here we get again into trouble for choosing the endkey. The hack we used for the IDs did work because there was a timestamp of well known format in the ID so we construct a &#8220;slightly bigger&#8221; value. Shipments are numeric. So what is bigger than 128996? 128997 is obviously bigger but would get us documents for two shipments (128996 and 128997). Since the shipments are numeric, a trick like &#8220;128996Z&#8221; does not work out.</p>
<p>But numeric comparing of numeric values in JavaScript work nicely with different numeric types. Shipments are integers. If we use a float key we nicely can place it to be bigger than 128996 but smaller than 128997. We use 128996.1 as our endkey.</p>
<pre>
$ curl 'http://localhost:5984/hulog_events/_view/shipment/all
  ?startkey=128996&amp;endkey=128996.1'

{"total_rows":184707,"offset":184674,"rows":[
{"id":"09445122481336-20081223T105212.491567","key":128996,"value":null},
{"id":"09445122481336-20081223T155200.000000","key":128996,"value":null},
{"id":"09445122481336-20081223T202600.000000","key":128996,"value":null},
{"id":"09445122481337-20081223T105216.377305","key":128996,"value":null},
{"id":"09445122481337-20081223T155300.000000","key":128996,"value":null},
{"id":"09445122481337-20081223T202500.000000","key":128996,"value":null}
]}
</pre>
<p>You can also add <code>&amp;include_docs=true</code> to the query &#8211; this will get you the complete documents, not only the IDs.</p>
<p>At this point we have a scalable, elegant datastore for our Track &amp; trace related events ad files.</p>
<p><b>Usage</b></p>
<p>Currently we are running CouchDB with subset of our tracking archives. This subset is about a quarter million documents of wich 20% or so have attachments resulting in a database size of about 5 GB. No complains so far.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/12/building-a-track-and-trace-application-with-couchdb/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>How map/reduce works in CouchDB</title>
		<link>http://blogs.23.nu/c0re/2008/12/how-mapreduce-works-in-couchdb/</link>
		<comments>http://blogs.23.nu/c0re/2008/12/how-mapreduce-works-in-couchdb/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 16:41:18 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[couchdb]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=740</guid>
		<description><![CDATA[I have huge trouble how CouchDBs system of views actually works.
By experimenting and reading the source I came up with thisdescription in pseudo Python:

def mapstep(alldata):
    # the map is applied to every document
    # and the result is collected in two lists of rows
    k_rows = [...]]]></description>
			<content:encoded><![CDATA[<p>I have huge trouble how <a href="http://couchdb.apache.org/">CouchDBs</a> system of <A href="http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views">views</a> actually works.</p>
<p>By experimenting and reading the source I came up with thisdescription in pseudo Python:</p>
<pre>
def mapstep(alldata):
    # the map is applied to every document
    # and the result is collected in two lists of rows
    k_rows = []
    v_rows = []
    for _id, doc in alldata:
       k, v = mapfun(doc) # actually mapfunc uses emit() not return()
       k_rows.append([k, _id])
       v_rows.append(v)
    return k_rows, v_rows

def reducestep(keys, values):
    # now several reduce steps follow. For this example
    # we randomly chose two
    # all even elements
    tmp1 = reducefun(k_rows[::2], v_rows u[::2], False)
    # all uneven elements
    tmp2 = reducefun(k_rows[1::2], v_rows u[1::2], False) 

    # finally several rereduce steps follow.
    # For this example we use only one.
    return reducefun(None, [tmp1, tmp2], True)

result = reducestep(mapstep(alldocs()))
</pre>
<p>If you call the view with <code>group=true</code> the map step stays the same, but the server applies grouping and calls the reduce step for each group. It looks like this:</p>
<pre>
def reduce_with_grouping(keys, values):
    gdict = {}
    # create dictionary mapping values to keys
    for k, v in zip(keys, values):
        gdict.setdefault(k, []).append(v)
    ret = []
    for k, values in gdict.items():
        ret.append([k, reducestep(k*len(values), values])
    return ret

result = reduce_with_grouping(mapstep(alldocs()))
</pre>
<p>If you experiment with views keep in mind that the the Futon Web-Client silently adds <code>group=true</code> to your views and that <code>group=true</code> is ignored if you don&#8217;t provide a reduce function.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/12/how-mapreduce-works-in-couchdb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CouchDB broke my Box (not)</title>
		<link>http://blogs.23.nu/c0re/2008/12/couchdb-broke-my-box-not/</link>
		<comments>http://blogs.23.nu/c0re/2008/12/couchdb-broke-my-box-not/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 21:46:54 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[couchdb]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=738</guid>
		<description><![CDATA[
I tried to see how much beating CouchDB can take. So I installed it on a modest box (1.8GHz, 512 MB RAM, Debian) and started at 12:00h pouring data in it. At about 22:00h I asked for the computation of a simple view while still dumping data into it. At that Time it contained about [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ0424CF57.jpg" width="360" height="296" alt="" /></p>
<p>I tried to see how much beating <a href="http://couchdb.apache.org/">CouchDB</a> can take. So I installed it on a modest box (1.8GHz, 512 MB RAM, Debian) and started at 12:00h pouring data in it. At about 22:00h I asked for the computation of a simple view while still dumping data into it. At that Time it contained about 400.000 Documents of with about 10 % contained an Attatchment. DB size was on Disk was about 8 GB.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ5096B7EA.jpg" width="360" height="244" alt="" /></p>
<p>And an hour later (now) I can&#8217;t reach the box anymore.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/12/couchdb-broke-my-box-not/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>departicularifier for NRG MP 161 Scanfaxprinter</title>
		<link>http://blogs.23.nu/c0re/2008/11/departicularifier-for-nrg-mp-161-scanfaxprinter/</link>
		<comments>http://blogs.23.nu/c0re/2008/11/departicularifier-for-nrg-mp-161-scanfaxprinter/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 12:56:57 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[write code]]></category>

		<guid isPermaLink="false">http://blogs.23.nu/c0re/?p=728</guid>
		<description><![CDATA[If you own a NRG/Rex-Rotary/Aficio/Ricoh/Gestetner MP 161 Fax/Scan/Print combination you might have noticed the annoying habit  of that device to chop E-Mail messages of scanned Images into multiple parts. This is implemented by using MIME message/partial Semantics.
While there are obscure mail applications which are able to read message/partial modern software ignores it, because it [...]]]></description>
			<content:encoded><![CDATA[<p>If you own a NRG/Rex-Rotary/Aficio/Ricoh/Gestetner MP 161 Fax/Scan/Print combination you might have noticed the annoying habit <img src="http://static.23.nu/md/Pictures/ZZ0FD1ACAE.png" width="200" height="40" alt="" align="right"> of that device to chop E-Mail messages of scanned Images into multiple parts. This is implemented by using <a href="http://www.ietf.org/rfc/rfc2046.txt">MIME message/partial</a> Semantics.</p>
<p>While there are obscure mail applications which are able to read message/partial modern software ignores it, because it is <a href="https://www.kb.cert.org/vuls/id/836088">a huge security issue</a>.</p>
<p>This in turn means, I can&#8217;t open longer documents mailed by the MP 161 to me. </p>
<p>Because I like to scan large documents, I hate this quirk of the MP 161. So I wrote a Python tool called departicularifier which connects to an IMAP server, downloads the mails send by the fax, reassembles and decodes the messages and dumps the files on your harddisk.</p>
<pre>
$ python departicularifier.py --help
Usage: departicularifier.py --user=you@example.com [options].
Try departicularifier.py --help for details.

Extract files from message/partial MIME messages generated by NRG MP 161
scanfax appliances.

Options:
  --version            show program's version number and exit
  -h, --help           show this help message and exit
  --server=SERVER      hostname of the IMAPS server where the messages are
                       stored (default: "mail.hudora.biz")
  --user=USER          User name for logging into the server (default: "none")
  --password=PASSWORD  Pasword used to login (default: ask for password)
  --folder=FOLDER      Folder to scann for messages (default: "INBOX")
  --sender=SENDER      Sender whose messages to process (default: "scanner@")
  --dir=DIR            Destination directory (default: ".")
</pre>
<p>For you it need probably some fiddeling with the parameters. A run shoul look like this:</p>
<pre>
$ python decoder.py --user=m.dornseif@example.com
connecting to 'mail.hudora.biz' as 'm.dornseif@example.com'.
Password:
[long wait]
writing ./20080528132721094.pdf
writing ./20080528130042306.pdf
writing ./20080528131755217.pdf
</pre>
<p>You can download <a href="http://static.23.nu/md/Pictures/departicularifier.py">departicularifier.py here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/11/departicularifier-for-nrg-mp-161-scanfaxprinter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reliable Software Design</title>
		<link>http://blogs.23.nu/c0re/2008/09/antville-18926/</link>
		<comments>http://blogs.23.nu/c0re/2008/09/antville-18926/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 05:58:36 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>
		<category><![CDATA[write code]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/09/antville-18926/</guid>
		<description><![CDATA[Avoiding Race conditions
A typical situation in ERP systems is, that you have to use SQL tables as an &#8220;interface&#8221; between applications.
Let&#8217;s say you want to submit an order. You write an &#8220;order header&#8221; containing the customer number etc and orderlines how much to ship of what.
order = {'customer_no': 12345,
       [...]]]></description>
			<content:encoded><![CDATA[<p>Avoiding Race conditions</p>
<p>A typical situation in ERP systems is, that you have to use SQL tables as an &#8220;interface&#8221; between applications.<br />
Let&#8217;s say you want to submit an order. You write an &#8220;order header&#8221; containing the customer number etc and orderlines how much to ship of what.</p>
<pre>order = {'customer_no': 12345,
         'delivery_date': '2001-01-01',
         'orderlines': [{'item_no': '10105', 'quantity': 80},
                        {'item_no': '14600', 'quantity': 12}]
        }</pre>
<p>In SQL you use two tables and add some primary keys:</p>
<pre>order_head:

id   | customer_no | delivery_date | processed
-----+-------------+---------------------------
5123 | 12345       | 2001-01-01    | False

orderline:

orderid | item_no | quantity
--------+---------+----------
5123    | 10105   | 80
5123    | 14600   | 12</pre>
<p>Since oldschool databases usually don&#8217;t have auto incrementing keys, you usually have to write something like this to insert an order:</p>
<pre>next_id = query('SELECT MAX(id) FROM order_head')
query('INSERT INTO order_head (id, customer_no, delivery_date, processed)
       VALUES(%d, '12345', '2001-01-01', False)" % next_id)
query('INSERT INTO orderline (orderid | item_no | quantity)
       VALUES(%d, '10105', 80)" % next_id)
query('INSERT INTO orderline (orderid | item_no | quantity)
       VALUES(%d, '14600', 12)" % next_id)</pre>
<p>This has some issues: what if some programm starts reading after you have written order_head and the first orderline, but not the second one? The ustomer would not get the goods from the second orderline. Transaction in modern SQL databases can solve this, but if you don&#8217;t have transactions you can solfe this problem in otehr ways. Let&#8217;s assume the code in the ERP for processing this interface looks like this:</p>
<pre>for order in query('SELECT * FROM order_head'):
    for orderlines in query("SELECT * FROM orderline
                             WHERE orderid='%d'" % order.id):
        # do something with order and orderline
    query("UPDATE orderline SET processed=True
           WHERE orderid='%d'" % order.id)</pre>
<p>This means that orderlines are never read unless there is also an header with the respective ID. So if we write the orderlines first we are save from them beeing read if tey are not ready yet. So by reordering our code we can make it already much more robust:</p>
<pre>next_id = query('SELECT MAX(id) FROM order_head')
query('INSERT INTO orderline (orderid | item_no | quantity)
       VALUES(%d, '10105', 80)" % next_id)
query('INSERT INTO orderline (orderid | item_no | quantity)
       VALUES(%d, '14600', 12)" % next_id)
query('INSERT INTO order_head (id, customer_no, delivery_date, processed)
       VALUES(%d, '12345', '2001-01-01', False)" % next_id)</pre>
<p>This already avoids the race condition &#8220;reading while writing&#8221;. But what if two processes try to write orders at once? Then <code>next_id = query('SELECT MAX(id) FROM order_head')</code> would result in both processes getting the same next_id and this mixing up two orders into a single one.</p>
<p>The easiest solution is to ensure that only one process can ever write orders. This avoids lot&#8217;s of trouble. But it is suprisingly hard to enforce that. So by having code which reduces the risk of dual write race conditions we can make our program much more robust.</p>
<p>One approach would be to use SQL functionality like this to insert the head?</p>
<pre>query('INSERT INTO order_head (id, customer_no, delivery_date, processed)
       VALUES(SELECT MAX(id) FROM order_head, '12345', '2001-01-01', False)")</pre>
<p>This would ensure that no id is used twice but how would we get the ID we generated for our order? <code>SELECT MAX(id) FROM order_head</code> would not help since some other program might have inserted another record in the meantime.</p>
<p>We are here in an situation where we can&#8217;t make the code reliable without resorting to some tricks. In this case the <code>processed</code> field is our solution: Teh application reading the database ignores all records where processed == True. So as long as we set processed to True we can use the other fields for whatever we like. In this case we use the date field to temporary store an unique id identifying the record.</p>
<p>So let&#8217;s generate a nice 10 character random value:</p>
<pre>token = hex((int(time.time() * 10000)
            ^ (os.getpid() &lt;&lt; 16)
            ^ thread.get_ident() &lt;&lt; 8)
           % 0xFFFFFFFFFF).rstrip('L')[2:]</pre>
<p>If this random value is guaranteed to be unique it&#8217;s easy to write a robust insertation code.</p>
<pre>def insert_order():
    token = hex((int(time.time() * 10000)
        ^ (os.getpid() &lt;&lt; 16)
        ^ thread.get_ident() &lt; 1:
    next_id = query('SELECT MAX(id) FROM order_head')
    query('INSERT INTO order_head (id, customer_no, delivery_date, processed)
       VALUES(%d, '12345', %r, False)" % (next_id, token))
    rowcount = query('SELECT COUNT(*) FROM order_head WHERE id = %d' % next_id)
    if rowcount &gt; 1:
       # the race condition has hit - remove our entry and retry
        query('DELETE FROM order_head WHERE delivery_date = %r' % token)
        time.sleep(random.randint()/100.0)
        insert_order()
    else:
        query('INSERT INTO orderline (orderid | item_no | quantity)
               VALUES(%d, '10105', 80)" % next_id)
        query('INSERT INTO orderline (orderid | item_no | quantity)
               VALUES(%d, '14600', 12)" % next_id)
        # fix up the header
        query('UPDATE order_head SET delivery_date='2001-01-01',
               processed=False WHERE delivery_date=%r' % token)
</pre>
<p>While this code is much more complex than the original, it can guarantee that no race conditions occur as long as <code>token</code> is unique.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/09/antville-18926/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gude Expert Power Control NET</title>
		<link>http://blogs.23.nu/c0re/2008/09/antville-18870/</link>
		<comments>http://blogs.23.nu/c0re/2008/09/antville-18870/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 09:34:17 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/09/antville-18870/</guid>
		<description><![CDATA[The Gude Expert Power Control NET switch is an ethernet controllable power socket. It an switch a single socket. It sells for about 125 Euro.
It can be controlled by HTTP although it uses GET requests wich breaks idempotence. Still: it works:
curl http://admin:admin@192.168.0.225/SWITCH.CGI?s1=0 &#62; /dev/null
One nice thing about the Switch is the fact that it supports [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ7F106E1B.jpg" width="150" height="171" alt="" align="right">The <a href="http://www.gude.info/index.php?lng=0&amp;section=products&amp;product=epcnet">Gude Expert Power Control NET</a> switch is an ethernet controllable power socket. It an switch a single socket. It sells for about 125 Euro.</p>
<p>It can be controlled by HTTP although it uses GET requests wich breaks <a href="http://en.wikipedia.org/wiki/Idempotent">idempotence</a>. Still: it works:</p>
<p><code>curl http://admin:admin@192.168.0.225/SWITCH.CGI?s1=0 &gt; /dev/null</code></p>
<p>One nice thing about the Switch is the fact that it supports DHCP.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/09/antville-18870/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ePowerSwitch-4</title>
		<link>http://blogs.23.nu/c0re/2008/09/antville-18869/</link>
		<comments>http://blogs.23.nu/c0re/2008/09/antville-18869/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 09:11:39 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/09/antville-18869/</guid>
		<description><![CDATA[The ePowerSwitch-4 is a ethernet controllable power socket by Leuning GmbH. It is designed to be rack-mountable and comes in a solid PVC housing.
The Software Stack running on the Switch seems to be based on QNX and acts quite reasonable. (See the manual for an overview). E.g. you can use curl to switch ports on [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ07B68386.jpg" width="150" height="100" alt="" align="right">The <a href="http://www.leunig.de/_en/_pro/remote-power-switch/eps.htm">ePowerSwitch-4</a> is a ethernet controllable power socket by Leuning GmbH. It is designed to be rack-mountable and comes in a solid PVC housing.</p>
<p>The Software Stack running on the Switch seems to be based on QNX and acts quite reasonable. (See <a href="http://static.23.nu/md/Pictures/EPS-4_2006_11_DE.pdf">the manual</a> for an overview). E.g. you can use curl to switch ports on and off. E.g.</p>
<p><code> curl --data 'P4=0' -i http://admin:admin@192.168.100.100/config/home_f.html</code></p>
<p>to switch Port 4 off.</p>
<p>One thing I don&#8217;t like about the device is the fact that it doesn&#8217;t support DHCP but needs a fixed IP. On the Pro side it comes with an additional RS-232 port for configuration and operation.</p>
<p>The Switch is on sale for about 400 Euro which results in a cost per port of about 100 Euro.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/09/antville-18869/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hooray!</title>
		<link>http://blogs.23.nu/c0re/2008/08/antville-18744/</link>
		<comments>http://blogs.23.nu/c0re/2008/08/antville-18744/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 12:31:27 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/08/antville-18744/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ0BF4D2C6.png" width="430" height="65" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/08/antville-18744/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/08/antville-18725/</link>
		<comments>http://blogs.23.nu/c0re/2008/08/antville-18725/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 03:47:39 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/08/antville-18725/</guid>
		<description><![CDATA[
[root@champ /]# zpool status
  pool: tank
 state: UNAVAIL
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        UNAVAIL      0     0     0  insufficient replicas
	  [...]]]></description>
			<content:encoded><![CDATA[<pre>
[root@champ /]# zpool status
  pool: tank
 state: UNAVAIL
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        UNAVAIL      0     0     0  insufficient replicas
	  raidz1    UNAVAIL      0     0     0  corrupted data
	    da0     ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    da2     ONLINE       0     0     0
	    da3     ONLINE       0     0     0
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/08/antville-18725/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time Sux</title>
		<link>http://blogs.23.nu/c0re/2008/08/antville-18706/</link>
		<comments>http://blogs.23.nu/c0re/2008/08/antville-18706/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 09:19:12 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/08/antville-18706/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ57D0A13E.png" width="495" height="288" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/08/antville-18706/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Authenticate Apache 2.2 against Zimbra LDAP</title>
		<link>http://blogs.23.nu/c0re/2008/08/antville-18693/</link>
		<comments>http://blogs.23.nu/c0re/2008/08/antville-18693/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 18:18:30 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/08/antville-18693/</guid>
		<description><![CDATA[Add something like this to httpd.conf.

LoadModule authz_host_module libexec/apache22/mod_authz_host.so
LoadModule authz_user_module libexec/apache22/mod_authz_user.so
LoadModule authnz_ldap_module libexec/apache22/mod_authnz_ldap.so
LoadModule authz_default_module libexec/apache22/mod_authz_default.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule auth_digest_module libexec/apache22/mod_auth_digest.so
LoadModule ldap_module libexec/apache22/mod_ldap.so

  AuthName "HUDORA Internal"
  AuthType Basic
  AuthBasicProvider ldap
  AuthLDAPURL ldap://zimbra.example.com/?mail
  Require valid-user

This should alow you to login as yourmail@zimbra.example.com with your zimbra password.
Enjoy!
]]></description>
			<content:encoded><![CDATA[<p>Add something like this to <code>httpd.conf</code>.</p>
<pre>
LoadModule authz_host_module libexec/apache22/mod_authz_host.so
LoadModule authz_user_module libexec/apache22/mod_authz_user.so
LoadModule authnz_ldap_module libexec/apache22/mod_authnz_ldap.so
LoadModule authz_default_module libexec/apache22/mod_authz_default.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule auth_digest_module libexec/apache22/mod_auth_digest.so
LoadModule ldap_module libexec/apache22/mod_ldap.so

  AuthName "HUDORA Internal"
  AuthType Basic
  AuthBasicProvider ldap
  AuthLDAPURL ldap://zimbra.example.com/?mail
  Require valid-user
</pre>
<p>This should alow you to login as <code>yourmail@zimbra.example.com</code> with your zimbra password.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/08/antville-18693/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to monitor Disk temperature with 3ware controllers, FreeBSD 7 and munin</title>
		<link>http://blogs.23.nu/c0re/2008/08/antville-18672/</link>
		<comments>http://blogs.23.nu/c0re/2008/08/antville-18672/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 10:00:23 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/08/antville-18672/</guid>
		<description><![CDATA[1. The munin-node code in FreeBSD seems not to be the most recent version. I downloaded this, replaced the first line with #!/usr/bin/perl and moved the file to /usr/local/etc/munin/plugins/hddtemp_smartctl. I also had to remove the lime below &#8220;# Avoid spinning up sleeping disks&#8221; in hddtemp_smartctl to make it work.
For monitoring 4 disks connected to a [...]]]></description>
			<content:encoded><![CDATA[<p>1. The <a href="http://munin.projects.linpro.no/">munin-node</a> code in FreeBSD seems not to be the most recent version. I downloaded <a href="http://munin.projects.linpro.no/browser/trunk/node/node.d/hddtemp_smartctl.in?rev=1491&amp;format=raw">this</a>, replaced the first line with <code>#!/usr/bin/perl</code> and moved the file to /usr/local/etc/munin/plugins/hddtemp_smartctl. I also had to remove the lime below &#8220;# Avoid spinning up sleeping disks&#8221; in hddtemp_smartctl to make it work.</p>
<p>For monitoring 4 disks connected to a 3ware 9500S-12 i changed /usr/local/etc/munin/plugin-conf.d/plugins.conf to read:</p>
<pre>
[hddtemp_smartctl]
user root
env.smartctl /usr/local/sbin/smartctl
env.drives ad0 da0 da1 da2 da3
env.type_da0 3ware,1
env.type_da1 3ware,1
env.type_da2 3ware,2
env.type_da3 3ware,3
env.dev_da0 twa0
env.dev_da1 twa0
env.dev_da2 twa0
env.dev_da3 twa0
</pre>
<p>Finally you have to install /usr/ports/sysutils/smartmontools.</p>
<p>That&#8217;s it</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/08/antville-18672/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/08/antville-18643/</link>
		<comments>http://blogs.23.nu/c0re/2008/08/antville-18643/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 16:54:29 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/08/antville-18643/</guid>
		<description><![CDATA[cp: /usr/local/fogbugz/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak: name too long (not copied)
]]></description>
			<content:encoded><![CDATA[<p>cp: /usr/local/fogbugz/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak/.1.bak: name too long (not copied)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/08/antville-18643/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Packages I needed to get http://laconi.ca/ running on FreeBSD 7:</title>
		<link>http://blogs.23.nu/c0re/2008/08/antville-18641/</link>
		<comments>http://blogs.23.nu/c0re/2008/08/antville-18641/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 14:02:50 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/08/antville-18641/</guid>
		<description><![CDATA[apache-2.2.9 mhash-0.9.9 mysql-client-5.0.51a pear-1.7.2 pecl-fileinfo-1.0.4 pecl-filter-0.11.0 pecl-hash-1.5 pecl-json-1.2.1 php5-5.2.6 php5-calendar-5.2.6 php5-ctype-5.2.6 php5-curl-5.2.6 php5-dba-5.2.6 php5-dom-5.2.6 php5-extensions-1.1 php5-gd-5.2.6 php5-gettext-5.2.6_1 php5-gmp-5.2.6 php5-iconv-5.2.6 php5-ldap-5.2.6 php5-mbstring-5.2.6 php5-mcrypt-5.2.6 php5-mhash-5.2.6 php5-mysql-5.2.6 php5-openssl-5.2.6 php5-pcre-5.2.6 php5-pdo-5.2.6 php5-pdo_sqlite-5.2.6 php5-posix-5.2.6 php5-readline-5.2.6 php5-recode-5.2.6_1 php5-session-5.2.6 php5-simplexml-5.2.6 php5-spl-5.2.6 php5-sqlite-5.2.6 php5-tokenizer-5.2.6 php5-xml-5.2.6 php5-xmlreader-5.2.6 php5-xmlwriter-5.2.6 php5-zlib-5.2.6 recode-3.6_7.
]]></description>
			<content:encoded><![CDATA[<p>apache-2.2.9 mhash-0.9.9 mysql-client-5.0.51a pear-1.7.2 pecl-fileinfo-1.0.4 pecl-filter-0.11.0 pecl-hash-1.5 pecl-json-1.2.1 php5-5.2.6 php5-calendar-5.2.6 php5-ctype-5.2.6 php5-curl-5.2.6 php5-dba-5.2.6 php5-dom-5.2.6 php5-extensions-1.1 php5-gd-5.2.6 php5-gettext-5.2.6_1 php5-gmp-5.2.6 php5-iconv-5.2.6 php5-ldap-5.2.6 php5-mbstring-5.2.6 php5-mcrypt-5.2.6 php5-mhash-5.2.6 php5-mysql-5.2.6 php5-openssl-5.2.6 php5-pcre-5.2.6 php5-pdo-5.2.6 php5-pdo_sqlite-5.2.6 php5-posix-5.2.6 php5-readline-5.2.6 php5-recode-5.2.6_1 php5-session-5.2.6 php5-simplexml-5.2.6 php5-spl-5.2.6 php5-sqlite-5.2.6 php5-tokenizer-5.2.6 php5-xml-5.2.6 php5-xmlreader-5.2.6 php5-xmlwriter-5.2.6 php5-zlib-5.2.6 recode-3.6_7.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/08/antville-18641/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18608/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18608/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 19:49:06 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18608/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ6C5715C5.png" width="496" height="163" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18608/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18606/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18606/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 14:32:20 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18606/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ3F8E1E30.png" width="490" height="162" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18606/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18572/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18572/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 12:18:55 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18572/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ7DD5F8BB.jpg" width="451" height="192" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18572/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18566/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18566/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 10:50:48 +0000</pubDate>
		<dc:creator>cklein</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18566/</guid>
		<description><![CDATA[Remember, Java methods are inherited, constructors are not.
]]></description>
			<content:encoded><![CDATA[<p>Remember, Java methods are inherited, constructors are not.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18566/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Week of the unstable hosts</title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18536/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18536/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 15:25:32 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18536/</guid>
		<description><![CDATA[
host# last
root             ttyp0    172.30.cc.dd     Mon Jul 14 17:32   still logged in
reboot           ~             [...]]]></description>
			<content:encoded><![CDATA[<pre>
host# last
root             ttyp0    172.30.cc.dd     Mon Jul 14 17:32   still logged in
reboot           ~                         Mon Jul 14 17:10
root             ttyp1    172.30.cc.dd     Mon Jul 14 10:19 - crash  (06:50)
root             ttyp0    172.30.cc.dd     Mon Jul 14 10:14 - 14:00  (03:45)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18536/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18534/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18534/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 10:58:45 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18534/</guid>
		<description><![CDATA[-rw-r&#8211;r&#8211;   1 root           wheel   117G Jul 14 12:44 alte_outlook_Archive-pst.tar
]]></description>
			<content:encoded><![CDATA[<p>-rw-r&#8211;r&#8211;   1 root           wheel   117G Jul 14 12:44 alte_outlook_Archive-pst.tar</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18534/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18528/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18528/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 07:21:53 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18528/</guid>
		<description><![CDATA[
(mypl_produktion@airvent)1&#62; dets: file "/mnt/fastdisk/kernelE/Mnesia.mypl_produktion@airvent/articleaudit.DAT" not properly closed, repairing ...

]]></description>
			<content:encoded><![CDATA[<pre>
(mypl_produktion@airvent)1&gt; dets: file "/mnt/fastdisk/kernelE/Mnesia.mypl_produktion@airvent/articleaudit.DAT" not properly closed, repairing ...
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18528/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Production Server after upgrading Memory</title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18527/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18527/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 04:53:46 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18527/</guid>
		<description><![CDATA[
hurricane# last
root             ttyp0    172.30.20.86     Sun Jul 13 08:39   still logged in
reboot           ~             [...]]]></description>
			<content:encoded><![CDATA[<pre>
hurricane# last
root             ttyp0    172.30.20.86     Sun Jul 13 08:39   still logged in
reboot           ~                         Sun Jul 13 04:09
root             ttyp0    172.30.20.86     Sun Jul 13 00:06 - crash  (04:02)
root             ttyp0    172.30.20.86     Sun Jul 13 00:04 - 00:06  (00:02)
reboot           ~                         Sun Jul 13 00:03
root             ttyp1    172.30.20.86     Sat Jul 12 21:45 - crash  (02:18)
root             ttyp1    172.30.20.86     Fri Jul 11 18:20 - 22:13  (03:52)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18527/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WTF?</title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18526/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18526/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 20:03:26 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18526/</guid>
		<description><![CDATA[
[root@hurricane /usr/local/kernelE]# ntpdate 192.168.0.1
12 Jul 23:59:19 ntpdate[25265]: step time server 192.168.0.1 offset 3892.081501 secConnection to hurricane.local... closed
lichtblik2k8-2:~ md$

]]></description>
			<content:encoded><![CDATA[<pre>
[root@hurricane /usr/local/kernelE]# ntpdate 192.168.0.1
12 Jul 23:59:19 ntpdate[25265]: step time server 192.168.0.1 offset 3892.081501 secConnection to hurricane.local... closed
lichtblik2k8-2:~ md$
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18526/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang</title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18525/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18525/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 18:56:16 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18525/</guid>
		<description><![CDATA[
{provpipeline,10,"R119813880.500144"}
Floating point exception (core dumped)
                                      hurricane#

]]></description>
			<content:encoded><![CDATA[<pre>
{provpipeline,10,"R119813880.500144"}
Floating point exception (core dumped)
                                      hurricane#
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18525/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fakes</title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18523/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18523/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 14:00:37 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18523/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ0D9DE739.png" width="698" height="718" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18523/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18517/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18517/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 18:46:41 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18517/</guid>
		<description><![CDATA[
CPU: Dual Core AMD Opteron(tm) Processor 275 (2193.76-MHz K8-class CPU)
  Origin = "AuthenticAMD"  Id = 0x20f12  Stepping = 2
  Features=0x178bfbff
  Features2=0x1
  AMD Features=0xe2500800
  AMD Features2=0x3
  Cores per package: 2
real memory  = 7516192768 (7168 MB)
avail memory = 6199308288 (5912 MB)
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
 cpu0 (BSP): [...]]]></description>
			<content:encoded><![CDATA[<pre>
CPU: Dual Core AMD Opteron(tm) Processor 275 (2193.76-MHz K8-class CPU)
  Origin = "AuthenticAMD"  Id = 0x20f12  Stepping = 2
  Features=0x178bfbff
  Features2=0x1
  AMD Features=0xe2500800
  AMD Features2=0x3
  Cores per package: 2
real memory  = 7516192768 (7168 MB)
avail memory = 6199308288 (5912 MB)
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP): APIC ID:  1
 cpu2 (AP): APIC ID:  2
 cpu3 (AP): APIC ID:  3
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18517/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exploitable? You Bet!</title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18480/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18480/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 14:01:16 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18480/</guid>
		<description><![CDATA[opt/zimbra/convertd/cnvcache/+g7aKFgyOcKP67IHCadr,W8Kj2o=/
overflow: xflags=0xfa l1=255 l2=772 lastname=opt/zimbra/convertd/cnvcache/3McZPku7lCoPZhg5/CmR6\#015\#012O1vo93bROkl1dljLK+QCT1wB6UAZ99z8P4v+ucf/AKEKn1e6le40rT0EhinUPIsbbWkAH3c9\#015\#012h61LPpN1P4dj0syQB1wpk5xtByOPWrN1pj3lvaO0iwX9rgpIgyue4I7g0AVZLa5jvrSfTtOa\#015\#0120CvtnG9Arp7gHk+9Flsn1/URqe1pI8CCOX7oi55UHj0yavqupTFFme3gXILtCSzP7DI+XP41\#015\#012n/Z59Sv72W2vLQ7WEZVoPMKAdsn8elAFKznawsNbvbVFMKOVtZiMk5ODg91HFTwWLz6KqHTt\#015\#012880Yf7S0y7y5GQ2eoq3YzTXVxeaPqkcUojjBLxDCsp7EdjUttZ6hYQrbW9xbzQIMRtMrb0Ho\#015\#012ccNj8KALenC5WwgS/KtdKMOQc59DmrSnB6VFbxtBCqSTPM4+9I+Mkn2HQe1SEAqVyRuGMjqK\#015\#012AOSeNrG2urfXbGSeOWTc17F8xI7ZPUYrU1CTS5tFtUmklltpCohSNiXlI4A9/wAf506PTr+K\#015\#012xksftqSwvuHmyIWkCnt1wfrS3GhRm3sVtJTDLYnMLONwPTO4e+O1AFK4MsPiXS5VtltPPDI6\#015\#012BgSygfxAccZ96micQeK7ptSZV3RD7Kzn5Qv8WPQ1Nc6TdXd1b3j3qLdwNlAseYgvfjOSffNR\#015\#012LG2oazffZ9TeGSJVjeNYR8o+rZ756UAN0i38y81eRYl/s2ZgY1dPldsckD0pPBsUf9ipMUTz\#015\#012fMYb9ozj61Pp1zeJrE2m3Uy3kaRb/OVdpTJ+62OKm0nS5dKBhjuw9oGLLGY/mGe27PT8KALV\#015\#012pY21n5xtYRH5zb3&#215;3NWF9qqafaTWpuTNdPcebJuUOMbB6VbNAB+hNZviMf8AEiux3+X [receiver]
ERROR: buffer overflow in recv_file_entry [receiver]
rsync error: error allocating core memory buffers (code 22) at util.c(122) [receiver=3.0.2]
overflow: xflags=0xfa l1=255 l2=772 lastname=opt/zimbra/convertd/cnvcache/3McZPku7lCoPZhg5/CmR6\#015\#012O1vo93bROkl1dljLK+QCT1wB6UAZ99z8P4v+ucf/AKEKn1e6le40rT0EhinUPIsbbWkAH3c9\#015\#012h61LPpN1P4dj0syQB1wpk5xtByOPWrN1pj3lvaO0iwX9rgpIgyue4I7g0AVZLa5jvrSfTtOa\#015\#0120CvtnG9Arp7gHk+9Flsn1/URqe1pI8CCOX7oi55UHj0yavqupTFFme3gXILtCSzP7DI+XP41\#015\#012n/Z59Sv72W2vLQ7WEZVoPMKAdsn8elAFKznawsNbvbVFMKOVtZiMk5ODg91HFTwWLz6KqHTt\#015\#012880Yf7S0y7y5GQ2eoq3YzTXVxeaPqkcUojjBLxDCsp7EdjUttZ6hYQrbW9xbzQIMRtMrb0Ho\#015\#012ccNj8KALenC5WwgS/KtdKMOQc59DmrSnB6VFbxtBCqSTPM4+9I+Mkn2HQe1SEAqVyRuGMjqK\#015\#012AOSeNrG2urfXbGSeOWTc17F8xI7ZPUYrU1CTS5tFtUmklltpCohSNiXlI4A9/wAf506PTr+K\#015\#012xksftqSwvuHmyIWkCnt1wfrS3GhRm3sVtJTDLYnMLONwPTO4e+O1AFK4MsPiXS5VtltPPDI6\#015\#012BgSygfxAccZ96micQeK7ptSZV3RD7Kzn5Qv8WPQ1Nc6TdXd1b3j3qLdwNlAseYgvfjOSffNR\#015\#012LG2oazffZ9TeGSJVjeNYR8o+rZ756UAN0i38y81eRYl/s2ZgY1dPldsckD0pPBsUf9ipMUTz\#015\#012fMYb9ozj61Pp1zeJrE2m3Uy3kaRb/OVdpTJ+62OKm0nS5dKBhjuw9oGLLGY/mGe27PT8KALV\#015\#012pY21n5xtYRH5zb3&#215;3NWF9qqafaTWpuTNdPcebJuUOMbB6VbNAB+hNZviMf8AEiux3+X [generator]
ERROR: buffer overflow in recv_file_entry [generator]
rsync error: error allocating core memory buffers (code 22) at util.c(122) [generator=3.0.2]
]]></description>
			<content:encoded><![CDATA[<p>opt/zimbra/convertd/cnvcache/+g7aKFgyOcKP67IHCadr,W8Kj2o=/<br />
overflow: xflags=0xfa l1=255 l2=772 lastname=opt/zimbra/convertd/cnvcache/3McZPku7lCoPZhg5/CmR6\#015\#012O1vo93bROkl1dljLK+QCT1wB6UAZ99z8P4v+ucf/AKEKn1e6le40rT0EhinUPIsbbWkAH3c9\#015\#012h61LPpN1P4dj0syQB1wpk5xtByOPWrN1pj3lvaO0iwX9rgpIgyue4I7g0AVZLa5jvrSfTtOa\#015\#0120CvtnG9Arp7gHk+9Flsn1/URqe1pI8CCOX7oi55UHj0yavqupTFFme3gXILtCSzP7DI+XP41\#015\#012n/Z59Sv72W2vLQ7WEZVoPMKAdsn8elAFKznawsNbvbVFMKOVtZiMk5ODg91HFTwWLz6KqHTt\#015\#012880Yf7S0y7y5GQ2eoq3YzTXVxeaPqkcUojjBLxDCsp7EdjUttZ6hYQrbW9xbzQIMRtMrb0Ho\#015\#012ccNj8KALenC5WwgS/KtdKMOQc59DmrSnB6VFbxtBCqSTPM4+9I+Mkn2HQe1SEAqVyRuGMjqK\#015\#012AOSeNrG2urfXbGSeOWTc17F8xI7ZPUYrU1CTS5tFtUmklltpCohSNiXlI4A9/wAf506PTr+K\#015\#012xksftqSwvuHmyIWkCnt1wfrS3GhRm3sVtJTDLYnMLONwPTO4e+O1AFK4MsPiXS5VtltPPDI6\#015\#012BgSygfxAccZ96micQeK7ptSZV3RD7Kzn5Qv8WPQ1Nc6TdXd1b3j3qLdwNlAseYgvfjOSffNR\#015\#012LG2oazffZ9TeGSJVjeNYR8o+rZ756UAN0i38y81eRYl/s2ZgY1dPldsckD0pPBsUf9ipMUTz\#015\#012fMYb9ozj61Pp1zeJrE2m3Uy3kaRb/OVdpTJ+62OKm0nS5dKBhjuw9oGLLGY/mGe27PT8KALV\#015\#012pY21n5xtYRH5zb3&#215;3NWF9qqafaTWpuTNdPcebJuUOMbB6VbNAB+hNZviMf8AEiux3+X [receiver]<br />
ERROR: buffer overflow in recv_file_entry [receiver]<br />
rsync error: error allocating core memory buffers (code 22) at util.c(122) [receiver=3.0.2]<br />
overflow: xflags=0xfa l1=255 l2=772 lastname=opt/zimbra/convertd/cnvcache/3McZPku7lCoPZhg5/CmR6\#015\#012O1vo93bROkl1dljLK+QCT1wB6UAZ99z8P4v+ucf/AKEKn1e6le40rT0EhinUPIsbbWkAH3c9\#015\#012h61LPpN1P4dj0syQB1wpk5xtByOPWrN1pj3lvaO0iwX9rgpIgyue4I7g0AVZLa5jvrSfTtOa\#015\#0120CvtnG9Arp7gHk+9Flsn1/URqe1pI8CCOX7oi55UHj0yavqupTFFme3gXILtCSzP7DI+XP41\#015\#012n/Z59Sv72W2vLQ7WEZVoPMKAdsn8elAFKznawsNbvbVFMKOVtZiMk5ODg91HFTwWLz6KqHTt\#015\#012880Yf7S0y7y5GQ2eoq3YzTXVxeaPqkcUojjBLxDCsp7EdjUttZ6hYQrbW9xbzQIMRtMrb0Ho\#015\#012ccNj8KALenC5WwgS/KtdKMOQc59DmrSnB6VFbxtBCqSTPM4+9I+Mkn2HQe1SEAqVyRuGMjqK\#015\#012AOSeNrG2urfXbGSeOWTc17F8xI7ZPUYrU1CTS5tFtUmklltpCohSNiXlI4A9/wAf506PTr+K\#015\#012xksftqSwvuHmyIWkCnt1wfrS3GhRm3sVtJTDLYnMLONwPTO4e+O1AFK4MsPiXS5VtltPPDI6\#015\#012BgSygfxAccZ96micQeK7ptSZV3RD7Kzn5Qv8WPQ1Nc6TdXd1b3j3qLdwNlAseYgvfjOSffNR\#015\#012LG2oazffZ9TeGSJVjeNYR8o+rZ756UAN0i38y81eRYl/s2ZgY1dPldsckD0pPBsUf9ipMUTz\#015\#012fMYb9ozj61Pp1zeJrE2m3Uy3kaRb/OVdpTJ+62OKm0nS5dKBhjuw9oGLLGY/mGe27PT8KALV\#015\#012pY21n5xtYRH5zb3&#215;3NWF9qqafaTWpuTNdPcebJuUOMbB6VbNAB+hNZviMf8AEiux3+X [generator]<br />
ERROR: buffer overflow in recv_file_entry [generator]<br />
rsync error: error allocating core memory buffers (code 22) at util.c(122) [generator=3.0.2]</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18480/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>using JasperReports &amp; pyJasper</title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18473/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18473/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 13:16:08 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18473/</guid>
		<description><![CDATA[Two years ago or so we where looking into ways to generate various PDF documents from python. I had used various ways of generating PDFs before like directly outputting Postscript (code generation!) and converting to PDF, FPDF, ReportLab and HTML2PDF. I was looking fore something more &#8220;What you see is what you get&#8221; like. And [...]]]></description>
			<content:encoded><![CDATA[<p>Two years ago or so we where looking into ways to generate various PDF documents from python. I had used various ways of generating PDFs before like directly outputting Postscript (code generation!) and converting to PDF, <a href="http://www.fpdf.org/">FPDF</a>, <a href="http://www.reportlab.org/">ReportLab</a> and HTML2PDF. I was looking fore something more &#8220;What you see is what you get&#8221; like. And i wanted integrated PDF generation.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ36F85F50.png" width="200" height="235" align="right">It turned out <a href="http://en.wikipedia.org/wiki/JasperReports">JasperReports</a> had all I needed. While Jasper is promoted as reporting solution it can be used as a simple PDF generator. Together with the <a href="http://www.jasperforge.org/sf/projects/ireport">iReport visual report designer</a> we had the complete Toolchain. USers could use iReport to &#8220;paint&#8221; the desired PDF output using placeholders for all the variable data to be filled in. iReport would save this design in a <code>.jrxml</code> file. The jasper library would then compile that file to a <code>.jasper</code> file for performance reasons. </p>
<p>For generation the actual report you would feed that <code>.jasper</code>  and a &#8220;datasource&#8221; to the JasperReports library.. A datasource could be a SQL/JDBC query or an xml-file. This datasource would than be used to fill in the placeholders you left in the  <code>.jrxml</code> and generate a PDF.</p>
<p>All nice and smooth. The only problem is: Jasper Reports is written in Java and our application stack is written mostly in Python. I also avoid programming Java whenever possible. I feel incredibly clumsy when having to code in Java.</p>
<p><a href="http://www.jython.org/">Jython</a> to the rescue! Jython allows you to access Java libraries and still write Python code. this is done by having Python running inside a Java VM.  Wit some help we where able to generate PDFs from jython. But the whole beast was still running inside the java VM.</p>
<p>So to call it from our regular Python code running inside mod_python on the Apache web server we had to write the XML to disk, fork a process, fire up the Java VM with Jython and the call the Jasper library to generate the PDF from the XML and the jrxml report source code.</p>
<p>Worked but took about 7 seconds per document. This was OK for low volume production but for some application we needed much shorter turn-arround times. It turned out, starting up the java VM was the biggest time consumer. So we created a long running Jython process which received PDF rendering jobs via a home grown UDP Protocol. It was messi. Sending absolute filesystem paths via UDP was probably not a good idea but it worked. PDF Generation times where down to 1.5 seconds or so. Using ths structure we have been running 21 months or so and generated about 500.000 PDFs.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ523D0E54.png" width="400" height="68" alt="" /></p>
<p>But it was still a mess. Especially it meant that every server which had to generate PDFs also needed Java installed. And Java on FreeBSD Servers is very limited fun. So we came up with a servlet based approach: There would be a webserver; upon POSTing a XML datasource and a JRXML file to a specific URL you would get back a rendered PDF. As a Java based Webserver we use <a href="http://www.mortbay.org/jetty-6/">Jetty</a> which is driving a Jython servlet calling the JasperReports library. Works like a charm.</p>
<p>After using it for 9 Months or so Im just in the process of publishing this Jetty based version real soon now(TM). It will be available at <a href="http://cybernetics.hudora.biz/projects/wiki/pyJasper">http://cybernetics.hudora.biz/projects/wiki/pyJasper</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18473/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/07/antville-18451/</link>
		<comments>http://blogs.23.nu/c0re/2008/07/antville-18451/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 12:39:34 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/07/antville-18451/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures2/SafariScreenSnapz005.jpg" width="511" height="189" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/07/antville-18451/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>German zip codes</title>
		<link>http://blogs.23.nu/c0re/2008/06/antville-18440/</link>
		<comments>http://blogs.23.nu/c0re/2008/06/antville-18440/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 20:24:31 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/06/antville-18440/</guid>
		<description><![CDATA[

			
			&#60;!&#8211;

						
							This browser does not have a Java Plug-in.
							
							
								Get the latest Java Plug-in here.
							
						
					
			
			&#60;!&#8211;

			This is based on Ben Fry&#8217;s zipdecode and PLZ.tab from OpenGeoDB. I used a simple script to preprocess the data.

			Built with Processing.
			
If the Java Applet doesn&#8217;t work, try this page. Klick into the applet and tipe a few numbers, e.g. &#8220;42&#8243;

]]></description>
			<content:encoded><![CDATA[<div id="content">
<div id="round_09c_focus_handling_container">
<p>			<!--[if !IE]&gt; --></p>
<p>			&lt;!&#8211;</p>
<p>
						<strong><br />
							This browser does not have a Java Plug-in.<br />
							<br />
							<a href="http://java.sun.com/products/plugin/downloads/index.html" title="Download Java Plug-in"><br />
								Get the latest Java Plug-in here.<br />
							</a><br />
						</strong>
					</p>
<p>			<!--[if !IE]&gt; --></p>
<p>			&lt;!&#8211;</p></div>
<p>
			This is based on Ben Fry&#8217;s <a href="http://benfry.com/zipdecode/">zipdecode</a> and <a href="http://fa-technik.adfc.de/code/opengeodb/PLZ.tab">PLZ.tab</a> from <a href="http://opengeodb.hoppe-media.com/">OpenGeoDB</a>. I used <a href="http://static.23.nu/md/Pictures/convertPLZ.py">a simple script</a> to preprocess the data.</p>
<p>
			Built with <a href="http://processing.org" title="Processing.org">Processing</a>.
			</p>
<p>If the Java Applet doesn&#8217;t work, try <a href="http://md.hudora.de/c0de/zipdecodeDE/">this page</a>. Klick into the applet and tipe a few numbers, e.g. &#8220;42&#8243;</p>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/06/antville-18440/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD Jails and Utility computing</title>
		<link>http://blogs.23.nu/c0re/2008/06/antville-18404/</link>
		<comments>http://blogs.23.nu/c0re/2008/06/antville-18404/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 16:26:29 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/06/antville-18404/</guid>
		<description><![CDATA[Using the FreeBSD Jail mechanism, I&#8217;m slowly getting to a minimal Admin intervention Server setup:

host# ezjail-admin create -f djangoserver extranet a.b.c.6
host# /usr/local/etc/rc.d/ezjail.sh start extranet


workstation# ssh a.b.c.6
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
	The Regents of the University of California.  All rights reserved.

FreeBSD 7.0-RELEASE (GENERIC) #0: Sun Feb 24 10:35:36 UTC 2008

This is [...]]]></description>
			<content:encoded><![CDATA[<p>Using the <a href="http://en.wikipedia.org/wiki/FreeBSD_jail">FreeBSD Jail</a> mechanism, I&#8217;m slowly getting to a minimal Admin intervention Server setup:</p>
<pre>
host# <b>ezjail-admin create -f djangoserver extranet a.b.c.6</b>
host# <b>/usr/local/etc/rc.d/ezjail.sh start extranet</b>
</pre>
<pre>
workstation# <b>ssh a.b.c.6</b>
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
	The Regents of the University of California.  All rights reserved.

FreeBSD 7.0-RELEASE (GENERIC) #0: Sun Feb 24 10:35:36 UTC 2008

This is a preconfigured virtual machine (jail) for running Django applications.
Avoid manual configuration!
[md@extranet ~]$ <b>su</b>
extranet# <b>cd /usr/local/www</b>
extranet# <b>svn co https://example.com/.../projects/extranet/trunk extranet</b>
extranet# <b>ln -s /usr/local/www/extranet /usr/local/www/djangoprojectdir</b>
extranet# <b>sh /usr/local/etc/rc.d/apache22 start</b>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/06/antville-18404/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/06/antville-18342/</link>
		<comments>http://blogs.23.nu/c0re/2008/06/antville-18342/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 08:00:35 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/06/antville-18342/</guid>
		<description><![CDATA[
/***************************************\
*            FogBugz 6 Setup            *
\***************************************/

--    Checking for required tools
FogBugz requires Mono 1.2.3 or later.
FogBugz requires gmcs.
FogBugz requires PHP 5.1 or later to be installed and in your path (also php-mysql [...]]]></description>
			<content:encoded><![CDATA[<pre>
/***************************************\
*            FogBugz 6 Setup            *
\***************************************/

--    Checking for required tools
FogBugz requires Mono 1.2.3 or later.
FogBugz requires gmcs.
FogBugz requires PHP 5.1 or later to be installed and in your path (also php-mysql and php-imap modules).
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/06/antville-18342/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang</title>
		<link>http://blogs.23.nu/c0re/2008/05/antville-18201/</link>
		<comments>http://blogs.23.nu/c0re/2008/05/antville-18201/#comments</comments>
		<pubDate>Sat, 31 May 2008 08:12:06 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/05/antville-18201/</guid>
		<description><![CDATA[
xxx
"R119813880.470703"
Floating point exception (core dumped)
                                      [root@hurricane /usr/local/kernelE]#

]]></description>
			<content:encoded><![CDATA[<pre>
xxx
"R119813880.470703"
Floating point exception (core dumped)
                                      [root@hurricane /usr/local/kernelE]#
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/05/antville-18201/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/05/antville-18192/</link>
		<comments>http://blogs.23.nu/c0re/2008/05/antville-18192/#comments</comments>
		<pubDate>Fri, 30 May 2008 14:51:24 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/05/antville-18192/</guid>
		<description><![CDATA[
$ make
erlc +smp -Ivendor -Iinclude  -o ebin src/generic_tcp_server.erl
make: *** [ebin/generic_tcp_server.beam] Bus error

]]></description>
			<content:encoded><![CDATA[<pre>
$ make
erlc +smp -Ivendor -Iinclude  -o ebin src/generic_tcp_server.erl
make: *** [ebin/generic_tcp_server.beam] Bus error
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/05/antville-18192/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Good habit &#8230;</title>
		<link>http://blogs.23.nu/c0re/2008/05/antville-18138/</link>
		<comments>http://blogs.23.nu/c0re/2008/05/antville-18138/#comments</comments>
		<pubDate>Sun, 25 May 2008 15:30:41 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/05/antville-18138/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ17BCBBC0.png" width="363" height="83" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/05/antville-18138/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delete aolsystemmsg logfiles from iChat</title>
		<link>http://blogs.23.nu/c0re/2008/05/antville-18017/</link>
		<comments>http://blogs.23.nu/c0re/2008/05/antville-18017/#comments</comments>
		<pubDate>Fri, 09 May 2008 07:20:36 +0000</pubDate>
		<dc:creator>cklein</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/05/antville-18017/</guid>
		<description><![CDATA[This little AppleScript can be used as a folder action to remove
the aolsystemmsg iChat logs.
delete aolsystemmsgs
]]></description>
			<content:encoded><![CDATA[<p>This little AppleScript can be used as a folder action to remove<br />
the aolsystemmsg iChat logs.</p>
<p><a href="http://static.23.nu/antville/c0re/files">delete aolsystemmsgs</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/05/antville-18017/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatically configuring Snom VoIP Telephones for Asterisk</title>
		<link>http://blogs.23.nu/c0re/2008/04/antville-17948/</link>
		<comments>http://blogs.23.nu/c0re/2008/04/antville-17948/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 05:12:42 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>
		<category><![CDATA[hack the planet!]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/04/antville-17948/</guid>
		<description><![CDATA[If you configure VoIP Telephones for use with the Asterisk PBX you usually have to edit at least three places: sim.conf, extensions.conf ant the phone itself. I wanted a way to have configuration at a single place like this:

# MAC       TelNr SIP-Username   Monitor Caller-IDs    [...]]]></description>
			<content:encoded><![CDATA[<p>If you configure VoIP Telephones for use with the <a href="http://www.asterisk.org/">Asterisk PBX</a> you usually have to edit at least three places: sim.conf, extensions.conf ant the phone itself. I wanted a way to have configuration at a single place like this:</p>
<pre>
# MAC       TelNr SIP-Username   Monitor Caller-IDs       Realname
0004132620A2 4130 pudel          4623,4629,4677,4630      Carsten Pudel
000413262E20 4110 bibo           4132,4116,4124,4131,4138 Birgit Bonrath
0004132620a7 4111 edornseif      4122,4137,4901,4611,4133 Evelyn Dornseif
00041323B063 4112 mdornseif      4110,4132,4116,4124      Dr. Dornseif
</pre>
<p><em>MAC</em> is the <a href="http://en.wikipedia.org/wiki/MAC_address">MAC-Address</a> (can be found under the phone below a barcode), <em> TelNr</em> is the desired extension where this phone should be reachable, <em>SIP-Username</em> is the sip user name you wish to use for this phone.  <em>Monitor Caller-IDs</em> is the list of other phone numbers (up to 8) which should be monitored via the special buttons on the right of a Snom telephone.</p>
<p>The Python script <a href="http://static.23.nu/md/Pictures/snom.py">snom.py</a> reads the configuration shown above from a file called <code>snom.txt</code>. It then generates a lot of new configuration files:</p>
<table>
<tr>
<td>sip-snom.conf</td>
<td>SIP Account information, usually put into sip.conf by typing <code>#include sip-snom.conf</code></td>
</tr>
<tr>
<td>extensions-snom.conf</td>
<td>Dialplan information, usually put into your extensions.conf by typing <code>#include extensions-snom.conf</code> in your [default] context.</td>
</tr>
<tr>
<td>extensions-intercom-snom.conf</td>
<td>Generates a context [intercom-allsnoms] which allows you to speak a messge through the loudspeakers of all your snome phones. Include it in your extensions.conf with something like <code>exten =&gt; 1234,1,Goto(intercom-allsnoms,s,1)</code></td>
</tr>
<tr>
<td>dhcpd-snom.conf</td>
<td>can be used by your dhcp-Server to give out reasonable adresses to your snom phones</td>
</tr>
<tr>
<td>phonebook-snom.txt</td>
<td>A phone book in <a href="http://trac.edgewall.org/">Trac</a> Wiki Syntax.<br />
</tr>
<tr>
<td>snom/phonebook.xml</td>
<td>Phonebook in XML Format used by Snom Phones</td>
</tr>
<tr>
<td>snom/snom3&#215;0-000413XXXXXX.htm</td>
<td>Configuration for phone with the MAC-Address <code>000413XXXXXX</code></td>
</tr>
<tr>
<td>snom/snom3&#215;0-keys-ZZZZ.pdf</td>
<td>Keyboard Layout for Phone with Extension ZZZZ. Needs ps2pdf from the Ghostscript package</td>
</tr>
</table>
<p>To make Snom Auto configuration (&#8221;<a href="http://wiki.snom.com/Functions/Phone/Mass_deployment">Mass Deployment</a>&#8220;) work you need to update your Phones to <a href="http://wiki.snom.com/Firmware">Firmeware V7</a>. You also need a webserver beeing able to deliver the directory <code>./snom/</code>. I assume the Webserver is available at the IP-Address <code>172.28.1.2</code>. </p>
<p>Finally you need some additional files:</p>
<p><b><code>snom/snom3x0.htm</code></b> &#8211; master configuration file</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;setting-files&gt;
  &lt;file url="http://172.28.1.2/snom/general.xml" /&gt;
  &lt;file url="http://172.28.1.2/snom/phonebook.xml" /&gt;
  &lt;file url="http://provisioning.snom.com/config/web_lang.xml" /&gt;
  &lt;file url="http://provisioning.snom.com/config/gui_lang.xml" /&gt;
&lt;/setting-files&gt;
</pre>
<p><b><code>snom/general.xml</code></b> &#8211; configuration for all you phones</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;settings&gt;
 &lt;phone-settings&gt;
  &lt;challenge_response perm="&amp;"&gt;off&lt;/challenge_response&gt;
  &lt;filter_registrar perm="&amp;"&gt;off&lt;/filter_registrar&gt;
  &lt;guess_number perm="&amp;"&gt;off&lt;/guess_number&gt;
  &lt;user_phone perm="&amp;"&gt;off&lt;/user_phone&gt;
  &lt;silence_compression perm="&amp;"&gt;off&lt;/silence_compression&gt;
  &lt;date_us_format perm="&amp;"&gt;off&lt;/date_us_format&gt;
  &lt;time_24_format perm="&amp;"&gt;on&lt;/time_24_format&gt;
  &lt;user_outbound idx="1" perm="$"&gt;172.28.1.2&lt;/user_outbound&gt;
  &lt;user_host idx="1" perm="$"&gt;172.28.1.2&lt;/user_host&gt;
  &lt;user_pname idx="1" perm="$"&gt;&lt;/user_pname&gt;
  &lt;user_active idx="1" perm="$"&gt;on&lt;/user_active&gt;
  &lt;user_sipusername_as_line idx="1" perm="$"&gt;on&lt;/user_sipusername_as_line&gt;
  &lt;ntp_server perm="$"&gt;172.28.1.2&lt;/ntp_server&gt;
  &lt;timezone perm="$"&gt;GER+1&lt;/timezone&gt;
  &lt;web_language perm="$"&gt;Deutsch&lt;/web_language&gt;
  &lt;language perm="$"&gt;Deutsch&lt;/language&gt;
  &lt;tone_scheme perm="$"&gt;GER&lt;/tone_scheme&gt;
 &lt;/phone-settings&gt;
&lt;/settings&gt;
</pre>
<p>Nov configure your Phones to get the Configuration from your Webserver and you are done. Ether use DHCP or edit the phones configuration at Advanced -&gt; Update -&gt; Setting URL:</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ58F384E4.png" width="474" height="123" alt="" /></p>
<p>Save, reboot and you should be done.</p>
<p>Now all Phones</p>
<p>* Are configured automatically<br />
* get nice printed labels<br />
* get a up-to date phonebook</p>
<p>while you yourself have only to edit a single file &#8211; <code>snom.txt</code>. This was tested with &#8220;Asterisk 1.2.24-BRIstuffed-0.3.0-PRE-1y-k&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/04/antville-17948/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17540/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17540/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 08:25:49 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17540/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/Qlickview2.png" width="355" height="244" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17540/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17537/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17537/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 07:34:22 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17537/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/QlickviewSucks.png" width="445" height="177" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17537/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accessing a AS/400 from Linux</title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17514/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17514/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 06:07:33 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17514/</guid>
		<description><![CDATA[It took me a long time to configure a Debian Box to access our iSeries. Here are the basics:
1. Install unixodbc
2. Install IBM iSeriesAccess
3. edit  /etc/odbcinst.ini

[ODBC]
Trace		= No
TraceFile	= /tmp/sql.log
ForceTrace	= No
Pooling		= Yes

[iSeries Access ODBC Driver]
Description	= iSeries Access for Linux ODBC Driver
Driver		= /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Driver64	    = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup		= /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
Setup64		= /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
UsageCount	= 1
CPTimeout	=
CPReuse		=
Threading	= 2
DontDLClose	= 1
FileUsage	= 1
# TRACE   [...]]]></description>
			<content:encoded><![CDATA[<p>It took me a long time to configure a Debian Box to access our iSeries. Here are the basics:</p>
<p>1. Install unixodbc</p>
<p>2. Install IBM iSeriesAccess</p>
<p>3. edit  /etc/odbcinst.ini</p>
<pre>
[ODBC]
Trace		= No
TraceFile	= /tmp/sql.log
ForceTrace	= No
Pooling		= Yes

[iSeries Access ODBC Driver]
Description	= iSeries Access for Linux ODBC Driver
Driver		= /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Driver64	    = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup		= /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
Setup64		= /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
UsageCount	= 1
CPTimeout	=
CPReuse		=
Threading	= 2
DontDLClose	= 1
FileUsage	= 1
# TRACE           = 31
</pre>
<p>4. edit /etc/odbc.ini</p>
<pre>
; see http://publib.boulder.ibm.com/infocenter/
            iseries/v5r3/?topic=/rzaik/connectkeywords.htm
; ConnectionType=0 = Read/Write | 1 = Read/Call | 2 = Read-only

[AS400]
;CCSID=1208 ; utf-8 unicode
; 273 germany
CCSID			= 819 ; latin-1
UNICODESQL 		= 1
Description		= Production AS/400 Database
Driver			= iSeries Access ODBC Driver
System			= as400.example.com
UserID			= ODBC_RW
Password		= Hj12SDf7gZ
DefaultLibraries	= SMKDIFP ; you have to change this
AllowDataCompression	= 1
AllowUnsupportedChar	= 1
ForceTranslation	= 0
Trace			= 0
TraceFile               = /tmp/odbc.trace
Servername		= as400.example.com
</pre>
<p>You now can type <code>isql AS400</code> to access your machine.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17514/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17493/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17493/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 16:05:51 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17493/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/QlickviewSux2.png" width="420" height="212" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17493/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Laser Range finder &amp; Python</title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17485/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17485/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 17:03:07 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>
		<category><![CDATA[warehouse]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17485/</guid>
		<description><![CDATA[
The Hokuyo URG04 LIDAR now works as expected. This is the code I used to read and display the data.
See here for possible applications.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ2DF4B1F8.png" width="400" height="400" alt="" /></p>
<p><a href="http://blogs.23.nu/c0re/stories/17478/">The Hokuyo URG04</a> LIDAR now works as expected. <a href="http://static.23.nu/md/Pictures/scanndings.py">This</a> is the code I used to read and display the data.</p>
<p>See <a href="http://www.still.de/8979.0.43.html">here</a> for possible applications</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17485/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOKUYO URG-04LX Laser Range Finder</title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17478/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17478/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 06:38:14 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17478/</guid>
		<description><![CDATA[I managed to connect a shiny new HOKUYO URG-04LX LIDAR to my Mac.

So far the Results are not exactly what I was expecting.

&#8230; perhaps a cluttered kitchen table is a bad testing range.
]]></description>
			<content:encoded><![CDATA[<p>I managed to connect a shiny new <a href="http://www.active-robots.com/products/sensors/urg-04lx.shtml">HOKUYO URG-04LX</a> <a href="http://de.wikipedia.org/wiki/Light_detection_and_ranging#Weitere_Anwendungen">LIDAR</a> to my Mac.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ19C6F75A.png" width="400" height="281" alt="" /></p>
<p>So far the Results are not exactly what I was expecting.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ428C3505.png" width="400" height="400" alt="" /></p>
<p>&#8230; perhaps a cluttered kitchen table is a bad testing range.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17478/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Automatic Identification of Storage Locations</title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17449/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17449/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 06:03:56 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17449/</guid>
		<description><![CDATA[A few days ago I have shown how mounting a barcode reader on a fork lift mast assembly can make automatic logging of which pallets are being transported possible.
The beauty of this solution is that it also can be used to identify where these goods are put.
By carefully placing barcode labels on your storage racks [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago <a href="http://blogs.23.nu/c0re/stories/17430/">I have shown</a> how mounting a barcode reader on a fork lift mast assembly can make automatic logging of which pallets are being transported possible.</p>
<p>The beauty of this solution is that it also can be used to identify where these goods are put.</p>
<p>By carefully placing barcode labels on your storage racks you can scan at which location a pallet is being put. Care must be taken so neither the pallet nor the forks hide the barcode. You probably have to experiment with the placement and angle of <a href="http://static.23.nu/md/Pictures/ZZ05220DE5.png">barcode reader</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17449/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Identifying locations in the Warehouse</title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17448/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17448/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 04:22:59 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>
		<category><![CDATA[warehouse]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17448/</guid>
		<description><![CDATA[If you want to computerize your warehouse you need to identify storage locations within the Warehouse. Usually you label every possible storage location with a 3D coordinate.

Then every location can have it&#8217;s unique ID consisting of Row of shelfes (red in the image above), Column (all locations above each other; blue in the image above) [...]]]></description>
			<content:encoded><![CDATA[<p>If you want to computerize your warehouse you need to identify storage locations within the Warehouse. Usually you label every possible storage location with a 3D coordinate.</p>
<p><img src="http://static.23.nu/md/Pictures/lagerordnung5.png" width="480" height="360" alt="" /></p>
<p>Then every location can have it&#8217;s unique ID consisting of <a href="http://static.23.nu/md/Pictures/lagerordnung2.png">Row of shelfes</a> (red in the image above), <a href="http://static.23.nu/md/Pictures/lagerordnung2.png">Column</a> (all locations above each other; blue in the image above) and <a href="http://static.23.nu/md/Pictures/lagerordnung4.png">Level</a> (all location besides each other; yellow in the image above).</p>
<p><img src="http://static.23.nu/md/Pictures/lagerordnung6.png" width="480" height="360" alt="" /></p>
<p>This scheme allows you to label allocations with Row-Column-Level, e.g. <code>01-02-03</code> for the first Row, second Column, third Level. Usually labels identifying the storage locations are places on the shelfing above level 1.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17448/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a Pallet Identifying Fork Lift</title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17430/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17430/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 17:34:00 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>
		<category><![CDATA[warehouse]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17430/</guid>
		<description><![CDATA[If you building deep IT integration in a warehouse you probably want to now which Pallets are where. Your WMS knows where the Pallets should be placed. But where are they placed in reality? Since usually Pallets are transported by Fork Lift it would help to exactly know what is really is on the Fork [...]]]></description>
			<content:encoded><![CDATA[<p>If you building deep IT integration in a warehouse you probably want to now which Pallets are where. Your <a href="http://en.wikipedia.org/wiki/Warehouse_management_system">WMS</a> knows where the Pallets <em>should</em> be placed. But where <em>are</em> they placed in reality? Since usually Pallets are transported by Fork Lift it would help to exactly know what is really is on the Fork Lifts.</p>
<p>An easy way to make Pallets identifiable is to put Barcode stickers on the Pallets. If you place them on the middle block they are easy to fix there by glue or clamps and easy to read automatically.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ31B77C0C.png" width="640" height="480" alt="" /></p>
<p>One good location to place a barcode reader is at the fork/mast assembly (<a href="http://static.23.nu/md/Pictures/ZZ05220DE5.png">detail</a>):</p>
<p><a href="http://static.23.nu/md/Pictures/ZZ05220DE5.png"><img src="http://static.23.nu/md/Pictures/ZZ41D40933.png" width="640" height="480" alt="" /></a></p>
<p>Mount the scanner looking about 30 degrees downward. At the mast assembly the barcode scanner is relatively well protected against damage an can be affixed without to much hassle. The main obstacle is getting power and data lines from the moving fork/mast assembly to the chassis.</p>
<p>After mounting the scanner it should permanently project a scan line on the forks about 80 cm away from the mast.</p>
<p>Now when the fork lift picks up a pallet it should automatically <a href="http://static.23.nu/md/Pictures/ZZ47DF1528.png">read the barcode during entering the pallet</a>. See below for an illustration:</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17430/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: Develop once, break anywhere.</title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17428/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17428/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 15:01:24 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17428/</guid>
		<description><![CDATA[Bought Sun hardware again and I&#8217;m again deeply disappointed. 

Sun knowingly ships broken Java stuff to its paying customers.
]]></description>
			<content:encoded><![CDATA[<p>Bought Sun hardware again and I&#8217;m again deeply disappointed. </p>
<p><img src="http://static.23.nu/md/Pictures/ZZ7F1C55DC.png" width="450" height="300" alt="" /></p>
<p>Sun <a href="https://www.sunspotworld.com/forums/viewtopic.php?p=4211">knowingly</a> ships broken <a href="http://blogs.23.nu/c0re/stories/15552/">Java stuff</a> to its paying customers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17428/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/03/antville-17427/</link>
		<comments>http://blogs.23.nu/c0re/2008/03/antville-17427/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 14:39:35 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/03/antville-17427/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ7F1C55DC.png" width="450" height="300" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/03/antville-17427/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD Kernel Debugging</title>
		<link>http://blogs.23.nu/c0re/2008/02/antville-17401/</link>
		<comments>http://blogs.23.nu/c0re/2008/02/antville-17401/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 06:56:49 +0000</pubDate>
		<dc:creator>cklein</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/02/antville-17401/</guid>
		<description><![CDATA[Dcons(8) exploits Remote DMA feature of FireWire OHCI (fwohci(8)) and provides a very convenient way for kernel debugging compared with legacy serial console.
(What&#8217;s new in FreeBSD 7)
]]></description>
			<content:encoded><![CDATA[<p><cite>Dcons(8) exploits <a href="http://lists.freebsd.org/pipermail/freebsd-firewire/2004-November/000304.html">Remote DMA feature of FireWire OHCI</a> (fwohci(8)) and provides a very convenient way for kernel debugging compared with legacy serial console.</cite><br />
(<a href="http://www.onlamp.com/pub/a/bsd/2008/02/26/whats-new-in-freebsd-70.html?page=2">What&#8217;s new in FreeBSD 7</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/02/antville-17401/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/02/antville-17360/</link>
		<comments>http://blogs.23.nu/c0re/2008/02/antville-17360/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 15:43:11 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/02/antville-17360/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ137CF6B8.png" width="808" height="472" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/02/antville-17360/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heightened sensitivity to potential problem areas and to much to do.</title>
		<link>http://blogs.23.nu/c0re/2008/02/antville-17336/</link>
		<comments>http://blogs.23.nu/c0re/2008/02/antville-17336/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 15:31:47 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/02/antville-17336/</guid>
		<description><![CDATA[&#8220;One quality of a typical engineer is a heightened sensitivity to potential problem areas. For software engineers, that often means spotting possible bugs in our peripheral vision while working on some nearby chunk of source code. This is both a blessing and curse. You want your bugs fixed, but unfortunately we sometimes get derailed from [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;One quality of a typical engineer is a heightened sensitivity to potential problem areas. For software engineers, that often means spotting possible bugs in our peripheral vision while working on some nearby chunk of source code. This is both a blessing and curse. You want your bugs fixed, but unfortunately we sometimes get derailed from our primary task by these little excursions into Perfection.</p>
<p>Another fact of a developer&#8217;s life is that there are always more things to work on than time to do so. And everything is of the utmost priority to someone. And so here again, we find ourselves working on multiple things at the same time, making slow-yet-incremental progress on each of them so at least we can say about them all with a clear conscience and a forced smile, &#8220;As it turns out, I&#8217;m working on that right now.&#8221; (<a href="http://blogs.open.collab.net/svn/2007/07/one-quality-of-.html">Subversion Blog</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/02/antville-17336/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>trac-fogbugz-plugin</title>
		<link>http://blogs.23.nu/c0re/2008/02/antville-17315/</link>
		<comments>http://blogs.23.nu/c0re/2008/02/antville-17315/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 20:50:59 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/02/antville-17315/</guid>
		<description><![CDATA[After Suffering for 10 months I have written a plugin for Integration of trac with fogbugz. Get it here.
]]></description>
			<content:encoded><![CDATA[<p>After Suffering for 10 months I have written a plugin for Integration of trac with fogbugz. Get it <a href="http://tinyurl.com/3bmj4w">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/02/antville-17315/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/02/antville-17272/</link>
		<comments>http://blogs.23.nu/c0re/2008/02/antville-17272/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 08:39:02 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/02/antville-17272/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ602F7A0B.png" width="361" height="125" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/02/antville-17272/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>p0wn3d!</title>
		<link>http://blogs.23.nu/c0re/2008/02/antville-17256/</link>
		<comments>http://blogs.23.nu/c0re/2008/02/antville-17256/#comments</comments>
		<pubDate>Sat, 09 Feb 2008 08:37:44 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/02/antville-17256/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><a href="http://xkcd.com/378/"><img src="http://imgs.xkcd.com/comics/real_programmers.png"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/02/antville-17256/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/02/antville-17241/</link>
		<comments>http://blogs.23.nu/c0re/2008/02/antville-17241/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 15:42:53 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/02/antville-17241/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ4E59C8D4.png" width="478" height="89" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/02/antville-17241/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Praise for Zimbra Support.</title>
		<link>http://blogs.23.nu/c0re/2008/01/antville-17159/</link>
		<comments>http://blogs.23.nu/c0re/2008/01/antville-17159/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 06:46:08 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/01/antville-17159/</guid>
		<description><![CDATA[Our Zimbra insstalation broke down because of this bug. Time between me getting made aware of the issue (&#8221;Mail is broken&#8221;) and Zimbra staff identifying the problem and installing a work arround: 65 minutes &#8211; of which 20 where spend piercing our firewalls to allow zimbra support staff access to our servers.
Good preformance! As always, [...]]]></description>
			<content:encoded><![CDATA[<p>Our Zimbra insstalation broke down because of <a href="http://bugzilla.zimbra.com/show_bug.cgi?id=23253">this bug</a>. Time between me getting made aware of the issue (&#8221;Mail is broken&#8221;) and Zimbra staff identifying the problem and installing a work arround: 65 minutes &#8211; of which 20 where spend piercing our firewalls to allow zimbra support staff access to our servers.</p>
<p>Good preformance! As always, there is little software i can recoment more <a href="http://blogs.23.nu/disLEXiaDE/stories/17019/">than Zimbra</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/01/antville-17159/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iChat debug mode</title>
		<link>http://blogs.23.nu/c0re/2008/01/antville-17111/</link>
		<comments>http://blogs.23.nu/c0re/2008/01/antville-17111/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 06:21:42 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/01/antville-17111/</guid>
		<description><![CDATA[Start it with
/Applications/iChat.app/Contents/MacOS/iChat -errorLogLevel 7
]]></description>
			<content:encoded><![CDATA[<p>Start it with</p>
<p>/Applications/iChat.app/Contents/MacOS/iChat -errorLogLevel 7</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/01/antville-17111/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/01/antville-17082/</link>
		<comments>http://blogs.23.nu/c0re/2008/01/antville-17082/#comments</comments>
		<pubDate>Sun, 20 Jan 2008 16:27:41 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/01/antville-17082/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ7CAD5FE5.png" width="400" height="283" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/01/antville-17082/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rotating a Movie</title>
		<link>http://blogs.23.nu/c0re/2008/01/antville-17034/</link>
		<comments>http://blogs.23.nu/c0re/2008/01/antville-17034/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 05:15:25 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/01/antville-17034/</guid>
		<description><![CDATA[&#8230;. with QuickTime Pro.

Very often I hold the camera in the wrong Position. QuickTime helps.
]]></description>
			<content:encoded><![CDATA[<p>&#8230;. with QuickTime Pro.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ3E993639.png" width="400" height="304" alt="" /></p>
<p>Very often I hold the camera in the wrong Position. QuickTime helps.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/01/antville-17034/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2GB RAM</title>
		<link>http://blogs.23.nu/c0re/2008/01/antville-16972/</link>
		<comments>http://blogs.23.nu/c0re/2008/01/antville-16972/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 08:16:21 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/01/antville-16972/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ60B1C7A4.png" width="320" height="136" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/01/antville-16972/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/01/antville-16934/</link>
		<comments>http://blogs.23.nu/c0re/2008/01/antville-16934/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 11:43:45 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/01/antville-16934/</guid>
		<description><![CDATA[hermes# make
===&#62;  mediawiki-1.10.1 cannot install: doesn&#8217;t work with PHP version : 4 (Doesn&#8217;t support PHP 4).
*** Error code 1
]]></description>
			<content:encoded><![CDATA[<p>hermes# make<br />
===&gt;  mediawiki-1.10.1 cannot install: doesn&#8217;t work with PHP version : 4 (Doesn&#8217;t support PHP 4).<br />
*** Error code 1</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/01/antville-16934/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2008/01/antville-16927/</link>
		<comments>http://blogs.23.nu/c0re/2008/01/antville-16927/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 11:33:02 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2008/01/antville-16927/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ29C43C67.png" width="272" height="38" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2008/01/antville-16927/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16917/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16917/#comments</comments>
		<pubDate>Sun, 30 Dec 2007 16:12:27 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16917/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ1D35D17D.png" width="420" height="134" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16917/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16915/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16915/#comments</comments>
		<pubDate>Sun, 30 Dec 2007 08:48:44 +0000</pubDate>
		<dc:creator>cklein</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16915/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/chris/Pictures/gespart.jpg"></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16915/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16910/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16910/#comments</comments>
		<pubDate>Sat, 29 Dec 2007 07:16:31 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16910/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ79367B6C.png" width="712" height="99" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16910/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating Zimbra Users from Gmail to Zimbra</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16897/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16897/#comments</comments>
		<pubDate>Wed, 26 Dec 2007 08:53:32 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16897/</guid>
		<description><![CDATA[We had to move a dozen users from Google Apps based E-Mail to our own Zimbra Server since Gmail doesn&#8217;t work from China Mainland.
1.  Create the users in Zimbra. Enable &#8220;External POP3 access&#8221; for these users.
2. Log into the Managment Site of your Google Apps and change the passwords of all users to something [...]]]></description>
			<content:encoded><![CDATA[<p>We had to move a dozen users from <a href="https://www.google.com/a/">Google Apps</a> based E-Mail to our own Zimbra Server since Gmail <a href="http://blogs.23.nu/disLEXiaDE/stories/13540/">doesn&#8217;t work from China Mainland</a>.</p>
<p>1. <img src="http://static.23.nu/md/Pictures/ZZ335ADAB5.png" width="178" height="41" alt=""> Create the users in Zimbra. Enable &#8220;External POP3 access&#8221; for these users.</p>
<p>2. Log into the Managment Site of your Google Apps and change the passwords of all users to something you know.</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ6C2697A5.png" width="400" height="345" alt="" /></p>
<p>3. <img src="http://static.23.nu/md/Pictures/ZZ3804E231.png" width="150" height="39" alt=""><br />
Log into the Zimbra Account using the Zimbra managment interface. Create a folder &#8220;Gmail&#8221;. Navigate to Options -&gt; POP Accounts and configure access to Gmail. </p>
<p><img src="http://static.23.nu/md/Pictures/ZZ741790C3.png" width="400" height="258" alt="" /></p>
<p>3. <img src="http://static.23.nu/md/Pictures/ZZ023E74AD.png" width="95" height="28" alt=""> Select the folder Gmail and than select &#8220;Get POP Mail&#8221;. In my experience this is very unreliable. It took ca. 20 attempts to get all mails and resulted in many duplicates.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16897/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16888/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16888/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 18:35:45 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16888/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ602519B7.png" width="482" height="142" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16888/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16887/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16887/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 18:34:03 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16887/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ1F8437CF.png" width="757" height="269" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16887/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16886/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16886/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 17:40:41 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16886/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ5BC8C1A6.png" width="420" height="156" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16886/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16885/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16885/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 16:26:49 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16885/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ75254E8A.png" width="327" height="172" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16885/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16874/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16874/#comments</comments>
		<pubDate>Sat, 22 Dec 2007 15:14:20 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16874/</guid>
		<description><![CDATA[
[root@hermes /usr/ports/java/diablo-jdk15]# java
ELF: not found
@@@@XX@X@@@1?1???P?PX: not found
XX@X@@@1?1???P?PX: not found
X@@@1?1???P?PX: not found
@@1?1???P?PX: not found
@@1?1???P?PX: not found
@1?1???P?PX: not found
/usr/local/diablo-jdk1.5.0/bin/java: 8: Syntax error: ")" unexpected

]]></description>
			<content:encoded><![CDATA[<pre>
[root@hermes /usr/ports/java/diablo-jdk15]# java
ELF: not found
@@@@XX@X@@@1?1???P?PX: not found
XX@X@@@1?1???P?PX: not found
X@@@1?1???P?PX: not found
@@1?1???P?PX: not found
@@1?1???P?PX: not found
@1?1???P?PX: not found
/usr/local/diablo-jdk1.5.0/bin/java: 8: Syntax error: ")" unexpected
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16874/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Current Inspiration</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16801/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16801/#comments</comments>
		<pubDate>Sun, 16 Dec 2007 08:40:37 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16801/</guid>
		<description><![CDATA[&#8220;Wicked problems possess a number of distinctive properties that violate the assumptions that must be made to use the problem solving methods of tame problems. Wicked problems:
* cannot be easily defined so that all stakeholders agree on the problem to solve;
* require complex judgements about the level of abstraction at which to define the problem;
* [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Wicked problems possess a number of distinctive properties that violate the assumptions that must be made to use the problem solving methods of tame problems. Wicked problems:</p>
<p>* cannot be easily defined so that all stakeholders agree on the problem to solve;<br />
* require complex judgements about the level of abstraction at which to define the problem;<br />
* have no clear stopping rules;<br />
* have better or worse solutions, not right and wrong ones;<br />
* have no objective measure of success;<br />
* require iteration-every trial counts;<br />
* have no given alternative solutions-these must be discovered;<br />
* often have strong moral, political or professional dimensions&#8221;</p>
<p>(<a href="http://kmi.open.ac.uk/people/sbs/org-knowledge/aikm97/sbs-paper2.html">Simon Buckingham Shum</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16801/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nifty Feature found in Textmate</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16797/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16797/#comments</comments>
		<pubDate>Sun, 16 Dec 2007 06:54:02 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16797/</guid>
		<description><![CDATA[grep -r (AKA &#8220;Find in Project&#8221;)

]]></description>
			<content:encoded><![CDATA[<p>grep -r (AKA &#8220;Find in Project&#8221;)</p>
<p><img src="http://static.23.nu/md/Pictures/ZZ30F5CCE1.png" width="400" height="283" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16797/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python &amp; Unicode (on Mac)</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16796/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16796/#comments</comments>
		<pubDate>Sun, 16 Dec 2007 05:51:56 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16796/</guid>
		<description><![CDATA[Again: how to fix Python unicode output.
1. Find the Python configuration file site.py (e.g. locate /site.py)
2. sudo perl -npe 's/encoding = "ascii"/encoding = "utf-8"/g;' -i.bak /opt/local/lib/python2.5/site.py
]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.23.nu/c0re/stories/15197/">Again</a>: how to fix Python unicode output.</p>
<p>1. Find the Python configuration file site.py (e.g. <code>locate /site.py</code>)</p>
<p>2. <code>sudo perl -npe 's/encoding = "ascii"/encoding = "utf-8"/g;' -i.bak /opt/local/lib/python2.5/site.py</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16796/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inspiration</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16760/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16760/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 17:02:24 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16760/</guid>
		<description><![CDATA[&#8220;Wether you wear the support pager, sell your labour by the hour, or pay the invoices for the work, you need to know that you are dealing with a rugged, Baja-tested, indestructible vehicle that will carry your business forward, not a fragile shell of fiberglass that spends more time in the shop than on the [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Wether you wear the support pager, sell your labour by the hour, or pay the invoices for the work, you need to know that you are dealing with a rugged, <a href="http://en.wikipedia.org/wiki/Baja_1000">Baja</a>-tested, indestructible vehicle that will carry your business forward, not a fragile shell of fiberglass that spends more time in the shop than on the road.&#8221; (<a href="http://pragprog.com/titles/mnee">Michael T. Nygard</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16760/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonicability</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16756/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16756/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 14:17:26 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16756/</guid>
		<description><![CDATA[
import re, commands
status, lpstat = commands.getstatusoutput("lpstat -h printserver -p")
printers = []
for line in lpstat.split('\n'):
    printers.append(line.split()[1])
print '\n'.join(printers)

This ^^^^ is more readable than that.
]]></description>
			<content:encoded><![CDATA[<pre>
import re, commands
status, lpstat = commands.getstatusoutput("lpstat -h printserver -p")
printers = []
for line in lpstat.split('\n'):
    printers.append(line.split()[1])
print '\n'.join(printers)
</pre>
<p>This ^^^^ is more readable than <a href="http://johl.soup.io/post/545055">that</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16756/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pylint over our complete codebase</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16746/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16746/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 06:27:44 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16746/</guid>
		<description><![CDATA[Your code has been rated at 4.60/10
I had feared worse.
]]></description>
			<content:encoded><![CDATA[<p><code>Your code has been rated at 4.60/10</code></p>
<p>I had feared worse.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16746/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pylint on Leopard</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16745/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16745/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 05:58:31 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16745/</guid>
		<description><![CDATA[If you followed my instructions on installin Python on Leiopard you get a broken pylint.
Remove all pylint/logilab traces in /opt/local/lib/python2.5/site-packages/easy-install.pth. Then try:

$ sudo rm -Rf /opt/local/lib/python2.5/site-packages/pylint*
$ sudo rm -Rf /opt/local/lib/python2.5/site-packages/logilab*
$ wget ftp://ftp.logilab.fr/pub/pylint/pylint-0.13.2.tar.gz
$ wget ftp://ftp.logilab.fr/pub/common/logilab-common-0.25.1.tar.gz
$ wget ftp://ftp.logilab.fr/pub/astng/logilab-astng-0.17.1.tar.gz
$ tar logilab-common-0.25.1.tar.gz
$ tar xzvf logilab-common-0.25.1.tar.gz
$ cd logilab-common-0.25.1
$ python manage.py test mypl2
$ sudo python setup.py install
$ cd ..
$ tar xzvf [...]]]></description>
			<content:encoded><![CDATA[<p>If you followed <a href="http://blogs.23.nu/c0re/stories/16716/">my instructions on installin Python on Leiopard</a> you get a broken pylint.</p>
<p>Remove all pylint/logilab traces in <code>/opt/local/lib/python2.5/site-packages/easy-install.pth</code>. Then try:</p>
<pre>
$ sudo rm -Rf /opt/local/lib/python2.5/site-packages/pylint*
$ sudo rm -Rf /opt/local/lib/python2.5/site-packages/logilab*
$ wget ftp://ftp.logilab.fr/pub/pylint/pylint-0.13.2.tar.gz
$ wget ftp://ftp.logilab.fr/pub/common/logilab-common-0.25.1.tar.gz
$ wget ftp://ftp.logilab.fr/pub/astng/logilab-astng-0.17.1.tar.gz
$ tar logilab-common-0.25.1.tar.gz
$ tar xzvf logilab-common-0.25.1.tar.gz
$ cd logilab-common-0.25.1
$ python manage.py test mypl2
$ sudo python setup.py install
$ cd ..
$ tar xzvf logilab-astng-0.17.1.tar.gz
$ cd logilab-astng-0.17.1
$ sudo python setup.py install
$ cd ..
$ tar xzvf pylint-0.13.2.tar.gz
$ cd pylint-0.13.2
$ sudo python setup.py install
$ cd ..
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16745/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16740/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16740/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 18:54:20 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16740/</guid>
		<description><![CDATA[I have been involved in all kinds of perversions to access Data on our AS/400. Now I have a new tool in my toolchest:

Erlang (BEAM) emulator version 5.5.2

Eshell V5.5.2  (abort with ^G)
1&#62; application:start(odbc).
ok
2&#62; {ok,Ref} = odbc:connect("DSN=HD400",[{trace_driver,on}]).
{ok,}
3&#62; odbc:sql_query(Ref, "SELECT * FROM ISB00").
{selected,["IBFNR",
           "IBBWSL",
   [...]]]></description>
			<content:encoded><![CDATA[<p>I have been involved in <a href="http://blogs.23.nu/disLEXiaDE/stories/14905/">all kinds of perversions</a> to access Data on our AS/400. Now I have a new tool in my toolchest:</p>
<pre>
Erlang (BEAM) emulator version 5.5.2

Eshell V5.5.2  (abort with ^G)
1&gt; application:start(odbc).
ok
2&gt; {ok,Ref} = odbc:connect("DSN=HD400",[{trace_driver,on}]).
{ok,}
3&gt; odbc:sql_query(Ref, "SELECT * FROM ISB00").
{selected,["IBFNR",
           "IBBWSL",
           "IBLGNR",
           "IBARTN",
           "IBMNGB",
           "IBINFO",
           "IBFCOD",
           "IBDFSL",
           "IBSTAT"],
          [{"01",
            135,
            100,
            "85030               ",
            12.0000,
            "275                 ",
            "          ",
            "          ",
            "X"},
...
4&gt; odbc:sql_query(Ref, "UPDATE SMKDIFP.IET00 SET ETDRET=2 WHERE ETSANR=355384").
{updated,1}
</pre>
<p>\o/</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16740/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inspiration</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16735/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16735/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 05:22:50 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16735/</guid>
		<description><![CDATA[&#8220;The only way to keep growing&#8211;as a person and as a company&#8211;is to keep expanding the boundaries of what you&#8217;re good at&#8221; (Where there&#8217;s muck, there&#8217;s brass &#8211; Joel on Software)
]]></description>
			<content:encoded><![CDATA[<p>&#8220;The only way to keep growing&#8211;as a person and as a company&#8211;is to keep expanding the boundaries of what you&#8217;re good at&#8221; (<a href="http://www.joelonsoftware.com/items/2007/12/06.html">Where there&#8217;s muck, there&#8217;s brass &#8211; Joel on Software</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16735/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16726/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16726/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 07:07:41 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16726/</guid>
		<description><![CDATA[Found the Error occasionaly messing up the communication between myPL and the ERP (SoftM). Have been moving 50-100 Pallets with goods &#8217;till 02:00h in the morning to fix the Issue. Uah!
]]></description>
			<content:encoded><![CDATA[<p><a href="http://de.wikipedia.org/wiki/Europoolpalette"><img src="http://static.23.nu/md/Pictures/ZZ134F00FA.jpg" width="200" height="150" alt="" align="right" /></a>Found the Error occasionaly messing up the communication between <a href="http://blogs.23.nu/c0re/stories/16616/">myPL</a> and the ERP (SoftM). Have been moving 50-100 Pallets with goods &#8217;till 02:00h in the morning to fix the Issue. Uah!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16726/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python 2.5 on Leopard</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16716/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16716/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 19:25:28 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16716/</guid>
		<description><![CDATA[MacOS X 10.5 Leopard comes with Python 2.5 but some goodies are missing. So I decided to replace it with a self compiled python provided by MacPorts. First get Python and goodies:
$ sudo sh -c 'port install py25-bsddb ; port install py25-bz2 ; port install py25-hashlib ; port install py25-httplib2 ; port install py25-ipython ; [...]]]></description>
			<content:encoded><![CDATA[<p>MacOS X 10.5 Leopard comes with Python 2.5 but some goodies are missing. So I decided to replace it with a self compiled python provided by <a href="http://blogs.23.nu/disLEXiaDE/stories/15206/">MacPorts</a>. First get Python and goodies:</p>
<p><code>$ sudo sh -c 'port install py25-bsddb ; port install py25-bz2 ; port install py25-hashlib ; port install py25-httplib2 ; port install py25-ipython ; port install py25-pil ; port install py25-psycopg2 ; port install py25-readline ; port install py25-simplejson ; port install py25-sqlalchemy ; port install py25-zlib ; port install py25-checker ; port install py25-mysql'</code></p>
<p>Now make the MacPorts Python the default:</p>
<pre>
$ sudo ln -s /opt/local/bin/python2.5 /opt/local/bin/python
$ sudo ln -s /opt/local/bin/pydoc2.5 /opt/local/bin/pydoc
$ sudo ln -s /opt/local/bin/easy_install-2.5 /opt/local/bin/easy_install
</pre>
<p>Check we are now using the right Python:</p>
<pre>
$ which python
/opt/local/bin/python
<pre>

Install various additional software packages:
<pre>
$ sudo easy_install http://bicyclerepair.sourceforge.net/bzr/bicyclerepair-nightly.tar.gz
$ sudo easy_install docutils
$ sudo easy_install pyro
$ sudo easy_install huTools
$ sudo easy_install dodostorage
$ sudo easy_install huBarcode
$ svn co -r6040 http://code.djangoproject.com/svn/django/trunk/ django
$ cd django
$ sudo python setup.py install
$ cd ..
$ sudo rm -Rf django
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16716/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My first Erlang &#8230;</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16714/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16714/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 18:43:50 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16714/</guid>
		<description><![CDATA[&#8230; bug.
&#8220;You build it, we break it&#8221;.
]]></description>
			<content:encoded><![CDATA[<p>&#8230; <a href="http://www.nabble.com/Floating-point-exception--28core-dumped-29-in-beam-to14208305.html#a14239340">bug</a>.</p>
<p>&#8220;You build it, we break it&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16714/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Current Inspiration</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16713/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16713/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 12:07:51 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16713/</guid>
		<description><![CDATA[&#8220;A much more effective knob to twiddle when it comes to time to market is scope.  Cut scope.  Cut it early and cut it again if the project is drifting off schedule.  It is amazing how much scope can really be done away with and still have a release that completely satisfies commercial needs and [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;A much more effective knob to twiddle when it comes to time to market is scope.  Cut scope.  Cut it early and cut it again if the project is drifting off schedule.  It is amazing how much scope can really be done away with and still have a release that completely satisfies commercial needs and makes customers happy.&#8221; (<a href="http://smoothspan.wordpress.com/2007/11/27/why-small-software-teams-grow-large-and-other-software-development-conundrums/">Why Small Software Teams Grow Large And Other Software Development Conundrums</a>)</p>
<p><a href="http://www.jroller.com/rickard/entry/create_software_not_code">Create software, not code</a>!</p>
<p>&#8220;What does &#8220;done&#8221; mean to you?  I find that my definition of &#8220;done&#8221; continues to expand. When I was still pretty green, I would say &#8220;It&#8217;s done&#8221; when I had finished coding.&#8221; (<a href="http://www.michaelnygard.com/blog/">Wide Awake Developers</a>)</p>
<p>&#8220;It is this reason that languages like Ruby, which is implemented mainly in C, provide less maximum power than languages like Smalltalk, which is implemented mainly in &#8230; Smalltalk.&#8221; (<a href="http://weblog.raganwald.com/2006/11/significance-of-meta-circular_22.html">The significance of the meta-circular interpreter</a>)</p>
<p>&#8220;For years I&#8217;d been a bit confused about the standard &#8220;don&#8217;t program defensively&#8221; Erlang advice, but just recently I saw a definition of what that really means.&#8221; (<a href="http://www.erlang.org/ml-archive/erlang-questions/200303/msg00103.html">defensive programming</a>)</p>
<p>&#8220;Second, the cost of global consistency is global serialization. If you assume a certain volume of traffic you must support, the cost of a globally consistent solution will be a multiple of the cost of a latency-tolerant solution. That&#8217;s because global consistency can only be achieved by making a single master system of record. When you try to reach large scales, that master system of record is going to be hideously expensive.&#8221; (<a href="http://www.michaelnygard.com/blog/">Wide Awake Developers</a>)</p>
<p>Investing in your own abilities. That?s incredibly important, but I don?t need to tell you that. If you exercise with programming katas, or learn a new programming language once a year, or pick up a book like The Reasoned Schemer and actually go through the exercises, then you are already in the top 1% of software developers for personal skills improvement. (Sorry, certifications don?t count. They are the classic case of doing the wrong thing for the wrong reason!)&#8221; (<a href="http://weblog.raganwald.com/2007/02/but-y-would-i-want-to-do-thing-like.html">But Y would I want to do a thing like this?</a>)</p>
<p>&#8220;A closure is a function that captures the bindings of free variables in its lexical context.&#8221; (<a href="http://gafter.blogspot.com/2007/01/definition-of-closures.html">A Definition of Closures</a>)</p>
<p>&#8220;We have an example of the ?Telephone Test:? when code very closely resembles how you would explain your solution over the telephone, we often say it is ?very high level.? The usual case is that such code expresses a lot more what and a lot less how.&#8221; (<a href="http://weblog.raganwald.com/2007/03/why-why-functional-programming-matters.html">Why Why Functional Programming Matters Matters</a>)</p>
<p>&#8220;The first person to write about these issues, as far as I know, was Fred Brooks in the Mythical Man Month. He wrote that programmers seemed to generate about the same amount of code per day regardless of the language. When I first read this in my early twenties, it was a big surprise to me and seemed to have huge implications. It meant that (a) the only way to get software written faster was to use a more succinct language, and (b) someone who took the trouble to do this could leave competitors who didn&#8217;t in the dust.&#8221; (<a href="http://www.paulgraham.com/power.html">Succinctness is Power</a>)</p>
<p>&#8220;We can often ignore the time and space performance penalties, but the cost of comprehending any abstraction is real and slowly increases as we add abstractions in our code&#8221; (<a href="http://www.spinellis.gr/blog/20070902/">Abstraction and Variation</a>)</p>
<p>Programs must be written for people to read, and only incidentally for machines to execute.<br />
(Abelson &amp; Sussman, Structure and Interpretation of Computer Programs via <a href="http://weblog.raganwald.com/2007/04/writing-programs-for-people-to-read.html">Writing programs for people to read</a>)</p>
<p>&#8220;Is it possible to create a large product with a small team? How do you do it? Well, the first realization is that what we want to do is create software, not code. Coding takes time. Typing takes time. Testing and fixing bugs takes time. Don&#8217;t code. Create software. Big difference.&#8221; (<a href="http://www.jroller.com/rickard/entry/create_software_not_code">Create software, not code</a>)</p>
<p>&#8220;I&#8217;ve been coding in Python for years, but lately I?ve been using it a lot, and can&#8217;t get enough of it. It&#8217;s so clean, and as Fredrick?s code shows, it?s got some extremely powerful capabilities that are also extremely easy to use. It?s obviously smoking fast as well. Some folks who commented on some of my previous blog entries seem to equate programs written using dynamic languages like Python with unmaintainable one-off solutions. If that&#8217;s your experience with such languages, blame the programmer, not the language.&#8221; (<a href="http://steve.vinoski.net/blog/page/3/">Steve Vinoski</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16713/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teaching Security in the Office.</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16710/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16710/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 07:47:27 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16710/</guid>
		<description><![CDATA[I encourage my coworkers to lock their coats in their locker. Security, after all, is everyone&#8217;s business. But often gentle encouragement is not enough. Sometimes, more.. persuasive methods are necessary.
This is called the noble art of goating.
Goating techniques vary from insidious and subtle to invasive, borderline vandalism. I prefer the milder forms:
* Turning the coat [...]]]></description>
			<content:encoded><![CDATA[<p>I encourage my coworkers to lock their coats in their locker. Security, after all, is everyone&#8217;s business. But often gentle encouragement is not enough. Sometimes, more.. persuasive methods are necessary.</p>
<p>This is called the noble art of goating.</p>
<p>Goating techniques vary from insidious and subtle to invasive, borderline vandalism. I prefer the milder forms:</p>
<p>* Turning the coat inside out.<br />
* Knoting the arms of the coat.<br />
* Hanging the coat in an other office.<br />
* Putting the car keys in an other coat.<br />
* Take out the Cellular and remove the battery.</p>
<p>Much hilarity ensued, and more importantly, crucial lessons are learned about security by all.</p>
<p>If <a href="http://www.codinghorror.com/blog/archives/000997.html">this</a> is funny, why shouldn&#8217;t the above be funny too?</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16710/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16703/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16703/#comments</comments>
		<pubDate>Sat, 08 Dec 2007 07:38:01 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16703/</guid>
		<description><![CDATA[&#8220;I love throwing away old code&#8221; (effbot)
]]></description>
			<content:encoded><![CDATA[<p>&#8220;I love throwing away old code&#8221; (<a href="http://effbot.org/zone/rest-vs-rpc.htm">effbot</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16703/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16684/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16684/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 05:49:07 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16684/</guid>
		<description><![CDATA[
Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [hipe]

Eshell V5.5.5  (abort with ^G)
(mypl_produktion@airvent)1&#62; mypl_provpipeline:update_pipeline({versandtermin, "931631", "2007-10-14"}).
Floating point exception (core dumped)

]]></description>
			<content:encoded><![CDATA[<pre>
Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [hipe]

Eshell V5.5.5  (abort with ^G)
(mypl_produktion@airvent)1&gt; mypl_provpipeline:update_pipeline({versandtermin, "931631", "2007-10-14"}).
Floating point exception (core dumped)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16684/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>After 8 years of planning tmnhc plan scucceeds</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16682/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16682/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 05:26:38 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16682/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ31785307.jpg" width="400" height="55" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16682/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActiveMQ</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16678/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16678/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 05:16:16 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16678/</guid>
		<description><![CDATA[I have been complainingabout ActiveMQ for some time. Just an other example.

ERROR RecoveryListenerAdapter        - Message id ID:lichtblick.local-53968-1187158776157-5:16123:-1:1:2 could not be recovered from the data store!

Such a thing should never ever happen &#8230;.
]]></description>
			<content:encoded><![CDATA[<p>I have been <a href="http://blogs.23.nu/c0re/stories/16205/">complaining</a>about ActiveMQ <a href="http://blogs.23.nu/c0re/stories/15655/">for some time</a>. Just an other example.</p>
<p><code><br />
ERROR RecoveryListenerAdapter        - Message id ID:lichtblick.local-53968-1187158776157-5:16123:-1:1:2 could not be recovered from the data store!<br />
</code></p>
<p>Such a thing should never ever happen &#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16678/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16663/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16663/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 18:19:35 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16663/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/ZZ6EEB07E2.png" width="685" height="521" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16663/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teilchenbeschleuniger?</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16660/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16660/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 08:02:13 +0000</pubDate>
		<dc:creator>cklein</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16660/</guid>
		<description><![CDATA[
WOPR:~ chris$ traceroute mailbox.informatik.uni-bonn.de
traceroute: Warning: mailbox.informatik.uni-bonn.de has multiple addresses; using 131.220.10.6
traceroute to mailbox.informatik.uni-bonn.de (131.220.10.6), 64 hops max, 40 byte packets
 1  untergrund (192.168.1.1)  2.959 ms  2.220 ms  3.345 ms
 2  ip-62-143-76-1.1311a-cud12k-01.ish.de (62.143.76.1)  24.975 ms  27.897 ms  12.234 ms
 3  172.16.178.33 (172.16.178.33)  13.206 ms  21.509 [...]]]></description>
			<content:encoded><![CDATA[<pre>
WOPR:~ chris$ traceroute mailbox.informatik.uni-bonn.de
traceroute: Warning: mailbox.informatik.uni-bonn.de has multiple addresses; using 131.220.10.6
traceroute to mailbox.informatik.uni-bonn.de (131.220.10.6), 64 hops max, 40 byte packets
 1  untergrund (192.168.1.1)  2.959 ms  2.220 ms  3.345 ms
 2  ip-62-143-76-1.1311a-cud12k-01.ish.de (62.143.76.1)  24.975 ms  27.897 ms  12.234 ms
 3  172.16.178.33 (172.16.178.33)  13.206 ms  21.509 ms  22.604 ms
 4  172.16.178.1 (172.16.178.1)  14.644 ms  12.357 ms  15.493 ms
 5  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  12.126 ms  11.744 ms  11.814 ms
 6  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  12.283 ms  17.856 ms  11.603 ms
 7  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  12.859 ms  12.138 ms  24.029 ms
 8  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  13.486 ms  13.515 ms  13.303 ms
 9  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  15.488 ms  21.870 ms  13.750 ms
10  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  16.188 ms  13.879 ms  23.698 ms
11  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  30.599 ms  20.972 ms  13.382 ms
12  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  15.153 ms  15.136 ms  27.570 ms
13  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  14.111 ms  16.131 ms  17.484 ms
14  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  50.386 ms *  13.142 ms
15  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  14.421 ms  16.341 ms  15.112 ms
16  * ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  15.662 ms  18.333 ms
17  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  15.846 ms  14.929 ms  17.119 ms
18  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  29.123 ms  17.760 ms  15.568 ms
19  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  16.497 ms  19.547 ms  16.626 ms
20  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  15.707 ms  25.336 ms  17.115 ms
21  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  19.426 ms  17.781 ms  26.571 ms
22  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  18.726 ms  19.612 ms  14.941 ms
23  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  17.203 ms  15.792 ms  16.885 ms
24  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  19.307 ms  20.128 ms  16.314 ms
25  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  18.996 ms  17.179 ms  17.521 ms
26  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  19.144 ms  21.354 ms  19.589 ms
27  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  23.307 ms  18.998 ms  19.436 ms
28  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  25.242 ms  19.498 ms *
29  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  20.401 ms  18.100 ms  20.142 ms
30  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  20.928 ms  19.119 ms  19.471 ms
31  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  77.465 ms  18.578 ms  21.112 ms
32  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  27.145 ms  209.941 ms  20.840 ms
33  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  18.599 ms  22.922 ms  24.180 ms
34  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  31.935 ms  25.824 ms  19.293 ms
35  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  98.172 ms  23.434 ms  24.214 ms
36  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  60.520 ms  138.006 ms  24.547 ms
37  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  26.328 ms  76.100 ms  32.585 ms
38  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  38.920 ms  21.373 ms *
39  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  28.277 ms  23.404 ms  23.241 ms
40  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  43.978 ms  66.590 ms  24.521 ms
41  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  156.096 ms  224.505 ms  112.153 ms
42  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  46.065 ms  25.534 ms  21.754 ms
43  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  24.619 ms  23.950 ms  26.204 ms
44  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  49.543 ms  22.085 ms  24.431 ms
45  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  23.796 ms  35.980 ms  23.186 ms
46  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  23.151 ms  22.807 ms  43.882 ms
47  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  24.141 ms  27.384 ms  23.296 ms
48  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  42.035 ms  27.507 ms  24.218 ms
49  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  28.289 ms  107.582 ms  32.636 ms
50  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  26.489 ms  24.413 ms  28.512 ms
51  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  25.050 ms  30.975 ms  24.277 ms
52  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  49.317 ms  111.538 ms *
53  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  27.210 ms  29.153 ms  29.203 ms
54  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  32.085 ms  25.569 ms  26.230 ms
55  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  33.927 ms  28.220 ms  30.343 ms
56  * ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  26.491 ms  30.228 ms
57  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  41.982 ms  28.645 ms  26.162 ms
58  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  55.247 ms  37.147 ms  27.451 ms
59  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  27.899 ms  30.886 ms  28.641 ms
60  * * ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  30.947 ms
61  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  31.050 ms  31.697 ms  29.419 ms
62  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  29.071 ms  27.042 ms  27.894 ms
63  ph-13noc-jm160r-02-so-0-1-0.kerpen.ish.de (80.69.96.73)  33.857 ms  31.840 ms  28.685 ms
64  ph-1311g-jm160r-01-so-0-2-0.huerth.ish.de (80.69.96.74)  29.392 ms  31.419 ms  28.360 ms
WOPR:~ chris$
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16660/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netzwerkprobleme?</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16659/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16659/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 08:00:16 +0000</pubDate>
		<dc:creator>cklein</dc:creator>
				<category><![CDATA[sux]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16659/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/chris/Pictures/traceroute.jpg"></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16659/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>myPL: the Erlang-based Warehouse</title>
		<link>http://blogs.23.nu/c0re/2007/12/antville-16616/</link>
		<comments>http://blogs.23.nu/c0re/2007/12/antville-16616/#comments</comments>
		<pubDate>Sat, 01 Dec 2007 14:00:54 +0000</pubDate>
		<dc:creator>mdornseif</dc:creator>
				<category><![CDATA[c0re]]></category>
		<category><![CDATA[warehouse]]></category>

		<guid isPermaLink="false">http://3.blogs.23.nu/c0re/2007/12/antville-16616/</guid>
		<description><![CDATA[Last week we launched my so far biggest software project: a Warehouse Managment System (WMS) for my company. A WMS manages the flow of goods and the allocation of resources (forklifts, storage space, personnel, etc.) inside a warehouse. 
After figuring out that the WMS that came with our ERP Software Stack from SoftM AG was [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://static.23.nu/md/Pictures/IMG_1203.jpg" width="200" height="150" alt="" align="right">Last week we launched my so far biggest software project: a <a href="http://en.wikipedia.org/wiki/Warehouse_management_system">Warehouse Managment System</a> (<a href="http://www.google.com/translate?u=http%3A%2F%2Fde.wikipedia.org%2Fwiki%2FLagerverwaltungssystem&amp;langpair=de%7Cen&amp;hl=en&amp;ie=UTF8">WMS</a>) for <a href="http://tinyurl.com/2jmff5">my company</a>. A WMS manages the flow of goods and the allocation of resources (forklifts, storage space, personnel, etc.) inside a warehouse. </p>
<p>After figuring out that the WMS <a href="http://www.softm.com/softm/servlet/pages/de/2488?view=default">that came with</a> our <a href="http://www.softm.com/softm/servlet/pages/de/68">ERP Software Stack from <a href="http://www.softm.com/softm/servlet/pages/de/68">SoftM AG</a> was a) bad software and b) never really integrated into our processes we decided to write our own replacement for it.</p>
<p>We started about 18 Months ago one experimental testbed and two prototypes using different techniques in Python. In October 2007 we started the final implementation. </p>
<p><img src="http://static.23.nu/md/Pictures/ZZ6A36A928.png" /></p>
<p>The Software uses a custom built database optimized for warehousing, called kernelE. kernelE ist written using the <a href="http://www.erlang.org/">Erlang/OTP</a> Software framework. kernelE is depicted in gray in the diagram above. The size of kernelE is about 5500 LoC Erlang Code of which 10% are auto generated interface code.</p>
<p>kernelE is used by a <a href="http://www.pythpn.org/">Python</a> application build with the <a href="http://www.djangoproject.com/">Django</a> framework. This Python Application is also providing the buiseness logic and the interfacing to the legacy <a href="http://en.wikipedia.org/wiki/AS/400">AS/400</a> based ERP System. The Python application contains slightly more than 1000 LoC and depends heavily on Metaprogramming techniques like <a href="http://en.wikipedia.org/wiki/Higher-order_function">higher Order functions</a> and <a href="http://en.wikipedia.org/wiki/Metaclass">Metaclasses</a>.</p>
<p>It also sits on top of a 8100 LoC interface library for communicating with the AS/400 and 400 LoC for logistics calculations. These Libraries where developed during the building of the various prototypes.</p>
<p>All in all I&#8217;m pretty amazed how well it all worked out. Some more Information on it in german can be found <a href="http://blogs.23.nu/disLEXiaDE/stories/16220/">here</a>, <a href="http://blogs.23.nu/disLEXiaDE/stories/16535/">here</a>, <a href="http://blogs.23.nu/disLEXiaDE/stories/16544/">here</a> and <a href="http://blogs.23.nu/disLEXiaDE/stories/16588/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.23.nu/c0re/2007/12/antville-16616/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
