Autor blogu: Sergej Chodarev

twitter · github · 500px · instagram

Filozofia a programovanie

Programovanie je veľmi mladý odbor, ktorý vznikol v polovici minulého storočia. Jeho korene ale siahajú do skorších období, napríklad dvojková číselná sústava, ktorá je základom činnosti počítačov, bola plne vypracovaná Gottfriedom Leibnizom v 17. storočí.

Tak ako každá oblasť ľudského života aj programovanie je istým spôsobom spojené s filozofiou. V tejto práci sa pokúsim pozrieť na niektoré filozofické otázky, ktoré súvisia s programovaním.

Poznámka: Tento článok vznikol ako seminárna práca z predmetu Vybrané problémy filozofie.

Čo je to programovanie?

Na začiatok sa pokúsim stručne vysvetliť čo je to vlastne programovanie. Počítačový program je vlastne postupnosť príkazov, ktoré má vykonať počítač. V tejto postupnosti sa dajú tiež definovať podmienky, opakovanie príkazov, práca s pamäťou počítača a reakcie na rôzne udalosti, ako stlačenie klávesy. Programátor túto postupnosť zapisuje ako text v jednom z programovacích jazykov. Programovacie jazyky sa odlišujú rôznou úrovňou abstrakcie, teda či je jazyk bližší mysleniu človeka alebo tomu ako funguje počítač. Text, ktorý píše programátor sa nazýva zdrojový kód, a ten sa potom pomocou špeciálnych programov prekladá do tvaru, ktorý dokáže vykonávať počítač – do strojového kódu.

Filozofia programovania

Pojmom filozofia sa v súvislosti s programovaním často označujú určité základné princípy, ktorými sa programátori riadia. Mnohé programovacie jazyky a operačné systémy majú svoju filozofiu – princípy a hodnoty, na ktoré sa opierajú. Napríklad filozofia operačného systému UNIX sa podľa jedného z jeho autorov, Douga McIlroya, dá stručne vyjadriť tak:

Píšte programy, ktoré plnia jednu úlohu, ale ktoré ju plnia dobre. Píšte programy, ktoré budu spolupracovať s ostatnými programami. Píšte programy, ktoré spracovávajú textové prúdy, pretože tie sú univerzálnym rozhraním.

Iné technológie sa môžu opierať o iné princípy. Napríklad operačný systém Apple Macintosh stavia na prvé miesto jednoduchosť a estetickosť používateľského rozhrania, atď. Princípy, na ktorých je postavený operačný systém potom ovplyvňujú aj aplikácie, ktoré sú napísane pre tento systém. Podobne princípy programovacieho jazyka ovplyvňujú programy napísane v ňom (možno v ešte väčšej miere, keďže jazyk, v ktorom je myslenie vyjadrované, ovplyvňuje samotné myslenie).

Kultúry

Takéto princípy sú potom základom na vytváranie určitých kultúr okolo daného operačného systému, programovacieho jazyka alebo inej významnej technológie. Každá z týchto kultúr má svoje špecifické tradície a zvyky, dokonca môže mať svoj špecifický jazyk – slang, svoje legendy a hrdinov.

Jednou z takýchto programátorských kultúr je napríklad takzvaná „hackerská“ kultúra. Na chvíľu sa musím zastaviť pri slove „hacker“, ktoré sa v médiach používa v nesprávnom význame na označenie počítačového zločinca. Pôvodne, v počítačovej kultúre, toto slovo označovalo človeka, ktorého teší poznávanie detailov vnútorného fungovania programov, počítačov a počítačových sieti.

Hackerská kultúra vznikla a rozvíjala sa v 60-tých rokoch minulého storočia v laboratóriu umelej inteligencie MIT1 a na ďalších amerických univerzitách. Od vzniku počítačovej siete ARPANET (predchodca Internetu) bola táto kultúra s ňou veľmi tesne spojená. Počítačová sieť umožnila jednoduchú výmenu poznatkov a spoluprácu ľudí, ktorí sa nachádzali na vzdialených miestach.

Práve neohraničená výmena informácii sa stala jedným z hlavných princípov hackerskej kultúry. Jednou z príčin je asi to, že táto kultúra sa vyvíjala v prostredí univerzít, kde existuje tradícia pre takúto výmenu poznatkov.

