Eurotrip 2011 – London (den 0)

Tak se konecne dostavam ke psani, nez to cele dam dohromady, bude to peknou chvilku trvat. Minule eurotripy jsem poctive zapisoval cestou, tento rok vsak ne. Vinu hazu na utopenou G1 a porizeni noveho telefonu bez hw klavesnice (sproste a jednoduche consuming device). Mnoho detailu, ktere bych chtel udrzet v pameti, tu nebude, coz je … Pokračovat ve čtení „Eurotrip 2011 – London (den 0)“

Tak se konecne dostavam ke psani, nez to cele dam dohromady, bude to peknou chvilku trvat. Minule eurotripy jsem poctive zapisoval cestou, tento rok vsak ne. Vinu hazu na utopenou G1 a porizeni noveho telefonu bez hw klavesnice (sproste a jednoduche consuming device). Mnoho detailu, ktere bych chtel udrzet v pameti, tu nebude, coz je skoda, ale prozil jsem je a to je mnohem dulezitejsi :-). Tento rocnik jsem si pripadal jako profesionalni cestovatel (nebo mi ten nahore hodne pral), protoze se mi neuveritelnym zpusobem vsechno darilo.

Zacnemez v Londyne. Letel jsem z Brna na Stansted, z Brna poprve, coz je docela ostuda. Hned pred letistem jsem se dostal s ridicovym ‚cheers, mate‘ do spravne nalady, ktera me za celou dobu neopustila – vsechno, co jsem zazil, bylo jen a pouze pozitivni, kdyz ted tak nad tim zpetne premyslim, i kdyz to mozna takhle obarvuje celkovej dojem z vyletu :-). Bus jede do centra pekne dlouho, mozna proto vsichni vystoupili hned na periferii a sli na metro – tretina cesty je po dalnici a dve tretiny po meste z celkovych cca dvou hodin.

Prvni den celkem nic – mozna jenom lehka aklimatizace – hostel byl za rohem autobusovyho nadrazi (Belgrave rd), takze jsem se tam doplacal s krosnou, na chvili se natahl a sel shanet nejake pakistanske jidlo, protoze jsem fish and chips citil v mnoha nasledujicich dnech. Obesel jsem par ulic, protoze jsem netusil ceny, ale nakonec zvolil vicemene nahodne a zaplul do prvni mini-spelunky a dal si shish kebap s placatym chlebem a ‚zazvorovym pivem‘. Kebab vybornej – zadny takovy to umely svinstvo, co se prodava v ‚halal fast foodech‘, chleba synator postarsiho majitele uplacal a upekl zacerstva, jen to ‚zazvorovy pivo‘ byla jenom limonada (ale vazne s nazvem ginger beer). Prisedl za mnou nejakej frantik, kterej napred klaviroval do majitele, jak je to vyborny, super a very nice a dostal jsem prednasku o cenach bytu v centru londyna a uvedomil si, ze je moje slovni zasoba pro normalni konverzaci pekne v haji, kdyz jsem mel problemy s povidanim o Batovi a botach :-). Tak jsem se nechal doprovodit (vykladal, ze ma pritelkyni, tak ve vsi pocestnosti :-D) a sel spat, precejenom jsem stravil trictvrte dne v praci a zbytek na cestach.

Cervene kabaty
Cervene kabaty

Druhy den jsem mel jasny plan – zprovoznit internet na me LycaMobile SIMce, booknout ubytovani u Hadrianovy zdi a podivat se na Abbey Road. Topnul jsem kredit za pet liber a zjistil, ze internet nefunguje a po nekolikerym volani s indama na podpore jsem to vzdal, protoze mi telefon porad hlasil roaming a technik po me chtel adresu, kterou jsem zadal pri registraci (a kterou jsem si vycucal z prstu). Takze jsem aspon simku vyuzil k zavolani do hostelu a udelal to, co bych do sebe nikdy nerekl: po telefonu na ulici nadiktoval cislo karty, expiraci a SEK kod. Pak jsem ji hodil do kanalu a vyrazil shanet nejakou jinou – v nejblizsim Carphone warehouse jsem se nejprve dozadoval Orange Addict tarifu a Virgin Dolphin, ale nakonec jsme se s prodavajicim shodli na operatorovi three, kdy jsem za 15 liber dostal simku s prednabityma 300minutama volani, 3000smskama a NEOMEZENYM datovym pripojenim – to vse na mesic – cesti operatori at se jdou vycpat, zlodeji! Tady uz mi konverzace sla – probrali jsme technologie, telefony…opravdu je muj jazyk jen nejak jednostrane zamereny :-D.

Roosevelt a Churcill
Roosevelt a Churcill

Pak jsem v parku pred Buckinghamskym palacem chvilku posedel u pozorovani veverek, namontoval novou SIMku a vyrazil na sever na Abbey Road. Cestou jsem potkal pochodujici straze i s muzikou vychazejici z Lancaster House, chvilku posedel na lavicce s pany Rooseveltem a Churchillem a nastradoval si to kolem minaretu a predevsim po ‚Groove end rd‘ az k prechodu na Abbey Road. Turistu tu bylo docela dost a celkove nic moc, ale to se dalo cekat.

Abbey road
Abbey road

Cestou zpatky jsem u kazdeho druheho stojanu zvazoval pujceni si Berkeley kol, protoze jsem uz docela spichal a navic se blizil dest. Prece jenom pujcovne zdarma do pul hodiny, nad pul hodiny libru za pulden (tusim) – to je krasna cena, priste to musim vyuzit. Prosprintoval jsem okolo Marble Arch a speeking corneru c hyde parku, cestou stihl dalsi pakistani chalku (vybornou – hrachova polivka jako bonus s jehnecim a nejakyma pikantnima plackama a cajem jako dalsim bonusem), domluvit se s indem, ze shanim denaturovanej lih na paleni a zneuzil znalosti (ne-)zabezpeceni hostelu a dopral si sprchu B-).

Abbey road
Abbey road

