22. 6. 2015

Jak na OpenShiftu zvýšit Tomcatu PermGen space

Přes nastavitelnou proměnnou prostředí JAVA_OPTS_EXT:

Využitá a maximální hodnota paměti se dá v aplikaci zjistit například takto:

Výstup:

8. 4. 2015

OpenShift - vyčištění git repository

Dostal jsem se do situace, kdy mi došlo místo na OpenShift gearu (Disk Quota Exceeded). Co zabírá nejvíce místa se dá zjistit pomocí příkazu:

Zjistil jsem, že u mě nejvíce místa (cca 800MB z celkového limitu 1GB) zabírá git repository. Je to proto, že přes git aplikaci nasazuji (pushuju celé warko, což je jeden ze dvou možných způsobů - druhý je pushovat kód a aplikaci buildit mavenem na OpenShift serveru).

Protože starší verze nasazených war souborů nepotřebuju, rozhodl jsem se je vymazat z historie gitu a tím místo uvolnit. Dlouho jsem hledal, jak to správně udělat, až jsem došel k tomu, že nejjednodušší bude celé repo smazat a znovu inicializovat. Postup je následující:

Celý postup je popsaný tady: https://forums.openshift.com/how-to-erase-all-history-from-a-git-repository-on-openshift-and-start-over-with

Problém s kodeky v Ubuntu 12.04

Při přehrávání videí v Ubuntu 12.04 jsem občas narážel na problémy s kodeky, zejména když jsem chtěl přehrát video nebo film v Totemu. Dlouho jsem tenhle problém ignoroval, protože co nešlo přehrát v Totemu, šlo vždycky ve vlc. Teď jsem na něj ale narazil znovu, když jsem chtěl převést mp4 soubor do mp3 pomocí programu soundconverter. Po načtení mp4 souboru to hodilo chybu, která je podobná jako to, co hlásil Totem:

Problém jsem nakonec úspěšně vyřešil díky tomuhle řešení:
(viz https://bugs.launchpad.net/ubuntu/+source/gstreamer0.10-ffmpeg/+bug/971012)

Totem teď přehrává všechna videa a funguje i konverze soundconverterem.

7. 4. 2015

Instalace New Relic java agenta pro OpenShift

Příkaz pro instalaci New Relic java agenta pro OpenShift:

kde:
  • <app-name> je název OpenShift aplikace
  • <license-key> je licenční klíč, který se získá registrací do New Relic

viz https://discuss.newrelic.com/t/deploying-new-relic-on-openshift/10522/3

10. 3. 2015

Databázové inserty pro svátky

Do aplikace TrénujPaměť.cz jsem přidával možnost procvičování memorování svátků z kalendáře. K tomu jsem potřeboval mít svátky uložené v databázi, takže jsem si vytvořil tabulku, ve které budou uložené, a jednoduchý program, který mi vygeneruje inserty. Struktura databázové tabulky je jednoduchá:


Vygenerované inserty:


A nakonec jednoduchý java program, kterým jsem je vygeneroval:


18. 11. 2014

Jak vygenerovat SOAP klienta z WSDL pomocí JAX-WS maven pluginu

Možností, jak v Javě vygenerovat SOAP klienta z WSDL, je několik. Já jsem se rozhodl použít JAX-WS maven plugin, protože to mi přijde nejjednodušší. Postup je následující:

1. Vytvořit nový maven projekt:

Tím vznikne nový projekt s názvem soap-test.

2. Upravit pom.xml, který vznikne, tak aby vypadal následovně:

Přidali jsme dependence na jaxws-rt a policy, referenci na plugin jaxws-maven-plugin a řekli maven-compiler-pluginu, že chceme pro build použít Javu 1.6, protože JAX-WS potřebuje nejmíň Javu 5. Sun repository (maven2-repository.dev.java.net) je tam pro případ, že by si maven stěžoval na unresolved dependency na com.sun.xml.ws-rt, jinak není potřeba.

3. Zkopírovat do vytvořeného projektu WSDL soubor

V adresáři src v nově vygenerovaném projektu vytvoříme podadresář wsdl a do něj zkopírujeme náš WSDL soubor. Výsledná cesta k WSDL souboru je pak tedy:

soap-test/src/wsdl/my-service.wsdl

Teď už stačí jen spustit build (mvn install nebo mvn jaxws:wsimport) a vygenerované .java soubory najdeme v adresáři:

soap-test/target/jaxws/wsimport/java/cz/vancisin/schema/

4. 11. 2014

Java metoda pro normalizaci českých stringů v Javě

Jeden z požadavků v aplikaci trénujpaměť.cz je, aby při vyhodnocování odpovědí nebyla brána v úvahu velká a malá písmena a diakritika. Takže pokud je správná odpověď například kočárek, systém by měl uznat kocarek, kočárek i Kočárek.

Vytvořil jsem proto následující metodu, která provádí normalizaci stringů - upraví je tak, že:

Jak funguje je nejlépe vidět v unit testu:

A samotná implementace vypadá takto:

Použití je jednoduché - oba porovnávané řetězce (v případě trénujpaměť.cz správnou a zadanou odpověď) napřed normalizovat a až pak porovnat:-)

29. 10. 2014

GIT a SVN - nastavení proxy serveru

GIT

Proxy server pro GIT se nastaví příkazem:

Kde:
  • proxyuser je uživatel, pod kterým se má git na proxy přihlásit
  • proxypwd je heslo tohoto uživatele
  • proxy.server.com je url proxy serveru
  • 8080 je port proxy serveru

Nastavení je možné zrušit (vyčistit) příkazy:

Zda se nastavení povedlo je možné zkontrolovat příkazem

Ve výpisu by nastavené hodnoty měly být vidět.

Příklad pro lokálně rozjetou cntlm proxy (uživatelské jméno a heslo pro remote proxy server má nastaveno ve své konfiguraci):


SVN

Proxy pro SVN se nastavuje v konfiguračním souboru servers, jehož umístění závisí na operačním systému. Na Linuxu je v adresáři ~/.subversion, ve Windows je to %APPDATA%\Subversion. Kde je adresář AppData se zjistí příkazem:

Téměř na konci tohoto souboru v sekci [global] je potřeba odkomentovat a nastavit správné hodnoty u řádků:

Opět příklad pro lokální CNTLM proxy:


21. 10. 2014

Limit v SQL dotazu na Oraclu a chyba ORA-00933

Máme následující SQL dotaz:

V PostgreSQL i MySQL projde správně a vrátí nám prvních deset uživatelů, jejichž uživatelské jméno začíná na "a". Na Oraclu ale skončí chybou:

Je to proto, že Oracle nezná klauzuli LIMIT. V určitých případech je možné místo ní použít pseudosloupeček ROWNUM:
For each row returned by a query, the ROWNUM pseudocolumn returns a number indicating the order in which Oracle selects the row from a table or set of joined rows. The first row selected has a ROWNUM of 1, the second has 2, and so on.
Například:

Je ale potřeba si dát pozor, že ne vždy funguje ROWNUM stejně jako LIMIT. Obzvlášť ve spojení s ORDER BY:

Tenhle dotaz nám může vrátit jiná data, než jaká bychom očekávali. Napřed se totiž vyhodnotí podmínka na ROWNUM a až pak se provede ORDER BY. To je rozdíl oproti původnímu dotazu, kde se napřed nalezené záznamy seřadí a až pak se aplikuje LIMIT.

Správný postup je původní dotaz vnořit do nového, který přidá podmínku s ROWNUM:

Více informací:

http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

15. 11. 2013

Jelastic aneb jak chutná svoboda

Před pár dny mě opět políbila programátorská můza a takřka přes noc jsem stvořil aplikaci, o kterou bych se chtěl podělit se světem. Jelikož nemám žádný svůj veřejný server, kam bych ji mohl nasadit, začal jsem se rozhlížet po službě, která by mi tohle vyřešila.

Respektive, moc jsem se nerozhlížel. Protože už z dřívějška znám Google App Engine (GAE), což je služba, která přesně tohle nabízí (možnost nasadit svoje aplikace do cloudu, na googlí servery), byl jsem rozhodnutý nasadit svou aplikaci tam. Docela mě překvapilo, že to není úplně tak jednoduché, jak jsem si myslel.

Některé problémy, které se objevily:

  • Aplikace musí být napsaná speciálně pro jejich SDK, které nemusí odpovídat (a zřejmě ani neodpovídá) na 100% standartnímu Java SDK. To znamená jednak že je třeba při vývoji dávat extra pozor, protože všechno nemusí fungovat tak, jak je vývojář zvyklý, a jednak že výsledná aplikace je v podstatě nepřenositelná (nebo není přenositelná bez úprav), na server používající jinou technologii (SDK) - což je v podstatě jakýkoliv server, protože SDK Googlu nepoužívá nikdo jiný než Google.
  • Moje aplikace je postavená na frameworku Wicket, jehož integrace s GAE SDK také není úplně bez práce (kvůli omezením GAE SDK).
  • Kvůli použití nestandartního SDK je potřeba pracně konfigurovat nové vývojářské prostředí.
  • GAE SDK klade na aplikace různá omezení - např. načtení do minuty, zákaz zápisů na filesystem (resp. vůbec žádný přístup na filesystem), ...