Etika programovania

Tvorivosť môže byť príspevkom spoločnosti, ale len v prípade, že spoločnosť môže slobodne využívať jej výsledky.

Richard Stallman — GNU manifest

Pre niektorých ľudí sa voľna výmena informácii stala viac ako užitočným pracovným nástrojom. Pre nich možnosť študovať ako fungujú programy a upravovať ich podľa svojích potrieb je etickou otázkou. Podobne ako vo vede sú všetky poznatky verejné pre prospech celej spoločnosti aj zdrojové kódy programov by mali byť verejné a autori programov by nemalí obmedzovať používateľov. Toto je cieľom hnutia slobodného softvéru, ktorého zakladateľom je jeden z hackerov z MIT – Richard Matthew Stallman.

Príbeh tohto hnutia sa začal z jednej laserovej tlačiarne v laboratóriu umelej inteligencie MIT, v ktorej sa často zasekával papier. To spôsobovalo pracovníkom laboratória dosť veľké nepohodlie, ktoré by sa ale dalo pomerne jednoducho vyriešiť. Stačilo by upraviť program ovládajúci tlačiareň, aby upozorňoval používateľov tlačiarne na zaseknutý papier. Lenže ku tomuto programu neboli dodané zdrojové kódy, takže sa nedal upraviť. Richard Stallman našiel človeka na inej univerzite, ktorý mal zdrojové kódy. Ale ten mu ich odmietol dať, keďže podpísal so spoločnosťou vyrábajúcou tlačiarne dohodu o nezverejňovaní. Pre Richarda Stallmana to nebola len malá nepríjemnosť, toto odmietnutie bolo pre neho ako zrada nielen jeho ale celej spoločnosti. Dohoda, ktorá núti odmietnuť pomôcť kolegovi bola pre neho neetická.

Stallman potom založil hnutie slobodného softvéru a sformoval jeho filozofiu. Softvér je slobodný ak neobmedzuje slobodu jeho používateľov, konkrétnejšie, ak poskytuje štyri základné práva:

  1. Právo používať program na akýkoľvek účel.
  2. Právo študovať ako program funguje a upravovať ho podľa svojich potrieb. To vyžaduje prístup ku zdrojovým kódom.
  3. Právo distribuovať kópie programu a pomôcť tak svojím blížnym.
  4. Právo zlepšovať program a zverejniť zlepšenú verziu aby z toho mala prospech celá komunita.

Stallman založil projekt GNU, ktorého cieľom bolo vytvorenie slobodného operačného systému, a tiež napísal licenciu GNU GPL, ktorá mala chrániť slobodu používateľov. Jej základom je princíp nazývaný copyleft2, podľa ktorého, ak niekto použil kód slobodného programu, musí aj jeho upravená verzia byť pod tou istou licenciou. Tým sa má zabrániť tomu, aby niekto mohol zobrať slobodný softvér a ďalej ho šíriť už bez príslušných slobôd.

Softvérové spoločnosti sa ale snažia o čo najväčší zisk. Preto chcu čo najviac obmedziť práva používateľov. Tvrdia, že oni, ako autori, vlastnia softvér a preto majú ako jediní právo rozhodovať o jeho distribúcii a používaní.

Veľmi často počujeme o softvérovom „pirátstve“, o „krádeži“ softvéru. Softvér ale nie je hmotná vec, je to informácia v digitálnej podobe, ktorá sa dá jednoducho kopírovať a šíriť. Takže tým, že si niekto urobí kópiu niektorého programu, nikomu nič nezoberie. Zverejňované údaje o stratach spôsobovaných „pirátstvom“ sa zakladajú na predpoklade, že každý, kto si skopíroval program, by ho inak kúpil. To ale často nie je tak.

Tieto obmedzenia, ktoré sa snažia zaviesť mnohé softvérové spoločnosti sú neetické. Oni jednak zakazujú používateľovi zisťovať ako fungujú programy na jeho počítači a prispôsobovať si ich. Takže používateľ stráca kontrolu nad svojim počítačom a nad svojimi údajmi. Ale tiež zakazujú pomáhať iným ľuďom tým, že im poskytneme kópiu programu. Práva autora programu sa tu stavajú nad práva používateľov programu, nad pomoc blížnemu a nad prospech celej spoločnosti.

