čtvrtek 10. prosince 2015

Loadbalancing with Payara cluster and Apache2

I have tested the configuration on two operating systems - CentOS 7 and Kubuntu 15.10. These instructions are for CentOS, because there it is a bit more complicated.

All application server instances run on Payara 4.1.1.154 - two on CentOS 7 and one on Solaris5.10. Note that for correct cluster replication you need to have configured the multicast routing - or to have all instances on the same network ;)

1) You need to do this as root:
# aka apache2 and modules in debian linuxes
yum install httpd
2) You need time synchronization - one minute error is fatal. You can select another server for time sychronization - check also if it is accessible from the server.
yum install ntp ntpdate
chkconfig ntpd on
ntpdate pool.ntp.org
3) Edit the httpd.conf file and add two lines (use correct hostname, valid from the outside world):
vim /etc/httpd/conf/httpd.conf
ServerName myhost.mydomain.org
LoadModule rewrite_module modules/mod_rewrite.so

4) Edit httpd configuration file and put the loadbalancer settings in it. 
vim /etc/httpd/conf.d/00-default.conf
  • VirtualHost will run on port 80
  • you need some time to hold the session on one instance, where the user logs in - in this time the new session will be replicated to other payara instances in cluster. If the next request would be faster, the session would be invalidated. This is the reason why you need also the ROUTEID cookie - the stickysession changes it's value because a new session is created.
  • third internal host has status +H - that means "hot standby" - it will be routed only if other hosts would be inaccessible.
<VirtualHost *:80>
    ProxyRequests Off
    RewriteEngine Off
    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/; Max-Age=60;" env=BALANCER_ROUTE_CHANGED
    ServerName myhost.mydomain.org
    LogLevel debug
    ProxyPass /balancer-manager !
    ProxyPass / balancer://myhost.mydomain.org/ stickysession=ROUTEID
    ProxyPassReverse /  http://myinternal1.mydomain:8300/
    ProxyPassReverse /  http://myinternal2.mydomain:8300/
    ProxyPassReverse /  http://myinternal3.mydomain:8300/
    ProxyPassReverseCookieDomain myinternal1.mydomain myhost.mydomain.org
    ProxyPassReverseCookieDomain myinternal2.mydomain myhost.mydomain.org
    ProxyPassReverseCookieDomain myinternal3.mydomain myhost.mydomain.org
    ProxyPassReverseCookiePath / /
    <Proxy balancer://cisas1.lab.i.cz>
        BalancerMember http://myinternal1.mydomain:8300 loadfactor=1 route=int1
        BalancerMember http://myinternal2.mydomain:8300 loadfactor=1 route=int2
        BalancerMember http://myinternal3.mydomain:8300 status=+H route=int3
        Order Deny,Allow
        Deny from none
        Allow from all
        ProxySet stickysession=ROUTEID
        ProxySet lbmethod=bytraffic
    </Proxy>
</VirtualHost>
5) Allow the httpd service to access the outside world via TCP - without that you will get only HTTP 503 and some message in error_log that the action was declined.
/usr/sbin/setsebool httpd_can_network_connect 1
6) Run the httpd service (and loadbalancing) and watch logs
systemctl restart httpd.service
journalctl -xn
tail -1000f /var/log/httpd/error_log

Payara, aneb zmrtvýchvstání aplikačního serveru Glassfish

SunOne7

Glassfish má za sebou dlouhatánskou cestu ... první, s čím jsem přišel do styku, byl SunOne7. Ten vznikl jako výsledek spolupráce s Netscape a Oracle stále ještě udržuje jakousi stařičkou dokumentaci.

Jeho výhodou byla jedna z prvních podpor EJB (což se ukázalo i nevýhodou, jelikož tato technologie, tj. EJB2 byla prakticky nepoužitelná) a administrační GUI, které naopak použitelné bylo. Z něj se daly konfigurovat a spouštět i vypínat instance aplikačního serveru, čili na tu dobu šlo o vskutku "enterprise" řešení, které v té době nemělo obdoby.
Výhod bylo víc, například integrace JMS a dalších J2EE technologií, aktuálních v roce 2003.
Největší výhodou byla ovšem výborná stabilita. Tenhle aplikáč nám snad nikdy nespadnul, pokud nebudu počítat memory leaky v našich vlastních aplikacích.

Mezi nevýhody patřilo využívání nativních knihoven a tudíž možnost spuštění pouze na OS Solaris, Windows a RedHat 7.2. Rozchodit monstrum jinde vyžadovalo náhodné vyměňování nativních knihoven, než se administrátor "trefil" do konstelace, která fungovala.
A jedna nevýhoda fatální - zapomeňte na zdrojáky nebo artefakty ve veřejných úložištích.
No, pryč od toho ... užili jsme si dost srandy :-)

