+"product" category in general.
authorshort <>
Mon, 12 Dec 2005 17:44:37 +0000 (17:44 +0000)
committershort <>
Mon, 12 Dec 2005 17:44:37 +0000 (17:44 +0000)
13 files changed:
.htaccess
Lib.pm [new file with mode: 0644]
Makefile.am
product/Index.pm [new file with mode: 0755]
product/Lib.css [new file with mode: 0644]
product/Lib.pm [new file with mode: 0644]
product/Makefile.am [new file with mode: 0644]
project/Lib.pm
resume/ResumeJanKratochvil.css
resume/ResumeJanKratochvil.pdf
resume/ResumeJanKratochvil.pm
resume/ResumeJanKratochvil.tex
resume/ResumeJanKratochvil.txt

index c613e77..62d59b2 100644 (file)
--- a/.htaccess
+++ b/.htaccess
@@ -53,7 +53,7 @@ AddType application/javascript .js
        RewriteRule ^kocky(|/.*)$ http://kocky.vellum.cz/$1?${unescape:%{QUERY_STRING}} [R=301,L]
        RewriteRule ^(4cinfo|4c)(|/.*)$ http://4c.jankratochvil.net/$2?${unescape:%{QUERY_STRING}} [R=301,L]
        RewriteRule ^sw(|/.*)$ http://%{SERVER_NAME}/project$1?${unescape:%{QUERY_STRING}} [R=301,L]
-       RewriteRule ^projects(|/.*)$ http://%{SERVER_NAME}/project$1?${unescape:%{QUERY_STRING}} [R=301,L]
+       RewriteRule ^(project|product)s(|/.*)$ http://%{SERVER_NAME}/$1$2?${unescape:%{QUERY_STRING}} [R=301,L]
        RewriteRule ^(mailman|pipermail|priv|phorum|akra|project/captive/dist)(|/.*)$ http://www2.jankratochvil.net/$1$2?${unescape:%{QUERY_STRING}} [R=302,L]
        <IfModule !mod_perl.c>
                RewriteRule ^favicon[.]ico$ /My/Status.pm?code=404 [P,L]
diff --git a/Lib.pm b/Lib.pm
new file mode 100644 (file)
index 0000000..eb46ceb
--- /dev/null
+++ b/Lib.pm
@@ -0,0 +1,139 @@
+# $Id$
+# Common functions for HTML/XHTML output generation
+# Copyright (C) 2003-2005 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+package Lib;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+use Carp qw(cluck confess);
+
+use Exporter;
+our @EXPORT=qw();
+our @ISA=qw(My::Web Exporter);
+
+
+# Returns: hashref if !wantarray(), list if wantarray().
+# This cache is "headers_in" hits safe - only local files reading.
+sub list_abspath($)
+{
+my($self,$list_abspath)=@_;
+
+       Wrequire __PACKAGE__;   # inheritance
+       # Do not: path_abs_disk("/project/SUBDIRS");
+       # as we would need $W->{"r"} for the possibly relative path resolving.
+       my $list_filename=My::Web::dir_top_abs_disk().$list_abspath;
+
+       # %{$list_cache{$list_abspath}{"hash"}}
+       # @{$list_cache{$list_abspath}{"array"}}
+       our %list_cache;
+
+       if (!$list_cache{$list_abspath}) {
+               My::Web->make_file($list_filename);
+               local *F;
+               open F,$list_filename or do {
+                       cluck "Error opening \"$list_filename\": $!";
+                       return;
+                       };
+               my @r=split(" ",do { undef $/; <F>; });
+               close F or cluck "Error closing \"$list_filename\": $!";
+               cluck "No projects found?" if !@r;
+               $list_cache{$list_abspath}={
+                       "array"=>\@r,
+                       "hash" =>{ map(($_=>1),@r) },
+                       };
+               }
+       return   $list_cache{$list_abspath}{"hash"} if !wantarray();
+       return @{$list_cache{$list_abspath}{"array"}};
+}
+
+sub _hashlikearray_get_keys(@)
+{
+my(@hashlikearray)=@_;
+
+       my @r;
+       while (@hashlikearray) {
+               push @r,shift @hashlikearray;   # key
+               shift @hashlikearray;   # val
+               }
+       return @r;
+}
+
+# $args{"override"}={"platform"=>"product"};
+sub _project_arrayref_to_hashref($$)
+{
+my($self,$arrayref,%args)=@_;
+
+       Wrequire 'My::Hash';
+       return My::Hash->new({
+               @$arrayref,
+               map((!$_ ? () : %$_),$args{"override"}),
+               "keys_array"=>[ _hashlikearray_get_keys(@$arrayref) ],
+               },"My::Hash::Sub","My::Hash::Readonly");
+}
+
+# Returns: hashlist of hashrefs if !$name.
+# 'abstract': requires: &$self::list
+sub name_to_hashref($;$%)
+{
+my($class,$name,%args)=@_;
+
+       Wrequire __PACKAGE__;   # inheritance
+       my $project_product=($class=~/^(project|product)::/)[0] or cluck;
+       cluck if !wantarray() && !$name;
+       # Do not cache the result to get all the items &Wrequire-mapped.
+       return map(($_=>$class->name_to_hashref($_,%args)),$class->list()) if !$name;
+       cluck join(" ","Project name $project_product::\"$name\" not listed in 'list_cache':",$class->list())
+                       if !$class->list()->{$name};
+       # Never cache anything to be stable for "headers_in" hits.
+       Wrequire "${project_product}::${name}::Index";
+       my $arrayref=eval('\@'.$project_product.'::'.$name.'::Index::ListItem');
+       do { warn "Broken $project_product/$name/Index.pm"; return undef(); } if !@$arrayref;
+       return $class->_project_arrayref_to_hashref($arrayref,%args);
+}
+
+sub title($$)
+{
+my($class,$hashref)=@_;
+
+       cluck if !$hashref->{"name"} || !$hashref->{"summary"};
+       return $hashref->{"name"}.": ".$hashref->{"summary"},
+}
+
+sub section($$)
+{
+my($class,$name)=@_;
+
+       my $item=$class->name_to_hashref($name);
+       my $title=$class->title($item);
+       my $project_product=(caller()=~/^(project|product)::/)[0] or cluck;
+       my $r="";
+       $r.='<table border="1" style="border-collapse: collapse; border-style: solid;" class="margin-center">'."\n";
+               $r.='<tr><td style="font-size: larger;">'."\n";
+                       $r.=a_href "/$project_product/$name/",$title;
+               $r.='</td></tr>'."\n";
+       $r.='</table>'."\n";
+       $r.="<hr />\n";
+       $r.=vskip "1ex";
+       return $r;
+}
+
+1;
index 2749d39..ad8c9f9 100644 (file)
@@ -19,7 +19,7 @@
 include $(top_srcdir)/Makefile-head.am
 
 AUTOMAKE_OPTIONS=foreign
