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]
--- /dev/null
+# $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;
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
autogen.pl \
.vimrc \
ChangeLog \
- dia-w.sh.in
+ dia-w.sh.in \
+ Lib.pm
MAINTAINERCLEANFILES+= \
ChangeLog
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
--- /dev/null
+# $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> </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;
--- /dev/null
+/* $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; }
--- /dev/null
+# $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;
--- /dev/null
+# $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
+
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
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"}=\%...;
$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;
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; }
use My::Web;
require Crypt::Rot13;
Wrequire 'project::Lib';
+Wrequire 'product::Lib';
sub Contact($)
"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')
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"};
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;
my $rot13=Crypt::Rot13->new();
$rot13->charge($mail);
$mail=($rot13->rot13())[0];
- $r.=' <'.a_href("mailto:$mail",$mail).'>';
+ $r.=' <'.a_href("mailto:$mail").'>';
}
$r.='</td>';
return $r;
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>
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 QA), technical lead<br />
@{[ 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&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 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
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>
\usepackage[colorlinks]{hyperref}
\setlength\belowcaptionskip{2pt}
+\newlength{\intertableskip}
+\setlength\intertableskip{-0.5cm}
\makeatletter
\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}|}
\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}.
\\
\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}
\\
\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}
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
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
\\
\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
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}|}
\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}|}
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 \\
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
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