středa 2. června 2004

Microsoft SQLServer 2000 Driver for JDBC bug?

Zajímavý bug? obsahuje Microsoft SQLServer 2000 Driver for JDBC s javou 1.4.2. Při čtení z pole typu text, kdy je v tomto poli zadán prázdný string (tj. ne pro null, pouze hodnota zadaná např.: insert into table values ('')) ohlásí chybu Underlying input stream returned zero bytes. Tyto chyba se projeví zřejmě jenom na národních verzích SQLServeru 2000. Na webu jsem nalezl dvě řešení:

  • nahradit datový typ text datovým typem ntext - nemám odzkoušeno
  • použít místo javy 1.4.2 javu 1.4.0 !? - mám odzkoušeno na jre 1.4.0-b92

Pozn.: V bug databázi sunu se píše o problému ve verzi 1.4.0 (resp.je to pokračující problém z verze 1.2.2, který byl v 1.3.x verzích opraven a pak se zase do javy vrátil), kdy InputStream wrapowaný např. v InputStreamReader, při použití metody isr.read(...) vrátí chybu Underlying input stream returned zero bytes tehdy, pokud is.read(...) wrapovaného vrací 0.

//pokud is vrátí pomocí read 0, read z isr vyhodí exception
public void wrapStream(InputStream is) throws IOException {
  is.read(new byte[1], 0, 1); //projde
  InputStreamReader isr = new InputStreamReader(is);
  isr.read(new char[1], 0, 1); //vyhodí Underlying... }

Je tedy otázkou jestli má driver Microsoftu vracet 0 při prázdném stringu v poli typu text, nebo jestli java nemá vyhazovat exception, pokud wraper chce provést read(...) nad streamem, který vrací 0. Pokud se podívám do ClobInputStreamu, který bude zřejmě tím streamem, který vrátí 0, pak v metodě read(...) je něco ve smyslu:

int i1 = implClob.readData(abyte0, i, l, k);
currentPosition += i1;
return i1;

kde asi nejpravděpodobnější vznik 0 bude při currentPosition 0, protože pak je celkem logické, že abstraktní implClob (BaseImplClob) vrátí 0.

Kde a jakou cestou začít s Javou

Můj včerejší spot Začátky s Javou: kde, co, proč, jak zkompilovat a spustit nezůstal bez odezvy, výsledkem mých všetečných otázek na Jirku Hradila je povedený spot Školení v Javě - rychlý start pro začátečníky ?, který se zaobírá několika možnostmi jak začít s Javou.

Zaujala mě informace o školeních jako o jedné z možných cest. V této souvislosti mě napadá, jestli se investované prostředky, do ne zrovna levných školení vrátí? Výhoda samouka je v tom, že si všechno vyzkouší na vlastní kůži, bohužel může získat i špatné návyky. Naproti tomu při školení vás do jisté míry někdo vede za ruku a je schopen vám říci tady pozor.

Jirka nastínil i další otázky, které mě napadnou když o tom přemýšlím.

  • Volba vhodné literatury
  • Certifikační zkoušky a váha certifikátu
  • Úroveň výuky Javy na VŠ

Ještě přidávám odkaz na mojí reakci v komentářích pod spotem.

úterý 1. června 2004

Začátky s Javou: kde, co, proč, jak zkompilovat a spustit

Nejčastější otázky v diskusních skupinách věnovaných Jave míří na základy práce s touto platformou.

  • Jak spustit javovský program?
  • Co potřebuji k spuštění javovského programu?
  • Jak zkompilovat javovský program?
  • Jak nastavit classpath?
  • Jak poznat spouštěcí třídu či soubor?

Rád bych odcitoval jeden s příspěvků, který mě inspiroval k sepsání tohoto jednoduchého receptu, který snad trochu pomůže nováčkům. Níže uvedené je reakcí na následující dotaz, ale obecně dává odpovědi na základní otázky, se kterými jsou začátečníci konfrontováni.

Začínám s javou. Stáhl jsem si balík s několika třídami, ale nevím, jak ho nahrát do systému, aby mi ho překladač javy vzal. Mám Windows XP, jediné zníňky o nahrávání jsou jen na Windows ME - v ovládacích panelech pod položkou system se to prý má "nějak" nastavit. Nevíte někdo jak? Moc by mi to pomohlo.

Nejdříve musíte zkontrolovat jestli je na vašem počítači nainstalováno prostředí pro běh java aplikací, které se jmenuje JRE(Java Runtime Environment). To je samostatně distribuovatelné a lze získat například ze stránek java.sun.com nebo je součástí vývojového balíku SDK.

Přesně jsem nepochopil jestli máte zdrojové soubory a nebo již zkompilované soubory. Zdrojové soubory mají příponu java, zkompilované příponu class případně jsou distribuované jako jeden soubor s příponou jar. Pokud máte pouze soubory s příponou java tak budete potřebovat kompilátor, který je pro vás nejsnáze dosažitelný v rámci SDK(javac).

Po instalaci JRE či SDK je dobře si zkontrolovat jestli proměnná path operačního systému ukazuje do adresáře s nainstalovanou Javou. Tento počítač >> Vlastnosti >> Upřesnit >> Proměnné prostředí >> Systémové proměnné >> proměnnná Path ve které by měla být např. cesta č:\Program Files\Java\j2re1.4.0\bin\ nebo č:\Program Files\Java\j2sdk1.4.2_02\bin. Nyní můžete kompilovat a spouštět vaše programy odkudkoliv na vašem disku a nebudete muset složité uvádět vestu ke kompilátoru javac.exe či zavaděči java.exe.

Pokud máte takto systém připraveny(doporučuji po těchto krocích restartovat) můžete směle kompilovat a spouštět jakýkoliv javovský program. Pro kompilací o pro spuštění je velice důležitá tzv. classpath což je jeden z argumentů jak kompilátoru tak zavaděče, pomoci kterého lze říci kde se nalézají knihovny mimo standardních java.*.

Zavaděčem java.exe lze zkompilované třídy spustit v podstatě dvěma způsoby.

  • Máte jeden soubor jar(ta lepší cesta)
  • Máte soubor či spíše soubory class

První případ je ideální, nemusíte se většinou starat o classpath a o určení zavaděči třídy. Spuštění se provede pomoci java -jar nejakyprogram.jar například s přikazového řádku či konzole.

Druhý případ je komplikovanější v tom, že zavaděči musíte říci, který soubor resp. třída obsahuje zaváděcí metodu main. V zdrojovém kódu musí existovat metoda s hlavičkou public static void main(String args[]), soubor s touto metodou je zavaděcí. Spuštění se provede pomoci java jmenosouboru opět s přikazového řádku či konzole.

Úplně nejjednodušší příklad s kompilací a spuštěním vypadá takto.

1.) Vytvoříme soubor Foo.java(velikost písmen je podstatná) s obsahem


