Otvorený kód (Open source)

Pojem „open source“ sa zvykne spomínať väčšinou v súvislosti s operačným systémom Linux, webserverom Apache, internetovým prehliadačom Mozilla a iným známymi produktami s otvoreným kódom. Mnohí však stále netušia, načo ten „otvorený kód“ vlastne je a čím sa takéto programy líšia od „normálnych“.

Ak sa o nejakom programe povie, že je „open source“ alebo „s otvoreným kódom“, znamená to, že jeho zdrojové kódy sú prístupné každému. Nemusí to automaticky znamenať, že program je zadarmo, ani to, že možno tento kód ľubovoľne použiť.

Prakticky všetky programy vznikajú tak, že ich autor (autori) napíše v nejakom programovacom jazyku (najčastejšie C alebo C++). Väčšina jazykov je obyčajný čistý text, obsahujúci príkazy (najčastejšie skratky anglických slov) a rôzne špeciálne a formátovacie znaky. Všetky tieto texty v programovacom jazyku pre aplikáciu X sa dokopy nazývajú aj „zdrojový kód aplikácie X“.

Následne sa na tento zdrojový kód použije program nazývaný „kompiler“, ktorý prevedie súbory v programovacom jazyku do takzvanej binárnej formy, určenej pre procesor počítača. Zkompilovaný kód má väčšinou formu spúšťateľných súborov (vo Windows majú príponu EXE alebo COM) a/alebo takzvaných knižníc (vo Windows DLL, v Linuxe SO).

Väčšina programov sa distribuuje iba v binárnej forme, z ktorej je prakticky nemožné získať pôvodný zdrojový kód. Programy s otvoreným kódom sa líšia práve tým, že tento zdrojový kód distribuujú tiež.

Termín „open source“ sa najčastejšie spája s „Open Source Initiative“ (OSI). Je to nezisková organizácia, ktorá sa venuje propagovaniu otvoreného kódu, hlavne prostredníctvom certifikačného programu. V ňom posudzuje, či licencia programu spĺňa definíciu otvoreného kódu. Tá je určená splnením deviatich podmienok.

Pravdepodobne najznámejšou licenciou pre otvorený kód je GNU GPL.

Ako sa možno dočítať na stránke OSI: „Základná myšlienka otvoreného kódu je veľmi jednoduchá: keď programátori môžu čítať, redistribuovať a modifikovať zdrojový kód nejakej časti softvéru, tento softvér sa vyvíja. Ľudia ho vylepšujú, prispôsobujú a opravujú chyby. Toto všetko sa deje rýchlosťou, ktorá je pre človeka zvyknutého na pomalý vývoj konvenčného softvéru udivujúca.“

Pre používateľov programov s otvoreným kódom z toho vyplýva vyššia kvalita, rýchlejší vývoj a hlavne oveľa rýchlejšie opravovanie chýb, než je tomu u softvéru s uzavretým kódom. Oprava pre akúkoľvek chybu je hotová najneskôr o niekoľko hodín, občas je dokonca súčasťou správy o chybe. Keďže kód je verejne prístupný, môže opravu urobiť ktokoľvek. Ak sa chyba objaví v uzavretom kóde, treba počkať na autora, kým ju opraví on sám, čo môže trvať dosť dlho.

Hlavne v poslednej dobe sa stále častejšie objavujú aféry spojené s vkladaním neželaných funkcií do programov. Najčastejšie ide o posielanie údajov o používateľovi a jeho správaní cez internet autorom programu (programy s touto „funkciou“ sa zvyknú nazývať „spyware“). Takéto niečo v prípade softvéru s otvoreným kódom prakticky neprichádza do úvahy.

Otvorený kód programu nemá pre absolútnu väčšinou používateľov žiadne nevýhody. Iba vo výnimočných prípadoch môže jeho otvorenosť prekážať, hlavne ak sa vyžaduje paranoidná úroveň bezpečnosti (firmy a organizácie, ktoré ju vyžadujú, si však väčšinou práve z tohto dôvodu vytvárajú softvér vo vlastnej réžii).

Prečo je potom softvéru s otvoreným kódom tak málo? Lebo nie je výhodný pre softvérové firmy. Ak je pre nich softvér hlavným zdrojom príjmov, nemôžu zverejniť jeho zdrojový kód. Hocikto by ho potom mohol skopírovať a firma by prišla o príjmy. V prípade softvéru s veľkým množstvo potenciálnych používateľov (operačné systémy, office aplikácie a podobne) sa veľkým firmám oplatí sponzorovať ich tvorbu aj s otvoreným kódom. V oblasti vysoko špecializovaného a na konkrétne požiadavky prispôsobeného softvéru otvorený kód nájdete iba výnimočne.

Z hľadiska používateľa sa programy s otvoreným kódom teda prakticky nijako nelíšia od ostatných, aj pravdepodobnosť výskytu chýb v nich je v podstate rovnaká. Ich výhodou je, že tieto chyby sa väčšinou podarí objaviť rýchlejšie a prakticky hneď je k dispozícii aj oprava. Aj vďaka tomu existuje niekoľko programov s otvoreným kódom, v ktorých nebola objavená žiadna závažnejšia chyba už niekoľko rokov.

Pbatenghyngvbaf Lbh ner n bofreinag jro unpxre Vs Lbh jnag n wbo va bhe pbzcnal cyrnfr znvy gb gbhtuthl ng ci2p qbg fx Unir n avpr qnl
	Well, there was this tiger, who woke up one morning, and just felt
great (yes, just like Tony the Tiger: GREAAAAAAT).  Anyway, he just felt
so good, he went out and cornered a small monkey and roared at him: "WHO IS
THE MIGHTIEST OF ALL THE JUNGLE ANIMALS?"
	And this poor quaking little monkey replied: "You are of course, no
one is mightier than you."
	A little while later this tiger confronts a deer, and just bellows out:
"WHO IS THE GREATEST AND STRONGEST OF ALL THE JUNGLE ANIMALS?"
	The deer is shaking so hard it can barely speak, but manages to
stammer: "Oh great tiger, you are by far the mightiest animal in the jungle."
	The tiger, being on a roll, swaggered, up to an elephant that was
quietly munching on some weeds, and roared at the top of his voice: "WHO IS
THE MIGHTIEST OF ALL THE ANIMALS IN THE JUNGLE?"
	Well, this elephant grabs the tiger with his trunk, picks him up, slams
him down; picks him up again, and shakes him until the tiger is just a blur of
orange and black; and finally throws him violently into a nearby tree.
	The tiger staggers to his feet, looks at the elephant and says: "Man,
you don't have to get so pissed, just because you don't know the answer!"
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }
        
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }