Langeweile

Bimberg, am 13 Februar 2006

Geliebtes Tagebuch,

Nun ist mein letzter Praktikumstag schon sieben Tage her und ich vermisse die harte Disziplin, die Prügel und die Verachtung, mir der mir meine Kollegen immer begegnet sind. Ich fürchte ich habe mir eine Art Stockholm Syndrom eingehandelt.

Jedenfalls kommt mein kleiner Geist mit dem plötzlichen Fehlen von Ordnung und Struktur im Leben nicht zurecht. Die Langeweile zerfrisst mich von innen heraus. Krampfhaft versuche ich mich zu beschäftigen und die Zeit totzuschlagen. Tagelang hab ich mein Hirn zermartert, um eine Beschäftigung zu finden. Erst als ich schon fast aufgeben wollte, sind mir jene guten Leute eingefallen, die offensichtlich noch viel mehr Zeit haben als ich und die sich sicher gerne mit mir abgeben.

So machte ich mich prompt nach Rottenegg auf, der lokalen Hochburg der Zeugen Jehovas. Mit einem dicken Spiderman Comic unter dem Arm schlenderte ich durch die malerische Siedlung und läutete mal hier, mal da und unterhielt mich aufs Köstlichste mit den guten Leuten. Ich hatte stets den Eindruck, dass auch sie viel zuviel Zeit hatten und mir unbedingt ihre Geschichten erzählen wollten und so hörte ich ihnen freundlich zu, Stunde um Stunde, nickte stets lächelnd und war rundum glücklich, dass ich endlich jemanden gefunden hatte, der Zeit mit mir verbringt. Ab und an erzählte auch ich einen dreckigen Witz oder ein schmutziges Geschichtchen. Die einzige Wolke auf diesem meinem Himmel der Glückseligkeit war nur das sinn- und zusammenhangslose Gefasel meiner neuen Freunde, das, wenn mir nicht ohnehin schon so unglaublich langweilig gewesen wäre, sehr sehr sehr fade klang.

Doch mit den vielen Stunden die ich in diesem herzallerliebsten Örtchen zubrachte, schienen die guten Leutchen ihr Interesse an mir zu verlieren. Unter Vorwänden wimmelten sie mich ab, und warnten, so fürchte ich, gar ihre Nachbarn vor mir, denn schon bald öffnete niemand mehr auf mein bestimmtes Läuten, und das obwohl ich Licht sah und Menschen hinter Vorhängen hervorspähten. Traurig wandte ich mich ab und machte mich auf den Heimweg in mein kaltes, stilles, menschenleeres Heim. Aber zumindest ein paar Stunden lang konnte ich erleben, was es heißt, unter Menschen zu sein.

How to write a “Recent Comments” macro for dasBlog

After I moved to dasBlog, I found myself looking for a possibility to display the most recent comments on the sidebar, so that people can easily see if somebody responded to their comments. But apparently there is nothing like this in dasBlog (at least I haven’t found anything), so I decided to write my own macro. Custom macros are supported by the latest versions of dasBlog. Basicly, a macro is just a class library (.DLL file) with classes and methods. If one of these methods returns a System.Web.UI.Control object, we can call it in our templates.

I started by creating a new class project in Visual Studio. I added references to the libraries newtelligence.DasBlog.Runtime.dll and newtelligence.DasBlog.Web.Core.dll. Both files are found in the /bin directory of your dasBlog installation. I also added these namespaces to the using part of my class file. Then i created a new class RecentCommentsMacro, that inherits from SharedBasePage and I implemented a constructor. The whole thing now looks something like (the entire code is attached to this post, you don’t have to copy and paste):
using System;
using System.Web;
using System.Web.UI;
using newtelligence.DasBlog.Runtime;
using newtelligence.DasBlog.Web.Core;

namespace Saxx {
    public class RecentCommentsMacro : SharedBasePage {

        protected SharedBasePage requestPage;
        protected Entry currentItem;

