Archive 14.1.2005 - 19.1.2005

RSS 1.1: RDF Site Summary (DRAFT)

RSS 1.1: RDF Site Summary (DRAFT) - how sensible. Someone designed an update to RSS 1.0 (yes, that unloved RDF-based format that hardly anyone really knows). Because, there aren't enough feed formats yet, so you definitely have to add one more.

Along those lines, I also stumbled upon the HTML Syndication Format - another thing like that, where someone thought it would be a good idea to deliver the feed as specially tagged XHTML source.

And unlike RSS 3.0 (which is based on YAML instead of XML), the other two seem to be more or less serious (with the HTML Syndication Format I'm still hoping it was just an elaborate April Fools' joke ...)

Schwarzenegger rejects clemency petition

Der Terminator macht seinen Filmfiguren alle Ehre - and sends another person to their death.

Secure and anonymous on the Internet with proxies - Guide to using Privoxy and tor. I hadn't linked it here somehow. It's so good, you should read it. You won't become any dumber from it.

Subtraction: New, Improved Original Flavor!

Khoi Vinh presents his new design. It's somehow cool how he creates — for me — quite an interesting impression through omission. I really like it anyway.

I wish I could come up with my own design and didn't always have to steal my designs from somewhere ... (one of the real advantages of WordPress - the Kubrick design may be quite widespread by now, but at least it can be adapted even by design dummies like me without everything falling apart)

WordPress NoFollow Plugin

The WordPress NoFollow Plugin adds rel="nofollow" to links in comments to remove their Google ranking. While I personally find it a shame that links in comments are generally not followed, thus removing the useful opportunity for smaller blogs to promote their own through active discussion in other blogs. Okay, in the end it's not that bad, but somehow a small piece of the "one link washes the other" mentality of blogs is lost... A small handicap is that the author has directly linked the plugin and unfortunately his server executes the PHP directly. At the moment, you can't download it, you only get an empty HTML page.

Zope Hosting and Performance - English Version

Somebody asked for an english translation of my article on Zope Hosting and Performance. Here it is - ok, it's not so much a direct translation than a rewrite of the story in english. Enjoy.

Recently the Schockwellenreiter had problems with his blog server. He is using Zope with Plone and CoreBlog. Since I am doing professional Zope hosting for some years now, running systems that range in the 2000-3000 hits per minute scale, I thought I put together some of the stuff I learnt (sometimes the hard way) about Zope and performance.

  • The most important step I would take: slim down your application. Throw out everything you might have in the Zope database that doesn't need to stay there. If it doesn't need content management, store it in folders that are served by Apache. Use mod_rewrite to seemlessly integrate it into your site so that people from the outside won't notice a difference. This can be best done for layout images, stylesheets etc. - Apache is much faster in delivering those.
  • Use Zope caching if possible at any rate. The main parameter you need to check: do you have enough RAM. Zope will grow when using caching (especially the RAMCacheManager). The automatic cleanup won't rescue you - Zope will still grow. Set up some process monitoring that automatically kills and restarts Zope processes that grow above an upper bound to prevent paging due to too large memory consumption. This is even a good idea if you don't use caching at all.
  • There are two noteable cache managers: one uses RAM and the other uses an HTTP accelerator. The RAMCacheManager caches results of objects in memory and so can be used to cache small objects that take much time or much resources to construct. The HTTPCacheManager is for using a HTTP accelerator - most likely people will use Squid, but you can use an appropriately configured Apache, too. The cache manager will provide the right Expires and Cache-Control headers so that most traffic can be delivered our of the HTTP accelerators instead of Zope.
  • Large Zope objects kill Zopes performance. When using caching they destroy caching efficiency by polluting the cache with large blobs of stuff that isn't often required and Zope itself will get a drain in performance by them, too. The reason is that Zope output is constructed in-memory. Constructing large objects in memory takes much resources due to the security layers and architectural layers in Zope. Better to create them with cronjobs or other means outside the Zope server and deliver them directly with Apache. Apache is much faster. A typical situation is when users create PDF documents in Zope instead of creating them outside. Bad idea.
  • Use ZEO. ZEO rocks. Really. In essence it's just the ZODB with a small communication layer on top. This layer is used in Zope instances instead of using the ZODB directly. That way you can run several process groups on your machine, all connecting to the same database. This helps with the above mentioned process restarting: when one is down, the other does the work. Use mod_backhand in Apache to distribute the load between the process groups or use other load balancing tools. ZEO makes regular database packs easier, too: they run on the server and not in the Zope instances - they actually don't notice much of the running pack.
  • If you have, use a SMP machine. Or buy one. Really - that helps. You need to run ZEO and multiple Zope instances, though - otherwise the global interpreter lock of Python will hit you over the head and Zope will just use one of the two processors. That's one reason why you want multiple process groups in the first place - distribution of load on the machine itself, making use of multiple processors.
  • You can gain performance by reducing the architectural layers your code goes through. Python scripts are faster than DTML. Zope products are faster than Python scripts. Remove complex code from your server and move it into products or other outside places. This needs rewriting of application code, so it isn't allways an option to do - but if you do, it will pay back.
  • Don't let your ZODB file grow too large. The ZODB only appends on write access - so the file grows. It grows quite large, if you don't pack regularily. If you don't pack and you have multi-GB ZODB files, don't complain about slow server starts ...
  • If you have complex code in your Zope application, it might be worthwile to put them into some outside server and connect to Zope with some RPC means to trigger execution. I use my |TooFPy| for stuff like this - just pull out code, build a tool and hook it into the Zope application via XMLRPC. Yes, XMLRPC can be quite fast - for example pyXMLRPC is a C-written version that is very fast. Moving code outside Zope helps because this code can't block one of the statically allocated listeners to calculate stuff. Just upping the number of listener threads doesn't pay as you would expect: due to the global interpreter lock still only one thread will run at a time and if your code uses C extensions, it might even block all other threads while using it.
  • If you use PostgreSQL, use PsycoPG as the database driver. PsycoPG uses session pooling and is very fast when your system get's lots of hits. Other drivers often block Zope due to limitations like only one query at a time and other such nonsense. Many admins had to learn the hard way that 16 listener threads aren't really 16 available slots if SQL drivers come into play ...

There are more ways to help performance, but the above are doable with relatively small work and are mostly dependend on wether you have enough memory and maybe a SMP machine. Memory is important - the more the better. If you can put memory into your machine, do so. There is no such thing as too-much-memory (as long as your OS supports the amount of memory, of course).

What to do if even those tips above don't work? Yes, I was in that situation. If you come into such a situation, there is only one - rather brutish - solution: active caching. By that I mean pulling stuff from the Zope server with cronjobs or other means and storing it in Apache folders and using mod rewrite to only deliver static content to users. mod rewrite is your friend. In essence you just take those pages that kill you currently and make them pseudo-static - they are only updated once in a while but the hits won't reach Zope at all.

Another step, of course, is more hardware. If you use ZEO it's no problem to put a farm of Zope servers before your ZEO machine (we currently have 5 dual-processor machines running the Zope instances and two rather big, fat, ugly servers in the background for databases, frontend with two Apache servers that look allmost like dwarves in comparisons to the backend stuff).

Zope is fantastic software - don't mistake me there. I like it. Especially the fact that it is an integrated development environment for web applications and content management is very nice. And the easy integration of external data sources is nice, too. But Zope is a resource hog - that's out of discussin. There's no such thing as a free lunch.

DNA Analysis: Bavaria Launches Federal Council Initiative

Owl Content

DNA Analyses: Bavaria launches federal council initiative - who else if not Bavaria? Current incidents are seen as a welcome opportunity to quickly push through some changes. Never mind that these changes enable far more than fingerprints allow - and that there are many more possibilities for abuse (e.g. genetic analysis for assessing suitability).

The ruling of the Federal Constitutional Court that explicitly restricted DNA analyses to particularly serious crimes is being ignored as well. Who cares about the Federal Constitutional Court when populism works so well for stirring up sentiment...

Grafedia

Grafedia is something like links for hardware out there. You use a word as an email address under a domain and you receive a file in response. The concept is simple — it becomes interesting through the use of mobile phones to send the mail — and getting the result back on your mobile. And the fact that you can put the words somewhere out there on walls and similar places. Somehow crazy, somehow beautiful. (Found at Spreeblick)

LynuxWorks Introduces First User-Mode Linux Software for Apple PowerPC G5 Based on the Linux 2.6 Kernel - this now makes it possible to build logically separated virtual environments under Linux on PPC machines as well.

MathWorld News: The Mathematics of Tsunamis - interesting (I think) explanation of tsunami wave development. Found in zeitwissen:log.

Organizer Overload

Spent 5 minutes pondering which device had just sounded an alarm and what on earth it was supposed to remind me of. After checking several devices and programs, I realized it was an alarm that had actually been deleted long ago on my (not synced, therefore outdated) PDA. Insufficient alarm signal recognition capability due to alarm tone diversity overload...

QuickSilver: Act Without Doing

Brian Mastbrook describes very nicely how Quicksilver combines the best of keyboard-driven interfaces and graphical interfaces. Unfortunately, QuickSilver only runs on 10.3 and later, which is why I'm still stuck with LaunchPad - which, however, in the latest versions (aside from the really extremely slow startup) can keep up quite well.

In general, I find this slowly developing idea of combining graphical and keyboard-driven interfaces very pleasant. Graphical interfaces are good at presenting complex structures (a directory structure becomes clear to me graphically faster than from the shell), but they are often quite cumbersome to use. Tools like QuickSilver and LaunchPad help tremendously. Apple's Universal Key Access would probably help me too - if I had 10.3...

Save Think Secret's Nicholas Ciarelli Petition

Save Think Secret's Nicholas Ciarelli Petition is worth considering signing if you're an Apple user. In any case, this lawsuit from Apple is neither positive nor sensible - after all, the Apple world also lives in part from its rumors. Found at Spreeblick.

The Temboz RSS aggregator

The Temboz RSS aggregator is a very nicely made aggregator in Python. It uses the Ultraliberal Feedparser for parsing and can import OPML. I find the interface nicely designed and the administration quite straightforward. And it has some nice features like the two-column layout and the fairly simple integrated filtering capability as well as quite useful feed list sorting options. I'm playing around with it a bit right now - even if that will probably reduce my motivation to write my own aggregator.

Kills Schnappi

Tötet Schnappi

Teufelsgrinsen

Working with Automator

Working with Automator describes how the new automation tool in Mac OS X 10.4 works. Makes you curious ... (Found at Schockwellenreiter)

Zope Hosting and Performance

Shockwave Rider is having problems with his Zope server. Since I've been doing professional Zope hosting in my company for several years now and run quite a few massive portals (between 2000 and 3000 hits per minute are not uncommon - though distributed across many systems), here are some tips from me on scaling Zope.

  • The most important step I would recommend to everyone is to streamline. Remove from Zope everything that doesn't need to be there - what can be created statically, what rarely changes, where no content management is needed: get rid of it. Put it in regular Apache directories. Use Apache's mod_rewrite to ensure the old URLs still work, but are served from Apache. This especially applies to all those little nuisances like layout graphics - they don't need to come from Zope, they're better served from Apache.
  • Use Zope caching whenever possible. Whenever possible means: enough memory on the server so that even memory-hungry processes have some breathing room. Generally, Zope's built-in caching causes processes to get fatter and fatter - the cleanup in its own cache is quite useless. So implement process monitoring that shoots down and restarts a Zope process when it uses too much memory. Yes, that really is sensible and necessary.
  • There are two good caching options in Zope: the RAMCacheManager and the HTTPCacheManager. The former stores results of Zope objects in main memory and can therefore cache individual page components - put the complex stuff in there. The second (HTTPCache) works together with Squid. Put a Squid in front of your Zope as an HTTP accelerator and configure the HTTP Cache Manager accordingly so that Zope generates the appropriate Expire headers. Then a large part of your traffic will be handled by Squid. It's faster than your Zope. Alternatively, you can configure an Apache as an HTTP accelerator with local cache - ideal for those who can't or don't want to install Squid, but do have options for further Apache configuration.
  • Large Zope objects (and I mean really large in terms of KB) kill Zope. With caching they destroy your best cache strategy, and Zope itself becomes incredibly slow when objects get too large. The reason lies in Zope's architecture: all objects are first laboriously pieced together through multiple layers by various software layers. In memory - and therefore take up corresponding space in memory. Get rid of complex objects with huge KB numbers. Make them smaller. Create them statically via cron job. Serve them from Apache - there's nothing dumber than storing all your large PDFs in Zope in the ZODB, or even generating them dynamically there.
  • Install ZEO. That thing rocks. Basically it's just the ZODB with a primitive server protocol. What's important: your Zope can be split into multiple process groups. You want this when you're using process monitoring to kill a rogue Zope process, but want the portal to appear as undamaged as possible from the outside - in that case just add mod_backhand to Apache, or another balancing technique between Apache and Zope. Additionally, ZEO also makes packing the ZODB (which should run daily) easier, since the pack runs in the background on the ZEO and the Zope servers themselves aren't greatly affected.
  • If you have it, use an SMP server. Or buy one. Really - it brings a lot. The prerequisite is the aforementioned technique with multiple process groups - Python has a global interpreter lock, which means that even on a multiprocessor machine, never more than one Python thread runs at a time. Therefore you want multiple process groups.
  • Performance is also gained by disabling layers. Unfortunately this often can only be realized with software changes, so it's more interesting for those who build it themselves. Move complex processes out of the Zope server and put them in Zope Products. Zope Products run natively without restrictions in the Python interpreter. Zope Python scripts and DTML documents, on the other hand, are dragged through many layers that ensure you respect Zope's access rights, don't do anything bad, and are generally well-behaved. And they make you slower. Products are worthwhile - but cost work and, unlike the other technical tips, aren't always feasible.
  • Additionally, it has proven useful not to put too much data in the ZODB, especially nothing that expands it - the ZODB only gets bigger, it only gets smaller when packing. After some time you easily have a ZODB in the GB range and shouldn't be surprised by slow server starts...
  • If more complex processes occur in the system, it can make sense to outsource them completely. I always use TooFPy for that. Simply convert all the more complex stuff into a tool and stick it in there - the code runs at full speed. Then simply access the tool server from Zope with a SOAP client or XMLRPC client and execute the functions there. Yes, the multiple XML conversion is actually less critical than running complex code in Zope - especially if that code demands considerable runtime. Zope then blocks one of its listeners - the number is static. And simply pushing it up doesn't help - thanks to the global interpreter lock, only more processes would wait for this lock to be released (e.g., for every C extension that's used). There's a good and fast C implementation for XMLRPC communication that can be integrated into Python, making the XML overhead problem irrelevant.
  • If you use PostgreSQL as a database: use PsycoPG as the database driver. Session pooling really gets Zope going. Generally you should check whether the corresponding database driver supports some form of session pooling - if necessary via an external SQL proxy. Otherwise, Zope might hang the entire system during SQL queries because a heavy query waits for its result. Many have already fallen into this trap and learned that 16 Zope threads doesn't necessarily mean 16 parallel processed Zope accesses when SQL databases are involved.

Of course there's a lot more you can do, but the above are largely manageable on the fly and mainly depend on you having enough memory in the server (and possibly a multiprocessor machine - but it works without one too). Memory is important - the more the better. If you can, just put more memory in. You can't have too much memory...

What to do if even all that's not enough (yes, I've had that - sometimes only the really heavy-handed approach helps). Well, in that case there are variations of the above techniques. My favorite technique in this area is active caching. By this I mean that Zope is configured at one point for which documents should be actively cached. This then requires a script on the machine that fetches the pages from Zope and puts them in a directory. Apache rewrite rules then ensure that the static content is served from the outside. Basically you're ensuring that the pages most frequently visited and suitable for this technique (i.e., for example, containing no personalization data) simply go out as a static page, no matter what else happens - the normal caching techniques just aren't brutal enough, too much traffic still goes through to the server.

Another step is of course the use of additional machines - simply put more machines alongside and connect them using the ZEO technique.

Zope is fantastic software - especially the high integration of development environment, CMS, and server is often incredibly practical, and the easy integration of external data sources is also very nice. But Zope is a resource hog, you have to put it that simply.

Cyclic Dependencies

Debian has a wonderful package system. And it has a whole range of very useful tools to make backports easier - for example, by using debootstrap to set up a chroot environment where you can safely gather the packages you need for the build and then create a corresponding package. I've used the whole thing several times, it's really great.

However, it can sometimes drive you crazy. I wanted to install the latest SQLite from Debian Testing. To do that, I first need the necessary tools to build the package. Since I had just set up a new chroot environment, not everything was there yet - for example, I was missing cdbs, a very powerful (and by now widely used) tool for easy creation of Debian packages. I had ported it once before, but I thought the opportunity was good to build a current version.

