<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7365151</id><updated>2012-01-29T10:28:02.277+01:00</updated><category term='Unix'/><category term='NK Concept Car'/><category term='Mule'/><category term='Telenet'/><category term='Tuxdroid'/><category term='Cooking'/><category term='Debian'/><category term='ESB'/><category term='Samba'/><category term='Music'/><category term='Photos'/><category term='Misc'/><category term='timelog'/><category term='Java'/><category term='f-spot'/><category term='Lego'/><category term='querydsl'/><category term='Development'/><category term='Linux'/><category term='Mac'/><category term='mondo'/><category term='Qube'/><category term='Ubuntu'/><category term='firewyse'/><category term='News'/><category term='backup'/><title type='text'>kennywest</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default?start-index=101&amp;max-results=100'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>102</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7365151.post-459185299752176842</id><published>2011-11-21T15:20:00.025+01:00</published><updated>2011-11-23T17:42:21.651+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>openSuSE 12.1</title><content type='html'>I've been using Ubuntu for quite some time now. Ever since the issues I've encountered while upgrading from Hoary, to Breezy, to Dapper, I decided to stick with LTS (or Long Term Support) releases. I don't care about using bleeding edge technology, I just want a PC that works. &lt;br /&gt;Being a first hour &lt;a href="http://kennywest.blogspot.com/2008/05/linux-impressions-of-kubuntu-804-kde-4.html"&gt;kubuntu with KDE4&lt;/a&gt; user, I was a little bit displeased with the &lt;a href="http://kennywest.blogspot.com/2010/05/kubuntu-1004-aftermath-1.html"&gt;latest&lt;/a&gt; LTS release, so the past years I've been looking at different other distributions to see which one supports KDE best. Distributions with rolling releases earned extra points :)&lt;br /&gt;In 1998 SuSE 6.0 was released and I remember buying a big box containing 6 CDs in a local bookstore. I liked SuSE a lot. It was easy to install and maintain. The only downside was the RPM dependency hell you can end up with once you tried to install packages that were not available on the CDs. YAST already existed back then and was already doing a great job configuring the system (ncurses based, of course). Since &lt;a href="http://www.opensuse.org"&gt;openSuSE&lt;/a&gt; is very KDE oriented, I decided to give &lt;a href="http://news.opensuse.org/2011/11/16/opensuse-12-1-all-green/"&gt;openSuSE 12.1&lt;/a&gt; a try.&lt;br /&gt;SuSE still uses YAST for most of its system configuration and YAST is still doing a great job. Integrating your system with an LDAP for fetching your users is a simple point and click operation (something that does not exist in kubuntu). As with &lt;a href="http://kennywest.blogspot.com/2010/05/kubuntu-1004-aftermath-1.html"&gt;kubuntu&lt;/a&gt;, using the proprietary nvidia drivers is a &lt;a href="http://forums.opensuse.org/english/get-technical-help-here/how-faq-forums/unreviewed-how-faq/467398-simple-howto-install-nvidia-driver-opensuse-12-1-a.html"&gt;manual&lt;/a&gt; operation. So far, the only annoying thing I found in SuSE is its multimedia support. I had to include third party repositories to be able to install VLC and mplayer (or maybe I am doing it wrong). Burning plain audio CDs from K3B from mp3 is also not working yet, but I'll figure this out some day.&lt;br /&gt;This doesn't mean I ditched Ubuntu, well kubuntu actually, completely. I just wanted to try something different, which is what Linux is all about :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-459185299752176842?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/459185299752176842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=459185299752176842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/459185299752176842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/459185299752176842'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2011/11/opensuse-121.html' title='openSuSE 12.1'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2043826695610857623</id><published>2011-09-20T08:24:00.001+02:00</published><updated>2011-09-20T08:26:38.412+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Fosdem 2012 ...</title><content type='html'>... the dates are set. &lt;a href="http://fosdem.org/2011/news/fosdem-2012-preparation"&gt;February 4 &amp; 5, 2012&lt;/a&gt; ... yeah!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2043826695610857623?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2043826695610857623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2043826695610857623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2043826695610857623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2043826695610857623'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2011/09/fosdem-2012.html' title='Fosdem 2012 ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2441908232240259169</id><published>2011-09-19T12:27:00.002+02:00</published><updated>2011-09-19T12:35:35.378+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lego'/><category scheme='http://www.blogger.com/atom/ns#' term='NK Concept Car'/><title type='text'>NK Concept Car, all pieces arrived ... finally</title><content type='html'>Today the final package containing 14 missing &lt;a href="http://www.bricklink.com/catalogItem.asp?P=6629"&gt;red lift arms&lt;/a&gt; arrived. I had to place 5 orders in 5 different stores, for a total of EUR 380 to get all the necessary parts for this car. Most parts (and the largest order) where found in &lt;a href="http://www.bricklink.com/store.asp?p=JuergenL"&gt;Juergen's&lt;/a&gt; store. I am still missing the &lt;a href="http://www.bricklink.com/catalogItem.asp?P=50965"&gt;wheel covers&lt;/a&gt;. These have become very rare and very expensive. Since I think these are ugly, I might not order these anyway. Pictures coming soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2441908232240259169?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2441908232240259169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2441908232240259169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2441908232240259169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2441908232240259169'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2011/09/nk-concept-car-all-pieces-arrived.html' title='NK Concept Car, all pieces arrived ... finally'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8151600360173490255</id><published>2011-08-30T20:02:00.007+02:00</published><updated>2011-08-30T23:00:35.615+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lego'/><category scheme='http://www.blogger.com/atom/ns#' term='NK Concept Car'/><title type='text'>NK Concept Car</title><content type='html'>Alright, I'll admit it I am an Adult Fan of Lego (or AFOL). Maybe this doesn't make me a real adult, but you'd be surprised to see how many people my age are still buying sets or creating MOCs (My Own Creations). My love for Lego started many years ago with a &lt;a href="http://www.brickset.com/detail/?Set=733-1"&gt;Universal Building Set&lt;/a&gt;. After that, many sets followed, ranging from &lt;a href="http://www.brickset.com/detail/?Set=6980-1"&gt;space ships&lt;/a&gt;, &lt;a href="http://www.brickset.com/detail/?Set=6392-1"&gt;airports&lt;/a&gt; to &lt;a href="http://www.brickset.com/detail/?Set=8859-1"&gt;famous&lt;/a&gt; Technic sets.&lt;br /&gt;I have always been fond of the larger, more complicated Technic sets. I also remember being very fond of the Technic chassis series (&lt;a href="http://www.brickset.com/detail/?Set=853-1"&gt;853&lt;/a&gt; ,&lt;a href="http://www.brickset.com/detail/?Set=8860-1"&gt;8860&lt;/a&gt;) which later became real cars. Unfortunately I don't own any of the chassis sets, but I do own the &lt;a href="http://www.brickset.com/detail/?Set=8880-1"&gt;8880&lt;/a&gt; and the &lt;a href="http://www.brickset.com/detail/?Set=8448-1"&gt;8448&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Recently I stumbled upon an interesting &lt;a href="http://technicbricks.blogspot.com/2011/08/nk-concept-car-available-as-kit.html"&gt;blog entry&lt;/a&gt; talking about a concept car for sale on eBay, designed by &lt;a href="http://www.brickshelf.com/cgi-bin/gallery.cgi?m=industrialdesigner"&gt;Nathanaël Kuipers&lt;/a&gt;. The car looks a lot like the car from the old 8448 set, but is using a more modular design. It is also completely studless whereas the 8448 still had some older Technic bricks. The car was eventually sold for $600 which was way more than I ever bid.&lt;br /&gt;Since the instructions were also for sale, I decided to buy the instructions and all necessary parts from &lt;a href="https://www.bricklink.com/"&gt;Brick Link&lt;/a&gt; instead. I thought this was going to be much cheaper, but I guess I was wrong. I have now gathered EUR 330 worth of parts spread across 3 stores (first large package arrived today, yeah!). I don't have all the parts yet, but expect to have them before the end of this year.&lt;br /&gt;&lt;br /&gt;To be continued I guess :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8151600360173490255?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8151600360173490255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8151600360173490255' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8151600360173490255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8151600360173490255'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2011/08/nk-concept-car_30.html' title='NK Concept Car'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2925023563606612624</id><published>2011-02-11T15:16:00.002+01:00</published><updated>2011-02-11T16:02:17.504+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='timelog'/><title type='text'>TimeLogNG</title><content type='html'>As a consultant, it is important to be able to track your time spent on different tasks and projects. This is necessary to be able to report everything accurately in your time sheet or invoices you send to your clients. Tracking time can be a tedious process, however, and there are different tools available to help you with this.&lt;br /&gt;&lt;br /&gt;A long time ago, I found a tool called Timelog. I can't provide a link to this software, because it seems dead at the time of this writing. You should be able to find it again if you google for Timelog and kclee. Anyway, the tool did a terrific job and was written in Java. The only problem I had, was its inability to cope with different clients and projects. You were just able to track time spent on tasks, regardless of clients and projects. So my solution was to keep different files for different clients. This worked just fine, but consolidating all the different files into one time sheet was error prone and not so easy once I started to work for a lot of different clients. Since it was open source, I decided to assist the original author in redesigning (rewriting) the original application. As a result, the &lt;a href="https://sourceforge.net/projects/timelogng/"&gt;TimeLog NG&lt;/a&gt; project was founded.&lt;br /&gt;&lt;br /&gt;A few years later, I discovered a new tool that did exactly what I wanted, called &lt;a href="http://www.blackbeltsoftware.com.au/"&gt;Stopwatch&lt;/a&gt;. At that time, this little application was still free and open source and hosted on &lt;a href="http://www.java.net/"&gt;java.net&lt;/a&gt;. Since it did exactly what I wanted it to do, the rewrite of Timelog got postponed again (no need to reinvent the wheel right?).&lt;br /&gt;That same year, I started developing Eclipse RCP applications for a client I was working for. I also switched to a different employer and I was asked to give a &lt;span style="font-style:italic;"&gt;not so short&lt;/span&gt; presentation on Eclipse RCP. As a demo, for this presentation, I wrote a Stopwatch version in Eclipse RCP. This was basically Stopwatch's model, with an Eclipse RCP UI on top. Writing this took a day or so and was ideal to demo most of Eclipse RCP's features.&lt;br /&gt;&lt;br /&gt;In 2009, I think, the Stopwatch project on &lt;a href="http://www.java.net/"&gt;java.net&lt;/a&gt; got commercialised, so the &lt;a href="https://sourceforge.net/projects/timelogng/"&gt;TimeLog NG&lt;/a&gt; project was reinstated. The demo application I once wrote was uploaded in subversion and &lt;span style="font-style:italic;"&gt;mavenized&lt;/span&gt;. If you checkout the project from subversion, you should be able to build it with maven 3. &lt;a href="http://tycho.sonatype.org/"&gt;Tycho&lt;/a&gt; now works more or less and is capable of building an RCP product. Currently it only builds on Linux, but it's fairly easy to compile this on other platforms.&lt;br /&gt;&lt;br /&gt;TimeLog NG is more or less stable, but the model is crap, it does not adhere to the &lt;a href="http://domaindrivendesign.org/"&gt;ddd&lt;/a&gt; principles and it still has some bugs. The model is also serialised using &lt;a href="http://xstream.codehaus.org/"&gt;XStream&lt;/a&gt; to persist it to disk, which tends to slow down the bigger your model gets. So, again, a rewrite is necessary. It also lacks some features which I think are must haves for a time tracking application. A simple start and stop button, for example, to record work on a task.&lt;br /&gt;&lt;br /&gt;So, once again, I will try to rewrite this little application, help is appreciated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2925023563606612624?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2925023563606612624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2925023563606612624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2925023563606612624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2925023563606612624'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2011/02/timelogng.html' title='TimeLogNG'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8648802568865589927</id><published>2011-01-20T15:47:00.006+01:00</published><updated>2011-01-24T13:27:38.798+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Telenet'/><title type='text'>Telenet lanceert Fibernet 40 en 60</title><content type='html'>Ik heb momenteel een Diamond Shake + abonnement bij Telenet. Deze formule bestaat al een tijdje niet meer. Deze maand heeft Telenet echter voor een vervanging gezorgd. Fibernet 40, vergelijkbaar met Diamond Shake +, maar iets goedkoper en Fibernet 60, vergelijkbaar met Turbonet. Fibernet 40 zou echter sneller moeten zijn dan ExpressNet XL, die vervat zat in de Diamond Shake +. Dat zullen we dan wel zien.&lt;br /&gt;&lt;br /&gt;Volgende week ga ik hiervoor een nieuwe modem halen, die trouwens vlot over de toonbank gaan. Het Telenet Center in mijn buurt was zijn volledige stock van 100 modems kwijt na één dag. Een collega van mij heeft de stap reeds gezet en ging gisteren een nieuwe modem halen. Tot zijn grote verbazing werkte er niets meer. Geen Internet toegang, geen telefoon en dus ook geen digitale TV. Telenet was echter zo vriendelijk een technieker te sturen en er bleek een probleem te zijn met de versterker. Telenet plaatst immers bij elke abonnee een versterker tussen de kabel die binnenkomt, de modem en de TV(s) in huis. Als de versterker te oud is, laat deze de hoge frequenties die gebruikt worden door de nieuwe modem niet door, dus geen Internet of telefoon.&lt;br /&gt;&lt;br /&gt;Telenet is bezig de versterkers bij alle klanten te vernieuwen, zodat bovenstaande problemen kunnen vermeden worden. Voor "early adopters" zoals wij, betekend dit jammer genoeg miserie en een dag verlof nemen om een technieker te laten komen.&lt;br /&gt;Ik heb alvast een bericht gestuurd naar de helpdesk en ben in blijde verwachting van een antwoord.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE 21-01-2011: &lt;/span&gt; Mails beantwoorden bij Telenet gaat niet zo vlot, dus heb ik zelf eens gebeld. Volgens hen heb ik dus inderdaad een verouderde versterker en kan ik die ook inruilen in een Telenet Center. Volgens deze &lt;a href="http://www.9lives.be/forum/algemene-discussies/770420-telenet-lanceert-42.html"&gt;link&lt;/a&gt; moet de versterker signalen van 5 tot 65 MHz doorlaten. Op mijn versterker staan lijntjes in 2 kleuren. Groen; met daarop 10-25MHz en zwart; met daarop 108-860MHz. Het groene lijntje telt dus blijkbaar (-6 dB).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE 24-01-2011: &lt;/span&gt; Deze ochtend ging ik niets vermoedend naar het Telenet Center in de buurt om mijn huidige modem in te ruilen voor een Fibernet 40 exemplaar. De vriendelijke persoon aan de andere kant van de toonbank wist mij echter te vertellen dat Telenet in een interne mailing vrijdagavond beslist heeft om de gratis doe-het-zelf installatie af te schaffen. Iedereen, dus ook bestaande klanten, moet dus een technieker laten langskomen. Dit was een dikke streep door mijn rekening, want ik had hiervoor vandaag verlof genomen. Even bellen met Telenet dus :/&lt;br /&gt;Gelukkig hebben ze mij snel kunnen helpen en konden ze in de namiddag al een technieker langs laten komen. NU dus :) Ik schrijf dus deze update via de nieuwe Fibernet 40 verbinding.&lt;br /&gt;&lt;br /&gt;De nieuwe modem heeft intern reeds een draadloze router aan boord. Dit wil zeggen dat de adressen die uitgedeeld worden in het 192.168.0.x netwerk segment zitten. Ik had eigenlijk al een &lt;a href="http://kennywest.blogspot.com/search/label/firewyse"&gt;router&lt;/a&gt; en ben voorlopig niet van plan deze op te geven. Hij dient immers als centrale server voor opslag en printen. Doordat deze in het 192.168.1.x netwerk segment adressen uitdeelt kan ik deze nog steeds gebruiken, ook al zit hij achter een andere router. 2 keer NAT dus, wat wel een beetje vertraging betekend, veronderstel ik.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8648802568865589927?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8648802568865589927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8648802568865589927' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8648802568865589927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8648802568865589927'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2011/01/telenet-lanceert-fibernet-40-en-60.html' title='Telenet lanceert Fibernet 40 en 60'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-6099110161467045542</id><published>2010-12-31T14:43:00.003+01:00</published><updated>2010-12-31T15:10:43.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='mondo'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Restoring files manually from a mondo backup</title><content type='html'>As already mentioned in &lt;a href="http://kennywest.blogspot.com/2008/12/easy-backups-on-linux-putting-it-to.html"&gt;earlier&lt;/a&gt; posts, I uses &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; to create &lt;span style="font-style:italic;"&gt;system backups&lt;/span&gt; of all my systems. By &lt;span style="font-style:italic;"&gt;system backups&lt;/span&gt; I mean; create a backup of the live system, without any personal data. In short, this is a backup of everything except home folders. The home folders are backed up using rsync and external disks, but this is another story.&lt;br /&gt;Restoring from a mondo backup is easy; simply burn the images, put it in a cd drive and &lt;span style="font-style:italic;"&gt;nuke&lt;/span&gt; the system (yes, this is a restore option in &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; :) ).&lt;br /&gt;If you just want to restore some files from the backup, without overwriting the whole system, there's an easy way to do this. Suppose you created an ISO a while ago and these are stored on some disk. First, you will need to mount the ISO as a loopback device like so:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mount -o loop MyIso.iso /mnt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The ISO is now mounted in &lt;tt&gt;/mnt&lt;/tt&gt;.&lt;br /&gt;Now locate the file you want to restore (I was going to restore &lt;tt&gt;smb.conf&lt;/tt&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ grep smb.conf /mnt/archives/filelist.*&lt;br /&gt;/mnt/archives/filelist.11:/var/lib/ucf/cache/:etc:samba:smb.conf&lt;br /&gt;/mnt/archives/filelist.36:/usr/share/man/man5/smb.conf.5.gz&lt;br /&gt;/mnt/archives/filelist.43:/usr/share/doc/samba-doc/htmldocs/manpages/smb.conf.5.html&lt;br /&gt;/mnt/archives/filelist.44:/usr/share/doc/samba-doc/examples/dce-dfs/smb.conf&lt;br /&gt;/mnt/archives/filelist.44:/usr/share/doc/samba-doc/examples/smb.conf.default.gz&lt;br /&gt;/mnt/archives/filelist.44:/usr/share/doc/samba-doc/examples/tridge/smb.conf&lt;br /&gt;/mnt/archives/filelist.44:/usr/share/doc/samba-doc/examples/tridge/smb.conf.fjall&lt;br /&gt;/mnt/archives/filelist.44:/usr/share/doc/samba-doc/examples/tridge/smb.conf.lapland&lt;br /&gt;/mnt/archives/filelist.44:/usr/share/doc/samba-doc/examples/tridge/smb.conf.vittjokk&lt;br /&gt;/mnt/archives/filelist.44:/usr/share/doc/samba-doc/examples/tridge/smb.conf.WinNT&lt;br /&gt;/mnt/archives/filelist.46:/usr/share/doc/smbldap-tools/examples/smb.conf&lt;br /&gt;/mnt/archives/filelist.48:/usr/share/samba/smb.conf&lt;br /&gt;/mnt/archives/filelist.48:/usr/share/samba/smb.conf.dapper&lt;br /&gt;/mnt/archives/filelist.48:/usr/share/samba/smb.conf.etch&lt;br /&gt;/mnt/archives/filelist.48:/usr/share/samba/smb.conf.gutsy&lt;br /&gt;/mnt/archives/filelist.&lt;b&gt;5&lt;/b&gt;:/etc/samba/smb.conf&lt;br /&gt;/mnt/archives/filelist.&lt;b&gt;5&lt;/b&gt;:/etc/samba/smb.conf.ucf-dist&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The file I needed was somewhere in an archive identified by number 5.&lt;br /&gt;Now create some folder in a temporary location:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ mkdir /tmp/restore&lt;br /&gt;$ cd /tmp/restore&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now restore the contents of the archive you want (you might need to download and install afio):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;afio -ZP bzip2 -i /mnt/archives/&lt;b&gt;5&lt;/b&gt;.afio.bz2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The whole archive is now restored underneath &lt;tt&gt;/tmp/restore&lt;/tt&gt;. So my &lt;tt&gt;smb.conf&lt;/tt&gt; is now located underneath &lt;tt&gt;/tmp/restore/etc/samba/smb.conf&lt;/tt&gt;. Pretty cool eh.&lt;br /&gt;&lt;br /&gt;Anyway, I don't deserve any credits for this post, I found a lot of help &lt;a href="http://www.averyjparker.com/2006/01/13/mondorescue-manually-restoring-from-an-afiobz2-file/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT:&lt;/b&gt; Apparently there is an &lt;a href="http://www.mondorescue.org/docs/mondorescue-howto.html#AEN1023"&gt;easier, more graphical&lt;/a&gt; way to restore stuff from a mondo archive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-6099110161467045542?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/6099110161467045542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=6099110161467045542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6099110161467045542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6099110161467045542'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/12/restoring-files-manually-from-mondo.html' title='Restoring files manually from a mondo backup'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-3686869278478895826</id><published>2010-12-30T19:34:00.002+01:00</published><updated>2010-12-30T19:39:27.313+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Samba'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>Failed to issue the StartTLS instruction: Protocol error</title><content type='html'>I encountered the error mentioned in the title of this post after upgrading my samba install on Debian Lenny using &lt;a href="http://enterprisesamba.com/"&gt;Enterprise Samba&lt;/a&gt; binaries. The latest version they distribute at the time of writing is 3.4.9. My samba install talks to an ldap backend and the above error was shown upon starting the new version. Seems they added (or changed the default) option for the ldap protocol in &lt;tt&gt;smb.conf&lt;/tt&gt;. Adding:&lt;pre&gt;&lt;br /&gt;ldap ssl = off&lt;/pre&gt; makes the error go away.&lt;br /&gt;Cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-3686869278478895826?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/3686869278478895826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=3686869278478895826' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3686869278478895826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3686869278478895826'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/12/failed-to-issue-starttls-instruction.html' title='Failed to issue the StartTLS instruction: Protocol error'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-443032964161877847</id><published>2010-12-28T10:17:00.003+01:00</published><updated>2010-12-28T11:25:43.026+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='querydsl'/><title type='text'>Building queries ... the easy way</title><content type='html'>On a past project, users needed to be able to create a custom query and execute it. To do this, the user was able to select a field, an operator and select or fill in a value. If, for example, we were searching for people living in Belgium, the user would select &lt;tt&gt;person.address.country&lt;/tt&gt; for the field, &lt;tt&gt;like&lt;/tt&gt; for the operator and fill in "BE" for the value. I'm sure you all know how the resulting SQL would look like.&lt;br /&gt;&lt;br /&gt;There are different ways to create a query builder. If you're using &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, the above example could easily be translated to HQL using the &lt;a href="http://www.javalobby.org/articles/hibernatequery102/"&gt;criteria&lt;/a&gt; API. In some cases, however, the resulting SQL is not exactly what you wanted (e.g. not performing well) or maybe Hibernate is just not capable generating a correct SQL. Unfortunately, at that time, we discovered we were suffering both aforementioned problems, so the only solution was to create our own query builders using string concatenation. Yes, this can get ugly really fast, when not being careful, but I managed to create something that works and looks nice ... more or less.&lt;br /&gt;&lt;br /&gt;On a more recent project, users were also capable of creating custom queries. Instead of re-using parts of the query builders written in the past, I decided to ask Google for help. Surely there had to be someone or some project out there that came across the same issues I was having with &lt;a href="http://www.hibernate.org/"&gt;Hibernates&lt;/a&gt; &lt;a href="http://www.javalobby.org/articles/hibernatequery102/"&gt;criteria&lt;/a&gt; API. During my search, I came across &lt;a href="http://source.mysema.com/display/querydsl/Querydsl"&gt;querydsl&lt;/a&gt; which seemed to do what I wanted to accomplish.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://source.mysema.com/display/querydsl/Querydsl"&gt;querydsl&lt;/a&gt; comes in different "flavours". You can use it to query your database using HQL or SQL. You can even use it to query objects in a simple collection (similar to &lt;a href="http://code.google.com/p/lambdaj/"&gt;lambdaj&lt;/a&gt; I guess). To do this, &lt;a href="http://source.mysema.com/display/querydsl/Querydsl"&gt;querydsl&lt;/a&gt; uses so called "Q" entities. So, if I'm querying a person and its addresses, I would have a &lt;tt&gt;QPerson&lt;/tt&gt; and a &lt;tt&gt;QAddress&lt;/tt&gt;. These entities can be generated from your JPA annotated domain model, or can be reverse engineered from your database. Of course, you can generate these "Q" entities by hand, since it's a very clean and easy to understand API. Once you have your "Q" entities in place, you can start querying the database in a very fluent API, like this: &lt;tt&gt;query.from(person).join(address).on(person.id.eq(address.person)).where(address.country.like("BE")&lt;/tt&gt;). This API is also type-safe (HQL or criteria aren't), so you won't be querying a person's name using it's birth date :)&lt;br /&gt;&lt;br /&gt;The only remaining difficulty was to translate the criteria sent by the user interface to something understood by querydsl. To do this, I created something that "observes" the creation of the "Q" entities. When a &lt;tt&gt;QPerson&lt;/tt&gt; has a field "firstName", the observer knows this. The observer also knows there is a relation between the &lt;tt&gt;QPerson&lt;/tt&gt; and the &lt;tt&gt;QAddress&lt;/tt&gt; entities expressed by the relation &lt;tt&gt;person.address&lt;/tt&gt;. In the end, the observer holds a complete mapping between the fields available in my "Q" entities and their actual names (e.g.: &lt;tt&gt;StringPath("FIRST_NAME")&lt;/tt&gt; maps to &lt;tt&gt;person.firstName&lt;/tt&gt;). Once you understand the insides of querydsl, this isn't very hard to create. Finally, you just need to merge this mapping with the criteria sent by the user interface and your query is ready to be executed against the database.&lt;br /&gt;&lt;br /&gt;I wish I could publish the code written on this project, but the nature of the project doesn't allow me to do so. In this post, I just wanted to tell you something about &lt;a href="http://source.mysema.com/display/querydsl/Querydsl"&gt;querydsl&lt;/a&gt; and how easy it is to plug this into an existing project. It's also very extendible and has a very active community and core developer. Should you have any questions on this, please leave a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-443032964161877847?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/443032964161877847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=443032964161877847' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/443032964161877847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/443032964161877847'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/12/building-queries-easy-way.html' title='Building queries ... the easy way'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8523718808452043137</id><published>2010-12-11T11:41:00.002+01:00</published><updated>2010-12-11T11:55:21.815+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='f-spot'/><category scheme='http://www.blogger.com/atom/ns#' term='Photos'/><title type='text'>Updating the location for your photo's in f-spot</title><content type='html'>I've been using &lt;a href="http://f-spot.org/"&gt;f-spot&lt;/a&gt; for quite some time now to manage and categorise all my pictures. In older Ubuntu versions (8.04 and earlier), the default location for f-spot to store its photo's was: &lt;tt&gt;/home/username/Photos&lt;/tt&gt;. For some reason, Ubuntu 10.04 (probably earlier versions as well) changed this folder to: &lt;tt&gt;/home/username/Pictures/Photos&lt;/tt&gt;. I didn't notice this until today, while I was importing photo's and checking the contents of &lt;tt&gt;/home/username/Photos&lt;/tt&gt; only to see nothing was copied to this location. That's when I discovered they changed the default location :)&lt;br /&gt;Since f-spot is backed by an sqlite database, this wasn't very hard to solve:&lt;ul&gt;&lt;li&gt;create a backup of the sqlite database photos.db (should be underneath &lt;tt&gt;/home/username/.config/f-spot&lt;/tt&gt;)&lt;/li&gt;&lt;li&gt;now update the location with sqlite3:&lt;pre&gt;&lt;br /&gt;kenneth@pavane:/data/home/kenneth/.config/f-spot$ sqlite3 photos.db&lt;br /&gt;SQLite version 3.6.22&lt;br /&gt;Enter ".help" for instructions&lt;br /&gt;Enter SQL statements terminated with a ";"&lt;br /&gt;sqlite&gt; update photos set base_uri=replace(base_uri, 'file:///home/kenneth/Pictures', 'file:///home/kenneth');&lt;br /&gt;sqlite&gt; update photo_versions set base_uri=replace(base_uri, 'file:///home/kenneth/Pictures', 'file:///home/kenneth');&lt;br /&gt;.exit&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;now move your pictures to their correct location&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Phew, solved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8523718808452043137?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8523718808452043137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8523718808452043137' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8523718808452043137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8523718808452043137'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/12/updating-location-for-your-photos-in-f.html' title='Updating the location for your photo&apos;s in f-spot'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-987939589197326613</id><published>2010-05-18T19:03:00.011+02:00</published><updated>2010-05-18T20:48:16.115+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Kubuntu 10.04, the aftermath (2)</title><content type='html'>Now that I had my system up and running, it was time to add some of the applications I love to use. The previous LTS version shipped with Thunderbird 2, whereas the current LTS comes with Thunderbird 3. The new version recognized my existing profile (underneath &lt;tt&gt;HOME/.thunderbird&lt;/tt&gt;, which is where all accounts are kept) without any problems. No mails got lost in the transition. The new version comes with smart folders, which gives an aggregated view on all folders when using different accounts (e.g. webmail, gmail, your ISP's pop mail, ...). My favorite photo management software, &lt;a href="http://f-spot.org/"&gt;f-spot&lt;/a&gt;, is also updated and I was very pleased to see it converted my database from the older version without any issues.&lt;br /&gt;In short, all software I used on 8.04 managed to convert my personal settings and data without any problems, which was a relief.&lt;br /&gt;&lt;br /&gt;For the rare occasions I still need Windows (only to sync my GPS software with my old PDA, actually), I've set up a virtual machine inside vmware server. Unlike vmware's workstation and fusion, vmware server is a free product. You don't get any fancy stuff with it, like hardware acceleration, but I don't really need this. I also prefer vmware in favor of other virtualization products, like &lt;a href="http://www.virtualbox.org/"&gt;virtualbox&lt;/a&gt;, because I'm used to it and it allows me to run virtual machines from work without any modifications. Installing vmware server on a Linux OS with a fairly recent kernel has always been a nightmare. I had a lot of issues installing it on 8.04 and was facing the same issues installing it on 10.04. Thankfully Google was my friend a I came across &lt;a href="http://communities.vmware.com/thread/266625"&gt;this&lt;/a&gt; thread, explaining in detail how to install vmware on a modern Linux. All you need to do is follow these steps inside a terminal:&lt;pre&gt;&lt;tt&gt;cd /usr/local/src&lt;br /&gt;wget http://codebin.cotescu.com/vmware/vmware-server-2.0.x-kernel-2.6.3x-install.sh&lt;br /&gt;tar xvzf raducotescu-vmware-server-linux-2.6.3x-kernel-592e882.tar.gz&lt;br /&gt;cd raducotescu-vmware-server-linux-2.6.3x-kernel-592e882/&lt;br /&gt;tar xvzf  VMware-server-2.0.2-203138.x86_64.tar.gz #OF COURSE you have to copy the tar.gz to this dir first..&lt;br /&gt;chmod +x vmware-server-2.0.x-kernel-2.6.3x-install.sh&lt;br /&gt;./vmware-server-2.0.x-kernel-2.6.3x-install.sh &lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;After following these steps, you should have vmware server up and running. Unfortunately you're not out of the bush yet. The console, which is launched from within firefox and connects to the virtual machine's console, is incompatible with firefox 3.6. Luckily, there's a workaround for this. You need to unzip (yes, using the unzip command) &lt;tt&gt;/usr/lib/vmware/webAccess/tomcat/apache-tomcat-6.0.16/webapps/ui/plugin/vmware-vmrc-linux-x86.xpi&lt;/tt&gt; (or &lt;tt&gt;vmware-vmrc-linux-x64.xpi&lt;/tt&gt; when you're running a 64bit Linux) to a temporary folder. When extracted, locate the &lt;tt&gt;plugins&lt;/tt&gt; folder. Inside it, you should find an executable called &lt;tt&gt;vmware-vmrc&lt;/tt&gt;. You should be able to launch it (only from within the folder) and connect to your freshly installed vmware server.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6Mp7nHbR5E8/S_LfIY_TCTI/AAAAAAAAAIU/sf9XBf9EMlw/s1600/vmware-console-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 254px;" src="http://1.bp.blogspot.com/_6Mp7nHbR5E8/S_LfIY_TCTI/AAAAAAAAAIU/sf9XBf9EMlw/s320/vmware-console-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472681832448461106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next, you can select a virtual machine you just started ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6Mp7nHbR5E8/S_LfQJ-WaHI/AAAAAAAAAIc/XbXXAESZPZ4/s1600/vmware-console-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 268px; height: 320px;" src="http://3.bp.blogspot.com/_6Mp7nHbR5E8/S_LfQJ-WaHI/AAAAAAAAAIc/XbXXAESZPZ4/s320/vmware-console-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472681965856909426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... and your done.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6Mp7nHbR5E8/S_LfWL1Wf1I/AAAAAAAAAIk/7ncNHjG8wCA/s1600/vmware-console-3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://3.bp.blogspot.com/_6Mp7nHbR5E8/S_LfWL1Wf1I/AAAAAAAAAIk/7ncNHjG8wCA/s320/vmware-console-3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472682069435252562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Don't use &lt;tt&gt;ctrl-alt-del&lt;/tt&gt;, use &lt;tt&gt;ctrl-alt-print screen&lt;/tt&gt; instead :)&lt;br /&gt;&lt;br /&gt;Hopefully, the people from vmware will release a new version of their server product soon and make sure it's compatible with a more recent kernel and browser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-987939589197326613?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/987939589197326613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=987939589197326613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/987939589197326613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/987939589197326613'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/05/kubuntu-1004-aftermath-2.html' title='Kubuntu 10.04, the aftermath (2)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6Mp7nHbR5E8/S_LfIY_TCTI/AAAAAAAAAIU/sf9XBf9EMlw/s72-c/vmware-console-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2664222833283389627</id><published>2010-05-12T11:07:00.007+02:00</published><updated>2010-05-12T11:55:31.323+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Kubuntu 10.04, the aftermath (1)</title><content type='html'>I've been using Ubuntu since Hoary, which was released 5 years ago. It has always been, and still is, my preferred OS for desktop computing. April 29th the latest LTS version, 10.04, was released. This week, I decided to take it for a spin.&lt;br /&gt;Being able to upgrade / dist-upgrade on a Debian based Linux system, has always been one of the main reasons why I like Ubuntu so much. In Ubuntu's early days, however, breakage was very likely after dist-upgrading your system. dist-upgrading from Hoary (5.04) towards Dapper (6.06) every six months has been a true nightmare. After that experience, I decided to stick with every LTS version (i.e., 6.06, 8.04, 10.04, ...) and reinstall from scratch. Having my home directory on a separate partition, eases this process a lot. Just reinstall Ubuntu (after backing everything up of course), mount the home partition and your done.&lt;br /&gt;Since I became a big fan of KDE, over the years I've been using Linux, I decided to replace my Kubuntu 8.04 (which was, let's face it, crap) with Kubuntu 10.04. The installation went smoothly and in a matter of minutes I had my new, shiny desktop.&lt;br /&gt;My PC is equipped with an ancient NVidia graphics adapter (GeForce 6 series). Kubuntu 10.04 comes with the nouveau graphics driver, which is an open source effort to eliminate the need for NVidia's binary driver which is, of course, closed source. I am a big fan of open source projects and the community surrounding it, but the nouveau driver is nothing compared to NVidia's binary version.&lt;br /&gt;Since the nouveau driver comes preloaded, I had a hard time installing NVidia's binary driver. First, you have to "apt-get remove" all packages named "something-nvidia-something". &lt;tt&gt;&lt;br /&gt;dpkg -l | grep nvidia&lt;/tt&gt; shows a list of packages that are pre-installed.&lt;br /&gt;Next, you need to blacklist the nouveau driver, so the kernel doesn't load it while booting. To do this, open &lt;tt&gt;/etc/module.d/blacklist.conf&lt;/tt&gt; and append &lt;tt&gt;blacklist=nouveau&lt;/tt&gt;.&lt;br /&gt;After rebooting, in single user mode, you'll see that nouveau isn't loaded and you can safely execute the NVidia installer script.&lt;br /&gt;Once installed, another problem arises. There is currently a &lt;a href="https:/http://www.blogger.com/img/blank.gif/bugs.launchpad.net/ubuntu/+source/kubuntu-default-settings/+bug/551290"&gt;bug&lt;/a&gt; which makes the splash screen (i.e. the logo and stuff that appear while booting) looks very ugly after installing NVidia's (or ATI's) binary driver. The people from Ubuntu have provided a temporary fix, enabling a splash screen in 16 color mode. IMHO this still looks like crap, so I disabled the splash screen altogether.&lt;br /&gt;Having to blacklist modules to be able to install NVidia's driver and the crappy plymouth screen is, IMHO, unacceptable. Ubuntu supposed to be a user friendly system. Forcing people to use the nouveau driver is unacceptable as well. I am free to choose whatever driver I want for me graphics card, albeit a closed source driver. Using the closed driver increases graphical performance a lot and the desktop and text look much "sharper". Not so much with the open source driver.&lt;br /&gt;The crappy plymouth screen proves, again, that the people from Ubuntu didn't do their homework and forgot there are a lot of users out there using closed source drivers for their graphics card.&lt;br /&gt;All in all, I am still pleased with my 10.04 install. It looks nice and boots very fast on my 5 year old PC. But somehow, I feel like they failed again to release a Linux distribution, ready for the desktop and ready to replace Windows on the desktop. Maybe we'll have to wait for 12.04 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2664222833283389627?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2664222833283389627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2664222833283389627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2664222833283389627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2664222833283389627'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/05/kubuntu-1004-aftermath-1.html' title='Kubuntu 10.04, the aftermath (1)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2862917855110561699</id><published>2010-05-04T19:33:00.002+02:00</published><updated>2010-05-04T20:21:23.617+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>When June 1 1900 is not June 1 1900</title><content type='html'>We're developing a fairly large application in Java. There are 2 front end applications, one written in Flex, the other in plain Spring-MVC and Spring-WebFlow. Both of them are using 3 main applications deployed as 3 different wars on the same application server. The front end applications talk with the back end applications using RMI exposed as HTTP. The back end applications also talk to each other using the same protocol.&lt;br /&gt;&lt;br /&gt;One of the applications deployed in the back end is responsible for validating data entered in the front end applications. One of the rules in the, so called ValidationService, checks if the SSIN of a person is valid.&lt;br /&gt;In Belgium, all people have a unique SSIN (Social Security Identification Number), comprised of 11 digits. The first 6 digits are based on the person's birth date. So if this person was born on April 21, 1978, the SSIN starts with 780421xxxyy. To check if an SSIN is valid, you need to check the person's birth date against these first 6 digits. In fact, &lt;a href="http://www.ksz-bcss.fgov.be/nl/bcss/page/content/websites/belgium/services/docutheque/technical_faq/faq_5.html#Hoe-zit-de-structuu-59"&gt;you need to do a lot more to check if the SSIN is valid&lt;/a&gt;, but the issue I was having was related to the person's birth date.&lt;br /&gt;&lt;br /&gt;For test purposes, one of the front end applications was running on a Windows machine, while the back end applications where running on a Linux machine (some version of Ubuntu). When entering 06/01/1900 and an SSIN starting with 000106, the ValidationService threw an error at me claiming the SSIN did not match the given birth date. While debugging the ValidationService, I saw the date that was entering the system was 05/31/1900 (23h50m), instead of 06/01/1900 (00h00m). How strange.&lt;br /&gt;&lt;br /&gt;To be able to understand the above problem, we need to know how object serialization works in Java. Whenever objects are transfered over a wire, they are serialized. Each object knows how it can serialize and deserialize itself by implementing the private methods &lt;tt&gt;writeObject&lt;/tt&gt; and &lt;tt&gt;readObject&lt;/tt&gt;. The java.util.Date object simply converts itself to a long value while serializing. This long value represents the number of milliseconds since January 1, 1970, 00:00:00 GMT.&lt;br /&gt;For some reason, I don't know why, this long value on Linux is different from the long value on Windows. I can prove this using a simple test. Write a simple test class:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; &lt;font color="#2040a0"&gt;Test&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;    &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;font color="#2040a0"&gt;main&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;java&lt;/font&gt;.&lt;font color="#2040a0"&gt;lang&lt;/font&gt;.&lt;font color="#2040a0"&gt;String&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;[&lt;/strong&gt;&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;]&lt;/strong&gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;args&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;System&lt;/font&gt;.&lt;font color="#2040a0"&gt;out&lt;/font&gt;.&lt;font color="#2040a0"&gt;println&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;new&lt;/strong&gt; &lt;font color="#2040a0"&gt;java&lt;/font&gt;.&lt;font color="#2040a0"&gt;util&lt;/font&gt;.&lt;font color="#2040a0"&gt;Date&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;,&lt;font color="#FF0000"&gt;5&lt;/font&gt;,&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;System&lt;/font&gt;.&lt;font color="#2040a0"&gt;out&lt;/font&gt;.&lt;font color="#2040a0"&gt;println&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;new&lt;/strong&gt; &lt;font color="#2040a0"&gt;java&lt;/font&gt;.&lt;font color="#2040a0"&gt;util&lt;/font&gt;.&lt;font color="#2040a0"&gt;Date&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;,&lt;font color="#FF0000"&gt;5&lt;/font&gt;,&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/font&gt;.&lt;font color="#2040a0"&gt;getTime&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, compile it and run it on Windows, this should be the output (Java 6):&lt;pre&gt;&lt;tt&gt;&lt;br /&gt;Fri Jun 01 00:00:00 CET 1900&lt;br /&gt;-2195942961000&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;Do the same on Linux, and this should be the output (Java 6):&lt;pre&gt;&lt;tt&gt;&lt;br /&gt;Fri Jun 01 00:00:00 CET 1900&lt;br /&gt;-2195942400000&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Interesting, isn't it. I wonder if there are other platforms affected as well. I mean, what's the output of the simple class on Mac OS X, BSD, AIX, Solaris, ... . IMHO they should all render the same long value, and I have a sneaking suspicion which platform had an F in mathematics :)&lt;br /&gt;&lt;br /&gt;The strange thing is, not all dates are affected. I was doing a batch upload of 600.000+ records, all with different birth dates and SSINs and this was the only one throwing the aforementioned error.&lt;br /&gt;&lt;br /&gt;Anyway, the above should be kept in mind when deploying different services talking with each other over RMI, on different platforms. I suspect this is a bug, but who cares. The Date and Calendar stuff in Java is a true nightmare and we all should use &lt;a href="http://joda-time.sourceforge.net/"&gt;joda time&lt;/a&gt; instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2862917855110561699?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2862917855110561699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2862917855110561699' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2862917855110561699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2862917855110561699'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/05/when-june-1-1900-is-not-june-1-1900.html' title='When June 1 1900 is not June 1 1900'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-1863200921912366679</id><published>2010-02-21T09:34:00.020+01:00</published><updated>2010-02-21T14:10:29.970+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qube'/><title type='text'>The story of the Cobalt Qube</title><content type='html'>The other week, a friendly colleague of mine brought me a small present. He gave me one of his &lt;a href="http://en.wikipedia.org/wiki/Cobalt_Qube"&gt;Cobalt Qube&lt;/a&gt;s (for free!) which was collecting dust at his home. He was certain that I could give it a better use.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6Mp7nHbR5E8/S4EgQGcHvdI/AAAAAAAAAHE/qb02NrLJdw8/s1600-h/qube1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://3.bp.blogspot.com/_6Mp7nHbR5E8/S4EgQGcHvdI/AAAAAAAAAHE/qb02NrLJdw8/s320/qube1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5440665285818826194" /&gt;&lt;/a&gt;&lt;br /&gt;I think I can still remember the days these things hit the market (somewhere in the late 90's). This was a home / office server appliance way before the people of Microsoft thought up their &lt;a href="http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx"&gt;Windows Home Server&lt;/a&gt;. It was running some modified version of Linux RedHat, featuring a web interface for all administrative tasks. It also had 2 network cards, so you could easily turn it into a gateway / firewall. The RedHat version running on the Qube was known to be notoriously insecure. It was also running an older 2.0.x kernel which was outdated, even at that time. The Qube 2700 and Qube 2 were both equipped with a MIPS processor. Later models had an i386 architecture. Mine was a Qube 2.&lt;br /&gt;&lt;h4&gt;Getting the serial connection to work&lt;/h4&gt;&lt;br /&gt;The Qube does not have any VGA adapter, so if you want to see what is happening inside, you'll need to get your serial connection to work. The LCD on the back also spits out some messages, but these are rather brief. Now, we need to connect a NULL modem cable to the serial console port of the Qube. You can easily create these NULL modem cables yourself. All you need is:&lt;ul&gt;&lt;li&gt;a few metres of phone cable (4 wires)&lt;/li&gt;&lt;li&gt;2 DB9 female connectors&lt;/li&gt;&lt;/ul&gt;. Solder wire_1 to pin 2, wire_2 to pin 3 and wire_3 to pin 5 on one DB9 connector. Next, solder wire_1 to pin 3, wire_2 to pin 2 and wire_3 to pin 5 and your done. As you can see, pin 3 and pin 2 are crossed, pin 5 is used for mass.&lt;br /&gt;You can connect to the serial console from any Linux box by typing:&lt;tt&gt;screen /dev/ttyS0 115200&lt;/tt&gt;. The output should be similar to the text shown below:&lt;pre&gt;&lt;br /&gt;Cobalt Microserver Diagnostics - 'We serve it, you surf it'&lt;br /&gt;Built Wed Mar  3 21:26:25 PST 1999&lt;br /&gt;&lt;br /&gt; 1.LCD Test................................PASS&lt;br /&gt; 2.Controller Test.........................PASS&lt;br /&gt; 5.Bank 0:.................................64M&lt;br /&gt; 6.Bank 1:.................................64M&lt;br /&gt; 7.Bank 2:.................................64M&lt;br /&gt; 8.Bank 3:.................................64M&lt;br /&gt; 9.Serial Test.............................PASS&lt;br /&gt;10.PCI Expansion Slot....................**EMPTY**&lt;br /&gt;12.IDE Test................................PASS&lt;br /&gt;13.Ethernet Test...........................PASS&lt;br /&gt;16.RTC Test................................PASS&lt;br /&gt;BOOTLOADER: trying to boot from partition /dev/hda1&lt;br /&gt;Decompressing  done&lt;br /&gt;Decompressing \ done.&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;Opening the box&lt;/h4&gt;&lt;br /&gt;I head no idea what kind of hard drive was in there, or the size, so I decided to open the box and have a look. Apparently, my box had a Western Digital hard drive of 10 GB, which is rather small for today's standards. It also had 16 MB of RAM, which is also rather small.&lt;br /&gt;While surfing the Internet, I found some people putting larger drives in the Qube and more RAM. Apparently, it supports up to 265 MB of RAM, but I had no idea which modern hard drives are supported.&lt;br /&gt;&lt;h4&gt;Adding more memory&lt;/h4&gt;&lt;br /&gt;Unlike other reports you can find on the Internet, the Qube does not use some proprietary memory format. In fact, I've managed to put 2 16 MB modules in there that were salvaged from an old Pentium I computer (standard 72 pin EDO RAM). However, 32 MB is not much either, so I decided to buy 2 modules of 128 MB from &lt;a href="http://www.memoryx.net/cn72e128.html"&gt;MemoryTen&lt;/a&gt;. It only took 2 days to get the memory in Belgium and the Qube is now running happily with 256 MB.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/S4EghMtcwsI/AAAAAAAAAHM/vwBFqoqtRaY/s1600-h/qube2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/S4EghMtcwsI/AAAAAAAAAHM/vwBFqoqtRaY/s320/qube2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5440665579559895746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6Mp7nHbR5E8/S4EpovPzTAI/AAAAAAAAAHU/gUYM-_SMkvE/s1600-h/qube3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://1.bp.blogspot.com/_6Mp7nHbR5E8/S4EpovPzTAI/AAAAAAAAAHU/gUYM-_SMkvE/s320/qube3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5440675604694518786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Adding a larger disk&lt;/h4&gt;&lt;br /&gt;Since I'll be using the Qube as a LAN disk, I wanted to upgrade the hard drive to a larger format. I was not sure, however, if the Qube was going to support large drives (i.e. drives larger than, say 40 GB). After a quick search on the Internet, it seemed that all MIPS based Qubes have an LBA 48 IDE controller. This means that the capacity of the drive is limited to 144 petabytes (!!). All later models (including RAQ) based on i386 architecture have an LBA 24 IDE controller, limiting the size to 137 GB (bummer).&lt;br /&gt;My local computer store still had some Western Digital Caviar disks of 320 GB, so I decided to buy one. The drive has an 8 MB buffer and is running at 7200 rpm, which should be a lot faster than the standard 10 GB drive.&lt;br /&gt;&lt;h4&gt;Installing Debian Lenny&lt;/h4&gt;&lt;br /&gt;Martin Michlmayr has written a very good &lt;a href="http://www.cyrius.com/debian/cobalt/install.html"&gt;installation guide&lt;/a&gt; to install Debian Lenny on a Qube. The Qube can easily boot an install image from the network, but the installer requires at leas 32 MB of memory. Apparently, 32 MB did not suffice, since the installer crashed in the middle of the procedure. Having 256 MB helped a lot. If you don't want to upgrade your memory, you can still install Debian by putting the drive in an external USB enclosure and extract the tarball containing a Debian base install onto the mounted drive. This tarball (and explanation) is also available on Martin Michlmayr's site.&lt;br /&gt;Since my serial connection was working properly, I used the serial installer to install Debian on the new hard drive. As with all Debian installs, this went like a breeze.&lt;br /&gt;&lt;h4&gt;Booting the device&lt;/h4&gt;&lt;br /&gt;Booting from the new drive seemed to be difficult, however. For some reason, not entirely sure why, the Qube refuses to boot from this drive. Debian Linux did support this drive, since I was able to install it, so I needed a different device to boot from. A possible solution would be to boot from the 10 GB drive and to use the 320 GB drive as storage. The Qube does not have a lot of room to spare, however, and powering 2 IDE drives might kill the external power supply. Fortunately I had a Compact Flash to IDE adapter lying around, so I decided to try and use this as boot device.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6Mp7nHbR5E8/S4EqWCAesWI/AAAAAAAAAHc/GTo7F1DAQz8/s1600-h/qube-cf-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_6Mp7nHbR5E8/S4EqWCAesWI/AAAAAAAAAHc/GTo7F1DAQz8/s320/qube-cf-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5440676382824640866" /&gt;&lt;/a&gt;&lt;br /&gt;This seemed to work just fine. The Compact Flash adapter requires an fdd power cable, which I could salvage from an old 486DX100. The fdd cable was soldered to a molex to molex cable and looks more or less like the figure below.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/S4Eum6FZvpI/AAAAAAAAAHs/aVz_DVCs0FM/s1600-h/ysplitter+molex-floppy.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/S4Eum6FZvpI/AAAAAAAAAHs/aVz_DVCs0FM/s320/ysplitter+molex-floppy.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5440681070802091666" /&gt;&lt;/a&gt;&lt;br /&gt;The Compact Flash card now contains the boot partition of 100 MB. Using a larger boot partition or the whole Compact Flash (1 GB) did not work. The rest of the file system is mounted from the 320 GB disk, to limit the number of writes to the Compact Flash.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/S4Eqgy6Jy4I/AAAAAAAAAHk/-8JWv7vQdpA/s1600-h/qube-cf-2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/S4Eqgy6Jy4I/AAAAAAAAAHk/-8JWv7vQdpA/s320/qube-cf-2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5440676567750134658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;Enhancing an old Qube's capabilities was a very pleasant experience. It was a lot more fun than installing the &lt;a href="http://kennywest.blogspot.com/search/label/firewyse"&gt;Wyse&lt;/a&gt; and I must say, it looks a lot cooler. Right now, the Qube isn't doing anything yet, but I will be using it as a Samba / NFS server to store backups. Keep reading this blog, as I will post some more on the Qube in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-1863200921912366679?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/1863200921912366679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=1863200921912366679' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1863200921912366679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1863200921912366679'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2010/02/story-of-cobalt-qube.html' title='The story of the Cobalt Qube'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6Mp7nHbR5E8/S4EgQGcHvdI/AAAAAAAAAHE/qb02NrLJdw8/s72-c/qube1.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5055648924154179137</id><published>2009-01-13T08:18:00.002+01:00</published><updated>2009-01-13T08:26:41.140+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><title type='text'>Can't type in fields when using 64 bit JVM on Mac OS X</title><content type='html'>Java 6 has been available for a while on Mac OS X, but if you don't specifically tell the OS to use this version, it still uses Java 5 32 bit. You can change this by dragging Java 6 to the top of the list in &lt;span style="font-style:italic;"&gt;Java Preferences&lt;/span&gt;. After that, all applications started from the terminal or spotlight will use Java 6. I had a problem when using Java 6, or any 64 bit JVM. I couldn't type in any input field. Clicking around worked, but no input. Even jconsole wouldn't allow me to enter anything.&lt;br /&gt;Since I wasn't very fond of the US keyboard layouts provided with the OS, I've been using the &lt;a href="http://brockerhoff.net/usi/index.html"&gt;US International&lt;/a&gt; layout from Rainer Brockerhoff for quite some time now. Apparently, version 1.1 does not allow any input when using it on a 64 bit JVM. Downloading the latest version (which is 1.2 at the time of this writing) solves this problem.&lt;br /&gt;Now everything is working as it should.&lt;br /&gt;It took me a whole day to find this solution and Google didn't help. So I hope, this post will someday help someone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5055648924154179137?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5055648924154179137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5055648924154179137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5055648924154179137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5055648924154179137'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2009/01/cant-type-in-fields-when-using-64-bit.html' title='Can&apos;t type in fields when using 64 bit JVM on Mac OS X'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8842438053710032962</id><published>2009-01-06T19:17:00.003+01:00</published><updated>2009-01-06T19:25:20.662+01:00</updated><title type='text'>Latest SVNKit library is nagging</title><content type='html'>Today I updated my &lt;a href="http://subclipse.tigris.org/"&gt;Subclipse&lt;/a&gt;, which is my preferred SVN provider for &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;. Apparently, the latest version ships with a more recent SVNKit library which requires you to login to your SVN repository over and over again. Other IDE's, like JetBrains' &lt;a href="http://www.jetbrains.com/"&gt;IntelliJ&lt;/a&gt; suffer the same problem. To solve this for Eclipse, put the following line into &lt;tt&gt;&lt;ECLIPSE_HOME&gt;/configuration/config.ini&lt;/tt&gt; file:&lt;pre&gt;&lt;br /&gt;svnkit.http.methods=Basic,NTLM&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For other IDE's, I guess you can add &lt;tt&gt;-Dsvnkit.http.methods=Basic,NTLM&lt;/tt&gt; to your startup command, not sure though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8842438053710032962?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8842438053710032962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8842438053710032962' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8842438053710032962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8842438053710032962'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2009/01/latest-svnkit-library-is-nagging.html' title='Latest SVNKit library is nagging'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4299531903573991329</id><published>2008-12-29T17:57:00.004+01:00</published><updated>2009-01-06T19:17:40.146+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>The end of vinyl records</title><content type='html'>Vinyl records have been there for ages. My dad still has a couple of old records but he has no turntable anymore to play them. This is because _I_ claimed his turntable a long time ago, which he thought had become old fashioned.&lt;br /&gt;I started buying vinyl records about 12 years ago. I remember saving all my pocket money and buying the latest records with it, instead of visiting pubs with friends. I remember everyone thinking vinyl records belonged to the past and MP3's and CD's were taking over. In fact, this was not true. DJ's playing at parties and clubs never stopped buying records and from my experience, about 80% of their music came from plain old vinyl and a tiny 20% from other media like CD's or MP3's.&lt;br /&gt;The reasoning behind this is simple, if you wanted something new, something not popular (yet), you bought it on vinyl. If it became popular, some record company would probably be so kind to put it on some CD and sell it. But then again, ages, if not decades ( :) ) could pass between the song only being available on vinyl and the song being available to the public on CD (or MP3).&lt;br /&gt;From my experience, playing vinyl records was also much easier then playing CD's or other media. The CD disappears in a box, if you're playing it, and there's no way you can touch it or fiddle with it unless you're using some stupid buttons which can do fancy stuff, like &lt;span style="font-style:italic;"&gt;bending&lt;/span&gt; the pitch, or playing it reverse.&lt;br /&gt;Companies building CD players for the DJ market (like Pioneer, Denon and others) have done their very best to build something that comes very close to a vinyl experience. Pioneer's &lt;a href="http://www.pioneer.nl/nl/products/44/106/462/CDJ-1000%20MK3/index.html"&gt;CDJ-1000&lt;/a&gt;, for example, comes very close, but people used to vinyl know this is just fake.&lt;br /&gt;&lt;a href="http://www.serato.com/"&gt;Serato&lt;/a&gt; and &lt;a href="http://www.native-instruments.com/traktormicrosite/#/en/"&gt;Traktor&lt;/a&gt; have looked at this from a different perspective. Suppose we have a record playing a wave only understood by software (called time-coded vinyl), running on a PC or Apple, and then this software would sync an MP3 or any other media to this wave then we could bring together the best of both worlds. DJ's can still use vinyl records and they could use time-coded vinyl together with their collection of MP3's (which saves your back if you can't find someone to carry your cases).&lt;br /&gt;I used this software the other night and I must say, even though it is not &lt;span style="font-style:italic;"&gt;real&lt;/span&gt; vinyl, it feels very much the same. The only thing I missed were 400 large and heavy records I used to browse through, in search of the next great song to play. Instead, I just had to type in parts of the name of the artist or parts of the name of the song, and then select it.&lt;br /&gt;This, my dear friends, could mean the end of true vinyl records. Lots of small shops, that survived on selling vinyl, already had to close down and go bankrupt. Only the larger and online stores like &lt;a href="http://www.juno.co.uk/"&gt;juno&lt;/a&gt; seem to be able to survive for now, but I wonder how long it will take.&lt;br /&gt;If you want something new today, something not popular (yet), chances are that this song won't be available on vinyl, but available on MP3 instead.&lt;br /&gt;I like buying records and I like spending a whole afternoon in a record shop, sniffing through a large collection just to find some great song I don't already have. I guess I am becoming old fashioned now, getting old, being surpassed by young people with fancy software. Is this a midlife crisis?&lt;br /&gt;&lt;br /&gt;EDIT: As seen in a comment by someone reading this blog, one of Belgium's biggest dance stores (USA Import) is closing down. You can read all about it &lt;a href="http://www.hln.be/hln/nl/957/Belgie/article/detail/592863/2009/01/06/Vinylplatenzaak-USA-Import-sluit.dhtml"&gt;here&lt;/a&gt;.&lt;br /&gt;This hurts :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4299531903573991329?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4299531903573991329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4299531903573991329' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4299531903573991329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4299531903573991329'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/end-of-vinyl-records.html' title='The end of vinyl records'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-6358810493581921055</id><published>2008-12-28T19:47:00.003+01:00</published><updated>2008-12-29T08:19:42.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>KDE4: Panel artifacts when using Thunderbird or OOo using NVIDIA drivers</title><content type='html'>NVIDIA has had the best drivers for Linux users for several years. Since early releases of KDE 4, however, some nasty artifacts appeared when running some Gnome based applications (like Open Office and Thunderbird) on systems with NVIDIA cards. These bugs have been reported to NVIDIA but haven't been addressed until now. According to &lt;a href="http://bugs.kde.org/show_bug.cgi?id=157017"&gt;this&lt;/a&gt; very long thread, the latest beta drivers from NVIDIA (180.x) the nasty artifacts should have disappeared. I compiled and installed this &lt;a href="http://www.nvidia.com/object/linux_display_ia32_180.17.html"&gt;latest&lt;/a&gt; driver and indeed, the panel corruption when, for example, composing a new mail in Thunderbird does no longer appear. Finally, people running KDE 4 with NVIDIA cards are no longer nvidia-victims :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-6358810493581921055?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/6358810493581921055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=6358810493581921055' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6358810493581921055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6358810493581921055'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/kde4-panel-artefacts-when-using.html' title='KDE4: Panel artifacts when using Thunderbird or OOo using NVIDIA drivers'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-3151951890812415226</id><published>2008-12-27T14:09:00.003+01:00</published><updated>2010-12-31T15:03:31.962+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='mondo'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Easy backups on Linux, putting it to the test</title><content type='html'>In an earlier post I was talking about how I've been using &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; as preferred backup solution for quite some time. However, I have never used it to restore stuff, since I've never broken any install before and hardware hasn't failed on me yet.&lt;br /&gt;Since I wanted to replace the smaller 10GB hard drive, I've installed in the Wyse, with a bigger 500GB one, this would be an ideal case to try and restore everything with &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt;.&lt;br /&gt;So I created a backup of the 10GB drive with &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; to an NFS share on another PC (using the script posted earlier). Next, burned the resulting ISO to a CD and finally booted from the CD and interactively restored my data.&lt;br /&gt;&lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; has 2 main restore modes; interactive and nuke. Since my new drive was bigger than the original drive, &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; suggested to drop to interactive mode, which allowed me to create a whole new partition scheme (which is nice). The only thing that failed was grub installing itself on the master boot record. I'm not sure why, maybe a bug in the ancient &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; that ships with Etch, who knows. I had to install grub using knoppix and then the system booted just fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-3151951890812415226?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/3151951890812415226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=3151951890812415226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3151951890812415226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3151951890812415226'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/easy-backups-on-linux-putting-it-to.html' title='Easy backups on Linux, putting it to the test'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5812712659313175925</id><published>2008-12-24T10:05:00.003+01:00</published><updated>2010-12-31T15:03:01.814+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='mondo'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Easy backups on Linux</title><content type='html'>Ubuntu has been a fantastic operating system for my desktop and has been my preferred Desktop OS for more than 3 years now. The cool thing about Ubuntu is it's Debian based. So you install once and dist-upgrade to every new release without ever having to reinstall the whole thing. The downside is a dist-upgrade in Ubuntu sometimes fails leaving you with a very b0rken system. That's why I stick with LTS releases for now, because I have little spare time to reinstall my desktop every few months or so. Nevertheless there are brave people out there always keeping track of the latest, more or less stable, version and don't mind the dist-upgrade problems.&lt;br /&gt;Anyway if your install is broken after a dist-upgrade (or any upgrade) it's always nice to have a backup at hand. In search of the ideal, most flexible, backup tool out there I found &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt;. So, people, stop asking for a backup tool for Linux on forums, this one will suite your needs.&lt;br /&gt;Unlike some other tools, &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; creates a backup of a live system. It is also capable of creating a set of CD's or DVD's which are bootable and will help you to easily restore your data.&lt;br /&gt;&lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; comes with an &lt;span style="font-style:italic;"&gt;ncurses&lt;/span&gt; based UI to help you easily create backups. I still like the command line version though, so here's my script:&lt;pre&gt;&lt;span style="font-style: italic;color: #808080;"&gt;#!/bin/sh&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;BACKUP_HOME=&lt;/span&gt;&lt;span style="color: #000000;"&gt;/home/bu_operator/bkp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;BACKUP_TEMP=&lt;/span&gt;&lt;span style="color: #000000;"&gt;/home/bu_operator/tmp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;BACKUP_PATH=$BACKUP_HOME&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;`&lt;/span&gt;&lt;span style="font-weight: bold;color: #cc00cc;"&gt;date&lt;/span&gt;&lt;span style="color: #000000;"&gt; +%Y%m%d&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;`&lt;/span&gt;&lt;span style="color: #000000;"&gt;_myHost&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;BACKUP_EXCLUDE=&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'/mnt /dev /proc /tmp /home/bu_operator'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color: #cc00cc;"&gt;mkdir&lt;/span&gt;&lt;span style="color: #000000;"&gt; -p &lt;/span&gt;&lt;span style="color: #008000;"&gt;$BACKUP_PATH&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;mondoarchive -Oi -9 -s 4200m -d &lt;/span&gt;&lt;span style="color: #008000;"&gt;$BACKUP_PATH&lt;/span&gt;&lt;span style="color: #000000;"&gt; -E &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #008000;"&gt;$BACKUP_EXCLUDE&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; -T &lt;/span&gt;&lt;span style="color: #008000;"&gt;$BACKUP_TEMP&lt;/span&gt;&lt;span style="color: #000000;"&gt; -S &lt;/span&gt;&lt;span style="color: #008000;"&gt;$BACKUP_TEMP&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;The above script will create a live backup (compressed) of the whole system on DVD ISO images. The &lt;tt&gt;BACKUP_EXCLUDE&lt;/tt&gt; variable contains some volatile folders we don't want to be included in the backup.&lt;br /&gt;Restoring the backup is easy. Burn the ISO images on a CD/DVD (or set of CD's/DVD's), boot from the first CD/DVD, select &lt;span style="font-style:italic;"&gt;RESTORE&lt;/span&gt; and go grab a cup of coffee while &lt;a href="http://www.mondorescue.org/"&gt;mondo&lt;/a&gt; is doing the hard work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5812712659313175925?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5812712659313175925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5812712659313175925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5812712659313175925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5812712659313175925'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/easy-backups-on-linux.html' title='Easy backups on Linux'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5262669831667851731</id><published>2008-12-24T09:10:00.004+01:00</published><updated>2008-12-24T10:05:05.213+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firewyse'/><title type='text'>Installing the Wyse 6: adding LDAP and Samba for centralized user management</title><content type='html'>I like to have my users, that will be logging in on different types of machines on the network, stored in a central place. The ideal solution for this is an LDAP repository and configuring Samba to talk to this repository and configure it as a Primary Domain Controller.&lt;br /&gt;This solution will enable users running Linux to authenticate using pam_ldap and users running Windows (NT and up) authenticate against a Samba Domain Controller. Linux users can also join their machines on the Samba domain, and create shares accessible to other users known by the Domain Controller.&lt;br /&gt;This setup caused me a second headache, since the Samba server running on Ubuntu Hardy could not join the Samba Domain Controller running on Etch. This is because there is a compatibility issue between Samba 3.0.28a (Hardy) and Samba 3.0.24a (Etch). I had to fetch some more recent source packages &lt;a href="http://pkg-samba.alioth.debian.org/packages/"&gt;here&lt;/a&gt; and compile and build them on Etch. This is not a procedure for the faint of heart, so if you haven't upgraded to Lenny yet, now is the time (at the time of this writing, Lenny has Samba 3.2.5).&lt;br /&gt;I was planning on providing a step by step procedure to install and configure all of the necessary stuff, but apparently, someone already did. Following these &lt;a href="http://times.usefulinc.com/2005/09/25-ldap"&gt;instructions&lt;/a&gt; to the letter, will get you up and running in no time. The only thing you have to do is add these lines to &lt;tt&gt;libnss-ldap.conf&lt;/tt&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;bind_policy soft&lt;br /&gt;nss_reconnect_tries 3&lt;br /&gt;nss_reconnect_sleeptime 1&lt;br /&gt;nss_reconnect_maxconntries 3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is necessary, because otherwise the machine will try forever finding accounts in the LDAP server when it boots and is populating &lt;tt&gt;/dev&lt;/tt&gt;. Populating &lt;tt&gt;/dev&lt;/tt&gt; happens very early in the boot stage when no network or LDAP server is started yet.&lt;br /&gt;I also created an additional LDAP user (next to the admin user) that is only capable of reading entries (instead of reading _and_ writing) as suggested &lt;a href="http://home.subnet.at/~max/ldap/"&gt;here&lt;/a&gt;. This user is called &lt;span style="font-style:italic;"&gt;nss&lt;/span&gt; and is used to configure pam_ldap on the client Linux machines.&lt;br /&gt;My pam configuration file are also a bit different, so here they are for completeness:&lt;br /&gt;&lt;h4&gt;common-session&lt;/h4&gt;&lt;pre&gt;&lt;br /&gt;session required pam_mkhomedir.so skel=/etc/skel umask=0077&lt;br /&gt;session optional pam_ldap.so&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;common-password&lt;/h4&gt;&lt;pre&gt;&lt;br /&gt;password required   pam_passwdqc.so&lt;br /&gt;password sufficient pam_ldap.so&lt;br /&gt;password required   pam_unix_passwd.so use_first_pass md5 shadow&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;common-account&lt;/h4&gt;&lt;pre&gt;&lt;br /&gt;account sufficient pam_ldap.so&lt;br /&gt;account required   pam_unix_acct.so&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;common-auth&lt;/h4&gt;&lt;pre&gt;&lt;br /&gt;auth sufficient pam_ldap.so&lt;br /&gt;auth required   pam_unix_auth.so use_first_pass&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Please note that messing with pam modules could be dangerous and could lead to a system where you're unable to login. The above configuration definitely works, but it's always safe to have backups of your original pam files and have a bootable medium (CD, DVD, floppy, USB) at hand.&lt;/p&gt;&lt;p&gt;If you want to have a graphical user interface to be able to browse the LDAP you can use &lt;a href="http://directory.apache.org/studio/"&gt;Apache Directory Studio&lt;/a&gt; (advanced but heavyweight application) or &lt;a href="http://www.mcs.anl.gov/~gawor/ldap/installation.html"&gt;LDAP Browser&lt;/a&gt; (basic lightweight application). Both are Java based, so should run on anything that provides a Sun JDK or JRE.&lt;/p&gt;&lt;p&gt;If you find errors in this post, in fact, if you find errors in any post, please leave a comment or send me a mail.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5262669831667851731?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5262669831667851731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5262669831667851731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5262669831667851731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5262669831667851731'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/installing-wyse-6-adding-ldap-and-samba.html' title='Installing the Wyse 6: adding LDAP and Samba for centralized user management'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2879172361285602874</id><published>2008-12-23T10:51:00.006+01:00</published><updated>2008-12-23T11:23:16.744+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firewyse'/><title type='text'>Installing the Wyse 5: configure and install cups</title><content type='html'>If you're still following these series of posts and installed Debian Etch on your firewall, please go back and install Lenny instead. The problem with Etch is that it has a lot of old, outdated, software packages, containing bugs that _will_ cause you headaches.&lt;br /&gt;While configuring cups should be a breeze, there are a number of bugs requiring you to do some manual interventions on the server side.&lt;br /&gt;First there is a compatibility issue which causes cups to hang when configuring printers using Firefox 3. Due to export regulations, Debian does not ship Open SSL by default, causing cups to hang while generating SSL keys. The new admin interface now requires HTTPS, so you will need to install Open SSL by hand. The default configuration for cups, generated bu Debian's package management, also contains a few flaws.&lt;br /&gt;All the above things are probably resolved in Lenny, so you might want to consider upgrading to Lenny. I chose to stick with Etch and here are the things I did to get cups up and running.&lt;br /&gt;First you need to install the necessary packages:&lt;pre&gt;&lt;br /&gt;ii  hp-ppd                            0.8                                      HP Postscript Printer Definition (PPD) files&lt;br /&gt;ii  hpijs-ppds                        2.6.10+1.6.10-3etch1                     HP Linux Printing and Imaging - HPIJS PPD fi&lt;br /&gt;ii  linuxprinting.org-ppds            20061031-1                               linuxprinting.org printer support - PostScri&lt;br /&gt;ii  foomatic-db                       20061031-1                               linuxprinting.org printer support - database&lt;br /&gt;ii  foomatic-db-hpijs                 20061031-1                               linuxprinting.org printer support - database&lt;br /&gt;ii  foomatic-filters                  3.0.2-20061031-1.2                       linuxprinting.org printer support - filters&lt;br /&gt;ii  cupsys                            1.2.7-4etch6                             Common UNIX Printing System(tm) - server&lt;br /&gt;ii  cupsys-common                     1.2.7-4etch6                             Common UNIX Printing System(tm) - common fil&lt;br /&gt;ii  libcupsimage2                     1.2.7-4etch6                             Common UNIX Printing System(tm) - image libs&lt;br /&gt;ii  libcupsys2                        1.2.7-4etch6                             Common UNIX Printing System(tm) - libs&lt;br /&gt;ii  libcupsys2-dev                    1.2.7-4etch6                             Common UNIX Printing System(tm) - developmen&lt;br /&gt;ii  openssl                           0.9.8c-4etch3                            Secure Socket Layer (SSL) binary and related&lt;br /&gt;ii  hplip                             1.6.10-3etch1                            HP Linux Printing and Imaging System (HPLIP)&lt;br /&gt;ii  hplip-data                        1.6.10-3etch1                            HP Linux Printing and Imaging - data files&lt;br /&gt;&lt;/pre&gt;The above list contains the packages I installed to get cups up and running. I am not sure this is an exhaustive list, but it should be more or less complete.&lt;br /&gt;After installing the necessary packages, we need to tell cups to accept calls from the internal network, so we're able to configure it using its web interface. Below is &lt;tt&gt;cupsd.conf&lt;/tt&gt; containing all my modifications.&lt;pre&gt;&lt;span style="color: #000000;"&gt;# Show troubleshooting information in error_log.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;LogLevel debug&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;SystemGroup lpadmin&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;# Allow remote access&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Port 631&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Listen /var/run/cups/cups.sock&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;# Enable printer sharing and shared printers.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Browsing On&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;BrowseOrder allow,deny&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;BrowseAllow @LOCAL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;BrowseAddress @LOCAL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;DefaultAuthType Basic&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;Location /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  # Allow shared printing and remote administration...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Order allow,deny&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Allow @LOCAL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;Location /admin&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  AuthType Basic&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  AuthClass System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Encryption Required&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  # Allow remote administration...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Order allow,deny&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Allow @LOCAL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;Location /admin/conf&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  AuthType Basic&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Require user @SYSTEM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  # Allow remote access to the configuration files...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Order allow,deny&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  Allow @LOCAL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;Policy default&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Require user @OWNER @SYSTEM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Order deny,allow&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;/Limit&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    AuthType Basic&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Require user @SYSTEM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Order deny,allow&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;/Limit&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;Limit CUPS-Authenticate-Job&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Require user @OWNER @SYSTEM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Order deny,allow&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;/Limit&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  # Only the owner or an administrator can cancel a job...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;Limit Cancel-Job&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Order deny,allow&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Require user @OWNER @SYSTEM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;/Limit&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;Limit All&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    Order deny,allow&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &amp;lt;/Limit&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Printcap /var/run/cups/printcap&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Next, create a folder called &lt;tt&gt;ssl&lt;/tt&gt; underneath &lt;tt&gt;/etc/cups&lt;/tt&gt; to hold the ssl keys. Generate the keys, by running the following command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;openssl req -new -x509 -nodes -days 365 -out server.crt -keyout server.key&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;underneath &lt;tt&gt;/etc/cups/ssl&lt;/tt&gt;&lt;br /&gt;Now stop and start the cups daemon to let the changes have effect.&lt;br /&gt;You should be able now to login and configure your printer. As I already said, don't use Firefox 3, but use another browser like safari or konqueror instead.&lt;br /&gt;Below screenshot shows the completed configuration of my printer.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6Mp7nHbR5E8/SVC7meqPyAI/AAAAAAAAAD8/Cnp-ImLrvwU/s1600-h/cups.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://3.bp.blogspot.com/_6Mp7nHbR5E8/SVC7meqPyAI/AAAAAAAAAD8/Cnp-ImLrvwU/s320/cups.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5282928632645273602" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2879172361285602874?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2879172361285602874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2879172361285602874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2879172361285602874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2879172361285602874'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/installing-wyse-5-configure-and-install.html' title='Installing the Wyse 5: configure and install cups'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6Mp7nHbR5E8/SVC7meqPyAI/AAAAAAAAAD8/Cnp-ImLrvwU/s72-c/cups.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8621781778767818579</id><published>2008-12-23T09:10:00.011+01:00</published><updated>2008-12-23T10:24:37.416+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firewyse'/><title type='text'>Installing the Wyse 4: configure the firewall</title><content type='html'>The Wyse will be used as my gateway to the internet. There are a lot of out of the box Linux (and BSD) firewall distributions out there. Some of them run from a bootable CD, others can even run from a single floppy. The problem with these distributions is they don't have all the necessary software I need. Next to the firewall software, I will need the following additional services:&lt;ul&gt;&lt;li&gt;samba: to use as server for potential windows machines on the network&lt;/li&gt;&lt;li&gt;LDAP: to serve as central storage for user accounts and their metadata&lt;/li&gt;&lt;li&gt;cups: to use as centralized printing server for all kinds of machines on the network&lt;/li&gt;&lt;li&gt;other services I might have forgotten (like subversion, squid, dansguardian, ....)&lt;/li&gt;&lt;/ul&gt;I have to admit, though, that &lt;a href="http://www.endian.com/en/products/features/"&gt;Endian&lt;/a&gt; comes close to what I need, but I just like to do stuff all myself :)&lt;br /&gt;My old Etch firewall was running some custom firewall script I created by hand, but this time, I wanted to use a tool called &lt;a href="http://www.fwbuilder.org/"&gt;fwbuilder&lt;/a&gt; to create the script.&lt;br /&gt;&lt;a href="http://www.fwbuilder.org/"&gt;fwbuilder&lt;/a&gt; is a GUI available for most popular OS'es out there (including Mac OS X), capable of generating firewall scripts for a variety of platforms. Platforms include Linux (even old kernels), BSD, CISCO, ... . It also has some pre built templates, to get you started quickly.&lt;br /&gt;So, first you need to download and install &lt;a href="http://www.fwbuilder.org/"&gt;fwbuilder&lt;/a&gt; for your OS. In Ubuntu (or any Debian based distro), just type &lt;tt&gt;apt-get install fwbuilder&lt;/tt&gt; to download and install the software.&lt;br /&gt;Fire up &lt;a href="http://www.fwbuilder.org/"&gt;fwbuilder&lt;/a&gt; and create a new object file, which I called &lt;tt&gt;home.fwb&lt;/tt&gt;. Now, right click on &lt;span style="font-style:italic;"&gt;Firewalls&lt;/span&gt; and select &lt;span style="font-style:italic;"&gt;new Firewall&lt;/span&gt; from the pop-up menu.&lt;br /&gt;In the next screen, select or enter the following:&lt;ul&gt;&lt;li&gt;name: &lt;span style="font-style:italic;"&gt;your firewall its name&lt;/span&gt;&lt;/li&gt;&lt;li&gt;firewall software: select &lt;span style="font-style:italic;"&gt;iptables&lt;/span&gt; if your firewall is running Linux 2.4 or higher&lt;/li&gt;&lt;li&gt;firewall OS: select &lt;span style="font-style:italic;"&gt;Linux 2.4/2.6&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Be sure to also check &lt;span style="font-style:italic;"&gt;Use preconfigured template for firewall objects&lt;/span&gt; to get a basic set of rules.&lt;br /&gt;In the next screen, I selected &lt;span style="font-style:italic;"&gt;fw template 2&lt;/span&gt; since this one suits my needs. Now click finish.&lt;br /&gt;That's it. You now have a set of rules for a machine running Linux 2.4 or higher with 2 network cards. &lt;tt&gt;eth0&lt;/tt&gt; should be connected to the internet and has a dynamically assigned network address. &lt;tt&gt;eth1&lt;/tt&gt; should be connected to the internal network and has a static assigned address. By default, this is &lt;tt&gt;192.168.1.1/255.255.255.0&lt;/tt&gt;, which I changed to &lt;tt&gt;192.168.1.254/255.255.255.0&lt;/tt&gt;. You can change this underneath User -&gt; Firewalls -&gt; Your Firewall -&gt; inside -&gt; eth1:ip.&lt;br /&gt;By default, access from the internal network is limited to DNS queries and SSH (Rule 2). Access from the firewall to the internet is limited to DNS queries only (Rule 5). We will need to change this, because we need to be able to upgrade Debian every now and then and we want to have access from the internal network to some of the services mentioned above.&lt;br /&gt;The screenshot below shows my modifications. Rule 5 now allows requests to &lt;span style="font-style:italic;"&gt;ntp&lt;/span&gt;(to be able to synchronize our clock) and &lt;span style="font-style:italic;"&gt;HTTP&lt;/span&gt; (to be able to fetch new Debian packages from the internet). Rules 6 and 7 make sure that our logs are not flooded by broadcasts and multicasts from the outside world. Rule 2 was changed, as I already said, to allow access to additional services running on the firewall.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/SVCmhaicuoI/AAAAAAAAAD0/IiHQqxyK3q8/s1600-h/fwbuilder.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/SVCmhaicuoI/AAAAAAAAAD0/IiHQqxyK3q8/s320/fwbuilder.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5282905455895296642" /&gt;&lt;/a&gt;&lt;br /&gt;To generate an &lt;tt&gt;iptables&lt;/tt&gt; script from the rules we just created, just select Rules -&gt; Compile. If you transfer the script to the firewall, make it executable (&lt;tt&gt;chmod +x&lt;/tt&gt;) and launch it, you should be able to connect from any machine connected to &lt;tt&gt;eth1&lt;/tt&gt; with the internet.&lt;br /&gt;Below are some additional scripts I created to start and stop the firwall from &lt;tt&gt;/etc/init.d&lt;/tt&gt;.&lt;br /&gt;The firewall startup script (&lt;tt&gt;/etc/init.d/firewall&lt;/tt&gt;):&lt;pre&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#! /bin/sh&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;set&lt;/b&gt; -e&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;PATH=&lt;/span&gt;&lt;span style='color: #141312'&gt;/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;DESC=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"firewall service"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;NAME=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"firewall"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;SCRIPT_START=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/etc/init.d/rc.start-firewall"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;SCRIPT_STOP=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/etc/init.d/rc.flush-firewall"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Gracefully exit if the package has been removed.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;test&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; -x &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SCRIPT_START&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 0&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;test&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; -x &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SCRIPT_STOP&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Function that starts the daemon/service.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;d_start()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SCRIPT_START&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Function that stops the daemon/service.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;d_stop()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SCRIPT_STOP&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt; in&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  start&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Starting &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DESC&lt;/span&gt;&lt;span style='color: #bf0303'&gt;: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_start&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  stop&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Stopping &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DESC&lt;/span&gt;&lt;span style='color: #bf0303'&gt;: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_stop&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  restart&lt;b&gt;|&lt;/b&gt;force-reload&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# If the "reload" option is implemented, move the "force-reload"&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# option to the "reload" entry above. If not, "force-reload" is&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# just the same as "restart".&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Restarting &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DESC&lt;/span&gt;&lt;span style='color: #bf0303'&gt;: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_stop&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;sleep&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 1&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_start&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  *&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Usage: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SCRIPTNAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt; {start|stop|restart|force-reload}"&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #223388'&gt;&lt;b&gt;&amp;gt;&amp;amp;2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 1&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;esac&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 0&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;The script referenced in the above script to start the firewall (&lt;tt&gt;/etc/init.d/rc.start-firewall&lt;/tt&gt;) is the script created by fwbuilder.&lt;br /&gt;The script referenced in the above script to stop the firewall (&lt;tt&gt;/etc/init.d/rc.flush-firewall&lt;/tt&gt;):&lt;pre&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#!/bin/sh&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Stop firewall.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; /etc/default/firewall&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;log &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Flushing firewall ..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# reset the default policies in the filter table.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -P INPUT ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -P FORWARD ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -P OUTPUT ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# reset the default policies in the nat table.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t nat -P PREROUTING ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t nat -P POSTROUTING ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t nat -P OUTPUT ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# reset the default policies in the mangle table.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t mangle -P PREROUTING ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t mangle -P OUTPUT ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# flush all the rules in the filter and nat tables.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -F&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t nat -F&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t mangle -F&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# erase all chains that's not default in filter and nat table.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -X&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t nat -X&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #141312'&gt; -t mangle -X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;log &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"... flushed"&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;The common script used for logging and constants (&lt;tt&gt;/etc/default/firewall&lt;/tt&gt;):&lt;pre&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#!/bin/sh&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Firewall resources.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;LOG_FILE=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/var/log/firewall.log"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;DEBUG=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"OFF"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;debug ()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;   &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt; [&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DEBUG&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;==&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"ON"&lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt; ]&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;&amp;amp;&amp;amp;&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"[&lt;/span&gt;&lt;span style='color: #006e28'&gt;$0&lt;/span&gt;&lt;span style='color: #bf0303'&gt;]: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;|&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$TEE&lt;/span&gt;&lt;span style='color: #141312'&gt; -a &lt;/span&gt;&lt;span style='color: #006e28'&gt;$LOG_FILE&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;log ()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"[&lt;/span&gt;&lt;span style='color: #006e28'&gt;$0&lt;/span&gt;&lt;span style='color: #bf0303'&gt;]: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;|&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$TEE&lt;/span&gt;&lt;span style='color: #141312'&gt; -a &lt;/span&gt;&lt;span style='color: #006e28'&gt;$LOG_FILE&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;export&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;PATH=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/sbin:/bin:/usr/sbin:/usr/bin"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Check if all the commands are there.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;which=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;'type -p'&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;IPTABLES=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;which&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; iptables&lt;b&gt;`&lt;/b&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;IPTABLES=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/sbin/iptables"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;IFCONFIG=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;which&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; ifconfig&lt;b&gt;`&lt;/b&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;IFCONFIG=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/sbin/ifconfig"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;IPSC=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;which&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; ipsc&lt;b&gt;`&lt;/b&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;IPSC=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/usr/bin/ipsc"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;AWK=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;which&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;awk&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;AWK=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/usr/bin/awk"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;SED=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;which&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;sed&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;SED=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/bin/sed"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;TEE=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;which&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;tee&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;TEE=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"/usr/bin/tee"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;REQCMDS=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;span style='color: #006e28'&gt;$IPTABLES&lt;/span&gt;&lt;span style='color: #bf0303'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$IFCONFIG&lt;/span&gt;&lt;span style='color: #bf0303'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$AWK&lt;/span&gt;&lt;span style='color: #bf0303'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SED&lt;/span&gt;&lt;span style='color: #bf0303'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$TEE&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;for&lt;/b&gt; i &lt;b&gt;in&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$REQCMDS&lt;/span&gt;&lt;span style='color: #141312'&gt;; &lt;b&gt;do&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt; [&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;-x&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$i&lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt; ]&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt;; &lt;b&gt;then&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;        debug &lt;/span&gt;&lt;span style='color: #bf0303'&gt;" found &lt;/span&gt;&lt;span style='color: #006e28'&gt;$i&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;     &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"I need &lt;/span&gt;&lt;span style='color: #006e28'&gt;$i&lt;/span&gt;&lt;span style='color: #bf0303'&gt; for executing this script, bailing out."&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;     &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 0&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;b&gt;fi&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;done&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Get the IP address for a specified interface. IP is returned in $IP.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;get_ip_for_interface ()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;/span&gt;&lt;span style='color: #006e28'&gt;IP=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;""&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;/span&gt;&lt;span style='color: #006e28'&gt;IP=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #006e28'&gt;$IFCONFIG&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #223388'&gt;&lt;b&gt;2&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt;/dev/null &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;        &lt;b&gt;|&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$AWK&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;'/inet addr:/ {print $2}'&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;        &lt;b&gt;|&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SED&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;'s/addr://'&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    debug &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"found IP: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$IP&lt;/span&gt;&lt;span style='color: #bf0303'&gt; for &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Get the subnet mask for a specified interface. Mask is returned in $MASK.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;get_mask_for_interface ()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;/span&gt;&lt;span style='color: #006e28'&gt;MASK=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;""&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;/span&gt;&lt;span style='color: #006e28'&gt;MASK=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #006e28'&gt;$IFCONFIG&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #223388'&gt;&lt;b&gt;2&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt;/dev/null &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;        &lt;b&gt;|&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$AWK&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;'/ Mask:/ {print $4}'&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;        &lt;b&gt;|&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SED&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;'s/Mask://'&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    debug &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"found MASK: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$MASK&lt;/span&gt;&lt;span style='color: #bf0303'&gt; for &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Get the net for a specified interface. Net is returned in $NET.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;get_net_for_interface ()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;/span&gt;&lt;span style='color: #006e28'&gt;NET=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;""&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    &lt;/span&gt;&lt;span style='color: #006e28'&gt;NET=&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #006e28'&gt;$IPSC&lt;/span&gt;&lt;span style='color: #141312'&gt; -i &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #223388'&gt;&lt;b&gt;2&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt;/dev/null &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;        &lt;b&gt;|&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #006e28'&gt;$AWK&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;'/Network address:/{print $3}'&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;`&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;    debug &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"found NET: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NET&lt;/span&gt;&lt;span style='color: #bf0303'&gt; for &lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;In the next posts, we will get our hands dirty and start configuring cups, LDAP and samba.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8621781778767818579?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8621781778767818579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8621781778767818579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8621781778767818579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8621781778767818579'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/installing-wyse-4-configure-firewall.html' title='Installing the Wyse 4: configure the firewall'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6Mp7nHbR5E8/SVCmhaicuoI/AAAAAAAAAD0/IiHQqxyK3q8/s72-c/fwbuilder.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-240275454014047267</id><published>2008-12-01T20:04:00.003+01:00</published><updated>2009-01-16T08:15:29.158+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firewyse'/><title type='text'>Installing the Wyse 3: dhcp server and client</title><content type='html'>In a &lt;a href="http://kennywest.blogspot.com/2008/11/installing-wyse-2-dnrd.html"&gt;previous&lt;/a&gt; post I showed how to install a Domain Name Relay Daemon to serve as a caching DNS server. Since the firewall will get its address from the DHCP server from your ISP, there's one small configuration we still need to do.&lt;br /&gt;In &lt;tt&gt;/etc/dhcp3/dhclient.conf&lt;/tt&gt; we need to uncomment (or add, if its not there) the following line:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;prepend domain-name-servers 192.168.1.254;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This will make sure the firewall itself will query the name server on the firewall to resolve host names on the local network and the Internet.&lt;br /&gt;The firewall should also run a DHCP server for the internal network. The internal network addresses range from &lt;tt&gt;192.168.1.1/255.255.255.0&lt;/tt&gt; to &lt;tt&gt;192.168.1.253/255.255.255.0&lt;/tt&gt;. So, first we need to install a DHCP server:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# apt-get install dhcp3-server&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next, use the following configuration for &lt;tt&gt;/etc/dhcp3/dhcpd.conf&lt;/tt&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;allow bootp;&lt;br /&gt;ddns-update-style none;&lt;br /&gt;subnet 192.168.1.0 netmask 255.255.255.0 {&lt;br /&gt;        default-lease-time 600;&lt;br /&gt;        max-lease-time 7200;&lt;br /&gt;        option subnet-mask 255.255.255.0;&lt;br /&gt;        option broadcast-address 192.168.1.255;&lt;br /&gt;        option domain-name-servers 192.168.1.254;&lt;br /&gt;        option domain-name "earth";&lt;br /&gt;        option routers 192.168.1.254;&lt;br /&gt;        group {&lt;br /&gt;                host internalhost {&lt;br /&gt;                        hardware ethernet 11:11:11:11:11:11;&lt;br /&gt;                        fixed-address 192.168.1.1;&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        pool {&lt;br /&gt;                range 192.168.1.10 192.168.1.20;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The above configuration will configure the DHCP server to serve addresses from &lt;tt&gt;192.168.1.10/255.255.255.0&lt;/tt&gt; to &lt;tt&gt;192.168.1.20/255.255.255.0&lt;/tt&gt;. This will allow any PC to connect to the local network and get an address.&lt;br /&gt;We also configured a host, called &lt;span style="font-style:italic;"&gt;internalhost&lt;/span&gt; to receive a fixed address (&lt;tt&gt;192.168.1.1&lt;/tt&gt;), since we want to add this fixed address to our &lt;tt&gt;dnrd&lt;/tt&gt; configuration as well.&lt;br /&gt;The DHCP server will also propagate its own address to the clients as preferred name server.&lt;br /&gt;The &lt;tt&gt;bootp&lt;/tt&gt; flag is used to be able to net-boot some old UNIX machines I have (a Sun Ultra and an HP 712/60). For now, no boot images are configured or served, but this will change in the future.&lt;br /&gt;In a next post, we will start configuring the firewall itself using a GUI called &lt;a href="http://www.fwbuilder.org/"&gt;fwbuilder&lt;/a&gt; and iptables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-240275454014047267?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/240275454014047267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=240275454014047267' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/240275454014047267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/240275454014047267'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/12/installing-wyse-3-dhpc-server-and.html' title='Installing the Wyse 3: dhcp server and client'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4306041837858905582</id><published>2008-11-30T14:23:00.004+01:00</published><updated>2008-11-30T15:23:04.151+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firewyse'/><title type='text'>Installing the Wyse 2: dnrd</title><content type='html'>The new Wyse machine should serve as a caching DNS for the internal network. This will enable us to resolve host names on the internet (e.g. www.google.com) and local hostnames (e.g. localhostname.earth). My old router used &lt;tt&gt;dnrd&lt;/tt&gt; to accomplish this, so I will use &lt;tt&gt;dnrd&lt;/tt&gt; again. You could use a full blown DNS server, such as &lt;tt&gt;bind&lt;/tt&gt; but &lt;tt&gt;bind&lt;/tt&gt; has always suffered some security issues and is harder to configure (but not impossible).&lt;br /&gt;So, first we need to download and extract dnrd:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# wget http://downloads.sourceforge.net/dnrd/dnrd-2.20.3.tar.gz&lt;br /&gt;# tar xvfz dnrd-2.20.3.tar.gz&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next, install a compiler:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# apt-get install gcc&lt;br /&gt;# apt-get install g++&lt;br /&gt;# apt-get install make&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next, configure the package:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# ./configure&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Compile and install the package:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Create a startup script (&lt;tt&gt;/etc/init.d/dnrd&lt;/tt&gt;)&lt;br /&gt;&lt;pre&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#! /bin/sh&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;set&lt;/b&gt; -e&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;PATH=&lt;/span&gt;&lt;span style='color: #141312'&gt;/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;DESC=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Domain Name Relay Daemon"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;NAME=&lt;/span&gt;&lt;span style='color: #141312'&gt;dnrd&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;DAEMON=&lt;/span&gt;&lt;span style='color: #141312'&gt;/usr/local/sbin/&lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;PIDFILE=&lt;/span&gt;&lt;span style='color: #141312'&gt;/var/run/&lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #141312'&gt;.pid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #006e28'&gt;OPTIONS=&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"-s 195.130.131.10 -s 195.130.130.5 -a 192.168.1.254"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Gracefully exit if the package has been removed.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;test&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; -x &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DAEMON&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;||&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Function that starts the daemon/service.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;d_start()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; start-stop-daemon --start --quiet --pidfile &lt;/span&gt;&lt;span style='color: #006e28'&gt;$PIDFILE&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  --exec &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DAEMON&lt;/span&gt;&lt;span style='color: #141312'&gt; -- &lt;/span&gt;&lt;span style='color: #006e28'&gt;$OPTIONS&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Function that stops the daemon/service.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;d_stop()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; start-stop-daemon --stop --quiet --pidfile &lt;/span&gt;&lt;span style='color: #006e28'&gt;$PIDFILE&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  --name &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# Function that sends a SIGHUP to the daemon/service.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;#&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #644a9b'&gt;d_reload()&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; start-stop-daemon --stop --quiet --pidfile &lt;/span&gt;&lt;span style='color: #006e28'&gt;$PIDFILE&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;\&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  --name &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #141312'&gt; --signal 1&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;span style='color: #006e28'&gt;$1&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;span style='color: #141312'&gt;&lt;b&gt; in&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  start&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; -n &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Starting &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DESC&lt;/span&gt;&lt;span style='color: #bf0303'&gt;: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_start&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"."&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  stop&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; -n &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Stopping &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DESC&lt;/span&gt;&lt;span style='color: #bf0303'&gt;: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_stop&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"."&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  restart&lt;b&gt;|&lt;/b&gt;force-reload&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; -n &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Restarting &lt;/span&gt;&lt;span style='color: #006e28'&gt;$DESC&lt;/span&gt;&lt;span style='color: #bf0303'&gt;: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$NAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_stop&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #cc00cc'&gt;&lt;b&gt;sleep&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 1&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; d_start&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"."&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;  *&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #888786'&gt;&lt;i&gt;# echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" &amp;gt;&amp;amp;2&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #bf0303'&gt;"Usage: &lt;/span&gt;&lt;span style='color: #006e28'&gt;$SCRIPTNAME&lt;/span&gt;&lt;span style='color: #bf0303'&gt; {start|stop|restart|force-reload}"&lt;/span&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #223388'&gt;&lt;b&gt;&amp;gt;&amp;amp;2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;/span&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 1&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt; &lt;b&gt;;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #141312'&gt;&lt;b&gt;esac&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #880088'&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #141312'&gt; 0&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Add a user for &lt;tt&gt;dnrd&lt;/tt&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# adduser --system dnrd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Configure &lt;tt&gt;dnrd&lt;/tt&gt;; create and edit &lt;tt&gt;/usr/local/etc/dnrd/master&lt;/tt&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;domain earth&lt;br /&gt;192.168.1.1 localhostname&lt;br /&gt;192.168.1.254 firewyse&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Start &lt;tt&gt;dnrd&lt;/tt&gt; using the script we created earlier:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/etc/init.d/dnrd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Test your nameserver:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# nslookup firewyse&lt;br /&gt;&lt;br /&gt;Server:         192.168.1.254&lt;br /&gt;Address:        192.168.1.254#53&lt;br /&gt;&lt;br /&gt;Non-authoritative answer:&lt;br /&gt;Name:   firewyse.earth&lt;br /&gt;Address: 192.168.1.254&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, &lt;tt&gt;dnrd&lt;/tt&gt; is able to resolve the &lt;tt&gt;earth&lt;/tt&gt; domain. Adding additional hosts from your local network is accomplished by adding additional entries in the &lt;tt&gt;/usr/local/etc/dnrd/master&lt;/tt&gt; file. All you need to do is maintain one single configuration file. Configuring &lt;tt&gt;bind&lt;/tt&gt; to do this, requires a lot more additional steps and configuration files.&lt;br /&gt;Finally, we need to make sure &lt;tt&gt;dnrd&lt;/tt&gt; starts when the system is booted:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# update-rc.d dnrd defaults&lt;br /&gt; Adding system startup for /etc/init.d/dnrd ...&lt;br /&gt;   /etc/rc0.d/K20dnrd -&gt; ../init.d/dnrd&lt;br /&gt;   /etc/rc1.d/K20dnrd -&gt; ../init.d/dnrd&lt;br /&gt;   /etc/rc6.d/K20dnrd -&gt; ../init.d/dnrd&lt;br /&gt;   /etc/rc2.d/S20dnrd -&gt; ../init.d/dnrd&lt;br /&gt;   /etc/rc3.d/S20dnrd -&gt; ../init.d/dnrd&lt;br /&gt;   /etc/rc4.d/S20dnrd -&gt; ../init.d/dnrd&lt;br /&gt;   /etc/rc5.d/S20dnrd -&gt; ../init.d/dnrd&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4306041837858905582?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4306041837858905582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4306041837858905582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4306041837858905582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4306041837858905582'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/11/installing-wyse-2-dnrd.html' title='Installing the Wyse 2: dnrd'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2632956607710340267</id><published>2008-11-30T11:23:00.004+01:00</published><updated>2008-11-30T11:44:27.328+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firewyse'/><title type='text'>Installing the Wyse 1: Prepare for installation</title><content type='html'>As already mentioned in an earlier &lt;a href="http://kennywest.blogspot.com/2008/11/my-new-pet-project.html"&gt;post&lt;/a&gt;, I have bought a small Wyse thin client.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6Mp7nHbR5E8/STJqV-xufiI/AAAAAAAAADc/Dda2Le19svc/s1600-h/img_1888_small.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://2.bp.blogspot.com/_6Mp7nHbR5E8/STJqV-xufiI/AAAAAAAAADc/Dda2Le19svc/s320/img_1888_small.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5274395039465635362" /&gt;&lt;/a&gt;&lt;br /&gt;The picture above shows the Transcend flash card with 40-pin IDE that comes with the Wyse terminal. The card can only store 512MB data and I am not sure how a flash card reacts on a live operating system writing log files to it every now and then. A flash card ages and has a limited number of write / delete operations. Since the Wyse has plenty of room, I decided to mount a normal 10 GB hard drive, recovered from an older PC. I also installed an extra network card, since this device will be used as firewall / router / proxy for my network.&lt;br /&gt;Most Wyse terminals' BIOS are protected with a password. The default password is &lt;tt&gt;Fireport&lt;/tt&gt; (I had to look it up on the internet). You'll need this password and enter the BIOS to change the device's boot order. By default, it searches the network for a boot image ... which will take some time if you don't have a TFTP boot server running.&lt;br /&gt;The picture below shows the added network card and extra hard drive.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/STJqW2NonII/AAAAAAAAADs/kMR85ruvw7E/s1600-h/img_1887_small.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/STJqW2NonII/AAAAAAAAADs/kMR85ruvw7E/s320/img_1887_small.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5274395054346640514" /&gt;&lt;/a&gt;&lt;br /&gt;The power supply does not have an additional connection to power an additional CD ROM drive, so I connected the CD ROM drive, since this is only temporal, to an external power supply recovered from an old XT computer. You cannot use a normal ATX power supply, since this needs feedback from the ATX motherboard to power on (unless you know how to bypass this).&lt;br /&gt;The picture below shows the CD ROM drive connected to the external XT power supply. This CD ROM was connected to the second IDE channel to be able to install Debian on the Wyse.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/STJqWk6lZLI/AAAAAAAAADk/M6LnNvEZasU/s1600-h/img_1886_small.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/STJqWk6lZLI/AAAAAAAAADk/M6LnNvEZasU/s320/img_1886_small.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5274395049703335090" /&gt;&lt;/a&gt;&lt;br /&gt;Debian installs like a breeze on this device. Just download the Etch net-install, put it in the CD ROM drive, connect the device to the network and power it on. Debian has a ncurses based "next-&gt;next-&gt;next-&gt;finish" installer, so even your grandmother can do this.&lt;br /&gt;Finally, detach the external CD ROM drive, close the case and your done. All other necessary packages for Debian are fetched from the internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2632956607710340267?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2632956607710340267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2632956607710340267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2632956607710340267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2632956607710340267'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/11/installing-wyse-1-prepare-for.html' title='Installing the Wyse 1: Prepare for installation'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6Mp7nHbR5E8/STJqV-xufiI/AAAAAAAAADc/Dda2Le19svc/s72-c/img_1888_small.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4668977392114480854</id><published>2008-11-25T19:51:00.003+01:00</published><updated>2008-11-30T14:18:29.706+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><category scheme='http://www.blogger.com/atom/ns#' term='firewyse'/><title type='text'>My new pet project</title><content type='html'>&lt;p&gt;Before I start telling about my new pet project, I must congratulate my 3 colleagues that joined me at the Ubuntu booth on this weekends Dipro fair. We managed to gather around €80 of donations from people collecting an Ubuntu (or Kubuntu) installation medium. Compared to an earlier fair I did, with roughly the same people, this amount of money is enormous. If everything goes well, this money will be transfered to the Belgium Ubuntu loco team for supporting their actions.&lt;/p&gt;&lt;p&gt;Anyway, like any other Dipor fair, there were a lot of people trying to sell old computers and laptops for unreasonable prices, the most hideous cases, do-it-yourself-ink-cartridge-refill kits and mini keyboards only my kids can type on :)&lt;br /&gt;While strolling through the fair, however, a colleague showed me an interesting &lt;a href="http://wyse.com/"&gt;Wyse&lt;/a&gt; Thin Client. These terminals are normally used as a very lightweigt computer, accessing terminal services provided by some server running Windows or Unix. This particular device (a &lt;a href="http://www.wyse.com/products/winterm/9450-9455/"&gt;9455XL&lt;/a&gt;) was running some embedded version of Windows XP which I found quite intriguing. I also thought that all these devices had proprietary hardware, allowing them to run OS'es provided by Wyse only.&lt;br /&gt;This device was different. After kindly asking the seller for a screwdriver, we noticed a very familiar VIA chipset inside. The main board also had a normal IDE controller and one of its bays was occupied by 512MB, 40-pin, Transcend, IDE Flash Module. There was also a PCI riser card present, to be able to add an additional hardware component like a TV card. For the readers that got lost in the past few lines, this was a normal, damn small, extensible PC with very low power consumption :)&lt;br /&gt;The guy was selling these for €25 each, so I bought one.&lt;/p&gt;&lt;p&gt;Since the device only consumes an average of 15W, this will serve as an ideal replacement for my current 24/7 router-firewall-all-in-one-file-and-print-server providing Internet access to my network at home. The latter is a normal IBM Aptiva consuming an average of 65W. You could also use this as a cheap NAS device, after inserting a very huge hard disk.&lt;br /&gt;I had been thinking about this before, but I never found a reseller in Belgium for mini-itx boards and solutions. The German &lt;a href="http://www.minipc.de/"&gt;Mini PC&lt;/a&gt; site came close, but after configuring my first device, using their builder, it seemed a lot more expensive than I anticipated.&lt;/p&gt;&lt;p&gt;In the next posts, I will elaborate on some adventures in installing the device. I will also talk about the software I will install on this device (yes, it will be Linux, what else) and how it's configured. I will also turn this device into a content based proxy, instead of a normal NAT (Network Address Translator), to be able to filter out some unwanted sites. The latter will be interesting and necessary, since my girfriend's daughter is taking her first steps on the Internet.&lt;/p&gt;&lt;p&gt;Stay tuned!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4668977392114480854?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4668977392114480854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4668977392114480854' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4668977392114480854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4668977392114480854'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/11/my-new-pet-project.html' title='My new pet project'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5001189842372217370</id><published>2008-11-25T19:47:00.002+01:00</published><updated>2008-11-25T19:50:23.014+01:00</updated><title type='text'>SPAM: The Russians ... oh no, not again</title><content type='html'>Oh yes. I received another mail from a different girl, I mean woman, asking me for something totally different than love. Please read ... it's funny.&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;Dear Friend,&lt;br /&gt;&lt;br /&gt;My name is Elena, I have 31 year and I live in Russian province. I work in library and after my work I allowed to use computer when it possible.&lt;br /&gt;I finded your address in internet and I decided to write you this letter.&lt;br /&gt;&lt;br /&gt;I have 7-year daughter Angelina, her father abandoned us and we live with my mother.&lt;br /&gt;&lt;br /&gt;Recently my mother lost job and our situation became very difficult.&lt;br /&gt;&lt;br /&gt;The price for heating our home is very high and we cannot afford it anymore.&lt;br /&gt;&lt;br /&gt;The winter is coming and weather is colder each day. We worry if the temperature will become cold in our home, we don't know how to survive.&lt;br /&gt;&lt;br /&gt;For heating our home we need portable stove which give heat from burning wood. We have many wood in our region, but we cannot buy the stove in local market because it cost equivalent of 193 Euro and very expensive for us. &lt;br /&gt;If you have any old portable wood burning stove, we will be very happy if you can donate it to us and organize transport of its to our address (200km from Moscow) or help us to buy it in our local market. &lt;br /&gt;This oven are different, they are from cast iron and weight 100-150kg.&lt;br /&gt;&lt;br /&gt;I downloaded our picture to free website and you can see it at:&lt;br /&gt;http://elenadd.nextmail.ru/ourpicture.jpg&lt;br /&gt;It is not of very good quality, but it will give you idea how we look.&lt;br /&gt;&lt;br /&gt;I hope that you answer me and I wish you all the best.&lt;br /&gt;&lt;br /&gt;Elena.&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;I bet this one has a whole hangar of stoves :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5001189842372217370?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5001189842372217370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5001189842372217370' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5001189842372217370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5001189842372217370'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/11/spam-russians-oh-no-not-again.html' title='SPAM: The Russians ... oh no, not again'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5308068325018526127</id><published>2008-11-20T19:01:00.004+01:00</published><updated>2008-11-20T19:05:39.736+01:00</updated><title type='text'>SPAM: Does it ever stop ...</title><content type='html'>... I guess not. Today I received the following mail on my very old Hotmail account.&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;Dear User,&lt;br /&gt;   &lt;br /&gt;We are sorry to inform you that we care currently working on securing our server.  During this process, an account that is not manually verified by us will be deleted, Please confirm that you have an account and submit your information for manual verification by one of our customer care representatives&lt;br /&gt;   &lt;br /&gt;Information that is be to provided is below:&lt;br /&gt;User Name:&lt;br /&gt;UserID:&lt;br /&gt;Password:&lt;br /&gt;Date Of Birth:&lt;br /&gt;Country (At Signup): &lt;br /&gt;   &lt;br /&gt;Upon confirmation of the information from you, we will manually verify your yahoo account and, thereby, prevent it from being deleted, We are sorry for any inconvenience this might cause.&lt;br /&gt;   &lt;br /&gt;Account owner "who" refuses to update his/her account after two weeks of receiving this warning will lose his or her account permanently.&lt;br /&gt;__________________________________________________________________________________________________&lt;br /&gt;               &lt;br /&gt;Copyright © 2008 Yahoo. All rights reserved. Copyright/IP Policy&lt;br /&gt; | Terms of Service | Guide to Online Security&lt;br /&gt;                    &lt;br /&gt;NOTICE: We collect personal information on this site.&lt;br /&gt;To learn more about how we use your information, see our Privacy Policy.&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;Now this is funny. They're asking for my user ID and password for my Yahoo account, so I can keep using my Hotmail account. I don't even _have_ a yahoo account, and I never did!&lt;br /&gt;I said it before and I'll say it again, the Internet is a very dangerous place. Please, keep your children away!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5308068325018526127?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5308068325018526127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5308068325018526127' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5308068325018526127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5308068325018526127'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/11/spam-does-it-ever-stop.html' title='SPAM: Does it ever stop ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-1996975562006512890</id><published>2008-11-10T14:21:00.005+01:00</published><updated>2008-11-10T14:45:53.018+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Fixing a fluorescent rod</title><content type='html'>A few years ago I bought an orange fluorescent rod, which, mounted behind my television cabinet, gives an orange ambient light. The other weekend, it broke down :(&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/SRg1luAvAuI/AAAAAAAAADU/UMgsdzE9Yoc/s1600-h/nlrodo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/SRg1luAvAuI/AAAAAAAAADU/UMgsdzE9Yoc/s320/nlrodo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5267018686332338914" /&gt;&lt;/a&gt;&lt;br /&gt;Unfortunately, the original manufacturer (&lt;a href="http://www.wofi.de/"&gt;WOFI&lt;/a&gt;) stopped selling these a while ago. &lt;a href="http://www.makro.be/"&gt;Makro&lt;/a&gt; where I originally bought the rod doesn't sell them anymore either. So I had a problem.&lt;br /&gt;&lt;a href="http://www.velleman.be/"&gt;Velleman&lt;/a&gt; however has these rods in its products list, so I rushed to a local dealer, finding that he only had these in green and white (WTF?). So I still had a problem.&lt;br /&gt;There's no way to open these rods, since the black ends are glued to the orange rod at both sides. So normally, there's no way to open these rods without breaking something. Fortunately the black end with the power cord on the rod I own came loose a while ago. So I decided to take it apart to see if there was a way to fix it.&lt;br /&gt;Inside, there is a normal fluorescent tube of 56W (about 1.5 meters in length) powered by an electronic ballast. Normally, fluorescent lamps you find at home, are powered by a magnetic ballast and a starting switch. Electronic ballasts, however, are becoming more common (because they are less power consuming) but are more expensive than their magnetic counterparts.&lt;br /&gt;There were 2 possibilities, either the fluorescent lamp or the electronic ballast was broken. Or maybe both :(&lt;br /&gt;To test this, I took a working fluorescent lamp (used in my garage) and wired this to the electronic ballast (being very careful though). It worked, so I could conclude the ballast was still working and I only had to replace the broken fluorescent lamp.&lt;br /&gt;So now, until the ballast fails, I have my ambient orange rod working again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-1996975562006512890?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/1996975562006512890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=1996975562006512890' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1996975562006512890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1996975562006512890'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/11/fixing-fluorescent-rod.html' title='Fixing a fluorescent rod'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6Mp7nHbR5E8/SRg1luAvAuI/AAAAAAAAADU/UMgsdzE9Yoc/s72-c/nlrodo.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2067732051051596288</id><published>2008-11-10T09:24:00.003+01:00</published><updated>2008-11-10T10:13:36.008+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cooking'/><title type='text'>In search of perfection: Spaghetti Bolognese</title><content type='html'>&lt;p&gt;A while ago there was a series on the BBC on &lt;a href="http://en.wikipedia.org/wiki/Heston_Blumenthal"&gt;Heston Blumenthal's&lt;/a&gt; search of perfection. In the series, Heston tries to "perfect" 8 traditional dishes. About a year ago, a friend of mine brought these series to my attention, but in fact, I've never watched them. That's why I bought the books (in the meantime there have been 2 series) and yesterday, I tried to make Heston's version of &lt;a href="http://en.wikipedia.org/wiki/Bolognese_sauce"&gt;Spaghetti Bolognese&lt;/a&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6Mp7nHbR5E8/SRfwW07VkOI/AAAAAAAAADM/PlCsLKUpRWg/s1600-h/img_1840.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_6Mp7nHbR5E8/SRfwW07VkOI/AAAAAAAAADM/PlCsLKUpRWg/s320/img_1840.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5266942564188393698"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I will not go into detail on how to make the sauce, it is a lengthy process that takes about 8 hours. Instead, I will talk about some of the modifications I've done to Heston's recipe.&lt;br /&gt;There were some ingredients I couldn't find:&lt;ul&gt;&lt;li&gt;The star anise: According to Heston, this is the most important ingredient for the sauce, because combined with the onions, it enhances the flavor of the meat.&lt;/li&gt;&lt;li&gt;Boned oxtail&lt;/li&gt;&lt;li&gt;The coriander seeds&lt;/li&gt;&lt;li&gt;The Thai fish sauce&lt;/li&gt;&lt;li&gt;The sherry vinegar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Apparently the &lt;a href="http://en.wikipedia.org/wiki/Star_anise"&gt;star anise&lt;/a&gt; has a concentrated anise flavor, so I replaced it with 3 tablespoons of &lt;a href="http://en.wikipedia.org/wiki/Pernod_Ricard"&gt;Ricard&lt;/a&gt;, which is an anise flavored liqueur. I am not sure if it worked though, but it was worth a try.&lt;br /&gt;I couldn't find boned oxtail. Instead, I used oxtail with the bones and boned it at the end of the recipe. IMHO this is even better, because meat always tastes better when it's cooked on its bone.&lt;br /&gt;Instead of coriander seeds, I used coriander herbs, which are in essence dried coriander leaves. Not sure if this changes anything. I haven't used coriander seeds before, so I don't even know how they taste.&lt;br /&gt;I didn't bother buying the Thai fish sauce and replaced this with 2 tablespoons of soybean sauce, which has an oriental salty flavor. To add the fish taste, I stirred in 6 fillets of salted anchovy on oil at the end of the recipe.&lt;br /&gt;The cherry vinegar was replaced by xérès vinegar, but IMHO you can use any good quality, good tasting vinegar.&lt;/p&gt;&lt;p&gt;With all of the above modifications, I am not sure if my end result tastes the same as Heston's idea of perfection. But I have to say, it tastes incredible, and it was definitely worth 8 hours of cooking.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2067732051051596288?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2067732051051596288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2067732051051596288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2067732051051596288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2067732051051596288'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/11/in-search-of-perfection-spaghetti.html' title='In search of perfection: Spaghetti Bolognese'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6Mp7nHbR5E8/SRfwW07VkOI/AAAAAAAAADM/PlCsLKUpRWg/s72-c/img_1840.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-7753926337800823756</id><published>2008-10-23T11:23:00.006+02:00</published><updated>2008-10-23T12:09:02.113+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>Acoustic Design 3311</title><content type='html'>&lt;p&gt;As all of you probably know, I have kids. 2 of them are currently able to crawl/walk around and unfortunately they don't have the correct understanding of the word &lt;span style="font-style:italic;"&gt;no&lt;/span&gt; yet. Another problem is they seem to be very fond of technology, music, and they just love to fiddle with my ancient Kenwood KR-2200 receiver and peripherals. They also love to play with my regular sized speakers, I bought a long time ago for a cheap price at Aldi (Medion). Although these speakers were cheap, they sound great and I don't want the kids to break or damage these. So I removed the speakers and replaced them with very small sized speakers that are attached to my old portable radio cassette player (rx-ct800).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6Mp7nHbR5E8/SQBFmqJDCgI/AAAAAAAAAC0/OmmJeX06bkU/s1600-h/rx-ct800.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_6Mp7nHbR5E8/SQBFmqJDCgI/AAAAAAAAAC0/OmmJeX06bkU/s320/rx-ct800.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5260280895218321922" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;As much as I used to love my rx-ct800, the little speakers sounded like crap attached to the KR-2200, so I needed a solution.&lt;br /&gt;I was thinking on buying some cheap JB Systems speakers, since I already own a set of cheap JB Systems TSX speakers. Unfortunately, these sound like crap too.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6Mp7nHbR5E8/SQBGvlRxa9I/AAAAAAAAAC8/0iMYQzxgbjw/s1600-h/tsx-12.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_6Mp7nHbR5E8/SQBGvlRxa9I/AAAAAAAAAC8/0iMYQzxgbjw/s320/tsx-12.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5260282148043189202" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;So I decided to look at second hand stuff on &lt;a href="http://www.ebay.be/"&gt;eBay&lt;/a&gt; and &lt;a href="http://www.kapaza.be/"&gt;Kapaza&lt;/a&gt; and I found a pair of Acoustic Design 3311 speakers. In fact, I didn't know these were Acoustic 3311's until I removed the covers at the guy's place.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6Mp7nHbR5E8/SQBHYvjaoNI/AAAAAAAAADE/iY8f8EjtSqE/s1600-h/acoustic-3311.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://3.bp.blogspot.com/_6Mp7nHbR5E8/SQBHYvjaoNI/AAAAAAAAADE/iY8f8EjtSqE/s320/acoustic-3311.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5260282855176184018" /&gt;&lt;/a&gt;&lt;br /&gt;The guy that offered the speakers was selling these for €30. I thought this was a bargain. These speakers where enormous (the kids won't be able to toss these over) and they didn't sound too bad either. I was also going to use these speakers as a temporary solution until the kids have a correct understanding of the word "no" and stop tossing over the speakers.&lt;/p&gt;&lt;p&gt;So I bought them :)&lt;/p&gt;&lt;p&gt;Today, I found myself nothing to do and decided to look for some schematics or more technical details on the speakers I bought. After typing in Acoustic 3311 in google, I found these speakers were part of a large scale &lt;a href="http://en.wikipedia.org/wiki/White_van_speakers"&gt;scam&lt;/a&gt; several years ago (damned, why does this always happen to me). These speakers were sold for prices ranging from $200 to $2000 for a pair.&lt;/p&gt;&lt;p&gt;Anyway, I don't really feel scammed. I didn't buy the speakers from some guys driving around in a white mini van and I didn't pay $200 for them either. They also sound a lot better than the small speakers from my rx-ct800. As I already said this is merely a temporary solution, so in a few years or so, watch out for my Acoustic 3311 speakers on eBay or Kapaza :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-7753926337800823756?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/7753926337800823756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=7753926337800823756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7753926337800823756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7753926337800823756'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/10/acoustic-design-3311.html' title='Acoustic Design 3311'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6Mp7nHbR5E8/SQBFmqJDCgI/AAAAAAAAAC0/OmmJeX06bkU/s72-c/rx-ct800.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5994218618249315839</id><published>2008-10-13T10:22:00.002+02:00</published><updated>2008-10-13T10:29:02.811+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Linux: Visit us at the Ubuntu booth on November 23rd @ ICC Gent</title><content type='html'>Just to let you know, that yours truly and some other Ubuntu enthusiasts will be hosting a booth at the Dipro fair on November 23rd in Ghent on behalf of the Ubuntu Community. I will bring candy :)&lt;br /&gt;Please visit the &lt;a href="http://www.dipro.be/1/index.htm"&gt;dipro&lt;/a&gt; website if you're not sure how to get there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5994218618249315839?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5994218618249315839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5994218618249315839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5994218618249315839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5994218618249315839'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/10/linux-visit-us-at-ubuntu-booth-on.html' title='Linux: Visit us at the Ubuntu booth on November 23rd @ ICC Gent'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4093076709505809356</id><published>2008-10-12T11:06:00.002+02:00</published><updated>2008-10-12T11:12:58.218+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><title type='text'>Getting pestered by Adium</title><content type='html'>A few days ago I upgraded my Adium Instant Messenger client on Mac OS X to the latest version. While I was working yesterday, I was being pestered by girls who really wanted me to visit _their_ webcam the whole day :(&lt;br /&gt;I guess I am naive and thought only authorized &lt;span style="font-style:italic;"&gt;buddies&lt;/span&gt; could sent messages to me. Apparently not. If you want the spam messages to stop, all you have to do is go to the &lt;span style="font-style:italic;"&gt;Privacy Settings...&lt;/span&gt; in the &lt;span style="font-style:italic;"&gt;Adium&lt;/span&gt; menu and select &lt;span style="font-style:italic;"&gt;Allow only contacts on my contact list&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4093076709505809356?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4093076709505809356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4093076709505809356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4093076709505809356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4093076709505809356'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/10/getting-pestered-by-adium.html' title='Getting pestered by Adium'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-7722583152880925675</id><published>2008-10-05T11:22:00.004+02:00</published><updated>2008-10-05T11:35:56.382+02:00</updated><title type='text'>I have a new girlfiend, and she looks awesome :)</title><content type='html'>&lt;p&gt;A few weeks ago, I received a mail with the following subject: &lt;span style="font-style:italic;"&gt;Likely, you will be now surprised.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Below is the complete content of this mail:&lt;/p&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;Hi, how are you? Likely, you will be now surprised. I long thought&lt;br /&gt;before writing you the letter. This morning, I have received love the&lt;br /&gt;Internet dispatch, from the unknown person to me the addressee. In the&lt;br /&gt;given letter, it was spoken about love relations between people. In&lt;br /&gt;the list e-mail addressees, I have seen your address. I long thought&lt;br /&gt;before writing to you. I think, what you as search for serious&lt;br /&gt;relations? I consider, that the given chance for me unique, therefore&lt;br /&gt;I have decided to write to you. I wish to find the present love! I&lt;br /&gt;would like to begin our acquaintance, with the small story about me.&lt;br /&gt;My name is Anahit. Friends me name simply Anahit. To me of 28 years. I&lt;br /&gt;the quiet, young, purposeful girl. Friends say to me, that I cheerful.&lt;br /&gt;I love dialogue. I consider, that dialogue very important component in&lt;br /&gt;our life. I, as well as all women of our country, like to cook food,&lt;br /&gt;to go in for sports. I conduct a healthy way of life. I do not smoke&lt;br /&gt;and I do not take alcohol. I have work which very strongly I love. But&lt;br /&gt;I do not have not enough love. I am assured, that on our planet, there&lt;br /&gt;is a person who can present to me happiness and love! On the Internet&lt;br /&gt;I more recently. I have no wide experience in the Internet&lt;br /&gt;acquaintances. I have seen transfer on the TV, about love in the&lt;br /&gt;Internet and have decided to find the happiness. I consider, that it&lt;br /&gt;is real. I search for the real man who will love, and to respect me. I&lt;br /&gt;consider, that this main thing in relations. I wish to get acquainted&lt;br /&gt;with you more close, by means of e-mail. It will be for us easier&lt;br /&gt;variant. &lt;br /&gt;&lt;br /&gt;I give you mine e-mail the address:  ahan.naha@yahoo.co.uk&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can write to me. I with pleasure will answer you. Certainly, I&lt;br /&gt;will send to you many the photos and I hope, that they will like you.&lt;br /&gt;I with impatience will wait your letter to me, with more detailed&lt;br /&gt;story about you. I am assured, that we become good friends and we can&lt;br /&gt;love each other. Yours faithfully, Your new girlfriend, Anahit.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6Mp7nHbR5E8/SOiHeMeQC5I/AAAAAAAAACU/aOdOJJKAFCE/s1600-h/Anahit.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_6Mp7nHbR5E8/SOiHeMeQC5I/AAAAAAAAACU/aOdOJJKAFCE/s320/Anahit.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253597918141614994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;She looks great, doesn't she. These kinds of mails should remind us, the Internet is a dangerous place. The same day I received that mail, there was a documentary on Canvas about people who received mails, just like the one displayed above, and actually responded.&lt;/p&gt;&lt;p&gt;The mails are sent by a Russian organization, trying to steal some money from you. First they send you this generic mail, with a picture attached. When you reply, you will receive several other mails, telling you how in love with you she really is. After that, she will start asking money, e.g. to pay for a trip to come and visit you and have a ball the whole weekend (oh yeah). Sometimes you'll need to pay for her sick mother, father or brother, which is likely going to be a lot more expensive.&lt;/p&gt;&lt;p&gt;Anyway, I hope the few people reading this blog think twice after receiving a mail like that.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-7722583152880925675?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/7722583152880925675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=7722583152880925675' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7722583152880925675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7722583152880925675'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/10/i-have-new-girlfiend-and-she-looks.html' title='I have a new girlfiend, and she looks awesome :)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6Mp7nHbR5E8/SOiHeMeQC5I/AAAAAAAAACU/aOdOJJKAFCE/s72-c/Anahit.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-7870937828749124700</id><published>2008-10-04T13:22:00.005+02:00</published><updated>2008-10-12T11:14:07.773+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tuxdroid'/><title type='text'>Tuxdroid: Exploring the 2.0 beta API and software</title><content type='html'>Just a quick update on the Tuxdroid / Java story. I followed the &lt;a href="http://wiki.tuxisalive.com/index.php/How_to_install_on_Linux"&gt;wiki&lt;/a&gt; page describing the installation for the 2.0 beta software and launched the new control center (which is entirely written in java).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6Mp7nHbR5E8/SOdTOSpPdyI/AAAAAAAAACM/-bnB1NV1FF4/s1600-h/control_center.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_6Mp7nHbR5E8/SOdTOSpPdyI/AAAAAAAAACM/-bnB1NV1FF4/s320/control_center.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253258995339065122" /&gt;&lt;/a&gt;&lt;br /&gt;The screenshot above shows this UI and it looks and works awesome. It has a lot more possibilities then the Python based 1.x UI and the attitunes stuff now really works. Attitunes are some kind of scenario's you can _play_, instructing the droid to do and say stuff. If you take a closer look to the screenshot, you can see the "Computer Alert 1 Nl" attitune highlighted. Pressing the play button executes the attitune and makes the droid speak and move.&lt;br /&gt;Using the UI you can also download, install and execute attitunes contributed by other people from the &lt;a href="http://tuxisalive.com/"&gt;Tux Is Alive&lt;/a&gt; website.&lt;br /&gt;Anyway, I've checked out the &lt;a href="http://svn.tuxisalive.com/software_suite_v2/"&gt;code&lt;/a&gt; and I'm going to take a closer look at it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-7870937828749124700?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/7870937828749124700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=7870937828749124700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7870937828749124700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7870937828749124700'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/10/tuxdroid-exploring-20-beta-api-and.html' title='Tuxdroid: Exploring the 2.0 beta API and software'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6Mp7nHbR5E8/SOdTOSpPdyI/AAAAAAAAACM/-bnB1NV1FF4/s72-c/control_center.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4234800637191516056</id><published>2008-10-04T10:47:00.003+02:00</published><updated>2008-10-12T11:14:25.407+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tuxdroid'/><title type='text'>Nerdtalk: The Tuxdroid has arrived</title><content type='html'>Earlier this year I was visiting &lt;a href="http://www.fosdem.org"&gt;FOSDEM&lt;/a&gt; and together with a colleague I attended a &lt;a href="http://archive.fosdem.org/2008/schedule/events/embedded_robot"&gt;talk&lt;/a&gt; about how to design a Linux robot companion. Although I studied electronics a long time ago, resistors, transistors and other electronic components have never really been my cup of tea. That's why I started to work as a Software Engineer, rather then a chip designer, but that's a whole different story.&lt;br /&gt;Anyway, the talk was not that difficult to follow, given my background. Even for people without a hardware background, I think, the talk was not that "nerdy".&lt;br /&gt;In the talk &lt;a href="http://www.tuxisalive.com/author/jaguarondi"&gt;David&lt;/a&gt; presented a few &lt;a href="http://www.tuxisalive.com/"&gt;Tuxdroids&lt;/a&gt; and told the story on how they designed it. The presentation was crystal clear for everyone, so the only question that popped from the audience was "Where the hell can we buy this thing?" (laughter all over the place). &lt;a href="http://www.thinkgeek.com/index.shtml"&gt;ThinkGeek&lt;/a&gt; was of course the place to be.&lt;br /&gt;At that time, we, Europeans, could buy stuff rather cheap on ThinkGeek, so a friend of mine decided to place a major order at ThinkGeek.&lt;br /&gt;A few weeks ago, I was paying this friend another visit and the Tuxdroid had arrived.&lt;br /&gt;I would not recommend this Tuxdroid to lesser nerdy people, because buying this will involve uploading new firmware and you need some programming skills to write your own gadgets. These gadgets, e.g. a mail checker, will alert you when a mail comes in. The droid will even read the sender's name and subject aloud. Using Linux is also more or less mandatory, as it is the preferred OS to use with the droid.&lt;br /&gt;Currently there rewriting the API to be able to support Java. Being a Java developer this caught my &lt;a href="http://www.tuxisalive.com/developers/developers-forum/apis/655983077"&gt;interest&lt;/a&gt;, so when I find some spare time left, I'll be looking into this API.&lt;br /&gt;To be continued ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4234800637191516056?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4234800637191516056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4234800637191516056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4234800637191516056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4234800637191516056'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/10/nerdtalk-tuxdroid-has-arrived.html' title='Nerdtalk: The Tuxdroid has arrived'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-7026294585283680245</id><published>2008-10-04T10:42:00.002+02:00</published><updated>2008-10-04T10:45:35.618+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Ubuntu 8.10 is coming</title><content type='html'>Just a quick post to tell the small amount of people tracking this blog that Ubuntu 8.10 is coming. The first beta's are already released. Gentlemen (or women), start playing :)&lt;br /&gt;&lt;script type="text/javascript" src="http://www.ubuntu.com/files/countdown/display.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-7026294585283680245?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/7026294585283680245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=7026294585283680245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7026294585283680245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7026294585283680245'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/10/linux-ubuntu-810-is-coming.html' title='Linux: Ubuntu 8.10 is coming'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4913730759635945996</id><published>2008-05-03T10:41:00.003+02:00</published><updated>2008-05-03T11:06:15.295+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Some issues I had with Kubuntu 8.04</title><content type='html'>Whilst reinstalling my desktop and all the applications I wanted, these were the problems/issues I encountered.&lt;h4&gt;VMware does not work&lt;/h4&gt;I use VMware to test drive upcoming Ubuntu releases and for running Windows XP. I still need XP for my GPS software on my PDA. I tried to install VMware 1.x and it failed when compiling the netwokr modules. &lt;a href="http://www.howtoforge.com/vmware-server-1.0.4-fedora8-kernel-2.6.24"&gt;This&lt;/a&gt; link solved my problems and I managed to compile the modules. When trying to run VMware, another problem appeared:&lt;pre&gt;&lt;tt&gt;/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)&lt;br /&gt;/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2)&lt;br /&gt;/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)&lt;br /&gt;/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2)&lt;br /&gt;/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)&lt;br /&gt;/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2)&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;To solve this, you have to symlink &lt;tt&gt;/usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1&lt;/tt&gt; to &lt;tt&gt;/lib/libgcc_s.so.1&lt;/tt&gt;. Please note that &lt;tt&gt;/usr/lib/vmware/lib/libgcc_s.so.1/&lt;/tt&gt; already contains a file called &lt;tt&gt;libgcc_s.so.1&lt;/tt&gt;, so you need to remove it first. After that, VMware will run just fine.&lt;h4&gt;f-spot and KDE 4 aren't friends&lt;/h4&gt;I use f-spot as preferred application to manage my pictures. Though f-spot installs just fine in Kubuntu, it fails to run miserably with and &lt;tt&gt;SIGSEGV&lt;/tt&gt; exception. Apparently, f-spot needs the &lt;tt&gt;gconfd&lt;/tt&gt; that is started by default when running Gnome. This daemon is also started automatically by firefox, so as a workaround, just start firefox once, prior to running f-spot and you're good.&lt;h4&gt;No administrator button in KDE 4 System Settings&lt;/h4&gt;The System Settings for KDE 4 application looks really great. The problem is that some settings requiring administrative privileges are not accessible, due to a missing administrator button. The KDE folks probably forgot to add this, and I hope it will be there in KDE 4.1. Anyway, as a workaround, just open a terminal and type: &lt;tt&gt;kdesu systemsettings&lt;/tt&gt;. This allowed my to change the kdm login screen.&lt;p/&gt;Those were the problems I encountered, other than that, it installed and runs just fine. The Ubuntu folks did a good job and delivered Hardy on time. Kudos guys, keep up the good work and thank you for bringing Linux one step closer, again, to world domination.&lt;p/&gt;meh :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4913730759635945996?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4913730759635945996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4913730759635945996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4913730759635945996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4913730759635945996'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/05/linux-some-issues-i-had-with-kubuntu.html' title='Linux: Some issues I had with Kubuntu 8.04'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8346129077668388731</id><published>2008-05-02T08:12:00.004+02:00</published><updated>2008-05-03T10:40:50.367+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Impressions of Kubuntu 8.04 KDE 4 Remix</title><content type='html'>Almost 3 years ago, I decided do ditch my old PII Celeron and buy a new HP Pavilion Pentium 4. The Pavilion had Windows XP preloaded and it lasted about a week. Since that week, it has been running Ubuntu and I never re-installed it. I have been dist-upgrading the machine from Breezy (ah, those were the days) to Dapper. Since I like having a stable machine, instead of feature rich, "running latest versions of everything" machine, I've been using Dapper until yesterday.&lt;br /&gt;Since the early days of Linux having a "desktop environment", I have always been a big fan of Gnome. It looked right and has always served my needs. As a java developer, I use Gnome as the preferred desktop environment at work too. Using Gnome, or any desktop environment, hours and hours in a row, enables you to discover the less pleasant parts of it. So, after a year of developing on a Gnome desktop, I have come to dislike it.&lt;br /&gt;A few months ago, youtube was flooded with short demos on the new, upcoming, KDE 4 desktop environment. There were also a lot of demos showing Combiz, Beryl and later Compiz Fusion, but I never got very impressed with those. The KDE 4 demos impressed me though and I came to learn more about KDE and its applications. Gutsy was the first Ubuntu release providing a KDE 4 live CD, it was love at first sight :)&lt;br /&gt;In my opinion, KDE has done a good job looking at the Mac OS X user interface, features and applications. I have also the impression that these applications written for the KDE desktop are more feature complete and mature than similar applications for the Gnome desktop. For me, it seems the Gnome desktop is a collection of small, feature incomplete, immature, applications. If, for example, you're looking for a "Total Commander" clone for Linux, you have the choice of 2 (maybe more) clones available for Gnome. These "Total Commander" clones for Gnome are less feature complete, then lets say Krusader. So I was using Krusader on my Gnome desktop, amongst other KDE applications as Amarok and K3B.&lt;br /&gt;I was determined when the next LTS would arrive, I was going to switch to the KDE desktop environment. Unfortunately, from what I heard and read on the Internet, Kubuntu 8.04 won't be an LTS, since its primary focus will be KDE 4, which is considered not stable.&lt;br /&gt;Indeed, KDE 4 is far from stable, but it works and it looks and feels right. This is the desktop environment for Linux I have been waiting for. The KDE developers still have a long road to go, since most applications still aren't ported yet from KDE 3.x. Integration of GTK applications, such as Firefox or Thunderbird, also need more work.&lt;br /&gt;I don't want to start a desktop war here. The cool thing about Linux is that _you_ can choose whatever desktop environment or window manager you want. I chose KDE 4 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8346129077668388731?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8346129077668388731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8346129077668388731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8346129077668388731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8346129077668388731'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/05/linux-impressions-of-kubuntu-804-kde-4.html' title='Linux: Impressions of Kubuntu 8.04 KDE 4 Remix'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-191115265810972199</id><published>2008-03-29T18:15:00.002+01:00</published><updated>2008-03-29T18:22:34.976+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Jeugdsentiment</title><content type='html'>Voor de mensen van mijn leeftijd (of ietsje ouder) die de rotzooi die ze de kinderen vandaag voeren op televisie maar niets vinden, deze &lt;a href="http://www.jeugdsentimentportaal.net/"&gt;link&lt;/a&gt;. Hier kan je alles lezen over series gaande van "Merlina" tot "Tik Tak". De site heb ik toevallig via google gevonden en wou ik jullie niet onthouden. Eigenlijk was ik op zoek naar (en gevonden :) ) &lt;a href="http://www.jeugdsentimenten.net/2004/07/17/de-7-van-blake/"&gt;Blake's 7&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-191115265810972199?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/191115265810972199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=191115265810972199' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/191115265810972199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/191115265810972199'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/03/jeugdsentiment.html' title='Jeugdsentiment'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-1111342850234783866</id><published>2008-03-27T21:22:00.002+01:00</published><updated>2008-03-27T21:33:35.822+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mule'/><title type='text'>Mule: Update on the ServingXML transformer</title><content type='html'>This is just a short post to give you the latest news on my &lt;a href="http://www.mulesource.org/display/SERVINGXML/Home"&gt;Serving XML transformer&lt;/a&gt; for Mule. I have updated the &lt;tt&gt;pom&lt;/tt&gt;, so now the project builds properly with maven. Hopefully this will improve my build statistics on MuleForge's bamboo :)&lt;br /&gt;I have also included a small unit test, taken from the samples included with the ServingXML distribution, that shows how you can use the transformer _without_ Mule. I will provide working samples, integrated with Mule, later. People that are familiar with Mule and how to configure transformers should be able to use this transformer in their setup.&lt;br /&gt;Good luck ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-1111342850234783866?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/1111342850234783866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=1111342850234783866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1111342850234783866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1111342850234783866'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/03/mule-update-on-servingxml-transformer.html' title='Mule: Update on the ServingXML transformer'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-1141726117686747978</id><published>2008-03-26T17:17:00.004+01:00</published><updated>2008-03-26T17:36:28.623+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Yes, I am still alive</title><content type='html'>&lt;p&gt;I realize it has been a long time since I last blogged on this site. I am very sorry for this, but I have been very busy.&lt;/p&gt;&lt;p&gt;First I started a project on MuleForge (&lt;a href="http://www.mulesource.org/display/SERVINGXML/Home"&gt;ServingXML Transformer&lt;/a&gt;) that should help people using Mule to easily wrap all the power of ServingXML into one single transformer. There is already some code in the svn repository, but it doesn't build yet with maven. The problem is that ServingXML does not have any jars available in the main ibiblio repositories, so I will need to host these jars somewhere else. For the brave out there, just checkout the code, download &lt;a href="http://servingxml.sourceforge.net/"&gt;ServingXML&lt;/a&gt;, put the jars in your local maven repository and issue a &lt;tt&gt;mvn clean install&lt;/tt&gt;. This should get you up and running, if not, just wait for me to fix the build.&lt;br /&gt;The reason why I created this project is that people where asking me off-list for new code and documentation. Unfortunately I didn't have those, so the project should solve this, I hope :)&lt;/p&gt;&lt;p&gt;I also got involved with &lt;a href="http://code.google.com/p/uface/"&gt;uface&lt;/a&gt;. This small project aims to create an abstract layer on top of different UI toolkits, such as Swing and JFace, and bind the UI controls to the model using JFace's binding framework. Using the current binding framework requires a lot of repetitive coding, so this framework should ease things here and there. It is still very immature though, but in a few months, we should have a first release. I will blog about the progress we're making. &lt;a href="http://tom-eclipse-dev.blogspot.com/"&gt;Tom&lt;/a&gt; is also blogging about this and he does this more frequently.&lt;/p&gt;&lt;p&gt;So this was a short update to tell you about the stuff I am working on. I'll try to blog more frequently.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-1141726117686747978?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/1141726117686747978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=1141726117686747978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1141726117686747978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1141726117686747978'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2008/03/yes-i-am-still-alive.html' title='Yes, I am still alive'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-3178592197096426976</id><published>2007-11-19T19:16:00.002+01:00</published><updated>2008-10-12T11:14:45.470+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>Best song of all time ... the sequel</title><content type='html'>So yesterday I was doing the dishes. Nothing fancy about that, despite the fact I was listening to &lt;a href="http://en.wikipedia.org/wiki/Global_Underground_013"&gt;this&lt;/a&gt; while doing it. There's a track on the second disc, called &lt;a href="http://www.youtube.com/watch?v=oLmOHfjLVWM"&gt;Xpander&lt;/a&gt; which is really awesome. Choosing between Xpander and the track mentioned in an earlier post would be ... eh ... very difficult. Sasha rules!&lt;br /&gt;A while ago, &lt;a href="http://en.wikipedia.org/wiki/Sasha_%28DJ%29"&gt;Sasha&lt;/a&gt; did a &lt;a href="http://www.tranceaddict.com/forums/showthread/t-266979-p-2.html"&gt;set&lt;/a&gt; on &lt;a href="http://www.bbc.co.uk/radio1/essentialmix/index.shtml"&gt;Essential Mix&lt;/a&gt;, remixing and re-editing music live, on Ableton live @ Maida Vale. Now this set, my dear friends, is by far the best set I've ever heard. It also features the song mentioned in some &lt;a href="http://kennywest.blogspot.com/2007/10/jori-hulkkonen-feat-jerry-valuri-lo.html"&gt;earlier&lt;/a&gt; post. I think I heard this set a zillion times, but I never get tired playing it. Again and again. I guess that makes me a boring person :)&lt;br /&gt;Anyway, I think I should &lt;span style="font-style:italic;"&gt;recall&lt;/span&gt; the earlier post about the best song of all time. IMHO, there's no such thing. There can be several :)&lt;br /&gt;So, I guess I will have to assemble box of &lt;span style="font-style:italic;"&gt;records-that-should-be-rescued-in-case-of-fire&lt;/span&gt;.&lt;br /&gt;Cheers ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-3178592197096426976?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/3178592197096426976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=3178592197096426976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3178592197096426976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3178592197096426976'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/11/best-song-of-all-time-sequel.html' title='Best song of all time ... the sequel'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-7292650888152137437</id><published>2007-11-09T18:01:00.000+01:00</published><updated>2007-11-09T18:10:06.941+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Linux: Joy, joy, pleasure overload</title><content type='html'>Yes. Coming home today and browsing through the mail I received mad me a very happy man, despite of the rough week at work. Today I found 2 surprises in my mail: &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Revolution-OS-Linus-Torvalds/dp/B0000A9GLO/ref=pd_bbs_sr_1?ie=UTF8&amp;s=dvd&amp;qid=1194627651&amp;sr=8-1"&gt;Revolution OS, the DVD&lt;/a&gt;. This DVD is a documentary on Linux and the Open Source movement. Yes, I do realize you can see this movie on-line but I just had to have a hard copy for myself. And yes, I do realize this makes me a real nerd :)&lt;/li&gt;&lt;li&gt;2 CD's with Ubuntu 7.10. The nice people of &lt;a href="https://shipit.ubuntu.com/"&gt;ShipIt&lt;/a&gt; send me a free copy of Ubuntu's most recent distributable for free.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Guess this makes me a double nerd.&lt;br /&gt;Oh well, I don't care. You're all being jealous :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-7292650888152137437?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/7292650888152137437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=7292650888152137437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7292650888152137437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7292650888152137437'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/11/linux-joy-joy-pleasure-overload.html' title='Linux: Joy, joy, pleasure overload'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-7057595265645931732</id><published>2007-11-04T20:31:00.000+01:00</published><updated>2007-11-04T21:01:25.075+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>Best song of all time</title><content type='html'>I am not that old. I have developed my taste for music when I was twelve years old or so. I think everyone developed some taste at that time. Maybe for something different, like women :)&lt;br /&gt;Anyway, when I was twelve, 17 years ago, some dudes in Belgium invented New Beat. At least, I think it was invented here. It was a cross breed of New Wave and some other electronic sounds from the late 80's. I know my parents didn't like it very much, but I did. New Beat didn't last very long and then &lt;span style="font-style:italic;"&gt;House&lt;/span&gt; music, and all its off-springs, came along. My parent's didn't like it either, even some of my friends didn't like it, but I still did.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;House&lt;/span&gt; music is still here, the number of off-springs still growing. Right now I like stuff they play on &lt;span style="font-style:italic;"&gt;frisky radio&lt;/span&gt; and BBC's &lt;span style="font-style:italic;"&gt;kiss 100&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Essentialmix&lt;/span&gt;.&lt;br /&gt;Obviously, this is not the only genre I admire. I also like other stuff like Muse, Nine Inch Nails, Placebo, Radiohead, ... . Seriously, you can't play house when you're having friends for dinner ... right?&lt;br /&gt;Anyway, looking back at my collection of records and CD's I gathered in these 15 wonderful years it makes you wonder: "suppose the house burns down and you can only save 1 record, which one would it be?". I think, and some other people probably agree, &lt;a href="http://www.youtube.com/watch?v=P9WECLzsp84"&gt;this&lt;/a&gt; record would be it (At The Villa People; Open Your Eyes). This record reminds my of the period when I started DJ'ing, around 1996. It was one of the first records I bought, with the little money I had at that time.&lt;br /&gt;Life is music, my dear friends (which reminds me, "&lt;a href="http://www.youtube.com/watch?v=3-EkLqjV1gs"&gt;My life is music&lt;/a&gt;" is also a very fine record). Music has always helped my to get through difficult periods in life. Like girlfriends breaking up with me, people dying, whatever. It reminds you of other, pleasant, things that happened in your past. It reminds you of people you've met, friends you've learned to know.&lt;br /&gt;Think about it, what would be the sole record you salvage, should your house burn down ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-7057595265645931732?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/7057595265645931732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=7057595265645931732' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7057595265645931732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7057595265645931732'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/11/best-song-of-all-time.html' title='Best song of all time'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-6031001781412886311</id><published>2007-11-02T15:43:00.000+01:00</published><updated>2007-11-02T15:51:15.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Installing latest firefox and thunderbird on Dapper</title><content type='html'>I'm still using Ubuntu Dapper. Why? Because I don't want to mess a lot with this install and let a dist-upgrade trash it completely every six months or so. Trust me, I've done 2 or more dist-upgrades in Ubuntu and none of them went well.&lt;br /&gt;Anyway, I am still running Dapper and I'm proud of it. The only problem with this is that firefox and thunderbird shipped with Dapper have become very outdated. I wanted to try the &lt;a href="http://webmail.mozdev.org/"&gt;webmail&lt;/a&gt; plug-in, but it only works for thunderbird 2. Damn :(&lt;br /&gt;Fortunately there are some kind people who also have an older Ubuntu install and created a script to easily install the latest versions of both firefox and thunderbird on any Ubuntu version. Cool eh :)&lt;br /&gt;The script is called &lt;a href="http://ubuntuzilla.wiki.sourceforge.net/"&gt;ubuntuzilla&lt;/a&gt; and you need to run it as root. Not as a regular user, not using sudo.&lt;br /&gt;Use it at your own risk and make a backup of your mails before using the script!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-6031001781412886311?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/6031001781412886311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=6031001781412886311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6031001781412886311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6031001781412886311'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/11/linux-installing-latest-firefox-and.html' title='Linux: Installing latest firefox and thunderbird on Dapper'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-6043386447536721747</id><published>2007-11-02T10:49:00.000+01:00</published><updated>2007-11-09T18:11:35.035+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Installing fluxbuntu (Gutsy)</title><content type='html'>&lt;h4&gt;Introduction&lt;/h4&gt;I own an old Compaq Armada e500. This portable used to have 512 MB of RAM, but the other month, half of it failed on me and died. So, this left the portable quite useless. Running Ubuntu with Gnome is quite painful, because you spent most of the time waiting. Even the so claimed lightweight Ubuntu, Xubuntu, doesn't run as smooth as it should.&lt;br /&gt;The other week I came across a post on the dutch Ubuntu forums, talking about &lt;a href="http://www.fluxbuntu.org/"&gt;fluxbuntu&lt;/a&gt;. This Ubuntu version claims being more lightweight than Xubuntu, so I decided to take it for a spin.&lt;h4&gt;Installation&lt;/h4&gt;fluxbuntu boots in a non graphical installer. If you ever installed Debian, this installer will look very familiar. I think Ubuntu's alternate install CD also uses this "ncurses" based installer. Although the installer is text based, installing fluxbuntu is not more difficult than installing any other distro using a graphical installer. It also has the same basic questions; what's your keyboard layout?, where do you live?, where do you want to put it?. It even did a good job detecting the correct settings for XWindows.&lt;h4&gt;SLIM login manager&lt;/h4&gt;After the necessary reboot, I was presented a nice splash screen and a simple, but nice login manager. fluxbuntu does not use xdm (Xubuntu) or gdm (Ubuntu, Gnome) but the very lightweight: &lt;a href="http://slim.berlios.de/"&gt;Simple LogIn Manager&lt;/a&gt; (or SLIM). Being lightweight is the only advantage I can see for this login manager. One major disadvantage is that the version shipped with fluxbuntu (1.2.something) does not support PAM. So if you're authenticating against NIS or LDAP, you can kiss this login manager goodbye :)&lt;br /&gt;After searching the web for a while, I discovered that the most recent version (1.3.0) supports PAM. I couldn't find any Debian package though, so I had to compile it myself. SLIM does not include a &lt;tt&gt;configure&lt;/tt&gt; script, so you'll need to read the &lt;tt&gt;INSTALL&lt;/tt&gt; to find out and install the necessary dependencies. If I recall correctly, you'll need &lt;tt&gt;xorg-dev&lt;/tt&gt;, &lt;tt&gt;libpng-dev&lt;/tt&gt;, &lt;tt&gt;g++&lt;/tt&gt; and &lt;tt&gt;libjpg-dev&lt;/tt&gt;. After doing a &lt;tt&gt;make install&lt;/tt&gt;, just reboot (or &lt;tt&gt;init 1&lt;/tt&gt; and CTRL+D) and you're up and running the latest SLIM :)&lt;h4&gt;fluxbox&lt;/h4&gt;fluxbuntu uses fluxbox as default windowmanager. fluxbox is a fork of the elder blackbox window manager which I used a long time ago. I've always liked blackbox and also like fluxbox very much.  The UI looks very clean and the people from fluxbuntu have done a great job creating a default theme for it. Unlike Ubuntu, it's green.&lt;h4&gt;PAM and ldap&lt;/h4&gt;Since Gutsy, they've done some changes to the &lt;tt&gt;libpam-ldap&lt;/tt&gt; and &lt;tt&gt;libnss-ldap&lt;/tt&gt; packages. Apparently they are now grouped in one &lt;a href="https://blueprints.launchpad.net/ubuntu/+spec/ldap-authentication-client"&gt;meta&lt;/a&gt; package and the both use the same configuration file &lt;tt&gt;/etc/ldap.conf&lt;/tt&gt;, instead of &lt;tt&gt;/etc/libnss-ldap.conf&lt;/tt&gt; and &lt;tt&gt;/etc/pam_ldap.conf&lt;/tt&gt;. I think this is a very good idea, since both files contained the same settings anyway. So you ended up either maintaining 2 files, or symlinking the one to the other. Anyway, I am not going into detail on configuring an LDAP client install, but if you're migrating from Feisty or older to Gutsy, it is something to keep in mind when trying to reuse your old configuration files.&lt;h4&gt;Conclusion&lt;/h4&gt;This is the lightweight distro I have been waiting for. Even on older machines with less RAM, it runs smoother then Xubuntu which is, IMHO, becoming quite heavyweight as well. I do realize that fluxbox is probably not as intuitive as KDE, Xfce or Gnome, but intuitiveness has never been my main concern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-6043386447536721747?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/6043386447536721747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=6043386447536721747' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6043386447536721747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6043386447536721747'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/11/linux-installing-fluxbuntu-gutsy.html' title='Linux: Installing fluxbuntu (Gutsy)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-6460017725533303160</id><published>2007-10-01T19:25:00.000+02:00</published><updated>2007-10-01T19:30:08.574+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>Jori Hulkkonen feat. Jerry Valuri - Lo-Fiction</title><content type='html'>If someone would ask me to compile a list of 10 personal favorites, &lt;a href="http://www.youtube.com/watch?v=L9e5YgERtJk"&gt;Lo-Fiction&lt;/a&gt; would definitely be ranked very high. I don't think anyone would disagree with this statement.&lt;br /&gt;P.S. If someone is able to find the lyrics for this song, please be so kind to post a link. Even though it's English I don't always understand what he's singing about :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-6460017725533303160?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/6460017725533303160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=6460017725533303160' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6460017725533303160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6460017725533303160'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/10/jori-hulkkonen-feat-jerry-valuri-lo.html' title='Jori Hulkkonen feat. Jerry Valuri - Lo-Fiction'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-1116918830611338789</id><published>2007-08-28T09:32:00.000+02:00</published><updated>2007-08-28T09:38:09.475+02:00</updated><title type='text'>We welcome Nils and Arne</title><content type='html'>Yesterday our twins were born around 9u50 CET. Underneath you can see a picture of the proud mother and our 2 lovely sons.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_6Mp7nHbR5E8/RtPQQ4bIkhI/AAAAAAAAAAc/1_wWSDKadCU/s1600-h/IMG_0625.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_6Mp7nHbR5E8/RtPQQ4bIkhI/AAAAAAAAAAc/1_wWSDKadCU/s320/IMG_0625.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5103651791183581714" /&gt;&lt;/a&gt;&lt;br /&gt;Mother and sons are doing well.&lt;br /&gt;And yes, the name Nils was inspired by Linus Torvald's father :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-1116918830611338789?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/1116918830611338789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=1116918830611338789' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1116918830611338789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1116918830611338789'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/08/we-welcome-nils-and-arne.html' title='We welcome Nils and Arne'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_6Mp7nHbR5E8/RtPQQ4bIkhI/AAAAAAAAAAc/1_wWSDKadCU/s72-c/IMG_0625.JPG' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8181054326809910816</id><published>2007-08-20T20:45:00.000+02:00</published><updated>2007-08-20T21:00:56.649+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Installing sun-java 6u2 the Debian way on Ubuntu Dapper</title><content type='html'>Even though the recent changes in Sun's licensing, for distributing the jdk as a package, allows Ubuntu to provide prepackaged jdk's, I couldn't find a package for my Dapper install. On the dutch Ubuntu forums there was someone asking for a package for jdk 6u2, so I decided to give him a hand. This is the procedure that will work on Dapper, Edgy and Feisty:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;tt&gt;sudo apt-get install java-package&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;now edit: &lt;tt&gt;gksudo gedit /usr/share/java-package/sun-j2sdk.sh&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;search this section:&lt;pre&gt;&lt;br /&gt; &lt;span style=" color: #FF00FF;"&gt;&amp;#034;jdk-1_5_0_&amp;#034;&lt;/span&gt;&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;[&lt;/span&gt;0-9&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;][&lt;/span&gt;0-9&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;]&lt;/span&gt;&lt;span style=" color: #FF00FF;"&gt;&amp;#034;-linux-i586.bin&amp;#034;&lt;/span&gt;&lt;span style=" color: #2E8B57; font-weight: bold;"&gt;)&lt;/span&gt; &lt;span style=" color: #0000FF;"&gt;# SUPPORTED&lt;br /&gt;&lt;/span&gt;     &lt;span style=" color: #008B8B;"&gt;j2se_version=&lt;/span&gt;1&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;.&lt;/span&gt;5&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;.&lt;/span&gt;0+update&lt;span style=" color: #6A5ACD;"&gt;${archive_name&lt;/span&gt;&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;:&lt;/span&gt;10&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;:&lt;/span&gt;2&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span style=" color: #008B8B;"&gt;j2se_expected_min_size=&lt;/span&gt;130&lt;br /&gt;     &lt;span style=" color: #008B8B;"&gt;found=&lt;/span&gt;true&lt;br /&gt;     &lt;span style=" color: #2E8B57; font-weight: bold;"&gt;;;&lt;/span&gt;&lt;br /&gt;      &lt;span style=" color: #A52A2A; font-weight: bold;"&gt;esac&lt;/span&gt;&lt;br /&gt;      &lt;span style=" color: #2E8B57; font-weight: bold;"&gt;;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;make it look like this:&lt;pre&gt;&lt;br /&gt; &lt;span style=" color: #FF00FF;"&gt;&amp;#034;jdk-1_5_0_&amp;#034;&lt;/span&gt;&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;[&lt;/span&gt;0-9&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;][&lt;/span&gt;0-9&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;]&lt;/span&gt;&lt;span style=" color: #FF00FF;"&gt;&amp;#034;-linux-i586.bin&amp;#034;&lt;/span&gt;&lt;span style=" color: #2E8B57; font-weight: bold;"&gt;)&lt;/span&gt; &lt;span style=" color: #0000FF;"&gt;# SUPPORTED&lt;br /&gt;&lt;/span&gt;     &lt;span style=" color: #008B8B;"&gt;j2se_version=&lt;/span&gt;1&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;.&lt;/span&gt;5&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;.&lt;/span&gt;0+update&lt;span style=" color: #6A5ACD;"&gt;${archive_name&lt;/span&gt;&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;:&lt;/span&gt;10&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;:&lt;/span&gt;2&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span style=" color: #008B8B;"&gt;j2se_expected_min_size=&lt;/span&gt;130&lt;br /&gt;     &lt;span style=" color: #008B8B;"&gt;found=&lt;/span&gt;true&lt;br /&gt;     &lt;span style=" color: #2E8B57; font-weight: bold;"&gt;;;&lt;/span&gt;&lt;br /&gt; &lt;span style=" color: #FF00FF;"&gt;&amp;#034;jdk-6u&amp;#034;&lt;/span&gt;&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;[&lt;/span&gt;0-9&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;]&lt;/span&gt;&lt;span style=" color: #FF00FF;"&gt;&amp;#034;-linux-i586.bin&amp;#034;&lt;/span&gt;&lt;span style=" color: #2E8B57; font-weight: bold;"&gt;)&lt;/span&gt; &lt;span style=" color: #0000FF;"&gt;# SUPPORTED&lt;br /&gt;&lt;/span&gt;     &lt;span style=" color: #008B8B;"&gt;j2se_version=&lt;/span&gt;1&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;.&lt;/span&gt;6&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;.&lt;/span&gt;0+update&lt;span style=" color: #6A5ACD;"&gt;${archive_name&lt;/span&gt;&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;:&lt;/span&gt;6&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;:&lt;/span&gt;1&lt;span style=" color: #A52A2A; font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span style=" color: #008B8B;"&gt;j2se_expected_min_size=&lt;/span&gt;58&lt;br /&gt;     &lt;span style=" color: #008B8B;"&gt;found=&lt;/span&gt;true&lt;br /&gt;     &lt;span style=" color: #2E8B57; font-weight: bold;"&gt;;;&lt;/span&gt;&lt;br /&gt;      &lt;span style=" color: #A52A2A; font-weight: bold;"&gt;esac&lt;/span&gt;&lt;br /&gt;      &lt;span style=" color: #2E8B57; font-weight: bold;"&gt;;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;copy: &lt;tt&gt;sudo cp -r /usr/share/java-package/sun-j2sdk1.5 /usr/share/java-package/sun-j2sdk1.6&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;edit: &lt;tt&gt;gksudo gedit /usr/share/java-package/sun-j2sdk1.6/install&lt;/tt&gt; and replace j2sdk1.5-sun by j2sdk1.6-sun&lt;/li&gt;&lt;br /&gt;&lt;li&gt;edit: &lt;tt&gt;gksudo gedit /usr/share/java-package/sun-j2sdk1.6/remove&lt;/tt&gt; and replace j2sdk1.5-sun by j2sdk1.6-sun&lt;/li&gt;&lt;br /&gt;&lt;li&gt;download: &lt;tt&gt;jdk-6u2-linux-i586.bin&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;execute install: &lt;tt&gt;fakeroot make-jpkg ./jdk-6u2-linux-i586.bin&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;this results in a .deb that you can install using &lt;tt&gt;sudo dpkg -i ./sun-j2sdk1.6_1.6.0+update2_i386.deb&lt;/tt&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Voila.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8181054326809910816?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8181054326809910816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8181054326809910816' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8181054326809910816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8181054326809910816'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/08/linux-installing-sun-java-6u2-debian.html' title='Linux: Installing sun-java 6u2 the Debian way on Ubuntu Dapper'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-6379742401579005701</id><published>2007-08-20T20:23:00.000+02:00</published><updated>2007-08-20T20:44:45.047+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Upgrading Debian</title><content type='html'>In one of my last &lt;a href="http://kennywest.blogspot.com/2006/11/linux-upgrading-debian-woes-1.html"&gt;posts&lt;/a&gt; the other year I was complaining about my struggle fixing Debian after performing an upgrade while following the "testing" branch. Seems all the hassle I've been through, finally paid of. My upgrade to "etch" has been a very smooth transition.&lt;br /&gt;Since I was feeling adventurous, I decided to upgrade my vanilla kernel as well. The machine was running a vanilla 2.6.15.4 kernel which was becoming a little outdated. So I decided to take my chance compiling the most recent 2.6.22.3 kernel. Configuring and compiling was easy, but after a necessary reboot, iptables NAT and masquerading seemed b0rken. After googling a little bit, I discovered that the Netfilter people did a bit of refactoring in the modules and options necessary for NAT and masquerading. After enabling&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;     -&gt; Networking&lt;br /&gt;       -&gt; Networking support (NET [=y])&lt;br /&gt;         -&gt; Networking options&lt;br /&gt;           -&gt; Network packet filtering framework (Netfilter) (NETFILTER&lt;br /&gt;             -&gt; Core Netfilter Configuration&lt;br /&gt;             NF_CONNTRACK_ENABLED = [m]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;the CONFIG_NF_NAT option appeared underneath "IP: Netfilter Configuration". After a 3rd compile and install, I've managed to get the configuration right and I am now running Debian Etch on a vanilla 2.6.22.3 kernel.&lt;br /&gt;I guess it's nothing to be proud of ... but I am :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-6379742401579005701?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/6379742401579005701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=6379742401579005701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6379742401579005701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6379742401579005701'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/08/linux-upgrading-debian.html' title='Linux: Upgrading Debian'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-9167909317194940863</id><published>2007-04-27T11:26:00.000+02:00</published><updated>2007-04-27T11:30:26.117+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>Belgium Cityparade 2007 (2)</title><content type='html'>OMFG, I just visited the &lt;a href="http://www.cityparade.be"&gt;site&lt;/a&gt; again and seems the date moved to September 8th. If you're following this blog, you can read that my girlfriend is expecting delivery of our twins the same date. Guess I won't be visiting the parade this year ... or lets pray for an early delivery somewhere in the middle of august ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-9167909317194940863?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/9167909317194940863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=9167909317194940863' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/9167909317194940863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/9167909317194940863'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/04/belgium-cityparade-2007-2.html' title='Belgium Cityparade 2007 (2)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-3369130373389260280</id><published>2007-04-25T20:20:00.000+02:00</published><updated>2007-04-25T20:40:42.072+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>pam_ccreds howto</title><content type='html'>This document is largely inspired by &lt;a href="https://help.ubuntu.com/community/PamCcredsHowto"&gt;this&lt;/a&gt; link. The configuration contains a few flaws however and is not working for Ubuntu Edgy.&lt;br /&gt;&lt;ol&gt;&lt;li&gt; First we need to install nss-updatedb:&lt;pre&gt;&lt;br /&gt;sudo apt-get install nss-updatedb&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Make sure to update &lt;tt&gt;/etc/nsswitch.conf&lt;/tt&gt;:&lt;pre&gt;&lt;br /&gt;passwd:         compat ldap [NOTFOUND=return] db&lt;br /&gt;group:          compat ldap [NOTFOUND=return] db&lt;br /&gt;shadow:         compat ldap&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Populate the cache by issuing:&lt;pre&gt;&lt;br /&gt;sudo nss_updatedb ldap&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make sure nss-ldap doesn't search for the LDAP forever. Update &lt;tt&gt;/etc/libnss-ldap.conf&lt;/tt&gt;:&lt;pre&gt;&lt;br /&gt;bind_policy hard&lt;br /&gt;nss_reconnect_tries 1&lt;br /&gt;nss_reconnect_sleeptime 1&lt;br /&gt;nss_reconnect_maxsleeptime 8&lt;br /&gt;nss_reconnect_maxconntries 2&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Check if this worked by unplugging the network and typing the following command:&lt;pre&gt;&lt;br /&gt;getent passwd&lt;/pre&gt;&lt;br /&gt;Be warned, this might take some time.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now, install libnss-db and libpam-ccreds:&lt;pre&gt;&lt;br /&gt;sudo apt-get install libnss-db libpam-ccreds&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Update &lt;tt&gt;/etc/pam.d/common-auth&lt;/tt&gt;:&lt;pre&gt;&lt;br /&gt;auth sufficient pam_unix.so&lt;br /&gt;auth [authinfo_unavail=ignore success=1 default=die] pam_ldap.so use_first_pass&lt;br /&gt;auth [default=done] pam_ccreds.so action=validate use_first_pass&lt;br /&gt;auth [default=done] pam_ccreds.so action=store use_first_pass&lt;br /&gt;auth [default=done] pam_ccreds.so action=update use_first_pass&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Update &lt;tt&gt;/etc/pam.d/common-account&lt;/tt&gt;:&lt;pre&gt;&lt;br /&gt;account sufficient pam_unix.so nullok_secure&lt;br /&gt;account sufficient pam_ldap.so&lt;br /&gt;account required pam_permit.so&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finally you must login while connected to the LDAP server once to make libpam-ccreds store your password. After that you will be able to login while not connected to the ldap server as usual.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Done ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-3369130373389260280?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/3369130373389260280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=3369130373389260280' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3369130373389260280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/3369130373389260280'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/04/pamccreds-howto.html' title='pam_ccreds howto'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4345291048978239910</id><published>2007-04-16T19:40:00.000+02:00</published><updated>2007-04-16T19:50:02.963+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Suspect flees Spanish extradition in dramatic prison escape</title><content type='html'>&lt;a href="http://www.fox.com/prisonbreak/"&gt;Prison Break&lt;/a&gt; has become a quite popular series here in Belgium. It shows how some dude is helping his brother to escape by tattooing the prison's blueprints on his body, along with some secret messages.&lt;br /&gt;Now, here in Belgium, we think that way of escaping is very oldskool and way too complicated. We just hijack a helicopter and airlift the guy from the prison's court. You don't believe it, read this &lt;a href="http://www.typicallyspanish.com/news/publish/article_9932.shtml"&gt;link&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4345291048978239910?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4345291048978239910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4345291048978239910' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4345291048978239910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4345291048978239910'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/04/suspect-flees-spanish-extradition-in.html' title='Suspect flees Spanish extradition in dramatic prison escape'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-8746378444278697208</id><published>2007-04-16T10:11:00.000+02:00</published><updated>2007-04-16T10:23:41.983+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><title type='text'>Belgium Cityparade 2007</title><content type='html'>After a long time of uncertainty whether the Cityparade was going to be held this year or not, I found the releaving answer on the &lt;a href="http://www.cityparade.be"&gt;site&lt;/a&gt; today.&lt;br /&gt;&lt;img src="http://www.cityparade.be/cityparade07.png" width="590"/&gt;&lt;br /&gt;It remains uncertain, however, which city will be hosting the parade this year. The other year it has been hosted by Charleroi. The year before that, the parade was hosted by Luik. Both cities are located in the French speaking part of Belgium. So, as tradition prescribes, it should be hosted by a city in Flanders.&lt;br /&gt;I don't care really. For the past six years it has always been fun, fun, fun.&lt;br /&gt;Be there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-8746378444278697208?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/8746378444278697208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=8746378444278697208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8746378444278697208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/8746378444278697208'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/04/belgium-cityparade-2007.html' title='Belgium Cityparade 2007'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-7215802315164872569</id><published>2007-04-14T12:49:00.000+02:00</published><updated>2007-04-14T13:03:28.615+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>So we got pregnant</title><content type='html'>The title says it all. Below is an ultrasound taken march 25th.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_6Mp7nHbR5E8/RiCytoNbV3I/AAAAAAAAAAM/mjXm2IHsFvU/s1600-h/IMG_0188.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_6Mp7nHbR5E8/RiCytoNbV3I/AAAAAAAAAAM/mjXm2IHsFvU/s320/IMG_0188.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5053235278867289970" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see, we're expecting twins ;)&lt;br /&gt;The babies are due near september 8th. I'll keep you posted ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-7215802315164872569?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/7215802315164872569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=7215802315164872569' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7215802315164872569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/7215802315164872569'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/04/so-we-got-pregnant.html' title='So we got pregnant'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_6Mp7nHbR5E8/RiCytoNbV3I/AAAAAAAAAAM/mjXm2IHsFvU/s72-c/IMG_0188.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5878071345093253690</id><published>2007-04-04T18:23:00.000+02:00</published><updated>2007-04-04T18:36:31.738+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Getting synchronized</title><content type='html'>I'm sure many of you have encountered the same problem I was facing. I have a portable provided by my employer, but the employer does not provide any means of making backups of this portable. I know, he should, but hey, nobody's perfect.&lt;br /&gt;In the past 6 years I've been working for several clients, gathering a lot of data (code, documents, presentations, you name it). The past 2 years I've been doing some Biztalk work as well, working with virtual machines. Using virtual machines is ideal when doing Biztalk work. No need to pollute your perfectly running portable with Biztalk Server 2004 and visual studio. Working with virtual machines also enables me to work with different versions of Biztalk Server.&lt;br /&gt;An unpleasant side effect of using virtual machines is that they tend to take a lot of space on your hard drive and you'll need at least 1,5 GB of memory in your machine.&lt;br /&gt;As a result, I gathered 30 GB worth of data and virtual machines and I wanted to synchronize this with my recently purchased &lt;a href="http://www.wdc.com/en/products/products.asp?driveid=242&amp;language=en"&gt;My Book&lt;/a&gt;. In the past years I've used several "free" tools for this (robocopy, rsync, ...) but none of them were satisfiable. Today I came across &lt;a href="http://dimio.altervista.org/eng/"&gt;DSynchronize&lt;/a&gt;. This small, free tool has no problems with sync'ing my portable's hard drive with an external drive. And it is doing it fast as well.&lt;br /&gt;I love it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5878071345093253690?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5878071345093253690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5878071345093253690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5878071345093253690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5878071345093253690'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/04/getting-synchronized.html' title='Getting synchronized'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-127297409058761338</id><published>2007-03-27T11:02:00.000+02:00</published><updated>2007-03-27T11:07:06.520+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>Creating multithreaded tests for JUnit</title><content type='html'>Sometimes (I hope) you discover code you've written that was not as thread safe as you thought it was. Testing this can be quite a painful experience. I just found &lt;a href="http://www.javaworld.com/jw-12-2000/jw-1221-junit.html"&gt;this&lt;/a&gt; article on Java World describing ways to create JUnit tests in a multithreaded environment. Looking at the date it was published, the article is quite old, so I was wondering if maybe there are better techniques than those described in the article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-127297409058761338?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/127297409058761338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=127297409058761338' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/127297409058761338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/127297409058761338'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/03/creating-multithreaded-tests-for-junit.html' title='Creating multithreaded tests for JUnit'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-6367857625537942241</id><published>2007-03-26T15:21:00.000+02:00</published><updated>2007-03-26T15:29:48.609+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Remove copy protection from PDF documents</title><content type='html'>This is probably illegal, so use it at your own risk.&lt;br /&gt;Some PDFs on the internet have a copy protection to make sure you cannot copy-paste any content from the PDF into a document you're writing. To circumvent this protection there are several tools available on the internet. I haven't tried any of them, because they're not free ;)&lt;br /&gt;There is however a procedure that will enable you to circumvent the copy protection using free tools. The trick is to convert the PDF to a PS (PostScript) document first and then convert it back into a PDF.&lt;br /&gt;So, download Ghostview en Ghostscript from: &lt;a href="http://www.cs.wisc.edu/~ghost/"&gt;http://www.cs.wisc.edu/~ghost/&lt;/a&gt;.&lt;br /&gt;Next, open your PDF in Ghostview.&lt;br /&gt;Next, from the "File" menu, select "Convert" (a dialog will pop up)&lt;br /&gt;Press "Ok"&lt;br /&gt;Fill in the name of the "converted" file.&lt;br /&gt;Press "Save"&lt;br /&gt;Tada, you can now copy content from your newly created PDF ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-6367857625537942241?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/6367857625537942241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=6367857625537942241' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6367857625537942241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/6367857625537942241'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/03/remove-copy-protection-from-pdf.html' title='Remove copy protection from PDF documents'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-1616342541066456730</id><published>2007-02-20T19:18:00.000+01:00</published><updated>2007-02-20T19:25:18.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mule'/><category scheme='http://www.blogger.com/atom/ns#' term='ESB'/><title type='text'>Don't be a dumb-ass, get Mule</title><content type='html'>For those of you not familiar with ESB, where have you been the past years ;)&lt;br /&gt;For those of you not familiar with Mule, please point your browser to &lt;a href="http://www.getmule.com"&gt;http://www.getmule.com&lt;/a&gt;. The following is taken verbatim from one of the &lt;span style="font-style:italic;"&gt;Mule despots&lt;/span&gt; on the mule-user mailing list:&lt;br /&gt;&lt;blockquote&gt;Included are different ways that those not already in the Mule community can learn more -- including a flash movie with Ross Mason talking about basic Mule design principles, a RedMonk (IT analyst firm) survey on open source ESBs, and even a quick integration survey that they can take (in exchange for a Mule t-shirt).&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-1616342541066456730?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/1616342541066456730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=1616342541066456730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1616342541066456730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1616342541066456730'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/02/dont-be-dumb-ass-get-mule.html' title='Don&apos;t be a dumb-ass, get Mule'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-5201213629836862166</id><published>2007-01-18T22:08:00.000+01:00</published><updated>2007-01-18T22:17:14.087+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Sun ships Solaris 10 DVDs ... for free!</title><content type='html'>For those of you interested in exploring the goodies of Sun OS, Sun is shipping DVDs for &lt;a href="http://www2.sun.de/dc/forms/reg_us_2211_391.jsp"&gt;free&lt;/a&gt;. I came across this link _after_ downloading the whole CD set. Bummer :(&lt;br /&gt;I needed the CDs anyway because my Enterprise 450 does not have a DVD reader. Below are some images from Sun's site ... in case you're interested how this machine looks like.&lt;br /&gt;&lt;img src="http://sunsolve.sun.com/handbook_pub/Systems/E450/images/E450_frontflow.jpg" width="288" height="288"&gt;&lt;img src="http://sunsolve.sun.com/handbook_pub/Systems/E450/images/E450_rearflow.jpg" width="288" height="288"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-5201213629836862166?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/5201213629836862166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=5201213629836862166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5201213629836862166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/5201213629836862166'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/01/sun-ships-solaris-10-dvds-for-free.html' title='Sun ships Solaris 10 DVDs ... for free!'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-2024287883476367073</id><published>2007-01-17T20:02:00.000+01:00</published><updated>2007-01-17T20:05:02.556+01:00</updated><title type='text'>Willy's en Marjetten moet blijven</title><content type='html'>Voor de Belgen onder ons die het jammer vinden dat Willy's en Marjetten vroegtijdig werd afgevoerd wegens te weinig kijkcijfers. Teken &lt;a href="http://www.petitiononline.com/marwilly/petition.html"&gt;hier&lt;/a&gt; en dan bent u okidokipianissimoki ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-2024287883476367073?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/2024287883476367073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=2024287883476367073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2024287883476367073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/2024287883476367073'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/01/willys-en-marjetten-moet-blijven.html' title='Willy&apos;s en Marjetten moet blijven'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-1220699245422714548</id><published>2007-01-14T10:08:00.000+01:00</published><updated>2007-01-14T10:34:06.280+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Fix Your Own Printer</title><content type='html'>I own 2 laserjet printers. One old LJ 1100 and another very old LJ 5L. The first one was priced over 400€ when I bought it 7 years ago. The 5L was "donated" since it was suffering the famous paper jam problem. After 7 years of usage, the 1100 was suffering the paper jam problem as well. You can find a lot of people on different forums describing the same problem. It seems that there was a time that HP was replacing the separation pad and pickup roller (which are the components causing this problem) of the LJ 1100 for free. Those times are gone :(&lt;br /&gt;So I surfed to http://www.fixyourownprinter.com/kits/hp and ordered:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1 HP LaserJet 5L/6L Multiple-Sheet/No Feed Paper Jam Repair Kit&lt;br /&gt;&lt;/li&gt;&lt;li&gt;1 HP LaserJet 1100 Multiple Sheet Feed Paper Jam Repair Kit&lt;/li&gt;&lt;/ul&gt;The 2 kits arrived the other day and I was very keen fixing both printers (even though I only need one).&lt;br /&gt;The kit for the 5L comes with a new separation pad (whole assembly) and a new pickup roller. It also includes a video (on CD) showing how to replace the old parts. Very cool and easy to follow.&lt;br /&gt;&lt;br /&gt;The kit for the 1100 comes with some instructions and pictures on a sheet of paper and a new separation pad which is only a rubber sticker. If you follow the instructions you will find it very hard to replace the separation pad. It's easier to disassemble the whole thing following these instructions I found somewhere on some forum:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open the printer cover and remove the Toner cartridge.&lt;/li&gt;&lt;li&gt;Remove the two screws holding the Pick Up Roller assembly. Slide it to the right to take it out. Replace Pick Up Roller with a new one. Please pay attention to the orientation of the Pick Up roller and set it aside.&lt;/li&gt;&lt;li&gt;Remove the two screws at the back of the printer.&lt;/li&gt;&lt;li&gt;Open the little back door at the bottom on the back. Remove that screw too.&lt;/li&gt;&lt;li&gt;Open the front door and remove the two screws on the top.&lt;/li&gt;&lt;li&gt;Remove the two side stand pieces. Use a screw driver to push the two latches out to remove them.&lt;/li&gt;&lt;li&gt;Unlatch the back cover from the two latches on each side and lift it upward to remove it.&lt;/li&gt;&lt;li&gt;Pull the paper guide upward to remove it.&lt;/li&gt;&lt;li&gt;Use a small flathead screw driver and gently slide the Left side of the kick plate out to loose it out.&lt;/li&gt;&lt;li&gt;Lift the kick plate up till you could remove it.&lt;/li&gt;&lt;li&gt;Unlatch the separation pad clip from the back and lift it up.&lt;/li&gt;&lt;li&gt;Replace it with the new one.&lt;/li&gt;&lt;li&gt;Do everything in reverse order.&lt;/li&gt;&lt;/ol&gt;Whilst disassembling and assembling I used the vacuum cleaner and a wet cloth to do some internal cleaning.&lt;br /&gt;Whatever you do, and this applies for both kits, take your time, don't rush things or you might break something or miss a part.&lt;br /&gt;Anyway, both kits fixed the paper jam problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-1220699245422714548?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/1220699245422714548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=1220699245422714548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1220699245422714548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/1220699245422714548'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/01/fix-your-own-printer.html' title='Fix Your Own Printer'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-4661516139771761845</id><published>2007-01-12T11:34:00.000+01:00</published><updated>2007-01-12T11:36:21.606+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Move to new version of Blogger</title><content type='html'>So I decided to upgrade my blog to the latest version of Blogger. As you can see, the template changed. Nothing fancy though ;)&lt;br /&gt;Hope you like it (should there be anyone out ther reading this blog).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-4661516139771761845?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/4661516139771761845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=4661516139771761845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4661516139771761845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/4661516139771761845'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2007/01/move-to-new-version-of-blogger.html' title='Move to new version of Blogger'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-116481735687172359</id><published>2006-11-29T17:22:00.000+01:00</published><updated>2007-01-12T11:32:16.066+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>Development: Empty strings in Oracle and MySQL</title><content type='html'>Today I was testing some code I've written, on a client's QA environment. These tests revealed, that if your tests succeed locally on a MySQL server environment this doesn't necessarily mean the tests will succeed on an Oracle server. I was having problems with Oracle's interpretation of an &lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=1536505"&gt;empty&lt;/a&gt; string. It seems that if you're executing the following statement:&lt;pre&gt;&lt;br /&gt;insert into MyTable (c1,c2) values ('val1','');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;this is the same as executing:&lt;pre&gt;&lt;br /&gt;insert into MyTable (c1,c2) values ('val1',null);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;IMHO this is plain wrong. '' does not equal NULL from a programmer's point of view.&lt;br /&gt;Inserting an empty string (or &lt;tt&gt;''&lt;/tt&gt;) can be convenient to make your prepared statements easier.&lt;br /&gt;Suppose, in the above example, &lt;tt&gt;c2&lt;/tt&gt; is an optional parameter. When c2 is not available you insert &lt;tt&gt;''&lt;/tt&gt;. In this case a prepared statement to select records from MyTable could be:&lt;pre&gt;&lt;br /&gt;select * from MyTable where c1 = ? and c2 = ?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After substitution the resulting statement for MySQL will be:&lt;pre&gt;&lt;br /&gt;select * from MyTable where c1 = 'example' and c2 = ''&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And for Oracle:&lt;pre&gt;&lt;br /&gt;select * from MyTable where c1 = 'example' and c2 = null&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Which is wrong.&lt;br /&gt;So, if Oracle replaces my empty string with null, the prepared statement should be:&lt;pre&gt;&lt;br /&gt;select * from MyTable where c1 = ? and coalesce(c2,'dontcare') = coalesce(?,'dontcare')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(please see also this &lt;a href="http://www.thescripts.com/forum/thread81525.html"&gt;link&lt;/a&gt;)&lt;br /&gt;This works for both MySQL and Oracle ... of course.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-116481735687172359?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/116481735687172359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=116481735687172359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116481735687172359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116481735687172359'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/11/development-empty-strings-in-oracle.html' title='Development: Empty strings in Oracle and MySQL'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-116344200629658666</id><published>2006-11-13T18:58:00.000+01:00</published><updated>2007-11-09T18:12:47.058+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Fixing authentication in Apache 2, after doing an upgrade</title><content type='html'>This is the second post on upgrading my Debian box to testing. Obviously everything was b0rken, even authentication mechanisms put in place for Apache2. Apache2 is using the local LDAP server for authenticating users on a subversion repository. Apparently, the people of Apache did some "refactoring" on the naming of their authentication modules. They renamed &lt;tt&gt;auth_ldap&lt;/tt&gt; to &lt;tt&gt;authnz_ldap&lt;/tt&gt;. Enabling this module instead of the outdated on, did not do the trick. I got the following error instead:&lt;pre&gt;&lt;br /&gt;[Thu Nov 02 19:07:26 2006] [crit] [client] configuration error:  couldn't check user.  No user file?: /svn/configs/!svn/act/ed8028d3-8254-bd4c-bc94-c3b93f8b97bb&lt;br /&gt;[Thu Nov 02 19:07:44 2006] [crit] [client] configuration error:  couldn't check user.  No user file?: /svn/configs/!svn/act/b2296e68-a114-8e49-aea6-bebfe78947bf&lt;br /&gt;[Thu Nov 02 19:14:57 2006] [notice] caught SIGTERM, shutting down&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I did some more reading and found this presentation very useful: &lt;span style="font-style:italic;"&gt;TH21 - Using LDAP Authentication in Apache 2.2.ppt&lt;/span&gt; (I want to post a link, but the site seems down)&lt;br /&gt;After updating my config, authentication started working again. Here it is:&lt;pre&gt;&lt;br /&gt;&amp;lt;Location /svn/configs/&amp;gt;&lt;br /&gt;    &amp;lt;LimitExcept GET PROPFIND OPTIONS REPORT&amp;gt;&lt;br /&gt;        AuthType Basic&lt;br /&gt;        AuthName "svn"&lt;br /&gt;        AuthBasicProvider ldap&lt;br /&gt;        AuthLDAPURL ldap://localhost:389/ou=Users,dc=MyDomain?uid&lt;br /&gt;        AuthzLDAPAuthoritative off&lt;br /&gt;        require valid-user&lt;br /&gt;    &amp;lt;/LimitExcept&amp;gt;&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That wasn't that bad ... was it ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-116344200629658666?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/116344200629658666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=116344200629658666' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116344200629658666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116344200629658666'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/11/linux-fixing-authentication-in-apache.html' title='Linux: Fixing authentication in Apache 2, after doing an upgrade'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-116283125829380448</id><published>2006-11-06T17:37:00.000+01:00</published><updated>2006-11-06T17:40:58.306+01:00</updated><title type='text'>Development: Convert your code to html</title><content type='html'>If you want to cut and paste code into an html page, you will find the following tools very handy:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;For Visual Studio (2003/2005): &lt;a href="http://www.jtleigh.com/people/colin/software/CopySourceAsHtml/"&gt;Copy Source As Html&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;For Eclipse: &lt;a href="http://www.java2html.de/eclipse.html"&gt;Java 2 Html&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Makes blogging and publishing code easier ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-116283125829380448?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/116283125829380448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=116283125829380448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116283125829380448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116283125829380448'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/11/development-convert-your-code-to-html.html' title='Development: Convert your code to html'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-116271256381205821</id><published>2006-11-05T08:32:00.000+01:00</published><updated>2007-11-09T18:12:34.401+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><title type='text'>Linux: Upgrading Debian woes (1)</title><content type='html'>So I decided to give my server, running Debian testing, an upgrade. Normally this works like a breeze. I have never encountered any problems during an upgrade, even though I am following testing.&lt;br /&gt;This time was different and things were very b0rken. This is about fixing my first issue: LDAP + libnss + udev.&lt;br /&gt;&lt;br/&gt;&lt;span style="font-weight:bold;"&gt;LDAP&lt;/span&gt;&lt;br/&gt;&lt;br /&gt;During the upgrade, the script didn't manage to create a decent backup of the running LDAP server. This LDAP is serving users for my home network and is also the backend for my Samba domain controller. So the LDAP was very b0rken. The only fix I could see was repopulating the entire tree, starting from a fresh, empty LDAP. To help me with this, I found &lt;a href="http://aqua.subnet.at/~max/ldap"&gt;this&lt;/a&gt; a very interesting and thorough guide. Since the LDAP is also my Samba backend I am using smbldap-tools to maintain users and such. So repopulating the LDAP wasn't such a big task.&lt;br /&gt;Lucky.&lt;br /&gt;&lt;br/&gt;&lt;span style="font-weight:bold;"&gt;udev&lt;/span&gt;&lt;br/&gt;&lt;br /&gt;What is udev?&lt;span style="font-style:italic;"&gt;&lt;br /&gt;udev works entirely in userspace, using hotplug events the kernel sends whenever a device is added or removed from the kernel. Details about the devices are exported by the kernel to the sysfs filesystem at /sys All device naming policy permission control and event handling is done in userspace. devfs is operated from within the kernel.&lt;/span&gt; (&lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ"&gt;read&lt;/a&gt;).&lt;br /&gt;This thing is started way before my LDAP boots. Why? Because this thing is necessary to build the &lt;tt&gt;/dev&lt;/tt&gt; tree and modprobing drivers, such as drivers for my network card. So udev starts very early in the boot process looking for users and groups to assign. E.g. &lt;tt&gt;/dev/audio&lt;/tt&gt; is assigned to the audio group.&lt;br /&gt;If a user or group is not found local, it tries to search the LDAP, which is ... not there. Before the upgrade udev tried a few times to reach the LDAP, and finally gave up. Now it didn't. It just kept trying to reach the damn LDAP. &lt;a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=375077"&gt;This link&lt;/a&gt; describes the problem I was having (bug #375077). The solution to this problem was to change the bind_policy so it only tries to reach the LDAP 3 times (or less if you want):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;bind_policy hard&lt;br /&gt;nss_reconnect_tries 3&lt;br /&gt;nss_reconnect_sleeptime 1&lt;br /&gt;nss_reconnect_maxconntries 3 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;span style="font-weight:bold;"&gt;Libnss&lt;/span&gt;&lt;br/&gt;&lt;br /&gt;After messing around a little, I suddenly got the following error:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ldap-nss.c:1323: do_init: Assertion `cfg-&gt;ldc_uris[__session.ls_current_uri] != ((void *)0)' failed.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now that's what I call a decent error ;) This happened when trying to log in with a user known in the LDAP, but not on the system. After pulling my hair a little and googling a while, I discovered I accidentally messed up the libnss-ldap.conf. This configuration file is necessary for the name switch service to be able to access the ldap. This file contains the root DN and credentials to access/search the LDAP. Therefore this file should be:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;readable by everyone;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;or readable by root only, but then you'll need the nscd (name switch caching daemon).&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Since I must be able to add and change users on this particular machine, the file contains administrator credentials and is readable for root only. So I need the nscd running which was throwing the above error while asking the name switch service for a user existing in the LDAP. Reverting the libnss-ldap.conf to its original state solved my problems. If you store your &lt;tt&gt;/etc&lt;/tt&gt; in a subversion repository, this is easy ;)&lt;br /&gt;In a next post I will be discussing my next problem: "Fixing authentication in Apache 2, after doing an upgrade"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-116271256381205821?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/116271256381205821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=116271256381205821' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116271256381205821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116271256381205821'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/11/linux-upgrading-debian-woes-1.html' title='Linux: Upgrading Debian woes (1)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-116102524938845568</id><published>2006-10-16T20:46:00.000+02:00</published><updated>2006-10-16T21:00:49.410+02:00</updated><title type='text'>Linux: Problems in Ubuntu, icons do not appear when inserting removable device 2 (the solution!)</title><content type='html'>Seems I was still having problems with devices not being automounted. Very frustrating knowing "it should" automount plugged in devices ... but it just doesn't. So tonight I decided to google some more and finally I found the solution. I had to put&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;session optional pam_foreground.so&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Near the end of &lt;tt&gt;/etc/pam.d/common-session&lt;/tt&gt;. Since I am authenticating users against an LDAP, I have a sneaky suspicion why my problem occured:&lt;br /&gt;- step 1. Installed Hoary a long time ago&lt;br /&gt;- step 2. Make sure Hoary is able to talk to an LDAP to retrieve its users&lt;br /&gt;- step 3. Upgrade to Breezy (also long time ago). During the upgrade the installer asks: "Dude! someone changed &lt;tt&gt;/etc/pam.d/common.session&lt;/tt&gt; do you want to overwrite the file with the maintainer's version?" Hell no ... I spent a reasonable amount of time configuring &lt;tt&gt;pam.d&lt;/tt&gt; to use &lt;tt&gt;pam_ldap&lt;/tt&gt; (btw: &lt;a href="http://aqua.subnet.at/~max/ldap/"&gt;this&lt;/a&gt; is an interesting read on how to setup LDAP and stuff) ... and that's when all my problems started.&lt;br /&gt;- step 4. Upgrade to Dapper ... still b0rken but now I finally managed to fix it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-116102524938845568?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/116102524938845568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=116102524938845568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116102524938845568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/116102524938845568'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/10/linux-problems-in-ubuntu-icons-do-not.html' title='Linux: Problems in Ubuntu, icons do not appear when inserting removable device 2 (the solution!)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-115461946043116602</id><published>2006-08-03T17:24:00.000+02:00</published><updated>2006-08-03T17:37:40.476+02:00</updated><title type='text'>Solaris: Change action behind browser icon in CDE</title><content type='html'>So I inherited a Sun Enterprise 450, dual CPU, 2GB RAM and a dozen of disks. I’ve been busy wiping disks on this machine and on another Sun Enterprise 250 using this &lt;a href="http://www.sun.com/blueprints/0600/scrub.pdf"&gt;link&lt;/a&gt;. Next, I’ve been installing Solaris 10, which was a pretty “next -&gt; next -&gt; finish” install. I’m not running Gnome, because I just love the CDE environment (don’t ask why, I’m a geek). I decided not to install the mozilla browser provided with the set of installation CD-ROMs, instead I used the software service from &lt;a href="http://www.blastwave.org/"&gt;blastwave&lt;/a&gt; to install firefox. It wasn’t very easy to make CDE look for firefox instead of mozilla, when pressing the “world” icon in the front panel. Ok, I admit, after Reading The Funky Advanced CDE Guide, I found all I needed to do is to tweak &lt;tt&gt;sdtwebclient&lt;/tt&gt; file, found in &lt;tt&gt;/usr/dt/bin&lt;/tt&gt;. Change the follwing lines:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;PATH=/usr/bin:${PATH}:/usr/sfw/bin:/opt/NSCPcom&lt;br /&gt;COMMAND=`basename $0`&lt;br /&gt;DEFAULT_BROWSER_LIST="mozilla netscape sun_netscape netscape6"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;PATH=/usr/bin:${PATH}:/usr/sfw/bin:/opt/NSCPcom:/opt/csw/bin&lt;br /&gt;COMMAND=`basename $0`&lt;br /&gt;DEFAULT_BROWSER_LIST="mozilla netscape sun_netscape netscape6 firefox"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And firefox will appear when pressing the world icon.&lt;br /&gt;BTW, CDE rules ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-115461946043116602?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/115461946043116602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=115461946043116602' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/115461946043116602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/115461946043116602'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/08/solaris-change-action-behind-browser.html' title='Solaris: Change action behind browser icon in CDE'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-114102645411177067</id><published>2006-02-27T08:38:00.000+01:00</published><updated>2006-02-27T08:47:34.120+01:00</updated><title type='text'>Linux: Testing your iptables firewall</title><content type='html'>I have an old Pentium II running Debian Testing to protect my internal network from the Internet. Yesterday, I decided to test this firewall using a site that performs a portscan. I came accross &lt;a href="http://www.testmyfirewall.com/"&gt;http://www.testmyfirewall.com/&lt;/a&gt; that did exactly what I wanted. This site claimed my internal address (the address of the computer sitting behind the firewall) was exposed to the outside. Yeah, right. After some digging I came accross this &lt;a href="http://news.zelow.no/floppyfw/newsportal/article.php?id=14927&amp;group=floppyfw.general"&gt;post&lt;/a&gt; from a guy having the same "problem". It seems that &lt;i&gt;testmyfirewall&lt;/i&gt; starts an applet displaying the address of the computer running the applet, which is indeed the one sitting behind the firewall.&lt;br /&gt;So this site does not &lt;i&gt;test&lt;/i&gt; your firewall, it only tests your browser which is a different thing.&lt;br /&gt;Just be aware of sites that claim to test your firewall, they're not allways right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-114102645411177067?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/114102645411177067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=114102645411177067' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/114102645411177067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/114102645411177067'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/02/linux-testing-your-iptables-firewall.html' title='Linux: Testing your iptables firewall'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113984483112668549</id><published>2006-02-13T16:26:00.000+01:00</published><updated>2006-02-14T10:22:19.593+01:00</updated><title type='text'>Java: Extending classpath in Tomcat 5.5.x</title><content type='html'>According to the &lt;a href="http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html"&gt;documentation&lt;/a&gt; you can add locations/jars to your classpath using the CLASSPATH system variable in windows. I have discovered another way to do this. Just open the &lt;tt&gt;catalina.properties&lt;/tt&gt; file in the &lt;tt&gt;conf&lt;/tt&gt; directory. This should read:&lt;br /&gt;&lt;tt&gt;shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar&lt;/tt&gt;&lt;br /&gt;Changing the line to:&lt;br /&gt;&lt;tt&gt;shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar,c:/test/foo.jar&lt;/tt&gt;&lt;br /&gt;Will extend the shared classpath with &lt;tt&gt;foo.jar&lt;/tt&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113984483112668549?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113984483112668549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113984483112668549' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113984483112668549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113984483112668549'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/02/java-extending-classpath-in-tomcat-55x.html' title='Java: Extending classpath in Tomcat 5.5.x'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113950201438375945</id><published>2006-02-09T17:07:00.000+01:00</published><updated>2006-02-09T17:20:14.420+01:00</updated><title type='text'>Biztalk 2004: Issue you might encounter  when you refactor</title><content type='html'>So I decided to split a project that contained 4 orchestration. I now have&lt;br /&gt;- 1 project containing a receive pipeline&lt;br /&gt;- 4 other projects containing the orchestrations, referencing the above project&lt;br /&gt;Apart from splitting the project, I decided to clean up the namespaces for the schema’s and property schema files. “Easy enough”, I thought, “Edit the schemas and property schemas using notepad or some other XML editor and we’re done”. Better think again. When deploying the “split” DLLs I encountered the following error in our test environment:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;errors: &lt;br /&gt;Property "ns0:Something" &lt;br /&gt;(msgType="http://foo#bar ") &lt;br /&gt;not found in Configuration database.&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;The solution for this problem is not to edit your property schema files, but generate them again, if you’re refactoring namespaces or types. Reason for this is the fact that properties have their GUIDs and these have to be unique. Should you change the namespace and not the GUID for this property, uniqueness is not maintained.&lt;br /&gt;So, in short, refactoring Biztalk projects is a pain, better think twice (or more) before starting to implement ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113950201438375945?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113950201438375945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113950201438375945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113950201438375945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113950201438375945'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/02/biztalk-2004-issue-you-might-encounter.html' title='Biztalk 2004: Issue you might encounter  when you refactor'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113882626242604908</id><published>2006-02-01T21:26:00.000+01:00</published><updated>2006-02-14T10:23:18.343+01:00</updated><title type='text'>Linux: Problems in Ubuntu, icons do not appear when inserting removable device</title><content type='html'>In my setup, users on my Ubuntu box are authenticated against an LDAP running on Debian. This is working very nicely, but since I upgraded from Hoary to Breezy, my icons for auto-mounted removable devices were not showing any more. This is, of course, very annoying.&lt;br /&gt;After googling a bit, I came accross &lt;a href="http://bugzilla.ubuntu.com/show_bug.cgi?id=20237"&gt;this&lt;/a&gt; bug. But none of the suggestions worked for me.&lt;br /&gt;So I decided to create a real local user (i.e. a user not available in the LDAP) and see if this one still had the icons showing when auto-mounting happens. It did ;) So I guessed the local user was member of some local groups, my LDAP user wasn't member of. My guess was correct. Seems that the LDAP users have to be member of the local “users” group as well, which was the one I missed out. Below is the output of the id command for an LDAP user:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;uid=1002(ldapuser) gid=513(Domain Users) groups=24(cdrom),25(floppy),29(audio),46(plugdev),100(users),109(admin),513(Domain Users)&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113882626242604908?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113882626242604908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113882626242604908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113882626242604908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113882626242604908'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/02/linux-problems-in-ubuntu-icons-do-not.html' title='Linux: Problems in Ubuntu, icons do not appear when inserting removable device'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113708028291701305</id><published>2006-01-12T16:36:00.000+01:00</published><updated>2006-01-12T16:38:02.930+01:00</updated><title type='text'>Devlopment: Hungarian Notation Sucks ...</title><content type='html'>Don't you just hate people using the so called Hungarian Notation in their C#/Java code. Well, I do. &lt;a href="http://blogs.msdn.com/rick_schaut/archive/2004/02/14/73108.aspx"&gt;Here's&lt;/a&gt; an interesting read on this matter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113708028291701305?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113708028291701305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113708028291701305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113708028291701305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113708028291701305'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/01/devlopment-hungarian-notation-sucks.html' title='Devlopment: Hungarian Notation Sucks ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113679294106645307</id><published>2006-01-09T08:33:00.000+01:00</published><updated>2006-01-09T08:49:01.076+01:00</updated><title type='text'>Linux: New chapter in DGP</title><content type='html'>Dr. Salus is back from holiday and released a new chapter in his series on "The Daemon, the GNU and the Penguin". Read it &lt;a href="http://www.groklaw.net/article.php?story=20060108115157662"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113679294106645307?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113679294106645307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113679294106645307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113679294106645307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113679294106645307'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2006/01/linux-new-chapter-in-dgp.html' title='Linux: New chapter in DGP'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113334821834615637</id><published>2005-11-30T11:53:00.000+01:00</published><updated>2005-11-30T11:56:58.356+01:00</updated><title type='text'>Biztalk 2004: Per-Instance pipeling - Tool</title><content type='html'>Just found this interesting &lt;a href="http://www.masteringbiztalk.com/blogs/jon/CommentView,guid,2f6500ae-d832-495f-92a3-f7032ef317ca.aspx"&gt;article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;For each pipeline (Receive Locations and Send Ports each have a Receive and Send Pipeline respectively, but if a port uses a Request-Response message exchange pattern it will also have a corresponding pipeline for the other direction, so the Receive Port will have a Send Pipeline and the Send Port will have a Receive Pipeline) the configuration database holds another piece of configuration. In the ExplorerOM this can be found as the ReceivePipelineData (on the ReceiveLocation or SendPort object) or SendPipelineData (on the SendPort or ReceivePort object) property.&lt;br /&gt;&lt;br /&gt;This "data" is generally empty in most cases, but can be an XML document that overrides some or all of the properties of the components configured in the pipeline (note that the XML cannot add any addtional pipeline components)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113334821834615637?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113334821834615637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113334821834615637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113334821834615637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113334821834615637'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/11/biztalk-2004-per-instance-pipeling.html' title='Biztalk 2004: Per-Instance pipeling - Tool'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113293216939191012</id><published>2005-11-25T16:13:00.000+01:00</published><updated>2005-11-25T16:22:49.570+01:00</updated><title type='text'>Introduction ... better late than never ...</title><content type='html'>I've been running this blog for a few months now, without proper introduction. So now, I thougth, the time is ripe.&lt;br /&gt;My real name is Kenneth. I've been dragging the kennywest alias around since my first hotmail acount (which was also my first real e-mail address), which is why I used this alias for my blog as well.&lt;br /&gt;I'm a consultant implementing architectures/solutions for B2B and A2A scenario's. For the moment I am using Biztalk to do this. I've also used plain Java, Seebeyond's e*Gate and Crossworlds.&lt;br /&gt;Although I am working with Biztalk and .NET . I am not a, how should I put it, Microsoft supporter. I'm more into Open Source and Linux or UNIX.&lt;br /&gt;I first heard about linux 8 or 9 years ago. At that time we were doing labs on a DOS box telnetting to a Linux server to learn about a database called PostgreSQL. A friend of mine had a 6 CD box containing RedHat, SuSE and Slackware distros. He told me he'd installed it and loved it very much. I decided to take it for a spin. My first impression was rather average. I wasn't impressed about the stability. X crashed from time to time, maybe my hardware was a little flaky, who knows.&lt;br /&gt;About a year later I decided to buy RedHat 5.2 . Yes, at that time you'd still have to buy distros on CD. Internet was just becoming popular and I didn't have any money to spare on a dial-up or broadband connection. So I installed RedHat 5.2 . RedHat was pretty cool. I could do whatever I wanted. I was writing lab reports in StarOffice (which was included) and running Apache web server for browsing my own web site on my own box. Pretty stupid, I know, but at that time it seemed very nice. RedHat used fvwm2 as default window manager, but I didn't like it. It looked too much like Windows 95. I preferred Afterstep. Afterstep was highly configurable and I was messing in a lot of configuration files to make it look just how I wanted it to look.&lt;br /&gt;A few months later I decided to buy SuSE 6.0 . Now that was a total different distro. It was German ;) No, seriously, it was much easier to install and maintain than its RedHat predecessor. SuSE also packaged with 6 CDs containing a load of software. Since I didn't have any connection to the Internet, this was an ideal solution. SuSE used YAST to configure almost everything. YAST also had an option to “save” the list of packages installed on the system. If you used this feature you could reinstall a system quite fast using this saved list. I used SuSE 6.0 a lot. I also acquired an old 486DX4 computer to use it as a server. My main computer was running Windows 95 (or was it NT) and I used the Linux server for backups. You know how thrust worthy Windows was (still is) ;)&lt;br /&gt;A few years later (01/09/2000) I started working and got myself a broadband connection to the Internet. I was still using SuSE 6.0 which was becoming very outdated at that time. Upgrading to new versions of software, on the server, was hard to maintain. I had to download it from the net and compile it. I was also using a very outdated kernel (2.0.x I think) running an ipfwadm firewall to serve my internal network.&lt;br /&gt;Somewhere in 2001 I got fed up with SuSE. I was reading a lot about different distros and a lot of people where talking about Debian. Debian had a superior package manager called APT which made it easier to maintain. Some people claimed, however, it was not for the faint of heart to install. In the years I'd been using SuSE and RedHat I learned a lot and I thought I was not “faint of heart”.&lt;br /&gt;Installing Debian (potato at that time) was a revelation. It wasn't hard to install at all. I was very impressed with the APT tool. The stuff I read about the ease of updating and upgrading was indeed true. I kept the same machine (yes, the 486DX4)  running for almost 4 years, updating/dist-upgrading every now and then without ever reinstalling it.&lt;br /&gt;It was love at first sight.&lt;br /&gt;6 months ago I ditched the 486DX4 (he was becoming a bit flaky) and replaced it with a PII 266. I installed Debian on it, keeping the install base as small as possible. My main desktop, however, was still running Windows NT. The reason for this is I was merely using it to burn CDs and surfing the web. I also thought Debian was not suited as a desktop OS (but well suited as a server OS). I had bad experiences burning CDs on Linux, so I wasn't prepared replacing NT.&lt;br /&gt;Then I bought a new PC. The desktop was becoming very old, so I decided to invest in something new. It came preloaded with XP home. I hate XP home. It isn't even capable authenticating against a PDC I was running (Samba + LDAP). I'd had to buy the professional edition to do that.&lt;br /&gt;XP lasted about a week. Then it asked me to install updates/patches ... and that was the last time I saw it.&lt;br /&gt;I still read a lot about different distros. I was looking for something like Debian, but more desktop oriented. Sure, I know about compiling a kernel or other packages. But a desktop has to work out of the box, without a lot of customizing. So I read about Xandros and Libranet. I even used Libranet, but didn't like it. It seemed buggy. Xandros was superior, but it wasn't freely downloadable.&lt;br /&gt;And then I read about Ubuntu.&lt;br /&gt;Ubuntu is the thing I've been waiting for, for a long time. It installed like a breeze on my desktop and recognized almost every piece of hardware in my PC (a HP Pavilion 5080.be). It has everything a nice GUI distro like Mandrake or SuSE should have, but with the APT power of Debian. I'm in love ;)&lt;br /&gt;On forum people tend to argue from time to time about “the best distro” or “the best desktop”. Who cares. No, really. If you like SuSE, fine use it. If you like Ubuntu, then use Ubuntu. I like Ubuntu because it has a lot of Debian in it. And Debian is, from my point of view, far superior than any other distro out there. Sure, it's not as die hard as Gentoo or Slackware but I don't want to spend a week compiling before I get to use my desktop. Slackware is the oldest distro out there, but it doesn't have APT and I am not prepared to give this up.&lt;br /&gt;Anyway, this is my “Linux” story. I hope you enjoyed reading it.&lt;br /&gt;&lt;br /&gt;Enjoy life, enjoy Linux&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113293216939191012?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113293216939191012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113293216939191012' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113293216939191012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113293216939191012'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/11/introduction-better-late-than-never.html' title='Introduction ... better late than never ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-113204788588127802</id><published>2005-11-15T10:43:00.000+01:00</published><updated>2005-11-15T11:03:05.050+01:00</updated><title type='text'>Biztalk 2004: Mime revisited ...</title><content type='html'>I had to deploy a flow in production today that has been working fine for 2 months in our test environment. The flow receives a mail from an IIS maildrop folder, gets all attachments and sends them to an orchestration. Mails are in &lt;code&gt;.eml&lt;/code&gt; format which is actually a mime message following the &lt;a href="http://www.faqs.org/rfcs/rfc2557.html"&gt;RFC2557&lt;/a&gt; specification.&lt;br /&gt;Below you can find a sample file that enters Biztalk:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;From: a@a.com &lt;br /&gt;To: b@b.com&lt;br /&gt;Subject: hello world&lt;br /&gt;Date: Mon, 14 Nov 2005 23:31:17 -0000&lt;br /&gt;MIME-Version: 1.0&lt;br /&gt;Content-Type: multipart/mixed;&lt;br /&gt; boundary="----_=_NextPart_000_01C5E973.82A5C520"&lt;br /&gt;&lt;br /&gt;------_=_NextPart_000_01C5E973.82A5C520&lt;br /&gt;Content-Type: multipart/alternative; boundary=&lt;br /&gt;    "----_=_NextPart_001_01C5E973.82A5C520"&lt;br /&gt;&lt;br /&gt;------_=_NextPart_001_01C5E973.82A5C520&lt;br /&gt;Content-Type: text/plain; charset="us-ascii"&lt;br /&gt;Content-Transfer-Encoding: 7bit&lt;br /&gt;&lt;br /&gt;hello world, content&lt;br /&gt;&lt;br /&gt;------_=_NextPart_001_01C5E973.82A5C520&lt;br /&gt;Content-Type: text/html; charset="us-ascii"&lt;br /&gt;Content-Transfer-Encoding: 7bit&lt;br /&gt;&lt;br /&gt;&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"&gt;&lt;br /&gt;&amp;lt;HTML&gt;&lt;br /&gt;&amp;lt;HEAD&gt;&lt;br /&gt;&amp;lt;TITLE&gt;hello world&amp;lt;/TITLE&gt;&lt;br /&gt;&amp;lt;/HEAD&gt;&lt;br /&gt;&amp;lt;BODY&gt;hello world, content&amp;lt;/BODY&gt;&lt;br /&gt;&amp;lt;/HTML&gt;&lt;br /&gt;&lt;br /&gt;------_=_NextPart_001_01C5E973.82A5C520--&lt;br /&gt;------_=_NextPart_000_01C5E973.82A5C520&lt;br /&gt;Content-Type: text/plain; name="test.txt"&lt;br /&gt;Content-Disposition: attachment; filename="test.txt"&lt;br /&gt;&lt;br /&gt;text in attachment  &lt;br /&gt;&lt;br /&gt;------_=_NextPart_000_01C5E973.82A5C520--&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After decoding the above message we have one &lt;code&gt;IbaseMessage&lt;/code&gt; having multiple &lt;code&gt;IBaseMessagePart&lt;/code&gt; objects.&lt;br /&gt;In my pipeline component I always assumed that the actual body of the mail was a &lt;i&gt;BodyPart&lt;/i&gt; and the attachments were all the other parts. I guess I was wrong. In the above sample, the &lt;i&gt;BodyPart&lt;/i&gt; contains the attachment.&lt;br /&gt;So how can we make sure that only the attachments are sent to Biztalk and not the &lt;i&gt;body&lt;/i&gt; of the mail? Below is the solution:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Try to determine if the message part is an attachment or not.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Attachments will always have a file name in the mime property&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; namespace.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name="messagePart"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; IsAttachment(IBaseMessagePart messagePart)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (messagePart == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: green;"&gt;// bail if message part is empty&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;/*&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  * Read the file name from the mime property namespace.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  */&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; fileName = messagePart.PartProperties.Read("FileName","http://schemas.microsoft.com/BizTalk/2003/mime-properties") &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (fileName != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; fileName.Length &amp;gt; 0)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;In our pipeline component (disassemble stage), we will only disassemble messages that have the &lt;code&gt;FileName&lt;/code&gt;-property set in the mime properties namespace.&lt;br /&gt;Ok, I have to admit, no rocket-science here, but maybe there are people that will find this helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-113204788588127802?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/113204788588127802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=113204788588127802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113204788588127802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/113204788588127802'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/11/biztalk-2004-mime-revisited.html' title='Biztalk 2004: Mime revisited ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112876105595478255</id><published>2005-10-08T10:36:00.000+02:00</published><updated>2005-10-08T10:44:15.990+02:00</updated><title type='text'>Linux: Problems with Ubuntu, X and NVidia</title><content type='html'>When I started my computer the other day, X was not starting. Nothing happened. Just a cold, black screen. I had no idea what triggered this, so I decided to reinstall the NVIDIA driver for my graphics card. All went well and X was working again. After reboot, same problem.&lt;br /&gt;After googling for a while, I found &lt;a href="http://www.nvnews.net/vbulletin/archive/index.php/t-44075.html"&gt;this&lt;/a&gt; discussion. Seems the Debian's/Ubuntu's own nvidia runlevel scripts are cleaning up modules they shouldn't. So the solution is to uninstall all nvidia stuf you installed from Debian/Ubuntu (with --purge option), reinstall the NVIDIA driver from the official website and switch to runlevel 2 to see the result.&lt;br /&gt;Aah, don't you just love if everything falls back into place ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112876105595478255?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112876105595478255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112876105595478255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112876105595478255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112876105595478255'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/10/linux-problems-with-ubuntu-x-and.html' title='Linux: Problems with Ubuntu, X and NVidia'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112740212886381273</id><published>2005-09-22T17:06:00.000+02:00</published><updated>2005-09-22T17:15:28.870+02:00</updated><title type='text'>Visual Studio .NET 2003: resx files ...</title><content type='html'>I have a project containing custom pipeline components. Each component has its own &lt;code&gt;.resx&lt;/code&gt;-file. For some reason the &lt;code&gt;.resx&lt;/code&gt;-file for ComponentA was included in the project as a seperate file and the &lt;code&gt;.resx&lt;/code&gt;-file for ComponentB was only visible if you clicked the &lt;code&gt;[+]&lt;/code&gt;-sign left of my component.&lt;br /&gt;I had no idea why there was a difference between the &lt;i&gt;visualization&lt;/i&gt; for both &lt;code&gt;.resx&lt;/code&gt;-files. When I edited the &lt;code&gt;.csproj&lt;/code&gt;-file, I saw why it happened:&lt;pre&gt;&lt;br /&gt;&amp;lt;File&lt;br /&gt;    RelPath = "ComponentB.resx"&lt;br /&gt;    DependentUpon = "ComponentB.cs"&lt;br /&gt;    BuildAction = "EmbeddedResource"&lt;br /&gt;/&gt;&lt;/pre&gt;If you remove the &lt;code&gt;DependentUpon&lt;/code&gt; property, the file becomes visable in your project.&lt;br /&gt;Dunno how to do it without editing the project file though ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112740212886381273?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112740212886381273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112740212886381273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112740212886381273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112740212886381273'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/09/visual-studio-net-2003-resx-files.html' title='Visual Studio .NET 2003: resx files ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112720365405189421</id><published>2005-09-20T09:58:00.000+02:00</published><updated>2005-09-20T10:07:34.056+02:00</updated><title type='text'>Biztalk 2006 on Linux ... yes, it's possible (2)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7567/449/1600/biztalk2006.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7567/449/320/biztalk2006.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;So I finally installed the second Biztalk 2006 beta on my Ubuntu Linux box. My machine is a Pavilion 5080.be with 1GB of RAM. I thought running VMWare and Windows 2003 Server would really slow the machine down ... but it didn't.&lt;br /&gt;In the above screenshot you can see my first flow (ProcessOrder) I've developed in Biztalk 2006. Let's start doing some more advanced things ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112720365405189421?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112720365405189421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112720365405189421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112720365405189421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112720365405189421'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/09/biztalk-2006-on-linux-yes-its-possible_20.html' title='Biztalk 2006 on Linux ... yes, it&apos;s possible (2)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112662540381542496</id><published>2005-09-13T17:22:00.000+02:00</published><updated>2005-09-13T17:30:03.820+02:00</updated><title type='text'>Biztalk 2006 on Linux ... yes, it's possible (1)</title><content type='html'>I'm currently running Ubuntu Hoary on a custom 2.6.13 kernel. I will be using this to run Windows 2003 Server and Biztalk 2006.&lt;br /&gt;To be able to run Windows on Linux (Ubuntu), you'll need &lt;a href="http://www.vmware.com"&gt;VMWare&lt;/a&gt;. Apparently the most recent version (5) is having problems on kernels later than 2.6.11. The VMWare network modules causes the network to lock up from time to time. You can read all about it and how to solve it &lt;a href="http://archives.free.net.ph/message/20050903.214711.271b973a.en.html"&gt;here&lt;/a&gt;. Right now, I've managed to install 2003 Server, SQL Server 2000, Analysis services and Visual Studio 2005 beta. Later this week, I'll be installing the second Biztalk 2006 beta. Very exciting stuff ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112662540381542496?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112662540381542496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112662540381542496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112662540381542496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112662540381542496'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/09/biztalk-2006-on-linux-yes-its-possible.html' title='Biztalk 2006 on Linux ... yes, it&apos;s possible (1)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112659438209965863</id><published>2005-09-13T08:24:00.000+02:00</published><updated>2005-09-13T09:04:23.790+02:00</updated><title type='text'>Excel ... aaaargh ...</title><content type='html'>I am working for a client that is using a lot of automated B2B scenarios. These include, next to normal EDI (Edifact and X12), ordering by mail. My client’s client sends orders as mail attachments. This has been working for quite some time, until recently, I got a phone call. Apparently, something was wrong in _my_ code because the requested delivery date was wrong by a day.&lt;br /&gt;The requested delivery date is, well, quite special. It is an integer indicating the number of days that passed since 01/01/1900. “Why?” you might ask. No idea. But hey, no problem, I can count.&lt;br /&gt;So this is the code that was parsing the “number of days passed since 01/01/1900” to a real date:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime baseDate = DateTime.ParseExact("01011900", "ddMMyyyy", &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; days = &lt;span style="color: blue;"&gt;int&lt;/span&gt;.Parse(numDays);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; baseDate.AddDays(days - 1).ToString("yyyyMMdd", &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;I didn’t quite understand why this code could lead to a wrong requested delivery date. So I asked the client’s client how I was supposed to parse this date. They provided me with a sample in Excel. Indeed the date was wrong by a day, but why. I created the following table in Excel:&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;numDate&lt;/td&gt;&lt;td&gt;Excel&lt;/td&gt;&lt;td&gt;myCode&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;01/01/1900&lt;/td&gt;&lt;td&gt;01/01/1900&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;02/01/1900&lt;/td&gt;&lt;td&gt;02/01/1900&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;364&lt;/td&gt;&lt;td&gt;29/12/1900&lt;/td&gt;&lt;td&gt;30/12/1900&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;365&lt;/td&gt;&lt;td&gt;30/12/1900&lt;/td&gt;&lt;td&gt;31/12/1900&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;366&lt;/td&gt;&lt;td&gt;31/12/1900&lt;/td&gt;&lt;td&gt;01/01/1901&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10000&lt;/td&gt;&lt;td&gt;18/05/1927&lt;/td&gt;&lt;td&gt;19/05/1927&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;20000&lt;/td&gt;&lt;td&gt;03/10/1954&lt;/td&gt;&lt;td&gt;04/10/1954&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;This is what I call: "The AHA effect". When looking at the above table, the only thing you can say is: "AHA", and after a while "WTF". Anyway. It seems that our nifty spreadsheer cannot count. It "thinks" that 1900 is a leap year, but this is not the case. That's why my code's parsed date was different by a day.&lt;br /&gt;Apparently Microsoft knows about this bug. It's not even a bug, it's a &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;214326"&gt;feature&lt;/a&gt;.&lt;br /&gt;Really? I call it plain wrong. It seems that Lotus-1-2-3 was having this bug to, so Microsoft copied the bug for compatibility reasons.&lt;br /&gt;OpenOffice does not have the above feature.&lt;br /&gt;Because my client was not expecting any orders before 28/02/1900, I changed the above code to:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime baseDate = DateTime.ParseExact("01011900", "ddMMyyyy", &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; days = &lt;span style="color: blue;"&gt;int&lt;/span&gt;.Parse(numDays);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; baseDate.AddDays(days - &lt;b&gt;2&lt;/b&gt;).ToString("yyyyMMdd", &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;Plain stupid, I know, but what can I do ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112659438209965863?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112659438209965863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112659438209965863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112659438209965863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112659438209965863'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/09/excel-aaaargh.html' title='Excel ... aaaargh ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112591409835006883</id><published>2005-09-05T11:47:00.000+02:00</published><updated>2005-09-05T11:56:38.816+02:00</updated><title type='text'>Linux: Swap, file systems and such ...</title><content type='html'>Just found this interesting read on &lt;a href="http://kerneltrap.org/node/5619"&gt;KernelTrap&lt;/a&gt;, posted by &lt;a href="http://kerneltrap.org/user/50"&gt;Mr Z&lt;/a&gt;.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Allow me to elaborate. UNIX filesystems have a concept of "inodes" that store the body of the file, its permissions and its ownership. The inodes get linked into directories via names--aka. directory entries. The same inode can be linked into the filesystem in multiple places. (Hence the concept of a "hard link.") The filesystem keeps track of how many links an inode has, and the kernel keeps track of how many processes have opened a given inode. This concept is important, and I will come back to it.&lt;br /&gt;&lt;br /&gt;When an executable runs, the executable's file as well as the files for all the libraries it depends on get opened. The pages for these files get mmap()'d into the process' address space as file-backed virtual memory. The memory gets marked copy-on-write, so that any changes to the mmap()'d code result in a fault, and break the file backing. In any case, the file-backed portions are backed by the contents of the inodes themselves.&lt;br /&gt;&lt;br /&gt;Under virtual memory pressure, the kernel will have to deallocate physical pages of memory from some processes in order to allocate them to others. There are two strategies available here: Write dirty pages to swap, and discard clean pages. Clean pages are pages which have either an explicit file backing (such as program executable pages), and pages that were previously swapped, brought back in, but still have an equivalent copy in the swap partition. (This is sometimes refered to as the "swap cache," though I don't know if that designation is accurate.)&lt;br /&gt;&lt;br /&gt;So yes, under memory pressure, some pages of an executable might get discarded and will need to be brought in later from the original executable. The grandparent wonders how that works if a user upgrades a binary while the executable runs.&lt;br /&gt;&lt;br /&gt;Recall that there's the separation between the file's contents (the inode) and the name given to it in the file system (hard link to the inode). File descriptors are bound to inodes, not directory entries. When you "rm" a file, you remove the link between the directory and the inode. When you replace a file, say with "cp," the existing inode gets unlinked and a new inode gets linked in its place. When you "mv" a file, it gets linked in its new location, and unlinked from its old location.&lt;br /&gt;&lt;br /&gt;The filesystem code does not reclaim the space allocated to the inode until all references to the inode drop. This includes all filesystem links and open file descriptors. Thus, when you replace a program's executable while it executes, the currently running program continues to see the old executable, even if the inode doesn't have a visible link in the filesystem. The inode will remain allocated until all of its open file descriptors get closed. Then and only then will the filesystem reclaim the storage associated with the inode.&lt;br /&gt;&lt;br /&gt;In fact, it is this property of UNIX derived filesystems that leads to all the orphaned inodes you find in "lost+found/" after a fsck if your system gets shut down abruptly. Any inodes that were open at the point of the crash, but which did not have a hard directory link end up here.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;In my experience, the NTFS file system is not as advanced as explained in the above. If you develop in M$ Visual Studio and mess a bit with the &lt;i&gt;copy local&lt;/i&gt; setting, you'll see referenced files get locked and there's no way to overwrite them. You can somehow simulate the Unix/Linux behaviour by renaming the referenced file. If for example &lt;code&gt;c:\test\a.dll&lt;/code&gt; is locked, just rename it to &lt;code&gt;c:\test\b.dll&lt;/code&gt; and copy the new version of &lt;code&gt;a.dll&lt;/code&gt; to &lt;code&gt;c:\test&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112591409835006883?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112591409835006883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112591409835006883' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112591409835006883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112591409835006883'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/09/linux-swap-file-systems-and-such.html' title='Linux: Swap, file systems and such ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112566519165001018</id><published>2005-09-02T14:40:00.000+02:00</published><updated>2005-09-02T14:46:31.656+02:00</updated><title type='text'>Biztalk: Explorer</title><content type='html'>Just found &lt;a href="http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=c2bd2cac-6fd8-4ee5-b524-4dcba88f7464"&gt;this&lt;/a&gt; nifty tool to manage and configure your Biztalk server running in production. It's called &lt;i&gt;Biztalk Explorer&lt;/i&gt; and allows you to configure/manage a Biztalk 2004 without having Visual Studio installed. So this tool is ideal for administrators configuring production/QAS environments.&lt;br /&gt;I know you should use binding files, but if you want to change something quickly, this is the tool you need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112566519165001018?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112566519165001018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112566519165001018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112566519165001018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112566519165001018'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/09/biztalk-explorer.html' title='Biztalk: Explorer'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112558309300757925</id><published>2005-09-01T15:50:00.000+02:00</published><updated>2005-09-01T16:10:24.590+02:00</updated><title type='text'>Firefox: Figures on MSDN not showing ...</title><content type='html'>When browsing some articles on Biztalk on the MSDN sites, figures were not showing (e.g.: &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/bts_2004wp/html/956fd4cb-aacc-43ee-99b6-f6137a5a2914.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/bts_2004wp/html/956fd4cb-aacc-43ee-99b6-f6137a5a2914.asp&lt;/a&gt;) in Firefox.&lt;br /&gt;I was &lt;a href="http://forums.mozillazine.org/viewtopic.php?p=1712795#1712795"&gt;wondering&lt;/a&gt; why the figures were showing in Internet Exploder and not in Firefox. Seems that Firefox is having problems with the back slashes. Well ... problems ... shouldn't be back slashes in the first place (damn Micro$ofties), right? The solution is to install &lt;a href="http://www.extensionsmirror.nl/index.php?showtopic=956"&gt;Slashy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Look mom, I can now read MSDN articles too ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112558309300757925?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112558309300757925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112558309300757925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112558309300757925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112558309300757925'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/09/firefox-figures-on-msdn-not-showing.html' title='Firefox: Figures on MSDN not showing ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112073073427556116</id><published>2005-07-07T12:03:00.000+02:00</published><updated>2005-07-07T12:09:10.603+02:00</updated><title type='text'>Biztalk: Creating documentation</title><content type='html'>Here are a few possibilities to create your documentation for Biztalk deployments.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Generate it with &lt;a href="http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=41c1faa9-13a6-478b-af81-d87ca946a222"&gt;BiztalkDocumenter&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create it with VISIO&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Using the stencil from &lt;a href="http://www.enterpriseintegrationpatterns.com/download/EIP%20Visio%20Stencil.zip"&gt;Enterprise Integration Patterns&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Using the stencil from &lt;a href="http://www.andre-dammeyer.de/Files/Visio/BizTalk%20Messaging%20Shapes.zip"&gt;André Dammeyer&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Maybe you came accross some better options ... let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112073073427556116?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112073073427556116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112073073427556116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112073073427556116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112073073427556116'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/07/biztalk-creating-documentation.html' title='Biztalk: Creating documentation'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-112005694820791580</id><published>2005-06-29T16:48:00.000+02:00</published><updated>2005-06-29T16:55:48.220+02:00</updated><title type='text'>Biztalk: Delete ReceiveLocation using WMI and VBScript</title><content type='html'>&lt;p&gt;The default samples that are shipped with the Biztalk SDK do not contain code to delete a ReceiveLocation. Here is something I've written that will delete a ReceiveLocation, specified on the command line.&lt;/p&gt;&lt;br /&gt;Please note that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;this is a very-very basic script (e.g. no checks on primary ReceiveLocation)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I know nothing about VBScript, so if you want parts of it nominated as a &lt;a href="http://thedailywtf.com/"&gt;WTF&lt;/a&gt;, go ahead, make my day ;)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Option&lt;/span&gt; &lt;span style="color: blue;"&gt;Explicit&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;RemoveRecLoc&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Sub&lt;/span&gt; RemoveRecLoc()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; objArgs: &lt;span style="color: blue;"&gt;Set&lt;/span&gt; objArgs = WScript.Arguments&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'error handling is done by explicity checking the err object rather than using&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'the VB ON ERROR construct, so set to resume next on error.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'on error resume next&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; strReceiveLocation&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strReceiveLocation = objArgs(0)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; InstSet, Inst&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; InstSet = GetObject ("winmgmts:\root\MicrosoftBizTalkServer").InstancesOf("MSBTS_ReceiveLocation")&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; objReceivePort&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Check for error condition before continuing.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; Err &amp;lt;&amp;gt; 0&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PrintWMIErrorThenExit Err.Description, Err.Number&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Report on number of receive locations found and list each one.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wscript.echo "A Total of " &amp;amp; InstSet.Count &amp;amp; " Receive Locations were found."&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; InstSet.Count &amp;gt; 0 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; Inst &lt;span style="color: blue;"&gt;In&lt;/span&gt; InstSet&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; Inst.Name = strReceiveLocation &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wscript.echo "Receive Location Name&amp;nbsp; : " &amp;amp; Inst.Name&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Inst.Delete_()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wscript.echo "&amp;nbsp; Deleted ..."&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;next&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;'This subroutine deals with all errors using the WbemScripting object.&amp;nbsp; Error descriptions&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;'are returned to the user by printing to the console.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintWMIErrorThenExit(strErrDesc, ErrNum)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;On&lt;/span&gt; &lt;span style="color: blue;"&gt;Error&lt;/span&gt; &lt;span style="color: blue;"&gt;Resume&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objWMIError&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color: blue;"&gt;Set&lt;/span&gt; objWMIError =&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateObject("WbemScripting.SwbemLastError")&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; ( TypeName(objWMIError) = "Empty" ) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wscript.echo strErrDesc &amp;amp; " (HRESULT: "&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; Hex(ErrNum) &amp;amp; ")."&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wscript.echo objWMIError.Description &amp;amp; "(HRESULT: "&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; Hex(ErrNum) &amp;amp; ")."&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt; objWMIError&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;span style="color: blue;"&gt;nothing&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'bail out&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wscript.quit 0&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-112005694820791580?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/112005694820791580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=112005694820791580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112005694820791580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/112005694820791580'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/06/biztalk-delete-receivelocation-using.html' title='Biztalk: Delete ReceiveLocation using WMI and VBScript'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111901920428025936</id><published>2005-06-17T16:39:00.000+02:00</published><updated>2005-06-23T09:25:55.516+02:00</updated><title type='text'>Mime Decoder Pipeline Component in Biztalk 2004 (the solution)</title><content type='html'>&lt;p&gt;I promised to publish a solution to read the &lt;code&gt;.eml&lt;/code&gt; files. This solution works for both Biztalk 2004 and Biztalk 2004 SP1 installations.&lt;/p&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;Step 1: Create a custom decoder component&lt;/b&gt;&lt;br /&gt;&lt;p&gt;You can download a wizard that will create any pipeline component &lt;a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=1d4f7d6b-7d27-4f05-a8ee-48cfcd5abf4a"&gt;here&lt;/a&gt;. Use this to create your decoder component. Make sure you have the following design time properties defined:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;FromRegex&lt;/code&gt;: this will contain the regular expression to find the sender&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;FromMatch&lt;/code&gt;: this will contain the index of the &lt;i&gt;Group&lt;/i&gt; and &lt;i&gt;Capture&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;ToRegex&lt;/code&gt;: this will contain the regular expression to find the receiver&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;ToMatch&lt;/code&gt;: this will contain the index of the &lt;i&gt;Group&lt;/i&gt; and &lt;i&gt;Capture&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;SubjectRegex&lt;/code&gt;: this will contain the regular expression to find the subject&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;SubjectMatch&lt;/code&gt;: this will contain the index of the &lt;i&gt;Group&lt;/i&gt; and &lt;i&gt;Capture&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;PropertyNamespace&lt;/code&gt;: this will contain the namespace of the properties we're promoting (don't forget to create your property schema with &lt;code&gt;MessageContextPropertyBase&lt;/code&gt; properties)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you're not familiar with regular expressions, you can use the following expression to match the sender:&lt;br /&gt;&lt;code&gt;(?i)from:\s?([^\n\r]*)&lt;/code&gt;&lt;br /&gt;If you apply this expression to the incoming message, the sender is found in Group 1, Capture 0. You can use &lt;a href="http://www.cdrnet.net/projects/regex/"&gt;this&lt;/a&gt; tool to test your regular expressions.&lt;/p&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;Step 2: Fill the gaps&lt;/b&gt;&lt;br /&gt;Create a private member that will contain Biztalk's default decoder:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; MIME_SMIME_Decoder containedDecoder = &lt;span style="color: blue;"&gt;new&lt;/span&gt; MIME_SMIME_Decoder();&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;Some additional members well need:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; RegExpMatcher fromMatcher = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; RegExpMatcher toMatcher = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; RegExpMatcher subjectMatcher = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;We'll see the implementation of the &lt;code&gt;RegExpMatcher&lt;/code&gt; later on.&lt;br /&gt;Initialize the decoder:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; InitNew()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; containedDecoder.InitNew();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;Make sure the component is able to load its configuration:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Load(IPropertyBag pb, &lt;span style="color: blue;"&gt;int&lt;/span&gt; errlog)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; regExp = ReadPropertyBag(pb, "FromRegex") &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; regExpMatch = ReadPropertyBag(pb, "FromMatch") &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fromMatcher = GetRegExpMatcher(regExp, regExpMatch);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; RegExpMatcher GetRegExpMatcher(&lt;span style="color: blue;"&gt;string&lt;/span&gt; regExp, &lt;span style="color: blue;"&gt;string&lt;/span&gt; regExpMatch)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (StringUtils.IsNotEmpty(regExp) &amp;amp;&amp;amp; StringUtils.IsNotEmpty(regExpMatch))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; RegExpMatcher(regExp, regExpMatch);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;Make sure the component is able to save its configuration:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Save(IPropertyBag pb, &lt;span style="color: blue;"&gt;bool&lt;/span&gt; fClearDirty, &lt;span style="color: blue;"&gt;bool&lt;/span&gt; fSaveAllProperties)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; WritePropertyBag(pb, "FromRegex", fromMatcher.RegExp);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; WritePropertyBag(pb, "FromMatch", fromMatcher.RegExpMatch);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;Additional properties:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FromRegex&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (fromMatcher != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; fromMatcher.RegExp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GetRegExpMatcher(&lt;span style="color: blue;"&gt;ref&lt;/span&gt; fromMatcher).RegExp = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FromMatch&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (fromMatcher != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; fromMatcher.RegExpMatch;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GetRegExpMatcher(&lt;span style="color: blue;"&gt;ref&lt;/span&gt; fromMatcher).RegExpMatch = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; RegExpMatcher GetRegExpMatcher(&lt;span style="color: blue;"&gt;ref&lt;/span&gt; RegExpMatcher aRegExpMatcher)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (aRegExpMatcher == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; aRegExpMatcher = &lt;span style="color: blue;"&gt;new&lt;/span&gt; RegExpMatcher();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; aRegExpMatcher;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;Step 3: Create the &lt;/b&gt;&lt;code&gt;Execute&lt;/code&gt;&lt;b&gt; method&lt;/b&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;/* &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  * Get the original stream for the incoming message's&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  * body part.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  */&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Stream stream = inmsg.BodyPart.GetOriginalDataStream();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;/*&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  * Now, read the stream in blocks of 1024 bytes, until we&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  * find the mime header. If the header is found at position&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  * X, reset the stream to position X. The contained mime&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  * decoder will start reading from this point forward.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  */&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; mimeHeaderIdx = -1;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; num = 1;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder text = &lt;span style="color: blue;"&gt;new&lt;/span&gt; StringBuilder();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (mimeHeaderIdx &amp;lt; 0 &amp;amp;&amp;amp; num &amp;gt; 0)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; buffer = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;byte&lt;/span&gt;[0x400];&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; num = stream.Read(buffer, 0, 0x400);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ASCIIEncoding encoding = &lt;span style="color: blue;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; text.Append(encoding.GetString(buffer, 0, num).ToUpper(CultureInfo.InvariantCulture));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mimeHeaderIdx = text.ToString().IndexOf(MIME_HEADER);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (mimeHeaderIdx &amp;gt;= 0)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stream.Seek(mimeHeaderIdx, SeekOrigin.Begin);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IBaseMessage outmsg = containedDecoder.Execute(pc, inmsg);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; outmsg.Context.Promote("From", propertyNamespace, fromMatcher.Match(text.ToString()));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; outmsg.Context.Promote("To", propertyNamespace, toMatcher.Match(text.ToString()));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; outmsg.Context.Promote("Subject", propertyNamespace, subjectMatcher.Match(text.ToString()));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt; (Exception e)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; e;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; outmsg;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;Step 4: Create the &lt;/b&gt;&lt;code&gt;RegExpMatcher&lt;/code&gt;&lt;b&gt; component&lt;/b&gt;&lt;br /&gt;This is the class that will ease our use of regular expressions:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: #F2F2F2; padding-top: 0pt; padding-left: 0pt; padding-right: 0pt; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; RegExpMatcher&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; group = -1;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; capture = -1;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; regExp = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; regExpMatch = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; DelimitedString delimitedString = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; RegExpMatcher()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; RegExpMatcher(&lt;span style="color: blue;"&gt;string&lt;/span&gt; aRegExp, &lt;span style="color: blue;"&gt;string&lt;/span&gt; aRegExpMatch)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (StringUtils.IsEmpty(aRegExp))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; ApplicationException("Regular expression was empty.");&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (StringUtils.IsEmpty(aRegExpMatch))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; ApplicationException("Regular expression match was empty.");&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; regExp = aRegExp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; regExpMatch = aRegExpMatch;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CreateGroupAndCapture(regExpMatch);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; CreateGroupAndCapture(&lt;span style="color: blue;"&gt;string&lt;/span&gt; aRegExpMatch)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delimitedString = &lt;span style="color: blue;"&gt;new&lt;/span&gt; DelimitedString(aRegExpMatch);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(delimitedString.Parts.Length &amp;lt; 2)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; ApplicationException(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(@"{0} should be a delimited string having 2 parts.", regExpMatch));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; group = IntUtils.ParseInt(delimitedString.Parts[0]);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; capture = IntUtils.ParseInt(delimitedString.Parts[1]);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; RegExp&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; regExp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; regExp = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; RegExpMatch&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; regExpMatch;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; regExpMatch = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CreateGroupAndCapture(regExpMatch);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Group&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(group &amp;lt; 0)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; ApplicationException(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format("Group should be an integer, found {0}.", delimitedString.Parts[0]));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; group;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Capture&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(capture &amp;lt; 0)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; ApplicationException(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format("Capture should be an integer, found {0}.", delimitedString.Parts[1]));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; capture;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Match(&lt;span style="color: blue;"&gt;string&lt;/span&gt; part)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Match m = Regex.Match(part, regExp, RegexOptions.Singleline);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (m.Success)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;object&lt;/span&gt; found = m.Groups[&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Group].Captures[&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Capture];&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (found != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; found.ToString();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; "";&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;Step 5: Build and deploy your component&lt;/b&gt;&lt;br /&gt;Now you're ready to build and deploy the component. Just copy the resulting &lt;code&gt;.dll&lt;/code&gt; to &lt;code&gt;C:\Program Files\Microsoft BizTalk Server 2004\Pipeline Components&lt;/code&gt; and you're set.&lt;br /&gt;&lt;br&gt;&lt;b&gt;Step 6: Use your component&lt;/b&gt;&lt;br /&gt;After you successfully deployed your component, you're ready to use it:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Add the component to your toolbox in Visual Studio&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a new Biztalk project&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add a pipeline&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Drag your component on the decode stage of your pipeline&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Configure your component&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Test&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111901920428025936?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111901920428025936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111901920428025936' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111901920428025936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111901920428025936'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/06/mime-decoder-pipeline-component-in_17.html' title='Mime Decoder Pipeline Component in Biztalk 2004 (the solution)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111898948370307772</id><published>2005-06-17T08:22:00.000+02:00</published><updated>2005-06-17T08:24:43.706+02:00</updated><title type='text'>The Daemon, the GNU and the Penguin (12)</title><content type='html'>Read all about it &lt;a href="http://www.groklaw.net/article.php?story=20050614211218231"&gt;here&lt;/a&gt;.&lt;br /&gt;Very interesting series. I've read to chapter 4 the other night ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111898948370307772?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111898948370307772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111898948370307772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111898948370307772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111898948370307772'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/06/daemon-gnu-and-penguin-12.html' title='The Daemon, the GNU and the Penguin (12)'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111881664427921883</id><published>2005-06-15T08:09:00.000+02:00</published><updated>2005-06-15T08:24:04.283+02:00</updated><title type='text'>Mime Decoder Pipeline Component in Biztalk 2004</title><content type='html'>This is so funny. I've been struggling for a while to be able to read &lt;code&gt;.eml&lt;/code&gt; files through Biztalk. Seems the the MIME decoder that ships with Biztalk 2004 tries to find &lt;code&gt;"MIME-VERSION"&lt;/code&gt; in the first 1024 bytes of the &lt;code&gt;.eml&lt;/code&gt;-file. The problem is that, in my file, the &lt;code&gt;MIME-VERSION&lt;/code&gt;-string was near byte 1324 (or so). So the decoder tells me the file is not valid. Seems this problem is resolved in SP1. In a next post, I'll post some code ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111881664427921883?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111881664427921883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111881664427921883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111881664427921883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111881664427921883'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/06/mime-decoder-pipeline-component-in.html' title='Mime Decoder Pipeline Component in Biztalk 2004'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111763088086321330</id><published>2005-06-01T14:57:00.000+02:00</published><updated>2005-06-17T16:40:25.766+02:00</updated><title type='text'>Biztalk: RIP</title><content type='html'>Biztalk died on me today after choking on an 18 MB IDOC (= flat file message from SAP) message.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;A catastrophic failure occurred in the BizTalk service.&lt;br /&gt;The service will shutdown and auto-restart in 1 minute.&lt;br /&gt;If the database is still unavailable, this cycle will be repeated.&lt;br /&gt;&lt;br /&gt;Error message: Parameter is incorrect&lt;br /&gt;Error source: System&lt;br /&gt;&lt;br /&gt;BizTalk host name: BizTalkServerApplication&lt;br /&gt;Windows service name: BTSSvc{940AAE5E-0C6F-401E-83B2-D00BFF7792BB}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I already ran the Config Framework wizard, but untill now, no joy :(&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;h4 class="post-title"&gt;Update!&lt;/h4&gt;&lt;br /&gt;I found why I was getting the above error. It seems one of the IDOCS I was using for testing lost some trailing spaces in one of its segments. This resulted in the above error ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111763088086321330?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111763088086321330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111763088086321330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111763088086321330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111763088086321330'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/06/biztalk-rip.html' title='Biztalk: RIP'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111748654552519377</id><published>2005-05-30T22:45:00.000+02:00</published><updated>2005-05-30T23:10:01.986+02:00</updated><title type='text'>Xbox 360</title><content type='html'>Ok, I must have been away from this world for some time. Apparently Microsoft's new game console will be called Xbox 360. You can read all about it &lt;a href="http://www.xbox.com/en-US/xbox360/factsheet.htm"&gt;here&lt;/a&gt;.&lt;br /&gt;A few years ago, when Microsoft released its first Xbox, there was some student analyzing traffic that was crossing the encrypted bus (between CPU and peripherals I think), for its thesis. As a result, different small companies released mod chips that were able to hack this bus. After mod'ing your Xbox, you were able to run copied games (not that I approve that). You could even run &lt;a href="http://www.xbox-linux.org/"&gt;Linux&lt;/a&gt; on your Xbox. After all, the first Xbox was a normal PC, with some proprietary stuff from Microsoft.&lt;br /&gt;When the new Xbox will be released, the &lt;a href="http://www.free60.org"&gt;OpenSource&lt;/a&gt; community will be ready ... I can't wait ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111748654552519377?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111748654552519377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111748654552519377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111748654552519377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111748654552519377'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/05/xbox-360.html' title='Xbox 360'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111709506945392969</id><published>2005-05-26T10:08:00.000+02:00</published><updated>2005-05-26T10:11:09.456+02:00</updated><title type='text'>The Daemon, the GNU and the Penguin</title><content type='html'>For those of you interested in the history of Unix, OS2, Minix, Linux ... (or in short those decent OSes that don't originate from Redmond) there's a series of &lt;span style="font-style:italic;"&gt;tales&lt;/span&gt; you can read on Groklaw. The latest is chapter &lt;a href="http://www.groklaw.net/article.php?story=20050519003343383"&gt;9&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111709506945392969?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111709506945392969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111709506945392969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111709506945392969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111709506945392969'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/05/daemon-gnu-and-penguin.html' title='The Daemon, the GNU and the Penguin'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111708933705736587</id><published>2005-05-26T08:25:00.000+02:00</published><updated>2005-05-26T08:35:37.063+02:00</updated><title type='text'>Where did my functoids go ...</title><content type='html'>Ok, yet another Biztalk post. The other night, I was working for a client, trying to get a map right. Normally I don't use these things. I know XSLT well and tend to use this instead of the clumsy &lt;span style="font-style:italic;"&gt;Biztalk Mapper&lt;/span&gt;. This time, however, I was obliged to use the mapper. My colleague was using it and I had to fix his map.&lt;br /&gt;Anyway, opening the toolbox startled me, as there were no functoids. After &lt;span style="font-style:italic;"&gt;Googling&lt;/span&gt; for a while, it seemed I had to add &lt;tt&gt;Microsoft.BizTalk.BaseFunctoids.dll&lt;/tt&gt; (which you can find near &lt;tt&gt;C:\Program Files\Microsoft BizTalk Server 2004\Developer Tools&lt;/tt&gt;) to my toolbox. After that, everything was working as it should.&lt;br /&gt;I'm not sure how &lt;span style="font-style:italic;"&gt;MS Visual Studio&lt;/span&gt; ever forgot about the location of my functoids ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111708933705736587?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111708933705736587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111708933705736587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111708933705736587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111708933705736587'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/05/where-did-my-functoids-go.html' title='Where did my functoids go ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111639742247405661</id><published>2005-05-18T08:11:00.000+02:00</published><updated>2005-05-18T08:23:42.480+02:00</updated><title type='text'>Star Wars Episode III: Revenge of the sith ...</title><content type='html'>Ok, I admit it, I'm a nerd ;) This morning, at 00h10, I went to see the final part of the Star Wars saga. Better than the first 2, I must admit. Even though you know how it's going to end (you do know how it's going to end ... if not, were have you been the past 6 years or so), Lucas managed to bring enough entertainment, drama and suspension to keep me awake for almost 3 hours. So in short, a must see ... may the force be with you ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111639742247405661?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111639742247405661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111639742247405661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111639742247405661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111639742247405661'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/05/star-wars-episode-iii-revenge-of-sith.html' title='Star Wars Episode III: Revenge of the sith ...'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111632213528387068</id><published>2005-05-17T11:17:00.000+02:00</published><updated>2005-05-17T11:30:11.936+02:00</updated><title type='text'>Duplicate message types part II</title><content type='html'>In a recent &lt;a href="http://kennywest.blogspot.com/2005/04/checking-for-duplicate-message-types.html"&gt;post&lt;/a&gt; I was talking about duplicate message types deployed to the Biztalk management database. The following &lt;a href="http://www.traceofthought.net/PermaLink,guid,cfa8a62a-af33-44b8-a40e-ede8d1b2867c.aspx"&gt;link&lt;/a&gt; describes duplicate message types in more detail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111632213528387068?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111632213528387068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111632213528387068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111632213528387068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111632213528387068'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/05/duplicate-message-types-part-ii.html' title='Duplicate message types part II'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7365151.post-111519249800697874</id><published>2005-05-04T09:26:00.000+02:00</published><updated>2005-05-04T09:41:38.013+02:00</updated><title type='text'>Long classpaths in Java</title><content type='html'>Yesterday, a colleague had a problem setting the classpath for an application we use. Apparently, the length of environment variables is restricted in Win32. Unfortunately our application is using a lot of external &lt;span style="font-style: italic;"&gt;jars&lt;/span&gt;, so classpaths tend to grow.&lt;br /&gt;While &lt;span style="font-style: italic;"&gt;google'ing&lt;/span&gt; for a solution I came accross &lt;a href="http://forum.java.sun.com/thread.jspa?threadID=483375&amp;messageID=2262325"&gt;this&lt;/a&gt; post.&lt;br /&gt;There is another solution to solve this issue. Just add the following line to your &lt;tt&gt;config.sys&lt;/tt&gt; file:&lt;pre&gt;&lt;br /&gt;shell=command.com /e:4096&lt;/pre&gt;&lt;br /&gt;I must admit, I like the &lt;span style="font-style: italic;"&gt;Runner.class&lt;/span&gt; solution though ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7365151-111519249800697874?l=kennywest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennywest.blogspot.com/feeds/111519249800697874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7365151&amp;postID=111519249800697874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111519249800697874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7365151/posts/default/111519249800697874'/><link rel='alternate' type='text/html' href='http://kennywest.blogspot.com/2005/05/long-classpaths-in-java.html' title='Long classpaths in Java'/><author><name>kennywest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
