Pár důvodů, proč nemám rád .NET a C#

Ti, kdo mě alespoň trochu znají, tak už to o mně dávno ví. Jsem javista a vyvíjím pod linuxem. Kdykoliv mám vyvíjet pod Windows tak nadávám. A co teprve, pokud mám vyvíjet v jazyce či na platformě, kterou si sám Microsoft vytvořil. A k nim pochopitelně patří i jazyk C# a platforma .NET.

Vzhledem k tomu, že jsem nyní nucen příležitostně v tomto jazyce vyvíjet, mám alespoň částečnou možnost srovnávat. Srovnávat C# s Javou. Ale taky s tím, co by – podle mě – mělo být správné, nebo co by se mně osobně líbilo.

Vývojář

Microsoft. To je kapitola sama pro sebe (a že pokud nebudu po uveřejnění toho článku ukamenován, mám v plánu něco napsat). To, že je celá platforma .NET v režii společnosti Microsoft beru jako jednu z nejvýraznějších nevýhod. Jednak člověk na každém rohu naráží na totální přešlapy, které jsou pro produkty Microsoftu typické. A pak – platforma, která je vyvíjena jednou(!) a ještě navíc komerční(!) společností, to nemůže vést k ničemu dobrému. Je to jako být si sám sobě oponentem u akademické práce nebo plodit potomky se svou vlastní sestrou. To zřejmě eliminaci oněch přešlapů moc nenapomáhá.

Co však asi napadne každého: uzavřenost, nepřenositelnost a nerozšiřitelnost. Pro mě jako pro javistu je to naprosto nemyslitelné. Na druhou stranu – abych zase jen nekritizoval – tyto tři vlastnosti vedou i k výhodám, jako je optimalita a odladěnost.

Vývojové prostředí a nástroje

Microsoft vydává vlastní vývojové prostředí, Microsoft Visual Studio. Už jen ten název – co má společný vývoj software se slovy vizuální a studio (s názvy produktů si obecně v Microsoftu hlavy nikdo moc neláme – stačí říct Internet Explorer nebo Windows)? Má to prý umět úplně všechno. To asi ano (ač jsem nikdy nepoužil víc jak 5% toho, co by asi tak mohlo nabízet), takže je těžkopádné, náročné a často pomalé.

Opomenu-li některé dle mého názoru fatální po uživatelské stránce pochybení (např. IntelliSence, rádoby kontrola kódu ještě před překladem, nebo našeptávač, který v základu našeptává všechny identifikátory, na které kde narazil), tak – jedno IDE je prostě špatně. Znám spoustu lidí, co na MS VS nadávají, ale – prakticky nemají možnost změny.

A to ani nemluvím o úplné absenci nějakého jednoduchého (ne nutně konzolového) nástroje. Čekám, kdy budu muset spouštět VS jenom proto, abych opravil překlep na webové stránce. Nemluvě o migraci projektu („solůšny“) mezi verzemi VS a vůbec – celý deployment aplikací. Pro Javistu, obzvlášť pracující na libovolném unixu, je projekt složka se zdrojovými kódy (a dalšími „resources“) a obvykle jeden konfigurák, který se stará o projekt jako takový. IDE slouží jen jako nástavba, není žádný problém se o veškerou konfiguraci a deployment projektů starat ručně (vše je standardizováno a zdokumentováno).

Jazyk C#

Nu, můj první dojem (který trvá doposud) byl: „Oni se asi drží pravidla čím kratší kód, tím míň chyb.“ A tak do jazyka vkládají spousty udělátek, které jej komplikují, ve snaze snížit délku napsaného kódu. Programátor je tak obtěžkán nutností myslet také na prvky jazyka, nikoliv jen čistě na programování.

Také často říkávám, že C# je slátanina VisualBasicu a C++. Hraje si na vysokoúrovňový jazyk, ale přitom používá tak primitivní a nízkoúrovňové nástroje, jako je např.  :  (zápis pro dědičnost) namespace  či enum  a struct . Namespace působí, jako nástroj, který má zabránit kolizím názvů a ne jako nástroj pro strukturizaci projektu. Výčty sice najdete i např. v Javě, ale mnohem propracovanější a použitelnější. Struktury Java nemá vůbec – v Javě je (kromě primitivních datových typů) všechno objekt.

