commit 3f1707622a0ecde786e615e65632a1bc3935f7d9 Author: Yorhel Date: Thu Jan 27 13:59:04 2011 +0100 Let's put this website on a git repo as well diff --git a/dat/ncdu-changelog b/dat/ncdu-changelog new file mode 100644 index 0000000..63529fd --- /dev/null +++ b/dat/ncdu-changelog @@ -0,0 +1,91 @@ +1.7 - 2010-08-13 + - List the detected hard links in file info window + - Count the size of a hard linked file once for each directory it appears in + - Fixed crash on browsing dirs with a small window size (#2991787) + - Fixed buffer overflow when some directories can't be scanned (#2981704) + - Fixed segfault when launched on a nonexistant directory (#3012787) + - Fixed segfault when root dir only contains hidden files + - Improved browsing performance + - More intuitive multi-page browsing + - Display size graph by default + - Various minor fixes + +1.6 - 2009-10-23 + - Implemented hard link detection + - Properly select the next item after deletion + - Removed reliance of dirfd() + - Fixed non-void return in void delete_process() + - Fixed several tiny memory leaks + - Return to previously opened directory on failed recalculation + - Properly display MiB units instead of MB (IEEE 1541 - bug #2831412) + - Link to ncursesw when available + - Improved support for non-ASCII characters + - VIM keybindings for browsing through the tree (#2788249, #1880622) + +1.5 - 2009-05-02 + - Fixed incorrect apparent size on directory refresh + - Browsing keys now work while file info window is displayed + - Current directory is assumed when no directory is specified + - Size graph uses the apparent size if that is displayed + - Items are ordered by displayed size rather than disk usage + - Removed switching between powers of 1000/1024 + - Don't rely on the availability of suseconds_t + - Correctly handle paths longer than PATH_MAX + - Fixed various bugs related to rpath() + - Major code rewrite + - Fixed line width when displaying 100% + +1.4 - 2008-09-10 + - Removed the startup window + - Filenames ending with a tidle (~) will now also be hidden with the 'h'-key + - Fixed buffer overflow when supplying a path longer than PATH_MAX (patch by Tobias Stoeckmann) + - Used S_BLKSIZE instead of a hardcoded block size of 512 + - Fixed display of disk usage and apparent sizes + - Updated ncdu -h + - Included patches for Cygwin + - Cursor now follows the selected item + - Added spaces around path (debian #472194) + - Fixed segfault on empty directory (debian #472294) + - A few code rewrites and improvements + +1.3 - 2007-08-05 + - Added 'r'-key to refresh the current directory + - Removed option to calculate apparent size: both the disk usage and the apparent size are calculated. + - Added 'a'-key to switch between showing apparent size and disk usage. + - Added 'i'-key to display information about the selected item. + - Small performance improvements + - configure checks for ncurses.h (bug #1764304) + +1.2 - 2007-07-24 + - Fixed some bugs on cygwin + - Added du-like exclude patterns + - Fixed bug #1758403: large directories work fine now + - Rewrote a large part of the code + - Fixed a bug with wide characters + - Performance improvements when browsing large dir + +1.1 - 2007-04-30 + - Deleting files and directories is now possible from within ncdu. + - The key for sorting directories between files has changed to 't' instead of 'd'. + The 'd'-key is now used for deleting files. + +1.0 - 2007-04-06 + - First stable release + - Small code cleanup + - Added a key to toggle between sorting dirs before files and dirs between files + - Added graphs and percentages to the directory browser (can be enabled or disabled with the 'g'-key) + +0.3 - 2007-03-04 + - When browsing back to the previous directory, the directory you're getting + back from will be selected. + - Added directory scanning in quiet mode to save bandwidth on remote connections. + +0.2 - 2007-02-26 + - Fixed compliance with some operating systems: replaced realpath() with with my own + implementation, and gettimeofday() is not required anymore (but still highly recommended) + - Added a warning for terminals smaller than 60x16 + - Mountpoints (or any other directory pointing to another filesystem) are now considered to be + directories rather than files. + +0.1 - 2007-02-21 + - Initial version diff --git a/dat/ncdu-man b/dat/ncdu-man new file mode 100644 index 0000000..b02bb8a --- /dev/null +++ b/dat/ncdu-man @@ -0,0 +1,135 @@ +ncdu(1) ncdu manual ncdu(1) + + + +NAME + ncdu - NCurses Disk Usage + + +SYNOPSIS + ncdu [-hqvx] [--exclude PATTERN] [-X FILE] dir + + +DESCRIPTION + ncdu (NCurses Disk Usage) is a curses-based version of the well-known + 'du', and provides a fast way to see what directories are using your + disk space. + + +OPTIONS + -h Print a small help message + + -q Quiet mode. While calculating disk space, ncdu will update the + screen 10 times a second by default, this will be decreased to + once every 2 seconds in quiet mode. Use this feature to save + bandwidth over remote connections. + + -v Print version. + + -x Only count files and directories on the same filesystem as the + specified dir. + + --exclude PATTERN + Exclude files that match PATTERN. This argument can be added + multiple times to add more patterns. + + -X FILE, --exclude-from FILE + Exclude files that match any pattern in FILE. Patterns should be + separated by a newline. + + +KEYS + ? Show help + keys + about screen + + up, down j, k + Cycle through the items + + right, enter, l + Open selected directory + + left, <, h + Go to parent directory + + n Order by filename (press again for descending order) + + s Order by filesize (press again for descending order) + + a Toggle between showing disk usage and showing apparent size. + + d Delete the selected file or directory. An error message will be + shown when the contents of the directory do not match or do not + exist anymore on the filesystem. + + t Toggle dirs before files when sorting. + + g Toggle between showing percentage, graph, both, or none. Per- + centage is relative to the size of the current directory, graph + is relative to the largest item in the current directory. + + e Show/hide 'hidden' or 'excluded' files and directories. Please + note that even though you can't see the hidden files and direc- + tories, they are still there and they are still included in the + directory sizes. If you suspect that the totals shown at the + bottom of the screen are not correct, make sure you haven't + enabled this option. + + i Show information about the current selected item. + + r Refresh/recalculate the current directory. + + q Quit + + +HARD LINKS + Every disk usage analysis utility has its own way of (not) counting + hard links. There does not seem to be any universally agreed method of + handling hard links, and it is even inconsistent among different ver- + sions of ncdu. This section explains what each version of ncdu does. + + ncdu 1.5 and below does not support any hard link detection at all: + each link is considered a separate inode and its size is counted for + every link. This means that the displayed directory sizes are incorrect + when analyzing directories which contain hard links. + + ncdu 1.6 has basic hard link detection: When a link to a previously + encountered inode is detected, the link is considered to have a file + size of zero bytes. Its size is not counted again, and the link is + indicated in the browser interface with a 'H' mark. The displayed + directory sizes are only correct when all links to an inode reside + within that directory. When this is not the case, the sizes may or may + not be correct, depending on which links were considered as "duplicate" + and which as "original". The indicated size of the topmost directory + (that is, the one specified on the command line upon starting ncdu) is + always correct. + + ncdu 1.7 has improved hard link detection. Each file that has more than + two links has the "H" mark visible in the browser interface. Each hard + link is counted exactly once for every directory it appears in. The + indicated size of each directory is therefore, correctly, the sum of + the sizes of all unique inodes that can be found in that directory. + Note, however, that this may not always be same as the space that will + be reclaimed after deleting the directory, as some inodes may still be + accessible from hard links outside it. + + +BUGS + Directory hard links are not supported. They will not be detected as + being hard links, and will thus be scanned and counted multiple times. + + Some minor glitches may appear when displaying filenames that contain + multibyte or multicolumn characters. + + Please report any other bugs you may find at the bug tracker, which can + be found on the web site at http://dev.yorhel.nl/ncdu + + +AUTHOR + Written by Yoran Heling . + + +SEE ALSO + du(1) + + + +ncdu-1.7 Aug 13, 2010 ncdu(1) diff --git a/img/bluecubes.png b/img/bluecubes.png new file mode 100644 index 0000000..71688cf Binary files /dev/null and b/img/bluecubes.png differ diff --git a/img/grenamr.png b/img/grenamr.png new file mode 100644 index 0000000..faec69e Binary files /dev/null and b/img/grenamr.png differ diff --git a/img/ncdu.png b/img/ncdu.png new file mode 100644 index 0000000..f7f3690 Binary files /dev/null and b/img/ncdu.png differ diff --git a/index.cgi b/index.cgi new file mode 100755 index 0000000..78a4537 --- /dev/null +++ b/index.cgi @@ -0,0 +1,709 @@ +#!/usr/bin/perl + + +use strict; +use warnings; +use TUWF ':html'; + +use Cwd 'abs_path'; +our $ROOT; +BEGIN { ($ROOT = abs_path $0) =~ s{index\.cgi$}{}; } + +TUWF::register( + qr{} => \&home, + qr{ncdu} => \&ncdu, + qr{ncdu/changes} => \&ncduchangelog, + qr{ncdu/man} => \&ncdumanual, + qr{tuwf} => \&tuwf, + qr{tuwf/man(?:/(db|misc|request|response|xml))?} + => \&tuwfmanual, + qr{demo} => \&demo, + qr{dump} => \&dump, + qr{dump/awshrink} => \&dumpawshrink, + qr{dump/grenamr} => \&dumpgrenamr, +); +TUWF::set( + logfile => '/www/err.log', + error_404_handler => \¬found, +); +TUWF::run(); + + + + +# H O M E P A G E + +sub home { + my $s = shift; + $s->htmlHeader(title => 'Yorhel\'s projects'); + p; + lit <<' E;'; + This site is an attempt to publish and organise my various opensource programs + and libraries on one central location, possibly documented as well as possible + so it might actually be useful to anyone. Some of these projects might end up to + be total crap, and some might not be useful to anyone at all. I'll simply try to + dump most of the things I create here, and leave it up to you whatever you decide + to do with it. + E; + end; + h2 'Updates'; + b '2011-01-27'; txt ' Documented and uploaded one of my older projects: TUWF'; br; + b '2011-01-09'; txt ' Added my json.mll OCaml library to code dump'; br; + b '2010-08-13'; txt ' ncdu 1.7 released!'; br; + b '2009-12-22'; txt ' Added vinfo.c script to code dump'; br; + b '2009-10-23'; txt ' ncdu 1.6 released!'; br; + b '2009-09-21'; txt ' Tiny CSS fix to make this site look good in certain configurations.'; br; + b '2009-05-02'; txt ' ncdu 1.5 released!'; br; + b '2009-04-30'; txt " Site redesign and reorganisation."; br; + $s->htmlFooter; +} + + + + +# N C D U + +sub ncdu { + my $s = shift; + $s->htmlHeader(title => 'NCurses Disk Usage', page => 'ncdu'); + img style => 'float: right', src => '/img/ncdu.png', alt => 'ncdu'; + p; + lit <<' E;'; + Not quite happy with the available disk usage analyzers and looking for a fun + project to get used to C programming, I started working on ncdu: A disk usage + analyzer with an ncurses interface, aimed to be run on a remote server where + you don't have an entire gaphical setup, but have to do with a simple SSH + connection. ncdu aims to be fast, simple and easy to use, and should be able + to run in any minimal POSIX-like environment with ncurses installed. + E; + br; br; + b 'Latest version: '; + txt '1.7 ('; + a href => 'http://dev.yorhel.nl/download/ncdu-1.7.tar.gz', 'download'; + txt ' - '; + a href => '/ncdu/changes', 'changes'; + txt ' - '; + a href => 'http://sourceforge.net/project/showfiles.php?group_id=200175', 'mirror'; + txt ' - '; + a href => '/download/ncdu.md5', 'md5'; + txt ' - '; + a href => '/download/ncdu.sha1', 'sha1'; + txt ")"; br; + b 'Requirements: '; txt 'A POSIX-like system and the ncurses library'; br; + txt 'Entirely written in C and available under a liberal MIT license.'; + end; + + h2 'Packages and ports'; + p 'ncdu has been packaged for various systems already, here\'s a list of the ones I am aware of:'; + a href => 'http://www.archlinux.org/packages/community/i686/ncdu/', 'Arch Linux'; txt ' - '; + a href => 'http://crux.nu/portdb/?q=ncdu&a=search', 'CRUX'; txt ' - '; + a href => 'http://cygwin.com/packages/ncdu/', 'Cygwin'; txt ' - '; + a href => 'http://packages.debian.org/ncdu', 'Debian'; txt ' - '; + a href => 'https://admin.fedoraproject.org/pkgdb/acls/name/ncdu', 'Fedora'; txt ' - '; + a href => 'http://www.freshports.org/sysutils/ncdu/', 'FreeBSD'; txt ' - '; + a href => 'http://packages.gentoo.org/package/sys-fs/ncdu', 'Gentoo'; txt ' - '; + a href => 'http://www.ipcopaddons.org/addondb.php?action=detail&addonid=67', 'IPCop'; txt ' - '; + a href => 'http://www.openbsd.org/cgi-bin/cvsweb/ports/sysutils/ncdu/', 'OpenBSD'; txt ' - '; + a href => 'http://packman.links2linux.de/package/ncdu/182992', 'OpenSUSE'; txt ' - '; + txt 'Mac OS X ('; + a href => 'http://ncdu.darwinports.com/', 'Darwin Ports'; txt '-'; + a href => 'http://pdb.finkproject.org/pdb/package.php/ncdu', 'Fink'; + txt ') - '; + a href => 'http://paketler.pardus.org.tr/info/2009/stable/source/ncdu.html', 'Pardus'; txt ' - '; + txt 'Solaris ('; + a href => 'http://www.opencsw.org/packages/ncdu', 'CSW'; txt '-'; + a href => 'http://www.sunfreeware.com/', 'sunfreeware'; + txt ') - '; + a href => 'http://slackbuilds.org/repository/12.1/system/ncdu/', 'Slackware'; txt ' - '; + a href => 'http://packages.ubuntu.com/search?searchon=sourcenames&keywords=ncdu', 'Ubuntu'; txt ' - '; + a href => 'http://zur.zenwalk.org/view/package/name/ncdu', 'Zenwalk'; + br; + p; + b 'Warning: '; + txt 'Some of these packages are extremely outdated. I highly recommend to use at least ncdu 1.6, anything older than that is hardly usable.'; + end; + + br; br; + txt 'Subscribe to '; + a href => 'http://freshmeat.net/projects/ncdu', 'freshmeat'; + txt ' or to '; + a href => 'https://sourceforge.net/api/file/index/project-id/200175/mtime/desc/rss', 'this RSS feed at sf.net'; + txt ' to receive notifications for new releases.'; + + h2 'Development access'; + p; + txt 'The most recent code is available on a git repository and is '; + a href => 'http://g.blicky.net/ncdu.git/', 'available for online browsing'; + txt '.'; + end; + + h2 'Similar projects'; + a href => 'http://gt5.sourceforge.net/', 'gt5'; txt " - Quite similar to ncdu, but a different approach."; br; + a href => 'http://webonastick.com/tdu/', 'tdu'; txt " - Another small ncurses-based disk usage visualization utility."; br; + a href => 'http://treesize.sourceforge.net/', 'TreeSize'; txt " - Same goal, but in GTK this time."; br; + a href => 'http://www.marzocca.net/linux/baobab.html', 'Baobab'; txt " - Another GTK disk usage analyzer, comes with GNOME."; br; + a href => 'http://www.methylblue.com/filelight/', 'Filelight'; txt " - And one for KDE."; br; + $s->htmlFooter; +} + + +sub ncduchangelog { + my $s = shift; + $s->htmlHeader(title => 'Version history', page => 'ncdu', tab => 'changes'); + $s->htmlChangeLog('ncdu'); + $s->htmlFooter; +} + + +sub ncdumanual { + my $s = shift; + $s->htmlHeader(title => 'Manual page', page => 'ncdu', tab => 'man'); + open my $F, '<', "$ROOT/dat/ncdu-man" or die $!; + pre; + txt $_ while(<$F>); + end; + close $F; + $s->htmlFooter; +} + + + + +# T U W F + + +sub tuwf { + my $s = shift; + $s->htmlHeader(title => 'The Ultimate Website Framework', page => 'tuwf'); + lit <<' E;'; + TUWF is a very small and lightweight web development framework for Perl. It + has evolved from being a few abstraction layers in two large websites to a + separate set of modules. While initially designed to be used for large and + complex websites, it is also perfectly suited for small single-file + websites. + E; + + h2 'Main features'; + ul; + li 'Very small, and no extra modules required,'; + li 'Easy URI-to-function mapping using regular expressions,'; + li 'Handy form validation functions,'; + li 'Easy XML/XHTML output generation functions,'; + li 'Response buffering and output compression,'; + li 'Easy access to GET/POST data and cookies,'; + li 'Support for CGI and FastCGI - optimized for FastCGI,'; + li 'Uses UTF-8 for all text,'; + li 'Convenient SQL execution functions and correct transaction handling,'; + li 'Promotes code re-use,'; + li 'Open source (duh!) and available under a liberal MIT license.'; + end; + lit <<' E;'; + Read the description in the + documentation for more information and details. + E; + + h2 'Download'; + lit <<' E;'; + TUWF is available on a git repository at + http://g.blicky.net/tuwf.git/.
+ Easier-to-use packages will most likely be available here and on CPAN after + a testing period. + E; + + h2 'Websites using TUWF'; + txt '(Not a whole lot)'; + ul; + li; + a href => 'http://vndb.org/', 'VNDB.org'; + txt ' (the site that spawned TUWF - '; + a href => 'http://g.blicky.net/vndb.git/', 'open source'; + txt ')'; + end; + li; + a href => 'http://dev.yorhel.nl/', 'This website'; txt ' (also '; + a href => 'http://g.blicky.net/yorhel-dev.git/tree/index.cgi', 'open source'; + txt ')'; + end; + li; a href => 'http://yorhel.nl/', 'Yorhel.nl'; end; + end; + + $s->htmlFooter; +} + + +sub tuwfmanual { + my $s = shift; + my $man = shift || ''; + $s->htmlHeader(title => 'TUWF Documentation', page => 'tuwf', tab => 'man'); + my %mod = (qw|db DB xml XML|); + + for ('', qw|db misc request response xml|) { + my $n = 'TUWF'.($_ ? '::'.(($mod{$_} || ucfirst $_)) : ''); + txt ', ' if $_; + a href => '/tuwf/man'.($_ ? "/$_" : ''), $n + if $_ ne $man; + b $n if $_ eq $man; + } + br; br; + + my $mod = 'TUWF'; + $mod .= '/'.($mod{$man} || ucfirst $man) if $man; + (my $f = $INC{"$mod.pm"}) =~ s/\.pm$/.pod/; + $s->htmlPOD($f); + + $s->htmlFooter; +} + + + + +# D E M O S + +sub demo { + my $s = shift; + $s->htmlHeader(title => 'Demos', page => 'demo'); + p; + lit <<' E;'; + Yes, I realise that the title is plural, suggesting there's more than one demo. That is + not quite true, unfortunately. The reason I chose to use plural form is simply in the + hopes that I do, in fact, write more demos, and that this page will actually get more + content in the future. I still happen to be a huge fan of the + demoscene, and still wish to contribute to it... if only I could find the time and + self-discipline to do so. In the meanwhile, here's one demo I did write some time ago: + E; + end; + + h2 'Blue Cubes'; + img src => '/img/bluecubes.png', style => 'float: right', alt => 'Blue Cubes'; + p; + lit <<' E;'; + August 2006. My first demo - or more exact: intro. Blue Cubes is a 64kB intro written in + OpenGL/SDL with Linux as target OS. I wrote this intro within 10 days without any prior + experience in any of the fields of computer generated graphics or music. So needlessly to + say, it sucks. I am ashamed even of the thought of releasing it at a respectable demoparty + like Evoke. Still, it didn't feel I was unwelcome, + I did actually receive three prices: 3rd price in the 64k competition (there were only 3 + actual entries, but oh well), best non-windows 64k intro (it was the only one in the + competition), and the Digitale Kultur newcomer award, which actually is something to be + proud of, I guess. + E; + br; br; + a href => '/download/yorhel~bluecubes.zip', 'download'; + txt ' - '; + a href => 'http://scene.org/file.php?file=/parties/2006/evoke06/in64/yorhel_bluecubes.zip&fileinfo', 'mirror'; + txt " (includes linux binaries, windows port, and sources)"; br; + a href => 'http://pouet.net/prod.php?which=25866', 'pouet'; txt ' - '; + a href => 'http://demoscene.tv/page.php?id=172&lang=uk&vsmaction=view_prod&id_prod=12653', 'demoscene.tv'; txt ' - '; + a href => 'http://demozoo.org/productions/32253', 'demozoo'; + end; + $s->htmlFooter; +} + + + + +# C O D E D U M P + + +sub dump { + my $s = shift; + $s->htmlHeader(title => 'Code Dump', page => 'dump'); + p 'Most of the things I write are simple perl/shell scripts or programs that only ' + .'serve the purpose of learning something new. This page is a listing of those I ' + .'thought might be of interest to others as well.'; + + h2 'bbcode.c'; + p; + txt 'January 2006. Simple BBCode to HTML converter written in plain C, for learning ' + .'puroses. '; + a href => '/download/code/bbcode.c', 'source'; + end; + + h2 'echoserv.c'; + p; + txt 'February 2006. A simple non-blocking single-threaded TCP echo server, ' + .'displaying how the select() system call can be used to handle multiple ' + .'connections. '; + a href => '/download/code/echoserv.c', 'source'; + end; + + h2 'yapong.c'; + p; + txt 'Feburary 2006. Yet Another Pong, and yet another program written just for testing/' + .'learning purposes. Tested to work with the ncurses or pdcurses libraries. '; + a href => '/download/code/yapong.c', 'source'; + txt ' ('; + a href => '/download/code/yapong-0.01.c', '0.01'; + txt ')'; + end; + + h2 'Microdc2 log file parser'; + p; + lit <<' E;'; + June 2007. Simple perl script that parses log files created by + microdc2 and outputs a simple and + ugly html file with all uploaded files. It correctly merges chunked uploads, calculates + average upload speed per file and total bandwidth used for uploads. + E; + a href => '/download/code/mdc2-parse.pl', 'source'; + end; + + h2 'vinfo.c'; + p; + lit <<' E;'; + November 2009. The public VNDB API was designed to be + easy to use even from low level languages. I wrote this simple program to see how much + work it would be to use the API in C, and as example code for anyone wishing to use the + API for something more useful. Read the comments for more info. + E; + a href => '/download/code/vinfo.c', 'source'; + end; + + h2 'json.mll'; + p; + lit <<' E;'; + December 2010. I was writing a client for the public VNDB API in OCaml and needed a JSON + parser/generator. Since I wasn't happy with the currently available + solutions - they try to do too many things and have too many dependencies - + I decided to write a minimal JSON library myself. + E; + a href => 'http://g.blicky.net/serika.git/tree/json.mll', 'source'; + end; + $s->htmlFooter; +} + + +sub dumpawshrink { + my $s = shift; + $s->htmlHeader(title => 'AWStats data file shrinker', page => 'dump', tab => 'awshrink'); + p; + txt 'People who run AWStats on large log files have most likely noticed: the data files can ' + .'grow quite large, resulting in both a waste of disk space and longer page generation ' + .'times for the AWStats pages. I wrote a small script that analyzes these data files and ' + ."can remove any information you think is unnecessary."; + br; br; + b 'Download: '; + a href => '/download/code/awshrink', 'awshrink'; + txt ' (copy to /usr/bin to install)'; + end; + h2 'Important'; + txt 'Do NOT use this script on data files that are not completed yet (i.e. data files of the ' + .'month you\'re living in). This will result in inaccurate sorting of visits, pages, ' + .'referers and whatever other list you\'re shrinking. Also, keep in mind that this is just ' + .'a fast written perl hack, it is by no means fast and may hog some memory while shrinking ' + .'data files.'; + + h2 'Usage'; + pre class => 'code', q|awshrink [-c -s] [-SECTION LINES] [..] datafile + -s Show statistics + -c Overwrite datafile instead of writing to a backupfile (datafile~) + -SECTION LINES + Shrink the selected SECTION to LINES lines. (See example below)|; + + h2 'Typical command-line usage'; + p 'While awshrink is most useful for monthly cron jobs, here\'s an example of basic command line ' + .'usage to demonstrate what the script can do:'; + pre class => 'code', join "\n", grep s/^\s{4}//||1, split /\n/, <<' E;'; + $ wc -c awstats122007.nedtlyrics.txt + 29916817 awstats122007.nedtlyrics.txt + + $ awshrink -s awstats122007.nedtlyrics.txt + Section Size (Bytes) Lines + SCREENSIZE* 74 0 + WORMS 131 0 + EMAILRECEIVER 135 0 + EMAILSENDER 143 0 + CLUSTER* 144 0 + LOGIN 155 0 + ORIGIN* 178 6 + ERRORS* 229 10 + SESSION* 236 7 + FILETYPES* 340 12 + MISC* 341 10 + GENERAL* 362 8 + OS* 414 29 + SEREFERRALS 587 34 + TIME* 1270 24 + DAY* 1293 31 + ROBOT 1644 40 + BROWSER 1992 127 + DOMAIN 2377 131 + UNKNOWNREFERERBROWSER 5439 105 + UNKNOWNREFERER 20585 317 + SIDER_404 74717 2199 + PAGEREFS 130982 2500 + KEYWORDS 288189 27036 + SIDER 1058723 25470 + SEARCHWORDS 5038611 157807 + VISITOR 23285662 416084 + * = not shrinkable + + $ awshrink -s -c -VISITOR 100 -SEARCHWORDS 100 -SIDER 100 awstats122007.nedtlyrics.txt + Section Size (Bytes) Lines + SCREENSIZE* 74 0 + WORMS 131 0 + EMAILRECEIVER 135 0 + EMAILSENDER 143 0 + CLUSTER* 144 0 + LOGIN 155 0 + ORIGIN* 178 6 + ERRORS* 229 10 + SESSION* 236 7 + FILETYPES* 340 12 + MISC* 341 10 + GENERAL* 362 8 + OS* 414 29 + SEREFERRALS 587 34 + TIME* 1270 24 + DAY* 1293 31 + ROBOT 1644 40 + BROWSER 1992 127 + SEARCHWORDS 2289 100 + DOMAIN 2377 131 + SIDER 3984 100 + UNKNOWNREFERERBROWSER 5439 105 + VISITOR 5980 100 + UNKNOWNREFERER 20585 317 + SIDER_404 74717 2199 + PAGEREFS 130982 2500 + KEYWORDS 288189 27036 + * = not shrinkable + + $ wc -c awstats122007.nedtlyrics.txt + 546074 awstats122007.nedtlyrics.txt + E; + $s->htmlFooter; +} + + +sub dumpgrenamr { + my $s = shift; + $s->htmlHeader(title => 'GTK+ Mass File Renamer', page => 'dump', tab => 'grenamr'); + p; + lit <<' E;'; + GRenamR is a GTK+ mass file renamer written in Perl, the functionality is insipred + by the rename + command that comes with a Perl module.
+
+ GRenamR allows multiple file renaming using perl expressions. You can see the effects + of your expression while typing it, and can preview your action before applying them. + The accepted expressions are mostly the same as the rename command (see above paragrah): + your expression will be evaluated with $_ set to the filename, and any modifications + to this variable will result in the renaming of the file. There's one other variable + that the rename command does not have: $i, which reflects the file number (starting from + 0) in the current list. This allows expressions such as as $_=sprintf'%03d.txt',$i. + E; + br; br; + b 'Download: '; + a href => '/download/code/grenamr-0.1.pl', 'grenamr'; + txt " (copy to /usr/bin/ to install)"; br; + txt "Requires the Gtk2 Perl module (most distributions have a perl-gtk2 package)"; br; + end; + + h2 'Example expressions'; + table; + Tr; td style => 'width: 40%'; code 'y/A-Z/a-z/'; txt ' or '; code '$_=lc'; end; td 'Convert filenames to lowercase'; end; + Tr; td; code 's/\.txt$/.utf8/'; end; td "Change all '.txt' extensions to '.utf8'"; end; + Tr; td; code q|s/([0-9]+)/sprintf'%04d',$1/eg|; end; td 'Zero-pad all numbers in filenames'; end; + Tr; td; code q|s/^.+\.jpg$/sprintf'%03d.jpg',$i+1/e|; end; td 'Replace each image filename with a zero-padded number starting from 1'; end; + end; + + h2 'Caveats / bugs / TODO'; + ul; + li q|Calling functions as 'sleep' or 'exit' in the expression will trash the program|; + li q|It's currently not possible to manually order the file list, so $i is not useful in every situation|; + li q|It's currently not possible to manually rename files or exclude items from being effected by the expression|; + li; lit q|The expression isn't executed in the opened directory, so things like + -X won't work|; end; + end; + + h2 'Screenshot'; + img src => '/img/grenamr.png', alt => 'GRenamR'; + $s->htmlFooter; +} + + + + +sub notfound { + my $s = shift; + my $u = lc $s->reqPath; + ($_->[0] eq $u || $_->[0] eq "$u/") && return $s->resRedirect($_->[1], 'perm') for ( + [ 'bluecubes', '/demo' ], + [ 'dump', '/dump' ], + [ 'dump/index2', '/dump' ], + [ 'dump/pmdc2-parse', '/dump' ], + [ 'dump/cbbcode', '/dump' ], + [ 'dump/cechoserv', '/dump' ], + [ 'dump/cyapong', '/dump' ], + [ 'dump/awshrink', '/dump/awshrink' ], + [ 'dump/grenamr', '/dump/grenamr' ], + ); + return $s->resRedirect("/$u", 'perm') if $u =~ s/\/$//; + $s->resStatus(404); + $s->htmlHeader(title => 'Page Not Found'); + $s->htmlFooter; +} + + + + +# U T I L I T Y M E T H O D S + +package TUWF::Object; +use TUWF ':html'; + +sub htmlHeader { + my($self, %o) = @_; + $o{page} ||= ''; + $o{tab} ||= ''; + html; + head; + title $o{title}; + style type => 'text/css'; + lit $self->css; + end; + end; + body; + div id => 'menu'; + a href => '/', !$o{page} ? (class => 'sel') : (), 'home'; txt ' '; + a href => '/ncdu', $o{page} eq 'ncdu' ? (class => 'sel') : (), 'ncdu'; txt ' '; + a href => '/tuwf', $o{page} eq 'tuwf' ? (class => 'sel') : (), 'tuwf'; txt ' '; + a href => '/demo', $o{page} eq 'demo' ? (class => 'sel') : (), 'demos'; txt ' '; + a href => '/dump', $o{page} eq 'dump' ? (class => 'sel') : (), 'code dump'; + end; + if($o{page} eq 'ncdu') { + div id => 'mtabs'; + a href => '/ncdu', !$o{tab} ? (class => 'sel') : (), 'main'; txt ' '; + a href => '/ncdu/changes', $o{tab} eq 'changes' ? (class => 'sel') : (), 'changelog'; txt ' '; + a href => '/ncdu/man', $o{tab} eq 'man' ? (class => 'sel') : (), 'manual'; txt ' '; + a href => 'http://sourceforge.net/tracker/?group_id=200175', 'bug tracker (sf)'; + end; + } + if($o{page} eq 'tuwf') { + div id => 'mtabs'; + a href => '/tuwf', !$o{tab} ? (class => 'sel') : (), 'main'; txt ' '; + a href => '/tuwf/man', $o{tab} eq 'man' ? (class => 'sel') : (), 'manual'; txt ' '; + end; + } + if($o{page} eq 'dump') { + div id => 'mtabs'; + a href => '/dump', !$o{tab} ? (class => 'sel') : (), 'misc'; txt ' '; + a href => '/dump/awshrink', $o{tab} eq 'awshrink' ? (class => 'sel') : (), 'awshrink'; txt ' '; + a href => '/dump/grenamr', $o{tab} eq 'grenamr' ? (class => 'sel') : (), 'grenamr'; + end; + } + div id => 'main'; + h1 $o{title}; +} + +sub htmlFooter { + end 'div'; + p id => 'footer'; + lit 'feedback » '; + a href => 'mailto:projects@yorhel.nl', 'projects@yorhel.nl'; + br; + a href => 'http://yorhel.nl', 'yh'; + txt ' - '; + a href => 'http://g.blicky.net', 'git'; + txt ' - '; + a href => 'http://svn.blicky.net', 'svn'; + end; + end 'body'; + end 'html'; +} + + +sub htmlChangeLog { + my ($s, $p) = @_; + + open my $F, '<', "$ROOT/dat/$p-changelog" or die $!; + ul style => 'margin-left: 0'; + for my $v (split /\n\n/, join '', <$F>) { + $v =~ s/^([0-9]+\.[0-9]+)\s+-\s+([0-9]{4}-[0-9]{2}-[0-9]{2})//; + li style => 'list-style-type: none;'; + b $1; + txt " - $2 - "; + a href => "/download/$p-$1.tar.gz", "$p-$1.tar.gz"; + br; + ul; + for (split(/\r?\n\s+-\s+/, $v)) { + s/[\r\n\s]{2,50}/ /; + li $_ if $_; + } + end; + br; + end; + } + end; + close $F; +} + + +sub htmlPOD { + my($s, $file) = @_; + require Pod::Simple::HTML; + require Encode; # not really necessary, since the docs are ASCII anyway + + my $p = Pod::Simple::HTML->new(); + my $html = ''; + $p->html_header_before_title(''); + $p->html_footer(''); + $p->output_string(\$html); + $p->{podhtml_LOT} = { + 'TUWF' => '/tuwf/man', + 'TUWF::DB' => '/tuwf/man/db', + 'TUWF::Misc' => '/tuwf/man/misc', + 'TUWF::Request' => '/tuwf/man/request', + 'TUWF::Response' => '/tuwf/man/response', + 'TUWF::XML' => '/tuwf/man/xml', + }; + $p->parse_file($file); + h1 'Table of Contents'; + lit Encode::decode_utf8($p->index_as_html()); + div class => 'pod'; + lit Encode::decode_utf8($html); + end; +} + + +sub css { + return <<__; + * { padding: 0; margin: 0; font: 15px "Lucida Grande", "Arial", "Helvetica", "Verdana", sans-serif; } + body { background: #222; text-align: center; color: #ccc } + a { text-decoration: none; color: #666 } + a:hover { text-decoration: underline } + #menu { background: #000; border-bottom: 1px solid #666; width: 100%; margin: 0; } + #menu a { line-height: 25px; padding: 5px 8px; margin: 0 2px; color: #ccc; } + #menu a:hover, #menu a.sel { background-color: #222; text-decoration: none } + #main { margin: 30px auto 5px auto; background-color: #000; width: 700px; border: 2px solid #666; text-align: left; padding: 5px 10px 10px 10px } + #mtabs { margin: 30px 0 -28px 0; } + #mtabs a { background-color: #222; color: #ccc; font-size: 13px; margin: 0 2px; padding: 0 10px 3px 10px; border: 1px solid #666; border-bottom: 2px solid #666 } + #mtabs a:hover { background-color: #000; text-decoration: none } + #mtabs a.sel { border-bottom: 2px solid #000; background-color: #000; } + #footer, #footer a { color: #444; margin-bottom: 10px } + h1 { font-size: 19px; color: #888; margin-bottom: 5px; } + h2 { font-size: 16px; color: #888; margin-top: 25px; margin-bottom: 1px; } + b { font-weight: bold; color: #fff } + ul { margin-left: 20px } + pre, code { font: 11px monospace; } + pre.code, .pod pre { background: #111; border: 1px dotted #666; margin: 5px 10px; display: block; padding: 5px; } + .indexgroup ul { margin-left: 5px; list-style-type: none } + .indexgroup ul ul { margin-left: 20px } + .pod p { margin: 3px 15px 13px 15px; text-align: justify } + .pod ul { margin-left: 30px } + .pod ul li { margin-right: 15px; text-align: justify } + .pod pre { padding-left: 0 } + .pod h1 a, .pod h2 a { color: #888; font-weight: bold; font-size: 19px } + .pod h1 { margin-top: 50px } + .pod h2 a { font-size: 16px } + .pod dd { margin-left: 15px } + .pod dt a { color: #888 } + .pod dt { margin-left: 10px } + .pod i { font-style: italic } +__ +} + +