pondělí 11. června 2012

Write once, run everywhere! Ale jen ocuť pocuť.

Dneska jsem zkoumal, proč nám některé testy pracují správně s Oracle Javou (1.6), ale pod IBM Javičkou padají. A výsledek mého bádání mě ohromil. Člověk by doufal, že alespoň třídy v balíku java.lang budou implementovány obdobně. A prdlajz!

Náš problém má původ v rozdílné implementaci metody Class.getMethods(), která toho občas u IBM vrátí o něco více než u Oraclu. Nejsem si zatím jistý, která implementace odpovídá JLS lépe, ale do dneška jsem předpokládal, že kvůli takovýmto problémům existuje TCK.

Chcete-li si problém vyzkoušet sami, zde je kód:

/**
 * This class is a reproducer for different results returned from Oracle and IBM Class.getMethod() call.
 * 
 * @author Josef Cacek
 */
public class GetMethodsProblemReproducer {

    // Public methods --------------------------------------------------------

    /**
     * Main method.
     */
    public static void main(String[] args) {
        System.out.println("Java: " + System.getProperty("java.version") + " " + System.getProperty("java.vendor"));
        System.out.println("Length of array returned by B.class.getMethods() call: " + B.class.getMethods().length);
    }

    // Embedded classes ------------------------------------------------------

    public static class A {
        public static void test() {
        }
    }

    public static class B extends A {
        public static void test() {
        }
    }
}

Výsledek pro Oracle Javu:

Java: 1.6.0_31 Sun Microsystems Inc.
Length of array returned by B.class.getMethods() call: 10

Výsledek pro IBM Javu:

Java: 1.6.0 IBM Corporation
Length of array returned by B.class.getMethods() call: 11

Jak jste jistě již sami správně vydedukovali, problém se vyskytne v případě, že "překrýváme" (nebo správněji skrýváme) veřejnou statickou metodu předka.

pátek 20. dubna 2012

Autorizace a jboss-web.xml v AS7

Chcete-li použít vlastní autorizační modul ve webové aplikaci nad JBoss AS7 (policy module v terminologii AS7 security domén), nezapomeňte přidat element use‑jboss‑authorization do konfiguračního souboru jboss-web.xml. Toť novinka oproti dřívějším verzím aplikačního serveru.
Celý soubor WEB-INF/jboss-web.xml pak může vypadat například takto:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
   <security-domain>DomainWithCustomPolicyModule</security-domain>
   <use-jboss-authorization>true</use-jboss-authorization>
</jboss-web>

Update: Až to zase zapomenu, tak správná místa, kde hledate pomoc jsou:
  • org.jboss.as.web.security.JBossWebRealm
  • org.jboss.metadata.web.jboss.JBossWebMetaData and its subclasses
  • org.jboss.metadata.parser.jbossweb.JBossWebMetaDataParser

středa 22. února 2012

Stahujeme videa v Ubuntu

Tento záznam se netýká Javy, je zamířen na uživatele OS Linux.
Na svých domácích počítačích používám postarší verze Ubuntu (10.04 LTS a 10.10) a pro uživatele s podobnou konfigurací zde mám návod, jak si jednoduše stahovat streamované video z různých zdrojů. Používám k tomu dva nástroje pro příkazovou řádku - program movgrab a skript tv-dl.

movgrab – YouTube, Metacafe, vimeo, ...

Prográmek movgrab umí stahovat z mnoha populárních zdrojů a použití je opravdu přímočaré.
movgrab http://www.youtube.com/watch?v=oP59tQf_njc 
Movgrab není v Ubuntu repozitářích, takže k instalaci je potřeba přidat WebUpd8 PPA repozitář:
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install movgrab
Vlastnosti, které mě zaujaly:
  • stahování v různých formátech (např. když na youtube je video v různých kvalitách)
  • navázání přerušeného downloadu

tv-dl – ČT, Nova, Prima, ...

Z nadpisu je zřejmé, že skript tv-dl je určen pro stahování z archívů televizí vysílajících v Česku. Použití je opět hračkou:
cd tv-dl/
./tv-dl http://www.ceskatelevize.cz/ivysilani/1097181328-udalosti/212411000100221/
Instalace je tentokrát o něco složitější, neboť nebudeme instalovat z repozitáře, ale stáhneme aktuální verzi z GitHubu a musíme vyřešit i závislosti (Python 3.2 a rtmpdump).
#rtmpdump instalujeme z Ubuntu repozitářů
sudo apt-get install rtmpdump

#Python 3.2 v repozitářich pro Ubuntu 10.10 není, takže budeme kompilovat
sudo apt-get install build-essential libncursesw5-dev libreadline5-dev libssl-dev libgdbm-dev libc6-dev libsqlite3-dev tk-dev wget
wget http://python.org/ftp/python/3.2.2/Python-3.2.2.tgz
tar -xzvf Python-3.2.2.tgz
cd Python-3.2.2
./configure
make
sudo make altinstall
cd /usr/local/bin
sudo ln -s python3.2 python3

#a teď vlastní instalace tv-dl (do stejnojmenného složky v domovském adresáři)
cd
wget https://github.com/Limoto/tv-dl/tarball/master -O tv-dl.tgz
tar -xzvf tv-dl.tgz
mv Limoto-tv-dl-* tv-dl
I tento skript podporuje volbu kvality ve které se bude video stahovat. Více informací se dočtete v README.md.