%
% This file is included by 'slides.tex' and 'preview.tex'
%
\usepackage {uvodzovky}
\usepackage {wasysym}
\usepackage {platonsdg-core}
% pocitadlo casu prednasky:
\def\TIMING#1#2{%
\newlinechar`\^^J % prinutime ho oddelovat spravy novym riadkom
\message{^^JTIMING: #1 #2^^J}
}
\def\cvscmd#1{\texttt{\blue #1}}
\def\svncmd#1{\texttt{\magenta #1}}
\def\cmdbreak{$\mathtt{\backslash}$\\\strut{}~~~~}
\def\file#1{\texttt{#1}}
\hyphenation{
cen-trál-nom
}
% zavadenie bezpatkoveho pisma pre folie
%\renewcommand{\rmdefault}{cmss}
%\slidesmag{4}
%
% Macros and other stuff /*
% 6 - To allow automatic changes of language dependant labels,
% for instance by loading french.sty after Seminar
% (suggested by Bernard Gaulle (IDRIS) - <gaulle@idris.fr> - Nov. 20, 1997)
% Modification Denis Girou begin - Nov. 20, 1997
% From seminar.cls
\def\slidename{Slide}% /*
\def\slidelabel{\bf\slidename{} \theslide}
% From slidesec.sty
\def\listslidename{Zoznam fólií}%
\makeatletter
\def\listofslides{\section*{\listslidename%
\@mkboth{\expandafter\MakeUppercase\listslidename}%
{\expandafter\MakeUppercase\listslidename}}%
\def\l@slide##1##2##3{%
\slide@undottedcline{\slidenumberline{##3}{##2}}{}}%
\let\l@subslide\l@slide
\@startlos}
\makeatother% */
% Modification Denis Girou end
% cumulative slides:
% For overlays, to force to print all preceding ones
\makeatletter% /*
\def\pst@initoverlay#1{%
\pst@Verb{%
/BeginOL {dup (all) eq exch TheOL le or {IfVisible not {Visible
/IfVisible true def} if} {IfVisible {Invisible /IfVisible false def} if}
ifelse} def
\tx@InitOL /TheOL (#1) def}}
\makeatother% */
\definecolor{LightLightGray}{gray}{0.98}
\definecolor{LightGray}{gray}{0.75}
\def\vimconfig#1{\texttt{vimconfig#1}}
\def\shellexample#1{\codeexample{#1}{shell}}
\def\vimexample#1{\codeexample{#1}{Vim}}
\def\vimkey#1{\texttt{\blue#1}}
%\def\Vim#1{Vim#1}
\newsavebox{\linka}
\savebox{\linka}{\textcolor{LightGray}{http://www.platon.sk}}
\newlength{\mylength}
\def\codeexample#1#2{% /*
\[
\setlength{\fboxsep}{8pt}
\setlength{\mylength}{0.7\linewidth}
\addtolength{\mylength}{-2\fboxsep}
\addtolength{\mylength}{-2\fboxrule}
{\boxput(0.83,-1.0){\textcolor{LightGray}{#2}\vspace{1em}{}\strut}{%
\fbox{%
\parbox{\mylength}{
\setlength{\abovedisplayskip}{0pt}
\setlength{\belowdisplayskip}{0pt}
\texttt{\blue#1}
}}
}}
\]
} % */
\newpagestyle{Lugcon}{}{\strut\hspace{0.6cm}Slide: \thepage\hfil%
\raisebox{0pt}[0pt][0pt]{\usebox{\linka}\hspace{0.5cm}\strut}
}
% vypis jednotiek: /*
{\newlinechar`\^^J % prinutime ho oddelovat spravy novym riadkom
\message{^^J^^J}
\message{Nastavenie rozmerov:^^J}
\message{---------------------------^^J}
\message{voffset = \the\voffset^^J}
\message{hoffset = \the\hoffset^^J}
\message{textwidth = \the\textwidth^^J}
\message{textheight = \the\textheight^^J}
\message{oddsidemargin = \the\oddsidemargin^^J}
\message{evensidemargin = \the\evensidemargin^^J}
\message{topmargin = \the\topmargin^^J}
\message{unitlength = \the\unitlength^^J}
\message{parindent = \the\parindent^^J}
\message{parskip = \the\parskip^^J}
\message{abovecaptionskip = \the\abovecaptionskip^^J}
\message{belowcaptionskip = \the\belowcaptionskip^^J}
\message{---------------------------^^J^^J}
}% */
%
% End of macros */
%
%
% Ostylovanie prednasky:
% - v strede velky sivucky napis "Vim"
% - vpravo dole sivy napis s linkou na vimconfig
\setlength{\slideframewidth}{1pt}% /*
\def\bgtext{}% na prvom slide nebude logo Vim
\newslideframe{Platon}{%
\boxput(0,0){%
\scalebox{10.0}{\textcolor{LightGray}{\expandafter\bgtext}}%
}{%
%\boxput(0.5,-1){%
%\rput{0}{\usebox{\linka}}
%}{%
#1%
%\usebox{\linka}
%}%
}%
} % */
\slideframe{Platon}
%\slideframe*{scplain}
\slideframe*{shadow}
\centerslidesfalse
\begin{document}
\title{Porovnanie CVS a Subversion}
\pagestyle{empty}
% UVOD /*
\begin{slide}
\begin{center}
\strut{}\vfill
{\huge Porovnanie CVS a Subversion\\}
\strut{}\strut\\
{\large Mgr. Ľubomír Host}\\
\texttt{\footnotesize <rajo AT platon.sk>} \\
\texttt{\footnotesize http://rajo.platon.sk} \\
\strut{}\strut\\
{\large Združenie Platón}\\
{\footnotesize nezisková organizácia na podporu otvoreného softvéru} \\
\texttt{\blue http://www.platon.sk}\\
\vfill{}\strut
\end{center}
\end{slide}
%\def\bgtext{Platon}% zapneme logo "Platon" na pozadi slajdov
\pagestyle{Lugcon}% a hodime cislo slajdu + linku na vimconfig do paty stranky
\begin{slide}
\slideheading{Osnova prednášky}
\begin{itemize}
\item \overlay{0}{čo to je CVS a Subversion}
\item \overlay{1}{načo to je dobré}
\item \overlay{2}{výhody a nevýhody}
\item \overlay{3}{ako si to spojazdniť}
\item \overlay{4}{praktické použitie}
\end{itemize}
\end{slide}
\TIMING{1}{min}
\begin{slide}
\slideheading{Čo to je CVS a Subversion}
\begin{itemize}
\item \overlay{0}{Version Control System -- systém na správu verzií, resp. SCM systems}
\item \overlay{1}{umožňuje archivovať vývojové a~produkčné verzie projektov (označovanie míľnikov, tzv.
releases/milestones)}
\item \overlay{2}{spolupráca viacerých ľudí na spoločnom projekte}
\item \overlay{3}{predstaviť si to možno ako \textbf{centrálne úložisko pre vaše projekty}}
\item \overlay{4}{zjednodušenie procesu zálohovania}
\end{itemize}
\end{slide}
\TIMING{3}{min}
\begin{slide}
\slideheading{Rozdielny štýl práce}
\begin{itemize}
\item \overlay{0}{konečne je definované, ktorá verzia je aktuálna: \textbf{tá v centrálnom úložisku (Repository)}}
\item \overlay{1}{je v podstate jedno, ktorý systém používate; doležité je, aby vám uľahčoval prácu}
\end{itemize}
\end{slide}
\TIMING{2}{min}
\begin{slide}
\slideheading{Starý štýl práce}
\begin{enumerate}
\item \overlay{0}{idem pracovať na projekte}
\item \overlay{1}{vezmem nejakú verziu, začnem upravovať}
\item \overlay{2}{otestujem svoje zmeny}
\item \overlay{3}{spomeniem si, kde som spravil zmeny}
\item \overlay{4}{spravím zálohu ostrej verzie}
\item \overlay{5}{nové verzie súborov nakopírujem do ostrej verzie}
\item \overlay{6}{skontrolujem, či moje zmeny v ostrej verzii fungujú}
\item \overlay{7}{pomýlil som sa a moja práca je preč!}
\end{enumerate}
\end{slide}
\TIMING{4}{min}
\begin{slide}
\slideheading{Problémy}
\begin{itemize}
\item \overlay{0}{začleňovanie mojich zmien do ostrej verzie}
\item \overlay{1}{nekonzistentný stav ostrej verzie počas začleňovania zmien}
\item \overlay{2}{ťažkopádna spolupráca viacerých ľudí na jednom projekte}
\item \overlay{3}{problematické zlučovanie zmien z rôznych verzií}
\item \overlay{4}{problém so skladovaním rôznych verzií}
\item \overlay{5}{zložité zálohovanie}
\end{itemize}
\end{slide}
\TIMING{3}{min}
% end UVOD */
\begin{slide}
%\slideheading{}
{}\strut\vfill
\hfill\textbf{\Huge Dosť bolo BORDELU!!!}\hfill\strut{}
\vfill
\end{slide}
\TIMING{0}{min}
% novy styl prace/*
\begin{slide}
\slideheading{Nový štýl práce}
\begin{itemize}
\item \overlay{0}{začneme založením úložiska pre naše projekty}
\item \overlay{1}{pridáme projekt do CVS / SVN}
\item \overlay{2}{upravíme projekt}
\item \overlay{3}{zaznamenáme zmenu}
\item \overlay{4}{zaktualizujeme ostrú verziu}
\item \overlay{5}{pozrieme si staršie verzie projektov}
\item \overlay{6}{ukážeme si spoluprácu viacerých vývojárov}
\end{itemize}
\end{slide}
\TIMING{1}{min}
% */
% zalozenie uloziska /*
\begin{slide}
\slideheading{Založenie úložiska}
\begin{itemize}
\item \overlay{0}{\cvscmd{cvs -d \~{}/cvs\_root init}}
\item \overlay{1}{\svncmd{svnadmin create --fs-type fsfs \~{}/svn\_root}}
\item \overlay{2}{\svncmd{svnadmin create --fs-type bdb \~{}/svn\_root}}
% \item \overlay{2}{
%\begin{verbatim}
%/home/lugcon/svn_root/
%|-- db
%| |-- DB_CONFIG
%| |-- __db.001
%...
%| |-- __db.005
%| |-- fs-type
%| |-- log.0000000001
%...
%\end{verbatim}
%}
\end{itemize}
\end{slide}
\TIMING{2}{min}
% */
% struktura uloziska /*
\begin{slide}
\slideheading{Štruktúra úložiska}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{jeden súbor v úložisku = jeden súbor v projekte}
\item \overlay{2}{v úložisku sa možno jednoducho prehrabávať}
\item \overlay{3}{konfigurácia CVS je v projekte CVSROOT -- problémy so zabezpečením servera}
\end{itemize}
\overlay{4}{\textbf{SVN}}
\begin{itemize}
\item \overlay{5}{dva súbory v úložisku = jedna revízia projektu}
\item \overlay{6}{na prehrabávanie sa v SVN úložisku máme príkaz \\ \svncmd{svnlook tree \~{}/svn\_root }}
\end{itemize}
\end{slide}
\TIMING{3}{min}
% */
% navr struktury projektov - CVS /*
\begin{slide}
\slideheading{Návrh štruktúry projektov pre CVS}
\overlay{0}{\textbf{Príprava projektu a~pridanie do CVS:}} \\
\begin{enumerate}
\item \overlay{1}{\cvscmd{export CVSROOT=:local:/home/lugcon/cvs\_root}}
\item \overlay{2}{\cvscmd{cd \~{}/work/c-project}}
\item \overlay{3}{\cvscmd{cvs import -m 'Import projektu do CVS'
\cmdbreak{}c-project rajo start}}
\item \overlay{4}{\cvscmd{cd ..}}
\item \overlay{5}{\cvscmd{mv c-project c-project.bak}}
\item \overlay{6}{\cvscmd{cvs checkout c-project}}
\end{enumerate}
\end{slide}
\TIMING{2}{min}
% */
% navr struktury projektov - SVN /*
\begin{slide}
\slideheading{Návrh štruktúry projektov pre SVN}
\overlay{0}{\textbf{Príprava projektu a~pridanie do SVN:}} \\
\begin{enumerate}
\item \overlay{1}{\magenta
\begin{verbatim}
s-project
|-- branches
|-- tags
\-- trunk
|-- Makefile
|-- README
\-- src
|-- Makefile
\-- test.c
\end{verbatim}
}
\newpage
\item \overlay{2}{\svncmd{cd \~{}/work/}}
\item \overlay{3}{\svncmd{svn import -m 'Import projektu do SVN' s-project
\cmdbreak{}file:///home/lugcon/svn\_root/s-project}}
\item \overlay{4}{\svncmd{mv s-project s-project.bak}}
\item \overlay{5}{\svncmd{svn checkout
\cmdbreak{}file:///home/lugcon/svn\_root/s-project/trunk
\cmdbreak{}s-project}
}
\end{enumerate}
\end{slide}
\TIMING{3}{min}
% */
% sprava verzii /*
\begin{slide}
\slideheading{Správa verzií}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{každý súbor má číslovanie revízií zvlášť}
\item \overlay{2}{príslušnosť nejakej verzie súboru do určitej revízie/míľnika je zapísaná v~RCS súbore
\texttt{subor.txt,v}}
\end{itemize}
\begin{center}
\includegraphics[height=\textheight]{img/t}
\end{center}
\overlay{3}{\textbf{SVN}}
\begin{itemize}
\item \overlay{4}{spoločné číslovanie revízií pre všetky projekty}
\item \overlay{5}{podpora transakcií}
\item \overlay{6}{míľniky sú nezávislé stromy v~adresárovej štruktúre}
\end{itemize}
\begin{center}
\includegraphics[]{img/ch08dia1}
\end{center}
\begin{center}
\includegraphics[]{img/ch08dia2}
\end{center}
\end{slide}
\TIMING{2}{min}
% */
% atributy suborov /*
\begin{slide}
\slideheading{Atribúty súborov}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{ignorovanie súborov zapísaných v~\file{.cvsignore}}
\item \overlay{2}{označenie súboru ako binárneho príkazom \\
\cvscmd{cvs admin -kb image.jpeg}}
\end{itemize}
\overlay{3}{\textbf{SVN}}
\begin{itemize}
\item \overlay{4}{implementované rozhranie na nastavovanie atribútov súborov}
\item \overlay{5}{\svncmd{svn propset svn:ignore '*.o *.bak' path/to/directory}}
\item \overlay{6}{\svncmd{svn propset copyright '(c) 2005 Platon Group' main.c}}
\item \overlay{7}{ďalšie možné atribúty:
\svncmd{license svn:executable svn:mime-type svn:keywords svn:svn:eol-style}
}
\end{itemize}
\end{slide}
\TIMING{2}{min}
% */
% prehliadanie zmien /*
\begin{slide}
\slideheading{Prehliadanie zmien a~stav súborov}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{\cvscmd{cvs diff subor.txt}}
\item \overlay{2}{\cvscmd{cvs status subor.txt}}
\end{itemize}
\overlay{3}{\textbf{SVN}}
\begin{itemize}
\item \overlay{5}{\svncmd{svn diff subor.txt}}
\item \overlay{6}{\svncmd{svn status subor.txt}}
\end{itemize}
\end{slide}
\TIMING{1}{min}
% */
% symbolicke odkazy, spc. subory /*
\begin{slide}
\slideheading{Symbolické odkazy a špeciálne súbory}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{bez podpory vkladania symbolických odkazov}
\end{itemize}
\overlay{2}{\textbf{SVN}}
\begin{itemize}
\item \overlay{3}{symbolické odkazy SVN zvláda bez problémov}
\end{itemize}
\end{slide}
\TIMING{1}{min}
% */
% odstranenie suboru z projektu /*
\begin{slide}
\slideheading{Odstránenie súboru z projektu}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{
\cvscmd{rm -f test.txt} \\
\cvscmd{cvs remove test.txt} \\
\cvscmd{cvs commit -m 'Subor odstraneny' test.txt}
}
\end{itemize}
\overlay{2}{\textbf{SVN}}
\begin{itemize}
\item \overlay{3}{
\svncmd{svn remove test.txt} \\
\svncmd{svn commit -m 'Subor odstraneny' test.txt}
}
\end{itemize}
\end{slide}
\TIMING{1}{min}
% */
% riesenie konfliktov /*
\begin{slide}
\slideheading{Riešenie konfliktov}
S bežným zlučovaním zmien na rôznych miestach súboru si CVS aj~SVN hravo poradí. Problém nastane, ak dvaja vývojári
spravia rozdielne zmeny v tej istej časti kódu a~ich zmeny sú navzájom nekompatibilné.
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{
\cvscmd{cvs update} \\
\cvscmd{vim test.c} \\
\cvscmd{cvs diff} \\
\cvscmd{cvs commit -m 'Rucne zlucenie zmien.' test.c} \\
}
\end{itemize}
\newpage
\overlay{2}{\textbf{SVN}}
\begin{itemize}
\item \overlay{3}{
\svncmd{svn update} \\
\svncmd{vim test.c} \\
\svncmd{svn resolved test.c} \\
\svncmd{svn commit -m 'Rucne zlucenie zmien.' test.c}
}
\end{itemize}
\end{slide}
\TIMING{3}{min}
% */
% zrusenie zmien /*
\begin{slide}
\slideheading{Zrušenie zmien}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{
\cvscmd{rm -f test.txt} \\
\cvscmd{cvs update test.txt}
}
\end{itemize}
\overlay{2}{\textbf{SVN}}
\begin{itemize}
\item \overlay{3}{
\svncmd{svn revert test.txt}
}
\end{itemize}
\end{slide}
\TIMING{2}{min}
% */
% vetvy vyvoja, zlucovanie zmien /*
\begin{slide}
\slideheading{Vetvy vývoja, zlučovanie zmien}
\textbf{CVS}
\begin{itemize}
\item pre každý súbor existuje samostatný strom revízií
\end{itemize}
\textbf{SVN}
\begin{itemize}
\item jedna revízia je stromová štruktúra adresárov a~súborov
\item táto štruktúra sa v čase mení, čiže čas pridáva dvojdimenzionálnej štruktúre tretí rozmer
\end{itemize}
\end{slide}
\TIMING{1}{min}
% */
% zalozenie novej vetvy vyvoja /*
\begin{slide}
\textbf{CVS}
\begin{itemize}
\item vytvorenie novej vývojovej vetvy: \\
\cvscmd{cvs tag -b rel-1-0-patches}
\item prístup k novej vetve: \\
\cvscmd{cvs checkout -r rel-1-0-patches c-project}
\item prepnutie do novej vetvy: \\
\cvscmd{cvs update -r rel-1-0-patches}
\item začlenenie zmien z~vetvy rel-1-0-patches: \
\cvscmd{cvs update -j rel-1-0-patches} \\
\cvscmd{cvs commit -m 'Zahrnute opravy z verzie 1.0'}
\end{itemize}
\newpage
\textbf{SVN}
\begin{itemize}
\item vytvorenie novej vývojovej vetvy: \\
\svncmd{svn checkout
\cmdbreak{}file:///home/lugcon/svn\_root/s-project
\cmdbreak{}s-project} \\
\svncmd{cd s-project} \\
\svncmd{svn copy trunk branches/rel-1-0-patches}
\item prístup k novej vetve: \\
\svncmd{svn checkout
\cmdbreak{}file:///home/lugcon/svn\_root/s-project/bran-\\ches/rel-1-0-patches}
\newpage
\item začlenenie zmien z hlavnej vetvy: \\
\svncmd{svn merge -r 343:344
\cmdbreak{}file:///home/lugcon/svn\_root/s-project/trunk} \\
\svncmd{svn commit
\cmdbreak{}-m "Zaclenienie zmien r344 z hlavnej vetvy trunk."}
\end{itemize}
\end{slide}
\TIMING{10}{min}
% */
% ine metody pristupu k ulozisku /*
\begin{slide}
\slideheading{Iné metódy prístupu k úložisku}
\overlay{0}{\textbf{CVS}}
\begin{itemize}
\item \overlay{1}{bez modulárnej štruktúry, bez API}
\item \overlay{1}{spúšťanie cez inetd}
\item \overlay{1}{tunelovanie cez ssh}
\item \overlay{1}{lokálne}
\end{itemize}
\overlay{3}{\textbf{SVN}}
\begin{itemize}
\item \overlay{4}{dobre navrhnuté API, rôzny backend (bdb, fsfs)}
\item \overlay{5}{spúšťanie cez inetd}
\item \overlay{6}{tunelovanie cez ssh}
\item \overlay{7}{lokálne}
\item \overlay{8}{WebDAV, spúštanie cez Apache 2.x}
\end{itemize}
\end{slide}
\TIMING{1}{min}
% */
% zalohovanie uloziska, synchronizacia /*
\begin{slide}
\slideheading{Zálohovanie úložiska, synchronizácia}
\begin{itemize}
\item \overlay{0}{CVS zálohovať ako ostatné súbory na disku}
\item \overlay{1}{SVN zálohovať utilitou \svncmd{svnadmin}: \\
\svncmd{svnadmin dump file:///home/lugcon/svn\_root}
}
\end{itemize}
\textbf{Synchronizácia} \\
\svncmd{rsync -a -e ssh --delete --progress --stats
\cmdbreak{}/home/rajo/svn\_root/
\cmdbreak{}rajo@platon.sk:/home/rajo/svn\_root/}
\textcolor{red}{Pozor na koncové lomítka a poradie parametrov!} \\
Najlepšie je spraviť skript, ktorý synchronizáciu spraví za Vás.
\end{slide}
\TIMING{2}{min}
% */
% Dalsie nastroje /*
\begin{slide}
\slideheading{Domovské stránky projektov}
\textbf{CVS:}
\begin{itemize}
\item \URL{http://ximbiot.com/cvs/cvshome/}
\end{itemize}
\textbf{SVN:}
\begin{itemize}
\item \URL{http://subversion.tigris.org/}
\item dokumentácia \URL{http://svnbook.red-bean.com/}
\end{itemize}
\end{slide}
\TIMING{2}{min}
% */
% Dalsie nastroje /*
\begin{slide}
\slideheading{Ďalšie nástroje na správu verzií}
\textbf{Slobodné alternatívy:}
\begin{itemize}
\item git \URL{http://git.or.cz/}
\item SVK \URL{http://svk.elixus.org/}
\item GNU arch \URL{http://www.gnu.org/software/gnu-arch/}
\item darcs \URL{http://abridgegame.org/darcs/}
\end{itemize}
\textbf{Komerčné alternatívy:}
\begin{itemize}
\item BitKeeper \URL{http://www.bitkeeper.com/}
\item Rational ClearCase \URL{http://www-306.ibm.com/software/awdtools/clearcase/}
%\item Microsoft SourceSafe \URL{http://msdn.microsoft.com/vstudio/previous/ssafe/}
\end{itemize}
Ďalšie porovnania na \URL{http://www.bitkeeper.com/Comparisons.html}
\textbf{Konvertory:}
\begin{itemize}
\item cvs2svn \URL{http://cvs2svn.tigris.org/} -- funguje bez problémov
\end{itemize}
\end{slide}
\TIMING{2}{min}
% */
% ZAVER /*
\def\bgtext{}% vypneme logo "Vim"
\begin{slide}
\slideheading{Záver}
\begin{center}
\strut{}\vfill
{\large\bf Ďakujem za pozornosť}\\
\strut{}\strut\\
{\large Mgr. Ľubomír Host}\\
\texttt{\footnotesize <rajo AT platon.sk>}\\
\texttt{\footnotesize http://rajo.platon.sk} \\
\strut{}\strut\\
{\large Združenie Platón}\\
{\footnotesize združenie na podporu otvoreného softvéru} \\
\texttt{\blue http://www.platon.sk}\\
\vfill{}\strut\\
\tiny{Powered by: \\
Vim, \LaTeX, GNU/Linux Debian, \vimconfig{} \\
PLaTos -- \URL{\blue http://platos.platon.sk/}
}\\
{}\strut\\
\end{center}
\end{slide}
\TIMING{1}{min}
%\begin{slide}
% \listofslides
%\end{slide}
% end ZAVER */
\end{document}
% vim: ts=4
% vim600: fdl=0 fdm=marker fdc=3 fmr=/*,*/ tw=120
Platon Group <platon@platon.sk> http://platon.sk/
|