Přeskočit na hlavní obsah

Posts

2012


Flex, pár drobností

·3 min

Při studiu na nedávnou Flexovou certifikaci jsem se musel poměrně hodně hluboko ponořit do Flexové dokumantace. A to jak do reference ActionScriptu, tak do konceptů a architektury samotného Flexu Using Flex. Důvod byl jednoduchý — nedostatek praxe jsem musel nahradit porozuměním.

Protože se mi architektura Flexu líbíla, rád bych se k němu vrátil a pro ten případ si tady chci zaarchivoval pár věcí, které mne zaujaly.

Bidirectional binding #

Pokud chci mít obousměrné datové propojení dvou komponent, mám k dispozici tři způsoby. Buď je vzájemně provázat jednosměrným bindingem:

Oracle, vyhodnocení časových podmínek

·2 min
Dneska jsem řešil (pro mne) zajímavý případ - potřeboval jsem v Oracle databázi postavit dotaz s následujícími parametry:

  • zkontrolovat, že dva určité záznamy mají hodnotu DATE mezi 17:00 včerejšího dne a 7:00 dnešního dne,
  • jako výstup dotazu mít hodnotu true nebo false (v Oraclu 1 a 0).
Dejme tomu, že máme následující tabulku
CREATE TABLE result_log (
code VARCHAR2(20),
logged DATE
);
do které vložíme  dva záznamy odpovídající našemu intervalu (17:00-7:00):
INSERT INTO result_log VALUES
('codeA', TRUNC(sysdate - 1) + 22 / 24);
INSERT INTO result_log VALUES
('codeB', TRUNC(sysdate) + 5 / 24);
Výsledek by měl vypadat nějak takto:
SELECT code, TO_CHAR(logged,
'YYYY-MM-DD HH24:MM:SS')
AS logged
FROM result_log;
CODE                 LOGGED
-------------------- -------------------
codeA 2012-04-05 22:04:00
codeB 2012-04-06 05:04:00
Požadované záznamy (codeA, codeB) vybereme následujícím dotazem a zároveň je ohodnotíme, že jsou/nejsou z daného časového intervalu (1 = jsou, 0 = nejsou):
SELECT
CASE
WHEN (logged BETWEEN
(TRUNC(sysdate - 1) + 17 / 24) AND
(TRUNC(sysdate) + 7 / 24))
THEN 1
ELSE 0
END AS eveluation
FROM result_log
WHERE code IN ('codeA', 'codeB');
EVELUATION
----------
1
1
Jelikož nad výsledky potřebujeme v podstatě provést logickou konjunkci (AND) můžeme k tomuto účelu použít funkci DECODE. Výsledný dotaz pak vypadá následovně:
SELECT DECODE(SUM(eveluation), COUNT(*), 1, 0)
AS evaluation
FROM
(SELECT
CASE
WHEN (logged BETWEEN
(TRUNC(sysdate - 1) + 17 / 24) AND
(TRUNC(sysdate) + 7 / 24))
THEN 1
ELSE 0
END AS eveluation
FROM result_log
WHERE code IN ('codeA', 'codeB')
);
EVALUATION
----------
1
Elegantní na tomto řešení je, že stačí pouze přidat do klauzule WHERE další kód (codeC) a vše ostatní bez problémů dál funguje.

ActiveMQ, messaging podle Apache

·3 min
Poslední dobou jsem se zabýval integračním projektem, který používal komerční technologii od IBM - WebSphere Messaage Broker, který jako infrastrukturu využívá WebSphere MQ. Abych měl, jako solution architekt, k tomuto řešení nějakou alternativu, rozhodl jsem se nastudovat open source messagingovou platformu ActiveMQ od Apache Software Foundation (ASF).

ActiveMQ je messagingový server postavený nad specifikací Java Message Service (JMS), a který ve spojení i frameworkem Apache Camel implementuje Enterprise Integration Patterns (EIP). Obecné vlastnosti ActiveMQ se dají shrnout do následujících bodů:
  • implementace JMS 1.1,
  • integrace se Springem,
  • integrace s (Java) aplikačními servery,
  • vlastní protokol OpenWire pro high perfomance klienty v Javě, C, C++ a C#,
  • embedded broker,
  • broker clustering,
  • REST API,
  • AJAX API,
  • ad.
Výborným zdrojem informací je kniha AcitveMQ in Action přímo od autorů a přispěvatelů ActiveMQ. Vypíchnul bych z ní pár momentů, které mne zaujaly.

Komunikační protokoly
Klienti se můžou k brokeru připojit pomocí různých protokolů, které jsou vystaveny pomocí tzv. transportních konektorů. Mmj. jsou k dispozici obligátní:
  • TCP
  • SSL
  • HTTP(S)
  • UDP
Pokud klient i broker běží v jednom JVM, může klient použít VM protokol, který spustí embedded broker. Komunikace pak neprobíhá po síti, jako u ostatních typů konektorů, ale klient volá přímo metody na objektu (instanci) brokeru.

Pro konfiguraci konektoru se používá následující URI:
  • scheme://host:port?queryKey=queryValue
Konfigurace několika konektorů pak může vypadat třeba takto:
<transportConnectors>
<transportConnector
name="openwire"
uri="tcp://localhost:61616?trace=true"/>
<transportConnector
name="ssl"
uri="ssl://localhost:61617"/>
<transportConnector
name="vm"
uri="vm://localhost"/>
</transportConnectors>
Message Storage
JMS specifikace definuje dva způsoby doručení zpráv (DeliveryMode) - perzistentní a neperzistentní. Pokud jsou zpráva, nebo producent nastavený jako perzistentní, musí JMS provider zajistit bezpečné uložení zpráv (aby např. přežily výpadek serveru). ActiveMQ nabízí pro uskladnění zpráv čtyři strategie:

  • KahaDB message store. Rychlá a škálovatelná file-based perzistence s transakčním žurnálem a rychlým zotavením.
  • AMQ message store. Předchůdce KahaDB, obdobné vlastnosti.
  • JDBC message store. Perzistence zpráv do relační databáze.
  • Memory message store. Všechny pezistentní zprávy jsou drženy v paměti, tj. nejsou perzistovány ve smyslu JMS specifikace.
KahaDB se skládá ze tří komponent:
  • Cache drží zprávy pro aktivní konzumenty.
  • Data logy slouží jako transakční žurnál. Obsahují uložené zprávy a transakční příkazy.
  • BTree indexy referencují zprávy v data logu.

Schéma KahaDB  (zdroj ActiveMQ in Action)

REST API
ActiveMQ poskytuje jednoduché API pro publikaci a konzumaci zpráv RESTovým způsobem. Vzhledem k tomu, že JMS poskytuje pouze dvě operace - send a receive - je mapování na HTTP velmi přímočaré. Pro publikování zpráv je to (HTTP) POST, pro jejich konzumaci (HTTP) GET nebo DELETE.

Mapování na URI pak vypadá takto:
  • http://host:port/queue
  • http://host:port/topic/subtopic

High Availability
Pokud budeme chtít zajistit vysokou dostupnost našeho messagingového řešení, budeme potřebovat několik brokerů běžících na různých strojích. Něco jako:


High Availability v režii ActiveMQ je zajištěna dvěma typy Master/Slave konfigurací:
  • Shared nothing
  • Shared storage
U shared nothing konfigurece má master i slave vlastní message store. Slave se po startu připojí k masteru a veškeré stavy masteru (zprávy, akcknowledgements, transakce atd.) jsou replikovány na slave. Když master spadne, jsou všichni klienti přesměrováni (pomocí fail over protokolu) na slave, který se stává novým masterem. Konfigurace fail over protokolu vypadá takto:
  • failover://(tcp://master:61616,tcp://slave:61616)
Omezením tohoto řešení je, že master může mít definovaný pouze jeden slave (a slave nemůže mít definovaný další vlastní slave).

Shared nothing master/slave (zdroj ActiveMQ in Action)
Shared storage konfigurace umožňuje, aby bylo definováno více slave brokerů, které spolu s masterem, sdílejí společný storage mechanismus - tím může být sdílený filesystem, nebo relační databáze. Master má pak storage zamknutý. Když master spadne, jeden ze slave brokerů se stane novým masterem a zamkne si storage pro sebe.

Shared storage master/slave (zdroj ActiveMQ in Action)
Závěrem
Pokud to mám říct jednou větou - ActiveMQ se mi architektonicky/technologicky líbí a pokud bych na nějakém projektu potřeboval řešit messaging v Javě, určitě by to byl žhavý kandidát. Taky mi to nedá, abych nesrovnal ActiveMQWebSphere MQ. Co se týče funkčností, jsou obě řešení srovnatelná. Veliký rozdíl ovšem bude v pracnosti a nákladech - ActiveMQ půjde implementovat nesrovnatelně levněji a rychleji. No a samozřejmě cena, zde je rozdíl astronomický - ActiveMQ je zdarma, WebSphere MQ bude stát řádově miliony korun jenom na licencích.

Další cesta, jak rozvíjet znalosti o ActiveMQ je celkem jednoznačná - Apache Camel, což je implementace EIP od ASF, která řeší věci jako vytváření zpráv, jejich směrování, transformaci, orchestraci ad.

Flex certifikace

·3 min
Dnes jsem úspěšně absolvoval certifikaci Flex 4.5 ACE Exam (Adobe Certified Expert). Protože se živím hlavně jako Java vývojář a solution architect, bylo to pro  mne odskočení do celkem neznámých  vod. Nicméně šel jsem do toho hlavně ze dvou důvodů - jednak z pohledu architekta, bylo pro mne zajímavé poznat novou RIA platformu a druhak, Flex je občas požadován našimi zákazníky jako frontendová technologie (což souvisí i s prvním důvodem, protože dělám i nabídky) a doposud jsme na Flex nabírali externí programátory, takže mít Flexové znalosti se hodí i jako interní kompetence.

Certifikace samotná splnila mé očekávání. Vypíchnul bych hlavně věc související s vnitřní motivací - témata a rozsah certifikace mne přinutily podívat se na Flex platformu/architekturu opravdu do hloubky, takže myslím, že Flex znám na celkem slušné úrovni. Hlavní přínosy bych shrnul do třech bodů:

  • Architektura Flexu se mi velmi líbí. Je to pěkně čistě napsaná Event-Driven Architecture (mám z ní lepší pocit než třeba ze Swingu v Javě). Layout komponent se primárně řeší v MXML, pro nevizuální nebo složitější komponenty slouží ActionScript.
  • ActionScript (implementace ECMAScriptu) je pěkný jazyk, takový lepší JavaScript. Příjemně se v něm píše.
  • Flash Builder je slušné IDE postavené na Eclipse. Oproti Java pluginům/prostředí má ještě co dohánět (hlavně refactoring a content assist), ale na projektu bych ho rád použil. Škoda, že je komerční (Standard edice za $249).

No a teď k samotné certifikaci. Struktura zkoušky je následující:

  • Creating a User Interface (UI)
  • Flex system architecture and design
  • Programming Flex application with ActionScript
  • Interacting with data sources and servers
  • Using Flex in Adobe Integrated Runtime (AIR)

Oproti jiným certifikacím jsem použil docela dost materiálů. Mezi ty které bych určitě doporučil patří výborná kniha Adobe Flex 4.5 Fundamentals. Kniha je skvěle napsaná a poskytuje základní kontext a úvod do Flexu. Chybí v ní pokročilejší témata, jako třeba remoting nebo AIR.

Dalším výborným zdrojem je samotná dokumentace k Flexu, zejména Using Flex a ActionScript Reference. Je toho hodně, takže napomůže drobná selekce pomocí Attest, přípravném test kitu pro Flex 4 certifikaci, napsaném v AIR.

Dále bych doporučil stáhnout si (2měsíční) zkušební verzi Flash Builderu a prostě v něm programovat - kniha Adobe Flex 4.5 Fundamentals má výborný příklad - postupné budování web shopu. Kromě toho jsem si naprogramoval spoustu snipetů, maličkých aplikací třeba jenom na jednotlivé komponenty, např. toto na vícenásobný binding:
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">

<s:layout>
<s:HorizontalLayout/>
</s:layout>

<fx:Binding source="first.text"
destination="destination.text"/>
<fx:Binding source="second.text"
destination="destination.text"/>

<s:VGroup>
<s:TextInput id="first"/>
<s:TextInput id="second"/>
<s:Label id="destination"/>
</s:VGroup>

<fx:Binding source="source.text"
destination="primero.text"/>
<fx:Binding source="source.text"
destination="segundo.text"/>

<s:VGroup>
<s:TextInput id="source"/>
<s:Label id="primero"/>
<s:Label id="segundo"/>
</s:VGroup>

</s:Application>
Co bych doporučil méně (ale považuji také za přínosné) je jednak kniha Flex 4 in Action. Není to špatná knížka, oproti té výše uvedené je dosti ukecaná. Na druhou stranu obsahuje některé pokročilejší témata, např. letmá zmínka o BlazeDS.

Vyloženě špatný také není preparation kit od uCertify, který ale nepokrývá všechna témata zkoušky (nejspíš to připravovali na nějaké betě :-/ Určitě ho ale lze použít jako doplňující materiál.

Na závěr jsem si nechal lahůdku - aneb před čím bych důrazně varoval. Rozhodně se vyhnout produktům firmy Pass4sure!!! Otřesná kvalita, chyby, hrozný!!! V 60 otázkách jsem napočítal 12 zcela jasně chybných "správných" odpovědí a u pár dalších si myslím, že je měli taky špatně. Otřesný.

Kromě výše zmíněných materiálů, které jsem si nechal koupit od firmy, jsem v průběhu učení se "objevil" OneNote, do kterého jsem si začal "psát" poznámky ke zkoušce. Protože jsem si je ale začal psát až v průběhu, jsou nekompletní, nicméně třeba to někomu pomůže:

Příprava na Flex certifikaci (PDF)

WebSphere MQ, interakce s Javou

·3 min

Pokud se chceme k WebShere MQ (WMQ) připojit z Javy, máme k dispozici dvě možnosti - buď použít WMQ třídy pro Javu, nebo je možné komunikovat pomocí Java Message Service (JMS). Obě možnosti mají svoje pro a proti, takže krátké shrnutí v pár bodech:

  • WMQ třídy pro Javu:
    • zapouzdřují Message Queue Interface (MQI),
    • poskytují plnou sadu funkčností WMQ,
    • je to proprietární řešení, ale jednodušší k používání, než JMS.
  • (WMQ třídy pro) JMS:
    • Java “industry standard” pro messaging,
    • je součástí Java EE specifikace (a tedy součástí většiny (Java) aplikačních serverů),
    • umožňuje spravovat administrované objekty (connection factory, fronty ad.) v centrální repository.
Společná konfigurace
Ať už použijeme jeden, nebo druhý způsob, v obou případech je potřeba mít vytvořené některé objekty. Všechny použité typy objektů jsem popisoval již v minulém zápisu. Jedinou informací navíc je, že vytvořený kanál musí být typu server-connection.


WMQ třídy pro Javu
Třídy pro Javu jsou poměrně přímočaré - stačí, pokud člověk rozumí hierarchii a funkci základních objektů ve WMQ:

  1. Vytvoří se instance Queue Manageru.
  2. Z něj se získá instace Queue, s parametrem daného typu otevření (procházení, vstup, výstup atd.).
  3. Vytvoří se Message a nastaví se jí nějaká data.
  4. Zpráva se vloží do (nebo načte z) fronty.
  5. Zavřou se zdroje.
package com.adastracorp.jprase.wmq.java;

import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;


public class JavaProvider {

private static final String QM_NAME = “QM_JAVA”;
private static final String HOSTNAME =
“192.168.6.128”;
private static final String CHANNEL =
“JAVA.CHANNEL”;
private static final int PORT = 5557;
private static final String QUEUE = “JPRASE”;

private static void init() {
MQEnvironment.hostname = HOSTNAME;
MQEnvironment.channel = CHANNEL;
MQEnvironment.port = PORT;
}

public static void main(String[] args)
throws Exception {
init();

MQQueueManager queueManager =
new MQQueueManager(QM_NAME);
MQQueue queue = queueManager
.accessQueue(QUEUE,
CMQC.MQOO_OUTPUT |
CMQC.MQOO_INQUIRE);

MQMessage message = new MQMessage();
message.writeUTF(“Hello, WMQ!");

queue.put(message);

queue.close();
queueManager.disconnect();
}
}

WMQ třídy pro JMS
U JMS je trochu více konfigurace - je potřeba vytvořit Initial Context a do něj vložit Connection Factory a Destination. Destination je mapovaná na (existující) frontu a queue managera. WMQ v současné verzi (7.0.1.2) poskytuje pro JNDI dvě implementace (ale je možné použít i jiné, např. JNDI na WebSphere AS):

  • LDAP server (com.sun.jndi.ldap.com.sun.jndi.fscontext.RefFSContextFactory),
  • File system (com.sun.jndi.fscontext.RefFSContextFactory).


Výsledná konfigurace vypadá takto:


Kód samotný je pak klasické JMS:
  1. Vytvoření InitialContext.
  2. Vyhledání ConnectionFactory.
  3. Vytvoření Connection.
  4. Vytvoření Session.
  5. Vytvoření Destination.
  6. Vytvoření MessageProducer/MessageConsumer.
  7. Vytvoření Message (pro producenta).
  8. Odeslání (příjem) Message.
  9. Zavření zdrojů.
package com.adastracorp.jprase.wmq.jms;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;

public class JmsProvider {

private static final String CONTEXT_FACTORY =
“com.sun.jndi.fscontext.RefFSContextFactory”;
private static final String PROVIDER_URL =
“file:///jms”;

private static Context getContext()
throws NamingException {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,
CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);

return new InitialContext(env);
}

public static void main(String[] args)
throws Exception {
Context context = getContext();

ConnectionFactory factory = (ConnectionFactory)
context.lookup(“jmsConnFact”);
Connection connection = factory
.createConnection();
Session session = connection
.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Destination destination = session
.createQueue(“JPRASE”);
MessageProducer producer = session
.createProducer(destination);
producer.setDeliveryMode(
DeliveryMode.NON_PERSISTENT);
TextMessage message = session
.createTextMessage(
“Hello, JMS!");
producer.send(message);

producer.close();
session.close();
connection.close();
}
}

WebSphere MQ, vzdálené posílání zpráv

·3 min

Chystám teď do firmy takovou kumulovanou prezentaci o Enterprise Integration Patterns (EIP), WebSphere MQ (WMQ) a WebSphere Message Brokeru (WMB), tak bych se chtěl postupně podělit o pár konceptů. První z nich je koncept remote messaging na WMQ.

Následující příklad předpokládá již hotovou instalaci WMQ a je zaměřen na komunikaci dvou instancí WMQ - jedna je na lokálním a jedna na vzdáleném prostředí. Pro vyzkoušení, nebo prezentaci je možné použít i jenom jedinou, lokální instanci. Nejdřív si na úvod definujeme základní komponenty, které bude potřeba vytvořit, a které spolu budou komunikovat:

Queue Manager
Správce front vlastní a spravuje fronty, kanály a další objekty. Je to první WMQ objekt, který je nutné na čisté instalaci vytvořit. Správce umožňuje další objekty vytvářet, konfigurovat, spouštět, vypínat atd. Pro přístup k frontám a zprávám poskytuje queue manager dvě rozhraní (API):


Queue
Datová struktura pro ukládání zpráv. V našem příkladu budeme používat čtyři typy front:

  • Local queue - lokální fronta pro ukládání zpráv.
  • Remote queue - definice fronty, která je vlastněná jiným queue managerem.
  • Transmission queue - (lokální fronta,) dočasné úložiště zpráv určených pro vzdáleného queue managera.
  • Dead-letter queue - lokální fronta určená pro nedoručitelné zprávy.

Message Channel
Poskytuje jednosměrnou komunikační cestu pro přenos zpráv z jednoho queue manageru na druhý. Skládá se ze tří částí:
  • odesílající Message Channel Agent (MCA),
  • přijímající MCA,
  • komunikační spojení.
Na odesílajícím konci je vyžadována transmission queue.

Architektura vzdáleného posílání zpráv
Barevně jsou vyznačeny nově vytvářené objekty. V případě, že existuje pouze jedna (lokální) instance WMQ, je možné oba queue managery vytvořit lokálně. Obecný postup vytvoření objektů je následující:

  1. Vytvoření queue managera.
  2. Vytvoření dead-letter queue.
  3. Vytvoření local (remote) queue.
  4. Vytvoření transmission queue.
  5. Vytvoření message channelu.
  6. (Spuštění sender message channelu.)

Jelikož nejde o tutoriál, nebudu popisovat vytvoření jednotlivých objektů - to je dobře popsáno v dokumentaci. Pouze bych zde zmínil, že všechny uvedené objekty lze vytvořit dvěma způsoby - buď pomocí grafického rozhraní MQ Explorer (velice snadné), nebo pomocí MQ Script Commands (MQSC).

Výsledná architektura vypadá takto:


V uvedeném příkladu se zprávy vkládají do fronty SENDER a jsou přenášeno do fronty RECEIVER. Testovací zprávy je možné jednoduše do front vkládat, procházet a mazat pomocí již zmiňovaného MQ Exploreru (opět viz dokumentace). Pokud chcete zaměstnat i dead-letter queue, vložte zprávu do transmission queue QM_JPRASE, objeví se ve frontě DLQ na správci QM_REMOTE (transmission queue vyžaduje speciální hlavičku, která při běžném vložení zprávy do fronty není vyplněná).

A k čemu je to vůbec dobré, posílat zprávu z jednoho queue managera na jiný? Jenom čistě pro posílání zpráv to samozřejmě smysl nemá - na to by stačily fronty definované v rámci jednoho queue managera, ke kterým by se připojovali komunikující konzumenti a provideři.

Smysl to začíná dávat v momentě, pokud potřebuje komunikovat více queue managarů, např. z důvodů high availability, škálovatelnosti apod.

Rok s Kindlem

·2 min
Koupil jsem si Kindle a musím říct, že za ten rok jsem četl, jak urvaný ze řetězu... 17 odborných knih! 🤦‍♂️

ePub v cloudu

·1 min
Jsem spokojeným majitelem čtečky Kindle. Jedna z věcí, co se mi líbí je, že všechny knihy koupené na Amazonu se automaticky přidají do (amazoního) cloudu. Odtud jsou potom k dispozici např. přes výbornou čtečku v prohlížeči Kindle Cloud Reader. Co se mi naopak nelíbí je, že Kindle (zatím) oficiálně nepodporuje formát ePub (a ani neumožňuje v cloudu umístit knihy koupené jinde, než na Amazonu).

Protože pár knih v ePubu mám a musel bych používat nějakou softwarovou čtečku, uvítal jsem, že je k dispozici také cloudová alternativa. Známé nakladatelství technologických knih O'Reilly (to jsou ty bílé knížky se zvířátkama) rozjelo Bookworm - cloudovou platformu pro online čtení ePub knih.Vyzkoušel jsem, používám a jsem více méně spokojen. Není to sice tak komfortní jako Kindle Cloud Reader a formátování textu není úplně excelentní, ale právě vzhledem ke "cloudovosti" jsem ochotný tyhle nedostatky překousnout.

Bookworm umožňuje upload (a download) vlastních  ePub knih. U rozečtené knihy si pamatuje poslední otevřenou kapitolu. Uživatelské rozhraní trochu připomíná Adobe Reader - vlevo menu s kapitolama, vpravo obsah (kapitoly). Co zatím nefunguje, je vyhledávání v knížkách, ale to by snad mělo být brzo zprovozněno - v helpu už je to popsáno. Co chybí úplně je psaní poznámek a zvýrazňování textu - vlastnost, kterou poměrně hodně využívám u technických knih (a hádejte - Kindle to má).

2011


(Ne)funkční tým

·2 min
Občas se vám stane, že jako team leader vyfasujete nepřátelský tým. Inspiraci jak řešit tuto těžkou situaci možná najdete v knize The Five Dysfunctions of a Team. Krátká recenze + pár citátů.