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
X-rated movies are all alike ... the only thing they leave to the
imagination is the plot.
    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;
    }