Sometimes projects with a long history of committers tend to collect various styles of indentation. Unfortunately not for all programming languages exist specialized tools like indent for C/C++, so we need to find a different way to mass-indent files properly. Using vim is one of them.
First you need to create a file (let's call it /tmp/indent.vim) including all the vim commands you want to run on your code. The following piece is a good start:
gg=G
:x!
Now run vim on your source code files, using the created vim script file. The following example reindents all .php files in the current folder and subfolders
find . -name '*.php' -exec vim -s /tmp/indent.vim {} \;
If you don't like the result it might be that the indentation settings in you .vimrc don't suit your needs. Of course you are able to add other fancy vim commands to modify your files - like adding or modifying copyright headers.
Just published an ikiwiki plugin to add google's +1 buttons. See ikiwiki.info/plugins/contrib/plusone/ for details.
And if you enable html5 in your ikiwiki settings, it won't show up on planet debian as ugly g:plusone tag.
Not only that it took 4 years to fix #403246 (sbuild dependancy resolution fails when b-dep on A | B ; A uninstallable), but our lovely Debian buildds still don't accept packages which use such a dependency due to running too old sbuild versions. Time to get rid of this annoying bug finally!
For people who do not follow the Merkaartor mailing list: Regulary updated development snapshots are available in experimental again. Please report bugs, either in the Debian BTS or in the upstream bugtracker. Latest addition to Merkaartor is a plugin to support the French Cadastre peoject.

Usually I like to monitor as much as possible. but unfortunately my cable provider does not allow to access the cable modem via SNMP, so I had to find a different way to retrieve at least some basic information. After a bit of googling I figured out how to access the web interface of the Scientific Atlanta modems. The model here is a EPC2203 - seems to work for various models, though. These modems do not only provide access to the traffic within the cable network on their internal networking port (ever tried tcpdump on that?), but they also have their own IP (192.168.100.1). To be able to access the modem you should add something like
post-up ip addr add 192.168.100.2/31 dev extern0 || true
to the configuration of the interface which is connected to the cable modem. Make sure you're not using the same network internally - or find a proper way to handle it. If you access http://192.168.100.1/ then, you'll be able to retrieve some basic information form the modem. If you google a bit longer, you might even be able to do more stuff!
But to monitor the power levels and signal-to-noise ratio, this is all we need. I'm using Munin usually, as the web interface is just much easier to setup than the collectd CGI (hint, hint!!). Drop the following two scripts into the Munin plugins folder. wget, sed and grep is all they need, so it should be easy to get them working.
#!/bin/sh # Copyright (c) 2010 Bernd Zeimetz <bzed@debian.org> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH if [ "$1" = "config" ]; then echo graph_title cable modem signal to noise ratio echo 'graph_args --base 1000' echo 'graph_vlabel dB' echo 'graph_category network' echo 'graph_info This graph shows the signal to noise ratio of the Scientific-Atlanta cable modem.' echo "signalnoise.label ratio" echo "signalnoise.info Signal to noise ratio" echo 'signalnoise.draw LINE2' echo 'signalnoise.type GAUGE' exit 0 fi wget -q -O - http://192.168.100.1/system.asp |\ grep 'Signal to Noise' | \ sed 's,.* ,signalnoise.value ,;s, dB.*,,'
#!/bin/sh # Copyright (c) 2010 Bernd Zeimetz <bzed@debian.org> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH if [ "$1" = "config" ]; then echo graph_title cable modem power level echo 'graph_args --base 1000' echo 'graph_vlabel dBmV' echo 'graph_category network' echo 'graph_info This graph shows receive and transmit power levels of the Scientific-Atlanta cable modem.' echo "receive.label receive" echo "receive.info Receive power level" echo 'receive.draw LINE2' echo 'receive.type GAUGE' echo "transmit.label transmit" echo "transmit.info Transmit power level" echo "transmit.draw LINE2" echo "transmit.type GAUGE" exit 0 fi wget -q -O - http://192.168.100.1/system.asp | grep dBmV | \ sed -e 's,.* ,,;s, dBmV.*,,' \ -e '1s/^/receive.value /' \ -e '2s/^/transmit.value /'
Guess you can easily figure out when I had issues with my cable connection.
Although the modifications described in my last blog post about refactoring the GuruPlug resulted in a well working GuruPlug, I've decided to give it some more air to breath at the top of the case. The large round piece of plastic in the middle asked to be removed - and now a shiny 60mm fan grill protects the board from the bad world outside of the case.
So far its working fine and not too hot. Guess I'll see what happens next summer.
As mentioned in my last blog post the GuruPlug Server Plus needs some major refactoring before it can be used. Not doing so will make you end up with a fried brick. There are various stories in the forums about cooling it properly, so you might want to have a look first instead of following mine blindly. And of course - whatever you do - it is your fault when you end up with a brick, not mine!.
Replacing the power supply
As I would never ever trust the PSU (see my last blog post for the gory details) and some additional free space in the case is necessary, it is time to rip it out. As replacement I've ordered an external 5V/20W PSU. To connect it to the plug I've drilled a hole into the case and added a proper connector after soldering the original cable from the old PSU to it. Make sure to add some retainer to stop the cable from touching the CPU/memory heat sinks later.
Proper heatsinks
One of the biggest problems in the original GuruPlug design is the heat spreading and collecting piece of alloy, which probably makes things even worse than better. After some discussion in #debian-devel the idea came up, that the board should be able to run fine without a heatsink - at least when idling. That is the case, indeed. So let's get rid of that piece of alloy, together with the holders and springs.
Unfortunately heat things are necessary to handle some work load. To mount them make sure you get some good thermal glue as you don't want to insulate the chips from their heat sinks. I've used Arctic Silver II thermal glue - not cheap, but working well. Make sure to clean the heat sinks and chips properly with alcohol (2-Propanol is my favourite for that), so there is no fat and dust left. When you use the glue be careful to read the documentation properly and make sure you apply only as much as necessary - a thin coating is enough. After applying the glue and mounting the heat sink you need a clamp to put some pressure on it while the glue dries.
Heat sinks for the memory
As there is a lot of space around the memory chips, I've got some 14x14x6mm heat sinks. Luckily there are only small parts on the other side of the board, so it was not hard to attach clamps to ensure the glue is able to dry properly. In case largish amounts of glue are squeezing out between heat sink and chip you probably want to start from scratch and clean everything (quickly!) with alcohol again.
Gigabit Ethernet PHY and CPU heatsinks
PHY and CPU need proper heatsinks as they're becoming pretty hot under load. Due to space limitations I had to stick with a 17x17x20mm heat sink for the PHY. I've tried to get a largish heat sink with BGA mount for the CPU, but I was not able to find one in short time and without ordering 1000 of them. So I've got another one of the 17x17x20mm model for the CPU. Later I found two other heat sinks which might fit on the GuruPlug's CPU: Malico 19x19x25mm or a Advanced Thermal Solutions Maxigrip. But for now the smaller one will have to do the job, also I'm scared to removed it without destroying the CPU.
To mount the heat sink on the PHY a bit of preparation is necessary to ensure that the glue doesn't result in short cuts on the IC's pins. The arctic silver documentation recommends to use silicone on the pins to stop the glue. As I neither had the proper silicone nor did I want to make such a mess, I've decided to get a sticky insulating tape and some tooth picks to mount it properly on the IC pins. Make sure to do a proper job here! With good clamps you can work on the PHY while the memory heat sink glue is still drying.
The other problem on this side of the board is that some higher parts are mounted on the lower side of the board, so make sure to get some foam to protect them from your clamps. Except of the size of the heat sinks there is no real difference to the small ones: add glue, mount the heat sink and fix it with a clamp.
Before the glue dries completely make sure you remove the duct tape strips again. Be careful not to wipe any excess glue onto the IC pins. If you manage to do so you might want to remove and clean everything properly. So just be careful and everything should be fine.
Mounting the heat sink on the CPU is easier as the CPU is a nice BGA package. No need to protect pins an there are none.
Finished
As you're able to see on the photo I did not the very perfect job, but fine enough to work properly.
First tests with the new heatsinks
Some tests with stress and some heavy network traffic showed quickly that the heat sinks are working well! But not well enough to be able to mount them into the original closed case (how the hell was this supposed to work before!?). Without any air to breath the temperature on the CPU heat sink went up to 85 deg C quickly. So on the CPU's die are > 100 deg C, which is at least close to the max allowed temperature.
Adding air holes
Obviously some additional air holes are necessary. After meeting my drill and cutter, the original case looks a bit like a piece of cheese now.
Some more tests show that the temperature sticks around 76 deg C under heavy load now. That is still pretty hot, especially when the temperature in the room becomes hotter in summer. As I'm not going to run a lot of traffic trough it (my cable connection is limited to 20 MBit/s anyway), I guess it will work. Below is a graph I've recorded with my multimeter and qtdmm. It shows that the temperature rises to ~76 deg C and stays there.
Not sure if I could introuce some more load, the CPU had a load of 6 running stress. Network traffic was around 2x100MBit/s again. I could imagine with 2xGBit the CPU and PHY would become much hotter (no idea if it would be able to handle it at all, though). The PHY was usually a bit cooler than the CPU, so I didn't spend time to measure the temperature properly.
Conclusion
My opinion is still the the original design of the plug is an insane QA and design failure. There is no way that it could ever work as shipped originally. If I'd have to design a new case for it, it should have a single insulated compartment for a PSU to ensure that no contact with high voltage is possible. The case around all other parts should be made of alloy with a lot of air holes. So the case could be used as heat sink (properly done, not with these insulating duct tape strips) and at the same time allow air circulation and a nice view on the LEDs on the board. Of course the case would be much more expensive than, but I'm sure it would work properly and would be worth the money. And if done peoperly, it would look much better than this blinking plastic thing. I could imagine it would sell well!
So at the end I'm wondering what GlobalScale Technologies will do. I doubt it will be possible to create the 'professional upgrade kit' as they had announced before. Replacing all units is the only proper way. We'll see what happens. At least my GuruPlug is working well now and it will be used as replacement for my OpenWRT router soon. WiFi is not working, but that will be handled by my media center anyway.
Update
I've done some more modifications - keep on reading here.
As a lot of people are coming to my blog to read the installing instructions for Debian on the GuruPlug Server Plus, I shall not hide my opinion about it: It is a major design and QA fail. Don't waste your money on it.
The power supply
Although I've ordered the Guruplug pretty early with the promise, that I'd have it in April, it arrived at the end of May due to QA issues with the power supply. While I appreciate that they didn't deliver broken power supplies, I would have preferred not to receive one which was "fixed" by somebody who uses the soldering iron like an axe. Here are some macro photos to show the gory details:
Software issues
The version of UBoot which shipped with the device was only able to boot from NAND and network. Booting from USB failed and ext2 support was missing, too. Didn't have a look if the community came up with a fixed UBoot version yet, but in my opinion a piece of hardware for >100 EUR should not have such flaws.
Thermal issues
Using the Guruplug with more than one 100 MBit/s connection is just not possible, as it would toast itself to death. For the details have a look at this discussion in the NewIT forum, it links to a lot of interesting photos and postings. This issue is a major design and QA failure. Even without knowing what the datasheets say, it is easy to imagine that a thin piece of alloy is not the proper way to cool a CPU and network chip. Especially not when it is mounted with cheapish pads instead of a proper paste.
As it seems the plan was to send the heat to the shielding of the network/USB/eSata ports (the area is marked red as my first plan was to remove that part of the alloy and reuse the heat-spreader), a strong indication for that is that this is the only area with holes for air circulation. I could imagine that it was not possible to have these holes next to the PSU, which was mounted above the heat-spreader, to avoid electrical shocks.
As there was no other opening for the heat to leave the case, even the microSD card became pretty hot - I've measured temperatures around 60 deg. C next to the card - while CPU and 100MB/s network were idling.
The official information from GlobalScale Technologies is that only 10/100MBit/s should be used as workaround to avoid overheating until a "Professional Upgrade Kit" is released. As mentioned here the upgrade kit announcement was removed silently from GST's website. To be honest, this doesn't make me wonder. There is no way to fix the Guruplug with an external fan or any other external magic as the only way to fix it is to cool the CPU and networking chip properly.
There are various workarounds for the cooling issues posted to the forums. I've decided to rip out the power supply and heat spreader out of the case and get a nice external PSU. The new connector is mounted, ready to supply the GuruPlug's board with power.
Currently I'm waiting for the new heat sinks and glue to arrive. Then I'll give it a try to mount eveything in the small case again, probably with some additional air holes. As soon as I have a workign solution, I'll blog about it again.
During the last three months and since my last blog-post about gimp-plugin-registry a lot happened: Mainly a large number of new plugins was added, but also various enhancements and bugfixes went into the package, together with updates for various already included plugins.
For those who don't know gimp-plugin-registry yet, it is a collection of scripts and plugins for The GIMP. The name is based on the webpage GIMP Plugin Registry, where most (new) plugins and scripts are listed. So far the package ships with 170 scripts/plugins. Most of the scripts are written in TinyScheme, but there are also several plugins in C or Python. Probably most noticeable is the inclusion of the GIMP FX Foundry, which is an awesome collection of 124 scripts.
Below follows a list of all scripts and plugins as shown in the long description of the Debian package. New plugins are marked with a bold fontface.
- Add Film Grain (2.4): Helps adding realistic film grain to BW images.
- btn4ws (0.8.0.1): Generates a series of buttons in three states (passive, active, pressed) with various selectable effects on them, as well as XHTML, CSS and JavaScript code for using the buttons.
- Black and White Film Simulation (1.1): Converts the selected layer into Black and White using the channel mixer. Tries to produce results resembling tonal qualities of film.
- CMYK Tiff 2 PDF for Gimp (20090321): This plugin completes the prepress workflow of using Separate+ to generate CMYK Tiff images by allowing you to convert the saved CMYK Tiff image into a PDF file.
- Contact Sheet (2.02): Generates a contact sheet(s) for a directory of images.
- David's Batch Processor (1.1.9): A simple batch processing plugin for The Gimp - it allows the user to automatically perform operations (such as resize) on a collection of image files.
- Diana-Holga2 (c): Diana/Holga Toys Cameras effect simulator.
- El Samuko GIMP Scripts:
- Antique Photo Border Script: This script simulates a yellowed and slightly jagged border like these of old photographies.
- Che Guevara Script: This script generates a poster like the famous Che Guevara one from Jim Fitzpatrick.
- Cyanotype Script: This script simulates the Cyanotype printing process.
- Difference Layer Script This script generates two difference layers from the two layers on the top. It's similar to GIMP's built-in Grain Extract/Merge function, but the tonal range is bigger. Now you can apply further editing and "switch on/off" the adjustment by switching the visibility of the subtractive and the additive layer. Also you can change the modification intensity by changing the intensity of these two layers.
- Escape Line Script: This script creates escaping lines from any point. It's similar in function to the built-in Line-Nova Script, but much more flexible. So you can chose the center, the thickness, the angle, the length, the offset and the randomness.
- Film Grain Script: This is yet another script which simulates the typical film grain of high ISO pictures.
- First Photo Border Script: This script simulates the cut-off of the first picture of a film roll of cheap cameras like Lomo.
- Lomo Script with Old Style Colors This script simulates the Lomo effect.
- Movie 300 Script: This script simulates the color style of the movie "300".
- National Geographic Script: This script simulates a high quality (portrait) photo like these from the National Geographic.
- Obama "HOPE" Script: This script generates a poster like the famous Obama "HOPE" one from Shepard Fairey.
- Rainy Landscape Script: This script changes a dry landscape to a wet one.
- Photochrom Script: This script simulates a photochrom image, a lithographic printing process from the 1890's.
- Sprocket Hole Script: This script simulates complete exposed 35mm film strips with frame numbers, lettering, overexposed sprocketholes and DX film edge barcodes.
- Sunny Landscape Script: This script changes a rainy landscape to a sunny one.
- Technicolor 2 Color Script: This script simulates the 2 Color Technicolor effect.
- Technicolor 3 Color Script: This script simulates the 3 Color Technicolor effect.
- Vintage Look Script: This script simulates a 70s vintage look.
- EZ Perspective: Specialized tool for easily correcting or changing perspective.
- Fix-CA (3.0.2): Corrects chromatic aberration in photos
- Focus-Blur (3.2.5): This plugin tries to simulate an out-of-focus blur
- GIMP FX Foundry (r111): Probably the largest script collection available for The GIMP.
- GIMP-Mask: Do and undo several popular image masking (that is, censoring) methods (CP, FL, Q0, MEKO).
- Warming and Cooling Filters (May 24, 2010): Warm or cool an image using one of several methods: Wratten, Roy's Warm, Brauer's Warm, Pasty Cadaveric Look
- Layer-Effects (2.4): This is a series of scripts that implement various layer effects: Drop Shadow, Inner Shadow, Outer Glow, Inner Glow, Bevel and Emboss, Satin, Color Overlay, Gradient Overlay, Pattern Overlay, Stroke
- Liquid Rescale (0.7.0): Content-aware rescaling. Keeps the features of the image while rescaling along a single direction.
- Normalmap (1.2.2): Allows you to convert images into RGB normal maps for use in per-pixel lighting applications.
- Planet Render (1-2): Creates a planet. Color, size and sun orientation can be set.
- Refocus (0.9.1): The GIMP plugin to refocus images using FIR Wiener filtering. During image processing operations such as scanning and scaling, images tend to get blurry. The blurred impression of these images is due to the fact that image pixels are averaged with their neighbors. Blurred images don't have sharp boundaries and look as though they have been taken with an unfocused camera.
- Save for Web (0.29.0): Allows to experiment with various popular web format options. It shows an automatically updated preview and file size statistics.
- Separate+ (0.5.6): Separate+ is a plug-in that generates color separations from an RGB image, proofs CMYK colors on the monitor and exports the CMYK TIFF file.
- Smart Sharpen (redux) (2.4): This script implements the redux version of smart sharpening. It utilizes the Unsharp Mask or Refocus plugin to sharpen the image.
- Streak-Camera simulation (0.6): A streak camera images an object through a slit - thus getting a "one dimensional image". This image is propagated along the second dimension of the image plane at a constant speed. The result is a picture of the time dependency of the object.
- Traditional Orton: This is an effect invented by Michael Orton in the 1990’s, which consists of taking two copies of an image, one blurred, and one sharp, and mixing them to produce an image with a dreamy quality. It is especially well suited to landscape and flower photography.
- Wavelet Decompose (0.1.2): The wavelet decompose plugin decomposes a layer of an image into layers of wavelet scales. This means that you can edit the image on different detail scales (frequencies). The trivial recomposition of the image can be done by GIMP's layer modes so you can see the results of your modifications instantly. Among the applications are retouching, noise reduction, and enhancing global contrast.
- Wavelet Denoise (0.3.1): The wavelet denoise plugin is a tool to selectively reduce noise in individual channels of an image with optional RGB<->YCbCr conversion. It has a user interface to adjust the amount of denoising applied. The wavelet nature of the algorithm makes the processing quite fast.
- X11 Mouse Cursor (XMC) plug-in (2.0.6): Enables GIMP to import and export X11 mouse cursor files.
If there is any interest from other distributions to include the package, I'd be happy to help out to make an integration as easy as possible. The few interesting parts could be ripped out of debian/rules and shipped as a normal Makefile, so they could be used easily. More complicated is the generation of the package description and copyright information, but I guess instead of writing debian/coyright and debian/control, it should be possible to integrate the information into a rpm spec file template or similar files. So in case you're interested to port the package to Fedora, OpenSuSE or some other distribution, don't hesitate to contact me! The sources are available via git, see git.recluse.de for details.
For wishes, suggestions and bug reports either use the Debian BTS or Launchpad. While I prefer bugs via the BTS, it might be easier for non-Debian users to file bugs in the Ubuntu Launchpad.
ikiwiki is not yet able to create a Google sitemap internally, so I'm using google-sitemapgen. To run it automatically when the website is being updated, I've changed the git hook to run it after the ikiwiki hook.
- In the ikiwiki setup file let git_wrapper point to a file which is not the post-update hook, so you're able to run it from your own skript. I'm using /path/to/myikiwiki.git/hooks/post-update.ikiwiki.
- Write a skript which runs as post-update hook and executes the created hook from ikiwiki and google-sitemapgen with a proper configuration. My versions of both files are listed below.
/path/to/myikiwiki.git/hooks/post-update
#!/bin/sh /path/to/myikiwiki.git/hooks/post-update.ikiwiki /usr/bin/google-sitemapgen --config=/path/to/mywikiconfig/sitemap_config.xml exec git-update-server-info
/path/to/mywikiconfig/sitemap_config.xml
<?xml version="1.0" encoding="UTF-8"?> <site base_url="http://bzed.de/" store_into="/path/to/bzed.de/sitemap.xml.gz" verbose="0" suppress_search_engine_notify="0" default_encoding="UTF-8" > <directory path="/path/to/bzed.de" url="http://bzed.de/" default_file="index.html" /> <!-- Exclude URLs that end with a '~' (IE: emacs backup files) --> <filter action="drop" type="wildcard" pattern="*~" /> <!-- Exclude URLs within UNIX-style hidden files or directories --> <filter action="drop" type="regexp" pattern="/\.[^/]*" /> <!-- Exclude ikiwiki directories --> <filter action="drop" type="regexp" pattern="/helponformatting/[^/]*" /> <filter action="drop" type="regexp" pattern="/ikiwiki/[^/]*" /> <filter action="drop" type="regexp" pattern="/markdown/[^/]*" /> <filter action="drop" type="regexp" pattern="/openid/[^/]*" /> <filter action="drop" type="regexp" pattern="/pagespec/[^/]*" /> <filter action="drop" type="regexp" pattern="/preprocessordirective/[^/]*" /> <filter action="drop" type="regexp" pattern="/sandbox/[^/]*" /> <filter action="drop" type="regexp" pattern="/shortcuts/[^/]*" /> <filter action="drop" type="regexp" pattern="/smileys/[^/]*" /> <filter action="drop" type="regexp" pattern="/subpage/[^/]*" /> <filter action="drop" type="regexp" pattern="/templates/[^/]*" /> <filter action="drop" type="regexp" pattern="/theme/[^/]*" /> <filter action="drop" type="regexp" pattern="/wikiicons/[^/]*" /> <filter action="drop" type="regexp" pattern="/wikilink/[^/]*" /> <filter action="drop" type="regexp" pattern="/wmd/[^/]*" /> <!-- Exclude css files, favicon and javascript --> <filter action="drop" type="wildcard" pattern="*.css" /> <filter action="drop" type="wildcard" pattern="*favicon.ico" /> <filter action="drop" type="wildcard" pattern="*.js" /> <!-- Exclude ikiwiki.cgi --> <filter action="drop" type="wildcard" pattern="ikiwiki.cgi" /> </site>
See the examples and README files in /usr/share/doc/google-sitemapgen/ for an introduction into configuring google-sitemapgen.
So far the generated sitemaps works very well, especially for search engines which are not able to use the rss feeds like Google does.



