úterý 24. listopadu 2009

A Python pitfall

Next day and a next error, actually in Python. And it is surprisingly close with the previous post about keyword arguments. Python as many other languages have default arguments, therefore it is possible to us default value of argument if no value for that argument is passed.

>>> def func(a=4):
>>> print a
>>> func(1)
1
>>> func()
4
But these arguments are assign only first time as can be seen on the next example. The number values cannot be modified thus they are save from following effects.

>>> def func(a=[]):
>>> a.append(1)
>>> print a
>>> func()
[1]
>>> func()
[1, 1]
>>> func()
[1, 1, 1]
As you can see, the default value is assigned only for the first time and for next calls it is permanently reused. It can be dangerous if you are not aware of it. The following design pattern can be used to avoid this danger.

def func(a, b=None, c=None):
if b is None:
b = []
if c is None:
c = {}
#the function body
The first few lines in the previous function will inicialize new empty values, which will be specific for the actual function call. When it is necessary to use more complicated default values which will be modified in function body, than these objects should be cloned immediate after function header.

It can be said that default argument values are variant of static variables for function and such property can be very surprising for many programmers.

neděle 22. listopadu 2009

A PHP pitfall (for a pythonist)

In python is quite natural to use keyword arguments in function calls, do not try that in PHP.
A header of PHP function function f1($a, $b, $c=3, $d=4) can lead to believe that it is allowed to address function arguments by theirs names in a function call. It is simply not true. What is worse, that following construction is in PHP in all ways correct.

f1($c=13, $d=14);

Because an assertion is an expression, the whole calling is semantic equivalent to:

$c=13
$d=14
f1(13, 14)

therefore f1 is called with $a=13, $b=14, $c=3, $d=4

pondělí 20. dubna 2009

Je na čase za svobodu na internetu začít bojovat

V posledních letech se ze svobodného média jakým je internet zasahováním státních orgánů začíná formovat stejně svobodná služba jako je pošta.

Případy
Komunikace uživatelů začíná být kontrolovaná (naposledy logování emailů). Opravdu věříte, že se tyto informace použijí jen pro hledání teroristů nebo spíš pro potírání lidí s nepohodlným názorem?

Část internetu začíná být cenzurovaná (a opravdu se nejedná jen o Čínu). Za pěknými slovy o cenzuře dětského porna se schovává snaha umlčet nepohodlné zdroje informací. Viz kauze s wikileaks.de a uniklým australským seznamem blokovaných stránek. (kde více než polovina stránek souvisela s politikou).

Různé společnosti bojují o selektivní kontrolu přenášeného obsahu. Mobilní operátoři, aby se zbavili konkurence jiných služeb a zároveň si zajistili co největší krátkodobý zisk. Vlastníci duševního vlastnictví a autorské svazy kvůli snahám zamezit šíření tohoto typu obsahu a mnohdy i velmi odvozených děl.

Odpojování uživatelů od internetu. Buď si nainstalujete náš sledovací program a budete používat námi doporučený software nebo vás při nejmenší možné zámince odstřihneme. A ne abyste provozovali veřejnou WiFi !

Použití obranných prostředků je kriminalizováno - např. britský zákon o poskytnutí šifrovacího klíče autoritám.

Stejně tak je kriminalizována běžná aktivita na internetu. Počínaje prohlížením obsahu. Odkazujete na nepohodlný obsah, šup s vámi na rok do chládku. Ostatně jste si opravdu jisti, že ve vašem počítači není dětské porno? I kdybyste žádné na stránce neviděli, tak v paměti prohlížeče být může... Stejně tak není problém ho na počítač dohrát pomocí trojského koně.

Holt podle pravidla: každý je něčím vinen, tak si nevyskakujte.

První vlaštovka
Internet vznikl a mohl se rozvinout díky tomu, že služba nikdy nebyla přeregulována a byla svobodně k použití pro různé uživatele i aplikace. Je zřejmé, že internet nezůstane stejný jako byl v minulosti, koneckonců i jeho uživatelé se mění. Ale je na nás uživatelích, zda projevíme svůj názor nebo necháme prosadit lobisty všechny tyto nebezpečné trendy. Svoboda totiž není zadarmo. Proto vítám založení první vlaštovky České pirátské strany. Jen navrhuji, aby se nezabývala jen tématem ochrany autorských práv (což je chválihodné, abychom neskončili jak v zemi krále Miroslava, kde je zákázáno zpívat), ale i tématy které souvisejí s internetem celkově. Ostatně nikde není řečeno, že by se na české politické scéně neuchytila liberálně technokratická strana.

středa 15. dubna 2009

Aleš Kubík: Inteligentní agenti

podtitul: tvorba aplikačního software na bázi multiagentových systémů

Kniha má cca 240 obsahových stránek, je brožovaná (a ta moje už má i oslí uši) a vyšla v roce 2004. Kniha o agentových technologiích v češtině od českého autora se jen tak nevidí. Autor se snaží v knize zmapovat celé rozsáhlé téma agentového přístupu k návrhu software.

Na začátku knihy autor popisuje základní abstraktní architektury agentů. Poté se věnuje učení, komunikaci a přesunu agentů mezi architekturami. V poslední kapitole se autor pak věnuje existujícím agentovým prostředím a jazykům pro modelování agentů. Knize bych možná trochu vyčinil příliš široký záběr, který neumožňuje danou problematiku úplně popsat. Kniha se tak stává spíše přehledem a rozcestím na další zdroje. V knize mi přijde problematické přílišné spoléhání na matematický formalismus (v místech kde se dále nevyužívá a možná i čtenáře mate) a pak zabíhání do přílišných podrobností (hlavně v příkladech). V celé knize je použito několik jazyků (přičemž dle mého názoru by stačil pseudokód). Našel jsem jedno místo, kde bylo vynechané slovo, jinak je text s pravopisné a typografické strany v pořádku.

Domnívám se, že u zdůvodnění účinnosti Hayekova stroje (jehož návrh je imho inspirován hlavně vírou v trh) se neporovnávají různé algoritmy korektně. (opomíjí se vliv počtu barev na složitost problému). Srovnání využívá efektivitu při řešení problému jak zkopírovat sekvenci barev kostek postavených v jednom ze 3. sloupců do dalšího sloupce. Přičemž lze manipulovat pouze s kostkami navrchu sloupců. Také velmi podrobné líčení různých technologických aspektů mě nepřišlo šťastné. Pouze podle knihy bych agentový systém nebyl schopen implementovat.

