|
|
V dnešním příspěvku ukáži jak pohodlně lze v Linuxu naprogramovat jednoduchou grafickou aplikaci; k tomuto příspěvku mě vyhecoval blog zápisek Programování na OS X - Cocoa aplikace jednou rukou. Mnou předváděný prográmek jsem napsal na podřadném netbooku během cesty vlakem za klientem. Výsledný skript si můžete stáhnout ze sekce příloh blogu na mých osobních stránkách.
Zadání : Bude se jednat o aplikaci na pomezí logické hry a fyzikálního simulátoru. Program simuluje pohyb několika gravitačně svázaných těles. Hráč se snaží s pomocí změn hmotnosti vybraných čtyř barevně vyznačených těles dostat libovolné těleso mimo vykreslovanou plochu. Cílem je takto dokončit deset předpřipravených úrovní v minimálním čase.
Vlastní vývoj
Zvolený jazyk a knihovny : Využil jsem známý skriptovací jazyk Python, který nabízí některé dosti zajímavé vlastnosti, uživatelské rozhraní využívá GTK (resp. programuji jen s pythoním GTK bindem PyGTK). Pro vykreslování jednoduché 2D grafiky použiji knihovnu Cairo. V případě větších nároků na fotorealističnost a 3D efekty bych zvolil velké OpenGL. Běžné distribuce obsahují různorodý programátorský ekosystém se značnou technologickou diverzitou; takže mohu předpokládat, že je předinstalovaný interpret CPython i PyGTK. (To je rozdíl oproti “holým” mainstreamovým Windows.) Situaci navíc jistí balíčkovací systém, který případnou absenci závislostí snadno vyřeší.
Popis pracovního postupu
Grafické uživatelské rozhraní : Vytvoření grafického uživatelského rozhraní (GUI) je triviální. Spustím návrháře Glade-3 a rozhraní si jednoduše naklikám, jak je vidět na předcházejícím obrázku. Pro pozdější provázání s logikou skriptu si obslužné funkce pro události/signály na komponentách pojmenuji. Vpravo na obrázku výše takto propojuji kliknutí na resetující tlačítko s funkcí reset_click, kterou později ve skriptu implementuji.
Knížečka v pravém dolním rohu Glade-3 je napojení na kompletní dokumentaci v Devhelpu, kde jsou všechna potřebná GNOME rozhraní podrobně popsána. Část popisu signálu click u tlačítka vidíme na výřezu ze screenshotu vpravo.
Celá práce v Glade-3 zabrala necelých deset minut. Nyní si práci uložím ve formátu Glade a také vyexportuji pro GtkBuilder, čímž vznikne speciální xml soubor. Zavoláním příslušné funkce GtkBuilderu ve skriptu se vytvoří uživatelské rozhraní a zaregistruje potřebné obsluhy (např. reakce na stisknutí tlačítka). Do skriptu tedy vůbec nezapisuji kód uživatelského rozhraní. Výhody GtkBuilderu jsou mimo jiné.:
Logika aplikace : Nyní okomentuji nezbytnou “kostru” kódu.
Nyní jsem implementoval kód logiky simulace o délce přibližně stopadesát řádků zdrojového kódu. Vzhledem k účelu skriptu pracuji stylem “napiš na jeden zátah a zapomeň”, takže jsem si nelámal hlavu se štábní kulturou, komentáři, jmény… Tato část vývoje mi zabrala přibližně dvacet minut.
Obsah hry : Správné zvolení fyzikální konstant nebylo těžké; stačilo docílit pouze, aby hra nebyla příliš rychlá, aby nevznikaly přílišné diskretizační chyby a stanovit přibližný maximální počet objektů (nepřetěžující procesor). Návrh jednotlivých herních úrovní byl mnohem obtížnější a vyžadoval časté testování. Několik poznámek:
Práci na levelech jsem dokončil za pět hodin. Výsledná hra nabízí deset úrovní se stoupající obtížností, které lze dohrát pod 13 minut herního času. Při “profi” přístupu by zbývalo ještě vytvořit balíček, specifikovat licenci a verzi programu, uvést programátorskou dokumentaci a kontakt na autora, napsat návod a manuálové stránky.
Závěr
Linux umožňuje velmi pohodlný efektivní vývoj aplikací a umožňuje výběr z mnoha konkurenčních prostředí (C/C++ překládané GCC, Java, Python, Perl…) bez vendor-lock omezení. Menší zajímavou aplikaci lze s pomocí populárních svobodných produktů (Glade-3, Python, GTK, gVim…) v Linuxu kompletně vyvinout během jednoho dne.
K blogu Linux zblízka : Do tohoto blogu budu přispívat již jen sporadicky. Po posledním zápisku jsem dostal několik nabídek honorované spolupráce, z nichž jsem si vybral nabídku LinuxExpressu (viz můj první článek http://www.linuxexpres.cz/hry/simulator-ponorky-danger-from-the-deep ). Nově budu aplikovat velmi striktní moderování diskuse (= často mazat komentáře). Bohužel blog navštěvuje úzká skupina Windows fanatiků (=Linux hater křiklounů), kteří setrvale vyvolávají flameware a znehodnocují blog; jejich komentáře budu mazat s pomocí vyhledávání minulých komentářů podle IP adresy a uživatelského jména. Díky těmto flameware někteří čtenáři nabyli mylný dojem, že zde srovnávam Linux a Windows. Tento blog se týká JEN Linuxu a proto začnu i mazat off-topic příspěvky o Windows (např. u tohoto článku komentáře .NET platformy, Visual Studia apod.).
Opravdu si s ohledem na Mono myslíte, že .NET platforma je off-topic?
- ergonomie narozdíl od Cocoa žádná
- článek programování v Cocoa byl alespoň zajímavým úvodem do problematiky,
znalejším uživatelům osvětlil výhody tohoto prostředí
- váš článek by se dal shrnout jednou větou = v linuxu dá programovat, já to
umím dívejte se
- výsledný program mě z grafického hlediska uráží
re 2 : Mono není .NET. Podle mého názoru je Mono podstatně horší než .NET. Off-topic jsou příspěvky typu : “Proč nepoužívat dokonalé Visual Studia a .NET? Celý Linux je sto let za opicema.” Naopak vítám příspěvky typu “Preferuji Mono, C#, GTK#, protože konkrétní důvod 1, konkrétní důvod 2…”.
re 3 : Reaguji jen na některé podněty.
>>váš článek by se dal shrnout jednou větou = v linuxu dá programovat, já to
umím dívejte se
Opravdu si myslíte, že chci ukazovat, co umím? V tomhle popularizačním článku přeci neukazuji žádné extra dovednosti nebo talent…
>>výsledný program mě z grafického hlediska uráží
Nejedná se o wow propagační screenshot, ale ilustraci k vývoji aplikace. Na klasickém Linuxovém desktopu by vzhled dotvářelo použité téma pracovního prostředí. Při práci jsem používal Fluxbox s minimalistickými témem, protože tak dosahuji maximální efektivity.
Hezký článek. Asi se začnu učit Python.
Vztahy mezi uživateli jsou bohužel takto napjaté a já se ani nedivím, když se pořád všichni někam cpou tomu druhému. Mazal bych tedy pouze troly, kteří čekají na flame.
Skvělá hra!!! Jednoduché hry s originálním nápadem se mi líbí. Je to nový nápad nebo remake?
Čtu a nestačím se divit:
“Python je interpretovaný jazyk, takže odpadly prostoje způsobené častou kompilací.”
Kompilace zvlášť u takhle malé aplikace by fakt trvala několik hodin, že? A interpretovanost je spíš nevýhoda,
protože místo jednoduchého podstrčení strojového kódu procesoru musí runtime parsovat v lepším případě nějaký bytekód, v horším celý zdroják. Na jednoduché věci OK, na větší aplikaci je to bohužel zabiják výkonu.
Pokud má článek demonstrovat, že v Unixu lze snadno vyvíjet malé aplikace typu Hello World nebo piškvorky, pak fajn. Přiznejme si ale, že málokterá aplikace je malá.
“Vzhledem k interpretovanému jazyku se výsledný skript vešel do pouhých 15 Kb.”
1GB místa stojí asi 2 Kč (1TB disk stojí cca 2000Kč). Fakt je nutné řešit, jestli aplikace zabírá 15kB nebo půl mega?
Smazal jsem konec příspěvků Tomáše Herzoga a Phalanx, ve kterém mě provokovali.
P. Herceg
Máte taky pravdu, ale to je právě to, co mě trochu štve. Na co se trápit s nějakou optimalizací když máme gigahertzové procesory a terabytové disky?
Pak se člověk diví, že ačkoliv výkon PC stále roste, tak aplikace a systémy jsou stále stejně rychlé/pomalé.
Mimochodem, když kritizujete interpretované jazyky, proč tedy děláte v NETu?
Správně napsaná aplikace třeba v Javě dokáže být téměř stejně rychlá jako její protějšek v C.
Jinak abych nebyl jen OT, článek se mi líbí a myslím, že to UI se dá určitě vylepšit.
S Pythonem moc zkušeností nemám. Zajímalo by mě, jsetli se dá použít taky s Qt knihovnou právě kvůli tomu UI? Děkuji za odpověď.
re 7 : Vymyslel jsem hru sám.
re 9 : Hra většinu času spí v smyčce, jinak by byla pro extrémní rychlost nehratelná. Nad to většina kódu běží v C/C++ (grafika) a Python se stará jen o herní logiku.
V praxi se Python často používá na velké projekty a často jako skriptovací jazyk pro špičkové aplikace. Pro velké projekty má Python některé zajímavé vlastnosti (viz např. pojetí modulů). Výkonostně náročné části lze napsat v C, takže Python se používá i v oblasti HPC.
re 11 : Ano existuje (PyQt).
10. Když už uvádíš mé jméno, tak ho laskavě opiš správně. Neumět opsat pár písmenek je DEMENCE, OPAKUJI DEMENCE NEJVYŠŠÍHO KALIBRU hodná zkouřeného tučňáka.
Diky za super clanek. Az zbude nekdy trochu casu, taky si podobnou simulaci vyzkousim. Myslim, ze by to byla dobra motivace pro nauceni se treba v Qt QML.
P.S. Preju hodne zdaru a pevnych nervu pri cteni utocnych komentaru. I kdyz se to muze zdat pri cteni diskuze jako opak, hulvatu je porad v pomeru ke slusnym ctenarum jenom minimum ![]()
Vymazal jsem asi deset nevhodných příspěvků. Našel jsem si Tomáše Hercega na Googlu a jeho příspěvek 11 nechávám. Až takto primitivní úroveň může mít vystupování některých osob, které Microsoft označuje za Most Valuable Professional (=nejcennější profesionálové).
>11. Tomáš Herceg
A kolik jste toho zhulil vy nez jste se dneska dotknul klavesnice ?
V noci se budite ze snu s tuxem ? Mate sny jak velky roboTux rizeny Linusem a Stallmanem rozslapuje Redmond a budite se ve 3:15 zpoceny k smrti ?
Nebudete nahodou z Microsoftu ? ![]()
Úroveň cenzury na tomto blogu překračuje úroveň cenzury na blogu R.H.
15. Rudolf Dvořáček
ano uplna cenzura mi take nevyhovuje, uvital bych spise oznaceni a skryti prizpevku (tak aby sel na jeden click zviditelnit)ale to pravdepodobne neni v moci majitele blogu ale v moci provozovatele sluzby
P. Herceg, váš problém je, že berete všechno moc osobně a nedokážete se na některé věci dívat s větším nadhledem. Splést se může každý.
Jinak pro mě byl článek inspirací začít se učit Python či jeho odvozeninu Jython. Jako Javistu mě občas štve taková ta ukecanost Javy, takže Jython může být dobrý doplněk k řekněme tradiční Javě.
Pane Hercegu, mně příjde, že větší demence než překlep ve Vašem ctěném jménu je mít na webu sekci “O mě”.
Jakožto autor zmiňovaného zápisku bych se též rád vyjádřil.
Nejprve musím autora pochválit za nápad k nové hře. Nápadů si cením, je dnes opravdu obtížné vymyslet něco skutečně originálního…co si budeme povídat. Hru sice hrát nehodlám, nicméně možná kdyby ji autor zpracoval pro nějaké mobilní zařízení, mohla by se pro dlouhé chvíle hodit.
Linux má samozřejmě obrovskou výhodu spousty vývojových prostředí a možností volby obrovského množství programovacích jazyků. Python je zajímavý, ale zatím jsem k jeho studiu nenašel dost času a ani nutnosti.
Linux neznám a proto je mé hodnocení jistě nepřesné, ale obávám se, že ona obrovská mnohost má i svá úskalí. Díky ní se totiž na Linuxu (jak předpokládám…) nesetkáme s jednotností ovládání aplikací, což my, “applisté”
tolik adorujeme. Samozřejmě, každý preferuje něco jiného.
Pokud chtěl ale autor srovnávat s mým výtvorem, tak se obávám, že měl zkusit něco podobného. Co si budeme povídat, podobná hra se (s větším či menším úsilím) dá naprogramovat v jakémkoliv jazyce. Většina čtenářů ale asi nebude programovat hry. Pokud vůbec bude něco programovat, tak to spíše bude něco podobného tomu, co jsem zkusil já - malý prográmeček pro osobní potřebu. Proto by (dle mého názoru) bylo mnohem zajímavější, kdyby autor zkusil naprogramovat přesně to samé, co jsem udělal já. A pan Herceg, který se se mnou “do krvava” hádal v jednom z minulých článků o Cocoa, by mohl to samé zkusit ve WPF - třeba mě o jeho kvalitě přesvědčí. Taková série srovnávacích článků by byla velmi zajímavá a přínosná pro všechny. Vsadím boty, že ani jeden z Vás nebude mít situaci tak jednoduchou, jako já s Cocoa:-)
To samozřejmě neznamená, že Cocoa je tím nejlepším, co existuje. Ale troufal bych si tvrdit, že pro podobné typy primitivních aplikacích je Cocoa snad vůbec nejefektivnější. Ostatně…proto jsem v ní takovouto aplikaci předvedl, že:-)
Přeji hezký víkend!
17. Ano, splést se může každý. Pochopím, když mi autor blogu snaže kus příspěvku, je to jeho blog a může tady mít, co chce. Ale když cituji něčí jméno, tak se přece podívám, jestli jsem ho opsal správně, je nanejvýš trapné udělat v něm chybu. Kdyby to bylo poprvé…
18. Ano, máte pravdu, děkuji za upozornění.
19. Určitě jsem se s vámi nehádal “dokrvava”. Jen jsem poukázal, že některé věci, co o .NETu píšete, nejsou pravdivé. Ano, mohl bych napsat podobný článek o WPF pro srovnání, ale podobné typy článků nemají moc velkou vypovídací hodnotu, protože na jednoduchých aplikacích strořených za 10 minut svět nestojí a o kvalitě frameworku či nástrojů to neříká nic.
Btw větu “Vsadím boty, že ani jeden z Vás nebude mít situaci tak jednoduchou, jako já s Cocoa:-)” máte podloženou čím?
Pane Herceg, promiňte, to “do krvava” bylo míněno ironicky, proto bylo v uvozovkách. Já jsem rád, že jsme podebatovali, aspoň jsem se rozhodl zkusit WPF.
Stále mám ale pocit, že si nerozumíme. Vaše tvrzení, že “podobné typy článků nemají moc velkou vypovídací hodnotu” se totiž míjí s pojetím Živě. Mají vypovídací hodnotu - jak pro koho. Ano, samozřejmě, že svět nestojí na jednoduchých aplikacích, ale máte snad pocit, že autoři toho skutečně stěžejního softwaru čtou Živě? A ještě snad proto, aby se na něm poučili?:) Máte snad pocit, že polovina čtenářů zde pracuje na bankovních a bussiness aplikacích, druhá polovina kóduje pro internet?:) Osobně se domnívám, že pokud zdejší čtenáři vůbec programují, tak jsou to právě ty jednoduché aplikace pro osobní potřebu - čest výjimkám. A pro ně má můj článek (a případně váš srovnávací o WPF) svůj smysl. Já osobně bych Váš článek přivítal, neboť bych se rád ve zhuštěné formě dozvěděl, jak přesně ve WPF v tomto konkrétním případe bindingy fungují. Bylo by to rychlejší a jednodušší, než číst moudré knížky.
Svou větu “vsadím boty…” mám podepřenou tím, že jsem do WPF lehce nakoukl, a i když nechci zpochybňovat jeho obecnost a rozsáhlé možnosti, tak si myslím, že Cocoa je (pro typ aplikací, který jsem naznačil) efektivnější. Nevím, možná mi ukážete, že pro WPF existuje také nějaký datový návrhář, následovaný wizardem pro tvorbu UI. Proto by mi Váš článek byl užitečný…
Článek výborný, jenom jestli příště na osobním blogu uložíte zdrojový kód například v zipu, ne v tar.gz. Linux mám a tak mi to nevadí, ale většina windows uživatelů by s tím mohla mít problémy:-)
re pavt : Dobře napíši podobnou aplikaci, ale nebudu se snažit o plně “klikací” vývoj.
re Eda01 : Budu to nadále ukládat v tar.gz, protože:
1. Formát zip neumožňuje uložení UNIX práv (zde konkrétně spustitelnost skriptu). Takže bych musel použít rozšíření Info-ZIP (s tím nemám zkušenost).
2. Uživatelé Windows by si museli předinstalovat minimálně Python, GTK, PyGTK a optimálně i nějaká Windows speciální rozšíření; o tom, že by si to všech chtěli instalovat kvůli malé hře, pochybuji. (Poznámka: Pod Windows přistupuje něco málo přes polovinu návštěvníků.)
Co se týče tar.gz tak 7zip mi to rozbalil bez problémů. Zkoušel jsem ještě Izarc a taky to rozbalil.
tomu se rika “hozena rukavice”, pane Herceg, budete mit odvahu ji zvednout? ![]()
uzivatel2->Skvělé. Samozřejmě, nemusí to být klikací, jde o to, jak se takováto primitivní databázová aplikace na Linuxu programuje. Opravdu si myslím, že se to některým zdejším čtenářům může hodit…
No a pana Hercega rád poprosím, aby to též zkusil. Za sebe mohu konstatovat, že si takový článek s chutí přečtu, protože mne WPF zajímá.
Linux zblízka využívá WordPress MU a běží na Blog.zive.cz. Vytvořte si svůj vlastní blog
Sledování přes RSS: články
a komentáře
Partnerská sekce pro IT profesionály:
Microsoft TechNet/MSDN