        public RecentCommentsMacro(SharedBasePage page, Entry item) {
            requestPage = page;
            currentItem = item;
        }
}

We can access the data of dasBlog by using the DataService property of the requestPage object. Knowing this, I wrote a method RecentComments(X, Y) that displays the latest X comments and truncates its text to Y characters. My method caches the entire control until a new comment has been posted, so we don’t have to get all comments and sort them whenever a page gets called (which is usually pretty often). I don’t think I’ve to explain the code in detail, it’s quite straight forward:
public static LiteralControl commentsLiteral = new LiteralControl();
public static DateTime lastUpdate = DateTime.MinValue;

public virtual Control RecentComments(int numberOfComments, int maxLengthOfComment) {
    if(numberOfComments < 1)
        numberOfComments = 10;
    if(maxLengthOfComment < 1)
        maxLengthOfComment = 30;

    IBlogDataService dataService = requestPage.DataService;

    if (dataService.GetLastCommentUpdate() > lastUpdate) {
        CommentCollection comments = dataService.GetAllComments();
        if (comments.Count > 0) {
            comments.Sort(new CommentsSorter());

            commentsLiteral.Text = "";
            for (int i = 0; i < numberOfComments; i++) {
       &nbs
p;        Comment comment = comments[i];
                commentsLiteral.Text += "<div class="recentComments">" + comment.Author + ": <a href="" + Utils.GetCommentViewUrl(comment.TargetEntryId) + "" alt="">";                              
                commentsLiteral.Text += TruncateString(Server.HtmlDecode(comment.Content), maxLengthOfComment);
                commentsLiteral.Text += "</a></div>";
            }
        }
    }
    return commentsLiteral;        
}

I know, I should have used StringBuilders, better caching, a lot more comments etc. (so don’t make the same mistakes I did), but the thingi works and I think it gives an idea how to write a macro. Compile the project and copy the .DLL file to the /bin directory of your dasBlog installation. Now we’ve to edit the web.config file a bit, so that dasBlog knows there’s a new macro out there. First add or uncomment this line to/in your web.config file (if not already done):
<section name="newtelligence.DasBlog.Macros" type="newtelligence.DasBlog.Web.Core.MacroSectionHandler, newtelligence.DasBlog.Web.Core" />

Then add these lines to the file (usually there is already something like it in the web.config file, but it’s in comment tags).
<newtelligence.DasBlog.Macros>
   <add macro="saxxmacros" type="Saxx.RecentCommentsMacro, Saxx.Macros"/>
</newtelligence.DasBlog.Macros>

Note that saxxmacros is an alias that you can choose freely (just remember it later), Saxx.RecentCommentsMacro is the name of the class (including namespace) and Saxx.Macros is the name of the DLL file. So, we’re done with the web.config file. Now you can start and edit your templates.

When you want to call your method in one of your templates, it has to look something like
<%RecentComments(12, 20)|saxxmacros%>
where RecentComments is (of course) the name of your method and saxxmacros is the alias you chose before.

That’s it. Have a look at the numerous methods of the DataService property I mentioned earlier – you can access almost every aspect of dasBlog through it. Knowing this you should be able to write about every macro you can think of …

Redesign

So. Anlässlich des Umzugs von Blogger auf dasBlog hab ich jetzt auch das Design überarbeitet. Ziel war eine bessere Lesbarkeit, bessere Übersicht und bessere Anpassung an verschiedene Auflösungen.

Also, mir gefällts. Allerdings ist jetzt aber auch mitten in der Nacht und ich bin leicht angeheitert – mal schaun wies mir morgen so zusagt.

Valentinstag? Ok, aber …

Nachdem wir (Günther, Stephan, Christian, Katrin und meine Wenigkeit) nach einem Nachmittag mit Saw und Kegeln auch noch Saw 2 im Kino begutachtet haben, ist bei der Heimfahrt eine hitzige Diskussion entbrannt. Zum Thema stand das bekannte Problem, dass es zwar einen Tag für Frauen, nämlich den allseits bekannten Valentinstag, gibt, aber keinen für Männer. Den guten Günther hat diesen Missstand aufs Äußerste erregt.

Glücklicherweise konnte ich seine Erhitzung abkühlen, indem ich erklärte, dass es durchaus eine männliche Alternative zum Valentinstag gibt – nämlich den genialen Schnitzel-und-Blowjob-Tag, jedes Jahr pünktlich am 20. März. Verbreitet die Kunde.

ICQ ist tot, lang lebe Jabber

ICQ zickt bekanntlich schon die längste Zeit herum. Die aktuellen Probleme mit Miranda uä. sind nur der Tropfen der den heißen Stein zum Überlaufen bringt. Daher hab ich beschlossen, dass ich über kurz oder lang ICQ den Rücken kehren werde/muss.

Und die einzige wahre Alternative ist das freie, standardisierte Jabber Protokoll. Jabber wird von praktisch allen Instant Messaging Clients unterstützt (auch von Miranda oder Trillian), ist aber nicht von einem einzigen Server abhängig, sondern es gibt eine ganze Menge davon in der weiten Welt verteilt. Dadurch, dass das Protokoll offen ist, kann jeder der will einen eigenen Client programmieren bzw. anpassen – und daher gibt es Unmengen davon zum Download.

Und wie wenn das nicht genügen würde, unterstützt Google über Google Talk (viel angenehmer als Skype) ebenfalls Jabber. Das Genialste ist aber, dass nun Gmail (der webbasierte E-Mail Client von Google) perfekt mit Google Talk zusammenarbeiten kann – bedeutet, dass man wunderbar aus dem Gmail-Interface webbasiert chatten und instant-messagen kann (ich habs grad ausprobiert, funktioniert extrem fein, und man merkt kaum einen Unterschied zu einem "installierten" Programm).

Leider ist ICQ unter meinem Bekanntenkreis schön weit verbreitet und ich gebe mich nicht der Illusion hin, dass ich jemanden zum Umstieg auf Jabber bewegen kann. Trotzdem – jeder der Gmail benutzt hat jetzt automatisch einen Zugang ins Jabber Netzwerk inklusive (man beachte die neue Kontaktliste links) und darf und soll mich in seine Liste aufnehmen. Ich werde in Zukunft verstärkt über Jabber (Google Talk, wenn mich jemand reden hören will) online sein, dafür meine ICQ und Skype Aktivitäten zurückschrauben.

Ich weiß zwar nicht, ob das noch notwendig ist (soweit ich weiß benötigt man eine Einladung, damit man ein Gmail Konto anlegen kann), aber: Sollte jemand Interesse an Gmail haben, so schicke ihm dem- oder derjenigen natürlich gerne eine Einladung – man melde sich einfach über obige E-Mail Adresse.

Herzlichen Dank für eure Aufmerksamkeit (würde der Kafka Markus jetzt sagen).

4 Dinge

Ich nehm einfach mal das Stöckchen von Johannes auf …

4 Jobs, die ich in meinem Leben hatte
– Student
– Softwareentwickler
– Inventur-Macher
– Bank-Mensch

4 Filme, die ich mir immer wieder ansehen könnte
– Pulp Fiction
– Snatch
– Lock, Stock and Two Smoking Barrels
– Sin City (mit Fragezeichen, weil ich den erst einmal gesehn hab, ihn aber genial fand. Zumindest die noch zugepackte DVD liegt schon bei mir rum)

4 Orte, in denen ich schon gewohnt hab
– Saint Jones (hell yeah)
– Bimberg
– Rohrbach (Krankenhaus für ein paar Wochen und Grimsnhof für ein paar unzusammenhängende Tage)
– Meine Fantasiewelt (mein Lieblingsplatz)

4 TV Serien, die ich gerne sehe
– Coupling
– Scrubs
– South Park
– That 70s show, Stargate SG1, Battlestar Galactica, Futurama, Farscape, Babylon 5, Seinfeld, Stargate Atlantis, Malcolm in the Middle, Gilmore Girls, Firefly, Spongebob und noch tausend andere

4 Plätze, an denen ich schon im Urlaub war
– Spanien
– Frankreich
– England
– Kroatien

4 Webseiten, die ich täglich besuche
www.gmail.com
www.google.com/reader – und damit auch alle Blogs, die ich lese
www.myepisodes.com
– und, das muss ich zugeben, www.RandomInsights.net – nur, um zu schaun obs noch geht und wegen der Webstatistiken

4 meiner Lieblingsessen
– Eispalatschinken
– Hascheeknödel
– Kartoffelgratin, ohne alles, nur mit Kartoffeln, Käse und Sauce
– Käsetoast

4 Plätze, an denen ich gerne sein würd
– Irgendwo, wo ich nicht Schneschaufeln müsst
– Irgendwo, wos ein bisschen wärmer wär (aber nicht viel, max. 20°)
– Beim McDonalds, ich hab grad Appetit
– Bei meiner SO (in Insiderkreisen übrigens seit neuestem als "de ane hoit" bekannt), vor allem weils da wärmer ist als bei mir 😉

4 Blogger, denen ich das Stöckchen zuwerfe
egal, wer auch immer soviel Zeit hat wie ich

Schneechaos

10. Februar 2006, Saxx-"Schneeschloss"-Manor, Bimberg

Geliebtes Tagebuch,

würde der gute Dr. Joe, unser süßer kleiner, stets nervöser, Landeshauptmann auch nur einen Blick auf Saxx-Manor werfen, würde er keine Sekunde zögern und sofort den Katastrophenalarm ausrufen.

Unser Dach ist ja schon seit Tagen vollständig eingestürzt (Teile davon schon im Sommer), und es fehlt an Geld, Material und Lust um es zu reparieren. Daher habe ich die Nacht mit unserer Katze und zwei Dachsen verbracht. Wir haben uns gegenseitig gewärmt, anders wären wir wohl alle vier erfroren. Trotzdem schien es den beiden Dachsen nicht so recht zu sein, denn sie bissen und kratzten mich, auch und vor allem im Genitalbereich, die ganze Nacht, während ich sie fest an mich drückte. Trotzdem, meine Zehen haben zwar eine leicht ungesunde grünlich-schwarze Farbe angenommen und meinen linken Arm kenne ich nur mehr vom Sehen, aber ich lebe noch, um einen weiteren Tag mit Schneeschaufeln zuzubringen.

Zuerst schaufelte ich den Weg vom Bett ins Badezimmer frei, dort musste ich erst die Toilette freischaufeln und deren Eispanzer brechen. Danach suchte ich die Nadel im Heu- bzw. die Zahnbürste im Schneehaufen. Anschließend grub ich mir einen Gang auf das eingestürzte Dach des Westflügels von Saxx-Manor und warf einen prüfenden Blick auf die Nachbarschaft. Alle Häuser schienen schön warm und heimelig zu sein, aus allen Schornsteinen stiegen kecke Rauchwölkchen und durch ein paar Fenster konnte ich glückliche Familien um einen Kamin sitzen sehen, während Mutter und Kinder heißen Früchtetee, der Vater wärmenden Scotch schlürften.

Saxx-Manor wird ja schon einige Zeit nicht mehr beheizt, da die Heizvorräte, die wir uns den ganzen Sommer über angelegt hatten, Anfang November zur Neige gingen. Zur Not habe ich alle verbliebenen brennbaren Materialen wie Möbel, Bücher, Zeugnisse und Kleidung (wobei sich vor allem Letzeres jetzt im Nachinein betrachtet als Fehler und als etwas kurzsichtig erwies) verheizt, aber auch das hielt nur bis Mitte Dezember. Jetzt kann ich mich nur warmhalten, indem ich Tiere aus dem Wald ganz fest an mich drücke …

How I moved my posts and comments from Blogger to dasBlog

I wanted to move away from Blogger for quite some time now, but I always feared the difficulties in exporting my Blogger posts (and comments, don’t forget about the comments!) and importing them into a dasBlog installation. Well, my fear was totally gratuitous, it’s actually pretty easy. Here’s how I did it:

  1. First, go to your Blogger settings, set the number of posts to display to 999 and the timestamp format to MM/DD/YYYY HH:MM:SS. Save these settings but don’t publish.
  2. Next, edit your main template and change it to this:
    <?xml encoding="utf-8" ?>
    <entries>
    <Blogger>
    <entry>
     <title><![CDATA[<$BlogItemTitle$>]]></title>
     <body><![CDATA[<$BlogItemBody$>]]></body>
     <date><![CDATA[<$BlogItemDateTime$>]]></date>
     <BlogItemComments>
     <comment>
      <commentauthor><![CDATA[<$BlogCommentAuthor$>]]></commentauthor>
      <commenttext><![CDATA[<$BlogCommentBody$>]]></commenttext>
     </comment>
     </BlogItemComments>
    </entry>
    </Blogger>
    </entries>

  3. Now, don’t publish or save, only press Preview. Get the HTML source of the preview page, and copy everything between (and including) <?xml …> and </entries>, and save it to a new xml file. I called my file archive.xml. Now we’ve all your posts and comments stored in a nice XML file. Close Blogger, we won’t need it anymore.
  4. Behold, here comes the tough part (but it’s still pretty easy). Create a new C# console application in Visual Studio (it will work without Visual Studio of course, but I’m really not a fan of using the compiler with the command line), and paste this code (sorry for the missing comments, but I think it’s pretty straight forward):
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml;
    using System.Globalization;
    using newtelligence.DasBlog.Runtime;