Naopak co na knize oceňuji je kapitola o učení (bohužel se sem nevešli všechny učící algoritmy) a speciálně část o učení reaktivních agentů. Také je trošku možné, že jsem příliš přísný neboť jsem již četl pojednání o agentech o Wooldridge. Rozhodně jsem rád že podobná kniha vznikla a čtenáři neobeznámenému s technologií agentů může poskytnout základní vhled.

Hodnocení 5/10

PS: Sám mám určité vnitřní pochybnosti, zda termín agent přináší něco nového (spíš se domnívám, že jde jen o podobný hype jako dřív byli expertní systémy nebo neuronové sítě). Rád se v diskuzi nechám vyvést z omylu ;)

čtvrtek 9. dubna 2009

Šotek ve 115

Skřítek z počítačové učebny 115, který má rád počítačovou techniku (proto tam také bydlí) mi už dlouhou dobu znepříjemňuje život a testuje mou pohotovost a znalosti. Pokud skřítek nic nedělá, tak alespoň upíjí líh z místních fix, takže jsou pořád prázdné. Pravděpodobně má také nějaký vztah k ubrouskům na záchodě, takže je škola už raděj ani nedoplňuje.

Nedávno přepnul vypínač na učitelském počítači vzadu na zdroji. Než jsem na to v časovém presu přišel, tak už jsem si nachystal jeden počítač zezadu jako náhradní. Šotek se nevzdal a vyhodil obraz na projektor, malá masáž VGA konektoru ho pro daný den už ukolébala.

Jiný den se šotek připravil lépe. Pokazil konfigurák Xek pod linuxem, překousal zelený kanál ve VGA kabelu a pokazil ovladač projektoru. Jako zapřísáhlý linuxák jsem se pak musel trápit s Visual Studiem pod Windows (aaa kde tam jsou mé oblíbené VIMovské zkratky). VGA prodlužovák mi administrátor vyměnil a ovladač jsem si zpravil sám. Šotek stihnul jen přehodit baterku a vložit ji s opačnou polaritou.

Docela se začínám děsit co si vymyslí přístě.

středa 25. března 2009

Doktorské studium

Prvním rokem studuji v doktorském studiu, systém tohoto studijního programu mě značně překvapil. Do tohoto studia jsem se pustil kvůli tomu, že mě studium informatiky baví a chci se dostat alespoň v úzkém výseku vědění na hranu poznání a popř. i něčím zajímavým přispět. Částečně jde i o to, že bych si chtěl zajistit dobrou pozici pro získání zajímavé tvůrčí práce v oboru nejlépe v nějaké větší firmě, která si může dovolit investovat do vývoje.

Student v doktorském studiu má 3 základní zaměstnavatele školu, školitele a komerční sektor. Díky této svaté trojici má na studium daleko méně času než v programu magisterském. A tak tedy není výjimkou, že studenti v doktorském studiu nesetrvávají jmenovité 3 roky, ale i roků 7 a více. Ostatně i jeden profesor se k délce studia vyjádřil, že za 3 roky, disertační práce není ono a že je potřeba aby uzrála a tedy počítat spíše s délkou studia 4-5 let.

Škola se v podstatě o studenta stará jen přerozdělením doktorandského stipendia vypláceného státem. Mimo to škola pořádá výuku jazyků a popř. dalších předmětů a stará se o organizaci studia. Student škole tuto činnost splácí výukou a publikační činností (která bývá podmínkou realizace studijních programů na škole). Většina škol ukládá doktorandům povinnost učit. Lze to sice zdůvodňovat snahou naučit se studenty veřejně vyjadřovat, formulovat myšlenky a vést ostatní v poznání. Možná by i to tak fungovalo, pokud by studenti byli v učení nějak motivování. Praxe je však taková, že kvalita výuky nemá v podstatě žádný vliv na finanční hodnocení doktoranda. Doktorand přípravou cvičení stráví daleko více času než cvičením samotným a celý systém výuky spočívá na svědomitosti doktoranda a jeho zapálení pro předmět. Zajímavé je, že doktorandi opravdu svědomití většinou jsou.

Školitel je člověk, na kterém je (samozřejmě po doktorandovi) nejvíce práce, a v podstatě úspěch doktoranda velmi závisí na výběru tohoto člověka.

Za prvé umožňuje doktorandovi uskutečnit zkoušky u svých kolegů a tím mu umožnit získat vědomosti, které mu škola není schopna poskytnout. Vzájemné zkoušení doktorandů je v akademické sféře reciproční. Protože tato výuka není nijak financovaná, tak se uskutečňuje odkazem na skripta, poskytnutím konzultace a několika hodinami věnovanými na přezkoušení.
Dále školitel vede doktoranda do světa znalostí svého oboru, pomáhá mu zaměřovat se na důležité zdroje a pomáhá mu s publikacemi.
Jedním z nejdůležitějších úkolů školitele je bohužel také zajištění financování, protože účast na konferencích něco stojí (a konference jsou místa, kde lze získat kontakty a navázat spolupráci). Zároveň se školitel stará i o zajištění práce a dodatečný příjem doktoranda, aby nemusel se svým stipendiem žebrat.

Za tuto důležitou činnost je školitel odměněn učedníkem, který je schopen vykonávat libovolné práce nebo popř. spoluautorstvím doktorandem publikovaných příspěvků a článků. Mnozí školitelé se těchto možností zhostí se značnou vervou a jsou schopni si zařídit kompletní učednickou dílnu. Pokud se školitel chová eticky a s rozumem, tak se zpravidla jedná o vzácného člověka, který vede doktorandy z vlastního zápalu (přičemž se mi čim dál víc jeví, že bez velkého zápalu se v akademické sféře nebo vědě zůstat ani nedá).
Školitel se většinou rekrutuje z vědeckého zaměstnance vysoké školy, který tuto činnost vykonává v rámci pracovního poměru, nebo ze zaměstnance instituce zaměřené na vývoj (např. akademie věd). V posledním případě se vedou spory o to, kdo je za vzdělávání doktorandů více zodpovědný zda vysoká škola nebo akademie věd. Tento spor je v podstatě sporem o státní peníze na financování vědy a výuky.