-SUBDIRS=macros My resume etmms project
+SUBDIRS=macros My resume etmms project product
 ## to automatically rebuild aclocal.m4 if any of the macros in
 ## `macros/' change
 @MAINT@include macros/macros.dep
@@ -34,7 +34,8 @@ EXTRA_DIST+= \
                autogen.pl \
                .vimrc \
                ChangeLog \
-               dia-w.sh.in
+               dia-w.sh.in \
+               Lib.pm
 
 MAINTAINERCLEANFILES+= \
                ChangeLog
@@ -56,7 +57,7 @@ endif
 CLEANFILES+=httpd.conf
 EXTRA_DIST+=httpd.conf.pl
 
-httpd.conf: httpd.conf.pl Makefile project/Makefile
+httpd.conf: httpd.conf.pl Makefile project/Makefile product/Makefile
        perl -I$$PWD ./$< >$@
 
 TESTS+=html-test
diff --git a/product/Index.pm b/product/Index.pm
new file mode 100755 (executable)
index 0000000..44854d0
--- /dev/null
@@ -0,0 +1,77 @@
+# $Id$
+# List of products Perl template.
+# Copyright (C) 2005 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+package product::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+Wrequire 'product::Lib';
+use Carp qw(confess cluck);
+
+
+sub handler
+{
+my $W=My::Web->init(
+               "title"=>'Product List',
+               "section"=>"Products",
+#              "rel_up"=>"/",  # TODO:homepage
+#              "rel_start"=>"/",       # TODO:homepage
+               "css_push"=>"/product/Lib.css",
+               "footer_ids"=>0,
+               );
+My::Web->heading();
+
+
+my %item=product::Lib->name_to_hashref();
+
+print <<"HERE";
+<table border="0" width="100%" class="product-list">
+HERE
+
+for my $product (product::Lib->products_sorted()) {
+       print <<"HERE";
+       <tr>
+               <td align="center">
+                       @{[
+                               img "/product/$product/".$item{$product}{"icon"},$item{$product}{"name"}." Icon",
+                                               "a_href"=>"/product/$product/"
+                       ]}
+               </td>
+               <td>&nbsp;&nbsp;</td>
+               <td align="left">
+                       <h3>@{[ a_href "/product/$product/",$item{$product}{"name"}.": ".$item{$product}{"summary"} ]}</h3>
+                       <blockquote>
+                               @{[ $item{$product}{"description"} ]}
+                       </blockquote>
+               </td>
+       </tr>
+HERE
+       }
+
+print <<"HERE";
+</table>
+HERE
+
+
+exit;
+}
+1;
diff --git a/product/Lib.css b/product/Lib.css
new file mode 100644 (file)
index 0000000..90e8157
--- /dev/null
@@ -0,0 +1,20 @@
+/* $Id$
+ * CSS of product functions for HTML/XHTML output generation
+ * Copyright (C) 2003-2005 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; exactly version 2 of June 1991 is required
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+table.product-list td { padding: 5ex; }
diff --git a/product/Lib.pm b/product/Lib.pm
new file mode 100644 (file)
index 0000000..aa5877a
--- /dev/null
@@ -0,0 +1,130 @@
+# $Id$
+# Common functions for HTML/XHTML output generation
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+package product::Lib;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+use Carp qw(cluck confess);
+
+use Exporter;
+our @EXPORT=qw();
+Wrequire 'Lib';
+our @ISA=qw(My::Web Lib Exporter);
+
+
+my $LIST_ABSPATH="/product/SUBDIRS";
+
+
+# Returns: hashref if !wantarray(), list if wantarray().
+sub list($)
+{
+my($self)=@_;
+
+       return $self->list_abspath($LIST_ABSPATH);
+}
+
+sub products_sorted($)
+{
+my($self)=@_;
+
+       my %item=$self->name_to_hashref();
+       return sort {
+               ($item{$b}{"priority"} <=> $item{$a}{"priority"})
+               or
+               (lc($item{$a}{"name"}) cmp lc($item{$b}{"name"}));
+               } keys(%item);
+}
+
+# $args{"is_index"}=1;
+sub products($;$%)
+{
+my($class,$product_selected,%args)=@_;
+
+       my $r="";
+       $r.='<table border="0" class="margin-center"><tr>'."\n";
+               $r.='<td>';
+                       $r.='<table border="1" style="border-collapse: collapse; border-style: solid; border-width: 1px;">'."\n";
+                               $r.='<tr>'."\n";
+                                       $r.='<td style="padding: 5px; font-weight: bold;">'."\n";
+                                               $r.='Products';
+                                       $r.='</td>'."\n";
+                               $r.='</tr>'."\n";
+                       $r.='</table>';
+               $r.='</td>';
+               $r.='<td>';
+                       $r.='<table border="1" style="border-collapse: collapse; border-style: solid;">'."\n";
+                               $r.='<tr>'."\n";
+                                       my %item=$class->name_to_hashref();
+                                       for my $product_found ($class->products_sorted()) {
+                                               my $chosen=($product_selected && $product_selected eq $product_found);
+                                               $r.='<td style="padding: 5px;">';
+                                                       $r.=($chosen && $args{"is_index"} ? "<b>".$item{$product_found}{"name"}."</b>"
+                                                                       : a_href "/product/$product_found/",$item{$product_found}{"name"},
+                                                                                       "attr"=>($chosen
+                                                                                                       ? 'style="text-decoration: underline; font-weight: bold;"'
+                                                                                                       : 'style="text-decoration: inherit; /* revoke underline */"'));
+                                               $r.="</td>\n";
+                                               }
+                               $r.='</tr>'."\n";
+                       $r.='</table>'."\n";
+               $r.='</td>'."\n";
+       $r.='</tr></table>'."\n";
+
+       # Products menu DISABLED:
+       $r="";
+
+       if (!$args{"novskip"}) {
+               Wrequire 'WebConfig';
+               $r.=WebConfig->vskip_hr();
+               }
+       return $r;
+}
+
+sub init($%)
+{
+my($class,%args)=@_;
+
+       $args{"__PACKAGE__"}||=caller();
+       $args{"product_name"}||=($args{"__PACKAGE__"}=~/^product::(\w+)::/)[0]
+                       or cluck "Error finding product name of the package: ".$args{"__PACKAGE__"};
+       my $ListItem=$class->name_to_hashref($args{"product_name"});
+       my $W=$class->SUPER::init(
+                       "title"=>My::Web->a_href_inhibit(sub { return $class->title($ListItem); }),
+                       "footer_ids"=>0,
+                       "no_job"=>1,
+                       "rel_up"=>'/product/',
+#                      "rel_start"=>"/",       # TODO:homepage
+                       "css_push"=>"/product/Lib.css",
+                       %args,
+                       "heading_novskip"=>1,
+                       );
+       $class->heading();
+       my $is_index=($args{"__PACKAGE__"}=~/^product::\w+::Index$/);
+       print $class->products($args{"product_name"},
+                       "is_index"=>$is_index,
+                       %args,
+                       );
+       return $W;
+}
+
+1;
diff --git a/product/Makefile.am b/product/Makefile.am
new file mode 100644 (file)
index 0000000..8996ad5
--- /dev/null
@@ -0,0 +1,34 @@
+# $Id$
+# automake source for the Makefile of product/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+SUBDIRS= \
+               mms2      \
+               hotelgate
+
+SUBDIRS: Makefile
+       @echo $(SUBDIRS) >$@
+
+MODPERL_PM+= \
+               Index.pm
+
+EXTRA_DIST+= \
+               Lib.pm \
+               Lib.css
+
index 4fde277..6ccc6e3 100644 (file)
@@ -28,15 +28,11 @@ use Carp qw(cluck confess);
 
 use Exporter;
 our @EXPORT=qw();