Vlastnosti – nástroj, který má programátora ušetřit od psaní zapouzdření. Jenže i zapouzdření jsou metody. A proto by se s nimi podle toho taky tak mělo zacházet. Gettery mohou být parametrizované (a to často častěji než neparametrizované), navíc umožňují i smysluplnější pojmenování (např. find nebo create). Rozdíl klíčových slov  readonly , const a proměnné bez setteru nechápu doteď.

Třešničkou na dortu jsou pak kolekce. Tedy vlastně nejsou. Mám na mysli javovské kolekce, které totiž v C# úplně chybí. Většina C# programátorů říkává: „Když vím, kolik toho je, použiju [ ] , jinak List<> .“ A co když budu potřebovat rychle vyhledávat (přidávat, odebírat)? A nebo automaticky objekty uspořádávat? A nebo nemít duplicity? A v neposlední řadě – já osobně se polím vyhýbám jak jen to jde (vždyť je to prehistorický nástroj, který, jak známo, např. Python už nemá vůbec).

Závěrem

Je toho pochopitelně ještě mnohem víc. Například konvence – ostré závorky na samostatných řádcích mě vyloženě vytáčí, kód je pak strašně roztahaný – a tím i pro mě nepřehledný. Také mi vadí podtržítka v názvech proměnných a vlastnosti psané s velikým písmenem – tedy stejně jako třídy. Ale, co by jste chtěli, když nemáte  getProperty  a setProperty ? Hold je potřeba si dopomoct nějakým umělým způsobem.

Sečteno, podtrženo, C# na mě působí „neprofesionálním“ dojmem. To znamená, že se snaží co nejvíce ušetřit práci programátorovi na úkor toho, že ho často přiměje k porušení (resp. nedonutí k dodržení) některých nepsaných pravidel programování. Jeden příklad za všechny – klíčové slovo  partial . Proč používat další nástroj pro rozdělení kódu třídy do více souborů, když máme dědičnost a agregaci/kompozici? Pak člověk zjistí, že minimálně dva jeho kamarádi (a to programují v C# minimálně tak, jak já v Javě) nepoužívají, nebo používají nesprávně něco tak základního, jako je dědičnost.

Na druhou stranu, jak jsem zmínil na počátku – nespornými výhodami je fakt, že platforma .NET je odladěna na míru operačnímu systému Windows, takže je to (oproti Javě) určitě rychlejší. A díky tomu, že se nikdo nezabývá přenositelností, tak mnohdy i jednodušší (typický příklad – lomítka v cestách k souborům).