    namespace ConsoleApplication1 {
    class Program {
    static void Main(string[] args) {

    XmlDocument doc = new XmlDocument();
    doc.Load(@"d:archive.xml"); //change this path

    IBlogDataService dasBlog = BlogDataServiceFactory.GetService(@"c:content", null); //change this path

    foreach (XmlElement elem in doc["entries"].GetElementsByTagName("entry")) {
    Console.WriteLine(elem["date"].InnerText);
    CultureInfo c = new CultureInfo("en-us");
    DateTime date = DateTime.Parse(elem["date"].InnerText, c);

    Entry entry = new Entry();
    entry.Author = "Saxx";
    entry.Content = elem["body"].InnerText;
    entry.Description = "";
    entry.Title = elem["title"].InnerText;
    entry.CreatedLocalTime = date;
    entry.CreatedUtc = date.ToUniversalTime();
    entry.ModifiedLocalTime = date;
    entry.ModifiedUtc = date.ToUniversalTime();
    entry.EntryId = Guid.NewGuid().ToString();
    dasBlog.SaveEntry(entry);

    foreach (XmlElement e in elem.GetElementsByTagName("comment")) {
    Comment comment = new Comment();

    string author = e["commentauthor"].InnerText;

    if (author.Contains(">")) { //removes the links around the comment authors names
    author = author.Substring(author.IndexOf(">") + 1);
    author = author.Substring(0, author.IndexOf("<"));
    }
    Console.WriteLine(author);

    comment.EntryId = Guid.NewGuid().ToString();
    comment.TargetEntryId = entry.EntryId;
    comment.Content = e["commenttext"].InnerText;
    comment.Author = author;
    comment.CreatedLocalTime = date;
    comment.CreatedUtc = date.ToUniversalTime();
    comment.ModifiedLocalTime = date;
    comment.ModifiedUtc = date.ToUniversalTime();

    dasBlog.AddComment(comment);
    }
    }
    }
    }
    }

  5. Next, change the two paths in this code according to your system. I had my archive.xml stored on drive D: and I created a directory content on drive C:. This directory is where the dasBlog posts will go – you’ll have to create it manually before running the code.
  6. One last step. Add a reference to the file newtelligence.DasBlog.Runtime.dll, that is found in the /bin directory of dasBlog, to your console application. In this assembly is all the intelligence we need to (re)create the posts for dasBlog.
  7. That’s it, run the application. Depending on the number of posts and comments it can take a while, but when it’s done you’ll have a lot of XML files in your target folder (remember, mine was c:content). Now copy these files to the /content directory of dasBlog. That’s it. Thanks go to Rick Hallihan who gave me some ideas.

Umzug (2)

So, nach ein paar weiteren Stunden des Werkelns kommt mein Weblog so langsam wieder in die Gänge. Oberflächlich sieht es schon fast wieder aus wie das alte (von ein paar kleineren CSS Fehlern abgesehen, aber das sind, wie gesagt, nur mehr Kleinigkeiten).

<techtalk>
Es handelt sich dabei um newtelligence DasBlog in der aktuellen Version. Für diese Blogging Software hab ich mich deshalb entschieden, weil es erstens mit ASP.NET läuft und zweitens keine Datenbank benötigt. Außerdem verwenden es ziemlich viele, daher kann es nicht so schlecht sein ;).
</techtalk>

Vorläufig reicht es mir mal mit dem Customizing, in den nächsten Tagen werd ich aber das Design fertig anpassen und die letzten Probleme ausmerzen. Stay tuned.

ps: Ich hoffe, es ist jedem aufgefallen, dass mein Weblog jetzt unter neuer URL läuft – bitte Bookmarks und RSS/Atom Reader anpassen.

Umzug

So, es ist nach Mitternacht und ich habe den Kampf mit Blogger aufgegeben.

Irgendwie schafft es Blogger nicht, mein Blog wie üblich über FTP zu veröffentlichen, seit ich auf den neuen Server umgezogen bin (daher sind auch die ganzen neuen Kommentare nicht aufgetaucht). Daher hab ich schweren Herzens beschlossen, Blogger endlich den Rücken zu kehren und auf eine andere Blogging-Software umzusteigen. Und nachdem ich PHP aus Prinzip nicht verwende, und ASP.NET aus Prinzip schon, schied das gute alte WordPress aus, und DasBlog machte das Rennen.

Prinzipiell wollte ich schon lange umsteigen (Blogger hatte fehlerhafte Syndizierung, keine Kategorien, kein Trackback, kein Customizing und noch einen ganzen Haufen unzulänglichkeiten), aber bisher fehlte es einfach an Motiviation. Die hatte ich jetzt.

Nach einer knappen Stunde Codens konnte ich auch meine gesamten alten Blogeinträge inkl. Kommentare übernehmen (was mir sehr wichtig war). Die nächsten Tage werde ich noch am Design und am Blog selbst feilen. Aber jetzt geh ich ins Bett.