Sun Java Application Server 8

V roce 2005 přišly specifikace JEE5, JDK5, EJB3, JPA a další, díky kterým se stal starý aplikáč v podstatě mrtvou technologií. Sun se do toho vrhnul po hlavě, část implementací integroval od jiných autorů, část napsal sám - práce odvedl mnoho a velmi rychle, byť s diskutabilní kvalitou.

Tou dobou se už začínala probouzet konkurence - z největších aktuálních jmenujme WebSphere, WebLogic, TomEE, WildFly/JBoss, Jetty, a další. Mírně zastarávající seznamy s malým srovnáním viz wiki nebo wiki.

Přiznávám, že s touto verzí jsem neměl moc zkušeností, jen si pamatuji, že to byl takový mezičlánek, ve kterém byla spousta nedodělků a chyb. V principu to fungovalo, ale ...

Sun Java Application Server 9 aneb Sun Glassfish Enterprise Server 2

SJAS8 byl v podstatě prototyp. SJAS9, později přejmenován na SGES2, znamenal dotažení technologií do konce. Velké problémy byly s JMS (OpenMQ), což byl server provozovaný v serveru, při chybné konfiguraci se prostě zasekl. Důvody jste museli hledat mimo Glassfish, přičemž trvalo dlouho, než jste přišli na to, v čem je přesně problém.
Komunikace mezi GF a MQ probíhala přes porty, a variant konfigurací bylo mnoho, snad ani autorům původně nedošlo, jakou variabilitu jim to dává. To je ale námět spíše na jiný blog - stručně - triviální varianta je "embedded", resp. "zapouzdřený" server, složitá a škálovatelná varianta je "remote" server ...

SJAS9 přišel v roce 2007, zkraje se ještě stávalo, že "zůstal viset" právě díky JMS, později ale byly i tyto chyby vyřešeny a poslední verze SGES2.1.1 byla velmi stabilní a bezproblémová (pokud jí nedestabilizovaly vaše chyby ve vašich aplikacích ;-) ).

Hlavní výhody proti dřívějším verzím:
  • podpora clusteringu - bylo možné provozovat n instancí na m strojích, mezi nimiž se replikovaly sessions uživatelů a bylo možné např. postupné nasazení nové verze, aniž by došlo k výpadku (to samozřejmě mělo svá pravidla, o tom zase jindy).
  • žádné nativní knihovny - kde běží JDK5/6, běží Glassfish (jen občas narazíte na problémy např. s Windows).
  • propracovaná dokumentace
  • kompletní podpora JEE5

Glassfish3

V roce 2010 Oracle koupil Sun a všechno se změnilo. Již předtím jaksi "v ilegalitě" vznikl tzv. Embedded Glassfish, na který jsem narazil prakticky náhodou - kupodivu ve veřejných úložištích, a začal ho používat k integračním testům. Ano, stačil mi JUnit, abych mohl testovat EJB3 s JMS, JPA a se vším všudy!
Embedded Glassfish je totiž přebalené vydání Glassfishe3 do jediného jar souboru. Chybí mu pár XML, která se dají snadno dotáhnout z jiných závislostí a jedete - tak málo stačilo k odstranění největší výtky vůči "enterprise aplikačním serverům"!

Glassfish3 náš tým nakonec přeskočil, ale pomohl nám díky zpětné kompatibilitě se SGES2 právě s testováním.
Embedded Glassfish byl nakonec opět pohlcen Glassfishem a stal se součástí jeho buildu a repository.

V roce 2011 Oracle oficiálně vydal Glassfish3 jako referenční implementaci JEE6. Vzápětí se ale probral JBoss a prakticky Glassfish3 převálcoval.

Byrokracie Oracle navíc silně rozladila některé vývojáře a byla poslední kapkou k jejich přestupu - kam jinam - často k JBoss.
Po vyjádření Oracle o ukončení komerční podpory Glassfishe a o vyčlenění "clusteringu" pouze do komerční verze to vypadalo, že Glassfish prostě skončí, zemře, je konec. Jenže se ukázalo, že tak snadné to mít Oracle nebude ...

Glassfish4 - smrt ... NEBUDE!

Oracle totiž narazil na pár háčků. Nápad s clusteringem vyprovokoval poměrně hlučnou odezvu vývojářů i mimo Oracle, takže od něj bylo ustoupeno. Nápad s ukončením komerční podpory sice Oracle dotáhl do konce, ale nikoho to zase tak moc netrápilo, protože i má osobní zkušenost s komeční podporou Sun/Oracle byla velmi špatná (a je doposud).
Licence Glassfishe ale umožňovala alespoň pasivní přístup ke zdrojákům, a bylo otázkou času, kdy dojde k tomu, kdy je někdo vyžene na GitHub (ano, byl jsem to já, ale ukázalo se, že nejsem první, viz níže :D).

