From 678dde71232fbad0b45a902bfac847d502f8555d Mon Sep 17 00:00:00 2001 From: short <> Date: Mon, 12 Dec 2005 17:44:37 +0000 Subject: [PATCH] +"product" category in general. --- .htaccess | 2 +- Lib.pm | 139 +++++++++++++++++++++++++++++++++++++++++ Makefile.am | 7 ++- product/Index.pm | 77 +++++++++++++++++++++++ product/Lib.css | 20 ++++++ product/Lib.pm | 130 ++++++++++++++++++++++++++++++++++++++ product/Makefile.am | 34 ++++++++++ project/Lib.pm | 98 +++-------------------------- resume/ResumeJanKratochvil.css | 3 + resume/ResumeJanKratochvil.pdf | Bin 46805 -> 48908 bytes resume/ResumeJanKratochvil.pm | 82 +++++++++++++++++++----- resume/ResumeJanKratochvil.tex | 138 +++++++++++++++++++++++++++++----------- resume/ResumeJanKratochvil.txt | 27 ++++++-- 13 files changed, 609 insertions(+), 148 deletions(-) create mode 100644 Lib.pm create mode 100755 product/Index.pm create mode 100644 product/Lib.css create mode 100644 product/Lib.pm create mode 100644 product/Makefile.am diff --git a/.htaccess b/.htaccess index c613e77..62d59b2 100644 --- 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] RewriteRule ^favicon[.]ico$ /My/Status.pm?code=404 [P,L] diff --git a/Lib.pm b/Lib.pm new file mode 100644 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 +# +# 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 $/; ; }); + 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.=''."\n"; + $r.=''."\n"; + $r.='
'."\n"; + $r.=a_href "/$project_product/$name/",$title; + $r.='
'."\n"; + $r.="
\n"; + $r.=vskip "1ex"; + return $r; +} + +1; diff --git a/Makefile.am b/Makefile.am index 2749d39..ad8c9f9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 index 0000000..44854d0 --- /dev/null +++ b/product/Index.pm @@ -0,0 +1,77 @@ +# $Id$ +# List of products Perl template. +# Copyright (C) 2005 Jan Kratochvil +# +# 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"; + +HERE + +for my $product (product::Lib->products_sorted()) { + print <<"HERE"; + + + + + +HERE + } + +print <<"HERE"; +
+ @{[ + img "/product/$product/".$item{$product}{"icon"},$item{$product}{"name"}." Icon", + "a_href"=>"/product/$product/" + ]} +    +

@{[ a_href "/product/$product/",$item{$product}{"name"}.": ".$item{$product}{"summary"} ]}

