Zobrazují se příspěvky se štítkemprogramování. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemprogramování. Zobrazit všechny příspěvky

5.7.08

Jak jsem se stal nezaměstnaným

Ne, nebudu přepisovat známou povídku Šimka a Grossmanna. :-) Bohužel, situace se nevyvinula příznivě a v současné práci v AVG Technologies jsem dostal oznámení o zrušení pracovního poměru ve zkušební době. Důvodem bylo to, že pro firmu nebylo výhodné mě mít na plný úvazek, když jsem hodlal dál pokračovat ve studiu na FIT VUT. Ne, že bych z toho měl vyloženě radost, práce mě tam bavila a celkově mi to tam přišlo prima, ale musím uznat, že dělat 8-10 hodin denně, dojít domů a ještě stíhat něco ve škole (FIT VUT je celkem náročná na čas kvůli projektům), to by dalo asi hodně zabrat. No ale už tam mají za mě náhradu, taky Michala. :-)
No co už, stalo se... jako zkušenost to určitě byla a jsem rád, že jsem to zkusil. Možná vyjde nějaká ta diplomová práce, kterou bych pro ně mohl udělat a třeba se tam za rok dva vrátím. Uvidíme.

Takže je na čase hledat něco nového. Nejprve jsem měl obavy, že budu muset zase lítat v obleku v těch hicech po pohovorech, ozval se mi ale dlouholetý kámoš a spolužák Pavel, že bych mohl dělat s ním... podmínky mi tam přijdou fajn, sám Pavel tuto práci stíhá už nějaký ten rok při škole (stejné, kterou dělám i já), tak věřím, že tam to nějak zařídit půjde. Mělo by to být programování v Javě + Oracle BPELu; sice mám raději C++, ale tak proč to nezkusit, mohlo by to být zajímavé. Takže už studuji BPEL Cookbook, v Javě a Oracle už jsem kdysi něco málo dělal, tak snad se brzo ujmu.

10.9.07

Moje programátorské trápení

Deadline projektu už je podstatě za námi a projekt stále není. Částečně je chyba u kolegy, částečně i u velení - bylo mi řečeno, že na jejich systému vytvoří virtuální server pod Linuxem, den po termínu jsem se dozvěděl, že se nic takového nekonalo. Protože jsem podepisoval smlouvu o důvěrnosti, tak nebudu říkat, co přesně je ten projekt zač. Jen že tam využívám knihoven Boost a asio.
Projekt jsem napsal, vše šlapalo jak na drátku. Problém nastal při testování, konkrétně když jsem zkoušel kompilovat Boost na operačním systému OpenBSD 3.9. Je to už krapet starší verze, možná i to se na tom podepsalo... Boost tam prostě nešel zkompilovat, padlo to na Segmentation fault. Dlouho jsem přemýšlel, jak to vyřešit, pomrkával jsem po cross kompilaci (tzn. na svým Linuxu bych zkompiloval kompilátor a příslušný knihovny pro OpenBSD a v tom zkompiloval svůj projekt), ale ukázalo se to jako složité řešení, nedařilo se mi najít tu správnou kombinaci ARCH-VENDOR-OS-LIBC (co je špatně na i386-pc-openbsd-uclibc?).
Nakonec jsem se rozhodl pro další řešení. Stáhl jsem instalační soubory OpenBSD, pustil virtuální stroj vmware, v tom (s drobnými obtížemi se sítí) nainstaloval systém a začal to všechno instalovat včetně knihoven tam. Boost byl pokořen, podařilo se mi ho tam zkompilovat!
Objevila se však další chyba při instalaci knihovny asio. Ta padla při kompilaci při volání funkcí gethostbyname_r a dalších knihoven z glibc, což je GNU knihovna, která pod BSD není! Přitom na stránkách asia je napsáno, že projekt jde rozjet pod Mac OS X, což je *BSD systém. I na IRC kanálu #boost@freenode, kde se scházejí uživatelé i vývojáři Boostu a asia, se tomu divili.
Pustil jsem se tedy do editace zdrojových souborů asio knihovny, snažím se upravovat #ifdefy tam, kde jsou obsaženy #ifdefy pro Mac, snad to zabere.
Štve mě to, protože najednou mám kopec práce, do středy dopoledne mám mít ještě hotových 20 stran překladu, mě z toho hrábne! :-( Snad se to nějak podaří.

9.7.07

Doplňování závorek ve vimu

Trochu jsem si hrál s nastavením programátorského editoru vim, konkrétně s dopňováním příslušných párů ukončujicích závorek. Jinak řečeno: když píšete nějakou funkci v Céčku a stisknete ( pro zápis parametrů, automaticky se vám doplní i druhá závorka ) a kurzor se vrátí zpět, abyste mohli rovnou psát parametry funkce. Obdobně se hodí podobná funkce při psaní bloků ohraničených { a }, s tou výjimkou, že mezi znaky je nový řádek.
Pokud něco takového potřebujete, do souboru ~/.vimrc vložte následující řádky:

inoremap { {<CR>}<Esc>O
inoremap ( ( )<Esc>h

Snad se tato funkce bude některým hodit. Ještě rozjet Intellisense pro C/C++/Javu a bude to dokonalý. :-)

21.4.07

Přidání dokumentace funkcí do Netbeans

Protože teď mám období, kdy píšu jeden projekt za druhým, pracuji často s různými vývojovými nástroji. Jedním z nich je i IDE Netbeans, které slouží primárně k psaní projektů v Javě.
Hezkou vlastností těchto IDE je automatické doplňování/napovídání funkcí dané třídy. Potýkal jsem se však s problémem, kdy mi to nějaké funkce nabídlo, ale nic o ní nevypsalo, takže jsem stejně musel na web a hledat to přes Google.
Řešení je celkem snadné: nejprve stáhněte (pokud nebylo už ve vašem SDK jako v mém případě) J2SE(TM) Development Kit Documentation. Poté nainstalujte a v Netbeans je třeba provést následující:
  1. Z menu nahoře vyberte Tools > Java Platform Manager
  2. V novém okně vyberte záložku Javadoc
  3. Přidejte adresář, kam se dokumentace nainstalovala. Pozor! Je třeba přidat celou cestu, kde je soubor package-list (ne pouze do adresáře java-sdk-docs), v mém případě to byla cesta /usr/share/doc/java-sdk-docs-1.5.0/html/api
Teď už by se vám nápověda k Netbeans měla správně zobrazovat. Hodně štěstí s programováním. :-)

14.1.07

Úvaha o umělé i neumělé inteligenci

Jak už možná někteří vědí, studuju obor inteligentní systémy. Teď, jak se učím na zkoušku, mě u toho napadá spousta nápadů, tak se musím podělit:
Lidé se už dekády snaží nějak naučit stroj myslet. Jestli je to dobře nebo ne, to nechejme stranou. V umělé inteligenci existuje tzv. slabá AI (Artificial Intelligence = umělá inteligence), kdy stroj jedná na základě nějakých podnětů podle nějakých pravidel a pak silná AI, která rozumí problému jako celku, ví, co dělá. Vemte si třeba takový virus chřipky - je to takový malý automat, který útočí na jiné buňky podle svých jednoduchých RNA "pravidel". Co ale ví virus o nachlazení, které způsobuje? Nic. Podobně je to i s kolektivní inteligencí mravenců nebo včel, ti malí drobečci sami o sobě neví, jak jejich hromadné chování vypadá navenek, jen chodí podle feromonových stop a tak. Ale k věci - na principu slabé AI je založen Turingův stroj (ano, ta věc z mé neoblíbené teoretické informatiky... sakra, jak se to prolíná všecko, i ten Gödel a Hilbert v tom jsou namočení :). Co se silné AI týče, žádný takový stroj neexistuje. Lidé se to snažili všemožně dokázat. Třeba ten Turingův test, jak je v jedné uzavřené místnosti člověk, v druhé počítač a třetí člověk má zjistit, kdo z nich je člověk. Pravda, občas se to může podařit, ale po delší době pozná snad každý, že něco nehraje. No zkuste si to třeba s Elizou. To je takový případ slabé AI.
Podívejme se na způsob, jak myslí lidé a počítače. Lidé vidí věci obecně, počítače postupují podle nějakých pravidel. Příkladem budiž šachy - člověk se koukne a vidí, počítač propočítává. Dokážeme vytvořit systém, který taky vidí věci obecně? Který si uvědomí sám sebe, čili jinak řečeno, bude kompletní, úplný? Kdysi jeden pán J.R. Lucas předložil takovou myšlenku o úplnosti, přesněji ji nějak formuloval; on myšlenku kompletnosti vyslovil už Hilbert, nato mu ji dokázal Gödel (tzn. že formální systém je buď nekonzistentní nebo neúplný). Prostě vezměme si nějaký formální systém, ve kterém máme větu "V tomto formálním systému nemůžu být dokázána". Pokud je tato věta dokazatelná, pak se sama popírá, vznikne paradox a systém je nekonzistentní. Pokud je nedokazatelná, pak je věta pravdivá, systém je konzistentní, jenže k úplnosti tohoto systému mi chybí právě dokázat tady tu větu.
A v takovém uzavřeném kolečku jsou ty naše stroje. Stroj je vlastně formální systém se svými pravidly. Člověk může o sobě říct ono slavné Descartovo "Myslím, tedy jsem", stroj to říct nemůže, neuvědomuje si sám sebe, protože není úplný. Lidský mozek prostě není stroj, lidská mysl není formální systém. Nebo ne? To už úplně ta informatika hraničí se smyslem života. :) Podívejte - mějme nějaký lidský mozek, do kterého jsou uměle přiváděny elektrické impulsy. Mozek tak vidí, slyší, třeba i chodí, mluví, prostě má svůj svět (založený na tom, co mu pošleme za signály). Ve skutečnosti je připevněný někde na přístrojích (připomíná vám to film Matrix? :). Co je pak to bytí, ta existence? Přece ty přenosy signálů mezi neurony, tj. myšlení. A už jsme u toho Descartova úsloví.
Teď mě ale zrovna napadlo, že pokud je život jen snůška signálů mezi neurony, přičemž fyzické povaze našeho já věříme jen proto, že nám to říká mozek, dokážeme si tak jistojistě uvědomit sami sebe? Jinak řečeno - jsme úplní? A pokud jsme úplní, jsme i konzistentní? (Jen dodám - konzistence znamená třeba že žádnou platnou metodou nemůže být dokázáno 0 = 1; pokud by to někdo dokázal, celou současnou matematiku by to asi hodně rozhodilo).
No nic, o tomto by se dalo uvažovat dlouho a dlouho a stejně bych se asi k ničemu nedobral, zkoušeli to mnohem chytřejší lidé přede mnou a po delší čas a ke smyslu života nedošli. :) Pokud bychom dokázali sestrojit silnou AI, znamenalo by to, že i člověk je jen nějaký automat, byť složitý. Co by pak byl člověk? Bůh té nové AI? A pokud ano, měl by právo jí znovu sebrat existenci, čili život?

No nic, půjdu se radši zase normálně učit. :) Ale prostě když to čtu, tak mě takové věci napadají, nemůžu si pomoct. Snad jsem si vybral obor správně, zdá se, že je to moje parketa. Rád tu uvidím mou nejoblíbenější teoretickou informatičku Mirku :-D, jestli sem dá nějaký svůj poznatek, bude to jen dobře. :)

8.1.07

Trable s řadicíma metodama

Před chvílí jsem dopsal další projekt a to do HSC (Hardware/Software Codesign). Spočívalo to v naprogramování hardwarové jednotky, která vyhledala medián z 9-okolí nějakého bodu obrazu. To sloužilo k redukci šumi - antialiasingu obrazu. Projekt měl takový výzkumný charakter. K mediánu je třeba mít seřazenou posloupnost čísel. Řazení tedy probíhalo buď klasickým bubblesortem, dále optimalizovanější metoda (cokoliv rychlejšího než bubble sort), to bylo psané v Céčku a pak ještě ve VHDL udělat medián za pomoci řadicí sítě. To jsem objevil hned na netu, takže nebyl problém, tato komponenta se skládá z 19 prvků minmax, které vrací větší a menší hodnotu ze dvou vstupů, vše je to propojené dráty (signály). Pak se hledala nejvýhodnější sestava pro to filtrování - přes gprof jsem zjišťoval jednotlivé časy, které trvalo setřídění 9-okolí.
Problém se objevil paradoxně na tom nejjednodušším - řadicích metodách v Céčku. Napsal jsem bubble sort tímto způsobem:
char median_buble(unsigned char *sur){
int i, j;
unsigned char temp;
for (i = 0; i < (SUR_PIX-1); i++) {
for(j = 1; j < SUR_PIX; j++) {
if (sur[j] < sur[j-1]) {
temp = sur[j];
sur[j] = sur[j-1];
sur[j-1] = temp;
}
}
}
}
Prostě normální bubblesort. Poté jsem napsal quicksort jakožto tu druhou, rychlejší řadicí metodu. Jak jistě všichni víme :-), bubblesort má složitost n2, zatímco quicksort n*ln(n). U 9 prvků je to u bubblesortu 81, u quicksortu cca 19.77, quicksort by měl být tedy rychlejší. Napíšu, odladím, pustím grof a co nevidím - quicksort je pomalejší než bubblesort! Zapnul jsem tedy optimalizaci kompilátoru (-O2 i -O3) a nic, zrychlilo se to, ale obojí zhruba stejně. Přemýšlel jsem, čím to může být, pak mě to napadlo - quicksort mám rekurzivní, funkce tedy volá sebe sama, konkrétně to bylo průměrně 19x, což vede k větší režii (ukládání na zásobník, opětovné vyvolávání ze zásobníku a tak). Že by to ale zpomalovalo tak moc a to i u velkých objemů dat?
Dlabat na to, zkusím to jinak, hlavně nerekurzivně. Nerekurzivní quicksort se mi psát nechtělo, stejně ani už nevím, jak to vypadá, tak jsem zkusil insert sort, heap sort, shell sort... a nic, všechny metody dávaly pomalejší výsledek, než bubble sort! Jednomu spolužákovi jsem dal můj zdroják, aby to u sebe zkusil s ním a výsledek mě překvapil - jemu to fungovalo v pořádku, shellsort (který jsem nakonec zvolil) mu jen rychleji než bubblesort. V ostatních zdrojácích jsem nic neměnil. Tak fakt nevím.
Nakonec jsem to vyřešil vychcaně, zbývaly mi 3 hodiny do odevzdání, co mi zbývalo. S výslednými naměřenými hodnotami se nějak pracovalo dál, závěr se z toho dělal a tak. No a já vzal hodnoty, co mi vrátil shellsort a řekl jsem, že jsou to výsledky bubble sortu a naopak. :) Důležitý je, že vím, co jsem dělal, proč mi to dělalo takový prapodivnosti, to už je jedno.

Ne každý se snažil dělat projekt poctivě. Toto mi došlo od jednoho nejmenovaného spolužáka na ICQ:
(21:48:14) xxx: cus ses?
(21:52:08) m1c4a1: Tak napul.
(21:52:45) xxx: simte delals HSC? to sw optimized je jako ten quick?
(21:52:58) m1c4a1: jo
(21:53:54) xxx: ok
(21:53:58) xxx: a co je to pps?
(21:54:13) m1c4a1: picture per second
(21:54:21) m1c4a1: koukam, ze ani nevis, o co v tom projektu jde. ;))
(21:54:34) xxx: jj
(21:54:35) m1c4a1: pictures per second, tak. )
(21:54:40) xxx: ajo
(21:56:30) xxx: a kde to zjistim?
(21:56:39) m1c4a1: co kde zjistis?
(21:58:24) xxx: no to cislo pps
(22:00:07) m1c4a1: Musis naimplementovat ty radici metody, pak ten projekt spustit se zakompilovanym profilovanim, potom programem gprof zjistit, jak dlouho byl procesor v jednotlivych funkcich a z toho podle vzorecku na strankach projektu vypocitas pps.
(22:00:50) xxx: keryho vzorecku? ty hodnotz uz mam
(22:03:50) m1c4a1: No... tak vzorecek tam sice neni, ale tak je to snad jasny, ne? Tolikrat, kolikrat provedes vypocet, tak tolik je obrazku, tak to cislo tim jen vydelis.
(22:04:25) xxx: ale de ty cisla vemu?
(22:04:32) m1c4a1: ach jo...
(22:04:42) m1c4a1: [stránky projektu, tam se nedostanete :)] - precti si aspon toto
(22:06:32) xxx: to sem cetl
(22:07:46) m1c4a1: no nevypada to tak. kdybys to cetl, tak tam vidis "dobu vykonávání celého systému pro zpracování 30 snímků" apod.
...

No pokud někdo dělá projekty tímto stylem, že 2 hodiny před odevzdáním ještě ani neví, jak se to dělá a pak si projekt koupí (nabídky "Dám 2000 Kč za projekt" se na školním fóru jen hemží), co je to za studium? Jasně, taky se mi nechce něco dělat, ale jednou jsem šel na tu školu, abych se něco dozvěděl, tak si musím vytrpět i předměty, který nemám rád, ale nesnížím se k něčemu takovýmu. Pak ze školy vyjdou inženýři, kteří se k titulu prokopali uplácením a podvodama? Nemůžu říct, že by se mi to líbilo.

Projekty už jsou za mnou, teď se vrhnout na učení na zkoušky, na řadě jsou pokročilý databáze, ještě to 14 dní vydržím a pak bude snad už klid.

4.1.07

Vyvíjení ve vyvíjeném

Ten SmallDEVS je zlo!!
Dnes jsem od 9 ráno, co přijel kámoš a spolužák, dělal ve SmallDEVSu tu simulaci neuronové sítě. Je to jednoduchá síť, dělá jen to, že z řady 5 číslic vybere tu, která se od ostatních odlišuje (takže z řady 1 1 1 0 1 se odlišuje 4. číslice). Na první pohled se to zdá jako trivialita, ovšem nesmělo by se to dělat přes neuronový sítě, tento konkrétní příklad by šel udělat stokrát jednoduššeji, nicméně úkolem bylo vyzkoušet si způsob, jakým se stroje mohou učit. V podstatě to funguje tak, že neuronové síti předložíte pár dat a nějaký výsledek. Ona to zpracuje, několikrát si to v sobě přelouská a když jí pak zadáte jen data, tak z toho dokáže přibližně určit správný výsledek - čím víc vzorků učení a času věnovanému učení, tím lepší výsledky.
Ve Smalltalku už jsme měli síť implementovanou, teď to jen převést do SmallDEVSu. Na první pohled jednoduchá věc, na stranu druhou jsme u toho strávili 13 hodin čistého času. Neustálé nečekané pády aplikace SmallDEVS, jakési nedeterministické chování, záseky a špatná možnost ladění, to byl postrach, díky kterému jsme po celém dni aplikaci sice ve SmallDEVSu implementovali, ale funguje špatně a pro malý počet iterací (u vyšších to zatuhává). Kámoš opravujícímu napsal celkem ostrou kritiku, snad neskončíme na nule. :) Poslali jsme mu i ten smalltalkovský zdroják, aby viděl, že tu síť jsme fakt měli. Jak jsme zjistili, SmallDEVS je stále ve vývoji a ty chyby hodné alfaverze, to byl děs. Nefungující import sar balíčků, "neviditelné" spojnice metod, díky kterým nešla dělat spousta dalších věcí, divný export souborů a někdy navečer jsem se smál, až jsem se za břicho popadal, když kámoš změnil nějakou hodnotu vypisující řetězce do Transcriptu a ono se to okno místo změny hodnoty zbarvilo do červena a počmáralo nějakýma linkama... tomu říkám skvělé vývojové prostředí! :)) Stabilita horší jak u Windows 95. Postupně ta zábava přepadala v únavu, roztrpčení a zoufalost, když jsme několikrát museli psát to samé, protože se slavný SmallDEVS sekl.
Dodám, že se samotným SmallDEVSem a jeho vnitřními třídami jsme vůbec nic nedělali.
No nic, něco jsme odevzdali a musí to být po zásluze obodované, strávili jsme nad tím něco přes 25 hodin čistýho času.