Komerční sektor přichází na řadu tehdy, pokud školitel není schopen zajistit dost financí k přežití doktoranda (tedy placené místo doktorandovi v akademické instituci). Přežít ze stipendia 5000 měsíčně za první rok, 6000 za druhý rok a 7000 za 3. rok studia opravdu bez dalšího financování nebo sponzora (např. podpory rodiny) nelze. Proto si doktorand musí zpravidla najít placené místo alespoň na částečný úvazek a skloubit povinnosti z toho vyplývající s těmi předcházejícími. Škola si kupodivu necení schopnosti doktoranda vydělat si na živobytí sám, ale částečně zabezpečeného doktoranda považuje za zbytečného příživníka na stipendiu, které na něm co nejdříve ušetří. Tím doktoranda vrhne ještě více vstříc komerčnímu sektoru. Pro nedostatek ocenění a perspektivy v tomto systému svaté trojice většinou doktorand odchází do tohoto sektoru ještě před získáním titulu.

Formát a uskutečňování doktorského studia přímo souvisí s kvalitou financování vědy a školství. Je zřejmé, že tato rozpočtová kapitola nikdy nehrála prim a pravděpodobně ani dlouho hrát nebude. Vzdělávání zůstává jen kapitolou, kde mezi sebou bojují různé ideologie, ale zásadní systémové problémy zůstávají neřešené. Což se zákonitě projeví v budoucnu.

středa 11. března 2009

Kolize a správná krajtí cesta

V rámci semináře v C++, jsem chtěl probrat algoritmus na zjišťování kolizí N stejně orientovaných kvádrů v lepším než v kvadratickém čase. Algoritmus v základu pracuje s tím, že promítne kvádry do jedné osy, zjistí jaké kvádry se promítají v jedné ose na sebe a dále řeší obdobným způsobem už jen kolizi mezi nimi. Tedy vezme ty co se promítnou na sebe a promítne je zas do jiné osy, zas rozdělí.. a ty které kolidují ve všech průmětech se protínají. Nejhorší čas O(N2), nejlepší O(N) a průměrný O(N.log(N)).

Zadání
Základem algoritmu je tedy umět vzít N intervalů a zjistit, které se překrývají. Vyzkoušel jsem různé postupy a podělím se s vámi o výsledky v pořadí od komplikovaných postupů po nejjednodušší.

Vzorky
Prvně si vygeneruji 100 náhodně rozmístěných intervalů mezi 0 a 1000, délky 10
import random

nsamples = 100
#list of (start position, length, name)
samples = [(random.randint(0,990), 10, i) for i in xrange(nsamples)]

Algoritmy založené na vkládání

Hlavní myšlenkou je rozdělit si intervaly pomocí binárního stromu a testovat kam vložit nový interval. V podstatě se jedná o 3 implementace binárního stromu. Ovšem pro usnadnění testování jsem si vytvořil pomocnou třídu interval.

class Interval:
def __init__(self, lower, upper):
self.upper = upper
self.lower = lower

def union(self, interval):
'''
self := self union interval
'''
self.lower = min(self.lower, interval.lower)
self.upper = max(self.upper, interval.upper)

def __cmp__(self, interval):
if self.upper <= interval.lower:
return -1
elif self.lower >= interval.upper:
return 1
else:
return 0

Všechny implementace binárního stromu se budou používat stejně.

tree = BTreeCluster()
for s, e, i in samples:
tree.append(s, e, i)
tree.write()

1. Implementace
První implementace je jen jednoduše napsaný binární strom, který si vytvoří pod-uzly až teprve po přidání prvního prvku. Tento přístup bude paměťově nejnáročnější. Zato implementace v C++ by byla poměrně přímočará.

class BTreeCluster1:
'''
classical Binary tree with interval and intersecting objects in each node
'''
def __init__(self):
#lazy inicialization
self.left = None
self.right = None
self.inter = 0
self.group = []

def append(self, pos, lenght, name):
if not self.group:
self.group = [name]
self.inter = Interval(pos, pos+lenght)
self.left = BTreeCluster1()
self.right = BTreeCluster1()
else:
inter = Interval(pos, pos+lenght)
if self.inter == inter:
self.group.append(name)
self.inter.union(inter)
elif self.inter > inter:
self.right.append(pos, lenght, name)
else:
self.left.append(pos, lenght, name)

def write(self):
if self.left:
self.left.write()
if len(self.group) > 2:
print 'collision', self.group
if self.right:
self.right.write()

2. Implementace
Druhá implementace se snaží více šetřit pamětí a přiřazuje uzlům indexy. Uzel s indexem n má pod-uzly 2n a 2n+1. Protože intervaly mohou do funkce přijít třeba seřazené a vzniklý strom může být značně nevyvážený používám na uložení uzlů hash tabulku (slovník) s indexy na místě klíčů. Protože ve standardní knihovně C++ není implementace hash tabulky, bylo by přepsání složitější. Stejně jako v prvním případě by bylo vhodné občas strom vyvážit, ale pro jednoduchost a lenost to vynechám.

class BTreeCluster2:
'''
Binary tree with interval and intersecting objects in each node
encoded in dictionary (hash table)
node number i has subnodes 2i, 2i+1
hash table saves memory even for unballanced tree
'''
def __init__(self):
self.groups = {} #number:interval, group

def append(self, pos, lenght, name):
inter = Interval(pos, pos+lenght)
index = 1
while True:
if index not in self.groups:
self.groups[index] = Interval(pos, pos+lenght), [name]
return
iinter, igroup = self.groups[index]
if inter == iinter:
igroup.append(name)
iinter.union(inter)
return
elif inter > iinter:
index = 2*index + 1
else:
index = 2*index

def write(self):
for i,g in self.groups.values():
if len(g) > 2:
print 'collision', g

3. Implementace
Narozdíl od prvních dvou jsem se rozhodl strom přerovnávat v průběhu přidávání (halda by byla účinnější). Uzly jsou uloženy v poli srovnaném podle pozice intervalu a pole je prohledáváno pomocí půlení intervalu.

class BTreeCluster3:
'''
Binary tree with interval and intersecting objects in each node
encoded in sorted array of disjunctive intervals
sorted is archieved by inserting new nodes to right position
'''
def __init__(self):
self.groups = [] #number:interval, group

def append(self, pos, lenght, name):
'''
finding the right position is archieved by iterative interval dividing
'''
inter = Interval(pos, pos+lenght)
if not self.groups:
self.groups = [(inter, [name])]
return
upper = len(self.groups)-1
lower = 0
while True:
##print lower, upper
index = (upper + lower) / 2
iinter, igroup = self.groups[index]
if inter == iinter:
#exteding existing one
igroup.append(name)
iinter.union(inter)
return
elif inter > iinter:
if lower == upper or index == upper:
self.groups.insert(index+1, (inter, [name]))
print 'including after'
return
lower = index + 1
else:
if lower == upper or index == lower:
self.groups.insert(index, (inter, [name]))
print 'including before'
return
upper = index - 1

def write(self):
for i,g in self.groups:
if len(g) > 2:
print 'collision', g

Všechny tyto implementace jsou poměrně rozsáhlé, ale umožňují přidání nového prvku kdykoliv v průběhu programu. Následující postup je jednodušší, ale danou věc neumožňuje. Místo prvních 3 pokusů by možná stálo za to implementovat haldu.

Postupy založené na syntaktickém analyzátoru
Pokud intervaly seřadíme podle počátku lze je sekvenčně procházet, jednoduše testovat kolize a vracet intervaly, které se protínají. Je potřeba si však poradit s tím, kdy začít novou skupinu a také s přečtením posledního prvku.

1. Implementace
Je napsána jednoduše a jistě by šla snadno převést do C++, speciálně při využití knihovny <sort>.

EOF = 'EOF'

def readgroup(token, it):
'''
c-like parsing function
returns last read token and group of intersecting intervals
'''
s, e, i = token
end = s + e
group = [i]
for token in it:
s, e, i = token
if end <= s:
return token, group
else:
group.append(i)
end = s + e
return EOF, group

samples.sort()
it = iter(samples)
token = it.next()
while token != EOF:
token, g = readgroup(token, it)
if len(g) > 1:
print 'collision', g

Implementace nepočítá s prázdným vstupním seznamem. Po načtení posledního prvku signalizuje konec speciálním tokenem EOF. Protože se v průběhu funkce readgroup vrací vygenerované skupiny je potřeba vracet i naposledy přečtený token a navázat ve zpracování funkce ve stejném místě. Pokud by funkce vracela seznam seznamů, tak by její implementace byla jednodušší ale paměťově náročnější. Realizace výpisu přímo při nalezení kolize by funkci zjednodušila. Cílem však není výpis ale umožnit s nalezenými skupinami dále pracovat.

2. Implementace
Je první algoritmus přepsaný do Pythonu a využívající techniky generátorů.

def readgroup(samples):
group = []
for s, e, i in samples:
if group and end <= s:
yield group
group = []
group.append(i)
end = s + e
yield group

samples.sort()
for g in readgroup(samples):
if len(g) > 1:
print 'collision', g

Závěr
Možná se zdá, že jsem mohl napsat jen poslední příspěvek. Chtěl jsem však ukázat, jak v závislosti na požadavcích, použitých konstruktech jazyka a přijaté abstrakci lze vytvořit různé implementace, které se liší v rychlosti, použité paměti a délce zdrojového kódu. Předpokládám, že nejsnadněji by v C++ šla vytvořit předposlední implementace. A jaký je Váš názor?

středa 4. března 2009

Helmut Herold: Awk&Sed

Podtitul: Příručka pro dávkové zpracování textu

Tato kniha z nakladatelství Addison-Wesley (překlad Computer Press) popisuje dva úlohově orientované jazyky z prostředí UNIX. Na cca 170 stranách je rozepsán programovací jazyk awk a na 64 stranách proudový editor sed. Kniha je brožovaná a obsahuje tak na půl vysvětlující text a na půl příklady. Po učebnicovém vysvětlení základní syntaxe se autor dostává i ke komplikovanějším příkladům. Např. realizaci relačního operátoru JOIN, řešení problému umístění 8mi dam na šachovnici nebo výpisu síťových plánů. V některých příkladech se pak začínají projevovat omezení programovacího jazyka. V knize jsem nenašel využití na zpracování češtiny a jak se sed a awk vyrovná s českým textem. (dle mých pokusů ne moc dobře)

Kniha je přeložena z německé verze, neboť na pár místech překladatel zapomněl názvy přeložit (ausdruck, freiplat). Co je více zarážející je množství překlepů, možná by se měl někdo v nakladatelství naučit používat kontrolu pravopisu (přeci jen to není až tak moderní funkce). V knize jsem nenarazil na logické nesmysly a text knihy je dobře čitelný. Překládat zdrojový kód do češtiny mě zavání nevkusem (v němčině by to však nebylo lepší - řídící konstrukce jsou v angličtině, klíčová slova v angličtině, proč by tedy funkce, komentáře a názvy proměnných měli být v češtině?). V některých příkladech je rozhozené odsazení a zvýraznění klíčových slov ve zdrojovém kódu bych už dnes považoval za standard (avšak tady chybí).

Přesto knihu mohu doporučit, protože poskytuje zajímavý náhled do dvou základních UNIXových nástrojů. A pro ty co nepracují s UNIXem poskytuje ukázku dvou řešení specifických problémů práce s textem. Hlavně bych chtěl vyzdvihnout pěkně zvolené příklady, které jsou občas propojeny zdrojovým kódem BASHe. Domnívám se, že právě pěkně zvolené příklady z praxe jsou na této knize nejpěknější.

Hodnocení 7/10

Umění programování v Unixu - Kapitola 1

Technická polemika - Po zhodnocení formální stránky knihy, bych se rád dostal k zajímavým myšlenkám v knize obsaženým.

Úvodní kapitola se zabývá historií UNIXu jeho postavením mezi ostatními operačními systémy. Snaží se ukázat, že UNIX jako technologie i filozofie musela přijmout spoustu změn a překonat změny trendů. Přechod z prostředí mainframe na osobní počítače, dále do distribuovaného prostředí internetu a nakonec i překonat změnu související se zavedením GUI. Kniha se snaží popsat základní trendy, které si UNIX zachovává a v podstatě dochází k tomu, že je to svoboda práce se zdrojovým kódem systému i programů a dobrý inženýrský návrh, postavený na spoustě malých spolupracujících programů. IMHO: Pravidla uvedená v této kapitole se hodí k návrhu libovolného software a lze je označit za pravidla dobrého návrhu aplikace. Pravidla jsem trošku přeformuloval a mnohdy doplnil svým pohledem, takže se nejedná o překlad knihy, jde spíš rozvití myšlenek v knize obsažených.

Ke konci kapitoly je je uveden krátký popis jiných systémů a v čem se liší. Přijde mi, že tento popis je trošku zaujatý a nejde moc do hloubky, ale nejsem odborníkem na operační systémy.

Pravidla psaní software

Držte se jednoduchých, propojitelných rozhraní – Zde jsou myšlena hlavně rozhraní textová, popř. založená na XML. Rozhraní je to co určuje zda program bude použitelný ve větším kontextu nebo zůstane zastrčený v šuplíku. Složité rozhraní znesnadňuje použití programu v kontextu ostatních programů.

Srozumitelnost je důležitější než efektivita – Prostě jen přeformulované tvrzení D.Knutha: “Předčasná optimalizace je kořenem všeho zla.”. Složitý algoritmus obsahuje více místa pro chyby a hůře se opravuje i rozšiřuje. Zdrojový kód by měl být opatřen komentáři. V knize lze dokonce potkat i myšlenku literárního programování a to v té podobě, že každý algoritmus by měl být snadno vysvětlitelný pomocí přirozeného jazyka a podobným způsobem i zapsán ve zdrojovém kódu.

Navrhuje programy propojitelné s jinými programy – V duchu zásady program má dělat jednu věc dobře a nesnažit se řešit vše. Dokládané je to na možnosti zvolit si editor, který jiné programy budou používat pro vstup a editaci textu. Jiným příkladem je realizace stránkování výpisu na obrazovku, přes příkazy more, less.

Navrhujte jednoduché programy, složité piště jen v případě nutnosti – Zde se lze odkázat na knihu Steve McConell: Odhadování softwarových projektů, kde se dozvíte, že s velikostí programu roste pravděpodobnost překročení rozpočtu i toho, že se program nepodaří dokončit. Přičemž náročnost vývoje s velikostí programu roste kvadraticky! (protože tímto způsobem roste počet možných vazeb v programu)

Navrhujte transparentní programy – Tedy programy, ze kterých lze na základě vstupu snadno zkontrolovat výstup a ověřit, že program plní to co má.

Pravidlo robustnosti – Program se musí vypořádat i s krajními případy a vyprodukovat smysluplný výstup. Při propojení s jinými programy se na vstupu může objevit skoro cokoliv. V podstatě se jedná o defenzivní programování.

Volte deklarativní zápisy ne procedurální – Zápis gramatiky v BNF je daleko snazší než její zápis v syntaktickém analyzátoru. Stejně tak je tabulka jednodušší reprezentací, než složitý příkaz switch nebo mnoho konstrukcí if, else.

Pravidlo nejmenšího překvapení – Rozhraní by uživatele nemělo překvapovat. Snaha dodržovat běžnou kulturu zápisů – způsob značení komentářů, zápisu programu, … Rozhodně se však vyvarujte označování rozdílných věcí stejným způsobem. Příkaz return, který by místo ukončení funkce ukončil program, je takovým příkladem.

Mluvte jen když je třeba – Program má mluvit, jen když je potřeba sdělit něco důležitého. Ukecané programy nikdo neposlouchá. Pokud je však třeba upozornit na chybu, tak nejlépe hlasitě a co nejdříve! Informace o chybě by měla být dostatečně konkrétní. Je velký rozdíl mezi hláškou “Hups chyba!” a “Chyba soubor config.ini: Na řádku 35, je uveden neexistující uživatel pepa3”.

Programátorův čas je dražší než čas CPU – Za 2 roky poběží vaše programy 2x rychleji. A to bez námahy. V podstatě zas odkaz na předčasnou optimalizaci. Optimalizace se totiž řeší až naposled, kdy je jasné jaké části (cca 20% programu) zpomalení způsobují. 80% programu nemá smysl optimalizovat, dokonce to škodí přehlednosti, rozšiřitelnosti a poštu chyb v programu. Pokud program běží dost rychle i tak, lze si ušetřit i optimalizaci těch 20% ;).

Pravidlo generování – Počet chyb na řádku je v podstatě nezávislý na jazyce, snažte se tedy psát úsporně a manuální úkony (jako generování kódu) nechat na počítači. Věřte, že je spolehlivější. Pozn. Výstup generátorů pokud možno neupravujeme! (to bychom se o výhodu malého počtu řádek připravili)

Optimalizace až na konec – už bylo řečeno, ale je potřeba opakovat do zblbnutí ;)

Není jen jeden správný způsob – Snažte se vymyslet různá řešení a vyberte nejlepší ne to první. Nespadněte do pasti prvního návrhu. Nebojte se vymyslet spoustu návrhů a ty ohodnotit.

Navrhujte pro budoucnost – Nechte si otevřená vrátka pro budoucí rozšíření (datových formátů a struktur, protokolů i funkcí). Zde se třeba poznamenat, že váš program se může hodně rozšířit a pak už se zpětně nekompatibilní změny neprovádí bezbolestně.

pátek 13. února 2009

Eric S. Raymond: Umění programování v Unixu

Tak jsem se zas dostal k nějakému čtení a přečetl si knížku Umění programování v Unixu od Eric S. Raymond(a). V originále se kniha jmenuje The art of UNIX Programming a lze si ji stáhnout z internetu. Knížku u nás vydalo nakladatelství Computer press. Kniha je brožovaná a má cca 480 dobře vysázených stránek.
Obsah
V knize se pojednává o filozofii operačního sytému UNIX, kterou zdědily i operační systémy Linux, FreeBSD a další. Přístup k tvorbě a implementaci programů pod linuxem je podrobně vysvětlen. Kniha určitě stojí za přečtení, protože obsahuje spoustu myšlenek, se kterými můžete nebo nemusíte souhlasit, ale určitě Vás přimějí uvažovat o tom jak navrhovat software a jaké mají jednotlivé návrhy výhody a nevýhody. Nečekávejte, že v knize najdete sebereflexi UNIXové filozofie, kniha se spíše snaží být obhajobou. Za nejcennější části knihy pokládám rozbor jednotlivých unixových programů a ilustrování myšlenek z knihy na existujících implementacích. Knihu z tohoto důvodu doporučuji přečíst, nejlépe v originále.
Překlad
Bohužel co mě na knize zarazilo je kvalita překladu. Kniha je psána dost náročně od programátora pro programátory a člověk, který knihu překládal, rozhodně UNIXový programátor nebyl a korektura zaspala a nestihla si to před puštěním knihy do oběhu uvědomit. Překladatel se jal knihu překládat doslova, takže některé věty v češtině znějí zvláštně a marně přemýšlíte, jak technický termín zní v originále. Uvádět u prvního výskytu překladu originální termín nebo na konec zařadit tabulku překladu termínů nikoho nenapadlo. *Českému překladu této knihy se proto vyhněte!*.
Příklady překladu
Pro ilustraci překladu dodávám mnohdy humorné příklady. Příklady řadím od největších absurdit po menší. První je vždy uvedeno znění v originále, následuje originální překlad.


Perl is shell on steroids.
Jazyk Perl je příkazovým prostředím steroidů.

notably first-person shooters
především první střelci

Perhaps root is too powerful
Kořen systému je možná příliš vlivný

It economizes the far more valuable resource that is human time, by making it…
Tento formát totiž zachází šetrně s mnohem hodnotnějšími prostředky, než je lidský čas.

so sporadic dropouts are tolerable, but lag is fatal.
když se jeden z příkazů ztratí velká potíž nevznikne. Kdyby však hra běžela pomalu, byl by to velký problém.

Its devotees speak an argot that is dense and forbidding even by computer-science standards,...
Nadšenci hovoří v hantýrce, která je poměrně neproniknutelná a odpuzuje dokonce i standardy počítačových věd.

Emacs Lisp is a Lisp. It follows as the night the day that it manages memory automatically and…
Jazyk Emacs Lisp je jazykem Lisp. Stejně jako po dni následuje noc, zajišťuje jazyk Lisp automatickou správu paměti.

Though small programs in Perl can be extremely powerful, careful discipline is required to maintain modularity and keep a design under control as program size increases.
Přestože mohou být malé programy v jazyce Perl velmi výkonné, je třída pro zachování modularity a udržení návrhu pod kontrolou dodržovat velmi důsledně disciplínu.

and, in fact, be separated by an Internet connection spanning half the globe
mohou být ve skutečnosti spuštěny na různých polokoulích naši Země

This is called ‘System V IPC’—or, among old timers, ‘Indian Hill’ IPC after the AT&T facility where it was first written.
Tomuto modelu se se říká meziprocesorová komunikace Systému V (System V IPC) nebo “indiánský kopec” (“Indian Hill” IPC) – podle první funkce tohoto typu firmy AT&T.
Gabriel porovnává filozofii Massachusettského technického institutu, která nejvíce cení jednoduchostí v rozhraní, s filozofií institutu v New Jersey, která nejvíce oceňuje jednoduchost v rozhraní. (správně v implementaci)

By contrast, vi looks rather bloated and flabby.
Naproti tomu vypadá návrh editoru spíše přebuleje a fádně. (jakého editoru?)

even moderate size (more than a few hundred lines)
i středně velkých programů obsahujících několik řádků kódu.

which is what makes projects like Expect reasonable
právě proto jsou projekty, jako je Expect, potřebné

thread
podproces

signals, poll, and select
signály, žádosti a výběry

GTK and Qt use a slot-and-signal apparatus for event-handling…
Knihovny GTK a Qt používají pro ošetření událostí mechanismy drážek a signálů,...
Poznamenávám, že pravopisné chyby se v textu nevyskytují, takže pokud je najdete v ukázkách jedná se o můj překlep. Abych však jen nehanil jeden překlad se mi velmi líbil frontend – průčelí. Předpokládám, že o knize napíšu ještě jeden příspěvek o jejím obsahu.

pátek 9. ledna 2009

Využití blogu k výuce.

Vyučování nějaké látky může být obohaceno o komunikací se studenty pomocí webu. V tomto článku bych se rád podíval na to, jaké informace se objevují na školních stránkách a zda by se k tomuto účelu nedal využít blog.

Informace publikované na stránkách k předmětu

Nejzákladnější informací k předmětu je osoba, která předmět vyučuje název předmětu a čas výuky. Dále kontakt na vyučujícího a informace o požadavcích nutných k absolvování předmětu.

Mimo to se na školních stránkách objevují informace o probrané látce v jednotlivých lekcích. Úkoly k vypracování, materiály a odkazy vztahující se k dané lekci. Průběžně se na stránkách může objevovat i informace o docházce.

Na konci roku se na stránkách mohou objevit vypracované úkoly studentů, informace o tom kdo předmět absolvoval, informace k formálnímu uzavření předmětu, zapsání známek a popř. i anketa s názory studentů a reflexí učitele na ně.

Struktura informací

Snad jsem na nic nezapomněl. Z popisu se jeví, že pouze určitou část informací lze přenášet formou příspěvků a jeví se nezbytné zřídit si webový prostor, kde budou uloženy další soubory a obrázky vztahující se k předmětu.

Kolaborativní editace

Blogovací systémy (např. tento na seznamu) umožňují spravovat blog pouze jednomu člověku a nerozlišují práva k jednotlivým částem stránek. Proto předmět s několika vyučujícími nebo cvíčícími spíše využije propracovanější řešení výukového systému jako Moodle.

Učebnice

Blog není vhodný k podrobnému popisu látky, protože k tomuto účelu se hodí spíše publikační systém podobný wikipedii (možná knoll, nebo soukromá wiki). U příspěvků v učebnici prostě čas editace nehraje už takovou roli.

Výhody blogu

Stejně jako webové stránky předmětu umožňuje blog oslovit všechny studenty (i ty co zapomněli přijít na hodinu) a to i v čase dlouho po konání vyučování. Jaké však má blog oproti nim výhody?

Hlavní výhodou blogu je, že nové příspěvky jsou hned viditelné to znamená, že změny ve stránce student nepřehlédne.

RSS kanál

Ostatně stejnou výhodou je RSS kanál, který umožňuje studentům reagovat na uveřejněné informace častěji. Přeci jen obecně student příliš často stránky svých učitelů nenavštěvuje, speciálně ne tehdy, když se tam nic nemění.

Komentáře

Studenti mohou přímo pod příspěvkem upozornit na chybu nebo reagovat upřesňujícími dotazy, které jsou pak spolu s reakcí dostupné i ostatním studentům. Kvůli bázlivosti studentů jsem však na vážkách, zda této možnosti využijí i anonymně.

Nevýhody blogu

Hlavní nevýhodou blogu pro učitele je stejně jako u osobních stránek pracnost s aktualizací a tvorbou obsahu mimo běžnou přípravu a prezentace kvalitou tohoto obsahu (a tedy možná i větší náročnost tvorby, než u běžného blogu). Ale tím se od webových stránek neliší.

Trošku nevýhodou je neměnitelné řazení příspěvků podle času editace/vložení. Což značí že příspěvek by měl být svébytnou entitou nezávislou na pořadí jiných příspěvků. Příspěvky proto mohou postrádat logické řazení a nalezení příspěvku může být složitější. Je tedy nejspíše nutné některé příspěvky zahrnout do speciální kategorie nebo pro lepší přehlednost odkazovat ze shrnujícího příspěvku. A také je možné že starčí příspěvky zapadnou, což je zas možno řešit dobrým členěním do kategorií.

Závěr

Dle mého názoru může být blog využit ke komunikaci se studenty lépe než obecné webové stránky. Proto pokud budu přístí rok vyučovat zkusím si pro tento účel založit blog a s výsledky vás seznámím.

Nabídka vyřazených knih

Jistě se vám stalo, že máte v knihovničce knihy o kterých víte, že na ně nesáhnete, ale třeba by se mohli někomu hodit...

Prohlédněte si tyto knížky, které ač naskladněny v mé posteli mohou mít pro někoho ještě hodnotu. Pokud o knihu máte zájem a jste si ochotni pro ni dojet od Prahy nebo mě znáte, tak může být vaše. Samozřejmě ne zadarmo (kam bych taky tímto způsobem přišel, že…), ale za dobrou cenu, daleko nižší než pořizovací (a to se vyplatí).

Za knihu beru balíčky modrých žvýkaček orbit 50 kusů. Alkoholické nápoje, dobré kafe nebo pohlednici odeslanou ze vzdálené ciziny. Pokud o knihu toužíte a chcete ji přivést po Praze, tak se spokojím s 10ti letou whiskou :).

A teď už bez nadsázky, kamarádi co znám mohou mít knihu zadarmo ostatní za symbolický dar :)

úterý 6. ledna 2009

Efektivní převední textu do HTML

Mnohdy je potřeba převést existující text z Microsoft Wordu, OpenOffice nebo jen neformátovaný text do HTML (např. i pro tento blog). K tomu nám může pomoci wiki.

Syntaxe HTML je jednoduchá obsahuje hodně sémantických značek a však na přímé psaní textu je trošku rozvleklá. Přenechme ji proto strojům a pišme pomocí přehlednějších značek.

Stejně tak pokud převádíte bohatě formátovaný text třeba z Microsoft Wordu nebo OpenOffice do HTML, tak narazíte na to, že tyto programy vytváří HTML zanesené co nejvíce tagy tak, aby byla zachováno stylování textu. Takto vytvořený HTML soubor je nepřehledný k editaci i stylování pomocí CSS a také několikrát větší než je nutné.

I pokud píšete příspěvek do blogu, může být výhodnější použít váš oblíbený editor textu a vytvořit prostý text, který teprve později převést do HTML.

Problém jak stylovat text, jiným způsobem než HTML již je několikrát řešen. Příkladem mohou být značky použitelné ve fóru phpBB . Jiným řešením jsou značkovací jazyky wiki. Pomocí jednoho z nich lze například editovat příspěvky na wikipedii . Jedním z takových to jazyků je i Textile, pomocí kterého vytvářím tento příspěvek.

Pomocí tohoto jazyka snadno zformátujete stránku a vytvoříte validní HTML, které vloíte do svého blogu nebo do stránky kterou vytváříte. Vytvořené HTML není problém ostylovat pomocí kaskádových stylů.

Pozn: Pokud chcete umožnit vkládání podobně formátovaných příspěvků uživatelům na svém webu, existují knihovny, které vám to umožní např. RedCloth.

neděle 4. ledna 2009

Steve McConell: Odhadování softwarových projektů

Podtitul: Jak správně určit rozpočet, termíny, zdroje

Tato kniha je brožovaná obsahuje cca 300 stránek za doporučenou cenu 500 Kč. Knihu jsem četl v českém překladu od Jiřího Fadrného, kterému nic nevytýkám.

Kniha se zabývá jednoduchým odhadováním softwarových projektů od shora i od spoda, snaží se vysvětlit základní matematické principy, rozdíl mezi odhadem a intuitivním hádáním co odhad je, jak zlepšit odhad v rámci skupiny a jak se vyvarovat systematických chyb.