+
+ @{[ $item{$product}{"description"} ]} +
+
+HERE + + +exit; +} +1; diff --git a/product/Lib.css b/product/Lib.css new file mode 100644 index 0000000..90e8157 --- /dev/null +++ b/product/Lib.css @@ -0,0 +1,20 @@ +/* $Id$ + * CSS of product functions for HTML/XHTML output generation + * Copyright (C) 2003-2005 Jan Kratochvil + * + * 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 index 0000000..aa5877a --- /dev/null +++ b/product/Lib.pm @@ -0,0 +1,130 @@ +# $Id$ +# Common functions for HTML/XHTML output generation +# Copyright (C) 2003 Jan Kratochvil +# +# 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.=''."\n"; + $r.=''; + $r.=''."\n"; + $r.='
'; + $r.=''."\n"; + $r.=''."\n"; + $r.=''."\n"; + $r.=''."\n"; + $r.='
'."\n"; + $r.='Products'; + $r.='
'; + $r.='
'; + $r.=''."\n"; + $r.=''."\n"; + my %item=$class->name_to_hashref(); + for my $product_found ($class->products_sorted()) { + my $chosen=($product_selected && $product_selected eq $product_found); + $r.='\n"; + } + $r.=''."\n"; + $r.='
'; + $r.=($chosen && $args{"is_index"} ? "".$item{$product_found}{"name"}."" + : 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.="
'."\n"; + $r.='
'."\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 index 0000000..8996ad5 --- /dev/null +++ b/product/Makefile.am @@ -0,0 +1,34 @@ +# $Id$ +# automake source for the Makefile of product/ subdir +# Copyright (C) 2003 Jan Kratochvil +# +# 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 + diff --git a/project/Lib.pm b/project/Lib.pm index 4fde277..6ccc6e3 100644 --- a/project/Lib.pm +++ b/project/Lib.pm @@ -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 $/; ; }); - 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.=''."\n"; $r.=''."\n"; if (!$args{"novskip"}) { - $r.="
\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.=''."\n"; - $r.=''."\n"; - $r.='
'."\n"; - $r.=a_href "/project/$name/",$title; - $r.='
'."\n"; - $r.=vskip "1ex"; - return $r; + return "" + .$class->platforms($item->{"platform"},"novskip"=>1) + .$class->SUPER::section($name); } 1; diff --git a/resume/ResumeJanKratochvil.css b/resume/ResumeJanKratochvil.css index 122310b..1dd4135 100644 --- a/resume/ResumeJanKratochvil.css +++ b/resume/ResumeJanKratochvil.css @@ -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; } diff --git a/resume/ResumeJanKratochvil.pdf b/resume/ResumeJanKratochvil.pdf index 97b817b3ac74240cfa75229d3bb42278902c946e..d6a44af02e3c68159a95d199fca5aa0d0dc8629a 100644 GIT binary patch delta 20242 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 JdAmAQ`wMQ_17!dJ delta 18187 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"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/')."
" ."[ ".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#(?:]*>|
)##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.=' <'.a_href("mailto:$mail",$mail).'>'; + $r.=' <'.a_href("mailto:$mail").'>'; } $r.=''; return $r; @@ -159,7 +168,23 @@ HERE print <<"HERE"; -@{[ vskip "3ex" ]} +@{[ vskip "2ex" ]} + +

Contractor - software engineer. Technical achievements highlights:

+
    +
  • @{[ 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. +
  • +
  • @{[ 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. +
  • +
+ +@{[ vskip "2ex" ]} @@ -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' ]} + based software development
Fulltime Jobs
@{[ a_href 'http://www.kernel.org/','Linux kernel' ]} - based development
2004/01-11@{[ a_href 'http://www.sun.com/','Sun Microsystems' ]} @{[ a_href 'http://www.sun.com/software/javaenterprisesystem/','Java Enterprise System' ]} Quality Assurance (JES QA), technical lead
@@ -182,10 +207,29 @@ print <<"HERE"; @{[ vskip "1ex" ]} - - + + - + + + + + +
Contractor Jobs
DateClient
Freelance Commercial Projects
Date Description
2002-2003- (freelance project)
2005 @{[ &$project('mms2',"product"=>1) ]} (@{[ a_href_cc {""=>'http://www.mms2.org/', + "CZ"=>'http://www.mms2.cz/'},'service web' ]})
+ Web interface was outsourced. + Commercial service management held together with 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 interface
  • +
  • Completed alpha and beta product cycle for mobile phones firmware bugs workarounds
  • +
  • Free gatewaying program for customers to avoid targetted GSM operators firewalling
  • +
+
2004 @{[ &$project('hotelgate',"product"=>1) ]}
+ 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 @{[ a_href 'http://www.jklabs.cz/','JK Labs' ]}. +
2002-2003 @{[ &$project('captive') ]}
Featured @{[ a_href 'http://slashdot.org/article.pl?sid=03/12/02/1536227','on slashdot' ]}.
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.
+ +@{[ vskip "1ex" ]} + + + + +
Contractor Jobs
DateClientDescription
2001-2002@{[ a_href('http://www.atspraha.cz/','Advanced Telecom Services') ]} Mobile technologies
    diff --git a/resume/ResumeJanKratochvil.tex b/resume/ResumeJanKratochvil.tex index a9864b8..7cb9db4 100644 --- a/resume/ResumeJanKratochvil.tex +++ b/resume/ResumeJanKratochvil.tex @@ -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 @@ -75,7 +77,24 @@ \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 \\ diff --git a/resume/ResumeJanKratochvil.txt b/resume/ResumeJanKratochvil.txt index 6030a5a..77fcbce 100644 --- a/resume/ResumeJanKratochvil.txt +++ b/resume/ResumeJanKratochvil.txt @@ -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 -- 1.8.3.1