2.1.07

Vektorový editor

Rozhodl jsem se hodit na web zdrojové kódy našeho vektorového editoru, pokud se někdo chce podívat, využít to, naučit se z toho trochu Javu. Náš tým už za to body dostal, tak proč to křečkovat doma. :-)
Jediný, co bude případně třeba upravit, tak je přístup k databázi Oracle, myslím tím jméno a heslo. Prostě celý string url v souboru database.java na řádku 128. Přece vám nedám přístup na naši školní databázi. :) Ta se myslím stejně po semestru vypne.

Zdrojové kódy jsem hodil na můj webserver, nezaručuju 100%-ní dostupnost, když třeba nebudu mít zapnutej počítač a nebo když jsem pod Windowsama. Sice mi to jede skoro furt, ale pro jistotu. :) Máte je zde: http://kobylnice.net:22001/~m1c4a1/pdb-projekt.tar.gz. Informace ke spuštění a kompilaci jsou v tom archivu, jinak pro nadšence dodám, že je opravdu třeba mít ten Oracle a nainstalovaný JDK.

Jinak dnes jsem byl na té zkoušce z teoretické informatiky, děs běs. No asi se na to 18.1. podívám znova na opravným termínu. :-]

28.12.06

Programátorské strasti

Před chvílí odešel kámoš Tonda, s kterým jsem od jedné odpoledne psal projekt do inteligentních systémů. Projekt jsme ještě neudělali, byť je z 80% celý. Jde o aplikaci ve SmallDEVSu, což je implementace DEVSu v programovacím jazyce Smalltalk. V podstatě to vypadá skoro stejně jako známější Squeak, jen to má navíc třídy a GUI pro práci s DEVSem.
Úkolem je udělat jednoduchou neuronovou síť, která se učí na základě vkládaných vstupů určitou operaci (třeba xor je taková typická, my chceme dělat operaci "větší než"). Tonda ji naimplementoval v C++, já jsem se vrhl do přepsání toho programu ve Smalltalku. Šlo do od ruky, Smalltalk mě chytil, pak jsme dopsali, začalo se ladit a problém... naoko bylo vše správně, ale někde byla chyba - neuronová síť nevracela správné výsledky. Dali jsme se do debugování, kontrolujeme každičký řádek, každý znak, počítáme závorky, debugovací pomocné výpisy snad na každém řádku... no prostě aspoň 8 hodin jsme hledali chybu. A pak jsme ji "našli":
...
Transcript show: (ii at: 1);cr. "tady se vypíše správná hodnota"
(x = 7) ifTrue: [
Transcript show: (ii at: 1);cr. "tady se vypíše špatná (jiná) hodnota"
...
Operátor = ani operaci ifTrue: jsme nijak nemodifikovali. Tak jak se sakra mohl řetězec ii změnit??? Jak by se v čistě objektově orientovaném jazyce, jako je Smalltalk, objevit chyba, která se často záhadně objevuje třeba v C, když sáhnu blbě do paměti? Nikde tam se samotnou pamětí přece nepracuju.
S tím už jsme to po jedné hodině ráno vzdali, napsali email garantovi, že jsme objevili takovou chybu a jde se spát... Pokud se nenajde řešení, tak mu to odevzdáme takhle s tím, že je chyba ve Squeaku a hotovo. Sáákra, to je zas pech!