středa 13. srpna 2014

Vertica a historické dotazy

Sloupcová databáze Vertica má zajímavou vlastnost, která umožňuje dělat dotazy i na již neexistující data (smazaná nebo změněná).
Syntaxe vypadá tak, že se před běžný dotaz SELECT předřadí čas, ve kterém nás zajímá stav dat:

at time '2014-08-13 00:30:00' select * from moje;

Celé to funguje tak, že Vertica po operaci DELETE nemaže smazané řádky přímo, ale jenom je jako smazané označí. Operaci UPDATE Vertica implementuje jako smazání řádku a vložení nového (DELETE+INSERT).

Metadatům o smazaných řádcích Vertica říká delete vektory a jejich stav můžeme zjistit ze systémové tabulky delete_vectors:

select projection_name,sum(deleted_row_count) as deleted_row_count,floor(sum(used_bytes)/1024) as used_kb from delete_vectors group by projection_name order by projection_name;
 projection_name | deleted_row_count | used_kb 
-----------------+-------------------+---------
 moje_super      |                 5 |      16

To, jak daleko do historie Vertica "vidí", se konfiguruje pomocí parametrů HistoryRetentionTime (počet sekund) nebo HistoryRetentionEpochs (počet zpětně uchovávaných epoch). Pokud oba parametry nastavíme na -1, Vertica si bude smazaná data pamatovat navždy.

Seznam aktuálních epoch můžeme zjistit ze systémové tabulky epochs:

select * from epochs;
       epoch_close_time        | epoch_number 
-------------------------------+--------------
 2014-08-13 12:05:52.71345+02  |        16259
 2014-08-13 14:49:47.034859+02 |        16260
 2014-08-13 14:49:47.04223+02  |        16261

Pro zjištění údajů o aktuální epoše můžeme využít funkce:

select GET_AHM_TIME() as time, GET_AHM_EPOCH() as epoch;
                      time                      | epoch
------------------------------------------------+-------
 Current AHM Time: 2014-08-13 14:49:47.04223+02 | 16261

AHM znamená Ancient History Mark a je to značka, označující nejstarší uchovávanou epochu -- starší epochy je možné smazat.

AHM je možné nastavit i ručně, funkcemi SET_AHM_TIME (nastaví AHM na daný čas),
SET_AHM_EPOCH (nastaví AHM na danou epochu), MAKE_AHM_NOW (nastaví AHM na aktuální čas).

Skutečné mazání dat (PURGE) z epoch starších než AHM řídí Vertica automaticky nebo je můžeme vyvolat ručně.
O automatiku se stará komponenta Tuple mover při provádění operace mergeout -- neplést s operací moveout, která přesouvá data z Write Optimized Storage (WOS) do Read Optimized Storage (ROS).
Ruční purge můžeme provést funkcemi PURGE_TABLE (provede purge dat v dané tabulce a všech jejích projekcích), PURGE_PROJECTION (provede purge dat v dané projekci) a PURGE (provede purge v celém databázovém schématu).

sobota 8. února 2014

QR Platby v Javě

QR Platba je způsob jak do QR kódu zakódovat informace pro provedení bankovního příkazu k úhradě. Anglicky se prý QR Platba řekne SPAYD - Short Payment Descriptor. Pro generování QR Plateb v Javě existuje knihovna spayd-java, která oplývá velice nepříjemným rozhranním a není publikována do centrálního repa Mavenu.
Knihovna je pod opensource licencí Apache, takže jsem na jejím základě vyrobil knihovnu Geek SPAYD, která je orientovaná na vývojářův prožitek. Zdrojáky jsou na GitHubu a binárky v centrálním Mavenu.

neděle 14. dubna 2013

Odpustil jsem OpenJDK (a opustil Sun JDK)

Oracle se snaží seč může, aby zařízl Sun JDK ve prospěch OpenJDK, ale OpenJDK má v komunitě java vývojářů dost špatnou pověst. Přestože se mě odpor k OpenJDK také týkal, neumím přesně vysvětlit, co za ním stojí. Udělal jsem na toto téma letmou nereprezantativní anketu, a odpovědi měly společný jmenovatel: "zkoušel jsem, nefungovalo", s tím, že většina problému se týkala desktopu a SWINGu.
Shodou okolností jsem ale před časem právě na desktopu začal OpenJDK používat, a protože jsem nenarazil na žádný problém, chystám se ho vyzkoušet i na serveru. Klíčem ke štěstí je odpuštění, říká Gerald Jampolsky, ale v mém případě to bude hlavně o tom, že si instalační balíčky nebudu muset vyrábět sám, ale použiju OpenJDK, které je součástí distribuce.
Jaký je ale rozdíl mezi Sun JDK a OpenJDK? Nejmenovaný zdroj z Oracle říká, že více jak 99% zdrojových kódů je shodných, kromě částí které obsahují kód třetích stran, a které nemohly být opensourcovány (např. font resterizer).
OpenJDK také neobsahuje doplňky prohlížečů Java Plugin a Java Web Start, instalátory pro Windows nebo MacOS (podporován je zatím jenom Linux), servisní podporu (SNMP agent nebo Fligth Recorder) a speciální platformově závislá rozšíření (ucrypto security provider pro Solaris nebo Windows accessibility bridge).

středa 22. srpna 2012

Zeroturnaround: Continous Delivery webinář

Na webináři byla ukázána jednoduchá javová webová aplikace, kde ke continous delivery používali:
Zaznameníhodné záležitosti:
  • build number propagovali do maven verze artefaktů
  • všechny buildy kromě prvního byly parametrizované build číslem prvního buildu v pipeline, čímž toto číslo procházelo přes všechny fáze pipeline
  • v Nexusu měli pro každou fázi pipeline vlastní repozitář a pokud artefakt úspěšně prošel fází, do následujícího repozitáře artefakt prostě překopírovali (tj.v posledním "ready for production" bylo relativně málo artefaktů)
  • deployovali do repa nejenom war archivy, ale i další artefakty (txt soubory) a v následující fázi je z repozitáře vybírali pomocí dependency:get
Zajímavým způsobem bylo řešené zařazení manuálního testování do pipeline: mail plugin poslal QA oddělení mail, že build je možné manuálně testovat a po otestování mají kliknout na link, čímž se spustila další fáze v pipeline (pomocí buildWithParameters?xxx=yyy).

Škaredé bylo, že build příkazy pro jednotlivé fáze byly zapsané jen v konfiguraci jenkins jobů a nebyly součástí version control.

Ve výsledku to bylo opravdové continous delivery, ale celé řešení v Jenkinsu to na mě působilo strašně na koleně spíchnutým a nerobustním dojmem. Možná to bylo tím, že to celé mělo být promo na LiveRebel a ne Jenkins, i když s Jenkinsem se na webináři strávilo zdaleka nejvíc času.

středa 7. března 2012

Java tipy

Debianovský balíček java-package, který slouží k vytváření debianovských balíčků z distribučních archivů Javy, se po ukončení licence DLJ probral k životu a podporuje Sun Java 7. Musím vyzkoušet.

Eclipse ani Subversion už dlouho nepoužívám, ale co kdyby se někdy hodilo nastavení pluginu Subclipse
  • nastaveni svn+ssh
  • Linux: apt-get install libsvn-java eclipse.ini: -Djava.library.path=/usr/lib/jni
Chyba při spouštění Jetty: No suitable Log constructor - problém je v knihovně commons-logging, vyřeší překopírování webapp/WEB-INF/lib/log4j-*.jar do adresáře Jetty ext/.

pondělí 28. listopadu 2011

Oracle zakázal distribuci Sun JVM/JDK

Oracle prosazuje OpenJDK a jako způsob zvolil zrušení licence "Operating System Distributor License for Java" (DLJ), která linuxový distribucím dovolovala vzít Sun JVM/JDK a poskytovat ji uživatelům prostřednictvím distribučních balíčků. Jediným způsobem jak získat Sun JVM/JDK je jejich stažení z Oracle webu. Laxně to na svém blogu oznámil Dalibor Topic (můžete si ho pamatovat z Oracle Java Developer Conference 2011) s tím, že tím pádem končí i distribuční web http://jdk-distros.java.net/

Žádná linuxová distribuce (Debian, Ubuntu, CentOS,...) tak nesmí distribuovat balíčky s Javou 7 a možná bude nutné balíčky odebrat i z vydaných distribucí, ale především také bezpečnostní aktualizace Javy 6. Uživatelé, kteří mají nainstalované balíčky se Sun Javou, tak už neobdrží žádnou bezpečnostní aktualizaci a jejich systémy jsou tak zranitelné vůči bezpečnostním chybám.
Z unstable verze Debianu už byla odebraná Sun Java 6 a podrobně o situaci na svém blogu informuje správce debianovských balíčků. Ubuntu 11.10 (Oneiric Ocelot) už Sun Javu také neobsahuje.

Jediným způsobem jak provozovat Javu v Linuxu tak zůstává OpenJDK (i se všemi jeho nedostatky) nebo instalace po stažení z webu Oracle -- naštěstí Oracle alespoň pro Javu 7 už nepoužívá instalátor a tar.gz balíček stačí stáhnout a rozbalit do /usr/lib/jvm podle návodu.

sobota 18. června 2011

Social overdose

Mám účty na různých sociálních sítích a webech (Facebook, Twitter, Picasa, Youtube,...) a poslední dobou mě čím dál míň baví pravidelně obrážet skvadru serverů a zjišťovat, co je kde nového, kdo dal komu palec, pěst nebo kopačky. Když k tomu přidám konkrétní specifika těch sítí jako nepochopitelné řazení zpráv Facebooku nebo Twitter klienty, kteří mi na různých zařízeních (počítač/notebook/mobil/tablet) pořád do kolečka cpou jako novinky zprávy, které už jsem četl, moje frustrace dosahuje vrcholu.

Před lety byl podobný problém s blogy, a aby těchto důvodů člověk nemusel dokolečka mezi svými oblíbenými blogy pendlovat, vznikl formát RSS. Prostřednictvím něho blogy upozorňují na nové články, a uživatel upozornění nebo přímo plný článek dostane do své RSS čtečky (např. Google Reader). Samozřejmě pro web, které vlastní RSS nemají je tady RssGeek :) Nedělám si ale iluze, že by bylo možné, aby vznikl nějaký univerzální formát pro výměnu zpráv ze sociálních sítí.

Úplně by mi stačila aplikace, která by na jednom místě zobrazila novinky, fotky, linky a další obsah, co mí 'kamarádi' do těchto sítí zadají. Také by měla zobrazovat, jestli můj obsah dostal palec, hvězdičku, retweet nebo podobně. Aplikace by odlišila už přečtené zprávy a decentně by zobrazila různé notifikace nebo zprávy méně důležité (např. odkaz dostal další palec nahoru). Měla by umět kvalitně filtrovat (např. žádná videa od uživatele X, nebo žádné twíty z tagem #xyz) a měla by se umět rozumně se vypořádávat s duplicitami (video poslané na Facebook a zároveň YouTube nebo zpráva poslaná na Twitter a zároveň na Facebook) ať už od uživatele stejného nebo více různých. Aplikace by asi měla být webová a vhodná by byla mobilní verze nebo alespoň rozhraní uzpůsobené pro mobil nebo tablet.

Velké naděje jsem vkládal do Google Buzz - ten zobrazuje zprávy z různých sítí jenomže jen od lidí, se kterými na Buzzu kamarádím a dělá tak přesný opak toho co potřebuji: místo aby objem informací redukoval je násobí. Ten stejný případ je FriendFeed. Nejblíže mým představám je Friend Stream od HTC, ale kromě jiného je jenom pro mobil.

Znáte takovou aplikaci? Pokud ne, chybí Vám? Chtěli byste takovou používat?