Stallman uvádza porovnanie programov s receptami. Podobne ako recepty aj programy predstavujú vlastne návod na vykonanie určitej činnosti. Je bežne, že ľudia si recepty medzi sebou vymieňajú, je to súčasť dobrých medziľudských vzťahov. Ľudia si tiež upravujú recepty podľa svojej chuti a vytvárajú nové recepty na základe starých. Predstavte si, keby vydavateľ knihy s receptami zakazoval povedať recept niekomu, kto si nekúpil knihu, alebo by zakazoval upravovať recept. Presne toto sa teraz deje s počítačovými programami – pomoc blížnemu sa označuje za krádež3.

Musím ešte vyvrátiť častý omyl, že hnutie slobodného softvéru je proti predaju programov. Tento omyl je spôsobený aj tým, že slovo „free“ v angličtine znamená okrem „slobodný“ aj „bezplatný“. Sloboda softvéru nie je o cene ale o právach používateľa. Aj keď zarábanie na slobodnom softvére je zložitejšie, mnohé spoločnosti ukázali, že je to možné a sú celkom úspešné.

Sloboda? Ktorá sloboda?

Niektorí ľudia nesúhlasia so Stallmanovym ponímaním slobody. Podľa nich obmedzenia, ktoré kladie licencia GNU GPL ju robia menej slobodnou ako niektoré iné licencie, ktoré umožňujú robiť s programom úplne čokoľvek, pokiaľ sa ponechá zmienka o pôvodných autoroch. V chápaní hnutia slobodného softvéru ale sloboda nie je absolútna, je obmedzená slobodou ďalších ľudí. Preto by nikto nemal právo slobodu, ktorú sam dostal, odobrať iným, teda šíriť modifikovaný slobodný program pod inou – neslobodnou licenciou. Takéto obmedzenie slobody jednotlivca je potrebné kvôli zachovaniu slobody všetkých.

Ako určitá opozícia voči hnutiu slobodného softvéru vzniklo hnutie Open Source (otvorených zdrojových kódov). Predstavitelia tohto hnutia sa snažia zdôrazňovať najmä praktické výhody slobodného softvéru, ako je vyššia kvalita a bezpečnosť programov, ktorá pramení z verejného vývoja a zapojenia množstva dobrovoľníkov, ktorí kontrolujú a zlepšujú kód programov. Hnutie open source ale nespomína etické hodnoty slobodného softvéru, keďže s nimi nie všetci súhlasia, a tak by to mohlo obmedziť rozširovanie takéhoto softvéru. Stallman ale oponuje, že na zaistenie slobody používateľov z dlhodobého hľadiska je nevyhnutné ich naučiť vážiť si svoju slobodu a bojovať za ňu.

Záver

Môže sa zdať, že témy, o ktorých som písal, sa týkajú iba programátorov a používateľov počítačov. Ale počítače sú dnes už natoľko bežnou súčasťou života, že ovplyvňujú život skoro každého. Okrem toho, otázky, ktorým sa venuje hnutie slobodného softvéru majú celospoločenský dosah. Toto hnutie sa totiž snaží postaviť dobre medziľudské vzťahy nad komerčné záujmy. V súčasnej ekonomickej situácii to môže naznačovať cestu, akou by sa malo vybrať svetové hospodárstvo – cestu, na ktorej najdôležitejší je človek, jeho sloboda a dobre medziľudské vzťahy.

Literatúra


  1. Massachusettský technologický inštitút 

  2. Je to slovná hračka – autorské právo sa v angličtine označuje pojmom copyright

  3. Podobná situácia je tiež s hudbou a filmom. 

Správa zdrojových kódov s Darcs

Chcete pri vývoji softvéru bez obáv experimentovať a stále mať možnosť vrátiť sa k staršej verzii? Chcete pracovať na projekte v skupine a jednoducho synchronizovať zdrojové kódy? Potom potrebujete revision control systém (RCS). V tomto článku vás zoznámim s jedným z takýchto systémov – s Darcsom.

Trochu histórie

