blog

Gyanús Set<Node>

A JackRabbit-es Node, Item és Property osztályok nem implementálják az equals() és hashCode() metódusokat, azokat az Object-től öröklik. Így nem érdemes Set-be rakni ezen objektumok példányait, hiszen többször is szerepelhet ugyanarra az elemre mutató objektum a halmazban.

Emiatt a kódban minden Set lehetséges hibás viselkedésre utal.

@Test
public void testSimpleRootNodeEquals() throws RepositoryException {
	final Node rootNode1 = session.getRootNode();
	final Node rootNode2 = session.getRootNode();
	assertTrue(rootNode1.isSame(rootNode2));
	// sajnos ez false, mert a Node nem implementálta az equals/hashCode
	// metódusokat
	assertFalse(rootNode1.equals(rootNode2));
}

Érdekesebb JCR JIRA bejegyzések: JCR-1137, JCR-1535.

Fájlok épségének ellenőrzése .torrent fájl alapján

$ cfv -T -f checkthis.torrent

A futtatáshoz a cfv mellett a bittorrent vagy a bittornado csomagra is szükség van.

Azt érdemes még tudni, hogy a torrent fájlban nem fájlonként van egy-egy ellenőrzőösszeg (SHA1 egyébként), hanem csomagonként. Egy csomagba több fájl bájtjai is belelóghatnak. Így például ha egy kis fájl egyetlen bitje hibás, akkor emiatt valószínűleg több fájlt is hibásnak fog feltüntetni a cfv, mert a hibás bitet tartalmazó csomagba valószínűleg belelógnak más fájlok is.

Linkrövidítők

Őszintén utálom az olyan blogokat, ahol a kifelé mutató linkjeiket is (!) rövidítik valamelyik linkrövidítő szolgáltatással. Ezek az ördög művei, még akkor is, ha így lesz színes-szagos statisztika arról, hogy melyik linkre hányan kattannak. Nem is beszélve a dolog privátszférás vonzatairól. Meg majd jól megszűnik a szolgáltató, aztán elvesznek sok év linkjei. A blogger meg írhatja át a régi linkjeit – jobb esetben a rendes linkekre, rosszabb esetben egy újabb linkrövidítőére. De nem is kell megszűnnie, elég ha csak időnként nem működik valamiért. I see dependencies, ha pólófeliratot akarnék.

Kicsit barátságosabb lenne, ha a rövidítés része kimaradna, például valami rov.id/id=0x1234&orig=http://eredetili.nk formátumot használnának. Erre lehetne szkriptet, plugint írni, de enélkül muszáj használni a linkrövidítő szerverét.

Twitteren is baromi gusztustalan, hogy nem tudja az ember mire kattint.

További nyalánkságok: URL shortening - Criticism and problems.

Tiszta kód magyar kiadás

Kollégák kiskapus fordításokkal kapcsolatos kritikus véleménye ellenére magyarul olvastam a fenti könyvet. Az utóbbi időben szinte csak angol szakirodalommal találkoztam, a magyar kiadásokat csak könyvtárban futottam át. A Tiszta kód esetében reménykedtem, hogy a sok csúszásnak jó minőségű fordítás lesz a vége. (Ha jól emlékszem, először decemberre ígérték, amiből április vége lett.) Nem jött be, inkább eredetiben kellett volna elolvasni. Ehelyett lett három bejegyzés a blogon. (Tiszta kód angol-magyar szótár, Tiszta kód hibajegyzék)

A könyv címe Tiszta kód. A magyar változatban ne számítsunk arra, hogy a példakódok tényleg tiszták, mert újra lettek tördelve. A tiszta kódok rondák, a rondának készült kódok meg még rondábbak. (Kettőt kiemelnék: 5.1-es, 5.5-ös példa. Bár az összes többi is hasonlóan rossz.)

Eltűntek az üres sorok, egyes sorok véletlenszerűen egy karakterrel bentebb kezdődnek. Ilyen például a 101. oldal, ahol a double kezdetű sorok előtt felesleges a szóköz. A hosszú sorok pedig nem fértek ki egy sorba. Az eredeti műben ezzel nem volt probléma.

Sajnos a legjobb szándékkal sem lehet azt mondani, hogy szerkesztési, illetve helyspórolási okokból volt szükség ezekre a módosításokra, mert olyan helyeken is áttördelték a kódot, ahol semmi szükség nem lett volna rá. (Ilyenek a 98. oldal metódusai, ahol kimaradtak az üres sorok, pedig még lett volna hely azoknak is.)

Ezen kívül az erőltetett magyarítások is elég fárasztóak, megnehezítik a megértést. (Lásd a másik két bejegyzést a szótárral és a hibákkal. Különösen azokat, amire a Google is minimális számú vagy éppen nulla találatot adott.) Túlságosan frusztráló azon agyalni, hogy vajon mit is akarhatott a szerző, amiből egy egyáltalán nem magától értetődő magyar kifejezés született.

Azt hiszem ez volt az utolsó kiskapus fordítás, amit olvastam. Mondhatni betette a kaput... Még akkor is, ha az angol nyelvű könyvek valamivel nehezebben elérhetőek a magyar piacon.

A könyv egyébként nagyon jó, érdemes elolvasni. A másik két bejegyzés remélhetőleg segít a döntésben, hogy az angolt vagy a magyart válaszd. Én az angolra szavazok.

Tiszta kód angol-magyar szótár

Kigyűjtött magyarított kifejezések és angol megfelelőik a Clean code c. könyv magyar kiadásából. Avagy: Kiskapu-angol szótár. Azért, hogy legalább egy találatot dobjanak mindegyikre a keresők. Persze vannak benne teljesen elfogadott fordítások, de olyanok is, amitől falnak tudnék menni. Az oldalszámok a címben is említett Tiszta kód című könyv magyar fordítására vonatkoznak.

1. fejezet, Tiszta kód

  • wading - gázolás (3. oldal)
  • hash map - kivonattábla (Google 3 találat) (12. oldal)

2. fejezet, Beszédes nevek

  • edition environment - szerkesztőkörnyezet (30. oldal)
  • solution domain - megoldástartomány (31. oldal)

4. fejezet, Megjegyzések

  • The Stepdown Rule - Leszálló szabály (44. oldal)
  • „To include the setups and teardowns” - „A beállítások és lebontások beágyazásához ...” - ahol a setups a jUnit setUp(), a teardowns pedig a tearDown() metódusára utal, amiket újabban @Before és @After annotációkkal jelölünk. Kitaláltad volna? (44. oldal)
  • different level of abstraction - más elvonatkoztatási szint (48. oldal)
  • Dependency Magnet - függőségmágnes (56. oldal)
  • Open/closed principle - Zárt nyíltság elve (Google 0 találat, de szerencsére a tárgymutatóban szerepel, illetve némelyik használatánál a lábjegyzetben is.) (57. oldal)

5. fejezet, Formázás

  • reporter listener - jelentéskészítő figyelőosztály (93. oldal)
  • protected variable - védett változó (94. oldal)
  • timeout, time-out - időkorlát (104. oldal)
  • socket - csatoló (104. oldal)
  • heuristic - szabály (Talán inkább irányelvnek vagy ökölszabálynak kellett volna fordítani.) (114. oldal)

6. fejezet, Objektumok és adatszerkezetek

  • bean - babszem (Használja ezt valaki?) (117. oldal)
  • Active record - Aktív rekord (118. oldal)

7. fejezet, Hibakezelés

  • stacktrace - veremlenyomat (124. oldal)
  • wrapping - burkolás (126. oldal)
  • Special case pattern - Különleges eset minta (127. oldal)

8. fejezet, Határok

  • learning test - tanulóteszt (134. oldal)
  • [program] capability - lehetőség (137. oldal)
  • adapter - átalakító (Mint tervezési minta.) (138. oldal)
  • seam - varrat (139. oldal)
  • boundary test - határteszt (139. oldal)

9. fejezet, Egységtesztek

  • production code - üzemi kód (144. oldal)
  • assert - megerősítésre váró állítás (151. oldal)

10. fejezet, Osztályok

  • release - leszállítják (Elég szerencsétlen választás.) (159. oldal)
  • subselect - részkijelölés (Allekérdezés inkább? Google „részkijelölés sql” 1 találat) (169. oldal)
  • container - alkalmazástároló (160. oldal)
  • scope - hatókör (168. oldal)
  • cohesion - összetartás (A kohézió szóval mi a baj? A kohéziós erő szókapcsolat is elég elterjedt.)
  • dependency inversion principle, DIP - Függőség megfordításának elve (173. oldal)

11. fejezet, Rendszerek

  • TEST DOUBLE - tesztdublőr (xUnit tesztnév, Meszaros könyv) (177. oldal)
  • mock object - álcaobjektum (177. oldal)
  • dependency injection - függőség-befecskendezés (179. oldal)
  • Dependency injection container - függőség-befecskendező tároló (180. oldal)
  • software system - programrendszer (Azért vicces, hogy a szoftver szót is kerülik.) (181. oldal)
  • entity bean - egyedbabszem (Google 0 találat) (181. oldal)
  • using a particular DBMS versus flat files - […] „lapos” fájlok. (183. oldal)
  • persistence - maradandóság (183. oldal)
  • noninvasively - nem beavatkozó módon (184. oldal)
  • annotation - jegyzet (Annotáció esetleg? A falat kaparom...) (188. oldal)
  • system architecture - rendszerszerkezet (Grr...) (191. oldal)
  • architecture - szerkezet (193. oldal)
  • invasive - beavatkozó (Nem túl találó...) (193. oldal)

13. fejezet, Párhuzamosság

  • servlet (Miért nem szervlet?) (204. oldal)
  • design strategy - felépítési stratégia (206. oldal)
  • synchronization problems - összehangolási probléma (A szinkronizáció is tiltott szó lett?) (208. oldal)
  • deployment environment - telepítési környezet (209. oldal)
  • livelock – élőzár (Google 0 találat) (210. oldal)
  • „Make your threaded code pluggable.” - „Tegyük a többszálas kódokat tetszőlegesen beszúrhatóvá.” (214. oldal)
  • preemptive threading - közbeavatkozó szálvégrehajtás (215. oldal)
  • „instrument your code” - rendezzük a kódot (216. oldal)
  • test jig - tesztrosta (217. oldal)

14. fejezet, Fokozatos finomítás

  • String - karakterlánc (245. oldal)
  • marshalling behavior - vezérlőművelet (246. oldal)
  • type-case up - típuseset (Azaz if-else lánc.) (264. oldal)

15. fejezet, A JUnit belső részletei

  • geek - számítógépőrült (288. oldal)

16. fejezet, A SerialDate újratervezése

  • enum - felsoroló típus (310. oldal)

17. fejezet, Szagok és szabályok

  • flag argument - jelzőparaméter (328. oldal)
  • polymorphism - többalakú (330. oldal)
  • base class - alaposztály (331. oldal)
  • interface - felület (332. oldal)
  • opaque module - átlátszatlan modul (Átláthatatlan szerintem jobb lenne.) (338. oldal)
  • transparent - átlátszó (Átlátható?) (338. oldal)
  • selector - választóparaméter (Avagy boolean metódusparaméter.) (335. oldal)
  • import list - betöltési lista (350. oldal)

A függelék: Párhuzamosság II

  • pre-increment operator (++i) - előnövelő művelet (Google 1 találat.) (369. oldal)
  • operand stack - tényezőverem (Google 0 találat) (369. oldal)
  • thread pool - szálgyűjtő (Google 0 releváns találat.) (371. oldal)
  • future - jövőobjektum (Ezt szerencsére ők is odaírták zárójelben.) (371. oldal)
  • adapter - átalakító (Mint tervezési minta. A szintén Kiskapus GoF könyvben még Illesztő néven szerepel.) (374. oldal)
  • resource pool - erőforrásgyűjtő (382. oldal)
  • process storage - folyamattároló (382. oldal)
  • pool of database connections - gyűjtő az adatbázis-kapcsolatok számára (382. oldal)
  • master repository - mestertároló (382. oldal)
  • process database - folyamattároló adatbázis (382. oldal)
  • process message - folyamatüzenet (394. oldal)

Tiszta kód hibajegyzék

A Tiszta kód című könyvben (Robert C. Martin, 2010, ISBN: 9789639637696) általam felfedezett hibák listája alább.

1. fejezet, Tiszta kód

  • 8. oldal: 404-es link a lap alján.

2. fejezet, Beszédes nevek

  • 20. oldal: A középső forráskód minden sorának végéről lemaradt a pontosvessző, a szokásos java-konvenciókkal ellentétesen egyes változónevek nem kisbetűvel kezdődnek. Valamint teljesen felesleges volt lefordítani őket.
  • 29. oldal: „string” helyett „String” a helyes. (Eredetiben is hibás.)

5. fejezet, Formázás

  • 99. oldal: A 15.5-ös és 3.7-es példára történő hivatkozásnál kimaradt az oldalszám. (Eredetiben szerepel.)

6. fejezet, Objektumok és adatszerkezetek

  • 117. oldal: „address.java” helyett „Address.java”. (Az eredetiben is hibás.)

7. fejezet, Hibakezelés

  • 127. oldal: A Fowler hivatkozás lemaradt a fejezet végéről (az eredetiben is).

8. fejezet, Határok

  • 138. oldal: Az ábráról lemarad a Fake Transmitter és a Transmitter Adapter felirat.
  • 139. oldal: Első bekezdés, „működésének” helyett „működés”.

11. fejezet, Rendszerek

  • 183. oldal: Az ötödik bekezdés eléggé szerencsétlenül van fordítva.
  • 177. oldal: Lábjegyzet, „Mezzaros” helyett „Meszaros” (Eredetiben is rossz). Ugyanígy a fejezet végén is rossz a hivatkozás.
  • 191. oldal: Negyedik bekezdést angolul ezerszer könnyebb megérteni. Az „integrate” kölcsönhatásnak van fordítva...

13. fejezet, Párhuzamosság

  • 215. oldal: A „several configurations” „többféle felépítés”-nek lett fordítva.

14. fejezet, Fokozatos finomítás

  • 238. oldal: „integer” – nagybetűvel lenne helyes, eredetiben is rossz. 242. oldalon szintén. Mindenesetre dicséretes, hogy nem fordították le.
  • 246. oldal: A „private String stringValue” kiemelése hiányzik. (Eredetiben szerepel.)
  • „ArgumentMarshaller” név a szövegben két l, kódban egy. 248. oldalon szintén.
  • 256. oldal: Az áthúzások vonala túl vastag, nehezen olvasható a mögöttük lévő szöveg. (Eredetiben jobb.)

17. fejezet, Szagok és szabályok

  • 345. oldal: Rejtett ideiglenes csatolások: A „temporal” nem ideiglenes, hanem időbeli! Fontos különbség. Nem ideiglenes a csatolás, hanem a sorrendjük, a végrehajtás ideje okozza a csatolást.

Továbbá fejezettől függetlenül (talán) az összes forráskód át lett tördelve. A szép kódok csúnyák lettek, a csúnyának szántak pedig még rondábbak. Pedig ebben a könyvben pont a szép kódokon van (illetve lenne) a hangsúly.

Miért nem segítek magánban?

Levlistán feltett kérdések végén viszonylag gyakran előfordul: „A választ légyszi magánba küldjétek, mert nem vagyok fent a listán.” A levlistán ugyan nincs arány, de nagyon hasonló a szituáció a bittorrenthez vagy bármilyen közösséghez. Illik feltölteni, illetve adni is, nem csak letölteni, elvenni. És itt nem kell hozzá sávszélesség sem.

A Linuxos levlisták illemtanában van egy erre vonatkozó pont: „A listán folyó támogató tevékenység publikus. Ezért nem helyes a lista tárgyához tartozó kérdésben magán e-mailben kérni a választ, mivel előfordulhat, hogy más is éppen kíváncsi rá.”

Vagyis az ilyen kérdező csak magának kéri az információt, és pont azzal a közösséggel nem akarja megosztani, akitől azt kéri. Nem túl kedves.

A másik kedvenc szituációm az, amikor az archívumból kerül elő egy levél, amelyikben egy épp nálam is felmerült probléma megoldása felől érdeklődnek. A megoldás azonban már nincs az archív levelek között, mert az csak magánba ment. Elég frusztráló tud lenni. Ha szerencsénk van, még elérhető az eredeti kérdező, és talán meg is van neki a megoldás, de erre ismét csak várni kell, és ki tudja egyáltalán válaszol-e.

Ugyanilyen frusztráló a témát lezáró levél egy „megoldva” kijelentéssel, de a megoldáshoz szükséges információk nélkül. Ha a kérdező saját maga jött rá, akkor is illene megírnia az archívum kedvéért. Akkor is, ha teljesen magától értetődő a megoldás. („kihúzódott a tápkábel”)

Az ilyen önző kérdezőknek pedig nem szívesen segítek. Ahogy az egyik listán tömören megfogalmazta valaki: „Listán nem vagyok fent => csak kérek, de nem adok soha...”

Adatbányász-barát, privacy ellenes RSS

Pár éve, Adatbányászati alkalmazások c. tantárgyamhoz írtam a következő szösszenetet.

Mondjuk ilyen egy alap RSS:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
 "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">

<channel>
<title>bme feeds</title>
<link>http://akarmii.hu/</link>
<description>bme feeds</description>
<language>hu-hu</language>

	<item>
		<title>bme-kth - Felvételi - Rajz alkalmassági vizsga beosztás</title>
		<link>http://www.kth.bme.hu/index.php?news_show&amp;amp;news_id=45546</link>
	</item>
	<item>
		<title>bme-kth - OEP-hez bejelentettek adatai</title>
		<link>http://www.kth.bme.hu/index.php?news_show&amp;amp;news_id=45538</link>
	</item>
</channel>
</rss>

Vannak más formátumok is, de szerintem a következő máshol is működik: Az oldalon az RSS-csatorna linkjét kell csak mindig változóan összeállítani, amire a felhasználó feliratkozik. Mondjuk ez az alap:

  • http://akarmii.hu/rss.xml

Ebből csinálhatunk ilyeneket, ha megvannak hozzá az adatok:

  • http://akarmii.hu/rss.xml?username
  • http://akarmii.hu/rss.xml?sessionid
  • http://akarmii.hu/rss.xml?randomnumber

A username a felhasználó neve az oldalon, ha nincs, akkor a cookie-ban lévő sessionid, amúgy meg generálhatunk minden oldalra egy véletlenszerű azonosítót. Elsőre ez utóbbi tűnik a legegyszerűbbnek, és ha nagy a lehetséges számok köre, akkor meg tudjuk hosszú távon is különböztetni egymástól a felhasználókat.

Ezután csak annyi kell, hogy ha az rss.xml (ami mondjuk egy PHP szkript, és nem statikus tartalom) talál valamit a kérdőjel után, azt a <link> tag-ek végére is beilleszti. Például:

<item>
	<title>bme-kth - OEP-hez bejelentettek adatai</title>
	<link>http://www.kth.bme.hu/index.php?news_show&amp;news_id=45538&id=rss_username</link>
</item>

Itt figyelni kell a megfelelő kódolásra, csak egy kérdőjel legyen az URL-ben stb., de megoldható.

Ezután ha RSS-ben található linkről jön vissza a felhasználó, akkor tudni fogunk róla. Adatbányászatnál pedig ugyanazok a módszerek használhatóak, mint a hírleveles adatbányászat esetén. Továbbá itt ténylegesen lehet figyelni, hogy benne van-e még az RSS olvasóban a csatornánk, hiszen azt az olvasóprogram periodikusan lekéri a szervertől.

Érdemes meghagyni, hogy az azonosító kitörlésével is működjön az RSS. Így azok is olvashatják a csatornát, akik nem akarják, hogy mindig tudjuk az IP-címüket.

Az RSS-hez még annyit, hogy ez közelebb áll az e-mailhez mint a böngészéshez abból a szempontból, hogy hányan használnak közösen egy e-mail címet, valamint egy böngészőt. Böngészőnél előfordulhat a közös használat, de ahogy az e-mail esetében is, az RSS-olvasónál valószínűleg nem lehet annyira jelentős. (Már csak az olvasott/nem olvasott hírek megkülönböztetésének igénye miatt is.)

SCBCD jegyzetek

Néhány lejárófélben lévő voucher miatt beneveztem egy Sun Certified Business Component Developer (SCBCD) for the Java Platform, Enterprise Edition 5 (CX-310-091) vizsgára is nemrég. A Java EE 6 vizsgákat tavaszra ígérték a megvásárolt Sun weblapján a tranzakció előtt, azóta viszont nem sok újdonságot hallani a témáról, úgyhogy kénytelen voltam az 5-össel beérni.

Szokásos emlékeztetők lentebb. Tesztelésre, példakódok írására egy régebbi, egész pontosan 6.7.1-es Netbeanst és a hozzá csomagolt GlassFish 2.1.1-et használtam.

Tanulni leginkább a specifikációból érdemes, a vizsgán is azt kérdezik. A GlassFish alatt kipróbáltakra sem érdemes túlságosan hagyatkozni, mert néhol megengedőbb, mint a specifikáció. Nem mindig veszi szigorúan a leírtakat az implementáció.

A felkészüléshez legnagyobb segítséget az Enthuware-es tesztprogram jelentette. Korrekt darab, jó kérdésekkel, megéri az árát, sok időt lehet vele spórolni. A SkillGuru-n lévő kérdéssorral viszont csak óvatosan, szerintem elég sok hiba van benne.

Könyvek közül az EJB 3 in Action-re esett a választásom. Leginkább ezt olvastam végig, de volt nálam egy Enterprise JavaBeans 3 is. Utóbbi inkább referenciaként van felépítve. XML-es részekben az O'Reilly-féle a nyerő, bár szerencsére vizsgán nem túl sok XML-t kérdeztek, nem igazán volt szükség a DTD-k bemagolására. Ami kellett, az kb. a manningos könyvben is benne volt.

Leírom ide is: A lista átnézése a könyvekben és a JavaRanch-en linkelt vizsgasorok, feladatok megoldása előtt túlzott önbizalomhoz vezethet, aminek sikertelen vizsga lehet a vége.

Hivatkozások:

  • ejb3core: JSR 220: Enterprise JavaBeans, Version 3.0, EJB Core Contracts and Requirements
  • pers: JSR 220: Enterprise JavaBeans, Version 3.0, Java Persistence API

Egy hasznos program

Kicsit megdöbbentem, amikor valamelyik nap észrevettem a kb. egy éve telepített Debian GNOME Rendszereszközök menüjében a következő menüpont:

A Floppy-formázó nevű program menüpontja a GNOME menüjében

Sose lehet tudni, mikor van rá szükség így 2010 táján... Már nem is emlékszem mikor volt utoljára floppy meghajtóm. Egyébként a gnome-utils csomag része, gfloppy néven.

Tartalom átvétel