A to hlavní – vývoj je tak rychlejší a levnější (a z mé zkušenosti v C# programují lidé s nižší kvalifikací). Čímž se ovšem dostávám k tomu, že u programování se prostě musí přemýšlet, což si často lidé bez patřičného vzdělání moc neuvědomují. Zeptejte se třeba Donalda Knutha, koneckonců je to jeho myšlenka. Bez přemýšlení prostě programování nebude programováním, ale psaním příkazů do souboru. A mám pocit, že Microsoft se občas trošku snaží razit právě touto cestou.

Co se děje doma vám řekne aplikace HomeGuard

Odcházíte? Bojíte se, co se bude dít doma? Spusťte si aplikaci HomeGuard a máte po starostech.

Nu, nebudu to zbytečně natahovat. Začalo to tak, když mi začaly prázdniny. Dodělal jsem bakalářku a tak jsem se potřeboval „vrátit do normálního stavu“. To znamená z 30 hodin programování denně postupně přejít třeba jen na 5.

Štěkot In Absentia

Shodou náhod nám v té době na dveře zabušil soused se slovy, že ho ruší náš pes. Když nejsme doma. Tak jsem při příštím odchodu zapnul webkameru a po příchodu si projel záznam abych zjistil, co se doma děje, když tam nejsem.

Toto řešení napadne asi každého. Bohužel, kromě toho, že vám pak na disku zapáchá mnohdy několikagigový video soubor, nemáte moc možnost s tím, co se doma děje něco dělat.

Proto jsem přešel k opakovanému nahrávání kratších záznamů a jejich odesílání. Na odesílání jsem nakonec zvolil službu Dropbox, vzhledem k tomu, že je asi nejrozšířenější způsob jak zdarma, snadno a dostupně publikovat data.

Sepsat Bashový skript, který výše popsanou funkcionalitu bude obstarávat pak byla záležitost asi dvou hodin (myšleno včetně hrátek s UI a logováním). Bohužel, i když zbytku rodiny vysvětlíte, na co mají kliknout, aby „se to pustilo“, tak v momentě, kdy na ně vyskočí okno terminálu – byť vypisující potvrzující informace – rodina vytrhává ze zásuvky, skáče z okna nebo v nejhorším případě volá. No zkrátka rozhodl jsem se vytvořit grafickou nástavbu.

Vytvořil jsem tedy verzi 2 a to v Javě.

Příbalový leták

Po spuštění je načten konfigurační soubor. Pokud aplikaci spouštíte poprvé, je nutné aplikaci povolit přístup k vašemu Dropbox účtu. Jakmile povolíte přístup jednou, bude uložen a již jej nebude třeba vyplňovat znovu. Kromě toho se také uloží všechna nastavení, která změníte (intervaly nahrávání, názvy souborů a podob.).

Po prvním spuštění a potřebném přenastavení všech údajů pak už jen stačí aplikaci spouštět a rovnou zahajovat nahrávání. Nicméně doporučuji před každým spuštěním nahrávání do textového pole v pravém dolním rohu vepsat (a potvrdit stiskem klávesy Enter), kam vyrážíte. Pokud totiž nakouknete do adresáře aplikace, budete tak mít všechny záznamy přehledně uspořádané do adresářů.

 

Nahrávání

Pokud hodláte od počítače odejít, doporučuji klikat na „Spustit vše a skrýt okno“ namísto „Spustit všechny“. Aplikace se totiž skryje do systémové oblasti („dolní lišta“) a bude se plně věnovat jen a jen své činnosti.

Vzhledem k tomu, že se předpokládá, že s aplikací bude prováděna jen minimální manipulace (nastavování) a hlavní část její práce spočívá v nahrávání dat, byla navržena tak, aby po dobu nahrávání dat šetřila výkon počítače. To má za následek, že aplikace může působit pomalá.

Nastavení parametrů

 

Právě z tohoto důvodu doporučuji nechávat data nahrávat se skrytým oknem, protože pak vám „pomalost“ aplikace nebude tak bít do očí.

Pro šťouraly

Původně jsem aplikaci chtěl vytvořit značně modulární a rozšířitelnou. No, nakonec jsem se musel spokojit s vytvořením nějakého obyčejného API, díky kterému je teoreticky možné dodat další typ nahrávání (video, teplota?, průběh stahování, … cokoliv). Pro implementaci nových modulů slouží jako ukázka již hotové moduly pro focení a nahrávání zvuku.

Středobodem je rozhraní cz.martlin.homeguard.media.Media . Je třeba napsat MediaStreamProcessor , který na požádání vytvoří snímek/záznam (1 soubor k nahrání na Dropbox) (např. vyfotí fotku z webkamery). Dále je třeba vytvořit nějaký listener, který bude o průběhu informovat formulář (pokud není skryt) a případně i objekt s dodatečnou konfigurací (např. délka videozáznamu). To vše je poté nutné zaregistrovat ve třídách  MediasFooo a MediasToGui.

Vzhledem k tomu, že je aplikace open source, budu za každé rozšíření jen a jen rád. Jedna z věcí, která (a to určitě nejen) mně na aplikaci schází je podpora více webkamer – byť ji použitá knihovna webcam-capture přímo podporuje.

Také předpokládám, že nejsem zdaleka první, koho napadl potenciál mobilního klienta. Kromě grafického prohlížení záznamů by také mohl umožňovat změnu  nastavení nebo nahrávání úplně vypnout. Kdyby se našel androiďák/iOSař (bohudík Dropbox API „není“ implementované pro Windows), který se nudí, budu rád.

100% FREE DOWNLOAD HERE NOW

Upozornění: Spustitelná verze obsahuje záažnou chybu, kvůli které nejde spustit. Je nutné ji ji sestavit ze zdrojového kódu. Chyba bude co nejdříve opravena.
Spustitelný JAR soubor aplikace (zabalený do ZIP archivu) zde: Spustitelný soubor (HomeGuard.zip)

Poznámka: Pro spuštění je třeba mít nainstalovánu Javu (doporučená je verze 1.7). Stáhnout Javu.

Zdrojové kódy stáhnete zde: Zdrojové kódy (HomeGuard-src.tar.gz)

Moje další utilitky, především v Javě

 

Upozornění: Stále vyvíjím různé prográmky, aplikace a knihovny. Jen už neudržuji tuto stránku aktuální. Sledujte můj github!

Co vám budu povídat – prostě jsem přešel na Javu. Ale fak to už asi víte. Kromě větších (ze školních například Ročníkový projekt) prací si občas v Javě vytvořím i nějakou tu (konzolovou, samozřejmě) utilitku, která je moc složitá (nebo se mi s ní zkrátka nechce pitvat ;-)) na Bash nebo C. Tady je najdete, ke všem dodávám pochopitelně i zdrojové kódy:

Simple XML Breaker

Tento program vznikl pro účely testování ročníkového projektu a jeho ošetření možného chybného vstupu – XML souboru s daty (s uloženou hrou). Na výběr máte několik možných útoků (například odstranění náhodného řádku, vložení nesmyslného atributu nebo celé značky).

Simple XML Breaker zdrojové soubory

Simple XML Breaker spustitelný jar

 

plain2beamer

Mívám ve zvyku si psávat poznámky jako odrážky do běžného textového souboru, jen tak ve vimu (otevřít vim je pro mě záležitost asi 5 kláves). Nyní jsem však potřeboval sestavit LaTeXovou prezentaci v beameru – právě z těchto poznámek. Tak jsem si řekl, že začnu používat jednotný styl pro psaní těchto mých poznámek, které pak tímto programem přeložím do *.tex souboru, který poté mohu vysázet do *.pdf prezentace.

Například, dostal jsem přiděleno zorganizovat oslavu strýčkových narozenin. Sepsal jsem si tento seznam poznámek, který jsem si programem plain2beamer přeložil do tohoto texovského souboru a ten si nechal vysázet do úhledné pdf prezentace, kterou mohu prezentovat na některé schůzi organizačního výboru.

Původní verze:

plain2beamer zdrojové kódy

plain2beamer spustitelný jar

Verze 2.1 (a novější, pokud kdy bude):

Na githubu. Pozor, má trochu jiný formát (viz github).

Deskovka Dameo, můj ročníkáč

Před pár dny pro mě úspěšnou obhajobou ročníkového projektu zkončilo období terroru jménem „druhák na olomoucké informatice“, o tom však více v samostatném článku, který se připravuje.

Nyní je důležité, že můj projekt byl oficiálně přijat komisí a já jej tak můžu uveřejnit.

O co šlo?

Našim úkolem bylo sestavit kompletní aplikaci realizující deskovou hru (tedy něco podobného jako např. Solitare ve Windows). Deskovou hru příbuznou hře „dáma“. Z nabídky možných zadání her (Dameo, Havajská dáma, Fríská dáma, parašutistická dáma) jsem si vybral hned tu první – Dameo.

náhled


K aplikaci byly specifikovány určité požadavky (například umělá inteligence (počítačový hráč), možnost ukládat hru do souboru, možnost pohybovat se v historii tahů, a podob.) takže ve výsledku se z projektu měla stát opravdu kvalitní a plnohodnotná aplikace. V mém případě se tak opravdu stalo, ale předcházela tomu opravdu spousta, spousta, spousta a ještě jednou spousta práce.

Pánové, byl to porod

Projekt byl rozdělen do dvou semestrů, v prvním se mělo vytvořit jádro aplikace, které se poté v letním semestru mělo obalit ještě pár věcmi, mezi nimi uživatelským rozhraním (tedy „aby to i nějak vypadalo“).

Vzhledem k tomu, že jsem zimní semestr měl značně nabitý už tak, na „ročníkáč“ se dostalo až k jeho konci a především asi v první půlce zkouškového. Celkem to mohl být tak asi jeden celý měsíc práce, který jsem do něj investoval.

V letním semestru byla situace ještě horší – čas nebyl opravdu žádný. To dokonce takovým způsobem, že se na Dameo dostalo až v druhé polovině zkouškového, po splnění všech zkoušek. Další měsíc práce.

V součtu jsem do projektu investoval dobré dva měsíce práce. Dva měsíce. Celou jednu šestinu roku mě to stálo.

Tak na co čekáme? Pojďme si Dameo zahrát!

Let’s play

Nemohu si odpustit pár implementačních detailů. Aplikace byla vytvořena v programovacím jazyce Java – je tedy multiplatformní (takže bude fungovat jak na Windows, OS X, tak i na linuxu). Ale z toho vyplývá, že aby jste si Dameo mohli spustit, musíte mít nainstalovanou podporu Javy, tzv. běhové prostředí JRE. To je nutné si stáhnout z oficiálních stránek společnosti Oracle a nainstalovat. Zvolte verzi pro váš operační systém a pokud používáte 32 bitový, volte variantu „x86“, pro 64 bitový pak pochopitelně „x64“.

Poté už stačí jen Dameo stáhnout a normálně spustit. Není nutné nic instalovat, rozbalovat nebo tak něco. Prostě poklepe na stažený soubor a už hrajete. Samozřejmě uživatelé debian-like linuxových distribucí (neboť já se mezi ně řadím) si mohou stáhnout „instalačku“ (deb balík) a ten nainstalovat a mít tak Dameo na stálo v systému.

Dameo ke spuštění

 

Dameo.deb

Tamagoči – semestrální projekt do C#

Jsem značně znaven, takže jen opravdu velmi krátce – Předmět Úvod do programování v C# byl zakončen závěrečným projektem. Já jsem si vybral téma „Aplikace Tamagoči“, protože v požadavku bylo, aby aplikace byla schopna fungovat i bez okna („jen s ikonkou na liště“), což pro mě byla výzva, že si zkusím také něco neobvyklého.

Tamagoči, screen
Původní Tamagoči 1.2 ve Windows 7

Po asi týdnu práce (uprostřed zkouškového) jsem vydal a odevzdal verzi 1.2 a dostal zápočet. Pro zajímavost ji najdete ke stažení zde (zip, asi 1,3MB).

Pak jsem měl chvilku a tak jsem se vrhl na doladění pár detailů, které mi byly u zápočtu vytknuty. Vznikla tak verze 1.3:

Tamagoči (verze 1.3, 1.7MB, ZIP) – včetně dodatečné Sady zvířátek 1

Tamagoči instalačka (verze 1.3, 1.6MB, ZIP) – bez dodatečné Sady zvířátek 1, nedoporučuji, viz dále

Tamagoči 1.3, Linux
Tamagoči 1.3, Linux

 

Ta oproti předchozí umí ukládat a načítat zvířátka, pozastavit hru, a ještě pár drobností (například takový bezvýznamný detail, jako že za použití knihovny mono jede i na Linuxu).

V nové verzi je propracovanější výpočet délky života zvířátka. Nyní se může dožít přibližně 2 a půl tisíce dní, tedy necelých 7 let non-stop života.

Pokud si stáhnete „instalátor“, měla by se vám aplikace komplet nainstalovat. Bohužel takto nainstalovaná aplikace má par chyb, takže to moc nedoporučuji. Navíc, „ZIP verze“ obsahuje i další dvě zvířátka dodána dodatečně, která by jste museli stahovat dodatečně ručně:

Dodatečná Sada zvířátek  1 (0.3MB, ZIP) – obsahuje zvířátka Pikaču a Křeček

Jak se v přiloženém souboru píše, zvířátka stačí nakopírovat mezi ostatní a vše bude fungovat.

 

Poznámka:

Pokud používáte starší systém, což se projevuje tím, že vám aplikace nejde spustit, je nutné si doinstalovat Microsoft .NET Framework, který stáhnete například zde. Pokud by i tak byly s aplikací problémy, ozvěte se ;-).