Dalsi pakos me obral o patnact liber, protoze jsem je zapomnel polozeny na pulte (standartni nakup – voda, chleba, marmelada) jak jsem byl roztrzitej a kdyz jsem se vratil, tvaril se, ze on nic. Kazdopadne jsem tak-tak dorazil na Megabus smer Glasgow, ovsem s predcasnym vystupem – v Carlisle. V buse jsem zjistil, ze k me shiny new kapesni nabijecce nemam konektor k telefonu (a opravdu se modlil, at sezenu v Carlisle obchod s konektorama), takze kratochvile pri ceste se konat nebude a snazil se usnout. Soused nastesti vypadl v Manchesteru, tak jsem se sproste roztahl a jako jedinej v buse si ubranil dvousedadlo jenom pro sebe, zlata absence zasedaciho poradku a moje drzost :-).

Carlisle nadrazi
Carlisle nadrazi

Neco po pulnoci jsme dorazili do Carlisle, misto meho nocovani tento i nasledujici den. Trochu jsem si to tam prochodil virtualne s pomoci Google Earth uz pred odjezdem, takze jsem vedel, ze zapadne od nadrazi jsou temne ulicky, kam bych moc chodit nemel a naopak vychodne od autobusoveho nadrazi je parcik s plutkem a v nem jakasi vodarenska budova s plochou strechou, takze tam by se dalo vyspat. Z autobusu jsem vystoupil jedinej a vsichni uvnitr koukali, co je to za blazna, ktery nejede az do Glasgow. Rozhodl jsem se jit na nadrazi a byla to dobra volba. Cestou jsem potkaval skupinky mistni omladiny v podrousenem stavu a vsude kolem binec. Na nadrazi bylo prazdno a klid, bohuzel na spani to nebylo – zelezne lavicky a zima – a to jsem na sebe navlikl vsechno obleceni. Zastavil se za mnou zrizenec – pri jestli cekam na vlak na Londyn. Natvrdo jsem mu rekl, ze jsem se tam prisel vyspat, ze mi brzo rano jede autobus a nevim, kam jinam jit. Nehnul ani brvou a odpovedel, ze tam klidne muzu zustat, ale ze musi budovu zamcit. Ukazal mi skryty bocni vychod, popral dobrou noc a zmizel. Zamykani melo jednu nevyhodu – byly zamcene i zachody. Nejprve jsem listoval v prospektech, ktere jsem nabral u kasy, pak se chvili pokousel spat, ale slo to blbe, celodenni pochod na tohle navazujici bude porod. Probdel jsem az do svitani, dal kafe z automatu, kelimek si ode me vzal onen zrizenec (protoze tam nebyly kose) a vyrazil na bus smer Bowness on Solway.

Otevreny dopis T-Mobile czech

Posilal jsem 13. cervna na cesky t-mobile mejl nasledujiciho zneni: Dobry den, chtel bych se zeptat, kdy mate v planu modernizovat infrastrukturu, na ktere vam bezi web? Jakozto platici zakaznik mam na praci jine veci, nez se donekonecna potykat s nefunkcnosti (a predevsim rrrryyyycchhhlllooossstttiii) vasich webovych stranek, predevsim s ohledem na to, ze za penize, … Pokračovat ve čtení „Otevreny dopis T-Mobile czech“

Posilal jsem 13. cervna na cesky t-mobile mejl nasledujiciho zneni:

Dobry den,
chtel bych se zeptat, kdy mate v planu modernizovat infrastrukturu, na ktere vam bezi web? Jakozto platici zakaznik mam na praci jine veci, nez se donekonecna potykat s nefunkcnosti (a predevsim rrrryyyycchhhlllooossstttiii) vasich webovych stranek, predevsim s ohledem na to, ze za penize, ktere jste ode me za tech mnoho let ziskali byste byli schopni si poridit nekolik novych serveru?

No a protoze se dodnes nikdo neuracil odpovedet, delam z toho otevreny dopis, mimo jine z duvodu, ze mi jejich stranky opet hlasi „The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.“ Aneb – jako obvykle.

Validace vstupu webových služeb

Potřeboval jsem validovat vstup webové služby na základě xsd šablony – a to jak typy, tak patterny a potřeboval jsem to pokud možno obecně a jednoduše. Postupně jsem se dobral řešení, které se pokusím níže popsat. Měl jsem zadaný wsdl dokument, k němu definici typů v xsd a příkaz použít jax-ws. Takže jsem provedl wsimport … Pokračovat ve čtení „Validace vstupu webových služeb“

Potřeboval jsem validovat vstup webové služby na základě xsd šablony – a to jak typy, tak patterny a potřeboval jsem to pokud možno obecně a jednoduše. Postupně jsem se dobral řešení, které se pokusím níže popsat.

Měl jsem zadaný wsdl dokument, k němu definici typů v xsd a příkaz použít jax-ws. Takže jsem provedl wsimport a začal zkoušet. Na komplexní typy byl pomocí jaxb vytvořen binding, takže mi vznikla trochu poschoďovější struktura, která ovšem nebrala v úvahu definované simple typy a prostě je převedla na podobné typy jazyka Java. Pokud jsem tento projekt spustil na serveru, patterny těchto typů prostě zmizely a vygenerované xsd bylo úplně jiné, wsdl se jakž-takž podobalo. Stačilo ovšem přidat parametr k anotaci WebService, který specifikoval cestu k originálnímu wsdl.

[sourcecode language=“java“]@WebService(
name = "myServiceSei",
targetNamespace = "http://www.shmoula.cz/schema/myservice",
wsdlLocation = "META-INF/wsdl/myService.wsdl"
)[/sourcecode]

V tomto okamžiku jsem měl ovšem problém s bindingem, který jsem původně přiřazoval nějaké chybičce ve jmenných prostorech, a ten způsoboval, že mi služba předávala null hodnoty. Nakonec se ukázalo, že v zadaném wsdl se vyskytuje zpráva z názvem doSomeStuffRequest, který se kryl s elementem ve vlastním těle této zprávy (navíc jax-ws přidává postfix Request automaticky), takže stačilo tento název změnit a vše bylo v pořádku a já byl o krok blíže k validování.

První, co mě napadlo, bylo použití anotace SchemaValidation, tak jsem ji použil. Služba se ovšem chovala, jako by tam tato anotace vůbec nebyla a prošlo naprosto všechno. Tudíž nastoupilo řešení číslo dvě – použítí Marshalleru, který by měl při nesrovnalostech skončit s výjimkou. Končil, ovšem s výjimkou jinou, než jsem čekal.

unable to marshal type "cz.foo.bar.DoSomeStuffRequest" as an element because it is missing an @XmlRootElement annotation

Důvody jejího vzniku pěkně rozebral Kohsuke Kawaguchi ve svém blogpostu a protože jsem nechtěl do všech typů cpát XmlRootElement, řídil jsem se jí a dobral se funkčnosti – opravdu mi to validuje! Ještě jsem si s řešením trochu pohrál a především využil vygenerované ObjectFactory, abych nemusel vytvářet vlastní JAXBElement. Výsledek vypadá (zhruba) následovně a funguje na výbornou.

[sourcecode language=“java“]@WebMethod
public void doSomeStuff(DoSomeStuffRequest serviceParameters) {

ObjectFactory of = new ObjectFactory();
JAXBElement<DoSomeStuffRequest> element = of.createParcelImportRequest(serviceParameters);
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);

try {
URLClassLoader cl = (URLClassLoader) getClass().getClassLoader();
URL url = cl.findResource("META-INF/wsdl/myService.xsd");

Schema schema = sf.newSchema(url);

JAXBContext context = JAXBContext.newInstance(DoSomeStuffRequest.class);

Marshaller marshaller = context.createMarshaller();
marshaller.setSchema(schema);

marshaller.marshal(element, new DefaultHandler());

} catch (SAXException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
[/sourcecode]

PS. Nic to ovšem nemění na tom, že SOAP není mrtvý, ale nemrtvý (a vůbec že je to fuj)!

Android MapView a onTouch

Nemálo mě, a nejenom mě, štve absence něčeho, jako je onTouch() v mapách na Androidu, protože potřebuju vytvořit dynamické načítání overlayů. MapView sice má onTouchEvent(), ale že by bylo možné jej použít nějakým mnou zamýšleným způsobem, to zrovna ne. Zkoušel jsem pár způsobů, které tu nastíním a taky jsem zkusil jedno ne zrovna dvakrát moc … Pokračovat ve čtení „Android MapView a onTouch“

Nemálo mě, a nejenom mě, štve absence něčeho, jako je onTouch() v mapách na Androidu, protože potřebuju vytvořit dynamické načítání overlayů. MapView sice má onTouchEvent(), ale že by bylo možné jej použít nějakým mnou zamýšleným způsobem, to zrovna ne. Zkoušel jsem pár způsobů, které tu nastíním a taky jsem zkusil jedno ne zrovna dvakrát moc fér řešení. Ale zoufalí lidé se uchylují k zoufalým věcem, však to znáte… Jen to vezmu hodně hopem, protože mám moře jiných věcí na dělání, ale pár lidem jsem to slíbil a sliby se mají plnit a to nejen o Vánocích ;-).

Zatímco natahování je poměrně jasné (AsyncTask, který bude natahovat data ve čtverci, jehož směrem jsem se posunul – na základě kolize souřadnic tohoto čtverce a viewportu – aby to pořád netahalo jak blbé), taková trivialita jako je onTouch už tak jasná není.

Nejprve jsem se snažil přimět k rozumu metodu onTouchEvent() jak na MapView, tak i na Overlayi, bohužel bezúspěšně. Zajímalo by mě, jestli je tento event pozůstatek něčeho zaniklého, nebo se na něj jenom nějak zapomnělo. Tento způsob by měl fungovat nějak takto, což vypadá poměrně prakticky a použitelně – ve switchi checkovat eventy:

[sourcecode language=“java“]public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
. . .
}
return super.onTouchEvent(ev);
}[/sourcecode]

Bohužel – z nějakého důvodu tato metoda vůbec nebyla volána. Po nějakém googlení jsem narazil na blog Juriho Strumpflohnera, který řešil stejný problém a vyšpekuloval ho následovně: na mapView navěsit vlastní OnTouchListener(), čili přidat jednoduchou anonymní třídu:

[sourcecode language=“java“]mapView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent ev) {
return false;
}
});[/sourcecode]

Pokud teda dojde k eventu Touch, jsou procházeny všechny views a případné implementace listenerů v nich. V listeneru implementovaná metoda onTouch je volána nejméně jednou v závislosti na tom, zda vrátí true či false. Pokud vrací false, provede se pouze poprvé a systém je tak chytrý, že už jde příště rovnou na jistotu (aka přímo po metodě, která vrátila true), což je zároveň i kámen úrazu: je nutné zajistit, aby byla volána i metoda „níže“, protože se při true mapa nepohybuje (ale náš onTouch je volaný vždycky). Je teda nutné předat „nižšímu view“ tento event. Nejprve jsem volal dispatchTouchEvent() na view, který přišel do onTouch, ale to je blbost, protože tento view je vlastně onen MapEvent, nad kterým byl navěšen tento listener, takže došlo k zacyklení a StackOverflowError. Takže jsem třídu odanonymizoval a předávám si do ní Context, což je aktivita, uvnitř které je mapView:

[sourcecode language=“java“]public class MyTouchListener implements View.OnTouchListener {
private Activity activity;

public MyTouchListener(Activity activity) {
super();
this.activity = activity;
}

public boolean onTouch(View v, MotionEvent ev) {
activity.dispatchTouchEvent(ev);
return true;
}
}[/sourcecode]

Taky to ovšem nejede, ale oproti dispatchování do view to vydrží o chvíli déle (a pak to stejně přeteče zásobník a zdechne).

Jak už to bývá, funkční řešení bývají ta nejjednodušší, takže dneska tenhle blogpost konečně dorazím!

Ono totiž stačí rozšířit map view a přepsat v něm onTouchEvent, nebo onInterceptTouchEvent (jak je popsáno tady). V čem je zakopán pudl? V ničem, opravdu to funguje. Předchozí Class Cast Exception se dá zbavit velice jednoduše – definovat správný typ v layoutu! Pojďme tedy na to, nejprve vlastní mapView:

[sourcecode language=“java“]package cz.shmoula.pat;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;

import com.google.android.maps.MapView;

public class AreaMapView extends MapView {
private Context mContext;

public AreaMapView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
mContext = context;
}

public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
Log.i("!!!!!", "Pohyb!");
}
return super.onTouchEvent(ev);
}
}[/sourcecode]

Teď následuje onen výše zmíněný kámen úrazu, který dříve hulákal Class Cast výjimkou a je to docela logické, ale nevěděl jsem, že je možné vkládat do layoutů vlastní komponenty. Teď už to vím, tak je možné psát něco zhruba takového:

[sourcecode language=“xml“]<?xml version="1.0" encoding="utf-8"?>

<cz.shmoula.pat.AreaMapView
xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/areaMapView"

android:layout_width="fill_parent"
android:layout_height="fill_parent"

android:clickable="true"
android:apiKey="api_klíč"
/>
[/sourcecode]

No a v aktivitě se tato komponenta dohledá každému známým způsobem:

[sourcecode language=“java“]AreaMapView mapView = (AreaMapView) findViewById(R.id.areaMapView);[/sourcecode]

Toť vše! Opravdu, v jednoduchosti je síla. Takže teď přidat nějaké spočítání delta a pokud bylo pohnuto viewportem více, než je výše uvedený čtverec v onu stranu, tak načíst další. Na závěr se ještě musím přiznat, že toto řešení jsem nevyplodil sám, ale sprostě se nechal inspirovat OpenCachingem od Garmina, který mě nakopl na správnou cestu směrem k výsledku. Při pídění se po řešení jsem taky narazil na projekt mapview-overlay-manager, ve kterém se nachází Lazy loading a který si nechávám k dalšímu prostudování a hádám, že nebudu sám.

Dekompilace androidích aplikací

Někdo se rád pídí po tom, jak věci fungují, někdo se rád občas nechává inspirovat cizími kusy kódu a někdo prachsprostě krade (možná by se to dalo nazvat nějakou IT kleptomanií). Všem těmto skupinám by ovšem mohl přijít vhod tento blogpost, protože v několika krocích popisuje operaci jednoduchou (tu jednoduchost myslím vážně, zabývat se dedexerem, … Pokračovat ve čtení „Dekompilace androidích aplikací“

Někdo se rád pídí po tom, jak věci fungují, někdo se rád občas nechává inspirovat cizími kusy kódu a někdo prachsprostě krade (možná by se to dalo nazvat nějakou IT kleptomanií). Všem těmto skupinám by ovšem mohl přijít vhod tento blogpost, protože v několika krocích popisuje operaci jednoduchou (tu jednoduchost myslím vážně, zabývat se dedexerem, aka android disassemblerem opravdu nehodlám, z toho už jsem vyrostl a zpohodlněl) – a sice rozbalování a dekompilaci androidí aplikace.

Jak je tvořena androidí aplikace asi každý vývojář ví, takže tuto část vypustíme a přejděme blíže k věci, což by mohl být aapt, neboli Android Asset Packing Tool, který je součástí nástrojů v SDK. Tento nástroj je jednak zodpovědný za parsování všemožných souborů (včetně manifestu) uvnitř projektu a následné přetváření takových properties do R.java souboru, ale především i za proces opačný, čili dolování informací z již hotových .apk souborů a to i podepsaných a zarovnaných. Nebudeme chodit kolem horké kaše a skočme rovnou do nějakého příkladu. Půjčil jsem si APKčko z mého rozdělaného projektu a provedl nad ním následující kouzlo:

[sourcecode type=“bash“]vbalak@vbalak-desktop:~/develop/workspace.sts/PlantATree/client/target$ aapt l -a pat-client.apk
res/layout/area_map.xml
res/layout/main.xml
res/layout/tree_details.xml
res/layout/tree_list.xml
res/layout/tree_list_item.xml
res/menu/map_menu.xml
AndroidManifest.xml
resources.arsc
res/drawable-hdpi/icon.png
res/drawable-ldpi/icon.png
res/drawable-mdpi/icon.png
classes.dex
org/codehaus/jackson/map/VERSION.txt
org/codehaus/jackson/impl/VERSION.txt
META-INF/MANIFEST.MF
META-INF/CERT.SF
META-INF/CERT.RSA
[/sourcecode]

Nejprve je vidět seznam souborů nacházejících se v archivu (.apk je obyčejný zip soubor, takže je možné jej jednoduše rozbalit, v tom není žádná věda). Další část (resource table) je zajímavější – jedná se o identifikátory zdrojů, neboli to, co je v souboru R.java – to jsou ty hexa čísla uvedená bezprostředně za spec resource a dále typ tohoto zdroje – layout, string, drawable, id…

[sourcecode type=“plain“]Resource table:
Package Groups (1)
Package Group 0 id=127 packageCount=1 name=cz.shmoula.pat
Package 0 id=127 name=cz.shmoula.pat typeCount=6
type 0 configCount=0 entryCount=0
type 1 configCount=3 entryCount=1
spec resource 0x7f020000 cz.shmoula.pat:drawable/icon: flags=0x00000100
spec resource 0x7f04000a cz.shmoula.pat:string/menu_toggle_view: flags=0x00000000
. . .[/sourcecode]

Nejzajímavější je ovšem část poslední, což je sám velký manifest. Kdo měl možnost nahlédnout do AndroidManifest.xml a teď kouká na tento výpis, všímá si velké podobnosti (pokud potlačí rozdílný způsob zobrazení – tohle není xml ;-)). Jsou zde krásně vidět využívaná oprávnění, je zde vidět, jakou program používá ikonu (to je ten hexa kód, který se dá dohledat v části se zdroji – Resources Table). Jsou zde vidět jednotlivé aktivity, parametry aktivit a definované intent-filtry a také využívané knihovny – prostě kompletní manifest, akorát jinak formátovaný. Pro naše další potřeby potřebujeme vstupní bod do aplikace, což bude LAUNCHER a ten je nastaven pro třídu MainActivity, která je v balíčku cz.shmoula.pat, bude se nám hodit za chvíli. Za zmínku ještě stojí anotherMapProcess v poslední aktivitě – dvě mapy se v jedné aplikaci nesnesou, tudíž je nutné je spouštět v rámci jiného procesu, tento parametr tohle zajišťuje (taky jsem nad tím tenkrát dlouho koumal).