Druhý háček spočíval v tom, že komunita JEE stále potřebuje referenční implementaci a nikdo si jí nemohl jen tak přivlastnit a zamezit přístupu k ní ostatním.

No a poslední háček - všechny implementace JEE7 používají komponenty svých konkurentů. Weld vyvíjí JBoss. EclipseLink vyvíjí Eclipse+Oracle. Catalinu vyvíjí Apache. Pokud by Oracle "zařízl" Glassfish, patrně by nevydal už víc jak jednu jedinou verzi WebLogic, vývoj by se zbrzdil.

A tak v roce 2013 Oracle vydal Glassfish4 jako referenční implementaci JEE7. Změn nebylo mnoho oproti GF3, spoustu práce odvedli externí programátoři, Oracle se zjevně snažil investovat minimum. Čím více chyb v GF, tím lépe pro WebLogic.

Přišel rok 2014 a náš zákazník nakonec souhlasil s "upgrade". Udělali jsme skok z JEE5+JDK6+GF2.1.1 rovnou na GF4+JDK8. Ukázalo se, že to není až tak snadné díky chybám, které ve zdrojácích zevlovaly už od Glassfishe3, čili často 5 i více let.

Payara

Začal jsem zkoumat licence a možnosti, jak se dostat do SVN. Po dnech a nocích, kdy se exporty po různu zasekávaly a padaly díky vadné integritě dat v SVN Oracle, se mi to nakonec podařilo. Nakonec jsem posílal patche přímo do JIRA ... a odezva ... na přijetí jsem čekal nějaké 3 měsíce.

To mě moc nebavilo a proběhla komunikace s šéfem Glassfishe Rezou Rahmannem - pravda, překvapilo mě už, že se se mnou baví, ale ještě víc mě překvapilo, že mě nasměroval na Steva Millige z C2B2 a Payaru.
Po další komunikaci byla moje oprava přijata během 3 dnů do Payary.

Po zastavení komerční podpory Glassfishe se totiž Steve rozhodl, že jí tudíž začne poskytovat sám. Udělal stejný krok jako já, převedl SVN na GitHub, domluvil se s Rezou, a postupně se k němu přidali další a další lidé z komunity, včetně mě.

Tým Payara a jeho přispěvatelé od té doby opravili spoustu chyb a jen tak mezi řečí pomalu posouvají Payaru dál ke specifikaci JEE8. Objevily se požadavky pro podporu Javy IBM, podporována je i Oracle JDK8 (původně 7), opravy se promítají zpětně do Glassfishe od Oracle a samozřejmě - existuje placená podpora, které bych vytkl jen to, že její ceny jsou typicky "enterprise", leč konkurenti nejsou levnější.

Krom toho žije dál i Embedded Payara a vznikly i další distribuce, většinou osekané o nepotřebnou funkcionalitu.

Nakonec vzniklo i toto zábavné reklamní video:

Placená podpora

Na druhou stranu, za Tomcat podporu taky neplatíte, že? Ale to, co umí Payara rozhodně neumí ;-)

Ve výsledku placená podpora slouží hlavně k čestné podpoře profesionálních týmů, které se o tyto projekty starají. Proto pokud pracujete na projektech pro velké firmy či stát, měli byste podporu platit.
Ve skutečnosti sice nezískáte větší podporu, než máte, leč přispíváte tím k tomu, aby aplikační server, který používáte, mohl být dál vyvíjen a udržován, tj. abyste po dvou letech nezjistili, že projekt prostě skončil a vy jedete na mrtvém koni. Což není tak málo, když si to tak vezmete, ne?

V tuto chvíli to vypadá tak, že C2B2 míří mezi velké firmy. Její vývojáři konzultují chyby ve Weld i EclipseLinku, komunita si vypomáhá, zatímco Oracle si stále něco plácá na svém písečku a o ostatní se moc nestará, ale možná je to jen můj pocit ...

Budoucnost

Kdyby někdo měl pocit, že na to má, tým Payary shání vývojáře. Já tam zatím nejdu, mám svůj boj jinde, který navíc slouží jako výborný obří reálný testovací příklad pro Payaru. A zatím můžu říct, že se všichni lepšíme.

Momentálně Websphere, WebLogic ani WildFly neumí všechno, co umí Payara. Možná umí něco navíc, možná něco umí lépe, ale ne dost na to, aby mělo cenu přecházet. Zvlášť když je Payara možná ještě převálcuje :-)