Or so I thought. It started off quite harmlessly - for the documentation it needs springgraph - a tool for formatting graphs. The tool itself actually has no build dependencies (except for the mandatory debhelpers). Fine. It also builds very quickly. When installing it, it complains about missing Perl modules for the GD2 integration. Okay, porting Perl modules is often tedious, but this one actually looked quite simple. A series of build dependencies, sure, but otherwise harmless. Except for the fact that it needs cdbs to build.

Aaaaarghl!!!!

Okay, I know what you have to do. Still. Sometimes I get the feeling that the Debian maintainers secretly get together to drive me crazy.

D Programming Language

The reference manual for the D Programming Language (a successor to C and C++ with various high-level ideas) contains a very fascinating clause on the first page of the language description:

Note: all D users agree that by downloading and using D, or reading the D specs, they will explicitly identify any claims to intellectual property rights with a copyright or patent notice in any posted or emailed feedback sent to Digital Mars.

I have the impression that such a clause — which automatically becomes binding for a user merely by reading the documentation and demands something that the user may not even be able to deliver — is a bit absurd. I would be interested in the opinion of the blawgers on this.

Emails must not be filtered

Ruling: Emails must not be filtered - an important decision with potentially far-reaching consequences. For strengthening the right to email confidentiality, as well as the filtering issue, will certainly lead to conflicts in companies. Most importantly, it establishes the applicability of postal and telecommunications secrecy to email - a point that has often been problematic until now.

Of course, it remains to be seen what counts as a plausible reason for filtering in court - probably somewhat more than just virus protection. Still, a step in the right direction.

Candidate for the award of the most absurd WordPress plugin: a Code39 barcode generator. Well, maybe then people who print out websites can actually do something with it.

Development of the Aqua variant of OpenOffice for Macintosh discontinued - a shame. Ok, NeoOffice/J is a usable alternative but still, a fully native OpenOffice version would have been something.

The Non-Word 2004

No matter what is announced tomorrow - my non-word is reform. How every brain fart of a minister was titled as reform is simply unspeakably stupid.

After successful search in Moshammer case: Call for expansion of DNA analysis - wdr.de - Panorama - and Pandora's box opens wider and wider.

Planteopia - Knowledge Bending Magazine

No TV Logo

The science bending magazine has put out a piece about weblogs - and a couple of bloggers provided input for it. The result was of course a total disaster - what else would you expect from a SAT.1 magazine? The reaction from Spreeblick to the nonsense is very amusing. And I can well understand the outrage from Schockwellenreiter.

Why Jörg didn't just do the whole thing for a fee in the first place, at least to get some positive result out of the nonsense, isn't entirely clear to me. Did he really expect that SAT.1 could produce anything meaningful on the topic of grassroots journalism? Factual falsification and manipulative editing are standard practice at such magazines - it's all about sensationalist garbage, it has nothing to do with real reporting or journalism.

And Planetopia itself? Well, unlike the tabloid press (whose escapades sometimes overflow with unintentional humor), the whole thing is so poorly done and the segments held so superficially that it doesn't even work as trashy entertainment...

ChapterZero » IllustRender - you can also take the previous approach to extremes with LaTeX: this one even embeds graphics via Ghostscript ...

Clark Dalton deceased?

Clark Dalton reportedly died in Salzburg - I confess that in my youth I also read large quantities of Perry Rhodan magazines ... Update: it is true. Walter Ernsting is dead. It's strange how I only associate the writer with his pseudonym and how unfamiliar his real name sounds.

Kallisys | Newton | Einstein Project

The Einstein Project is an emulator for the Apple Newton hardware. While this doesn't make your own Mac any smaller (and thus isn't a replacement for the PDA), you can at least play around with one of the most interesting PDA operating systems. Found in Rainer Joswig's Lispnews.

Lock against Raab: Account blocked, bailiff ordered - that's how you have to deal with Raab

Longhand

Longhand is a nice little formula evaluator. You could also call it a calculator, but it's a program for the desktop computer. Something like a graphical variant of bc - it also supports arbitrarily large numbers. Nice and simple for quick calculations in between.

MonkeyTyping - The PEAK Developers' Center

MonkeyTyping is Phillip J. Eby's approach to optional static typing in Python. The idea looks very interesting. What always fascinates me about Phillip is his ability to look beyond the horizons of the language - just think of his work on generic functions in Python. Python urgently needs more of these kinds of breakthroughs - some discussions around Python show the first signs of language inbreeding (for example, these almost hateful reactions to mentions of Lisp and Lisp features by some Python advocates).

