Friday, June 30. 2006
A few weeks ago, Sven reminded me of an inherent problem of the current design of tpp's file format, namely it's line-based file format which gives no options to e.g. set text properties like bold or underlined for only a single word or a phrase. Currently, the whole line must be made bold, underlined or whatever.
For those who don't know: tpp is the "PowerPoint for the console" that I wrote together with Nico Golde and currently the (IMHO) only mature solution to do presentations solely using text terminals.
A quick look over the existing commands in the current file format shows three (no, four, nobody
expects the Spanish Inquisition!) classes of commands: - presentation-wide commands: presentation title, author, date, header, footer, border
- slide-wide commands: header, footer (to override to presentation-wide default, if set)
- line-wide commands: output, shell output, special effects, alignment
- character-wide commands: text color, text properties like bold, underlined, reverse, ...
Now, the goal is to reflect this new specialization and change in what tpp should provide into a new, better file format, to make tpp more flexible than right now.
One option would be to use an XML schema, but that is not a very attractive option, since XML would be a lot too verbose to actually make it fun to write tpp presentations.
Another approach would be to keep with most of the current problems, and to introduce additional, Wiki-like formatting methods, like using stars or underlines or something like [bold|The text supposed to be bold] or [bold,fgcolor=blue,bgcolor=white|blue/white text, bold]. The only disadvantage: it would make the parser a lot more difficult than it currently is. But probably it is
too simple, anyway.
So, what's your opinion on that? I would like to hear your comments, and to do some brainstorming instead of just starting some experimental quick-shot implementation.
Um von dem Fußballdebakel abzulenken: Hat Jan Ullrich gedopet? Nein, meine ich. Im Fernsehen wurden Blutbeutel mit der Aufschrift "sangrias" gezeigt. Wie man also klar erkennen kann: die Dopingkommission hat "sangre" (Blut) mit "sangria" (Sangria) verwechselt, höchstwahrscheinlich aufgrund des zu hohen Konsums ebendieses Getränks.
Der Schiedsrichter war schuld. Wie felipe schon erwähnt hat, schon etliche Spiele wurden vom Schiedsrichter entschieden, so auch hier. So schlecht gepiffen, gigantisch. Etliche Fouls der Deutschen wurden nicht gegeben, das Handspiel der Deutschen im eigenen Strafraum wurde ja im Fernsehen nicht wiederholt, IMHO ein Zeichen einer tendenziösen Berichterstattung, um die schlechten Entscheidungen (oder gar die Agenda) des Schiedsrichters zu vertuschen. Mich würde es ja nicht wundern, wenn nach der WM rauskommen würde, dass der Schiedsrichter bestochen worden ist.
Das Bier ist eingekühlt. Dann lasst uns alle anschauen, wie Argentinien die Deutschen panieren wird. Prost auf den zukünftigen Weltmeister Argentinien!
Thursday, June 29. 2006
So, mit heute, 18:00, hab ich meinen allerletzten Dienst in meiner Bundesheerzeit, vorübergebracht. Ein weiteres Zeichen, dass sich das Bundesheer für mich zur Ende neigt, naja, auch nicht verwunderlich bei einer Lage von 7. Ja, das ist korrekt, in exakt einer Woche werde ich abrüsten. Das dazugehörige Chaos bricht jetzt schon aus, und alle werden so langsam verrückt.
Monday, June 26. 2006
JJ 1, der Bär, der Tirol und Bayern terrorisierte, ist tot. Wochenlang wurde er verfolgt und gesucht, doch es war unmöglich, den Bär aufzuspüren. Jetzt wurde er zum Abschuss freigegeben, und schon wurde er erlegt.
Was ich daran höchst interessant finde: wochenlang wurde er gesucht, und genau zu dem Zeitpunkt, wo er zum Abschuss freigegeben wurde, wird er auch gefunden und kurzerhand erlegt. Vom Timing her ein eher merkwürdiger Zufall.
Meine Verschwörungstheorie: die lokalen Jäger in Bayern bzw. Tirol haben die Suche nach dem Bären zu dem Zeitpunkt, wo der Bär noch nicht zum Abschuss freigegeben war, bewusst behindert bzw. falschen Fährten verfolgt, bis zu dem Zeitpunkt, wo die Freigabe kam. Was ist die Motivation der Jäger dafür? Nun, so ziemlich jeder Jäger ist scharf, mal so ein Tier wie einen Bären zu erlegen. Sehr oft kommen die ja nicht in freier Wildbahn vor, und noch weniger oft darf man die dann auch abknallen, insofern macht so ein Bär eine gute Trophäe, und damit angeben zu können, man selbst habe JJ 1 erlegt, ist gut zum Angeben im Wirtshaus. Deshalb denke ich, dass die Jäger sich das so ausgemacht haben, auf eine Freigabe gewartet haben, und den Bären dann relativ schnell aufgespürt und erlegt haben. Und um die Tierschützer, die sich gegen einen Abschuss aussprachen, zu diskreditieren, unterstellt man ihnen einfach mal Morddrohungen gegen den bayerischen Umweltminister.
Sunday, June 25. 2006
Today I finally sat down to remodel my HTTP stack/server from a forking model to a multithreaded model using the pthread library. Actually, this is my first project where I use POSIX threads, and I was delighted how easy it was to integrate them into my relatively well-designed program.
The server now works as follows: the "main" thread first creates a number of worker threads, and then accepts connections, puts them into a queue and then notifies the worker threads. The next worker thread that is ready takes the connection from the queue and handles the incoming requests. This is definitely a very simple design, which was also very easy to implement. The results can be found in httpstack/branches/pthread in the SVN repository. As usual, comments are welcome.
The next thing is where I will move that project. One idea I had was to integrate a database connection pool, and in addition probably a simple object-relational mapper, then an HTTP management interface for the whole thing and then some CMS.
Tuesday, June 20. 2006
George W. Bush ist heute in morgen in Wien. Ich auch (zumindest morgen). Und zwar auch der Demo des Jahres, eine der wenigen Demos, bei der es wirklich um was geht. Niko und ca. 9998 weitere Menschen werden auch mit von der Partie sein. Es kann also spannend werden. Ich bin auf jeden Fall paranoid und nehme mir meine eigene Schutzmaske mit. Man kann ja nie wissen.
Monday, June 19. 2006
Since the current temperatures are way too hot, I'm presenting a few temperature-scale-related Wikipedia links today.
I guess almosteveryone who learned programming also wrote a program to convert temperatures from one scale to another, e.g. Celsius to Fahrenheit and the other way round. This list provides an overview over other scales, some of which are quite interesting, like the Newton scale, which defines 0° to be the temperature where water starts freezing and 30° where water starts boiling, or Rankine, which is to Fahrenheit what Kelvin is to Celsius. But in my opinion, the most interesting scale is Delisle, which goes the other way round: the 0 Kelvin are 559.725 °Delisle, while 100 °C are 0 °Delisle, and the surface temperature of the sun (about 5526 °C) is -8140 °Delisle.
But besides the temperature scales, let's hope that temperature goes a bit down, almost everybody around me is suffering from the hot and the relatively high humidity makes sustaining the heat even harder.
Saturday, June 17. 2006
I really enjoy surfing on Wikipedia for surfing, discovering all kinds of articles, mostly of stuff I've never heard about before, or that are either just hilarious or extremely obscure. This brought me to the idea to present a funny, interesting or boring Wikipedia link (or even more) every day. I will tag such postings with "wplotd" (Wikipedia Link of the Day).
Today's links are:
Abecedarium
Glossarium verborum computatralium
Friday, June 9. 2006
In the last few days, I was working hard to finish a first working version of my "cwapd" (totally uninspired name, I know, it's supposed to mean "C++ Web Application Platform Daemon"). It is based on my previously-mentioned HTTP stack.
The basic concept of cwapd is that one or several base URLs can be mapped to so-called "contexts". As soon as a URL that begins with one of the registered base URLs is called, the "action" (i.e. the part of the URL after the base URL) is handed over to the registered context. This context then handles the request, and returns the result. As a feature, methods can be easily associated with actions (see my previous posting), which means that no manual dispatching is necessary. Alternatively, actions can also be handled manually, e.g. for cases where the "action" actually represents something like a filename (think of a context that delivers static files like a "normal" web server).
As a simple example, I also created a "wallpaper_context" class that automatically scales images to the optimal wallpaper size of the respective client, employing Magick++ and WURFL. This could be e.g. useful for people who want to deliver mobile phone wallpapers via WAP. The code itself is really simple, the wallpaper_context class contains nothing more than 77 SLOCs, showing that writing custom contexts is extremely simple.
The only "big" thing that is still missing from it is proper handling of configuration. Currently, many things that are actually supposed to be stored in configuration files are hard-coded in the source code. So, if anybody could recommend me a flexible configuration engine with an interface to C++, I'd be happy about it.
Anyway, if you're interested in the code, simply have a look at the SVN repository.
Wednesday, June 7. 2006
I just created a pretty neat callback mechanism for C++: template<typename T> class callback { public: callback(T* obj, unsigned int (T::*func)(string, ostream&, header_container&, cgiparam_container& )) : callee(obj), cb(func) { } ~callback(); unsigned int run(string actionstr, ostream& os, header_container& hdrs, cgiparam_container& params) { return (callee->*cb)(actionstr,os,hdrs,params); } private: T* callee; unsigned int (T::*cb) (string,ostream&, header_container&, cgiparam_container& ); }; class context { public: context(); ~context(); unsigned int dispatch_action(string actionstr, ostream& os, header_container& hdrs, cgiparam_container& cgiparams); protected: void register_action(string,callback<context>*); private: map<string,callback<context>*> actions; };
The implementation of register_action() looks like this: void context::register_action(string action, callback<context>* cb) { actions[action] = cb; }
And this is used in the following way (called from within the context class): register_action("foobar",new callback<context>(this,&context::some_method));
Now, the problem that I have is that that adding callbacks that are not actually within the context class but within a derived class is only possible with lots of ugly casting (but it seems to work afterwards): #define REGISTER_ACTION(name,action) do { register_action((name),new callback<context>((context*)this, (unsigned int (context::*)(std::string, std::ostream&, net::header_container&, net::cgiparam_container&))&action)); } while(0)
Do I see correctly that C++ seems to have certain problems with derived classes and templates, especially when it comes to using pointers to methods? Any input is welcome on how to remove this ugly casting while keeping the same functionality.
Microsoft hat seine Antivirensoftware für Email-Server namens Microsoft Antigen vorgestellt. Tja, wie der Titel dieses Beitrags schon andeutet, ist der Produktname ziemlich schlecht. Antigene sind nämlich Stoffe, die die Bildung von Antikörpern anregen. Dabei befinden sich die Antigene auf der Oberfläche von Bakterien und Viren oder auch z.B. Pollenkörnern. Und wie soll man das jetzt im Zusammenhang mit Microsoft-Produkten verstehen? MS Antigen haftet an der Oberfläche von MS Windows, und macht es eindeutig als schädliche Betriebssystem-Installation erkennbar? Ich nehme mal nicht an, dass das so beabsichtigt war.
Sunday, June 4. 2006
Tja, von gestern auf heute wieder mal Wachbereitschaft gehabt. Da uns ziemlich fad war, hab ich meine Digicam ausgepackt (siehe unten). Mehr Bundesheer-Fotos von mir, u.a. auch von heute, gibt's übrigens hier.
Im Gegensatz zu anderen Kasernen gab's bei uns übrigens noch nie einen Delta-Alarm.
Saturday, June 3. 2006
On this picture you can see one of the few rare "1337" dog tags of the Austrian Army. These are not officials ones, of course, as no Austrian soldiers will ever have this unique ID, but they are made out of the very same material and with the very same machine as all the dog tags that are produced in Upper Austria for the Austrian Army. A good friend (you know who you are) will get one of them, I will keep one for myself, and the other three that I have will be handed over to 1337 people at the right occasions...
Oh, and many thanks to Tjulz and "Lulu" Landerl for producing the dog tags for me!
|