sobota 26. ledna 2013

Lid si zvolil prezidenta, co dál?

Úvodem

V prvním kole jsem volil p. Dienstbiera. Faktické důvody byly následující:
  • hrubá shoda v názorech
  • schopnost a ochota říkat, co si myslí, a reagovat v diskuzi
  • dosavadní morálka
  • slabá podpora ČSSD (zesílila až pár týdnů před volbami, možná ze strachu před Zemanem); můj pocit dluhodobě je, že vedení by se Dienstbiera nejradši taky nějak zbavilo.
Samozřejmě i u něj mám pár otazníků a budu ho nadále sledovat. Například financování ČSSD - odkud ale pochází tyto peníze, čili kdo financuje ČSSD?

Ve druhém kole jsem nevolil. Rozhodl jsem se, že nehodlám volit "menší zlo", neboť je pořád zlem. Je mi jasné, že ve výsledku jsem tím nevolil pro nikoho ani proti nikomu a můj hlas se rozplynul v pouhé "nevím" - nicméně osobně to člověk vnímá přeci jen trochu jinak.

Suma ... 

Vypadá to, že ve volbách je rozhodnuto a prezidentem bude Miloš Zeman. Člověk, který má přehled, vzdělání, zkušenosti, ale taky je obklopen řadou přinejmenším podezřelých osobností, ze kterých člověk nemá nejlepší pocit a jeho vyjadřování je často poněkud přehnaně přímé a neomalené. Člověk, který spoluzavedl totalitní opoziční smlouvu,
Prohrál člověk, který má též obstojný přehled, má silné finanční zázemí, ale který prosazuje věci, které ještě před volbami vadily i velké části jeho podporovatelů, a který byl vydatně propagován stylem, který připomínal spíš reklamní kampaň.

Co mi vadilo

Argumenty autoritou

"Argument autoritou" se obecně považuje za jeden z argumentačních faulů. Faulující se tak odvolává na názor někoho jiného tak, jakoby názor toho jiného byl faktickou výhodou pro jeho vlastní názor.
Konkrétně před volbami šlo o všelijaká zdůrazňování podpory, že Fischer a Franz podporují Zemana, že Svěrák a Fischerův tým (ale Fischer ne) podporují Schwarzenberga ...
Tím u mě malinko zabodoval pan Franz, jenž se právě vůči tomuto ohradil - pro mě to značí, že uvažuje demokraticky a vyžaduje, aby jeho názor nebyl vystavován nad názory jiných.
Pro změnu pan Vetchý sice spam nejspíš osobně neposílal, ale jelikož se nijak neozval, nejspíš byl spam rozesílán s jeho souhlasem. PEN klub dokonce vypustil stanovisko bez respektu k různým názorům svých členů, stejně tak i další organizace.
Jedna věc je, když osoba řekne svůj názor. Druhá ale je, když tento názor někdo vezme a zdůrazňuje ho tak, jako kdyby jiné názory jiných lidí měly menší váhu. Je snad Schwarzenberg lepší tím, že ho někdo volí? Ne!

Reklama

Hromady klišé, často v rozporu s dřívějším chování politika. Proč žádný z bohatě sponzorovaných politiků "okázale" a "populisticky" nevěnoval peníze místo billboardů a reklam nějakému hospicu, nemocnici? Já vím, ono se to dnes nenosí. Jen tupé výkřiky hesel a frází ...
Schránku i můj telefon naštěstí nechali na pokoji ...

Fankluby

Proboha, lidi, chovejte se jako svéprávní! Ani Zeman ani Schwarzenberg nejsou lidi s čistým štítem, natož svědomím! Vy se ale chováte, jako kdyby právě jeden, a to ten váš vyvolený, byl spasitelem národa. Bučíte, opakujete, pokřikujete, ale nemyslíte.
Měli byste si předně uvědomit, že vy jste národ. A nespasí vás žádný prezident, musíte na tom zapracovat sami. Začněte se svou vlastní morálkou (ale to jste určitě nechtěli slyšet, že?).
Mimochodem, Schwarzenberg rozhodně není pankáč. Proberte se!

