Artikel - 8.10.2005 - 27.10.2005

Bock: meet Gärtner

Shift of the Biotechnology Sector to the Ministry of Economic Affairs Feared - Within the Union, there is discussion about transferring responsibility for agricultural biotechnology from the Consumer Protection Ministry to the Ministry of Economic Affairs. - Umweltschutz-NEWS.de

And that with Scatman Ede as the economic miracle. Well, whether his underlings would have turned against him would be doubtful anyway. But certainly a great idea if those who are well greased by the industry are the ones to decide on the use of biotechnology ...

PostgreSQL 8.1

PostgreSQL 8.1 with Two-Phase-Commits and User Roles:

Transactions can now be prepared on multiple computers with PREPARE TRANSACTION and executed together later. If a machine fails after PREPARE, the transaction can be correctly completed with COMMIT after the restart.

Yes!

Eerie Alliance

When industry, union members, and the CDU join forces to prevent the nuclear phase-out.

XML under Patent Protection?

Patent nonsense in extra strength: XML under patent protection?. But patents are such a great innovation engine, so it's quite right when a company with a patent that it has never implemented in any form, suddenly makes itself a presence in an area that has been in practical application for many years.

Akismet - Centralized Anti-Spam Filter

Photomatt (from WordPress) has built a central anti-spam service called Akismet that can be used with WordPress via a plugin. Additionally, there is an API that allows other services to be integrated. Basically a good idea - even though I generally have an aversion to central services, unless I myself operate these central services.

What really bothers me, however, is this small excerpt from the FAQ:

Well without giving too much of the secret sauce away, we can safely say that it would be pretty difficult to poison Akismet.

So central service - okay. I don't like it, but it certainly makes sense for others who cannot or do not want to operate such a service themselves. But "secret sauce" - I should send my comments with the personal data of my commenters to a foreign system, where I can't even see the software running behind it? Sorry, no thanks.

"Fitting on" some framework

How do you know wether a framework fits your style of thinking? It's not as if you could just look into a mirror wether it suits you nicely, you need other ways to decide that. One way to decide it is productivity - how fast you get your project up and running.

But does that really tell you the whole story? What if the project would have been something completely different? Did you just hit the sweet spot of the framework? Where you just lucky?

One way to decide wether some framework, language or tool fits my style of working for me is to look at the basic abstractions this tool gives me. And to look how I can use them and how naturally they fit my thinking - do I stumble on problems, not immediately knowing what abstraction to use, what tool to pull? Or do things just fall in place?

I discovered quite early on that I am a bit uncommon in programming, in that I don't build my own abstractions and try to translate from them into what the language or framework gives me, but that I start to think directly in the abstractions and syntaxes given to me - but only if they match my way.

So that's for me the ultimate measurement of wether a framework really fits into my thinking: checking from time to time wether I try to do translations or wether stuff just flows. Reaching "the flow" is what it's all about for me nowadays.

So how does Django match up? Quite nicely. It really gives me what I need in most cases, there are only very few areas where "the flow" is broken, where I need to think around problems, start to do translations. One area is special behaviour of entry fields - this curently is done in Django with parameterized instances of predefined field classes. There is no really nice way to do subclassing, you end up copying code from other parts of the django source - definitely breaking "the flow".

But most other parts just fall into place: middleware for global management of the request-response span. Template loaders for - well - template loading (yes, it's not a big deal - but being able to write your own template loader really is helpfull). The urlpatterns -hey, that's really a cool idea, because of it's absolutely loose couplying you don't even try to model your urls after your code structure, but tend to design them. And that's how it should be.

Models just powerfull enough to really move the model-related functionality there (although the class MODULE stuff will make it even nicer, especially the kind of ugly module_globals thingy). It would be cool if model classes would support mixin classes, so that abstract apps could provide stuff that just would be referenced by users to add functionality. But you can solve many of those problems with generated classes - thanks to python introspection (although you need to know a bit about djangos model-magic).

Most complex stuff tends to go into template tags and generic views - my CMS project currently only has 3 view functions of it's own, the rest is abstracted away into generic views (for searching and tagging). Template tags could be a bit easier to write, especially the parser is too primitive - a library of helper functions for easy deconstructing the tag string would be good (hey, maybe I write one, the basics arealready in my SVN repository).

Template filters are a big of an ugly duckling - they don't see the request context, so they can't do much more than just take the incoming object and some constant parameters. I think they should get the context passed in, so that they could be a bit smarter, if needed (like allowing filters to resolve a parameter against the context).

Generic views are quite nice, too - even though I don't use the predefined ones that often. The main reason is that more often than not I end up in wrapping the generic views in some code that modifies their behaviour - and then it's quite often simpler to just roll my own. But they are great for first starts into areas, just tack them into your project and funcitonality is available. You can allways exchange them with your own view functions if you discover that you need to.

And the admin, the one thing that makes Django stand out in the crowd? In my first play-projects I loved it, in later ones I didn't use it (the Gallery doesn't need it), but with the CMS project I did the first one that makes really heavy use of it. And I have to say, I like it. It should get a bit more flexibility (the new_admin branch might help there, as it moves more stuff into templates, so they can be overridden), but overall it's really cool and usefull.

Two things, though, are definitely needed for the admin: full transaction support bound to request-response (ticket #9 in the django trac), because changing stuff and ending up with inconsistent tables is no fun. Like getting an exception because something broke in repr , so the log entry isn't written, but the object is written. Of course you don't notice it, go back, send again, end up with two objects and still no log message ...

The other thing that is needed: basic hooks for object-based authentication. Not a full blown ACL or anything like that, just some really simple hooks from the admin to the model that the user can define to tell the admin wether some object should be editable or should only be shown readonly. The main problem with the current solution is, it only handles full tables - you can't even tell the admin that some user can only work on the current site and can't change objects of other sites (my CMS project makes heavy use of the multi-site capability in Django - one admin server should manage multiple sites in one admin interface).

But all in all webapp building with Django is real fun. It's not only productive to me, it just feels natural to do things the Django way. So, yes, Django fits my thinking style. Seems to have hit home right on.

Markdown for Django

Django already includes a markdown filter (in contrib.markup), but I nonetheless rolled my own Markdown for Django mini-app. The main benefits are link integration with django models (by using generic model queries and get absolute url), a documentation generic view that handles language switching and a nice macro facility for markdown. Macros are a usefull way to extend markdown by writing Django template snippets that are called whenever the users calls the makro in his markdown source.

It was formerly part of the CMS project, but I think it's usefull in it's own and so much better put into the stuff pseudo-project.

Twisted Book is out

Those who can't easily squeeze their brains into the twisted world of Twisted might find help in Twisted Network Programming Essentials - a new book on what is probably the most powerful internet protocol platform for Python.

Google's Web Accelerator and Damager

Google at it again - Ian pretty much says everything there is to say about it. Google claims they don't want to be "evil." But they are infinitely stupid, as shown by the repeated launch of the Web Damager.

What does the Web Accelerator do, and why is it such a stupid piece of software? Well, it simply follows links. And it does so in advance, before the user does - so to speak, speculative web crawling, but privately for the user. That doesn't sound so bad at first, except that servers are bombarded with traffic they might never have otherwise - because every link is followed, even if the user doesn't go there. And that multiplied by the users who use this thing...

But the traffic is not the real problem - the real problem comes when you consider the context in which this thing runs. And that is, it runs on the user's private computer, between the browser and the network. Just a little proxy of its own. Which, for its work, remembers cookies and similar things and then sends requests to the pages that look as if they come from the user's browser. With their security headers. And cookies.

Apart from the fact that I wouldn't particularly like it if my headers with passwords or session cookies appeared anywhere other than in the browser and the target server - this approach also enables the Web Accelerator to look at areas that a central crawler would not see. For example, areas of pages that are behind logins. Content management systems, where additional links appear after login. Wikis, whose edit links then appear when someone starts a session. Webmail systems, where each mail is represented as a link.

All these systems have one thing in common: for changing actions, a form submission is not always necessary. Often, it is enough to click a link. The current version of a page in the wiki to delete quickly to remove wiki spam - a simple link, only visible to the logged-in user. The mail in the webmail inbox, which is automatically marked as read when called up. The publish link in the CMS, with which a page is put live.

Of course, responsible web application programmers try to put destructive actions behind forms (and thus POST requests) so that a simple link doesn't destroy anything. But this usually only happens in the publicly accessible areas, where otherwise the web robots of the various search engines and spam automata would cause chaos.

But precisely in the areas shielded by login, one normally does not expect automated clicks - and therefore builds comfort features, because one can be sure that a link is clicked consciously and intentionally.

Well, until the Google Web Accelerator came along. From the company that claims to understand the web. Thanks a lot, you assholes.

PS: and contrary to the first version, the new version no longer sends a header with which one could recognize the prefetch requests in order to block them in such critical areas.

Spam Block List Ran Amok

Guess who that was? Exactly - SORBS. My favorite collection of technical incompetence and social stupidity. Couldn't someone initiate a UDP against the pipes?

generic search service for Django

If your Django application needs searching capabilities, you can roll your own. Or you can use my generic search view. This provides a parser for queries and a search machinery that is suiteable for moderate database sizes. It provides an extensible google-like syntax.

The main problem is that django doesn't support OR query combinations and that it doesn't support "icontainsnot" queries. So the search engine does multiple selects to get one query. It starts with the longest search word and goes down in size from that result set, restricting it from one step to the next. But since it needs to keep the last result set in memory (at least the list of IDs), if your database contains too much rows, this might pose problems to your server (especially if the users do silly queries that produce large resultsets).

Maybe in future this will learn some optimizations to make it work better with larger databases, but it's quite fine as a search engine for your blog or standard content management systems.

Ubuntu Breezy Badger

I pulled the Live+Installation DVD (hey, T-DSL 3000 rules!) and must say, I'm really surprised. Okay, there are a few issues: the keyboard layout is suggested as the default for the PC - but a Mac notebook can have different layouts (externally a PC keyboard, but internally always a Mac keyboard), so the selection should be a bit more clever. If you switch to the Macintosh keyboard in the selection, special characters like the pipe symbol and curly and square brackets and AT and such no longer work - with PC allocation, however, the labeling of the Mac keyboard does not match. And there is no allocation for the Mac special characters.

What also doesn't work is the second monitor - it is simply not detected and activated, not even initialized. Too bad, because Macs do have multi-monitor support by default, at least the PowerBooks and PowerMac models (the iBooks and iMacs only partially and then only with hacks). That should also be included in my opinion.

But otherwise - nice thing. That WLAN is not recognized is normal - or it is recognized, but not usable. Apple's WLAN chips are often not supported there. I also don't know where Bluetooth is configured - I probably need to install packages first. But that could also be done automatically in my opinion if a Bluetooth adapter is detected. Nevertheless, Ubuntu seems quite nice overall - it starts with usable defaults and already supports a lot of the computer. And the extensive translation of at least menus and dialogs in Gnome is very pleasant.

And that a Debian architecture is working underneath is of course particularly dear to me.

However, it is catastrophic that in the Live CD it seems that no terminal can be started anywhere ...

to flock - to gather

I don't know if the above is the right motto for me. Bookmarks in del.icio.us. Pictures in Flickr. Somehow, I prefer to have this stuff with me rather than with some central hosts.

What they do right: automatic indexing of page content, so you can find it again. If there were also an OS X version where the browser is really an OS X application (and not just an application that runs on OS X), that could really be appealing.

Version Control with SVK

Version Control with SVK is an online book about SVK - a distributed version system that works very well with SVN and CVS (among others). And it offers quite a relief especially for working with patches for upstream systems and for local forks of open source software.

The book is far from complete, but you can already find quite a lot of information in it.

very simple view functions

Sometimes you have a bunch of really simple view functions in your django project (yes, this is for your, bitprophet! ). View functions that are actually not more than just a render to response call - take a template, take some data from the request, stuff them in and render a response. It's rather boring to write them down and it breaks the DRY principle. So what to do? Write your own generic view.

from django.core.extensions \
 import render_to_response

def simple_view(request, template, **kwargs):
 return render_to_response(
 template, kwargs)

That's all. A simple and nice view function that just does that - render a template. It even can be fed with context variables from the urlpattern. Use it like this in your urlconf:

urlpatterns = patterns('',
(r'^page/(?P<arg>.*)/$', 'cool.simple_view',
 {'template': 'app/mytemplate'}),
)

That way a /page/foo/ view would be routed to the 'app/mytemplate' template with a context that just includes the variable 'arg' with the value 'foo'. And you never will need to write those simple_view functions again. For extra spices you could throw in a context_instance = DjangoContext(request) into the render to response call to even get the authenticated user and stuff like that from the request.

Mannesmann trial this time without victory for Ackermann?

Anyway, that sounds like when judges express doubts about Mannesmann acquittals:

On the first day of the trial yesterday, judges had already expressed doubts about the acquittals of Deutsche Bank CEO Josef Ackermann, former Mannesmann CEO Klaus Esser, former IG Metall chairman Klaus Zwickel, and other defendants.

Module Hacking for Django

Django itself constructs model modules dynamically from your model classes. That's what I used in my first take at the abstract tagging application. Now I found a better way in the current version - I can modify the dynamic module myself quite easily, generate a dynamic model class and push that into the model module. What it actually does is just mimicking what happens when Python defines a class - most stuff is done by the meta.ModelBase metaclass in Django, anyway. I only had to add some module hacking stuff. Python introspection rules!

What this gives you is a much cleaner interface to create the tagrelation class for your model - just a function call, no silly subclassing or superfluous assignment. Everything happens as by magic.

It is magic.

AgfaPhoto goodbye

Unfortunately, but Agfa is probably history now: AgfaPhoto cannot be saved. Even if someone buys the name now, it won't be Agfa anymore. No more APX. It's kind of a strange feeling.

Aperture

It's been announced, and now it's here - Aperture. By Apple. The video about it is nice, and it looks very useful, what they've done. And I would even let myself be persuaded to pay the almost 500 Euros - okay, Photoshop updates would be cheaper for me, but Aperture is built with a focus on RAW and Photoshop only has a RAW importer. But what really bothers me: the hardware requirements. The programmers have lost their marbles.

Yes, photo editing needs memory - after all, it's a lot of data. And you need decently powerful hardware for using filters. And yes, a fast graphics card is useful. But the minimum requirements for Aperture are already partly beyond belief - especially since we know how these minimum requirements will work - probably as well as Mac OS X with 256 MB of memory ...

Sorry, but photo editing is not rocket science and not weather simulation - what is this completely exaggerated resource demand of the software? Have today's programmers completely forgotten how to optimize?

Man, I scanned and processed an entire film with Photoshop 5 on an Apple with 128 MB of RAM and a 275 MHz 603e CPU not so long ago. Of course, RAW images are larger - but why should a photo editing program require a dual G5? Ridiculous. Delusions of grandeur.

So I'll probably just continue working with Photoshop 7, even if the Open Dialog still crashes under Tiger. At least it works decently on my nice, old 12" Powerbook (yes, the one with 867 MHz and only 640 MB of memory). It's enough for my purposes, I don't want to shell out several thousand Euros just to be able to start the photo editing program ...

Tagging with Django

Since the question about how to do tagging with Django shows up quite often, I have written a small solution to this problem: AbstractTagging. This is a generic application and generic views that give you a very simple solution to add tagging to any model you have in your django apps. It's currently used by me in my CMS project. The source is in the stuff project.

It was a bit weird to build, because I had to dynamically construct a base class you can subclass in your models - this is because of the magic in django.core.meta, where model classes are turned into modules. But the result is quite nice, I think.

What should the name be

Dooh!

The RFC 1437 is - as anyone who has read the introductory text will probably already suspect - one of the April RFCs. But somehow, this April RFC appealed to me more than any other - even if it is technically rather weak (the RFC with the carrier pigeons - RFC 1149 - is much better).

The idea of transporting intelligent life forms is not new - almost every science fiction has a variation of it. However, there is already the transport of intelligent life forms today - at least if you use a suitable definition. Of course, there is no physical transport by beaming. But what makes intelligent life forms?

For me, the central component of intelligent life forms is communication. And not just purpose-bound communication - there is also such a thing among pack animals during hunting, for example. But rather, communication for its own sake, communication for the sake of communication. Representation of ideas and thoughts, just to convey them to others, without there being a specific reason to do so.

I have been indulging in this communication for many years in various forms. For some time now, again intensified on the Internet in the form of photo albums (e.g. leicaesk and hugoesk (shut down)) or weblogs (e.g. Hugos House of Weblog Horror). Furthermore, software has always been a central means of communication for me (e.g. PyDS - a weblog and news aggregator software, or the software of this server).

This site is intended to be a supplement. Here, various media should be brought together and used jointly. No idea where this will take me, no idea if anything more than just a few test pages and general blabla will ever be created, but if you never set off, you will never be able to go on a journey.

Of course, the whole thing did not come to me immediately as a great revelation. For example, I used the domain rfc1437.de for a long time simply as a funny mail domain - mail as the idea of virtual beaming. But mail alone is a very narrow medium. Many ways of expressing myself can only be poorly transported by mail.

Moreover, it annoyed me that people kept pointing out to me that my domain was broken, just because no web server was set up ...

call of the noodle

Someone is writing a Lisp compiler for Python bytecode - very interesting, as you could use the Python libraries under a Lisp dialect. Let's see what the Lisp dialect will look like when the first release comes out and what features it will cover. With support for Lisp macros, it would be very interesting.

Using Django as a CMS

I am currently reworking one of my sites - Content-type: matter-transport/sentient-life-form. It was a Apache::MiniWiki based site before and is now in the transition to being a Django based site. The idea of the code for that site is to build a CMS based on Django that fully uses the Django admin. So the users should be able to do all management only in the admin, while the site itself behaves a bit like a Wiki. Autolinking, Autoediting of missing pages, Editlinks, Versioning (currently missing in the source) - all that should be done based on tools the Django admin provides.

This isn't for a full-blown site, though - the linked site is allmost empty, I never put much up there. It's more a project to dig deeper into the Django admin to see what it's like to work in it - so I know about that stuff when I start to build real projects.

The code itself is freely available - and there is already a nice thing in it. It's a template loader who pulls stuff from the database instead from the filesystem or from python eggs. It's "ticketed" at Django under #633, so it might make it into django.contrib some day.

Dismantling the Alleged Savior

Nice when a corporate bigwig is taken down. I've always wondered why the SPD lets an HR manager from the automotive industry reform unemployment insurance (keywords Bock and Gärtner and so on - and yes, I am aware of the auto chancellor). Will his name ever be separated from this absurd unemployment policy, or will politicians in the future still be proud of the name Hartz?

Church Tax and Non-Religious Spouses

No church!

The churches in the dioceses of Hildesheim, Osnabrück and Münster are changing the calculation of church tax - and specifically, in marriages where one of the partners is not in the church, the joint income will now be used to calculate the church tax of the other partner. Robber baron thinking, which hopefully moves as many people as possible to turn their backs on this absurd association ...

Especially in view of such rather arbitrary changes, I see the state's collection of church tax even more critically. Because the state is making itself here the accomplice of the arbitrariness of the churches over their members.

Matt Mullenweg and the Money

Well, as Ralf reports in the Netzbuch under the nice title Wordpress, the Weblog Prostitute, Matt Mullenweg - the main developer of WordPress - has once again come up with a grand idea for making money. Naturally, once again at the expense of the PageRank he has built up through the many backlinks from WordPress blogs. And of course, once again without any major discussion or at least open communication within the community. This time it's about advertising placements through some ad space marketer at absurdly high prices.

what the media is committed to

When it comes to securing advertising partners, even public broadcasters are diligent and quick:

The NDR had initiated legal steps against the order on the same day and immediately achieved a temporary suspension of enforcement. Thus, the NDR was able to continue showing the Microsoft logo in its broadcasts on election night. This is now possible again for the time being after the temporary suspension has been lifted.

Oh yes, how wonderful, the NDR really put in a lot of effort so that it can continue to slap the Microsoft logo on inappropriate broadcasts - such as election coverage. Because that's important, you have to fight for that, that must be preserved. Product placement? Oh come on, it's all just talk. Probably politics is already sponsored by Microsoft and our federal chancellor will then wear a Microsoft logo on her coat.

A model for the complete failures too ...

... in Berlin, I mean: as easy as Berlusconi changing the electoral law - because maybe then it will actually be enough for the CDU to have its own majority, without hiding behind factional squabbles and other hypocrisies. Oh well, Adenauer's heirs have mainly inherited his stupidity and corruption, with election successes it's rather bleak. It's enough to just lie to yourself about the world with your pathetic 29 percent.

Desktruktive?

Got a question for those who feel the need to accuse my blog of being destructive: could you idiots please tell me why I should be constructive when dealing with the nonsense that politicians, media, and the economy are peddling? If someone takes a dump in your front yard, you probably take it quite constructively as rose fertilizer, right? Dreamers.

Business Model of Open Source ...

... just hearing that gives me goosebumps. This absolute inability of economic interest groups to imagine motivation without a business model is sad.

IE7 and its impact on CSS Hacks

IE7 and the demise of CSS hacks is about the IE CSS hacks that have been loved over time and are urgently needed for IE6 to make CSS layouts at least presentable on the IEs. With IE7, a lot will change - and some of them will no longer work.

Urgent recommendation: Switch to conditional comments and move the CSS corrections to a separate stylesheet that can then be loaded for the IE. Unfortunately, with this you can only add CSS elements for the IE, not hide non-existent elements from the IE - possibly you can do something with overwriting elements.

In the IE Blog is a list of hacks that will be problematic with IE 7.

Seehofer strengthens the position of the SPD ...

... say Merkel and other CDU bigwigs. Why are they then making Stoiber the Minister of Economic Affairs? Or is that now a different title for the court jester? They can, in my opinion, gladly dispose of the threatened horror cabinet to Madame Tissot right away.

Spyware in World of Warcraft?

According to Bruce Schneier, Blizzard Entertainment uses spyware to check compliance with their EULA - and it's one that looks at much more than just the data from their own program, but also additional data from other applications ...

Concerning because it doesn't just read the data from its own program - but even then it would still be concerning if it were limited to Blizzard Entertainment's software. Or did any of the users of the software agree to this monitoring? To the loading of code onto their own computer? To searching system lists for information? To sending this information over the Internet?

It is also questionable how such practices can be in compliance with data protection regulations, for example in Germany.

Tailor - Version Broker

Tailor is a Python script that can exchange changesets between different versioning systems. In principle, you can also mirror repositories in other versioning systems with it.

Thatcher

Even a warmonger is being revered now, just because she turned 80. It doesn't matter that she started a war. Who cares what the media says - paying tribute is in fashion. Corrupt and perjured former chancellors are just as welcome as warmongers and other riffraff. Oh well, I'm probably just being terribly destructive right now, because breaking one's oath of office and sneaking around the law and starting wars, that's just so constructive.

Trac on Darcs

I love Trac as a project tool - and I'm quite satisfied with Subversion for version control (or, more recently, with SVK as a version control tool based on Subversion). But darcs has also excited me because it's so beautifully bureaucratic - and now there's also Trac on Darcs - a patched version that works with darcs instead of Subversion. I think I'll take a closer look at that ...

The same patch also allows a Bazaar-NG backend for Trac - which is particularly interesting because both Trac and Bazaar-NG are written in Python. I think I should take a look at that part as well.

And just now I was pointed out in IRC that SCons is also Python - a pretty nice replacement for the already quite old Make.

This all sounds almost like Developer Nirvana.

SVK - Subversion distributed

SVK is a distributed version control system with a special feature: it can mirror trees of other version control systems (including SVN) and then define working copies on them. You can mirror a Subversion repository of a project, create your own local branch, work in it, and version the changes locally. When your own branch is ready, you can make a commit against the original repository, or simply pull a diff and send it to the developer. Very nice thing, especially because of the good integration with Subversion.

vi meets Word

Shocking: vi Steuerung für Word - built as Word macros. Somehow sick. I think I need to install this ...

Django i18n status

I worked a bit more on the i18n stuff in django today and finally switched my gallery to the i18n branch. You can now see the strings on that site with either english or german settings. Other languages get english output (so if you are in Germany and still see english strings - check the language settings in your browser, wether German is defined with higher priority than English).

The code works quite nice and I think I will give it a week or so to settle and than start to put finishing touches to it - like adding much more translation hooks to the django source.

There is a hole in the canal

Here's the translated Markdown body:

Expressed differently: we have the canal empty:

However, according to WDR information, the barrier in Lüdinghausen might be about to break. Therefore, as a precaution, a state of emergency was declared for the lower reaches of the Lippe up to Ahsen.

It's strange to imagine that the canal now has a full closure at two points ...

Innovative Power of Software Patents

Because software patents have such high innovative power, Blackberry will probably disappear from the US market, because:

As part of that litigation, NTP, whose only assets are wireless e-mail related patents, had been granted an injunction banning the sale of BlackBerry devices in the United States and forcing Research in Motion to stop providing e-mail services to all American customers except government account holders.

Exactly. A company that has nothing but a few patents (which are also quite banal, as one has almost come to expect with US patents) has obtained a sales ban against another company whose product is physically available for purchase through the courts. Extremely innovative. And certainly something we need in Europe as well.

Creationist Plague

Oh, great, now the creationists are already in Thuringia. Well, no wonder, if you belong to a party that also demands a reference to God in the European Constitution...

And no, "Intelligent Design" is not a scientific theory that could be discussed as an alternative to the theory of evolution - ID is complete nonsense, religiously motivated hostility towards science. Barely disguised creationism, nothing more. Therefore, the demand for a scientific discussion of this alleged "theory" is simply nonsense.

Cryosat crashes into the ice

Shit - this is annoying. Especially because of the satellite's purpose:

This was the first mission in the "Earth Opportunity Missions" program of the European Space Agency (ESA), which aims to solve scientific problems using relatively small and cost-effective satellites. The satellite was the first to have a novel radar altimeter that can distinguish individual ice floes with very high spatial resolution and measure their thickness.

Hopefully the project will be restarted ...

I also find the Russian share interesting because of the swords-to-plowshares mentality involved: the rocket was a converted intercontinental ballistic missile ...

von Galen, his blessedness and his resistance

The WDR has a very good text about Cardinal von Galen online: Clemens August von Galen - a resistance fighter?.

The "Lion of Münster" roared well, if he did roar. He never questioned war and dictatorship as such, unless it concerned church affairs. He never found a word about the persecution of the Jews. While he feared the ideological "destruction of Christianity," the actual destruction of Judaism went unnoticed.

The article is really worth reading because it deals with the critical points about von Galen - it was about the church, the freedoms of the church. Not about democracy or freedom for all. His resistance also did not arise from him alone; he had people who urged him on. And he was a nationalist - beyond the borders, perhaps with the evil Bolsheviks, one could kill without hesitation.

The only part of his resistance that was probably really motivated by personal disgust and feeling, and not to be regarded as an attempt to protect the church, was his clear stance against euthanasia. Therefore, he was still a bit more of a resistor than most church leaders. At least that part of him can be acknowledged.

No Church!

However, the way the Catholic Church now celebrates Cardinal von Galen is embarrassing. As a great symbol of resistance, he really cannot serve - if what he achieved is the best the Catholic Church can show from the Nazi regime, then they should better remain silent in shame. This is in no way proof of the incompatibility of the cross and the swastika. Rather, it is proof that the Catholic Church was at most concerned about its own power, but had little interest in preventing this abominable regime.

Weather Blogging

In October, enjoy cake in the cozy garden cafe and later sit outside in the restaurant for a beautiful dinner - I could get used to this.

Zabel's Farewell from T-Mobile

Couldn't be better: winning Paris-Tours is certainly a pretty nice achievement. He is certainly not just old iron. And contrary to the comment in the Tagesschau, he has not been decommissioned - he has decommissioned T-Mobile. And he has recommended himself well for his Domina-Milka team once again.

Ajax differently

Subway's new Ajax framework has an interesting approach: using inspect, Python source is retrieved from a method and then translated to JavaScript. Of course, only a subset of Python is supported, but the idea is quite interesting - Python syntax for JavaScript.

Of course, the semantic differences between Python's and JavaScript's interpreter execution will bite you sooner or later, but for simpler things (and many Ajax things are actually quite banal code on the JavaScript side), you can build without JavaScript source.

The whole thing would of course be much more elegant if Python had a reasonable macro language integrated - or if you could build macros in Python in the way you can in Common Lisp. This would make the definition of the subset and the creation of JavaScript from it much more elegant. Perhaps Philip J. Eby's work on configuration languages could help - it is essentially the approach of a macro facility for Python.

Personally, I would rather pursue an approach in Python where JavaScript is generated through Python code execution (i.e., not parsing and compiling) - because many Ajax functionalities are quite standardized processes. The DOM tree is usually manipulated according to fixed specifications, with data delivered via JSON. Most of this could be well standardized. However, I don't have any concrete code ready yet, so far Ajax for me is still direct JavaScript code - although with the help of MochiKit.

Let's see what else is happening in the Ajax-Python land. CrackAjax is at least another approach that might inspire others to build on this a bit better.

Blogcounter, Penis Size Comparisons, and Other Lies

Right now, people are once again wildly discussing hit counts and similar nonsense. Usually, I don't care about these (my server has an absurdly high free allowance that I can never use, and the server load is also low - so why should I care how much comes in?), but with the various announcements of hit counts, page views, and visits, I always have to smile a little.

Just as a small analysis of the whole story. First, the most important part: where do these numbers come from? Basically, there are two possibilities. One relies on the fact that pages contain a small element (e.g., an image - sometimes invisible - or a piece of JavaScript or an iframe - all commonly referred to as a web bug (web bug)) that is counted. The other method goes to the log files of the web server and evaluates them. There is a third one, where the individual visitor is identified via a cookie - but this is rather rarely used, except for some rather unpopular advertising systems.

Basically, there are only a few real numbers that such a system can really provide (with the exception of individualization via cookies): on the one hand, hits, on the other hand, megabytes and transfer. Quite remotely useful, there is also the number of different hosts (IP addresses) that have accessed the site.

But these numbers have a problem: they are purely technical. And thus strongly dependent on technology. Hits go up if you have many external elements. Bytes go up if you have many long pages (or large images or ...). IP addresses go down if many visitors are behind proxies. And they go up if you have many ISDN users - because of the dynamic dial-up addresses. Changes in the numbers are therefore due to both changes in visitors and changes in the pages.

All these numbers are as meaningful as the coffee grounds in the morning cup. That's why people derive other numbers from these - at least technically defined - numbers, which are supposed to say something. Here, the visits (visits to the website), the page impressions (accesses to real page addresses), and the visitors (different visitors) are to be mentioned.

Let's take the simplest number, which at least has a rudimentary connection to the real world: page impressions. There are different ways to get there. You can put the aforementioned web bugs on the pages that are to be counted. Thus, the number is about as reliable as the counting system. Unfortunately, the counting systems are absolutely not, but more on that in a moment. The alternative - going through the web server log files - is a bit better. Here, you simply count how many hits with the MIME type text/html (or whatever is used for your own pages) are delivered. You can also count .html - but many pages no longer have this in the addresses, the MIME type is more reliable.

Significance? Well, rather doubtful. Many users are forced through their providers via proxies - but a proxy has the property of helping to avoid hits. If a visitor has retrieved the page, it may (depending on the proxy configuration) be delivered to other visitors from the cache, not fetched from the server. This affects, for example, the entire AOL - the numbers are clearly distorted there. The more A-list-bloggerish the blogger really is, the more distorted the numbers often are (since cache hits can be more frequent than with less visited blogs).

In addition, browsers also do such things - cache pages. Or visitors do something else - reload pages. Proxies repeat some loading process automatically because the first one may not have gone through completely due to timeout - all of these are distortions of the numbers. Nevertheless, page impressions are still at least halfway usable. Unless you use web bugs.

Because web bugs have a general problem: they are not main pages. But embedded objects. Here, browsers often behave even more stubbornly - what is in the cache is displayed from the cache. Why fetch the little picture again? Of course, you can prevent this with suitable headers - nevertheless, it often goes wrong. JavaScript-based techniques completely bypass users without JavaScript (and believe me, there are significantly more of them than is commonly admitted). In the end, web bugs have the same problems as the actual pages, only a few additional, own problems. Why are they still used? Because it is the only way to have your statistics counted on a system other than your own. So indispensable for global length comparisons.

Well, let's leave page impressions and thus the area of rationality. Let's come to visits, and thus closely related to visitors. Visitors are mysterious beings on the web - you only see the accesses, but who it is and whether you know them, that is not visible. All the more important for marketing purposes, because everything that is nonsense and cannot be verified can be wonderfully exploited for marketing.

Visitors are only recognizable to a web browser via the IP of the access, plus the headers that the browser sends. Unfortunately, this is much more than one would like to admit - but (except for the cookie setters with individual user tracking) not enough for unique identification. Because users share IPs - every proxy will be counted as one IP. Users may use something like tor - and thus the IP is often different than the last time. Users share a computer in an Internet café - and thus it is actually not users, but computers that are assigned. There are headers that are set by caches with which assignments can be made - but if the users behind the cache all use only private IP addresses (the 10.x.x.x or 172.x.x.x or 192.168.x.x addresses that you know from relevant literature), this does not help either.

Visitors can still be assigned a bit if the period is short - but over days? Sorry, but in the age of dynamic IP addresses, that doesn't help at all. The visitors of today and those of tomorrow can be the same or different - no idea. Nevertheless, it is proudly announced how many visitors one had in a month. Of course, this no longer has any meaning. Even daily numbers are already strongly changed by dynamic dial-ups (not everyone uses a flat rate and has the same address for 24 hours).

But to add to the madness, not only the visitors are counted (allegedly), but also their visits. Yes, that's really exciting. Because what is a visit? Ok, recognizing a visitor again over a short period of time (with all the problems that proxies and the like bring about, of course) works quite well - and you also know exactly when a visit begins. Namely, with the first access. But when does it end? Because there is no such thing as ending a web visit (a logout). You just go away. Don't come back so quickly (if at all).

Yes, that's when it gets really creative. Do you just take the time intervals of the hits? Or - because visitors always read the content - do you calculate the time interval from when a hit is a new visit from the size of the last retrieved page document? How do you filter out regular refreshes? How do you deal with the above visitor counting problems?

Not at all. You just suck. On the fingers. Then a number comes out. Usually based on a time interval between hits - long pause, new visit. That's just counted. And it's added to a sum. Regardless of the fact that a visit may have been interrupted by a phone call - and therefore two visits were one visit, just with a pause. Regardless of the fact that users share computers or IP addresses - and thus a visit in reality was 10 interwoven visits.

Oh, yes, I know that some software uses the referrer headers of the browser to assign paths through the system and thus build clearer visits. Which of course no longer works smoothly if the user goes back with the back button or enters an address again without a referrer being produced. Or uses a personal firewall that partially filters referrers.

What is really cute is that all these numbers are thrown on the market without clear statements being made. Of course, sometimes it is said which service the numbers were determined via - but what does that say? Can the numbers be faked there? Does the operator count correctly (at blogcounter.de you can certainly fake the numbers in the simplest way) and does he count sensibly at all? Oh well, just take numbers.

The argument is often brought up that although the numbers cannot be compared directly as absolute numbers across counter boundaries, you can compare numbers from the same counter - companies are founded on this, which make money by renting out this coffee ground technology to others and thus realizing the great cross-border rankings. Until someone notices how the counters can be manipulated in a trivial way ...

It gets really cute when the numbers are brought into line with the time axis and things like average dwell time are derived from this and then, in combination with the page size, it is determined how many pages were read and how many were just clicked (based on the usual reading speed, such a thing is actually "evaluated" by some software).

So let's summarize: there is a limited framework of information that you can build on. These are hits (i.e., retrievals from the server), hosts (i.e., retrieving IP addresses), and amounts transferred (summing the bytes from the retrievals). In addition, there are auxiliary information such as e.g. referrers and possibly cookies. All numbers can be manipulated and falsified - and many are actually falsified by common Internet technologies (the most common case being caching proxies).

These rather unreliable numbers are chased through - partly non-public - algorithms and then mumbo jumbo is generated, which is used to show what a cool frood you are and where the towel hangs.

And I'm supposed to participate in such nonsense?

PS: According to the awstats evaluation, the author of this posting had 20,172 visitors, 39,213 visits, 112,034 page views in 224,402 accesses, and pushed 3.9 gigabytes over the line last month - which, as noted above, is completely irrelevant and meaningless, except that he might look for more sensible hobbies.

Vatican continues anti-gay course

No Church!

It was bound to happen eventually. Everyone was so proud that we are now Pope. Well, now comes the new Vatican directive against homosexuals in the priesthood - and thus the next round in the persecution of homosexuals:

Homosexuals must have lived chastely for at least the past three years if they wish to obtain priestly ordination. Those who publicly acknowledge being homosexual, attend gay meetings or lobby groups, or feel an "even if only spiritual, insurmountable attraction towards same-sex culture" may not become priests.

I am always amazed at how deceitful an institution can be that constantly proclaims expressions like humanity and kindness as its own. Well, the Catholic Church, of course - never mentally emerged from the era of witch burnings ...

When Google is already building a new feed reader ...

... why doesn't it support feed autodiscovery then?