Dlhu dobu bol najpožívanejším systémom v tejto oblasti CVS. Neskôr sa objavil jeho nástupca – Subversion, ktorý riešil viacero nedostatkov CVS. Obidva tieto systémy ale boli centralizované. To znamená, že existuje centrálny server, kde sú uložené súbory projektu a ich história. Takéto úložisko sa volá „repository“. Aby ste urobili nejaké zmeny, potrebujete stiahnuť si súbory pomocou príslušného nástroja a potom ich novú verziu nahrať späť na server.

Inú skupinu tvoria tzv. distribuované systémy na správu revízii. Tie nie sú závislé na jednom centrálnom repository, ale každý vývojár má vlastné repository v ktorom nahráva svoje zmeny. Väčšinou projekt má aj centrálne repository, s ktorým sa potom ostatní vývojári synchronizujú. Tento prístup je v súčasnosti dosť populárny a Darcs patrí tiež do tejto skupiny.

Darcs

Darcs (David‘s Advanced Revision Control System) je pomerne netradičný v porovnaní s ostatnými RCS. V Darcse hlavným objektom nie sú súbory a adresáre na ktorých sa robia zmeny, ale samotné zmeny, ktorých postupnou aplikáciou vznika určitý stav súborov. Tato koncepcia umožňuje riešiť niektoré problémy elegantnejšie a jednoduchšie. Teoretickým základom pre fungovanie Darcsu je takzvaná teória patchov.

Začíname

Najprv si potrebujete Darcs nainštalovať. Inštalačné súbory a návod na inštaláciu pre rôzne operačné systémy nájdete na stránkach projektu.

Použitie Darcsu ukážem na jednoduchom príklade. Vytvoríme si program, ktorý vypisuje frázu „Hello world“ alebo niečo podobné. Najprv potrebujeme vytvoriť adresár pre náš projekt. Povedzme, že sa bude volať helloworld. Tam si uložíme aj prvú verziu nášho programu (hello.c), ktorá bude vyzerať takto:

#include <stdio.h>
int main() {
    printf("Hello world\n");
    return 0;
}

Teraz chceme začať používať Darcs a zaznamenať si túto prvú verziu. Darcs sa ovláda pomocou príkazového riadku (ako väčšina RCS). Najprv prejdeme do adresára, kde mame zdrojové kódy projektu a potom tu vytvoríme repository:

cd helloword
darcs initialize

Všimnite si, že sa v adresári vytvoril podadresár _darcs. Tam sa budu ukladať zaznamenávané zmeny a iné pomocné informácie. Teraz povieme Darcsu aby sledoval zmeny v súbore hello.c:

darcs add hello.c

A nakoniec zaznamenáme prvú verziu:

darcs record -a

Darcs sa najprv opýta na vašu e-mailovú adresu. Tú bude používať ako identifikátor autora zmien. Zadáva sa v tvare „Meno Autora <emailova@adresa>„. Potom sa opýta na názov zmeny (zadáme napríklad „Prva verzia“) a či chcete zadať dlhší komentár (zatiaľ stačí ak stlačíte „n“).

Teraz máme zaznamenanú prvú zmenu. Môžeme si to overiť príkazom:

darcs changes

Mali by ste vidieť niečo takéto:

Thu Nov 22 18:58:28 CET 2007  Moje Meno <example@example.com>
  * Prva verzia

Ďalšie zmeny

Poďme si upraviť náš program. Nech sa po spustení opýta na meno používateľa a pozdraví ho osobne. Výsledok môže vyzerať tak:

#include <stdio.h>
int main() {
    char name[20];
    printf("What's your name?");
    scanf("%s", name);
    printf("Hello %s\n", name);
    return 0;
}

Pozrime sa ako sa súčasna verzia líši od zaznamenanej:

darcs whatsnew

Odpoveď bude vyzerať takto:

{
hunk ./hello.c 3
-    printf("Hello world\n");
+    char name[20];
+    printf("What's your name?");
+    scanf("%s", name);
+    printf("Hello %s\n", name);
}

Je to popis zmeny vo formáte Darcsu. „hunk“ znamená zmenu textu súboru. Za tým nasleduje názov súboru a číslo riadku, kde sa zmena začína. Ďalej je samotný zmenený text – odstránené riadky (označené s „-“) a pridané riadky („+“).

Ak sme s týmito zmenami spokojní, môžeme ich zaznamenať:

darcs record