-our @ISA=qw(My::Web Exporter);
+Wrequire 'Lib';
+our @ISA=qw(My::Web Lib Exporter);
 
 
-sub LIST_FILENAME()
-{
-       # Do not: path_abs_disk("/project/SUBDIRS");
-       # as we would need $W->{"r"} for the possibly relative path resolving.
-       return My::Web::dir_top_abs_disk()."/project/SUBDIRS";
-}
+my $LIST_ABSPATH="/project/SUBDIRS";
 
 
 sub print_project
@@ -174,77 +170,12 @@ my($tableit,$val,$key,$ListItem)=@_;
        print vskip;
 }
 
-sub hashlikearray_get_keys(@)
-{
-my(@hashlikearray)=@_;
-
-       my @r;
-       while (@hashlikearray) {
-               push @r,shift @hashlikearray;   # key
-               shift @hashlikearray;   # val
-               }
-       return @r;
-}
-
-sub project_arrayref_to_hashref($$)
-{
-my($self,$arrayref)=@_;
-
-       Wrequire 'My::Hash';
-       return My::Hash->new({
-               @$arrayref,
-               "keys_array"=>[ hashlikearray_get_keys(@$arrayref) ],
-               },"My::Hash::Sub","My::Hash::Readonly");
-}
-
-sub title ($$)
-{
-my($class,$hashref)=@_;
-
-       cluck if !$hashref->{"name"} || !$hashref->{"summary"};
-       return $hashref->{"name"}.": ".$hashref->{"summary"},
-}
-
 # Returns: hashref if !wantarray(), list if wantarray().
 sub list($)
 {
 my($self)=@_;
 
-       # This cache is "headers_in" hits safe - only local files reading.
-       our %list_cache;
-       our @list_cache;
-       if (!@list_cache) {
-               My::Web->make_file(LIST_FILENAME());
-               local *F;
-               open F,LIST_FILENAME() or do {
-                       cluck "Error opening \"".LIST_FILENAME()."\": $!";
-                       return;
-                       };
-               my @r=split(" ",do { undef $/; <F>; });
-               close F or cluck "Error closing \"".LIST_FILENAME()."\": $!";
-               cluck "No projects found?" if !@r;
-               @list_cache=@r;
-               %list_cache=map(($_=>1),@list_cache);
-               }
-       return \%list_cache if !wantarray();
-       return @list_cache;
-}
-
-# Returns: hashlist of hashrefs if !$name.
-sub name_to_hashref($;$)
-{
-my($class,$name)=@_;
-
-       cluck if !wantarray() && !$name;
-       # Do not cache the result to get all the items &Wrequire-mapped.
-       return map(($_=>$class->name_to_hashref($_)),$class->list()) if !$name;
-       cluck join(" ","Project name \"$name\" not listed in 'list_cache':",$class->list())
-                       if !$class->list()->{$name};
-       # Never cache anything to be stable for "headers_in" hits.
-       Wrequire "project::${name}::Index";
-       my $arrayref=eval('\@project::'.$name.'::Index::ListItem');
-       do { warn "Broken project/$name/Index.pm"; return undef(); } if !@$arrayref;
-       return $class->project_arrayref_to_hashref($arrayref);
+       return $self->list_abspath($LIST_ABSPATH);
 }
 
 # $args{"ListItem"}=\%...;
