From 3f1707622a0ecde786e615e65632a1bc3935f7d9 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Thu, 27 Jan 2011 13:59:04 +0100 Subject: [PATCH] Let's put this website on a git repo as well --- dat/ncdu-changelog | 91 ++++++ dat/ncdu-man | 135 +++++++++ img/bluecubes.png | Bin 0 -> 26570 bytes img/grenamr.png | Bin 0 -> 26014 bytes img/ncdu.png | Bin 0 -> 9341 bytes index.cgi | 709 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 935 insertions(+) create mode 100644 dat/ncdu-changelog create mode 100644 dat/ncdu-man create mode 100644 img/bluecubes.png create mode 100644 img/grenamr.png create mode 100644 img/ncdu.png create mode 100755 index.cgi 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 0000000000000000000000000000000000000000..71688cf823c448a0f148cd0018c778a9ad32c209 GIT binary patch literal 26570 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 N002ovPDHLkV1m>=F1G*x literal 0 HcmV?d00001 diff --git a/img/grenamr.png b/img/grenamr.png new file mode 100644 index 0000000000000000000000000000000000000000..faec69ee0ea7b34a5b2ed4d8fdf5df32519e571f GIT binary patch literal 26014 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 literal 0 HcmV?d00001 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 } +__ +} + +