[sourcecode type=“plain“]Android manifest:
N: android=http://schemas.android.com/apk/res/android
E: manifest (line=2)
A: android:versionCode(0x0101021b)=(type 0x10)0x1
A: android:versionName(0x0101021c)="0.1" (Raw: "0.1")
A: package="cz.shmoula.pat" (Raw: "cz.shmoula.pat")
E: uses-permission (line=5)
A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
E: application (line=7)
A: android:label(0x01010001)=@0x7f040001
A: android:icon(0x01010002)=@0x7f020000
E: activity (line=8)
A: android:name(0x01010003)=".MainActivity" (Raw: ".MainActivity")
E: intent-filter (line=9)
E: action (line=10)
A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
E: category (line=11)
A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")
E: activity (line=15)
A: android:name(0x01010003)=".LookAroundActivity" (Raw: ".LookAroundActivity")
. . .
E: activity (line=16)
A: android:theme(0x01010000)=@0x1030006
A: android:name(0x01010003)=".ShowAreaMapActivity" (Raw: ".ShowAreaMapActivity")
A: android:process(0x01010011)=":anotherMapProcess" (Raw: ":anotherMapProcess")
E: uses-library (line=22)
A: android:name(0x01010003)="com.google.android.maps" (Raw: "com.google.android.maps")
[/sourcecode]

V této fázi tedy máme hrubý přehled o struktuře aplikace, bylo by vhodné se dostat ke třídám. Ty jsou zabalené uvnitř souboru classes.dex, který se nacházi uvnitř APKčka, takže bych prosil rozzipovat tento archiv. Tento soubor je víceméně nějakým způsobem rozsypaný Java ARchive a pro jeho sesypání do použitelného formátu slouží utilitka dex2jar, která se spouští jednoduchým způsobem:

[sourcecode type=“bash“]vbalak@vbalak-desktop:~/develop/stuff/dex2jar-0.0.7.8-SNAPSHOT$ ./dex2jar.sh classes.dex
version:0.0.7.8-SNAPSHOT
3 [main] INFO pxb.android.dex2jar.v3.Main – dex2jar classes.dex -&gt; classes.dex.dex2jar.jar
Done.[/sourcecode]

Získali jsme tedy opravdový archiv .jar, který je opět možné rozzipovat a koukat na jednotlivé zkompilované třídy. Také je možné udělat víc – pomocí některého java dekompileru je možné se podívat dovnitř, já volil Java Decompiler. Pomocí něj je možné otevřít získaný .jar soubor a v levé části otevřít požadovanou třídu (výše jsme zjistili, že vstupním bodem je MainActivity) a užívat pocitu vítězství, nebo začít vykrádat se začít inspirovat cizím kódem. Toď vše, pro ilustraci ještě přikládám shot JavaDecompileru.

JavaDecompiler - screenshot
JavaDecompiler - screenshot

Testování EJB

V poslední době jsem byl nucen se věnovat vývoji aplikace s nálepkou Enterprise a to tak, že používám EJB. Možná někdy časem budu moci prozradit, co je to za aplikaci a přidat nějaké informace o tom, jak jsem co navrhoval a realizoval, zatím však budu mlčet jako hrob. Pootevřenej – potřeboval jsem testovat a to … Pokračovat ve čtení „Testování EJB“

V poslední době jsem byl nucen se věnovat vývoji aplikace s nálepkou Enterprise a to tak, že používám EJB. Možná někdy časem budu moci prozradit, co je to za aplikaci a přidat nějaké informace o tom, jak jsem co navrhoval a realizoval, zatím však budu mlčet jako hrob. Pootevřenej – potřeboval jsem testovat a to bych to zmínit mohl, protože jsem tomu nějaký čas dal.

Pro některé beany (transformátory) bylo možné napsat jednotkové testy, které nepotřebovaly pro svůj běh EJB kontejner – prostě bylo možné vytvořit instanci dané třídy, provést transformaci (či validaci) a podívat se, jaký je výsledek. Pro další služby jsem už ovšem EJB kontejner potřeboval – takže  bylo potřeba jej buď spustit, nebo nasimulovat (pěkně to zblognul před mnoha lety finc, který odkazuje na Ejb3unit, ještě dříve krecan odkázal ve spojitosti se Springem na Pitchfork – přiznám se, vyprdl jsem se na oba).

Nejprve jsem uvažoval nad embeded glassfishem, ale zdálo se mi to úchylné, tak jsem rozhodil síť na twitteru a ozval se @dblevins s odkazy, jak je to pácháno na OpenEJB. To jsem zkoušel mimo video je to pěkně popsáno třeba zde), ale končil jsem s

[sourcecode language=“plain“]java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
[/sourcecode]

což se opakovalo, i když jsem se snažil vygooglit řešení a různě si s tím hrál. Podle všeho jsou knihovny pouze abstrakce a vlastní implementaci vkládá až zvolený kontejner, alespoň tak jsem to pochopil. Takže jsem se ve finále rozhodl jít cestou onoho embedded kontejneru.

Protože vyvíjím pro Glassfishe, padla volba na použití embedded glassfishe. Nejprve jsem se inspiroval Adamem Bienem a pokoušel se vytvořit archiv a ten následně deploynout, což však samozřejmě nebyla správná cesta. Hledal jsem dále a konečně objevil něco funkčního – vytvoření kontejneru se zkompilovanými classami a získání kontextu, nad kterým je možné provádět lookup. Teď bych sepsal kroky, jak jsem to celé zjednodušil a nacpal do ukázkového projektu.

Nejprve si vytvořme nový projekt pomocí mavenu

[sourcecode language=“plain“]mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=cz.shmoula -DartifactId=ejbTesting[/sourcecode]

následně je vhodné změnit pom.xml dle výše uvedeného zdroje – přidat závislost a parametry, případně repozitář

[sourcecode language=“plain“]. . .
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
. . .
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
. . .
<repository>
<id>glassfish-repository</id>
<url>http://download.java.net/maven/glassfish</url>
</repository>
[/sourcecode]

Teď je možné přidat například lokální stateless bean a jednoduše jej otestovat, část TestCase je uvedena níže. Za povšimnutí stojí především specifikace cesty, kde se nalézají classes, vytvoření (a uzavření) kontejneru a získání kontextu a dohledání pokusného beanu.