TextWrangler now free as in freeware

When I look at the feature comparison between TextWrangler, which is now freely available, and BBEdit, there's really only one feature I would miss: Shell Sheets. These Shell Sheets are absolutely brilliant - at least when you've worked on old Macs with MPW like I have and gotten used to the workflow. Basically like a shell window in Emacs, except the editor around it is usable.

Otherwise, the only other limitation worth mentioning is not being able to build TextFactories with TextWrangler (though you can run them), everything else I personally consider absolutely dispensable - especially all those HTML tools I've never really used.

It's great that BareBones is finally providing a noteworthy free version of their editor.

Using LaTeX in WordPress » LatexRender as a plugin - yes, it is what you would expect: an integration of LaTeX into WordPress. Weird.

The Axis of the Pious: Is old Darwin still alive?

No Church!

Creationism is nonsense. Gross nonsense. Being carried out on the backs of students who are being pushed back with such rubbish into times that one thought had been overcome with the apology of the Catholic Church to Galileo Galilei (okay, he was already dead by then for a few centuries and the apology wasn't entirely genuine anyway).

And it is alarming how close this wave of stupidity is coming to us—with Italy and Serbia practically on our doorstep. And I'm not even that sure that we are really as safe from this plague spreading as we believe.

heise online - Huygens Countdown: The day after - the first color image (ok, still quite monochrome despite the color) and a recording of the wind noise on Titan. Unfortunately, the server with the sound is currently overloaded.

Why Martin Schwimmer from the Trademark Blog on Bloglines asked Bloglines to remove his feed from their service - fits with the IzyNews discussion.

Morganically Grown » MiniPosts Plugin for WordPress - a plugin for blogmarks - these small titleless postings. I still make those with a patched template and my own category.

no status quo » RunPHP WordPress Plugin executes PHP code directly in posts. This gives you something like < ?php echo "Macros"; ?> in WordPress.

PHP Markdown - newer version than in Wordpress CVS. But I've sworn off Markdown - the performance was sometimes absurdly high.

argh!

I can only agree with argh! on that, the comment about Annett Louisan.

Blogs - the new money machine?

A plugin I certainly won't install:

BlogMine enables content targeted ads in both feeds and web pages, simplifies and increases revenue generation for bloggers. The service provides a universal way to monetize all blog related content, regardless of whether it is published to the web or as an RSS feed.

DNS Stuff: DNS tools, WHOIS, tracert, ping, and other network tools.

A whole bag full of tools around nameservers, reachability etc. Very practical when you want to quickly check whether the reverse resolution of the server address also works reliably from outside. Or when you want to test a whole set of RBLs against an IP (I found rbls.org for that recently). Email tests. Routing information. And more ...

ESA - Cassini-Huygens - First image from Titan

ESA - Cassini-Huygens - First image from Titan - there it is, the first image from Titan, captured from 16 kilometers altitude. I want more of it

And Heise has more of it. Great. The landing site - wow.

FBI versenkt 170 Mio Dollar Software Projekt - due to unexpected problems. Funny how problems in IT are still always unexpected...

Court stops advertising campaign by cancer doctor Rath

It's embarrassing that such a charlatan can only be stopped due to formal errors in the first place. You'd think you could shut down such nonsense much earlier.

Google receives patent on search term highlighting

Google Gets Patent on Search Term Highlighting - and this means my website violates exactly this patent. Thanks to the Search Highlight plugin for WordPress (which comes as standard), search terms are highlighted in color when visitors come to my pages from a search engine. Well, sue me then, Google ...

Patents are problematic enough as it is, but such trivial patents are just infuriating.

heise online - Huygens Countdown +8h: But a few drops of bitterness after all

Damn, the weather forecast is cancelled ...

heise online - Neue Zürcher Zeitung digitizes all volumes since 1780 - somehow cool. Even cooler if the results were made freely accessible, I could imagine it being a fascinating information pool for historians.

Murder Investigation: Fashion Designer Moshammer is Dead | tagesschau.de

Why do I keep constantly reading "fashion investigations" instead?

PECL :: Package :: APC - PHP caching system, Open Source (no weird stunts like phpAccelerator and not as dead as turck mmCache)