public class Foo {
    public static void main (String[] args){
	System.out.println("Hellou world!");
    }
}

2.) Soubor Foo.java zkompilujeme příkazem javac Foo.java

3.) Na disku vznikne soubor Foo.class, který spustíme příkazem java Foo

Pokud hledáte další zdroje o Jave tak z českých bych nevynechal vyuka.pecinovsky.cz a dione.zcu.cz/java

pondělí 31. května 2004

J2ME - drobnosti pro vývojáře

Jako začínající vývojář v oblasti mobilních zařízení a platformy J2ME jsem narazil, a asi nejen já, na dva menší problémy a proto bych si rád nechal touto cestou poradit.

Zdrojové kódy k API MIDP

Prvním nedostatkem je absence zdrojových kódu k API MIDP 1.0 případně MIDP 2.0, bohužel nejsou součástí balíku Java 2 Micro Edition Wireless Toolkit jak by se mohlo zdát. Zdrojové kódy nejsou nebo jsem na ně nenarazil ani na oficiálních stránkách J2ME. Zdrojové kódy jsou velice užitečné z hlediska editace kódu a jsou nezbytné pro nástroje typu code assistent a napojení javadocu např. v IDE Eclipse.

Práce s grafikou

V MIDP 1.0 není možnost, nebo jsem ji opět neobjevil, jak pracovat s výřezy obrázku. Tento problém nastane například v případě her, kdy je veškerá grafika umístěna v jednom obrázku, ze kterého se při konstrukci herní obrazovky vyřezávají jednotlivé grafické části. V podstatě by stačilo přetížit metodu createImage například takhle Image.createImage(Image,x1,y1,x2,y2).

Nestudoval jsem možnosti MIDP 2.0 ani proprietárních rozšíření např. Nokie, ale je nějaká možnost jak dosáhnout této funkčnosti přes standardní API v MIDP 1.0?

Výše uvedené mě zajímá především proto, že společně s NkD (to není distribuční společnost, ale kolega a kamarád) připravujeme remake jedné slavné hry z dob ZX Spectra pro mobilní telefony.