Všechny použité principy postupy vysvětluje a ilustruje. Nejlepší na knize je, že není třeba hlubších znalostí matematiky, než procenta, odmocnina, násobení, mocnění, trojčlenka a nepřímá úměra.
Sice bych ocenil i pokročilejší metody (už jen pro krásu matematiky), ale kniha přesvědčivě argumentuje, proč to stačí. (kvůli počtu proměnných, které je třeba stanovit a chyby při jejich stanovení, stejně tak i vzhledem k neurčitostí v podkladech pro odhadování a změn ve vývoji projektu oproti předchozím projektům.

Při předpokladech znalosti základů statistiky, by se některé kapitoly knihy dali podstatněji redukovat a věřím, že by se kniha i o třetinu zmenšila. Přesto jsem rád, že se autor zaměřil i na nováčky.

Na knize se mi líbí, že použité metody vztahuje vzhledem k jejich použitelnosti ve vývojovém cyklu projektu.

V předmluvě knihy stojí, že pomocí metod v ní obsažených, lze získat jistotu odhahu na přibližně 25% a to už stojí si za to přečíst.

Známka 9/10

Bohužel jak se v knize dozvíte, tak věrohodný odhad nelze udělat bez vstupních dat z předchozích projektů nebo minimálně z části projektu, počet mých softwarových pokusů není největší a stejně tak i potřeba stanovování přesných termínů. Proto jsem se zatím neodhodlal přesně měřit čas strávený na jednotlivých částech, počty částí a projekty poctivě dokumentovat. Věřím však, že při větší motivaci se knuhu rozhodně vyplatí přečíst. A znalosti z knihy by měli patřit mezi nástroje pokročilého vývojáře. Skoro bych knihu zařadil do povinné četby.

sobota 3. ledna 2009

Jack Goldsmith, Tim Wu: Kdo řídí Internet

Kniha vyšla v roce 2008 a po jejím neúspěšném shánění po knihovnách jsem se odhodlal si ji koupit, jako dárek pod stromeček.

Cena 300 Kč za cca 220 stránek mi přijde trochu nadsazená, ale kniha má tvrdé desky a je pěkně zpracovaná s pěknou sazbou, která se dobře čte. Knihu zdařile přeložil Jiří T. Pelech. (i když anglický originál jsem v ruce neměl, soudím tak tedy proto, že se v knize nevyskytují zřejmé technické nesmysly a neobvyklá spojení)

Kniha se zaměřuje na zmapování původní vize o svobodné společnosti na internetu a důvodů konce této vize. Probírá spoustu historických konfliktů a precedentů v přístupu k Internetu. V části, kde Jon Postel převezme DNS, nechybí vůbec vylíčení dramatičnosti tohoto okamžiku.

Dále kniha na jednotlivých příkladech ukazuje, jak státy regulují společnosti a jednotlivce za svými hranicemi. Že moc státu Internetem nebyla omezena, ale že stát se vzdal určitého prosazování moci na Internetu za účelem podpory ekonomiky a jeho prosazení. Kontrola internetu probíhá, ale není líčena jako zlý úmysl velkého bratra, ale jako předpoklad rozumného fungování výměny zboží a služeb.

Mimo konkrétních případů jak státní moc reguluje internet se kniha zabývá i regulací internetu ve státech, kde svoboda projevu má menší prioritu. Také rozebírá reakci západních firem na požadavky Čínských úřadů.

Autoři knihy se snaží poskytnout čistý pohled na vše toto hemžení kolem Internetu a knihu ukončují optimisticky.

Knihu můžu vřele doporučit k přečtení. Není v ní mnoho technických informací a v podstatě jde o humanitní četbu pro zimní večery.

Známka 9/10

pátek 2. ledna 2009

Jan Polzer: GNU Emacs a Vim: Kapesní přehled

Tuto knihu jsem si koupil kvůli prohloubení znalostí editoru VIM, přeci jen spousta užitečných příkazů tohoto editoru mi zůstala skryta. Kniha mě stála 100 Kč, tedy celkem malý peníz. Její zpracování je dáno nižší cenou a knížka připomíná svou kroužkovou vazbou sešítek o 139 stránkách. Z toho se cca 80 stránek věnuje editoru VIM.

Protože VIM obsahuje poměrně zdařilí tutoriál vimtutor kniha rezignuje na to působit jako učebnice a spíše se snaží probrat jednotlivé oblasti voleb editoru VIM. Přijde mi tedy líto, že některé oblasti kniha popisuje přespříliš podrobně (8 stránek tabulky různých speciálních znaků a jejich kódů) a o jiné ani nezavadí vůbec (buffery, vývoj v jiných jazycích než C).
Kniha neuvádí všechny použitelné aliasy příkazů a ani všechny příkazy, proto nemůže být pokládána ani za manuál. Přijde mi, že autor spíše straní editoru EMACS /čert jeden (o:/ a proto uvádí aliasy, které se podobají příkazům z EMACSu.
Vysloveně škoda mi přijde, že autor nevložil do sešitu volné stránky pro poznamenání vlastních příkazů. V knize jsem objevil i několik chyb a to typografických i faktických.

Z části o VIMu jsem proto zklamán, neboť pročtením dokumentace bych se dozvěděl informací více a podrobněji. Přesto mě však přečtení knihy upozornilo na některé mechanismy VIMu, o kterých jsem netušil a chtěl bych autora pochválit za to, že správně vylíčil editor VIM jako prostředí, které si efektivně přizpůsobíte pro vaše editování.

Část o editoru EMACS jsem pouze zběžně prohlédl a nedovolím si ji tedy soudit. Nechápu však proč obsahuje: popis editace emailů a výčet her dostupných v EMACSu.

Známka 4/10.

čtvrtek 1. ledna 2009

Vše nejlepší v roce 2009

V jakých číselných soustavách s celým základem se čte nový rok od začátku do konce stejně?

Asi znáte číselnou soustavu se základem 10. Lidé odkojeni počítači znají i soustavy se základem 2, 8, 16. V podstatě jde o poziční zápis čísla s bázi b, kde na pozici ije číslo n (0 <= n < b), které vyjadřuje hodnotu n*bi. Celkovou hodnotu čísla lze získat sečtením hodnot pro všechny pozice

Záznam čísla v poziční soustavě je jednoznačný. Přičemž všechny čísla na pozicích s indexem od -nekonečna do -1 pozice a od nejvyšší nenulové pozice do +nekonečna, lze považovat za nulová.

Palyndromem chápeme slovo, které se čte zezadu i zepředu stejně. Tedy pokud ho zrcadlově obrátíme získáme to samé slovo. Např. abba, oko, a, nebereben. V případě čísel v pozičním zápisu chápu slovo jako sekvenci čísel bez okrajových nul.

A teď výsledek. Číslo 2009 je palyndromem v soustavě se základem.

  • 48: [41,41] 41*48+41=2009
  • 49: [0,41,0] 41*49=2009
  • 286: [7,7] 7*286+7=2009
  • 287: [0,7,0] 7*287=2009
  • a samozřejmě v jakékoliv soustavě se základem větším a rovnym 2009.

oprava-Trueman

Vítejte na mém novém blogu.

Uvědomuji si, že tento příspěvek je zatím spíš takový testovací. V budoucnu by se na tomto blogu měli objevovat recenze knih co přečtu a zajímavosti co mě chytnou. Rozhodl jsem se, že zúžím témata pro tento blog, aby byl oborově uzavřen. Nechci psát o tématech jemž tolik nerozumím a také dopustit, aby se blog stal smetištěm nesouvislých příspěvků.Protože jsem líný, tak nebudu přispívat tak často a budu se snažit psát jen tehdy, když budu mít co říct.

Na konec bych neměl opomenout co zde budete snad moci nalézt. Hlavním tématem by měli být recenze knih o počítačích, které jsem přečetl (a které jistě nebudou nezaujaté). Dále se zde mohou objevit typy na programování v Pythonu, PHP nebo pro vývoj her.

Pokud mě budete chtít motivovat přispívat, tak se ozvěte v komentářích za podporu nebo jiný názor budu vděčen.