Pre každú zmenu sa nás Darcs bude pýtať či ju chceme zaznamenať (pokiaľ nepoužijeme parameter „-a“ – all). Teraz je to len jedna zmena, takže odpovieme „y“ a potom zadáme názov patcha (napríklad „Zadavanie mena pouzivatela“). Na otázku o dlhom komentári môžeme znovu odpovedať „n“.

Ak teraz zadáme darcs changes zobrazí sa nám aj tento nový patch.

Mazanie nezaznamenaných zmien

Teraz predstavme, že sme sa rozhodli pýtať od používateľa nášho programu okrem mena aj priezvisko. Výsledok bude vyzerať takto:

#include <stdio.h>
int main() {
    char name[20];
    char surname[20];
    printf("What's your name?");
    scanf("%s", name);
    printf("What's your surname?");
    scanf("%s", surname);
    printf("Hello %s %s\n", name, surname);
    return 0;
}

Po čase si ale uvedomíme, že to nebol najlepší nápad a chceme všetko vrátiť do pôvodného stavu – k naposledy zaznamenanej verzii. Na to slúži príkaz darcs revert. Po spustení sa nás Darcs bude pýtať či chceme odstrániť jednotlivé čiastkové zmeny. Vyzerať to bude približne takto (riadky požadujúce odpoveď sú vyznačené žltou farbou):

hunk ./hello.c 4
+    char surname[20];
Shall I revert this change? (1/?)  [ynWsfqadjkc], or ? for help: y
hunk ./hello.c 7
-    printf("Hello %s\n", name);
+    printf("What's your surname?");
+    scanf("%s", surname);
+    printf("Hello %s %s\n", name, surname);
Shall I revert this change? (2/?)  [ynWsfqadjkc], or ? for help: y
Do you really want to revert these changes? y
Finished reverting.

Teraz už viete zaznamenávať zmeny v zdrojových kódoch pomocou Darcsu a viete sa vrátiť k naposledy zaznamenanej verzii. Je to síce len časť toho, čo Darcs dokáže ale aj toto je dosť užitočné a väčšinou pri práci nič viac nepotrebujem. Ak sa chcete o Darcse dozvedieť viac, môžete si pozrieť Darcs Manual alebo Darcs Wiki.

Prispôsobenie hodín v Gnome

Hodiny na panele Gnome skrývajú niekoľko zaujímavých možnosti nastavení. Takže poďme si ich prispôsobiť.

Nastavenia hodín

Konfiguračný dialóg hodín na panele v Gnome je jednoduchý, ako je to bežné v tomto prostredí. Nastavenia, ktoré ponúka väčšinou aj celkom stačia. Ale ak predsa chcete prispôsobiť vzhľad hodín viac potrebujete Editor konfigurácie GConf. Ak ho náhodou nemáte, pravdepodobne sa dá nainštalovať pomocou správcu balíkov vašej distribúcie. Väčšinou je názov balíka rovnaký ako názov programu – „gconf-editor“.

Ďalej potrebujete nájsť potrebný kľúč prislúchajúci hodinám. Nastavenia apletov na panele sa v databáze GConf nachádzajú v adresáre /apps/panel/applets/. Tam to už začína byť zložitejšie. Podľa toho čo ste robili s vašim panelom, môže tam byť množstvo nastavení rôznych apletov, aj tých, ktoré už dávno nepoužívate. Takže asi jediná možnosť je prechádzať všetky a kontrolovať, kde má kľúč bonobo_iid hodnotu „OAFIID:GNOME_ClockApplet“. Ak takýchto záznamov mate viac, asi budete musieť vyskúšať všetky.

Gconf Editor

Samotné nastavenia apletov je v podadresáre „prefs“. Tam potrebujete nastaviť kľúč format na hodnotu „custom“ a do kľúča custom_format zapísať v akom tvare chcete mať zobrazený čas. Ako sa spomína v dokumentácii k tomuto kľúču, môžete používať prepínače pre funkciu strftime(), takže podrobnosti získate pomocou

man 3 strftime

Hodiny

Zaujímavou a nezdokumentovanou vlastnosťou je možnosť zmeniť vzhľad textu pomocou značiek podobných HTML. Popis týchto značiek nájdete v dokumentácii ku knižnici Pango, ktorá sa v Gnome používa na zobrazovanie textov. Ja používam takéto nastavenie: %a %e %b, <b>%H:%M</b>. Jeho výsledok môžete vidieť na obrázku.

phpDarcsView 0.5

Darcs je vynikajúci nástroj na správu zdrojových kódov. Existuje preň aj niekoľko nástrojov na prezeranie repository cez webové rozhranie, ale všetky vyžadujú, aby bol Darcs nainštalovaný na serveri a pripadne ešte aj možnosť spúšťať CGI skripty. Hosting kde by vám to dovolili, a ešte k tomu zadarmo, asi len tak ľahko nenájdete. Darcs však našťastie ukladá všetky informácie do textových súborov s jednoduchou štruktúrou, takže nie je ťažké napísať skript v PHP, ktorý by napríklad zoznam patchov získal z týchto súborov a nepotreboval by na to volať Darcs. A práve toto som aj urobil a teraz vydávam jeho prvú verziu.

phpDarcsView, ako sa tento skript volá, dokáže zobraziť aktuálne verzie súborov v repository a tiež zoznam patchov. Ak sa bojíte, že sa e-mailové adresy autorov patchov dostanú ľahko do rúk spamerom, tak buďte pokojní – e-mailové adresy sa v zozname patchov nezobrazujú. Pozrieť sa dá aj konkrétny obsah patchov. Pri zobrazovaní zdrojových kódov dokáže skript farebne zvýrazňovať syntax v spolupráci s FSHL (ten musíte nainštalovať samostatne).

Ako vyzerá tento skript v akcii si môžete pozrieť na mojich darcs repositories a stiahnuť si ho môžete na jeho domovskej stránke.

Skript na kompilovanie (skoro) hocičoho

Mnohé textové editory ponúkajú možnosť pomocou nejakej klávesovej skratky spustiť make v adresári s editovaným súborom. Je to pomerne pohodlné, ale nie vždy chcem na kompilovanie používať make. Preto som napísal jednoduchý shell skript, ktorý dokáže podľa typu súboru rozhodnúť ako ho skompiluje.

Tu je samotný skript build.sh:

#!/bin/bash

function run() {
    echo $@
    $@
}

function build_tex() {
    LATEX_ARGS=-halt-on-error
    FILENAME=$1

    MASTER=`grep -oP '(?<=%% master:) [-_\.\w]*' $FILENAME`
    if [ -n "$MASTER" ]
        then FILENAME=$MASTER
    fi

    if grep -Fq $'\usepackage{slovak}\n\usepackage{czech}' $FILENAME
        then run cslatex $LATEX_ARGS $FILENAME
        else run latex $LATEX_ARGS $FILENAME
    fi
}

FILENAME=$1
if [ -f Makefile -o -f makefile ]
    then run make
elif [ -f SConstruct ]
    then run scons -Q
else
    EXT=${FILENAME##*.}
    case "$EXT" in
    "tex")
        build_tex $FILENAME
        ;;
    "java")
        run javac $FILENAME
        ;;
    "c")
        run gcc -Wall -o ${FILENAME%.c} $FILENAME
        ;;
    *)
        echo "I don't know how to build your file"
        ;;
    esac
fi

Zatiaľ nepodporuje veľa typov súborov. Pokiaľ je v aktuálnom adresári súbor Makefile, tak spusti make, pokiaľ je tam súbor SConstruct – spusti scons. Ak žiaden z týchto súborov nenájde, rozhoduje sa podľa názvu súboru, ktorý dostane ako argument. Vie skompilovať program v C a v Jave, alebo spracovať dokument v LaTeXe. Pridanie podpory pre ďalšie typy súborov je veľmi jednoduché, takže každý si to môže prispôsobiť podľa vlastných potrieb.

Ešte sa zastavím pri spracovávaní dokumentov v LaTeXe. Skript vie rozpoznať či sa má použiť csLaTeX alebo obyčajný LaTeX. Tiež podporuje dokumenty rozdelené do viacerých súborov: stačí do súborov dať komentár v tváre

%% master: názov_hlavného_súboru

a spracovávať sa bude hlavný súbor namiesto toho, ktorý skript dostal ako argument.

Dúfam, že tento skrípt bude pre niekoho užitočný.