Co mi nevadilo

Slovní útoky a hádky kandidátů

I když z toho bylo hodně lidí rozladěných, zklamaných či přímo otrávených, myslím si, že to sem patřilo. Byť obzvlášť Zemanovy formulace byly někdy daleko za hranicí slušnosti, byly na místě - díky jeho "politické nekorektnosti" se Schwarzenberg musel nějak k těmto otázkám vyjádřit - nebo začít kličkovat a mlžit, což neudělal a situaci zvládl. Totéž fungovalo i naopak.
Myslím si, že pokud by tato témata nepřišla na přetřes, krom nižší volební účasti (hádky táhnou) by stejná témata byla součástí hádek "fanklubů" až do úplného zblbnutí a překroucení kde čeho.

Nějak bude ...

A nemohli by prezidentovat oba?

Tahle ironická švejkovina mě napadla asi před týdnem, když jsem si tak přemýšlel nad oběma kandidáty. Možná by to fungovalo, dokonce bych řekl, že jakkoliv se to nezdá, Zeman se Schwarzenbergem si nakonec dobře rozumí - všimněte si, jak na sebe reagují, žádná hysterie, žádné koktání, útěky. Krátké zamyšlení, přímá reakce a jedeme dál.
Navíc mám trochu pocit, že se i doplňují. Zeman kritickým myšlením a schopností "trefit hřebíček na hlavičku", Schwarzenberg schopností s ledovým klidem a nenuceným a neurážlivým přístupem vytyčit hranici, kam oponenta obratem pošle.

Demokracie a opozice

Moudrost říká, že demokracie funguje jen pokud je silná opozice. Pokud už není menšinová vláda, měla by být i tak vláda pod neustálou kritkou a kontrolou. Od první dohody s opozicí, kterou spáchali Klaus a Zeman v roce 1996, se nám demokracie zvrhla v něco nepřijatelného. Tehdy to ještě trochu fungovalo a nakonec Klausův kabinet zkrachoval - a handlování s křesly vystřídalo uzavření Opoziční smlouvy, kterou skončila veškerá konstruktivní kritika, vystřídána pouhým bojem o moc a křesla, pletichařením a intrikářstvím, sloužícími k bohapustému boji o kořist finanční pro strany, jejich sponzory a samozřejmě jednotlivce.
Když jsem si o této historii nedávno četl a opakoval si fakta, trochu se mi zastesklo i po těch Republikánech, tehdy zatracovaných a považovaných za napůl šílené. Pořád si vybavuji taky svobodné volby z první půle 90. let, spousty stran a názorů, ano, taky magorů, ...

No, takže do současnosti - pokud už máme vlády většinové a tudíž bezmocnou opozici parlamentní, potřebujeme to nějak dohnat. Tak uvidíme, jestli nám ten prezident Zeman bude k něčemu dobrý. Obzvlášť mám pochybnost, pokud příští vládu sestaví ČSSD (s KSČM? ODS? TOP09?) - jo kdyby to zkusila sama a ostatní by se snažili oponovat s vzájemným respektem jednotlivců ... no, pro dnešek konec pohádek o demokracii.
Nějak bylo, nějak bude. Korupce zůstane, daně budeme taky platit dál, ... a zítra je neděle.

sobota 19. ledna 2013

SGES2 a nové JAX-WS a JPA2