@@ -342,29 +273,20 @@ my($class,$platform_selected,%args)=@_;
                $r.='</td>'."\n";
        $r.='</tr></table>'."\n";
        if (!$args{"novskip"}) {
-               $r.="<hr />\n";
-               $r.=My::Web::vskip "6ex";
+               Wrequire 'WebConfig';
+               $r.=WebConfig->vskip_hr();
                }
        return $r;
 }
 
-sub section ($$)
+sub section($$)
 {
 my($class,$name)=@_;
 
        my $item=$class->name_to_hashref($name);
-       my $title=$class->title($item);
-       my $r="";
-
-       print $class->platforms($item->{"platform"},"novskip"=>1);
-
-       $r.='<table border="1" style="border-collapse: collapse; border-style: solid;" class="margin-center">'."\n";
-               $r.='<tr><td style="font-size: larger;">'."\n";
-                       $r.=a_href "/project/$name/",$title;
-               $r.='</td></tr>'."\n";
-       $r.='</table>'."\n";
-       $r.=vskip "1ex";
-       return $r;
+       return ""
+                       .$class->platforms($item->{"platform"},"novskip"=>1)
+                       .$class->SUPER::section($name);
 }
 
 1;
index 122310b..1dd4135 100644 (file)
@@ -21,6 +21,9 @@ td { vertical-align: top; }
 table { border-collapse: collapse; border-style: solid; border-width: 1px; margin: 8px; }
 A[href] { text-decoration: inherit; /* revoke underline */ }
 A[href].project { text-decoration: underline; }
+A[href].product { text-decoration: underline; }
+.project[-lace-inherit="nowrap"] {}
+.product[-lace-inherit="nowrap"] {}
 .platform { font-style: italic; white-space: nowrap; }
 table.referees td.com { text-align: center; }
 .techs { white-space: nowrap; }
index 97b817b..d6a44af 100644 (file)
Binary files a/resume/ResumeJanKratochvil.pdf and b/resume/ResumeJanKratochvil.pdf differ
index 2eebbcf..990123d 100644 (file)
@@ -27,6 +27,7 @@ use warnings;
 use My::Web;
 require Crypt::Rot13;
 Wrequire 'project::Lib';
+Wrequire 'product::Lib';
 
 
 sub Contact($)
@@ -39,7 +40,7 @@ my($self)=@_;
                "Born"    =>"1979",
                "Sex"     =>"male",
                "Licenses"=>"motorcycle, car",
-               "eMail"   =>(map({ a_href("mailto:$_",$_); } 'job@jankratochvil.net'))[0],
+               "eMail"   =>a_href('mailto:job@jankratochvil.net'),
                "Projects"=>a_href('http://www.jankratochvil.net/project/'),
                "Resume"  =>a_href('http://www.jankratochvil.net/resume/')."<br />"
                           ."[ ".a_href('/resume/ResumeJanKratochvil.pdf','PDF')
@@ -70,24 +71,30 @@ $W->{"args"}{"Wabs"}=1;
 My::Web->heading();
 
 
-my %item=project::Lib->name_to_hashref();
+my %item=(
+       project::Lib->name_to_hashref(),
+       product::Lib->name_to_hashref(undef(),"override"=>{"platform"=>"product"}),
+       );
 my @itemnames=sort {
-               ($item{$b}{"priority"} <=> $item{$a}{"priority"})
-               or (lc($item{$a}->{"name"}) cmp lc($item{$b}->{"name"}));
-               } keys(%item);
+       ($item{$b}{"priority"} <=> $item{$a}{"priority"})
+       or (lc($item{$a}->{"name"}) cmp lc($item{$b}->{"name"}));
+       } keys(%item);
 
 my $projectref=sub
 {
-my($name)=@_;
+my($name,%args)=@_;
 
-       return a_href "/project/$name/",$item{$name}{"name"},"attr"=>'class="project"';
+       my $project_product=($args{"product"} ? "product" : "project");
+       return a_href "/$project_product/$name/",$item{$name}{"name"},"attr"=>'class="'.$project_product.'"';
 };
 
+# $args{"parenthesis"}=1;
+# $args{"product"}=1;
 my $project=sub
 {
 my($name,%args)=@_;
 
-       my $r=&{$projectref}($name);
+       my $r=&{$projectref}($name,%args);
        if (!$args{"bare"}) {
                my $summary=$item{$name}{"summary"};
                $summary=~s#(?:<a\s[^>]*>|</a>)##gi;    # if $args{"unhref"};
@@ -107,7 +114,9 @@ my(@platforms)=@_;
 
        my $r="";
        $r.=join ", ",map({ my $platform=$_;
-               map({ ($item{$_}{"sponsorship"} || $item{$_}{"trivia"}
+               map({ (0
+                               # || $item{$_}{"sponsorship"}
+                               || $item{$_}{"trivia"}
                                || $item{$_}{"platform"} ne $platform ? () : (&{$projectref}($_))); } @itemnames);
                } @platforms);
        return $r;
@@ -125,7 +134,7 @@ my($mail,$fullname)=@_;
                        my $rot13=Crypt::Rot13->new();
                        $rot13->charge($mail);
                        $mail=($rot13->rot13())[0];
-                       $r.=' &lt;'.a_href("mailto:$mail",$mail).'&gt;';
+                       $r.=' &lt;'.a_href("mailto:$mail").'&gt;';
                        }
        $r.='</td>';
        return $r;
@@ -159,7 +168,23 @@ HERE
 print <<"HERE";
 </table>
 
-@{[ vskip "3ex" ]}
+@{[ vskip "2ex" ]}
+
+<p>Contractor - software engineer. Technical achievements highlights:</p>
+<ul>
+       <li>@{[ a_href '#captive','Captive NTFS' ]}:
+                       Delivery of the first free NTFS read/write filesystem for GNU/Linux.
+                       Technically advanced project incl. the required reverse engineering.
+       </li>
+       <li>@{[ a_href '#mms2','MMS2' ]}:
+                       Independent startup business worth blocking by existing monopolies. Coverage by news articles:
+                       @{[ a_href 'http://www.mobilmania.cz/Zpravy/AR.asp?ARI=111260','1' ]},
+                       @{[ a_href 'http://mobil.idnes.cz/mob_operatori.asp?r=mob_operatori&c=A051106_214538_mob_operatori_dno','2' ]};
+                       resolution is still pending.
+       </li>
+</ul>
+
+@{[ vskip "2ex" ]}
 
 <table border="1" frame="border" rules="rows" class="jobs">
 <caption>Fulltime Jobs</caption>
@@ -169,7 +194,7 @@ print <<"HERE";
                                                a_href_cc {""=>'http://www.valinux.co.jp/en/',
                                                         "JP"=>'http://www.valinux.co.jp/'},'VA Linux Systems Japan' ]}</td>
                <td>@{[ a_href 'http://www.kernel.org/','Linux kernel' ]}
-                                               based development</td></tr>
+                                               based software development</td></tr>
 <tr><td>2004/01-11</td><td class="com">@{[ a_href 'http://www.sun.com/','Sun Microsystems' ]}</td>
                <td>@{[ a_href 'http://www.sun.com/software/javaenterprisesystem/','Java Enterprise System' ]}
                                                Quality Assurance (JES&nbsp;QA), technical lead<br />
@@ -182,10 +207,29 @@ print <<"HERE";
 @{[ vskip "1ex" ]}
 
 <table border="1" frame="border" rules="rows" class="jobs">
-<caption>Contractor Jobs</caption>
-<tr><th>Date</th><th>Client</th>
+<caption>Freelance Commercial Projects</caption>
+<tr><th>Date</th>
                <th>Description</th></tr>
-<tr><td>2002-2003</td><td class="com">- (freelance project)</td>
+<tr id="mms2"><td>2005     </td>
+               <td>@{[ &$project('mms2',"product"=>1) ]} (@{[ a_href_cc {""=>'http://www.mms2.org/',
+                                                                       "CZ"=>'http://www.mms2.cz/'},'service web' ]})<br />
+                       Web interface was outsourced.
+                       Commercial service management held together with company JK-Invent.
+                       <ul>
+                               <li>Designed to coexist with existing GSM networks service servers</li>
+                               <li>MMSE/WAP-Push/web/mail convergency featuring smart transformations</li>
+                               <li>Credits charging by ISDN IVR + automatic bank transaction acceptance interface</li>
+                               <li>Completed alpha and beta product cycle for mobile phones firmware bugs workarounds</li>
+                               <li>Free gatewaying program for customers to avoid targetted GSM operators firewalling</li>
+                       </ul>
+               </td></tr>
+<tr><td>2004     </td>
+               <td>@{[ &$project('hotelgate',"product"=>1) ]}<br />
+                       Plug&amp;Play TCP/IP for clients, selectively ticketed and/or free access,
+                       simplified interface for reception desks, easy and unified management.<br />
+                       European facility installations provided by @{[ a_href 'http://www.jklabs.cz/','JK&nbsp;Labs' ]}.
+               </td></tr>
+<tr id="captive"><td>2002-2003</td>
                <td>@{[ &$project('captive') ]}<br />
                        Featured @{[ a_href 'http://slashdot.org/article.pl?sid=03/12/02/1536227','on slashdot' ]}.<br />
                        Analysis of portions of 80MB+ i386 disassembly dumps of MS-Windows XP kernel and ntfs.sys
@@ -196,6 +240,14 @@ print <<"HERE";
                        UNIX userland of Captive provides GnomeVFS interface to the MS-Windows kernel
                        based MS-Windows filesystem isolated by the CORBA/ORBit interface.
                </td></tr>
+</table>
+
+@{[ vskip "1ex" ]}
+
+<table border="1" frame="border" rules="rows" class="jobs">
+<caption>Contractor Jobs</caption>
+<tr><th>Date</th><th>Client</th>
+               <th>Description</th></tr>
 <tr><td>2001-2002</td><td class="com">@{[ a_href('http://www.atspraha.cz/','Advanced Telecom Services') ]}</td>
                <td>Mobile technologies
                        <ul>
index a9864b8..7cb9db4 100644 (file)
@@ -7,6 +7,8 @@
 \usepackage[colorlinks]{hyperref}
 
 \setlength\belowcaptionskip{2pt}
+\newlength{\intertableskip}
+\setlength\intertableskip{-0.5cm}
 
 \makeatletter
 
@@ -54,7 +56,7 @@
 
 \begin{document}
 
-\begin{table}[h]
+\begin{table}[!h]
        \centering
        \begin{tabular*}{0.54\textwidth}{|@{\extracolsep{\fill}}c@{\extracolsep{\fill}}l@{\extracolsep{\fill}}l@{\extracolsep{\fill}}|}
                \hline
        \end{tabular*}
 \end{table}
 
-\begin{table}[h]
+Contractor - software engineer. Technical achievements highlights:
+
+\begin{itemizel}
+
+       \item
+               \hyperlink{captive}{Captive NTFS}:
+               The first free read/write NTFS for free OS.
+               Project included NT reverse engineering.
+
+       \item
+               \hyperlink{mms2}{MMS2}:
+               Independent startup business worth blocking by existing monopolies. News articles:
+               \href{http://www.mobilmania.cz/Zpravy/AR.asp?ARI=111260}{1},
+               \href{http://mobil.idnes.cz/mob_operatori.asp?r=mob_operatori&c=A051106_214538_mob_operatori_dno}{2}
+
+\end{itemizel}
+
+\begin{table}[!h]
        \centering
        \caption{Fulltime Jobs}
        \begin{tabular*}{\textwidth}{|lp{1.2in}@{\extracolsep{\fill}}p{4.35in}|}
@@ -100,19 +119,50 @@ Date & Company & Description \\
        \end{tabular*}
 \end{table}
 
-\def\jobscaption{Contractor Jobs}
-\def\jobstabular{|lp{0.7in}@{\extracolsep{\fill}}p{4.95in}|}
+\vskip\intertableskip
 
-\begin{table}[h]
+\begin{table}[!h]
        \centering
-       \caption{\jobscaption}
-       \begin{tabular*}{\textwidth}{\jobstabular}
+       \caption{Freelance Commercial Projects}
+       \begin{tabular*}{\textwidth}{|l@{\extracolsep{\fill}}p{5.7in}|}
                \hline
-Date & Client & Description \\
+Date & Description \\
 \hline
 
-2002-2003 & -- (freelance project) &
-       \href{http://www.jankratochvil.net/project/captive/}{Captive}: The first free NTFS read/write filesystem for GNU/Linux
+\hypertarget{mms2}{2005} & \href{http://www.jankratochvil.net/product/mms2/}{MMS2}: Alternative center for cheaper mobile phones multimedia messages (MMS)
+
+       Web interface was outsourced.
+       Commercial service management held together with JK-Invent.
+
+       \begin{itemizel}
+
+               \item
+                       Designed to coexist with existing GSM networks service servers
+
+               \item
+                       MMSE/WAP-Push/web/mail convergency featuring smart transformations
+
+               \item
+                       Credits charging by ISDN IVR + automatic bank transaction acceptance
+
+               \item
+                       Completed mobile phones firmware bugs analysis and workarounds
+
+               \item
+                       Free gatewaying program to avoid targetted GSM operators firewalling
+       \end{itemizel}
+       \\
+\hline
+
+2004 & \href{http://www.jankratochvil.net/product/hotelgate/}{HotelGate}: Internet Public Access Gateway
+
+       Plug\&Play TCP/IP for clients, selectively ticketed and/or free access,
+       simplified interface for reception desks, easy management.
+       European facility installations provided by \href{http://www.jklabs.cz/}{JK Labs}.
+       \\
+\hline
+
+\hypertarget{captive}{2002-2003} & \href{http://www.jankratochvil.net/project/captive/}{Captive}: The first free NTFS read/write filesystem for GNU/Linux
 
        Featured \href{http://slashdot.org/article.pl?sid=03/12/02/1536227}{on slashdot}.
 
@@ -129,20 +179,31 @@ Date & Client & Description \\
        \\
 \hline
 
+       \end{tabular*}
+\end{table}
+
+\vskip\intertableskip
+
+\def\jobscaption{Contractor Jobs}
+\def\jobstabular{|lp{0.7in}@{\extracolsep{\fill}}p{4.95in}|}
+
+\begin{table}[!h]
+       \centering
+       \caption{\jobscaption}
+       \begin{tabular*}{\textwidth}{\jobstabular}
+               \hline
+Date & Client & Description \\
+\hline
+
 2001-2002 & \href{http://www.atspraha.cz/}{Advanced\newline Telecom\newline Services} &
        Mobile technologies
 
        \begin{itemizel}
 
                \item
-                       MMS framework client via EuroTel GSM operator by technologies\hfil\newline
-                       GSM~MMS, Perl, XML, SOAP
-
-                       Project included \href{http://www.jankratochvil.net/etmms/}{pilot MMS Center debugging}
-                       with Ethereal (\href{http://www.ethereal.com}{external link}), fixes of
-                       Ethereal (\href{http://www.jankratochvil.net/project/etherealmmse/}{1},
-                       \href{http://www.jankratochvil.net/project/etherealwsp/}{2}).
-               
+                       MMS framework client and \href{http://www.jankratochvil.net/etmms/}{pilot MMS Center debugging}
+                       via EuroTel GSM operator by technologies GSM~MMS, Perl, XML, SOAP
+
                \item
                        Multimedia EMS support implemented by \href{http://www.jankratochvil.net/project/gsmperl/}{GSM::SMS patch}
 
@@ -154,23 +215,12 @@ Date & Client & Description \\
        \\
 \hline
 
-1999-2000 & \href{http://www.suse.com/}{SuSE} &
-       \href{http://www.jankratochvil.net/project/surprise/}{Partition Surprise}: GPLed Partition Magic clone
-
-       Project was completed as a team work. The code is based on Gnome technologies.
-
-       As one of the subtasks to keep system bootability I implemented
-       \href{http://www.jankratochvil.net/project/int13sniff/}{Int13Sniff}
-       to ease Microsoft boot loaders disassembly across partition modifications.
-       \\
-\hline
-
        \end{tabular*}
 \end{table}
 
 \pagebreak
 
-\begin{table}[h]
+\begin{table}[!h]
        \centering
        \caption{\jobscaption{ }(continued)}
        \begin{tabular*}{\textwidth}{\jobstabular}
@@ -178,6 +228,17 @@ Date & Client & Description \\
 Date & Client & Description \\
 \hline
 
+1999-2000 & \href{http://www.suse.com/}{SuSE} &
+       \href{http://www.jankratochvil.net/project/surprise/}{Partition Surprise}: GPLed Partition Magic clone
+
+       Project was completed as a team work. The code is based on Gnome technologies.
+
+       As one of the subtasks to keep system bootability I implemented
+       \href{http://www.jankratochvil.net/project/int13sniff/}{Int13Sniff}
+       to ease Microsoft boot loaders disassembly across partition modifications.
+       \\
+\hline
+
 2001-2002 & \href{http://www.readynote.com/}{ReadyNote} &
        Mobile technologies for embedded devices
 
@@ -202,7 +263,7 @@ Date & Client & Description \\
 
        Ad hoc technical support challenges such as i386 IRQ redirector,
        \href{http://www.jankratochvil.net/project/middleman/}{Middleman port} (HTTP proxy ported to FreeBSD) or
-       \href{http://www.jankratochvil.net/project/ssht/}{ssht} (Unattended intranet host accessibility by SSH tunnel).
+       \href{http://www.jankratochvil.net/project/ssht/}{ssht} (Intranet accessibility by SSH tunnel).
        \\
 \hline
 
@@ -240,11 +301,12 @@ Date & Client & Description \\
        \\
 \hline
 
-1998 & \href{http://www.elsa-online.org/}{European\newline Law\newline Students'\newline Association} &
+1998 & \href{http://www.elsa-online.org/}{ELSA} &
        \href{http://www.jankratochvil.net/project/step/}{STEP}:
        Custom web database application incl. fixes of
        \href{http://www.jankratochvil.net/project/phphash/}{PHP} and
-       \href{http://www.jankratochvil.net/project/pgsqlsubstr/}{PostgreSQL}
+       \href{http://www.jankratochvil.net/project/pgsqlsubstr/}{PostgreSQL},\newline\hfil
+       for \href{http://www.elsa-online.org/}{ELSA -- European Law Students' Association}.
        \\
 \hline
 
@@ -263,7 +325,7 @@ Date & Client & Description \\
 
 For referees e-mails please see: \href{http://www.jankratochvil.net/resume/}{http://www.jankratochvil.net/resume/}
 
-\begin{table}[h]
+\begin{table}[!h]
        \centering
        \caption{Awards}
        \begin{tabular*}{\textwidth}{|l@{\extracolsep{\fill}}p{6.15in}|}
@@ -277,7 +339,9 @@ For referees e-mails please see: \href{http://www.jankratochvil.net/resume/}{htt
        \end{tabular*}
 \end{table}
 
-\begin{table}[h]
+\vskip\intertableskip
+
+\begin{table}[!h]
        \centering
        \caption{Experience Summary}
        \begin{tabular*}{\textwidth}{|l@{\extracolsep{\fill}}p{5.10in}|}
@@ -288,7 +352,9 @@ For referees e-mails please see: \href{http://www.jankratochvil.net/resume/}{htt
                Languages           & C (Gnome/GCC), Perl, bash/awk/sed...,
                                                                                                                                Java, C++, Pascal, Basic, REXX, S-Lang, Foxplus, Prolog \\
                Tools/Metalanguages & autoconf, automake, libtool, m4, CVS, gettext, bison, flex, ld~script,
-                                                                                                       gdb~script, Maple~V \\
+                                                                                                       gdb~script
+                                                                                                       %, Maple~V
+                                                                                                       \\
                Assemblers          & i386/x86\_64, Motorola 680x0, Zilog~Z80, Intel 8051, MIPS R2/3000,
                                                                                                                                (Hitachi SH-8) \\
                WWW-Related         & HTML/XHTML, CSS, PHP, SQL (PostgreSQL, MySQL), JavaScript, CGI \\
index 6030a5a..77fcbce 100644 (file)
@@ -16,18 +16,31 @@ Fulltime Jobs
 2005/04-11: VA Linux Systems Japan
   Linux kernel based development
 
-2004/01-11:  Sun Microsystems
+2004/01-11: Sun Microsystems
   Java Enterprise System Quality Assurance (JES QA), technical lead
   JES components compatibility analysis, automation of QA tasks, JES testing,
   QA frameworks pilot deployments, architecture and lead of the team projects,
   team programming guidelines
 
 
-Contractor Jobs
----------------
+Freelance Commercial Projects
+-----------------------------
+
+2005: MMS2: Alternative center for cheaper mobile phones multimedia messages (MMS)
+       Web interface was outsourced.
+  Commercial service management held together by company JK-Invent.
+   * Designed to coexist with existing GSM networks service servers
+   * MMSE/WAP-Push/web/mail convergency featuring smart transformations
+   * Credits charging by ISDN IVR + automatic bank transaction acceptance
+   * Completed mobile phones firmware bugs analysis and workarounds
+   * Free gatewaying program to avoid targetted GSM operators firewalling
+
+2004: HotelGate: Internet Public Access Gateway
+  Plug&Play TCP/IP for clients, selectively ticketed and/or free access,
+  simplified interface for reception desks, easy and unified management.
+  European facility installations provided by JK Labs.
 
-2002-2003: - (freelance project)
-  Captive: The first free NTFS read/write filesystem for GNU/Linux
+2002-2003: Captive: The first free NTFS read/write filesystem for GNU/Linux
   Featured on slashdot.
   Analysis of portions of 80MB+ i386 disassembly dumps of MS-Windows XP kernel
   and ntfs.sys for the first binary compatible reimplementation of the
@@ -38,6 +51,10 @@ Contractor Jobs
   UNIX userland of Captive provides GnomeVFS interface to the MS-Windows kernel
   based MS-Windows filesystem isolated by the CORBA/ORBit interface.
 
+
+Contractor Jobs
+---------------
+
 2001-2002: Advanced Telecom Services
   Mobile technologies
    * MMS framework client via EuroTel GSM operator