Řekl bych, že i Oracle na to nakonec nutně přijde a bude muset se k tomu postavit čelem. Těžko může komplikovat práci ostatním skrz licence, spíše bych hádal, že se C2B2 pokusí koupit a zklikvidovat, pokud tato konkurence začne být až moc silná.
Dokud ale bude Glassfish na GitHub, bude velmi těžké jeho "lepší klony" kontrolovat, uzmout zpět, takže tahle cesta Oracle asi nepomůže, ne na dlouho. Glassfish není jediný takový projekt, open source se dá sice všelijak poškodit, ale jen stěží kontrolovat, pokud má pod nohama tak silnou infrastrukturu, která má navíc pozitivní efekt i pro komerční obříky.

Časy se mění ... jedno riziko bych tu ale viděl - a tím je paradoxně TTIP (v odkazu TPP, což je podobná dohoda) a různé formy kontroly internetu. Představte si, že vám vláda zablokuje, omezí nebo zpoplatní přístup na GitHub ... že je to paranoidní nápad? Možná - ale třeba tlak například na omezování síly šifer už tu dávno je.
Mimochodem, na některé weby a videa se nedostanete už teď. BBC blokuje přístup na (některá?) videa mimo UK, Youtube "tají" videa před Němci, atd. - co nevidíme, o tom nevím, tohle jsou jen zkušenosti, na které jsme narazili náhodou s kamarády v zahraničí.
To je ale už úplně jiné téma ...

pátek 4. prosince 2015

Izace aneb o zvyšování hlasu místo argumentace

Děje se něco, co bych možná nazval "izací" lidí. "Izace", to jako bolševizace, katolizace, islamizace, tj. zfanatizování části obyvatelstva, které pak pohrdá, ponižuje, trestá, deptá a nakonec někdy i vraždí jiné části obyvatelstva, které považuje za něco méněcenného.

Ne, ne, žádná konspirace, nic shůry ani zezadu, je to od vás, lidí, přátelé.

Když s vámi někdo nesouhlasí, budete muset naslouchat a pak si dát práci a hledat argumenty. Nestačí říct "ty jsi zmanipulovanej" ani "ty jsi blbej" ... rusofil, rusofob, levičák, pravičák, debil, hňup, ...

Vážně si myslíte, že tímhle někoho přesvědčíte? A když už jsme u toho - vážně je nutné někoho přesvědčit, zlomit, předělat? Není už docela fajn, že přestože se neshodnete, vyměňujete si poznatky, informace, znalosti, něco se dozvídáte?

Ono totiž právě ty znalosti jsou důležité ve vzdělané společnosti, ne to, komu fandíte.

Bez diskuze a vzdělání žádná demokracie nemůže existovat.

úterý 15. září 2015

Vyhodit Maďarsko a ČR z Evropy? Prima nápad ...

Nemám rád aroganci. Že prý Maďarsko má být "vyhozeno z Evropy". A ČR taky.
Důvod: odmítání kvót na uprchlíky.

No tak to prrrr ...

Pominu slovíčkaření, třeba že Evropa je kontinent a těžko z něj nějakou zem vyhodíte.

Za prvé "soudruh" z Lucemburska nějak pominul, že imigranti stojí hlavně o Německo. Aby ne, když průměrná mzda je tam zhruba trojnásobná, ceny srovnatelné, daně progresivní, sociální systém celkem štědrý a hlavně funkční, a chování úředníků korektní a obvykle uctivé, a i občané jsou tak nějak vstřícnější.

A proč?

Protože velké část německého hospodářství stojí na práci odvedenou v "satelitech" - jako jsme my, Slovensko, Rumunsko, zkrátka bývalý východní blok. Jakákoliv produktivní činnost je řádově hůř placená než prodej výrobků. My makáme, neměčtí majitelé prodávají. Produktivita práce nijak nesouvisí s tím, jak moc se v práci flákáte, resp. ano, můžete jí tím výrazně snížit, ale pokud jste kdy byli na nějaké brigádě ve fabrice, víte, že je často problém odskočit si na záchod, natož proflákat půl dne.

Češi většinou žijí v daleko větším stresu, drží se práce, nemají rezervy, žijí od měsíce k měsíci. Jsou nervní, podráždění, závistiví, mají sklon podvádět a "přilepšovat si". Stačí to? Netačí. Všechno má své příčiny a důsledky. Češi skřípou zuby a vrčí, ale stejně si sobě navzájem i jiným pomůžou. Většina jich ale řeší starosti s živobytím, proto jsou tak protivní proti těm milým Němcům.

Musí to tak být? Nejde to změnit? 

Špatná zpráva - musí, nejde, resp. velmi těžko. První z obrovských hříchů Klause bylo jeho tvrzení o utahování opasků a dohánění Německa. Byla to lež, nejspíš vědomá.

Výhody

Výhoda toho, že Češi makají a Němci prodávají, je prostě v tom, že se uživíme. Máme velmi malou nezaměstnanost. A tu máme malou, protože jsme zatím konkurenceschopní. A konkurenceschopní jsme, protože výroba u nás stojí málo. Proto máme taky malé mzdy. Kdyby se zvedly, firmy jdou jinam, práce nebude, a proti obřím koncernům nějaká malá česká firmička prostě nemá šanci.

Nevýhody

Tlak na nízké mzdy je tak velký, že je pro dělnickou rodinu problém poplatit nájem, elektřinu, děti, dopravu do školy a do práce, natož když nebydlíte ve velkém městě. Taková rodina navíc nemá ani kupní sílu, takže nás do velké míry živí export ... kromě aut hlavně export polotovarů do Německa.

Uprchlíci

Pokud si někdo myslí, že uprchlíci jsou nějací nevzdělaní blbci, je na omylu. Hlavně ti syrští umí často tři jazyky a vzdělání v Sýrii bylo před válkou na slušné a stále se lepšící úrovni. Podobně i v řadě afrických zemí se vzdělání poslední dvě desítky let výrazně lepšilo. Ne už tak životní úroveň, jelikož pro "rozvinuté země" byly tyto "zaostalé země" hlavně zdrojem levných surovin. A jsme zase u toho - levné suroviny, to znamená nízké náklady na jejich získávání, tzn. levná pracovní síla, mizerná ekologie, využívání korupce.

Ti lidé mají dvě možnosti - bojovat se systémem, nebo utéct do jiného. A tak se část lidí přidává k Islámskému státu s vidinou odstranění korupce a zavedení přísné spravedlnosti (asi jako to slibovali bolševici a náckové), a část utíká pryč z dosahu tohohle šílenství.

A kam utíkají? Přece do Německa, protože tam věci fungují správně. Proč ne do ČR? Odpověď je výše, kompletní, to všechno jsou argumenty. Utíkali byste sem, kdyby hned vedle byl fungující systém?

Kvóty a propaganda

Česká politika se ironicky rozdělila na dva tábory. Jeden křičí "vítáme uprchlíky" a druhý "uprchlíky nechceme". Oba tábory mají spoustu platných argumentů, ale oba naprosto ignorují všechno, co jejich nadšení či rozhořčení nenahrává.

Vrcholem pak je propaganda "západní", která dělá z "východního bloku" bandu nesnášenlivých xenofobů a blbců. Krom toho, že tu opravdu těch xenofobů je docela dost, pomíjí ale i to, že část toho strachu je opodstatněná - nikoliv ovšem strachem z jinakosti, ale z toho, že ekonomická situace chudých tu bude ještě horší.

Absurditou jsou potom kvóty, které uprchlíky berou jako statistickou položku, která nemá nárok cokoliv chtít. Je jedno, jestli uprchlík chce důstojný a dočasný azyl, nebo jestli se chce usadit v jiné zemi. Je dokonce jedno, že se místní lidé právem bojí, že o jejich mizerné pracovní místo začne bojovat mnohem levnější a nenáročnější konkurent. Pro politiky jsou lidé jen čísla, papíry, lejstra.

Migrace jako taková

Aby toho nebylo málo, dotknu se ještě jedné věci. Žili jsme v poměrně klidném stabilním období, ale migrace byla vždycky součástí lidského chování, nejen lidského. I hmyz, ptáci, vše je v pohybu. My jsme si kdysi vykolíkovali nějaká území, tisíce let se handrkujeme o kolíky, zatímco lidé, člověci, celou tu dobu ... migrují. Emigrují, to jako ven, a imigrují, to jako dovnitř. A pak tu máme exil (vyhnanství) a jiné specifické druhy migrace.
Zkrátka, pokud si myslíte, že jako národ máte nárok na nějaké pevně vykolíkované území, jste na omylu. Ono vůbec "národ" je věc tak trochu umělá, přiznejme si to. To je trochu náročné téma, lidé neradi opouští tu myšlenku "pospolitosti" stáda svého druhu, ale ...

Naše kultura už prakticky neexistuje, neudržovali jste jí, zapomněli jste na ní u televize. To je něco, co si taky nejsme ochotní přiznat. Křesťanské základy? Ale no tak, najednou jste si na ně vzpomněli? A co to je? Jakýsi vágní pojem, do kterého se snažíte nacpat teoreticky dobré věci, které většina z vás stejně porušuje. Lžete a lžete.

Migrace tu zkrátka je. A je tu taky konec fungování světa, jak ho známe. Lidé z nejchudších zemí světa si uvědomili, že jsou kraje, kde se dá žít, pracovat, uživit rodinu. Jsou skromnější i oprsklejší, umí lhát i krást stejně jako my, jen k tomu budou mít možná o něco větší sklony, neb jak se říkávalo, "bída z lidí lotry činí".

Fyzikálně řečeno, příroda tíhne k rovnováze. O nerovnováze mezi "rozvinutým" a "třetím" světem jsme slýchávali léta z médií, nezajímalo vás to moc, že ne? Taky co by na tom jedinec změnil, že?

Terorismus

Terorismus je válkou chudých proti drtivé převaze mocných. To není obhajoba, chraň bůh, ale spíš konstatování. Děsivé konstatování. S imigranty i bez nich riziko terorismu poroste tak, jak se bude stupňovat tlak na "vyrovnání světů". Líbit se nám to nebude, ale to bude tak všechno, co zmůžeme. Budeme muset lépe platit za africké suroviny, budeme muset ustoupit z představy, že my jsme ti chytří a rozvinutí a "oni" budou držet hubu a makat.
Nadvláda "rozvinutého" světa zkrátka končí. Pomáhá tomu i Čína, kterou stále tak trochu opovrhujeme, zatímco ona si pomalu skupuje naše krachující firmy. Pomáhá tomu tak, že v zemích, které "rozvinutí" prostě korumpovali, buduje infrastrukturu.

Eskalace nenávisti vůči Evropě a Severní Americe je otázka poměrně krátké doby, týdnů, měsíců. Jak moc tomu sami pomůžeme je na nás. Stavění plotů ale problém nevyřeší, jen malinečko zbrzdí ...

Řešení

Není. Evoluce zkrátka nemá řešení. Nezná ani žebříčky, hitparády, je jí to jedno. To ale neznamená, že na ní nemáme vliv. Osobně bych byl pro to, aby se lidem ze zemí, kde je válka, pomáhalo, a zároveň vznikl enormní tlak přes OSN na zastavení konfliktů a umožnění návratu. Dál je na OSN, aby našla dostatečně silnou páku, jak si vynutít mír. Bohužel, velmoci zatím skrz OSN jen hrají šachy proti sobě navzájem.

Co se týče imigrantů, držel bych se stávajících zákonů, tj. trvalá imigrace je možná, pokud tak rozhodně úřednictvo. Podrobnosti viz paragrafy a vyhlášky, nejsnáz asi přes stránku OAMP.

Též bych podotkl, že cizinci, kteří se přistěhovali ze země mimo EU, to u nás rozhodně nemají jednoduché. Čeká je obrovská byrokracie, šikana ze strany firem (nižší platy), placení za ošetření v nemocnici, dražší pojištění, neustálé kontroly dokladů, a nakonec kyselé ksichty xenofobních Čechů, v horším případě nadávky či napadení.

Moje soukromé řešení je jedno jediné - snažit se chápat, co se děje, chovat se jako kulturní lidská bytost, pomáhat lidem, které považuji za sobě rovné, a nepomáhat lidem, které považuji za zlé, těm velmi zlým páchání zla výslovně kazit.

Na tom hodnocení lidí se nemusíme shodnout, ale s tím nemám problém.

pátek 28. srpna 2015

Český fanatismus

Svět je plnej bláznů. Třeba já. Stoupnu si mezi komunistku a někoho, kdo nenávidí komunisty. Jeden tvrdí, že disidenti se měli jako v bavlnce, druhý jak tu všichni strašně trpěli a komunisti by měli viset.

A tak první sdělím, že se by se jí možná líbilo vyhrožování znásilněním při výslechu, následně uvěznění "jen" na půl roku, aniž by cokoliv trestuhodného provedla. A druhému, že zatímco u nás se dávaly běžně několikaměsíční tresty, v Jižní Americe zmizely desetitisíce lidí, spousta jich byla mučená, zavražděná. Odpůrci režimu se běžně stříleli. A teď si podejte ruce a jděte do háje, demagogové plní žluči.

A jindy zase katolík a ateista. Podle mého soudu je dnes ateismus nejzoufalejší víra vůbec, jsou to nejagresivnější a nejarogantnější lidé. Katolíka uráží, nadává mu do blbečků, ovcí, naivků, přitom sám je věřícím, tj. věří, že žádná vyšší moc, žádný bůh, bohové, ani strašidla, nic, nejsou. Jak to může vědět? Neví. Neví daleko víc věcí, často nerozumí fyzice, matematice, nikdy neslyšel o tom, jak málo hmoty vesmíru dokážeme nějak identifikovat, jak málo známe její původ.
Když se pak ateistovi řekne, že náš největší popularizátor astronomie Jiří Grygar je věřící, shodí to ze stolu s tím, že je to tím pádem magor.
Většina věřících, nejen katolíků, ale i židů nebo muslimů, které jsem poznal, se o víře prostě nebaví. Je to jejich víra, a nikomu do ní nic není, nikdo nemá právo jim jí zpochybňovat; od toho je to totiž víra. Všímám si ale odlišností mezi těmi, kteří věří ve "vyšší moc", a těmi, kteří věří tomu, že žádná není. Ti první bývají klidnější, vstřícnější, láskyplnější, a taky přejícnější. Něco jim jejich vlastní víra, ať už oprávněná nebo neoprávněná, dává. Ve výsledku pak ale o to, jestli ta vyšší moc je nebo není, vůbec nejde.

Co se mě týče, dlouhodobě říkám, že vyznávám čistě vědecký přístup, což znamená, že nevím. Ano, já nevím. Nemám dost informací, abych cokoliv z toho potvrzoval nebo vyvracel, ale měl bych být připraven, že taková možnost tu je. Ale v něco přeci jen věřím - zkrátka od srdce si myslím, že má smysl být dobrým člověkem. Nepotřebuji k tomu církev ani perfektní znalost fyziky, mentory ani kazatele, je to prostě moje víra a nikdo mi jí nezpochybní.
Nevím spoustu jiných věcí a tak se o ně zajímám. Nikdy nebudu vědět všechno, ale něco uvnitř mě žene pořád dál, a tak se dívám na historii náboženství, režimů, velmocí, sleduji ptactvo za oknem, přemýšlím nad historií stromů na zahradě i v sadech a alejích, nad tím, kam a odkud teče voda, rozebírám a skládám auta, a ano, moje profese, programování ...

Čím víc toho vím, tím víc se obávám fanatismu, lidí, vysedávajících před televizí, kde dostanou svou porci zpráv, nebo u Facebooku, kde vstoupí do sobě ideologicky blízkých skupin, kde se utvrzují a zatvrzují ve své původní domněnce, která přerostla v názor. Nikdy se nedozví, že polovina informací, které si tam přečetli, je falešná, smyšlená, a třetina vytržená z kontextu. To by totiž museli zároveň do skupiny zaměřených přesně obráceně - ale když to zkusí, po první větě je odtamtud často vyženou, zesměšní, nadají jim do blbů a ovcí.

Dobře, ale jak z toho ven? Televizní vysílání nezrušíme, Facebook nevypneme, konec konců sám na něm jsem. A začínám u sebe - ubrat plyn, nehádat se, diskutovat, stavět proti sobě argumenty, ne lidi. Není třeba každému "zlomit", předělat jeho názor na svůj, "vyhrát" diskuzi. V kvalitní diskuzi vyhrávají oba, navzájem se něco od sebe dozví a možná trochu upraví svůj názor. Na tom stojí funkční demokracie - a ta naše zrovna dvakrát funkční není. Nezměníte to ale žádnou revolucí, ale jedině evolucí, vývojem.
Myslím si, že náš národ v tomhle má historii dobrou, a je to důvod, proč tu komunisté nebyli dotlačení až k takovým jatkám jako v jiných zemích. Režim tu nebyl tak tvrdý a ani z druhé strany se tu nepěstoval terorismus (snad s výjimkou Mašínů), protože tu aspoň nějaká diskuze vždycky byla. A je to zásluha všech občanů téhle země, komunistů i nekomunistů.

A ještě trocha lingvistiky - zamyslete se, co mají společného slova fanda, fanoušek, fanklub, fanatismus, fanatik.

Přeji všem pěkný den, bez ohledu na to, jak moc se mnou nesouhlasíte! ;-)

neděle 22. února 2015

Refaktoring, část III.: HashMapové peklo

Proč?

Protože HashMap je objekt, do kterého lze vložit leccos. A to doslova leccos, a vždycky pak musíte předpokládat, že tam různá leccos jsou. Vy ale máte objektový jazyk (nebudeme slovíčkařit), a tak pro objekty obvykle nacházíte jména, definujete jejich chování a vlastnosti. A to je to místo, kde to skřípe - mapa je něco, co objekty dostává s nějakým klíčem a pod tím klíčem je zase vrací. A je v tom fakt dobrá - jenže vám neumožní nic víc.
Je je to jako kdybyste v kuchyni měli obrovský pytel a do nej házeli nákup - pytel brambor, konzervy, kořenky, láhev piva a láhev mléka ... a když něco chcete, otevřete pytel a hledáte. Možná těch pytlů máte více a všechny vypadají stejně.
Mapy jsou zkrátka vhodné na vkládání neomezeného počtu věcí ideálně stejného typu pod klíčem stejného typu a pak k jejich vyhledávání podle tohoto klíče.

Naopak nejsou vhodné na vkládání omezeného množství dat, které navíc dokážeme snadno pojmenovat, odlišovat, známe chování, možnosti, můžeme (a chceme!) ho dokonce zdokumentovat, ať už méně nebo více.

Jak takové peklo vzniká?

Jak jinak, vzniká z lenosti programátora - kterému přijde hloupé a pracné zakládat spousty nových tříd, které mají jen atributy a k nim příslušející gettery a settery. Ten pak udělá v nejhorším případě toto:
Map data = new HashMap();

Samozřejmě pak nevíte, co v datech máte, a musíte pořád dokolečka hledat klíče a všechny možné varianty typů hodnot, které se mohou vyskytnout.

Nicméně i když onen programátor mapu otypuje, čili vytvoří
Map<String, String> data = new HashMap<>();
nemáte vůbec vyhráno. Pořád totiž nevíte, pod jakým klíčem je třeba příjmení osoby ... a jestli tam vůbec je. Ani konvence vás nezachrání, pořád to může být surname, lastname, lastName ...
Napsat pak takový kód lze samozřejmě celkem rychle, pokud nevyvíjíte něco složitého, ten den to udržíte v hlavě. Dokonce na to lze napsat testy, nicméně nic z toho vás nevysvobodí, až se v kódu po půl roce provozu objeví chyba a vy nebo někdo jiný jí bude muset opravit. Nebo ještě druhá varianta, dostane za úkol ho rozšířit o další funkcionalitu ... najednou se projekt prodraží a nikdo nedokáže říct ani řádově přesný odhad, kdy to bude hotové.

Pokud pak používáte JSP, výsledek programátor nejspíš strčil do pageContext, což je vlastně taky hash mapa, resp. celá hierarchie map, které kontejner průběžně zahazuje nebo maže dle kontextu.

Pokud takový kód psal externista, je nejspíš už bezpečně daleko ... a je to vaše starost.

Jak z toho ven?

Tohle určitě nechcete slyšet, ale máte smůlu - čeká vás dřina!
Pokud používáte JSP, jakkoliv tuto technologii spousta lidí nemá ráda, vám tentokrát pomůže. Ona se totiž dívá na typ objektu, se kterým zrovna pracuje - pokud je to Map, zavolá get("xxx"), jinak zavolá getXxx(), takže jí můžete pod rukama prohodit instance v kontextu, a ona se přizpůsobí.
I tak to ale bude dřina, nicméně tady je její druhá hranice - pokud tedy programátor nevymýšlel jiné šílenosti, ty by jinak bylo vhodnější vyřešit předem ...

Pak už nezbývá než otrocky si na papír vypsat všechny klíče, které se v mapě vyskytují, mapu nahradit vhodně pojmenovaným objektem, a připravit pro klíče stejnojmenné settery a gettery; pozor, přejmenovávání doporučuji nechat na později!
Pokud si nejste jisti typem atributu, pro začátek doporučuji třeba String - kompilátor vám už v editoru vyznačí, kde to nesedí. Naopak Object nedoporučuji, protože se o případné chybě nedozvíte.

No a to je vše. Je? Není. Ještě musíte vychytat některé důsledky. Co když někdo volal isEmpty(), size(), používal výstup z put()?

Mně mapy ale nevadí

Někteří lidé pořád nechápou, co je na tomhle použití map špatně. Tak ještě ... nemůžete plně využít dědičnost, overloading, generiky, přidávat objektům metody, atd. Zkrátka to, co vám jazyk umožňuje, využíváte jen z malé části, neefektivně. Dokonce to hloupoučké maličké leč poctivé POJO zabírá i méně místa v paměti ...
Ale hlavně - čitelnost kódu, to, že vždycky víte, s čím pracujete, kolik to má metod a jakých, co to dělá, k čemu to je, to je to, kde mapa vždycky prohraje, říkajíc
"No, vy mi něco dáte, řeknete mi, jak to poznám, a až to budete chtít, tak já vám to zase vrátím. Jo a taky vím, kolik už toho držím. Co? To není moje starost ... že mám reprezentovat osobu a vracím vám SPZ? Tomu já nerozumím, co mi je do toho?! Když mi dáte konexi do databáze, budu jí držet taky, no a?! Umím to, všechno udržím!"

Řekl bych, že v ten moment tomu nerozumí i někdo jiný ... a ten bude autora kódu proklínat - že na to nevěříte? Jóó, kdo ví ... ;)