Pěkně to tu mají napsané, pěkně. A vždycky to má háček. No, našel jsem trochu jinou cestičku. Java si vždycky hledá takové properties soubory, ve kterých má napsanou default implemetaci nějakého API.
Ale asi bych měl začít od začátku - problém byl takový: Naučili jsme SGES2.1.1 novým kouskům tak, že jsme v adresáři lib udělali pár změn (AS, ne domény!):
  1. Souborům toplink-essentials-agent.jar, webservices-rt.jar, webservices-tools.jar, endorsed/activation.jar a endorsed/webservices-api.jar jsme přihodili příponu .Orig - to aby je aplikáč nenačítal, ale abychom měli nějakou stopu po tom, že jsme tu prováděli "psí kusy".
    Ještě malá poznámka - toplink-essentials.jar nepřejmenováváme, jelikož ho potřebuje interní ejb timer a nám konec konců nevadí, protože JPA providera si vybírá každá aplikace dle svého gusta v persistence.xml.
    cd ${appserv.home}
    mv ./lib/toplink-essentials-agent.jar ./lib/toplink-essentials-agent.jar.Orig
    mv ./lib/webservices-rt.jar ./lib/webservices-rt.jar.Orig
    mv ./lib/webservices-tools.jar ./lib/webservices-tools.jar.Orig
    mv ./lib/endorsed/activation.jar ./lib/endorsed/activation.jar.Orig
    mv ./lib/endorsed/webservices-api.jar ./lib/endorsed/webservices-api.jar.Orig
    
  2. Do adresáře lib nakopírujeme nové soubory. K dostání jsou obvykle na stránkách autorů nebo v různých maven repositories. Co přesně musíte stáhnout se může lišit podle toho, jak moc se vzdálíte od staré implementace, ale každopádně bude třeba pokrýt to, co plnily přejmenované knihovny. Náš seznam je následující - Javě je jedno, jak se soubory jmenují, podstatné je, že mají příponu .jar, tudíž jsme ponechali i čísla verzí:
    webservices-rt-2.2.jar
    webservices-tools-2.2.jar
    eclipselink-2.3.2.jar
    endorsed/javax.persistence-2.0.3.jar
    endorsed/webservices-api-2.2.jar
  3. To jsem napsal v podstatě totéž, co mají na odkazu v začátku. Jenže při prvním nasazení aplikace zjistíte, že pokud v persistence.xml vyplníte element <class>, aplikace vám neprojde validací!!!
    Háček je totiž v tom, že AS se řídí různými properties, poházenými po classpath v knihovnách v adresáři META-INF/services. Ty mu říkají "default" implementace API, které on sám použije; název souboru je v našem případě javax.persistence.spi.PersistenceProvider.properties
    Protože jsme ale nechali na classpath TopLink, má AS na výběr mezi TopLinkem a EclipseLinkem. Který zvolí, záleží na tom, který soubor najde dřív - čili nejspíš TopLink, protože při startu pravděpodobně bude nahazovat EjbTimer.
  4. Slova "pravděpodobně" a "nejspíš" se mi nelíbí, ale řešení je snadné - do aplikace si ten property soubor přidejte taky :-)
    A potom zapomeňte na pokusy dávat knihovny na classpath-prefix, což navrhují v onom odkazu - zkoušel jsem to, nefunguje to.

A ještě troška deziluze - zapomeňte na to, že vám SGES2 kdy bude dělat JEE6 server. Takovou certifikací neprošel a nikdy neprojde, prostě taková funkcionalita kontejneru v něm není. Nikdy nebude umět pracovat s anotacemi podle JEE6, prostě protože se musí pevně držet JEE5.
JEE5 Aplikace sice bude bezpečně fungovat na JEE6 serveru, ale to pořád neznamená, že vnitřně JEE6 server obsahuje JEE5 server. Toto nejsou Windows!
Důvody zpětné kompatibility jsou jen anotace a API - vaše JEE5 aplikace jimi deklaruje nějaké požadavky (na zdroje, transakce, atd.), ale vůbec tím neříká, jak je server má splnit (pokud ovšem nepoužívá "deprecated" atributy anotací nebo něco neloví přes InitialContext).
Zkrátka, pokud chcete JEE6, musíte přejít na nějaký certifikovaný  JEE6 aplikáč. Třeba Glassfish3, ať nechodíte daleko.

