abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 14:15 | Komunita

Daniel Stenberg, autor nástroje curl, na svém blogu oznámil, že obdržel letošní Polhemovu cenu, kterou uděluje Švédská inženýrská asociace za „technologickou inovaci nebo důvtipné řešení technického problému“.

marbu | Komentářů: 3
dnes 13:40 | Pozvánky

Cílem Social Good Hackathonu, který se uskuteční 21. a 22. října v Brně, je vymyslet a zrealizovat projekty, které pomůžou zlepšit svět kolem nás. Je to unikátní příležitost, jak představit nejrůznější sociální projekty a zrealizovat je, propojit aktivní lidi, zástupce a zástupkyně nevládních organizací a lidi z prostředí IT a designu. Hackathon pořádá brněnská neziskovka Nesehnutí.

… více »
Barbora | Komentářů: 1
dnes 00:44 | Pozvánky

V sobotu 21. října 2017 se na půdě Elektrotechnické fakulty ČVUT v Praze uskuteční RT-Summit – setkání vývojářů linuxového jádra a uživatelů jeho real-time verze označované jako preempt-rt.

… více »
Pavel Píša | Komentářů: 6
včera 23:44 | Bezpečnostní upozornění

V Linuxu byla nalezena bezpečnostní chyba CVE-2017-15265 zneužitelná k lokální eskalaci práv. Jedná se o chybu v části ALSA (Advanced Linux Sound Architecture).

Ladislav Hagara | Komentářů: 1
včera 22:44 | Komunita

Greg Kroah-Hartman informuje na svém blogu, že do zdrojových kódu linuxového jádra bylo přidáno (commit) prohlášení Linux Kernel Enforcement Statement. Zdrojové kódy Linuxu jsou k dispozici pod licencí GPL-2.0. Prohlášení přidává ustanovení z GPL-3.0. Cílem je chránit Linux před patentovými trolly, viz například problém s bývalým vedoucím týmu Netfilter Patrickem McHardym. Více v často kladených otázkách (FAQ).

Ladislav Hagara | Komentářů: 4
včera 22:04 | Pozvánky

Rádi bychom vás pozvali na přednášku o frameworku Avocado. Jedná se o testovací framework další generace, inspirovaný Autotestem a moderními vývojovými nástroji, jako je třeba git. Přednáška se bude konat 23. října od 17 hodin na FEL ČVUT (Karlovo náměstí, budova E, auditorium K9 – KN:E 301). Více informací na Facebooku.

… více »
mjedlick | Komentářů: 0
včera 21:44 | Bezpečnostní upozornění

Nový útok na WPA2 se nazývá KRACK a postihuje prakticky všechna Wi-Fi zařízení / operační systémy. Využívá manipulace s úvodním handshake. Chyba by měla být softwarově opravitelná, je nutné nainstalovat záplaty operačních systémů a aktualizovat firmware zařízení (až budou). Mezitím je doporučeno používat HTTPS a VPN jako další stupeň ochrany.

Václav HFechs Švirga | Komentářů: 3
15.10. 00:11 | Zajímavý projekt

Server Hackaday představuje projekt RainMan 2.0, aneb jak naučit Raspberry Pi 3 s kamerovým modulem pomocí Pythonu a knihovny pro rozpoznávání obrazu OpenCV hrát karetní hru Blackjack. Ukázka rozpoznávání karet na YouTube. Zdrojové kódy jsou k dispozici na GitHubu.

Ladislav Hagara | Komentářů: 0
14.10. 15:11 | IT novinky

Online obchod s počítačovými hrami a elektronickými knihami Humble Bundle byl koupen společností IGN. Dle oficiálních prohlášení by měl Humble Bundle dále fungovat stejně jako dosud.

Ladislav Hagara | Komentářů: 8
14.10. 06:00 | Zajímavý článek

Brendan Gregg již v roce 2008 upozornil (YouTube), že na pevné disky se nemá křičet, že jim to nedělá dobře. Plotny disku se mohou rozkmitat a tím se mohou prodloužit časy odezvy pevného disku. V září letošního roku proběhla v Buenos Aires konference věnovaná počítačové bezpečnosti ekoparty. Alfredo Ortega zde demonstroval (YouTube, pdf), že díky tomu lze pevný disk použít také jako nekvalitní mikrofon. Stačí přesně měřit časy odezvy

… více »
Ladislav Hagara | Komentářů: 9
Těžíte nějakou kryptoměnu?
 (6%)
 (2%)
 (15%)
 (76%)
Celkem 720 hlasů
 Komentářů: 24, poslední 27.9. 08:30
    Rozcestník

    Python pro nezelenáče

    22.9.2011 15:53 | Přečteno: 2682× | Linux | Výběrový blog | poslední úprava: 22.9.2011 15:52

    Aneb o tom, jak se vlastně obfuskuje v Pythonu.

    Mýty a pověry

    O Pythonu se traduje spousta pověr a mýtů. Jedna z nich je, že v jazyce, v němž je odsazování součástí syntaxe, se nedá psát pořádný obfuskovaný kód. Jako třeba v Perlu. Nebudu se snažit tvrdit, že Perl nemá značný náskok. Protože v podpoře různých nečitelných konstrukcí a znaků v základu jazyka ($_, @X, regulární výrazy) jej předčí pouze Perl6. A to z něj spolu s spolu s konstrukcí eval, oddělovačem příkazů a nepovinným odsazováním dělá ideální jazyk pro psaní podobných věcí.

    V případě pythonu jsme ochuzeni o zvýšený výskyt podivných znaků, snad s výjimkou podtržítka. A rovněž je velká část užitečného kódu v nejrůznějších modulech, které se musí importovat, takže jsou pythonisté postaveni před složitější problém.

    Funkcionální obfuskování

    Takže prakticky jediný přístup, kterak psát obfuskovaný kód v Python je podmnožina funkcionálního programování - funkcionální obfuskování. V tomto případě je oneliner nejenom na jednom řádku, ale dokonce celou funkční část tvoří jediný výraz, takže s vyjímkou nezbytných importů není potřeba psát žádné otravné středníky. O tom, co je vlastně funkcionální programování se vedou spory přinejmenším stejně zarputilé, jako mezi mezi perlisty a pythonisty, takže se omezíme na zcela primitivní definici.
    Funkcionální programování je deklarativní předpis, kterak transformovat vstup na výstup.
    Slovo deklarativní pro běžné programátory znamená - žádné pomocné proměnné.
    max = 0
    for x in (1, 2, 3, 4, 5):
        if x > max:
            max = x
    print max
    
    Takže tento příklad funkcionální rozhodně není, protože v pomocné proměnné max ukládáme stav programu. Toto je imperativní programování, kdy popisujeme jednotlivé stavy programu.
    print sorted((1, 2, 3, 4, 5), reverse=True)[0]
    
    Toto naopak je funkcionální implementace (a navíc oneliner). sorted vrací nový seznam, kde je největší prvek na prvním místě. A ten nakonec vrátíme. Pochopitelně, že ve skutečnosti bychom nemuseli seznam řadít opačně a použít index [-1], rekurzivní funkci, anebo dokonce použít zabudovanou funkci max. Jen by ten příklad nebyl tak popisný, i když by třeba mohl mít rozumnou složitost. Druhý pohled na slovo deklarativní je ten, že říkáme, co se má udělat a ne jak. To nás přivádí ke druhé části naší definice
    Základní strukturou používanou ve funcionálním programování je seznam.
    Dokonce název jednoho z prvních takových jazyků, Lisp, je zkratka List processor. V případě Pythonu je pak seznamem cokoli z ntice, seznamu, řetězce, slovníku, množíny, iterátoru, generátoru a podobně - dokonce pro to existuje slovo iterable, tedy cokoli, čím se dá procházet (iterovat).

    List comprehession

    Moudrá wikipedie říká, že jde o speciální syntaktickou konstrukci pro tvorbu seznamů na základě jiných seznamů. A protože jsme si už řekli, že funkcionální programování je transformací seznamů, je tato technika přesně to, co potřebujeme. A navíc se dá napsat na jeden řádek.
    [výsledek for proměnná in seznam (if podmínka(proměnná)]
    
    Zápis list comprehhension v pythonu je takovýto - v hranatých závorkách se nejrpve uvede výsledný záznam seznamu následovaný klíčovým slovem for. Za tím následují proměnné cyklu (můžeme třeba iterovat přes klíč a hodnotu slovníku zároveň, takže proměnných může být vícero). Za tím je slovo in a seznam, přes který se bude iterovat. Volitelně může následovat podmínka, přičemž pokud neplatí, je daná hodnota ze seznamu přeskočena.
    [(x, x**2) for x in (1, 2, 3, 4, 5) if x != 3]
    [(1, 1), (2, 4), (4, 16), (5,25)]
    
    Takže tento zápis vezme ntici (1, 2, 3, 4, 5) a pro každý prvek x vrátí dvojici x a druhou mocninu x, s vyjímkou x=3. Jak vidíme, celé funkcionální programování má poměrně blízko k matematice. Aby to nebylo tak jednoduché, tak existuje i varianta, která má závorky kulaté. Ta se chová stejně jako předchozí příklad, pouze nevrací seznam, ale generator object. Rozdílem je, že se seznam vyhodnotí okamžitě, kdežto generátor až při procházení. Jedním z vedlejších důsledků je, že je snadné mít nekonečný generátor, což se o seznamu říct nedá. Pak tu máme varianty se složenými závorkami, vracejícími množiny, případně slovníky, ale to už bych zbytečně mátl.

    Další pythoní funkcionální arzenál

    Samotný python mnoho zabudovaných funkcionálních věciček. Funkce jako map a filter se s výhodou dají nahradit výše uvedeným konceptem. Pak tu máme anonymní lambda funkce. Takže další moduly, které nás mohou zajímat jsou itertools, které poskytují spousty užitečných funkcí. Potom functools, kam se například poděl reduce() a dost možná i operator, který exportuje operátory pythonu jako standardní funkce.

    Příklad první - logy apache

    Zadání jsem si půjčil z diskuse k zápisku Perl pro zelenáče (mimochodem díky CESTovi za podnětné zadání). Máme soubor access.log, kde první záznam je ip adresa a naším úkolem je spočítat, kolikrát se která vyskytuje v souboru.
    
    d = dict()
    
    for line in open("access.log", 'r'):
    
      key = line.split()[0]
    
      d[key] = d.get(key, 0) + 1
    
    for key, count in d.iteritems():
      print key, count
    
    
    Imperativní a neobfuskovaná varianta je snadná. Jdeme přes všechny řádky v souboru, metodou split() oddělíme klíč a pomocí slovníku počítáme jednotlivé výskyty.
    
    import itertools
    
    def keys(f):
    
      return (l.split()[0] for l in open(f, 'r'))
    
    def uniq_c(f):
    
      return ((len(list(g)), key) for key, g in itertools.groupby(sorted(keys(f))))
    
    def format(f):
    
      return "\n".join("%s\t%s" % (cnt, key) for cnt, key in sorted(uniq_c(f), reverse=True))
    
    print format("access.log")
    
    
    Toto je funkcionální implementace téhož. Jak vidíme, tento styl dost často používá rozdělení problému na podproblémy, čili funkce a jejich následným skládáním problém vyřešíme. Funkce keys je triviální, vrátí seznam (respektive generátor) klíčů ze souboru. Funkce uniq_c obsahuje veškerou logiku, protože nakonec vrátí seznam dvojic (počet-záznamů, klíč), který funkce format už jenom převede do řetězce vhodného k vytištění. V praxi by všechny výše uvedené funkce očekávaly spíše seznam a konec by se zapsal nějak takto
    print format(uniq_c(keys(open("accecc.log"))))
    
    ale při obfuskování na ortogonalitu a znovupoužitelnost zase tolik hledět nemusíme. Celou logiku tak nese funkce itertools.groupby, která se chová podobně jako unixový příkaz uniq a takto použitá vrací seznam dvojic klíč a _grouper object, což je iterátor obsahující seznam prvků jdoucích po sobě. Pro získání počtu prvků se pak volá len(list(g)).

    obfuskujeme

    Celé obfuskování je potom pouze práce se schránkou, kdy do sebe vkládáme kód tak, aby byl na jedné stránce.
    
    import itertools, sys; print "\n".join(("%s\t%s" % (cnt, key) for cnt, key in sorted(((len(list(g)), key) for key, g in itertools.groupby(sorted(l.split()[0] for l in open(sys.argv[1], "r")))), reverse=True)))
    
    
    A teď by měl rozdíl mezi funkcionálním programování a obfuskování poznat opravdu každý. Mimochodem - příklad se spustí takto - python -c 'sem vložte kód' access.log

    Příklad 2 - The Fifth Obfuscated Perl Contest

    Přepsání nějakého jednoduchého onelineru pochopitelně není žádná pořádná výzva, takže proč nepřepsat něco pořádného? Vybral jsem is jeden příklad z The Fifth Obfuscated Perl Contest a to vítěze kategorie
    Category 4: The Old Standby (1 << 5 inmates) Rules: must output "The Perl Journal"; 256 chars
    #:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :||
    open(Q,$0);while(<Q>){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/\|
    /:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"\n";
    #.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|
    
    A výsledkem je
    #:: 0-.| .-| .|||-| ::-| .||-| ||
    print "".join(("".join((y for y in x)) for x in 
    ( (chr (sum( (x if y != 0 else x*20 for y, x in
    enumerate ( len(x)  if x != "0" else 0 for x in
    (x.replace('|',':.:').replace(':','..')for x in
    y))))) for y in x) for x in((x.split() for x in
    y)for y in (x.split('-') for x in(x[1:] for x in
    file(__file__, 'r') if x[0] == '#'))))))
    #. :||-| ::||-| :|||-| .:|-| .-.| :-. .:||
    
    Postup při přepisu něčeho takového je v zásadě stejný - je potřeba rozkódovat a pochopit Perlí část, napsat to stejné v Pythonu (pro většinu lidí včetně mě nejprve v imperativní podobě a tu přepsat do funkcionální) a potom z toho udělat jeden řádek.        

    Hodnocení: 91 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    22.9.2011 17:12 luky
    Rozbalit Rozbalit vše eval
    Uvedomujete si, ze eval slouzi k implementaci vyjimek:
    eval {
            die "Chyba\n";
    }; if ($@ eq "Chyba\n") {
            print "Vyhozena 'Chyba'\n";
    } elsif ($@ eq "JinaChyba\n") {
            print "Vyhozena 'JinaChyba'\n";
    } else {
            print "Vyhozeno neco jineho: $@\n";
            die; # Vyhodi znovu
    }
    
    Josef Kufner avatar 23.9.2011 00:14 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Jen tak mimochodem, zkoušel jsi porovnat výpočetní náročnost obou variant algoritmů?
    Hello world ! Segmentation fault (core dumped)
    26.9.2011 16:09 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Tak v prvním případě jsme vyměnili O(n) za O(n*log(n)), takže je na tom funkcionální varianta o něco hůř. Popravdě se mi nepovedlo vymyslet, jak to celé udělat bez seřazení seznamu. Druhá je lineární, takže tam se náročnost nijak moc nezměnila.
    When your hammer is C++, everything begins to look like a thumb.
    Josef Kufner avatar 30.9.2011 09:02 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    print reduce(max, (1, 2, 5, 4, 3))
    
    O(n).
    Hello world ! Segmentation fault (core dumped)
    30.9.2011 14:59 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Já prvním příkladem nemyslel nalezení největšího čísla, ale logy apache a počítání duplikátů.
    When your hammer is C++, everything begins to look like a thumb.
    pavlix avatar 30.9.2011 18:13 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Erm, není tohle v Pythonu prasárna?
    >>> print(max(1, 2, 5, 4, 3))
    5
    
    23.9.2011 09:06 CEST
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    v němž je odsazování součástí syntaxe
    mne osobne to strasne vadi, protoze odsazeni lze provadet dvema ruznymi znaky (mezera a tabulator), coz by ani tak moc nevadilo, pokud by se tyto znaky daly pouhym okne v editoru rozeznat, coz je ale dost problem, pro zacatecnika IMHO velkej (protoze nechape, proc jedno prazdny misto neni steny jako jiny prazdny misto)
    oddělovačem příkazů a nepovinným odsazováním
    je skvela vec, kdyz chce clovek zapsat perl scriptik na jeden radek
    mimochodem díky CESTovi za podnětné zadání
    Hehe, mel jsem si vymyslet neco lepsiho:) Ale ty tvoje jednoradkovy zapisy se mi zacinaji libit:) Zkusim do toho hada trosku proniknout:)
    Bystroushaak avatar 23.9.2011 13:24 Bystroushaak | skóre: 32 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    pro zacatecnika IMHO velkej (protoze nechape, proc jedno prazdny misto neni steny jako jiny prazdny misto)
    Problém to není. S pár začátečníky v pythonu jsem se už setkal a pochopili to okamžitě (konec konců, když nejsou schopní pochopit tohle, jen stěží pochopí programování v pythonu). Jinak v netriviálních editorech není problém si zobrazení whitespaces povolit (sám to tak mám).
    Saljack avatar 23.9.2011 14:35 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    mne osobne to strasne vadi, protoze odsazeni lze provadet dvema ruznymi znaky (mezera a tabulator), coz by ani tak moc nevadilo, pokud by se tyto znaky daly pouhym okne v editoru rozeznat, coz je ale dost problem, pro zacatecnika IMHO velkej (protoze nechape, proc jedno prazdny misto neni steny jako jiny prazdny misto)
    No a co bude dělat, až uvidí = a ==, to už bude úplně v koncích. Navíc nevidím rozdíl mezi odsazením a {}. Navíc si myslím, že začátečník nebude psát kód v nějakém textovém editoru typu notepad.
    Sex, Drugs & Rock´n Roll.
    23.9.2011 18:33 luky
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Navíc nevidím rozdíl mezi odsazením a {}.
    Uz jste nekdy kopiroval kod z webu? Odsazeni je obcas udelane tak, ze se pri kopirovani pokazi.
    pavlix avatar 23.9.2011 20:52 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    A je potřeba opravit, bez ohledu na to, jestli je python-style nebo C-style.
    23.9.2011 23:20 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Akorát že v jednom případě to jde udělat automaticky a v druhém ne.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    pavlix avatar 24.9.2011 00:17 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    To je pravda. Teda, ne že by mě to nějak trápilo.
    23.9.2011 15:29 SPM | skóre: 28
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Tak míchat to je celkem blbost... každej editor víceméně to dělá pořád stejně, takže při psaní nového souboru je to jedno, pokud jsem někde něco stáhnul, tak to převedu na to, co dělá můj editor (to je celkem sranda) a pokud je to nějakej týmovej projekt, tak to chce ty pravidla nastavit (ale tam zase nebude úplný začátečník). Ono to tak moc horké nebude...
    rADOn avatar 23.9.2011 18:28 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Musim se pridat. Odsazovani je vyslovene opruz zezacatku, nez si clovek uvedomi ze nebojuje s jazykem, ale s editorem. Pak si proste sedne, projde svoje oblibene editory, nastavi si vsude stejnou politiku a behem peti minut problem solved.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    25.9.2011 12:03 Gilhad | skóre: 20 | blog: gilhadoviny
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    pokud by se tyto znaky daly pouhym okne v editoru rozeznat, coz je ale dost problem

    ve vimu:
    :set lcs=tab\:\|- list
    26.9.2011 16:00 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče

    mne osobne to strasne vadi, protoze odsazeni lze provadet dvema ruznymi znaky (mezera a tabulator)
    To je pravda, i když by to zvedlo vlnu výkřiků - Python ne, tam se odsazuje tabulátory/mezerami.
    When your hammer is C++, everything begins to look like a thumb.
    rADOn avatar 26.9.2011 18:17 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Mno tak je potreba hlasite rici, ze v pythonu se odsazuje tabem nebo mezerou a kdo to bude kombinovat, tomu koule upadnou.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    27.9.2011 09:19 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    On je bohužel python 2 v tomto ohledu velice benevolentní, takže mixování tabelátorů a mezer mu nijak nevadí. Až python3 vyhodí v tomto případě TabError.
    $ cat <<EOF > pok.py
    PROG="""
    def foo():
            print("8 mezer")
    \tprint("tab")
    \tif True:
    \t        print("tab + 8 mezer")
    
    foo()
    """
    
    exec(PROG)
    EOF
    
    When your hammer is C++, everything begins to look like a thumb.
    27.9.2011 17:30 SPM | skóre: 28
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    naštěstí aspoň některé editory tak benevolentní nejsou a začnou řvát :)
    2.10.2011 22:48 Sten
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Já používám v Pythonu (i jiných jazycích) kombinované odsazování: tabulátor rozlišuje scope a mezera zarovnává u víceřádkových příkazů. Výhodou je, že i se změnou délky tabulátoru zarovnání pořád sedí a vy si můžete zvolit vlastní, pro vás ideální délku tabulátoru. Jestli mi to ale Python3 zakáže, budu zlý a naštvaný :-)
    Bystroushaak avatar 23.9.2011 13:28 Bystroushaak | skóre: 32 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Pěkný článek. U vymýšlení řešení toho python oneline contestu jsem se dost inspiroval článkem Python Tips, Tricks, and Hacks.
    robotics avatar 24.9.2011 08:04 robotics | skóre: 29 | blog: o_vsem_moznem
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    Ten poslední příklad s tečkama čárkama dvojtečkama a pomlčkama mi připadá jak nějaká morzeovka :-).
    ________________ avatar 25.9.2011 03:03 ________________ | skóre: 5 | blog: _
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    chcel som autora článku pocváliť za článok, ale nevidím tu tlačítko páči sa mi to. tak asi pojdem "o dům dál"
    25.9.2011 12:04 Gilhad | skóre: 20 | blog: gilhadoviny
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    To je fakt, u domu se dají páčit dveře, okna, ...
    xxxs avatar 25.9.2011 13:17 xxxs | skóre: 18 | blog: vetvicky
    Rozbalit Rozbalit vše Re: Python pro nezelenáče
    ked to nejde okom, skus vyhladavanie. zadaj toto: Hodnocení:

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.