[sourcecode language=“java“]@Override
@Before
protected void setUp() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(EJBContainer.MODULES, new File("target/classes"));
properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", "glassfish");
properties.put(EJBContainer.APP_NAME, "pokus");

container = EJBContainer.createEJBContainer(properties);
Context ic = container.getContext();

Object o = ic.lookup("java:global/pokus/Pokus");
if(o instanceof Pokus)
this.pokus = (Pokus) o;
}

@Override
@After
protected void tearDown() throws Exception {
container.close();
}

@Test
public void testPokus(){
assertNotNull(pokus);
}

@Test
public void testScitani(){
assertEquals(9, pokus.scitani(5, 4));
}[/sourcecode]

To by mohlo být vše, teď to nějak aplikuju na WS, snad se to tak používá (chci testovat služby na straně serveru) a potom zkusím vkládat Messages na jazyk MDB :-). Nakonec to zas až tak nebolelo, i když mi připadá hodně úchylné ono spouštění embedded kontejneru. Je škoda, že v oficiální dokumentaci se o testování nic nepíše (nebo jsem to přehlédl? prosím link).

Oracle Java Developer Conference

Mám v poslední době takovej nějakej dojem, že navštívené konference mi nějak nic nedávají. Otázka je, jestli stárnu, nebo jestli za to může fakt, že jsem se den před touto konferencí nepěkně picnul a modlil se, ať už to skončí. Pravda ovšem může být úplně jinde – recykluje se. No a protože slíbené slajdy z … Pokračovat ve čtení „Oracle Java Developer Conference“

Mám v poslední době takovej nějakej dojem, že navštívené konference mi nějak nic nedávají. Otázka je, jestli stárnu, nebo jestli za to může fakt, že jsem se den před touto konferencí nepěkně picnul a modlil se, ať už to skončí. Pravda ovšem může být úplně jinde – recykluje se. No a protože slíbené slajdy z androidDevCampu pořád nejsou (a nemůžu tu komentovat co jsem chtěl), zkusím se zamyslet nad tím, co se mi děje.

Vzpomínám si, jak jsem se „zamlada“ těšil na Invex, asi tak moc, jak jsem tuto akci potom nenáviděl. Důvod se mi zdá prostý – internet a přebytek informací (Brave new world). Pokud se člověk o něco zajímá, určitě má dané téma nastudované ze všech stran a zná detaily. Proto mi svého času přišlo zbytečné chodit na výše zmíněnou výstavu. Stejný dojem bohužel začínám získávat i z různých konferencí. Pokud člověk nejede vyloženě získávat kontakty (případně se dobře najíst či flirtovat s hosteskama), bude to zabitý čas.

Oracle Java Developer Conference
Oracle Java Developer Conference

Posledních několik týdnů jsem se věnoval hlubšímu studiu Enterprise edition Javy (všechny ty servlety a podobné věci už potkávám pár let, ale injektáže a další věci mimo Spring jsem si ještě pořádně neošahal), tak jsem se těšil, že nabudu nové tipy a směrovky, na co se dále podívat… bohužel. Dopolední část programu bylo víceméně vzájemné plácání se přednášejících po ramenou, co že se povedlo, jak to bylo tenkrát, jak je to teď… zakončené povídáním Aleše Koběrského z Home Creditu, co že vlastně dělají a jak to u nich vypadá. Jasně, z velké části na akci byli studenti, kteří budou hledat job, ale stejně mi to nesedí. Navíc je otázka, jestli vůbec budou mít zájem (u oběda porovnávali nabídky různých firem, tam že dávají auto, tam jiné benefity…), jestli si nevysnili něco úplně jiného (pečené holuby zadarmo do huby).

Oracle Java Developer Conference
Oracle Java Developer Conference

Po obědě to začalo být zajímavé – Martin Marko (Web development for java web developers. Bad practices and solutions) rozjel show na téma jakýchsi vlastních dá se říci šablonovacích systému a přednášky o tom, že jako Javisti bychom neměli psát html kód a pokud ano, nepsat jej jak prasata. Chápu, souhlasím! Měl neuvěřitelný flow a těch 45 minut uteklo jak voda, dokázal bych tam sedět klidně až do večera – tohle mi něco dalo! Teď se však marně snažím najít nějaký jeho blog (blogspot mi hlásí 404), názvy které zmiňoval ani googlu nic neříkají (html5taglib, haiku), takže tu nemůžu dát linky. Ale aspoň jsem sehnal jeho mejl, tak uvidíme, jestli se s tím bude dát něco dělat, protože to bylo rozhodně nemálo zajímavé.

Další navštívenou přednáškou byla opakovaná What’s new in JavaEE 6 prezentovaná Alexis Moussine-Pouchkine, ale spíše jsem si během ní srovnával v hlavě Marcusova slova. Občas jsem ale procitl, abych zjistil, že se recyklují věci jako qualifiers (se kterými jsem shodou okolností neúspěšně zápasil minulý týden), že se ukazují onelinery oanotované asi deseti řádky a další šílenosti. Sečteno podtrženo – nula. A to jsem seděl na zemi, protože bylo plno.

Javistky nevypadají jako matfyzák
Javistky nevypadají jako matfyzák

OK, další v plánu mám „Vývoj a architektura java aplikace pro 10 mil. uživatelů“ prezentované Ladislavem Skokanem. Jednalo se o popis řešení online aplikace pro sčítání obyvatel. No opravdu se nezlobte, ale informace o tom, že to jede na web logicu, „tady jsme potom přidali ještě jeden server“, „čteme data z databáze, tak je vhodné cachovat“…k čemu tato prezentace byla? Možná k pláči. Takže se na mě, vážení pořadatelé, nezlobte, ale odcházím. Vypouštím Contexts and Dependency Injection i MDA platformy Paternoster (pokud je vůbec za tím MDA skryta Model Driven Architektura).

Na závěr ještě zamyšlení – proč jsou novinky prezentovány vývojářům, když ti v těžké většině nemohou mít na výběr použité technologie pražádný vliv? Jasně, pokud dělám vlastní projekt, rád si ozkouším mnoho věcí a novinek, ale pokud by se mělo jednat o nějaký long-term projekt – kdo by riskoval použití novinek z něčeho, co se mění dle měsíčních fází? Nehledě na to, že zadavatel si většinou vybere něco, co už je drahně let za horizontem a co dokáží jeho ajťáci spravovat? Slovy klasika: „srsly, wtf?“ Možná by byly do budoucna vhodnější nějaké detailně probrané case studies konkrétních implementací, případně workshopy, nebo reálné zkušenosti. Že by právě proto tolik frčely všechny ty hackathony a klasické konfery začínaly taky patřit do doby dinosaurů?

PS. Negativní vyznění nemá nic společného s tím, že jsem nedostal kabelku s letáky a reklamní flashdisk, ani fakt, že jsem se večer před konferou nepěkně sejmul.

Duben, na Sicilii budem

Vloni jsem v dubnu vyrazil na sever, letos na jih. Sebral jsem sobe jeste dva cloveky a jeli jsme se ohrat na Sicilii – trochu se opalit a podivat se, jak jim zraji citrony. Akce to byla veskrze relaxacni, tak jsem se zrelaxoval uz ve vlaku do Bratislavy a po vystoupeni jsem hned platil pokutu … Pokračovat ve čtení „Duben, na Sicilii budem“

Vloni jsem v dubnu vyrazil na sever, letos na jih. Sebral jsem sobe jeste dva cloveky a jeli jsme se ohrat na Sicilii – trochu se opalit a podivat se, jak jim zraji citrony. Akce to byla veskrze relaxacni, tak jsem se zrelaxoval uz ve vlaku do Bratislavy a po vystoupeni jsem hned platil pokutu za ruseni nocniho klidu, pekny zacatek. Na noc na letisti jsem se teda radsi trochu namaskoval, abych byl na vsech tech kamerach in-kog-ni-to!

Jsem rozmazany ital (snad je ten link z FB videt)
Jsem rozmazany ital (snad je ten link z FB videt)

Bydleli jsme v mestecku Paceco, kousek od Trapani. Hosteloapartman na dve noci jsme meli za naprosto bezkonkurencni cenu vcetne snidane – primo v ulickach, ktre vypadaly, jako nekde mnohem vic na jihovychode. Pesu tam bylo vsude pozehnane, stejne tak kocek (ctyrnohych). K udiveni byly dale zlute citrony na stromech a nasazujici fiky.

Baghdad? Ne, Paceco!
Baghdad? Ne, Paceco!

Vylet to byl jako z jineho sveta – takhle casne ze zacatku roku a slunce tu bylo neuveritelne ostre, pomerne nezvykla krajina a predevsim zajimave kvetouci stromy. Taky potvrzeni nazoru, ze i v nejvetsi spelunce se clovek naji lip, nez ve vyhlasene italske restauraci v cechach. Nekteri z nas (ti co neradi ostre) se u jidla i pekne zapotili, ze, Fando? 😉

Cervenostrom
Cervenostrom

O cistym mori plnym zivota ani nemluvim, to je jaksi samozrejme :-), stejne tak poulicni trhy s vybornym syrem, olivama… kde davaji jen tak ochutnat. Taky jsme tu potkali krajana, ktery tu zije uz deset let a somruje pred obchodem se svym ctyrnohym kamaradem.

Kostel v Erice
Kostel v Erice

Nenechali jsme se zlakat zvanim na jidlo a vyhoupli se na kopec do Erice – vesnicky prilepene na hrad, pred kterym tam stal Venusin chram. Spousty krivolakych kamennych ulicek, spousty kycovitych fotek, muzete se sami presvedcit. Na geocaching.com je tez mozne se presvedcit, ze se nam tu nezadarila jedina keska, i kdyz jsme se snazili, skoda.

Jedna ze sirsich ulic v Erice
Jedna ze sirsich ulic v Erice

Z kopce byl neuveritelny vyhled na vsechno kolem, i na more v oparu zahalene, nahoru na kopec serpentiny – asi to na autobus nebude, mozna proto vede nahoru lanovka, kterou jsme cestou nahoru i dolu rozhoupavali.

Pohled na vychod - smer Palermo
Pohled na vychod - smer Palermo

Povedla se nam ale keska aspon na letisti noc pred odletem. A na letisti se nam podarilo vice ulovku – predevsim startujici F-18 a F-16 smer Lybie. Chci tam znovu – je tam moc pekne a jsou tam prijemni lide. Mimo jine bych rad kouknul na Etnu, kdyz uz tam budu a na par dalsich mist, ale v lete tam rozhodne nepojedu, to bych se upekl. V neposledni rade se tam taky da jezdit zadarmo vlakem – cestu na letiste jsme jeli vlakem, protoze jsme nevyspekulovali, odkud jezdi autobus (zastavuje pokazde jinde a skoro nikdy primo na zastavce). Na nadrazi se neprodavaji listky, tak jsme vlezli rovnou do vlaku – pruvodciho delal masinfira a kdyz zjistil, ze se s nama italsky nedomluvi, mavl rukou a jelo se.

Google I/O Extended Brno

Jsa pln dojmů z dvouhodinové návštěvy akce Brněnské GUG s promítáním live streamu z Google I/O si asi budu nucen ublognout nějaké postřehy a komentáře, i když je jasné, že zítra toho bude plné podhoubí (twittosféra je nasycena už teď). Protože ale paralelně sleduju další stream, tak to bude jen velmi stručně. Akce začala v … Pokračovat ve čtení „Google I/O Extended Brno“

Jsa pln dojmů z dvouhodinové návštěvy akce Brněnské GUG s promítáním live streamu z Google I/O si asi budu nucen ublognout nějaké postřehy a komentáře, i když je jasné, že zítra toho bude plné podhoubí (twittosféra je nasycena už teď). Protože ale paralelně sleduju další stream, tak to bude jen velmi stručně.

Akce začala v 18 hodin našeho času, dostali jsme k ní nějaké doughnuty, pitivo a heslo na wifi, pak se již mohlo začít. Nutno poznamenat, že slibovaní hosté zřejmě nedorazili (utekl jsem dřív pryč a koukám, že Jakub Čížek se nechecknul na Gowalle, spot jsem dokonce musel vytvářet já :-)).

První uvedenou novinkou byly Google Movies (pokud se to fakt tak jmenuje) – služba umožňující pronájem videa a jeho spuštění na jakémkoliv zařízení svázaném s vaším google accountem. Pronájmem mám na mysli opravdu pronájem – za pár dolarů si koupíte práva na zkouknutí filmu, na což dostanete nějakých 30 dní, po započetí sledování 24 hodin. Pro android by měla existovat nová aplikace Movies a jak se dalo čekat, je to US only.

Dalším uvedeným produktem byl Google Music, v betaverzi. Funguje stejně, jako Amazon cloud player – (pouze ve státech) nedá se nakupovat hudba, ale je možné hudbu si tam skrze aplikaci (zmíněna platforma Windows a Mac) nahrát a odtud z jakéhokoliv zařízení se stejným google účtem streamovat. Ano, streamovat – aby se prostor nedal využít k pirátským aktivitám. (pouze bych rád dodal, že doufám v brzké chcípnutí Sony, EMI a dalších ne zkostnatělých institucí, ale rovnou zkamenělých, které by si měly uvědomit, že hudbu nezabíjí kopírování, ale ony!) Pro streaming opět existuje aplikace na marketu, ale na žádném mém zařízení nejde stáhnout :-(.

US Only
US Only

Vývojáři také byli ujištěni, že svoje aplikace budou vyvíjet pouze jednou pro všechna zařízení – i Google TV bude mít android market. Znamená to teda zřejmě, že se vývoj neforkne pro tablety (a další zařízení) a telefony, jak to vypadalo doteď. Neznamená to ale samozřejmě zpětnou kompatibilitu, pořád bude samozřejmě existovat minimalSDK v manifestu.

Další peckou je vydání Accessory development kitu založeného na Arduinu (samozřejmě je vše otevřené, takže je možné očekávat boom hardwarových serepatiček, jako příklad bylo uvedeno sportovní náčiní) a vůbec větší podpora dalšího hardwaru, mimo jiné bude USB fungovat jako host, takže bude možné připojit klávesnice, gamepady a další věcičky. Demonstrace proběhla na gigantickém bludišti ovládaném tabletem s akcelerometry.

Bludiště

S tím souvisí představení dalšího produktu – Android@home – Androidu jakožto centrálního bodu pro ovládání inteligentních domů. A to počínaje nastavováním termostatu, zhášením světel, ale také multimédii – demonstrována byla výše zmíněná služba Music, kdy zakoupenou hudbu bylo možné pomocí telefonu pustit a jako výstupní zařízení nastavit hifi v obýváku a přehrávač v kuchyni.

Android@home
Android@home

To je víceméně vše, na co si z úvodu vzpomínám a teď mi běží ve streamu další android novinky a jsou to takové pecky, že se omlouvám a jdu sledovat! Jasné je, že je možné se v dohledné době těšit na obrovský boom gadgetů a všemožných více či méně praktických zařízení připojitelných k androidu a také samozřejmě S androidem. Jako třeba tablet Galaxy Tab, který dostali účastníci konference jako dárek.

PS. pomocí Moderátoru je možné pokládat otázky pro jednotlivá témata.

Jak se dostat na zabezpečené služby státní správy?

Pod mírně bulvárním názvem tohoto blogpostu nehledejte žádný návod na hákování webů státních institucí. Pouze jsem se snažil vytvořit klienta (v Javě) pro komunikaci s webovými službami nalézajícími se na serveru, který je zajištěn certifikátem vydaným certifikační autoritou PostSignum a aby to nebylo tak jednoduché, tak uživatel je autentikován na základě osobního certifikátu. Každý slušný … Pokračovat ve čtení „Jak se dostat na zabezpečené služby státní správy?“

Pod mírně bulvárním názvem tohoto blogpostu nehledejte žádný návod na hákování webů státních institucí. Pouze jsem se snažil vytvořit klienta (v Javě) pro komunikaci s webovými službami nalézajícími se na serveru, který je zajištěn certifikátem vydaným certifikační autoritou PostSignum a aby to nebylo tak jednoduché, tak uživatel je autentikován na základě osobního certifikátu.

Každý slušný člověk začne nejprve googlením, kdy najde nejeden příklad navazování spojení pomocí https (řekněme HTTP over TLS), další googlení potom poodkryje další příklady, tentokrát jak použít klientský certifikát. Na tomto základě už je možné začít stavět, nejprve tedy metoda pro získání ssl socket factory, kterou použijeme pro kontrolu identity:

[code lang=“java“]
private SSLSocketFactory getFactory(File pKeyFile, String pKeyPassword) throws…{
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream keyInput = new FileInputStream(pKeyFile);

keyStore.load(keyInput, pKeyPassword.toCharArray());
keyInput.close();
keyManagerFactory.init(keyStore, pKeyPassword.toCharArray());
SSLContext context = SSLContext.getInstance("TLS");
context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());

return context.getSocketFactory();
}
[/code]

Tato factory se předá do vytvářeného zabezpečeného spojení, kdy je tímto způsobem poskytnut údaj pro autentikaci uživatele na straně serveru. Tedy metoda vracející toto spojení:

[code lang=“java“]
public HttpsURLConnection getConnection() throws …{
URL url = new URL("https://server:844/");
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

con.setSSLSocketFactory(getFactory(new File("cert_sign.p12"), "heslo"));

return con;
}
[/code]

Teď je možné se pomocí zavolání connect() připojit, ale protože nejsou v úložišti důvěryhodných certifikátů vložené certifikátu serveru, snaha o připojení skončí s výjimkou:

[code]
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
[/code]

Nejprve jsem se snažil mezi důvěryhodné certifikáty importovat certifikát kořenové autority PostSignum pomocí nástroje keytool

[code lang=“shell“]
sudo keytool -import -alias gwc.cpost.cz -keystore /etc/java-6-sun/security/cacerts -file root.pem
[/code]

což však nevedlo nikam, potřeboval jsem konkrétní certifikáty konkrétního stroje a s tím mi pomohla utilitka InstallCert (zdrojový kód, takže je to důvěryhodné ;-)). Vytvořený soubor jssecacerts je vlastně původní cacerts s přidanými certifikáty požadovaného serveru, takže je možné jej nakopírovat na odpovídající místo, pomocí keytool -list se podívat, jestli je vše v pořádku a opět vyzkoušet spojení.

Spojuje se, ale to je tak celé, takže se teď zabývám následujícími odkazy: