- /
- Posts/
Posts
2012
Flex, pár drobností
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
- 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).
CREATE TABLE result_log (do které vložíme dva záznamy odpovídající našemu intervalu (17:00-7:00):
code VARCHAR2(20),
logged DATE
);
INSERT INTO result_log VALUESVýsledek by měl vypadat nějak takto:
('codeA', TRUNC(sysdate - 1) + 22 / 24);
INSERT INTO result_log VALUES
('codeB', TRUNC(sysdate) + 5 / 24);
SELECT code, TO_CHAR(logged,
'YYYY-MM-DD HH24:MM:SS')
AS logged
FROM result_log;
CODE LOGGEDPož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):
-------------------- -------------------
codeA 2012-04-05 22:04:00
codeB 2012-04-06 05:04:00
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');
EVELUATIONJelikož 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ě:
----------
1
1
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')
);
EVALUATIONElegantní 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.
----------
1
ActiveMQ, messaging podle Apache
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
- scheme://host:port?queryKey=queryValue
<transportConnectors>Message Storage
<transportConnector
name="openwire"
uri="tcp://localhost:61616?trace=true"/>
<transportConnector
name="ssl"
uri="ssl://localhost:61617"/>
<transportConnector
name="vm"
uri="vm://localhost"/>
</transportConnectors>
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.
- 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
- failover://(tcp://master:61616,tcp://slave:61616)
![]() |
| Shared nothing master/slave (zdroj ActiveMQ in Action) |
![]() |
| Shared storage master/slave (zdroj ActiveMQ in Action) |
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 ActiveMQ s WebSphere 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.
Lepší testování v Clojure: Midje
Změna syntax highlightingu a konvence kódu
Flex certifikace
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)
<?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
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.
- Vytvoří se instance Queue Manageru.
- Z něj se získá instace Queue, s parametrem daného typu otevření (procházení, vstup, výstup atd.).
- Vytvoří se Message a nastaví se jí nějaká data.
- Zpráva se vloží do (nebo načte z) fronty.
- 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();
}
}
- LDAP server (com.sun.jndi.ldap.com.sun.jndi.fscontext.RefFSContextFactory),
- File system (com.sun.jndi.fscontext.RefFSContextFactory).
Výsledná konfigurace vypadá takto:
- Vytvoření InitialContext.
- Vyhledání ConnectionFactory.
- Vytvoření Connection.
- Vytvoření Session.
- Vytvoření Destination.
- Vytvoření MessageProducer/MessageConsumer.
- Vytvoření Message (pro producenta).
- Odeslání (příjem) Message.
- 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
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):
- Message Queue Interface (MQI) - proprietární rozhraní umožňující kompletní přístup k WMQ.
- Java Message Service (JMS) - Java specifikace pro asynchronní messaging.
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.
- odesílající Message Channel Agent (MCA),
- přijímající MCA,
- komunikační spojení.
- Vytvoření queue managera.
- Vytvoření dead-letter queue.
- Vytvoření local (remote) queue.
- Vytvoření transmission queue.
- Vytvoření message channelu.
- (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:
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
ePub v cloudu
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á).











