Blog from March, 2007

NavigableImagePanel

Hasznos paneltípus került ki a java.net fejlesztői portál hírei közé, amely képek megjelenítésére használható, mégpedig nagyítással és a nagyított rész mozgatásával együtt. A NavigableImagePanel névre keresztelt panel nagyjából annyit tud, amennyit az átlagos digitális kamerák: képeket megjeleníteni, a képbe belenagyítani, illetve a nagyítót mozgatni a képen. Mindez meg van támogatva a Java2D különféle renderelési opcióival, így akár bilinear interpolációt is tudunk használni a képek túlzott nagyításához: nem lesz pixeles a nagyított kép.

JBookPanel

A JBookPanel nemes egyszerűséggel egy klasszikus lapozó panel, amelyen a panelek közötti váltás egy újság vagy könyv lapozásával történik.


Alapértelmezésben ki van kapcsolva a soft_clipping amely szebbé teszi az animációt, ugyanakkor erős gépet igényel.

DWR - Reverse AJAX

Az AJAX keretrendszer lényege, hogy nem kell az egész weboldalt újratölteni változás esetén, csak azt a részt, ami változott. Ez a metódus eléggé kicsontosodott, kevés mócsingot kell már lenyesni róla. Bármilyen igénye van a felhasználónak, a böngészőben csak az a rész fog újratöltődni és megváltoztni, ami szükséges. A technológia hiányossága a szerver által kezdeményezett adatok továbbítása a felhasználó gépére, erre nincs szép megoldás, az alábbi három lehetőség közül tudunk válaszani:

  • Polling, amikor a kliens böngészője rendszeres időközönként megkérdezi a szervert, hogy történt-e valami lényeges. A módszer hátránya, hogy nehéz meghatározni egy olyan időintervallumot, ami még nem terheli a szerver erőforrásait, és a felhasználó is időben értesül az eseményekről.
  • Comet, amikor a kliens böngészője által nyitott kapcsolatot a szerver várakoztatja, amíg közölnivalója nem keletkezik. A módszer azonnali eseményközlésre alkalmas, viszont a sok egyidejű nyitott kapcsolatra fel kell készíteni a szervert.
  • Piggyback, amikor a szerver a kliens bármilyen kérésére adott válaszában az összes függő választ belezsúfolja, és majd a kliens oldal kiválogatja, melyiket melyik modulja kapta.

A DWR projekt abban segít, hogy a Java programozók elől elrejti a JavaScript hátteret, elegendő azzal foglalkoznunk, ami a dolgunk: Java nyelven programozni.

A java.net oldalán egy cikket találhatunk, amely egy Java Chat alkalmazáson mutatja be a DWR használatát.

A hatos JDK egy csomó újdonságot hozott, s aki nem nyálazta át azonnal a még ropogósan forró doksikat, annak egy csomó dolog az újdonság erejével hat, s naiv gyerek módjára csodálkozik minden apróságon, a mai adagot a Collections API változásai adhatják, aki már ismeri, nyugodtan lapozzon tovább. Új interfész osztályok:

  • Deque, amely egy kettős végű sor, mindkét végén tudunk elemet kivenni és hozzáfűzni.
  • BlockingDeque, amely várakozik addig, míg a sor üres lesz és akkor adhatjuk hozzá az új elemet, illetve megvárja, amíg a sorba adat kerül s csak ekkor vehetjük ki az adatot.
  • NavigableSet, egy olyan SortedSet, amelyben a keresett elemekre (hasonlító elemeken) tudunk végighaladni növekvő vagy csökkenő sorrendben.
  • NavigableMap, mint az előző, csak SortedMap őstípusra.
  • ConcurrentNavigableMap, mint az előző, de szálbiztos.

Új konkrét osztályok:

Meglévő osztályok más őssel:

Két új metódus került a Collections osztályba:

Java és .NET generics

Mind a Java 5.0 mind a .NET 2.0 támogatja a generikus szűkítést, bár eltérő módon. A Java a "code sharing" technikát használja, vagyis az alaptípus kerül használatra és a fordító oldja meg a típusvédelmet. .NET esetén a típus szűkítése önálló típusként kerül a VM elé. A code sharing egy érdekes mellékhatást hoz létre, nézzük az alábbi kód futását:

List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
List list2 = list1;
list2.add("A");
for (int i : list1)
{
  System.out.println(i);
}

A lényeg ott van, hogy list2 már nem tartalmaz szűkítést a típusra vonatkozóan, s egy szimpla referencia lesz csak, amelyhez azonban hozzá tudunk adni egy String típusú értéket, amelyre aztán a list1 példányon alapuló ciklus jól kiakad:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

A .NET futásidejű specializációja jobb teljesítményt is jelent, mivel nincs szükség classcast műveletre.

SparkLines v1.2

A SparkLines egy érdekes kezdeményezés, amely on-the-fly egyszerű grafikonokat tesz ki képként oda, ahol a JSP oldalon hivatkozunk rá. Kétféle grafikont képes rajzolni: oszlopokat vagy vonalat. Használata nagyjából az alábbi kódrészlettel foglalható össze:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="spark" uri="http://www.representqueens.com/taglibs/spark" %>
[...]
<c:set var="test" value="5, 35, 22, 19, 16, 10, 4, 33, 9, 12, 27, 36, 22" />
<img src="<spark:bar name="test" color="red" />"/>

A c:set JSTL használatával adatokkal töltjük fel a test nevű változót, majd a spark:bartaglib elkészíti a kép forrását:

<img src="/x/spark?type=bar&color=red&data=5,35,22,19,16,10,4,33,9,12,27,36,22" />

Ebben a megadott elérési útban az x a context elérési útja, a spark pedig az az URI, amire a SparkLines szervlet kötve van.

Java kiskáték

A http://www.fuzzyfuture.com/programming/the-developer-cheat-sheet-compilation/ oldalon több, mint 80 (web)fejlesztői kiskátét gyűjtöttek össze, amelyek közül sokat örömmel tudunk használni. A "Cheet Sheet" oldalak között vannak adatábázisokkal (SQL, MySQL, PostgreSQL, Oracle, stb), programozási nyelvekkel (C/C++, Java, Perl, PHP, stb) és web technológiákat felvonultató apróságok (JavaScript, HTML, CSS, XHTML, stb).

Java tekintetében a http://lesliefranke.com/sandbox/ref/javacheatsheet.html mindössze egy oldalon foglalja össze azt, amit egy tapasztalt programozó már mind ismer, de kezdőknek jól jöhet. C++ programozóknak egy rövid összevetés néha életet menthet: http://www4.ncsu.edu/%7Ekaltofen/courses/Languages/JavaExamples/cpp_vs_java/.

Ajánlom mindenkinek a kiskáték könyvjelzővel való ellátását, megéri.

Biztos mindenkivel előfordult már, hogy a JBoss vagy a Tomcat (illetve egyéb nagyobbnak mondható keretrendszer) futása megszakadt org.apache.jasper.JasperException: PermGen space hibával. Ennek oka, hogy a JVM nem takarítja ki a permanens memóriaterületet, holott lenne rá lehetősége is ideje is. És még hasznos is lehetne. Karmazilla blogjában éppen erről a problémáról ír, s ami lényeges, megoldást is talált.

A GC nem foglalkozik a permanens területtel, de a CGC (concurrent garbage collector) igen. Az első dolog, hogy ennek futását engedélyezzük a VM számára:

-XX:+UseConcMarkSweepGC

Ez még nem elég, ugyanis engedélyeznünk kell a permanens terület kiürítését is:

-XX:+CMSPermGenSweepingEnabled

Ekkor a CGC már képes kiüríteni a permanens tárba kerül osztályok használaton kívüli példányait, azonban maguk a betöltött osztályok is itt foglalnak helyet, s egy betöltött osztályt a VM alapvetően már nem takarít ki, akkor se, ha többé nem használja a VM alatt futó program. Ellenben meg tudjuk engedni ezt is a VM számára:

-XX:+CMSClassUnloadingEnabled

Ha az alapból kapott 64M kevés, akkor nagyobb PermGen helyet is tudunk kérni:

-XX:MaxPermSize=128m