Tenhle návod vedl jen k tomu, abychom mohli použít např. Criteria API, nové JAX-WS a pár dalších novinek.

EDIT: Jeden příklad toho, co nebude fungovat - SGES používá tuto implementaci EntityManager wrapperu - ano, tušíte správně, metodu z JPA2 díky němu nevyvoláte, čili například nemůžete použít TypedQuery.

pondělí 17. prosince 2012

Implementace webové služby a anotace

Typicky máte WSDL, ponastavujete si jaxws-maven-plugin, binding, a vygenerujete si javovské interface (a taky klienta služby, ale toho si tu všímat nebudu). A co dál? Implementace rozhraní je už na vás. Co služba bude dělat, tím se tu taky nebudu zabývat. Co chvíli se ale zamotám do atributů anotace @WebService, nemůžu se trefit na @HandlerChain, nebo zapomenu říct, že chci automatickou  validaci požadavků i odpovědí. Jak na to?
Mé implementace služeb mají nakonec ve výsledku obvykle čtyři anotace, jsou kompatibilní s JEE5 i JEE6 a Glassfish je vypisuje v seznamu webových služeb vystavených na instanci - k tomu navíc aplikáč (alespoň SGES 2.1.1) potřebuje sun-ejb.xml, u Glassfish 3 si nejsem jist, jestli nějaké XML vůbec je zapotřebí.

Stateless

@Stateless(name = "Hell", mappedName = "ejb/Hell")
- name odpovídá ejb-name v sun-ejb.xml; slouží k propojení bean přes její název napříč komponentou. - mappedName je globální identifikátor bean přes JNDI. To je trochu kámen úrazu mezi JEE5 a JEE6, jelikož v JEE6 došlo na standradizaci JNDI názvů, ale u JEE5 to dělá každý aplikáč jinak.

SchemaValidation

@SchemaValidation
Tato anotace způsobí, že pokud klient pošle nevalidní SOAP dotaz, vrátí mu AS jen SoapFault s "client error". Ovšem je to dvojsečné a stejně tak pokud v implementaci služby vytvoříte odpověď, která neprojde validací, klient dostane opět SoapFault, ale se "server error" a HTTP kódem 500. To by se samozřejmě nikdy nemělo stát a je to zodpovědnost autora implementace služby.
Atributem lze také říct, že chceme použít jinou než default implementaci validace.
Poznámka pod čarou - na klienta anotace nemá vůbec žádný vliv.

HandlerChain

@HandlerChain(file="generated/HellPort_handler.xml")
jaxws-maven-plugin, resp. wsimport, umí vygenerovat i tento soubor - dělá jeden zvlášť pro službu i port, stačí dodat příslušné elementy do xjb souboru používaného pro custom binding. Navíc přidá i tuto anotaci k rozhraní i klientovi, jenže má to háček - cesta k souboru se generuje relativně k souboru třídy a proto jí musíte zopakovat (pokud tedy nejste ve stejném balíku, což by pro změnu mohlo dopadnout nepěkně).
Druhá možnost je všechny handlery přidávat programově, pokud ovšem považujete určitý handler za neoddělitelnou vlastnost služby, se kterou si navíc nechcete "plevelit" kód implementace služby, toto je vhodný způsob. 
U mých služeb takto konfiguruji handler pro zalogování SOAP požadavku i odpovědi; téměř téhož mohu docílit i nastavením JVM option, leč bez možnosti logování vypínat nebo směrovat za běhu aplikace. O tom zase jindy ;-)

WebService

@WebService(
  serviceName = "HellService",
  portName="HellPort",
  targetNamespace = "urn:cz:dmatej:services:Hell",
  endpointInterface = "cz.dmatej.ws.generated.HellPort",
  wsdlLocation = "META-INF/wsdl/Hell.wsdl"
)
Na tuhle anotaci se mrkneme podrobněji, ať už nikoho nebolí hlava :-)

name

- tenhle atribut chybí, protože v JEE5 se <port-component-name> v sun-ejb-xml váže na název implementující třídy. Pokud atribut přeci jen přidáte a vyplníte i shodné port-component-name, Glassfish3 s tím nemá problém a vystaví službu pod novým názvem. Problém ale přijde se SGES2, kde sice nasazení projde, ale do logu hlásí WARNING se stacktrace, že atribut name se vylučuje s atributem endpointInterface.
- otázkou pro mě je, jestli je to drobná chybička SGES, nebo požadovaná vlastnost JEE5 (?). Buď jak buď, zřejmě je lepší věci nekomplikovat a implementaci služby pojmenovat, jak se sluší.

serviceName

- musí odpovídat tagu <service name=... ve WSDL
- pokud neodpovídá, glassfish upozorní, že ve WSDL jsou jiné služby ale takováhle ne, a deploy selže.

portName

- musí odpovídat tagu <port name=... ve WSDL
- pokud neodpovídá, glassfish několikrát do logu zařve, že "... could not get binding from WSDL! service ...", a deploy selže.

targetNamespace

- implicitně se generuje z názvu balíku a třídy (a s http:// na začátku), ale musí odpovídat WSDL. 
- pokud wsdlLocation nenastavíte, nasazení bude nejspíš úspěšné, jenže žádný klient se se službou neodmluví - namespaces jsou směrodatné pro (un)marshalling SOAP zpráv.
- ve výsledku je tedy nejsnazší zkopírovat namespace z interface

endpointInterface

- jak říká javadoc, celý název implementovaného rozhraní
- finta je v tom, že samotná třída nemusí plně implementovat všechny metody rozhraní, k čemuž by nás Java jinak nutila. Nikdy jsem to ovšem nezkoušel ;)
- pokud chybí, Glassfish odmítne nasazení, protože nenajde mapování operací na metody.

wsdlLocation

- cesta k WSDL, přičemž za kořen se bere adresář classes (v jar). 
- pokud atribut chybí nebo soubor není nalezen, aplikáč vygeneruje svoje vlastní WSDL podle anotací.
- pozor ještě na jednu věc, WSDL musí být v podadresáři wsdl, jinak aplikáč odmítne nasazení aplikace


pátek 14. prosince 2012

JAX-WS: Generování z WSDL a podivný SOAPBinding


Pokud se vám stane, že píšete WSDL a z něj generujete potřebné třídy v Javě, přičemž se vám nad "port třídou" pořád objevuje protivná anotace
@SOAPBinding(parameterStyle=ParameterStyle.BARE)
- a to i přestože se zoufale pokoušíte v bindings měnit nastavení enableWrapperStyle na false/true, aniž by to mělo jakýkoliv efekt, vězte, že krom nutných podmínek, o nichž se dočtete na webu, musíte splnit ještě jednu zásadní, která z popisů různých kombinací RPC/Document/Wrapped tak nějak vyplývá, ale nedochází vám.
Možná vám tato podmínka dojde, když se podíváte, kde všude se vyskytuje "MyOperation" v následující ukázce:

<wsdl:binding name="MyBinding" type="MyServicePort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="MyOperation">
...
<wsdl:portType name="MyServicePort">
<wsdl:operation name="MyOperation">
<wsdl:input message="MyOperation"/>
...
<wsdl:message name="MyOperation">
<wsdl:part name="parameters" element="data:MyOperation"/>
</wsdl:message>
...
<wsdl:types>
<xsd:element name="MyOperation" type="data:MujPozadavekTyp"/>
...

Zkoušel jsem různé změny do úmoru - jakmile jsem některé ze jmen změnil, objevila se anotace a interface obsahoval vstupní parametr typu MyOperation, zatímco takto anotace v kódu nebyla a vstupní parametry odpovídaly sekvenci atributů elementu MyOperation.
Samozřejmě, pokud by metoda služby měla parametrů více, než je zdrávo, budu chtít docílit pravého opaku ...

Tak, a je to venku - a teď můžete pokračovat v práci :-)