% $Id: implementacepropojeni.tex,v 1.1 2007/01/18 22:20:30 jarda Exp $

Při práci s benchmarky a jejich popisem nastává jsem použil
dva programovací jazyky, což do problému vnáší heterogenitu. Taková
situace v praxi nastává často - příčinou může být nutnost propojení
dvou či více existujících systémů používajících různé technologie,
vhodnost nějakého jazyka pro nasazení na dílčí úkol a podobně.

{\odstavec
V našem případě nastávají dva problémy, které je třeba vyřešit:
}

\begin{itemize}

\item
Nutnost komunikace mezi různými prostředími.

\item
Nutnost duplicitního nastavení.
        
\end{itemize}

\subsection{Možnosti komunikace mezi heterogenními programy}

Jelikož jde o samostatné programy, odpadá řešení kódové vazby a problém
se redukuje na společnou komunikaci. Možnosti komunikace jsou například následující:


\begin{itemize}

\item
Předání informací volanému programu pomocí příkazové řádky.

\item
Možnost propojení rourou.

\item
Propojení pomocí socketového propojení.

\item
Předání parametrů pomocí souboru.
        
\end{itemize}

Při komunikaci mezi databázovou aplikací a pomocnými programy v Pythonu
používám předání základních informací pomocí příkazové řádky a vytvoření
souboru pro další použití - výhodou je asynchronní komunikace. Konkrétnímu
použití obou metod se budu věnovat na jiném místě.


\subsection{Vyřešení problému duplicitního nastavení}
{\odstavec
Nutnost dvojí konfigurace přináší zásadní problém v tom, že oba programy
přistupují ke stejným zdrojům a komunikačním kanálům. Pokud dojde k jakékoliv
změně, je třeba změnu provést na dvou místech najednou, což přináší možnost
chyb a opomenutí.

Existují tři možnosti, jak se k problému postavit:
}

\begin{enumerate}
        
\item
Problém ignorovat a ponechat dvojí nastavení. Pokud počet voleb nastavení
není mnoho, může tento přístup vyhovovat, neboť při omezeném počtu nastavených
možností je vysoká pravděpodobnost, že se na problém okamžitě přijde. Při
rozrůstání aplikace a zvyšování složitosti to však často přestává platit.

\item
Konfiguraci uložit do společného konfiguračního souboru. Nevýhodou je nutnost
udržovat nějaké neutrální umístění, které bude přístupné oběma aplikacím.
Další nevýhodou je nutnost použít nějaký společný formát, například XML nebo
Windows INI, což přináší jednak komplikovanější zpracování (potřeba použít
příslušnou knihovnu nebo implementovat zpracování v obou jazycích) a jednak
to znamená větší časovou náročnost, protože se tím zabraňuje interpreteru
zkrátit čas načtení vlastními prostředky (cache interpreteru, přeložený
modul *.pyc).

\item
Vytvořit metakonfigurační soubor a vygenerovat z něj konfigurační moduly pro
obě aplikace. V našem případě pythonovský modul (.py) a vkládací soubor PHP
(.inc.php). Výhodou je větší rychlost zpracování a zjednodušení obou aplikací.
        
\end{enumerate}

Zvolil jsem cestu metakonfiguračního souboru. Skript GenConfigFiles.py, který jsem
vytvořil, dokáže ze souboru se syntaxí

\begin{verbatim}
název = hodnota
\end{verbatim}

vygenerovat moduly v PHP a Pythonu, které se pak používají v obou částech aplikace.
Zdrojový soubor může vypadat třeba následovně:

\begin{verbatim}
dbName                  = 'benchmark'
dbUser                  = 'jarda'
dbPort                  = '5432'
benchmarkFilesDirectory = '/home/jarda/projects/benchmarks/benchmarkFiles'
tmpDirectory            = '/home/jarda/projects/benchmarks/tmpFiles'
execDirectory           = '/home/jarda/projects/benchmarks/parseInfo'
existenceFileExtension  = 'existence'
archiveFileExtension    = 'zip'
\end{verbatim}

Vygenerovaný konfigurační soubor v Pythonu:

\begin{verbatim}
# This file is generated by GenConfigFiles script

class BenchConfig(object):
    dbName                      = 'benchmark'
    dbUser                      = 'jarda'
    dbPort                      = '5432'
    benchmarkFilesDirectory     = '/home/jarda/projects/benchmarks/benchmarkFiles'
    tmpDirectory                = '/home/jarda/projects/benchmarks/tmpFiles'
    execDirectory               = '/home/jarda/projects/benchmarks/parseInfo'
    existenceFileExtension      = 'existence'
    archiveFileExtension        = 'zip'
\end{verbatim}

Vygenerovaný konfigurační soubor v PHP:

\begin{verbatim}
<?php
# This file is generated by GenConfigFiles script

    class BenchConfig
    {
        static $dbName                   = 'benchmark';
        static $dbUser                   = 'jarda';
        static $dbPort                   = '5432';
        static $benchmarkFilesDirectory  = '/home/jarda/projects/benchmarks/benchmarkFiles';
        static $tmpDirectory             = '/home/jarda/projects/benchmarks/tmpFiles';
        static $execDirectory            = '/home/jarda/projects/benchmarks/parseInfo';
        static $existenceFileExtension   = 'existence';
        static $archiveFileExtension     = 'zip';
    }
?>
\end{verbatim}

Nyní zbývá pouze importovat daný modul v cílovém jazyce a používat statické proměnné konfiguračních tříd.
Příklad v Pythonu:

\begin{verbatim}
from BenchConfig import BenchConfig
print BenchConfig.dbName
\end{verbatim}

Příklad v PHP:

\begin{verbatim}
require_once('config.inc.php')
echo BenchConfig::$dbName;
\end{verbatim}

% vim:enc=iso8859-2:fenc=iso8859-2:
