Po cca roce a půl jsem se konečně dostal k tomu zveřejnit svůj ročníkový projekt – hru 16 vojáků implementovanou v jazyce Java.
Stránka s popisem a odkazy pro stažení. Dávám k dispozici kompletní materiály k aplikaci – spustitelný program, zdrojové kódy, zadání i dokumentaci.
Bohužel ne vše je napsáno tak dobře, jak bych si to představoval a jak bych to napsal dnes, ale to už tak bývá u školních projektů dodělávaných na poslední chvíli :) Upřímně za tu implementaci gui bych si měl dát pár facek, protože to je obzvláště zpracené, ale snad to alespoň poslouží jako odstrašující příklad.
Snad se to někdy někomu bude k něčemu hodit (třeba jako inspirace pro další studenty trápící se s podobným ročníkovým projektem). A když ne, tak se také nic nestane – ono to nic až tak světoborného není;)
Publikováno 10.08.2009 18:49 v sekci IT
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Publikováno 16.05.2008 12:46 v sekci IT
Trvalý odkaz
Komentářů: 6 (Zobrazit komentáře)
Aby toho nebylo málo, dovolím si ještě jednu školní programátorskou úlohu – generování potenční množiny. Nabízí se dvě možná řešení – rekurzivní a iterativní. U prvního však pouze popíši postup, neboť jsem problém řešil způsobem druhým.
Myšlenka rekurzivního řešení je velmi prostá – potenční množina n-prvkové množiny je složena ze všech jejích 0 až n-prvkových podmnožin. Vygenerování 0-prvkové je triviální a m-prvkovou (pro m>0 a m<=n) získáme tak, že vytvoříme všechny jednoprvkové podmnožiny a pro každou z nich uděláme její sjednocení se všemi m-1 prvkovými podmnožinami které tento prvek ještě neobsahují (ty získáme rekurzivní aplikací tohoto postupu).
Iterativní řešení je myšlenkově kapánek složitější, ale kódově jednodušší a mělo by být i výkonnější (nedochází k rekurzivnímu volání funkcí a s jednou alokovanou pamětí se už dále nehýbe). Místo vstupní množiny si představíme stejně velkou množinu kde na každém místě může být buď jednička nebo nula a vygenerujeme všechny možné kombinace jedniček a nul – tzn. bude se jednat o variace n-té třídy ze 2 prvků. Podle každé z těchto variací vygenerujeme jednu množinu potenční množiny a to tak, že do výsledné množiny zařadíme k-tý prvek vstupní množiny právě když na k-tém místě aktuálně uvažované variace je jednička.
A aby to bylo celé ještě jednodušší, pro vygenerování zmíněných variací stačí vzít binární reprezentaci čísel 0 až 2n (počet variací n-prvkové množiny je právě 2n a číslo reprezentované binárním zápisem sestávajícím z n jedniček je taktéž 2n).
Teorie by snad stačila, takže teď praktická implementace. Pro reprezentaci množiny je použita jednoduchá struktura a díky využití templatů je možno pracovat s libovolným datovým typem což má také tu výhodu, že potenční množina je stejného datového typu jako jakákoli jiná množina.
template <class T> struct set_t{
int size;
T* set;
};
template <class T> set_t<set_t<T>*>* potencni(set_t<T>* vstup){
set_t<set_t<T>*>* ret = new set_t<set_t<T>*>;
T pom[vstup->size];
int count=0,i,j,k;
ret->size = (int)pow(2,vstup->size);
ret->set = new set_t<T>*[ret->size];
for(i=0;i<ret->size;++i,count=0){
for(j=1,k=1;j<=vstup->size;++j,k*=2){
if((i&k) == k){
pom[count++] = vstup->set[j-1];
}
}
(ret->set)[i] = new set_t<T>;
((ret->set)[i])->size = count;
((ret->set)[i])->set = new T[count];
memcpy(((ret->set)[i])->set,pom,sizeof(T)*count);
}
return ret;
}
Publikováno 05.01.2008 18:27 v sekci IT
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Tento článek má dva cíle – jednak ukázat jednoduché, efektivní a elegantní řešení školní úlohy zmíněné v titulku, druhak krátce se zamyslet nad použitím rekurzivních a iterativních algoritmů.
Začnu tím prvním – jedná se o běžnou výukovou úlohu implementovat binární strom pomocí struktury a základní operace nad ním – nalezení a vložení prvku. Úlohu lze řešit dvěma způsoby – buď iterativně nebo rekurzivně. Co si pamatuji tak u nás to většina spolužáků řešila druhým způsobem. A výsledek byl zbytečně složitý po stránce kódu a také zbytečně neefektivní. Prvním způsobem to jde mnohem efektivněji a také jednodušeji – proč zbytečně psát spoustu kódu, když se to celé vejde téměř na jeden řádek;). Řešení pak vypadá takto jednoduše:
struct uzel_t{
int cislo;
uzel_t* levy;
uzel_t* pravy;
};
uzel_t* vloz(uzel_t* strom, int cislo){
uzel_t** pom;
for(pom=&strom;*pom!=NULL&&(*pom)->cislo!=cislo;pom=cislo>(*pom)->cislo?&((*pom)->pravy):&((*pom)->levy));
if(*pom==NULL){
*pom = new uzel_t;
(*pom)->cislo = cislo;
(*pom)->levy = NULL;
(*pom)->pravy = NULL;
}
return *pom;
}
uzel_t* hledej(uzel_t* strom, int cislo){
uzel_t* pom;
for(pom=strom;pom!=NULL&&pom->cislo!=cislo;pom=cislo>pom->cislo?pom->pravy:pom->levy);
return pom;
}
Mazání prvku by se implementovalo obdobně, stačilo by přidat jeden cyklus navíc.
Teď je vhodný čas pro druhou část článku – proč je toto řešení efektivnější než rekurze? Odpověď je jednoduchá – kvůli nižším paměťovým nárokům. Celému algoritmu stačí malé místo na stacku pro volání funkce a její argumenty a pro jeden pomocný ukazatel, víc nepotřebuje.
Kdežto při rekurzivním volání funkce se při každém volání alokuje na stacku kus paměti pro režijní věci, pro argumenty funkce a pro všechny její lokální proměnné. To se stane při každém volání funkce a zabraná paměť se začne uvolňovat až když rekurze dojde na konec a vrací se zas zpátky.
Při iterativním řešení si veškerou paměť alokujeme sami – což je výhoda pokud žádnou nepotřebujeme (pak rekurze zbytečně zabírá paměť aniž by to mělo nějaký užitek), ale nevýhoda pokud ano (rozeberu za chviličku). Jinak jsou však obvykle obě řešení volně zaměnitelná – krom výjimečných případů (zatím jsem žádný takový v praxi nepotkal) problém který lze řešit rekurzivně je řešitelný i iterativně a naopak. Jediný rozdíl je tedy práce s pamětí.
Síla rekurze je právě v tom, že při každém volání funkce se alokuje paměť na stacku, což je extrémně rychlé (systém jen posune vrchol zásobníku), kdežto při iteraci si potřebnou paměť musíme alokovat sami a tato paměť se alokuje na heapu, což je výrazně pomalejší (a také hrozí fragmentace paměti).
Obecné pravidlo (spíše orientační než absolutní – vždy záleží na konkrétním kontextu a programátorovi) tedy zní – iteraci použít tam, kde není třeba ukládat si pomocná data při každém kroku výpočtu, rekurzi tam kde to potřeba je. Dobrým příkladem je AVL strom. Při vkládání prvku do AVL stromu musíme po jeho vložení procházet zpět navštívené uzly a vyvažovat je, přičemž v nejhorším případě se při zpětném chodu můžeme dostat až ke kořeni stromu. Při použití iterace by bylo třeba si navštívené uzly ukládat do zásobníku a po vložení prvku tento zásobník procházet – u rekurze za nás toto v podstatě udělá systém sám, tím jak funguje volání funkcí (viz. výše). Takové řešení by bylo nejen pomalejší, ale také z hlediska kódu komplikovanější a nepřehlednější, zatímco rekurze by byla rychlá, elegantní a intuitivní.
Publikováno 27.12.2007 18:23 v sekci IT
Trvalý odkaz
Komentářů: 2 (Zobrazit komentáře)
Tento příběh se začal psát koncem minulého roku, kdy mi shořela deska v mém serveru což se bohužel neobešlo bez asi dvoudenního výpadku. Weby se provizorně přestěhovaly na jeden z Krajových strojů a já začal řešit co s tím. Jako nejspolehlivější řešení jsem vymyslel dvojici serverů, kdy na jednom poběží weby a na druhém databáze (standardní a často používané řešení) a budou se vzájemně zálohovat, přičemž při výpadku jednoho z nich vše poběží z druhého.
A jak to souvisí s nadpisem, ptáte se? Nějakou dobu na to jsem si pořídil nového miláčka, který je od minulého týdne konečně doma – jmenuje se Balto, podle hlavního hrdiny stejnojmenného animovaného filmu, je to pohledný 2U server a jeho domovem se stala jedna z Brněnských serveroven.
Takže, i když by k takovému závěru mohl titulek svádět, žádnou vlčici (ani samičku jiného živočišného druhu) jsem si opravdu stále ještě nenašel – s počítači je totiž obecně mnohem lepší pořízení než s lidmi (o tom třeba časem také napíšu nějaký článeček;)).
Server byl, jak jsem již zmínil, pořízen už před nějakým časem, původně jsem však čekal na převezení serverů OLS do Brna, abych ho mohl přidat k nim a mít tak housing zadarmo. To se bohužel trošku zkomplikovalo a protáhlo, přesněji se to táhne dodnes takže jsem čekání vzdal, tudíž nainstalován byl až teď. Instalaci, správu i housing zajišťuje Kraja, kterého mohu vřele doporučit.
Co se týče konfigurace tak je to Pentium D915 (2x 2,8GHz), 1GB RAM (zatím stačí, až nebude, tak se přikoupí) a 320GB disk. Jen jeden disk tam je z toho důvodu že plánuji časem pořídit ten druhý stroj, takže pak lokálních záloh moc potřeba nebude.
Publikováno 29.04.2007 20:55 v sekci IT
Trvalý odkaz
Komentářů: 1 (Zobrazit komentáře)
Především mladá generace má ve zvyku dávat si na mobil různé odpornosti. Ať už se jedná o blikající nálepky, plyšové obaly, svítící antény, roztomilá pozadí nebo přitroublé melodie, jejich společným jmenovatelem je, že ve škole uprostřed pubertálních fracků jste bez nich absolutně aut a kdekoliv jinde mimo tuto skupinu s tím působíte velmi trapně a nevhodně.
Než podobný doplněk použijete, rozmyslete si nejdříve kam všude svého mobilního miláčka budete nosit, komu ho budete půjčovat a tak podobně. Není vhodné přijít na obchodní jednání s mobilem v růžovém plyšovém pouzdře a stejně tak se nehodí přiblblé zvonění nebo mít na pozadí sprosté obrázky atp. Hned po věcech na první pohled viditelných (pouzdra, nálepky atp.) jsou velmi kritické vyzváněcí melodie. Zvonění je třeba ve spoustě situací vypnout (jednání, škola, divadlo apod.), ovšem každý někdy zapomene. A minimálně pro tento případ je dobré mít zvonění, které neudělá situaci ještě trapnější než už je.
Já osobně nosím mobily bez pouzdra, případně v klasickém černém koženém pouzdře, na pozadí dávám fotky vlků a zvonění si vybírám úplně neutrální (zatím vždycky z vestavěných melodií). V paměti mobilu pak krom potřebných věcí a nějaké hudby nemám vůbec nic – žádné sprosté obrázky ani soukromá data – čím méně potenciálně zneužitelných informací v něm je, tím lépe.
Absence zajímavých dat se hodí jednak při ztrátě telefonu, druhak (a to především) když se telefon někomu půjčuje, třeba kamarádovi který si chce zavolat nebo se podívat co to máte za hezkou hračku. Druhý případ se mi stává celkem často obzvláště v případě spolužáků (přece jen Nokia 9300 není zrovna běžný telefon a patří do kategorie přístrojů které zajímají každého kdo má rád techniku) a díky výše zmíněnému přístupu se nemusím bát telefon na chvíli půjčit (samozřejmě jen těm u kterých vím že mi s ním v zápětí nezmizí v nejbližším průchodu;)).
K napsání tohoto spotu mě přivedla názorná ukázka nevhodného zvonění – seděl jsme ve škole na přednášce a najednou se ozvalo "tylilin" "tylilin" "Ahoj miláčku" (proneseno sladkým hláskem) a půlka přítomných popadala smíchy.
Publikováno 23.10.2006 18:11 v sekci IT
Trvalý odkaz
Komentářů: 4 (Zobrazit komentáře)
Dnes odpoledne byl uveden do ostrého provozu můj historicky první server. Prvním (a momentálně jediným, přemisťovat další se mi teď nechce) webem který na něm běží je zcela logicky tento web.
Server je stejně jako zázemí OLS umístěn v nejmodernějším českém telehousu TTC, jen s tím rozdílem že není v racku ale v polici. Za jeho instalaci a zprovoznění vděčím Krajovi, kterému chci tímto veřejně poděkovat.
Konfigurace je celkem skromná, což odpovídá tomu, že na něm v dohledné době nic výkonově náročného nepoběží (až poběží pořídím si lepší stroj). A cože v něm tedy mám? 2 x Pentium III 1 GHz, 512 MB DDR (není to moc ale do začátku stačí, pak přikoupím až přestane) a 2 x 60 GB disky v RAIDu. Připojen je na konektivitu OLS (v současnosti 100 mbps do NIXu a 10 mbps do zahraničí).
Jo a jmenuje se wufik. Roztomilé, že;) Proto jsem ho taky tak pojmenoval (no dobře, příště vymyslím něco lepšího).
Publikováno 07.09.2006 22:02 v sekci IT
Trvalý odkaz
Komentářů: 9 (Zobrazit komentáře)
S tím že něco trvá dlouho, mnohem déle než by mělo, se setkáváme na každém kroku. Ovšem jsou případy, kdy to překračuje všechny meze. Což se o dvou mých nedávných zážitcích směle dá říci.
Zhruba někdy na konci minulého roku jsem chtěl od firmy Meteopress počasí pro portál HBin. Poté co asi čtyřikrát ztratili smlouvu jsem konečně dostal to, co jsem chtěl – před čtrnácti dny. Nečekal jsem bleskové vyřízení neboť jsem to chtěl zadarmo formou sponzoringu (zmíněný portál je nevýdělečný), ale půl roku je i tak trošku moc.
Další firma co mě překvapila byl Seznam. Potřeboval jsem zařídit zápis pro jednu firmu - Seznam začal něco dělat po dvou měsících během nichž jsem jim poslal několik mailů aniž by se cokoliv stalo. Od takové firmy bych očekával méně laxní přístup.
O některých malých regionálních firmičkách, které např. nejsou schopny za několik měsíců zprovoznit mode_rewrite či provést jiné banální operace, se zmiňovat nebudu - tam je to, obzvláště v případě některých služeb (např. webhosting), běžná a ničím nepřekvapující situace. Ovšem to že s takto chová i nezanedbatelná část velkých firem už je na pováženou.
Publikováno 15.07.2006 11:21 v sekci IT
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Již několikrát se mi v poslední době stalo, že někdo měl snahu mi vyčítat, že jsme neodpověděl na SMS, kterou mi před několika hodinami poslal, argumentujíc při tom její důležitostí. Tyto tvory obvykle posílám do háje s tím, že mám na práci důležitější věci, než celý den čučet na displej telefonu, jestli mi náhodou nepřišla nějaká zpráva. Ostatně mě vůbec málokdy někdo něco napíše, tak proč se na telefon pořád koukat.
Celé to vychází z nepochopení SMS jako takových. Textové zprávy mají dvě hlavní využití – zasílání krátkých vzkazů nízké důležitosti, kvůli kterým je zbytečné telefonovat (obdoba přilepovacích papírků na lednici, jen s tím rozdílem, že přijdou na mobil) a komunikace na místech, kde by hovor byl z nějakého důvodu nevhodný (např. škola, divadlo). Ovšem druhý bod neznamená, že by pak zprávy nabývaly na důležitosti, neboť i na takovýchto místech lze telefonovat (ve škole jsou přestávky nebo lze jít na záchod, z divadla můžeme odejít na chodbu), spíše toto využití značí, že dotyčná osoba se na příslušném místě nudí.
Pokud mi tedy někdo pošle SMS, nemá právo si stěžovat na to, že nebyla urgentně vyřízena, neboť již volbou komunikačního kanálu mi jasně dal najevo, že záležitost pro něj není prioritní. Kdyby byla, zavolal by mi.
Publikováno 13.06.2006 13:06 v sekci IT
Trvalý odkaz
Komentářů: 1 (Zobrazit komentáře)
Včery, tedy na apríla, se uskutečnil další ročník soutěže JuniorInternet, soutěže a konference určené mladým internetovým nadšencům. Stejně jako v několika předcházejících letech jsem se zúčastnil, ovšem již ne jako soutěžící (věkovou hranici 18 let jsem již překročil), ale jako novinář;) Tudíž bych teď chtěl splnit to, co se ode mne jako od novináře očekává a něco o tom napsat.
Do Prahy jsem přijel chvíli před devátou a na místo konání mne spolu s Krajou, kterýžto přijel chvíli přede mnou, dopravil Marek svým přibližovadlem (nazvat to autem by nebylo tak úplně nejpřiléhavější).
Na chodbě před sálem jsme se zaregistrovali, dostali visačky a do nich cedulky s číslem (kteréžto jsme strčili do kapsy a nahradili vizitkami efektivu) a lístek na oběd.
Konference začala jako už tradičně nudnými a nezáživnými řečmi organizátora Jirky Peterky, Jaroslava Wintera, ministryně informatiky Dany Bérové a Jana Sokola. Přiznám se bez mučení že jsem u toho málem usnul.Následovalo vyhlášení výsledků soutěže a prezentace vítězných projektů. Výsledky a informace o vítězích naleznete na stránkách JI. Jedním z vítězů jsme byli mi, zastoupeni Markem Soldátem a projekty Efektiv a Naakup. Druhým vítězem ve starší kategorii se stal Štěpán Mejzlík s webem english-online.cz, kterážto mě docela zaujal a pravděpodobně ho v budoucnu využiji ke zlepšení své znalosti angličtiny.
Poté následovala diskuze internetových osobností, která sice, jak se dá očekávat, mi nepřinesla žádné nové či převratné myšlenka, ale poslouchat se dala.
Mnohem zábavnější však byl virtuální rozhovor s Ondřejem Neffem, kterýžto po technické stránce zajišťoval Zdeněk Cendra. Zábavný na něm byl fakt, že přenos se úžasně sekal. Samozřejmě nevím ve které části internetu byl problém, ale moc bych nedal za to že tam, kde si myslím;)
Následoval oběd, během kterého jsme vymysleli že uděláme stránku s nabídkou spolupráce pro mladé lidi, kteří mají dobrý nápad, ale nemají prostředky (lidi, finance či technické zázemí) na jeho realizaci. Během následujících přednášek jsme napsali nějaký ten text a běhali po chodbě s Krajovým mobilem a snažili se nafotit Marka. Nakonec se zdařila použitelná fotka, stihl jsem jí za chvíli upravit pro plánované použití a výsledek si můžete prohlédnout na napad.ols.cz.
Poslední věc, která mě zaujala byla on-line hra jednoho z vítězů polského JuniorInternetu. Bohužel si nepamatuji jméno dotyčného ani adresu webu, ale ta hra byla prostě úžasná. Muselo do dát ohromné množství práce a stát dotyčného spoustu času – klobouk dolů.
Den jsem zakončil příjemným posezením v čajovně s jednou lvicí.
Publikováno 04.04.2006 22:22 v sekci IT
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)