23. března 2012

Flex certifikace

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)

13. března 2012

WebSphere MQ, interakce s Javou

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();
    }
}

9. března 2012

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

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.

1. března 2012

Rok s Kindlem

Tak už je tomu rok, co jsem si koupil Kindle. Rok je vhodná doba k bilancování, takže co mi za tu dobu prošlo čtečkou? (Jde o odborné knížky, které jsem buď přečetl, nebo "významně" rozečetl. Pořadí je náhodné, tak jak to zrovna teď mám srovnaný ve čtečce.)