<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-28782548</atom:id><lastBuildDate>Sat, 19 Dec 2009 03:20:34 +0000</lastBuildDate><title>log4z</title><description>Zeroflag's blog</description><link>http://zeroflag.blogspot.com/</link><managingEditor>noreply@blogger.com (Zeroflag)</managingEditor><generator>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-4386573461616976471</guid><pubDate>Thu, 18 Sep 2008 23:12:00 +0000</pubDate><atom:updated>2008-09-19T17:01:08.082+02:00</atom:updated><title>Screencast</title><description>Feltoltottem egy demonstracios videot a jshot weblapjara a korabbi posthoz kapcsolodoan. &lt;a href="http://jshot.info/screencast/3/widgetsel.htm"&gt;Megtekintheto itt&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-4386573461616976471?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2008/09/screencast.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-5149683555878459133</guid><pubDate>Thu, 18 Sep 2008 19:39:00 +0000</pubDate><atom:updated>2008-09-18T23:03:30.286+02:00</atom:updated><title>Widget selection</title><description>A &lt;a href="http://www.teamdev.com/jxcapture/index.jsf"&gt;JxCapture&lt;/a&gt; egy kereskedelmi capture library javahoz. Screenshotot persze alapbol is lehet kesziteni javaban thirdparty lib nelkul (java.awt.Robot-tal), de vannak olyan featureok amiket nem lehet megoldani csak nativ hivasokkal. Az ilyen oprendszer specifikus dolgokhoz ez a lib is JNI-t hasznal de tobbfele platforma letezik implementacioja. A &lt;a href="http://www.teamdev.com/downloads/demo/jxcapturedemo.jnlp"&gt;webstartos demo&lt;/a&gt; app tartalmaz egy erdekes featuret ami a "Select Window/Object" menupont alatt erheto el.&lt;br /&gt;&lt;p&gt;Ezzel nem csak ablakokat tudunk kivalasztni a kepernyon hanem az azon levo komponenseket is. (Pl.: gombot, textfieldet, paneleket stb) Tehat minden olyat ami az opreracios rendszer szintjen kulon widgetkent van nyilvantartva. Amikor user raviszi az egeret egy ablakra akkor progi kijeloli vagy az egesz ablakot vagy az azon levo widgetet. A dolog annyira megtetszett hogy eldontottem hogy megcsinalom &lt;a href="http://jshot.info/"&gt;JShot&lt;/a&gt;ba is.&lt;br /&gt;&lt;/p&gt;Tisztan javaban sajnos ezt nem lehet megoldani mert az ablakok manageleset az oprendszer windowmanagere vegzi. A problema megoldasahoz fel kellett frissitenem a mar elegge megkopott c++ es winapi ismereteimet. Amire szuksegunk van az az hogy le tudjam kerdezni az eger kurzor alatt talalhato ablak/widget koordianatajat es meretet. A dolog ugyanugy fog mukodni mint a "region capture", azaz a user egy teljeskepernyos ablakot fog latni rajta a desktoprol keszitett keppel es eger mozgatasra ezen kijelolodik az aktualis widget.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ehhez 2 native methodra lesz szukseg:&lt;/p&gt;&lt;p&gt;&lt;em&gt;private native int[] getWidgetRectUnderCursor( int x, int y );&lt;/em&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;em&gt;private native void takeWidgetStateSnapshot();&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Az elso megadja az egerkurzor alatt talalhato widget elhelyezkedeset. A masodik pedig keszit egy "snapshotot" az ablakok elhelyezkedeserol. Erre csak azert van szukseg hogy ne kelljen minden eger mozgataskor ujra lekerdezni melyik ablak hol talalhato. Addig ugysem valtozik semmi mert a felhasznalo csak egy kepet fog latni a desktoprol.&lt;br /&gt;&lt;br /&gt;JNI-nel megszokott modon a classbol legeneraljuk header filet. Ez nalam javah -jni hu.jshot.plugins.nativ.WindowUtils&lt;br /&gt;&lt;br /&gt;Az alabbi 2 fuggvenyt kell megirunk cpp-ben.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;JNIEXPORT void JNICALL Java_hu_jshot_plugins_nativ_WindowUtils_takeWidgetStateSnapshot&lt;br /&gt;(JNIEnv *env, jobject obj) ;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;JNIEXPORT jintArray JNICALL Java_hu_jshot_plugins_nativ_WindowUtils_getWidgetRectUnderCursor&lt;br /&gt;(JNIEnv *env, jobject obj, jint px, jint py);&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;A konkret megvalositas pedig annyi hogy lekerdezzuk a lathato ablakokat megfelelo Z order szerint es az eger kurzor alatti legmagasabb Z orderrel rendelkezo ablakot vesszuk. Ha az ablakon belul tovabbi widgetre mutat a kurzor akkor azt adjuk (ill. ezek kozul a legkisebbet) vissza egyebkent magat az ablakot.&lt;br /&gt;&lt;p&gt;Azt hogy egy ablak lathato-e az &lt;strong&gt;IsWindowVisible&lt;/strong&gt; fgv-vel kerdezhetjuk le. Ez viszont nem azt adja vissza hogy az adott ablak a felhasznalo szamara valoban lathato-e, hanem hogy az ablak vagy annak parentjenek van-e WS_VISIBLE styleja. Vagyis hogy explicit nem hideoltak-e. Ettol meg a felhasznalo szamara nem biztos hogy lathato mert eltakarhatja egy vagy tobb mas ablak.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;em&gt;BOOL IsWindowVisible(&lt;br /&gt;HWND hWnd // handle of window&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Az talcara letett ablakokat kiszurhetjuk az IsIconic winapi hivassal&lt;br /&gt;&lt;br /&gt;&lt;em&gt;BOOL IsIconic(&lt;br /&gt;HWND hWnd // handle of window&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;A fentebb emlitett problema nem jelent igazan gondot ha ugyis az eger kurzor alatti legnagyobb Z orderrel rendelkezo ablakot valasztjuk. Akkor a takarasban levo&lt;br /&gt;ugysem fog kivalasztodni mert ha van felette vmi akkor annak biztos nagyobb a Z ordere is. Ha csak felig van takarasban akkor ki lehet valasztani de az nem is baj.&lt;br /&gt;&lt;br /&gt;Az ablakokat egyszeruen le lehet kerdezi az &lt;strong&gt;EnumWindows&lt;/strong&gt; fgv-vel. Ez egy callbacket ker elso parameterkent ami minden ablak handlejevel meg fog hivodni. A masodik parameterben meg atadhatunk pl egy listat amibe eltaroljuk a hwnd-ket.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;BOOL EnumWindows(&lt;br /&gt;WNDENUMPROC lpEnumFunc, // pointer to callback function&lt;br /&gt;LPARAM lParam // application-defined value&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;BOOL CALLBACK EnumWindowsProc(&lt;br /&gt;&lt;br /&gt;HWND hwnd, // handle to parent window&lt;br /&gt;LPARAM lParam // application-defined value&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;A child windowkat teljesen hasonloan kerdezhetjuk le az &lt;strong&gt;EnumChildWindows&lt;/strong&gt; fgv-vel. Csak a fenti paremetereken kivul a parent hwndjet is meg kell adnunk.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;BOOL EnumChildWindows(&lt;br /&gt;&lt;br /&gt;HWND hWndParent, // handle to parent window&lt;br /&gt;WNDENUMPROC lpEnumFunc, // pointer to callback function&lt;br /&gt;LPARAM lParam // application-defined value&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Az EnumWindows csokkeno Z orderben kapjuk az ablakokat&lt;br /&gt;Az ablak meretet es koordinatait a &lt;strong&gt;GetWindowRect&lt;/strong&gt; fuggvennyel kerdezhetjuk le.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;BOOL GetWindowRect(&lt;br /&gt;&lt;br /&gt;HWND hWnd, // handle of window&lt;br /&gt;LPRECT lpRect // address of structure for window coordinates&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Igy mar minden megvan a megvalositashoz amit most nem fogok egy az egyben bepastelni csak par reszletet.&lt;br /&gt;&lt;br /&gt;A StateSnapshot tartalmaz egy vector&amp;lt;widget&amp;gt;-et. Tegyuk fel hogy az ablakok mar ki vannak gyujtve ebben. Ahol a widget tartalmazza a handlet, RECT-et es a child komponenskere mutato listat valamint meg tudja mondani egy tetszoleges pontrol hogy az az ablakon belul helyezkedik-e el, es hogy milyen child komponensen van eppen a kurzor.&lt;br /&gt;&lt;br /&gt;A lathato ablakokbol kivalasztjuk azt ami az eger kurzor alatt van.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Widget* StateSnapshot::getWindowUnderPoint( int x, int y ) {&lt;br /&gt;&lt;br /&gt;    Widget::WidgetList *lst = getVisible();&lt;br /&gt;    Widget *widget = NULL;&lt;br /&gt;&lt;br /&gt;    for ( int i = 0; i &lt;size(); ++i ) {&lt;br /&gt;        Widget *w = lst-&gt;at(i);&lt;br /&gt;        if ( w-&gt;pointInside( x, y) ) {&lt;br /&gt;            widget = w;&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    delete lst;&lt;br /&gt;&lt;br /&gt;    return widget;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A legkisebb teruletu child komponens kivalasztasa:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Widget* Widget::getChildUnderPoint( int x, int y ) {&lt;br /&gt;    int area = -1;&lt;br /&gt;    Widget *widget = NULL;&lt;br /&gt;&lt;br /&gt;    for ( int i = 0; i &lt; childList.size(); ++i ) {&lt;br /&gt;&lt;br /&gt;        Widget *w = childList[ i ];&lt;br /&gt;&lt;br /&gt;        if ( w-&gt;pointInside( x, y ) ) {&lt;br /&gt;            if ( area == -1 || w-&gt;area() &lt; area ) {&lt;br /&gt;                area = w-&gt;area();&lt;br /&gt;                widget = w;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return widget;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ez pedig az amit a JNI fuggvenyunk ( getWidgetRectUnderCursor ) hivni fog. Eloszor megkeresi melyik ablakra mutat a kurzor. Majd megnezni hogy milyen widget van az ablakon belul azon a helyen. Ha semmi akkor visszater az ablakkal egyebkent a child widgettel.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Widget* StateSnapshot::getWidgetUnderPoint( int x, int y) {&lt;br /&gt;    Widget *w = getWindowUnderPoint( x, y );&lt;br /&gt;&lt;br /&gt;    if ( w == NULL ) {&lt;br /&gt;        return NULL;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    Widget *child = w-&gt;getChildUnderPoint( x, y );&lt;br /&gt;&lt;br /&gt;    if ( child == NULL ) {&lt;br /&gt;        return w;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return child;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Erdemes kiprobalni tobbfele ablakkal a featuret. Ha megnezzuk pl NB-vel (vagy barmilyen mas swinges alkalmazassal) erdekes eredmenyre jutunk. Semmilyen child widgetet nem fogunk tudni kivalasztani csak magat az ablakot, mivel a swing a komponenseit sajat maga rendereli le. Eclipsenel viszont siman megy a gombok es panelek kivalasztasa mivel SWT mar az OS widgetjeit hasznalja. Vannak persze nativ alkalmazasok is ahol nem tudunk mindent kivalasztani egyenkent mert sajat komponenseket hasznalnak. De az ezeket magabafoglalo widget mar kijelolheto.&lt;br /&gt;&lt;br /&gt;Remelhetoleg xlibbel is hasonloan egyszeruen megoldhato. A kovetkezo (wines) JShot verzio mar tartalmazni fogja a featuret ami hamarosan letoltheto lesz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-5149683555878459133?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2008/09/widget-selection.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-8592522081827501059</guid><pubDate>Wed, 30 Jul 2008 22:50:00 +0000</pubDate><atom:updated>2008-07-31T00:51:18.133+02:00</atom:updated><title>jshot.info</title><description>A JShot weblapja ezentul a &lt;a href="http://jshot.info/"&gt;http://jshot.info &lt;/a&gt;cimen erheto el. Felraktam par screencastot, shotot meg eztazt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-8592522081827501059?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2008/07/jshotinfo.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-8156989814871032033</guid><pubDate>Fri, 25 Jul 2008 22:55:00 +0000</pubDate><atom:updated>2008-07-26T18:39:34.065+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>java</category><category domain='http://www.blogger.com/atom/ns#'>swing</category><category domain='http://www.blogger.com/atom/ns#'>JShot</category><title>Swing, JShot etc</title><description>&lt;p align="left"&gt;Egy picit el lett hanyagolva az utobbi idoben a blog de itt a nyar - meg amennyi maradt belole - ugyhogy igyekszek irni par postot. &lt;/p&gt;&lt;p align="left"&gt;Egy korabbi bejegyezesben mar irtam egy JShot nevezetu ScreenCapture utilityrol. Kicsit felelevenitve ez egy javas screenshot keszito es uploader utility amivel az elkeszitett screenshotot feltolthetjuk az elore beallitott helyre. Tobbfele feltolto plugin van hozza. Pl ftp, http (ami a kepfeltoltes.hu-ra tolti), skype file sender. Az elobbi ketto feltoltes utan megjeleniti es a vagolapra masolja az urlt is. Az egesznek annyi a lenyege hogy ha meg akarjuk mutatni a kepernyo egy reszet vkinek akkor upload es mar pastelhetjuk a linket. &lt;/p&gt;&lt;p align="left"&gt;A proginak elkeszult az elso publikus teszt verzioja. Letoltheto egyelore &lt;a href="http://zeroflag.web.elte.hu/jshot/"&gt;innen&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_a1yFN_W8k8A/SIpl1QKmymI/AAAAAAAAAAU/HYAG2QuMW1Q/s1600-h/jshot1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5227102283063806562" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_a1yFN_W8k8A/SIpl1QKmymI/AAAAAAAAAAU/HYAG2QuMW1Q/s320/jshot1.png" border="0" /&gt;&lt;/a&gt; Feature lista: &lt;ul&gt;&lt;li&gt;Teljes kepernyo, desktop, aktiv window, taskbar capture. (az utobbi 3 csak jni-vel win alatt)&lt;/li&gt;&lt;li&gt;Area capture user alatal kivalasztott terulet&lt;/li&gt;&lt;li&gt;Editalasi es rajzolasi funkciok (alakzatok, szabadkezi, szoveg, copy/cut/paste, radir, floodfill, effektek, rotate, flip, crop, merge, stb)&lt;/li&gt;&lt;li&gt;Uploader pluginok: ftp/http/skype mindegyikhez kulon profileok hozhatok letre&lt;/li&gt;&lt;li&gt;Alakzatok tulajdonsagainak allitasa&lt;/li&gt;&lt;li&gt;Feltoltesek egylepesben systemtrayrol&lt;/li&gt;&lt;li&gt;Undo/Redo&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;Ami remlehetoleg meg jon: &lt;ul&gt;&lt;li&gt;Vmi IPC a tray app es a futo app kozott, az azonos peldanyban valo kep megnyitashoz pl.&lt;/li&gt;&lt;li&gt;Hotkeyek (keyboard hook jni-vel, nem igerem hogy minden platformra de winre biztos)&lt;/li&gt;&lt;/ul&gt;Irnek par szot a fejlesztes soran szerzett tapasztalatokrol. A java igazabol nem olyan eros a desktop vonalon ezzel gondolom nem mondtam ujat. Viszont imho meg igyis nagyobb produktivitas erheto el vele mint pl cpp+egy nativ guitoolkit-tel, pusztan a managed kodbol szarmazo elonyok miatt. Az elonyok es hatranyok targyalasanal viszont nem art kulonvalasztani hogy mi az ami a fejlesztesi szempontbol jo vagy rossz illetve a felhasznalonak jo vagy rossz. &lt;p&gt;&lt;/p&gt;&lt;p&gt;User szemszogebol a a swinges alkalmazas csunya es lassu. Legalabbis sokan mondjak. Plusz azontul hogy csunya nagyon elut a kinezete a operendszeren futo nativ alkalmazasoktol. Ez utobbi imho hulyeseg. Vannak eleg latvanyos Look and feel-el is (pl liquid). Az hogy mashogy nez ki mint egy nativ alkalmazas meg nem feltetlen hatrany, sot teljesen szokvanyos. Rengeteg alkalamzas van ami nagy szamban hasznal sajat renderelesu komponenseket, es a userek is szeretik cserelgeni a skineket ha van ra lehetoseguk. Eleg megnezni az official msn klienst win alatt, kb semmi nem emlekeztet belole win32-es widgetekre. Ez a bongeszokre ugyanugy igaz. Az operanal se a Windos Native az alapertelemzett skin hanem valami egeszen csicsas kinezet van defaultbol beallitva. Nem beszelve arrol hogy sokan hasznalnak crossplatformos (pl gtk-s xchat, gimp) programokat, amiknek ugyanugy elut a kinezete az alap widgetektol mint egy swinges progie. Tehat egyaltalan nem lenne problema ez, csak sajnos az alapertelmezett Metal/Ocean laf tenyleg nem olyan tetszetos. &lt;/p&gt;&lt;p&gt;Ami a lassusagot illeti a startup tenyleg lehetne joval gyorsabb, de ez az ami csak bizonyos alkalmazasoknal fontos. Vannak olyan programok ahol a user elvarja hogy kattintasra azonnal bejojjon. Egy lightweight editor vagy kepnezegeto pl ilyen. Egy screencapture utilitinel is ez az elvaras. Ennek en ugy probaltam megfelelni hogy kulon valasztottam a main appot, es egy a systemtrayen futo kis alkalmazast. Ez memoria hasznalat szemontjabol is kevezobb. Amikor a user ki akarja valasztni a kepernyo egy reszet akkor duplakattint a systrayes ikonra vagy menubol kivalasztja az area capturet. Ekkor bejon egy awt-s ablak rajta egy canvassal ami kirajzolja screenshotot. Azert awt-s mert ezt lehet fullscreenre rakni es eleg gyors ahhoz&lt;br /&gt;hogy azonnal bejojjon. Igy az egesznek olyan hatasa van kb mintha a kepernyon jelone ki a felhasznalo kepreszletet. A kep feltolteset vagy editalasat mar a main app vegzi el. Igy annak startuptimeja adodik hozza a feltoltesi idohoz, amihez kepest a startup mar elhanyagolhato. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Fejlesztesi szempontjabol swing szerintem egy jol felepitett osztalykonyvtar. A komponensek konnyen kiterjeszthtok. Ami elonye hogy ez tenyleg full platformfuggetlen, a komponensek ugyanugy viselkednek es ugyanugy neznek ki mindenhol. Ez a nativ crossplatform guitoolkitekrol altalban nem mondhato el. Viszont alapbol nagyon keves komponens van. Szerintem mar delphi 1.0-ba is tobb volt. Amig ott egy 10 tabos lapozhato widgetre voltak kipakolva, addig az osszes swinges kompi elfer egyetlen JPanelen. Nincs pl calendar, statusbar, datetimepicker. Valamint viszonylag alap dolgokhoz is sokat kell kodolni. &lt;/p&gt;&lt;p&gt;Nem igazan ismerek jol hasznalhato rad gui buildert hozza. Bar a matisse kisebb nagyobb hibai ellenere jol hasznalhato dialogok es static formok megtervezesere. &lt;/p&gt;&lt;p&gt;Ami meg feltunt hogy van par idegesito memoria felszabaditasi hiba ami mar igen regota megvan es sajnos nem nagyon akarjak javitani. Ez abbol adodik hogy a swingben jopar helyen van olyan static referencia ami a sajat komponenseinkre mutathat. A gc az ilyeneket nem fogja tudni felszabaditani, se azokat amikre ez a widget hivatkozik. Megoldas az hogy disposekor kezzel leszedjuk az osszes komponenst rola plusz kulso objectre mutato fieldek nullozzuk. Igy csak az ures widget marad bent a memoriaban a rajta levo stuffok legalabb mar nem. Vagy valami dummy komponenst letrehozunk hogy kiusse a static referencet. Ez nalam jelentkezett a drag and drop-nal hasznalt TransferHandler-ben ahol a SwingDragGestureRecognizer static valtozo hivatkozott a komponemsemre. Persze a kovetkezo muveletkor ezt felulirja egy uj referenciaval, de valami mindig maradni fog benne. JInternalFramnel szinten van &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4759312"&gt;memoria felszabaditasi &lt;/a&gt;problema. Ha letrehozunk egy framet majd disposeoljuk, nem fogja tudni felszabaditani csak ha csinalunk egy kovetkezot is. A legutolso viszont mindig bent fog maradni a memoriaban. Ami megrosszabb hogy nem csak JInternalFrame-re hanem sima JFram-re is mukodik.&lt;/p&gt;&lt;p&gt;Szoval osszessegeben lenne meg hova fejlodnie a dolognak. De biztos vagyok benne hogy ha SWT-ben vagy .NET-ben csinaltam volna akkor is lenne ehhez hasonlo szivas lista csak mas jellegu problemakkal. Az ember mindig azt szidja amivel eppen dolgozik :)&lt;/p&gt;&lt;p&gt;De attol meg a JShot mukodik - mar amennyira egy developer a sajat alkalmazasat teszteni tudja - minden eszrevetelt szivesen fogadok.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-8156989814871032033?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2008/07/swing-jshot-etc.html</link><author>noreply@blogger.com (Zeroflag)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a1yFN_W8k8A/SIpl1QKmymI/AAAAAAAAAAU/HYAG2QuMW1Q/s72-c/jshot1.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-116706259350836877</guid><pubDate>Mon, 25 Dec 2006 15:54:00 +0000</pubDate><atom:updated>2006-12-25T21:52:00.873+01:00</atom:updated><title>Karacsonyi wish list</title><description>&lt;strong&gt;Java™ SE 7 wish list&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/ahe/entry/java_se_7_wish_list"&gt;Peter Ahé&lt;/a&gt; egy eredekes Java Dolphin-os whishlistet fogalmazott meg blogjaban. Szamomra egy-ket otlet eleg meredeknek tunik, de van olyan is amit szivesen latnek a 7-es javaban.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Real closures"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Closures-rol mar tobben irtak. Nekem akkor ez egy uj dolog volt mert az altalam hasznalt nyelvek nem igazan tamogatjak. Tulajdonkeppen kodblokk amit egy fuggveny parameterkent adunk meg. Ertelmezesem szerint annyiban tud tobbet mint egy callback/delegate/anonymousinnerclass hogy a blokkon kivuli lokal valtozokat eleri. Tipikusan azt csinalja hogy egy collection minden elemere meghivja a megadott blokkot, az pedig valamilyen muveletet vegez a kapott parameterrel. Ilyesmit lehet csinalni javaban egy anonymous inner class + final tomb referenciaval, de a dolog lenyege inkabb az lenne hogy egy egyszeru szerkezetet szolgaltat amivel roviden megoldhato a dolog.&lt;br /&gt;&lt;br /&gt;Rubyban ezzel sokat szoktak operalni. Python mar kevesbe tamogatja de map/filter + lambda-val lehet hasonlo hatast elerni. Amiota bejott a List comprehension, azota amikor csak lehet mindenki azt hasznalja mert sokkal attekinthetobb.&lt;br /&gt;&lt;br /&gt;Nem egy olyan dolog ami nelkul ne lehetne elni, de ha valami atlathato syntaxot talalnak ki neki akkor lehet hogy jo lesz.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Type aliasing"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;pl.:&lt;i&gt;  "import java.util.List&amp;lt;String&amp;gt; as StringList;"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ez csak egy aprosag de jol nez ki. Pythonban is van ilyen bar ott ritkan hasznalom, mert viszonylag rovidek es konnyen megjegyezhetoek a modul es package nevek. Javaban viszont a kacifantosabb nevek -foleg igy genericel kombinalva- leroviditesere jol johet. Mivel ugyis csak importban hasznalhato (remelhetoleg) igy nem ront az olvashatosagon.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Super packages"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Hmm, nekem nincsenek ilyen igenyeim a packagekkel kapcsolatban, de akik nagy meretu frameworkoket fejlesztenek azoknak lehet.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Shorthand syntax for declaring properties"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Azaz  &lt;i&gt;"property String foo"&lt;/i&gt;-bol csinal  &lt;i&gt;setter/gettert&lt;/i&gt;. Ez ebben a formban nem tudom miert jo nekunk. Egyreszt a legtobb IDE ugyis auto generalja, masreszt ha a setter/getterbe sajat kodot akarok rakni akkor nem hasznalhatom. Max olyan formaban lenne ertelme mint ahogy C#-ban van. De akkor meg szvsz a kezdetektol kellett volna alkalmazni, nem utolag belerakni. Szerintem ez igy felesleges.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Array syntax for collections"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;"How sweet is this:&lt;br /&gt;&lt;i&gt;final map = new HashMap&amp;lt;String, Integer&amp;gt;();&lt;br /&gt;map["one"] = 1;"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Na igen, ez tok jo lenne csak sztem egyaltalan nem illik bele a java nyelvezetebe.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Shorthand syntax for declaring local variables"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Ezen mar akkor is enyhen ledobbentem amikor meglattam hogy C#-nal ilyet akarnak.&lt;br /&gt;Vagyis lokal valtozokat tudok ugy deklaralni hogy nem irom ki a tipust mert az az ertekadas alapjan dol el. Erre tobbfele javaslat is van.&lt;br /&gt;&lt;br /&gt;JavaScript-re emlekezteto syntax: (szerintem ez a legrondabb)&lt;br /&gt;&lt;i&gt;var foo = "bar";&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Vagy:&lt;br /&gt;&lt;i&gt;final foot = "bar"; &lt;/i&gt;(mivel ha final akkor ugyis csak egyszer tudom inicializalni)&lt;br /&gt;&lt;br /&gt;Gosling pedig a kovetkezo syntaxot javasolta:&lt;br /&gt;&lt;i&gt;foo := "bar"; // Valaki mar meg is patchelte azota a javac-t hogy elfogadja ezt az ertekadast. Hat igen, GPL.. :)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;A "var"-os nal azonkivul hogy JS-re emlekeztet meg uj keywordot is be kell vezetni. Enumnal is volt ilyen hogy 1.4-es sourcban pl valtozonevkent hasznaltak, 1.5-re nem lehetett egyazegyben leforgatni mert ott mar reserved word. De a legfobb ervem az hogy hulyen nez ki (akarcsak pascal styelos operator) :).&lt;br /&gt;&lt;br /&gt;Legeloszor a dinamikusan tipusos nyelvekre asszocialtam de ettol meg nyilvan ugyanugy static typing marad.&lt;br /&gt;&lt;br /&gt;(Egyebkent meg a dinamukusan tipusos nyelveknek szvsz nem is az az igazi elonye (ami egyesek szerint nagy hatrany is lehet) hogy nem kell kiirni a tipust hanem sokszor egyszeruen nem is erdekel hogy kinek mi a tipusa. Max az hogy mit tud az illeto objektum. Ha egy file objectnek es egy socket objectnek is van read metodusa akkor nekem az egyforman jo hiaba total kulonbozo a ket objektum. Ugyanugy hasznalhatom anelkul hogy kozos interfacet irnek ra benne a read methoddal. Ezert ritkan is lehet olyat latni hogy isinstance, helyette inkabb hasattr-t hasznalnak. Abba nem mennek bele hogy alkalmas-e ilyen nyelv nagy rendszerek fejesztesere mert ebbe nem tudnek allastfoglalni. (mindenesetre van ra pelda boven). Kisebb programok fejlesztesenel viszont ez nagy mertekben novelheti a produktivitast (masok szerint meg a hibalehetoseget:)).&lt;br /&gt;&lt;br /&gt;Visszaterve a javahoz, nem tudom hogy van-e a dolgonak azon kivul haszna hogy nem kell leirni par karaktert. Uj keywordot es operatort meg szerintem hanyagolni kene.&lt;br /&gt;&lt;br /&gt;Gondolkodtam hogy en milyen featuret latnek szivesen de nem sok ertelmes dolog jutott eszembe. kack viszont ezt javasolta:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;catch( Exception1, Exception2, Exception 3 ) { }&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ezt most max ugy lehet hogy kozos parent-et csinalok nekik es azt kapom el.  De vegulis elofordulhat hogy logikailag nem illik bele vmelyik Exception egy bizonyos hiearchiaba de attol meg egyuttesen szeretnem elkapni oket.&lt;br /&gt;&lt;br /&gt;Nem vagyok az uj featureok ellen, csak az olyanokat nem szeretem amik rontjak az olvashatosagot, vagy nagyon "hackelhetove" teszik a nyelvet. Ez alatt azt ertem hogy ugyanazt a dolgot tobbfelekeppen meg lehet csinalni, pl egy sorban ugyhogy senki nem fogja erteni mit csinal az a sor, vagy tobben es akkor esetleg atlathatobb lesz. Ha a Closures-nek vmi szar syantox talalnak ki akkor abbol lehet ilyen problema. Az olvashatosagot szvsz a tul sok keywordel, tul sok speci operatorral is le lehet rontani. Szoval szerintem mertekkel kene kezelni ezeket a featureoket. &lt;style&gt;i{content: normal !important}&lt;/style&gt;&lt;style&gt;i{content: normal !important}&lt;/style&gt;&lt;style&gt;i{content: normal !important}&lt;/style&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-116706259350836877?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/12/karacsonyi-wish-list.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-116587525894076653</guid><pubDate>Mon, 11 Dec 2006 22:05:00 +0000</pubDate><atom:updated>2006-12-11T23:53:10.686+01:00</atom:updated><title>Java SE 6</title><description>Kijott a a &lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;JDK 1.6&lt;/a&gt;-os verzioja, amit idaig mustang kodneven emlegettek. Jol idozitettek a felev vegere igy nem nagyon van idom megnezegetni. Amit a betas tapasztalatok alapjan tudok hogy sok szep desktop feature kerult bele mint pl systemtray icon, antialiasingos font, splashscreen. NB-t megneztem milyen 1.6al. A textek eddig sem voltak nalam szalkasak egy cleartext utility miatt de most mintha megszebb lenne, bar lehet csak placebo. Sebesseg novekedest majdnem minden verzional igergetnek, de ezt egy desktop appnal annyira nem veszem eszre. Eddig sem volt se tul gyors se tul lassu. De ez majd hosszabb hasznalat utan ugyis kiderul. Ha lesz idom megnezem alaposabban.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jah es a kedvencem: "java -cp ".;libs/*" Progi"&lt;br /&gt;De vajon miert nem jutott ez mar hamarabb eszukbe? :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-116587525894076653?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/12/java-se-6.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-116268743815294179</guid><pubDate>Sun, 05 Nov 2006 00:43:00 +0000</pubDate><atom:updated>2006-11-05T01:45:43.890+01:00</atom:updated><title>lol?</title><description>&lt;a href="http://www.javapolis.com/JP06/campaign/index.php"&gt;ehehe&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-116268743815294179?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/11/lol.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115973158761139258</guid><pubDate>Sun, 01 Oct 2006 19:35:00 +0000</pubDate><atom:updated>2006-10-01T21:39:47.630+02:00</atom:updated><title>LayerTable</title><description>Egy kis JShot upgrade. A shapek zorderjet egy LayerTable segitsegevel lehet valtoztatni, drag and droppal.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/jshot3.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/jshot3.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115973158761139258?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/10/layertable.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115883957642344089</guid><pubDate>Thu, 21 Sep 2006 11:52:00 +0000</pubDate><atom:updated>2006-09-21T13:52:56.436+02:00</atom:updated><title>Opera 9.02RC2</title><description>&lt;a href="http://my.opera.com/desktopteam/blog/"&gt;innen&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115883957642344089?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/09/opera-902rc2.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115784168879456571</guid><pubDate>Sat, 09 Sep 2006 22:25:00 +0000</pubDate><atom:updated>2006-09-15T21:12:56.740+02:00</atom:updated><title>JShot</title><description>Regota nem postoltam ugyhogy itt az ideje. Utobbi idoben egy regebbi alkalmazason dolgoztam. A JShot egy screen capture program ami a kepenyrol csinal screenshotot, amit szerkeszthetunk vele, valamint feltolthetjuk egy lepesben ftp serverre, a linket pedig a vagolapra masolja. Az otlet onnan jott hogy gyakran elofordult hogy im/irc-en meg kellett mutatni a kepernyo egy reszet masik szemelynek. Ilyenkor a hagyomanyos modszer hogy nyomsz egy printscreent, elinditasz vmi kepszerkesztot, bepasteled, elmented, elinditasz egy ftp kliens, feltoltod, linket meg kezzel beirod. Na ezt a nem keves lepest akartam automatizalni, ezert kezdtem fejleszteni a jshotot. A legelso verzio kb ennyit csinalt es nem tobbet. A mostani viszont egy kis refactoringon ment at, helyenkent ujra is kellett irni, valamint rakas uj featurevel is bovult. Kepszerkesztesi funkciok kerultek bele, rajzolni lehet a kepre. Kulonbozo elore legyartott alakzatokat rapakolni layerkent. Amiket utolag mozgatni, meretezni lehet. Kicsinyites, nagyitas, tukrezes, forgatas, par effekt, stb. A gui pedig teljesen mdi-s lett. A program 100% pure java/swing igy fut mindenhol. Meg par fontosabb featuret szeretnek belerakni mielott publikus verziot csinalok belole. Addig is nehany onkentes "beta teszter" (= @ismeros) hasznalja. Egy shotot azert megelolegezek :)&lt;br /&gt;ime:&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/2176/3054/1600/jshot.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/jshot.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115784168879456571?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/09/jshot.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115505102415933194</guid><pubDate>Tue, 08 Aug 2006 15:25:00 +0000</pubDate><atom:updated>2006-11-07T16:15:37.100+01:00</atom:updated><title>Pocket Torrent</title><description>&lt;a href="http://photos1.blogger.com/blogger/2176/3054/1600/torrent.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/torrent.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Jelenleg a Python 2.4.3-es verzioja elerheto pocket pc-n is. Ez tartalmaz egy interaktiv interpretert es az alap csomagok nagy reszet. Pl van xmlrpclib, smtplib, ftplib, stb es tkintert is ra lehet haxolni. Nincs viszont pl distutils meg signal. Legegyszerubb ilyenkor ugy letesztelni az interpreter kepessegeit ha egy meglevo nagyobb projectet probalunk meg rajta elinditani. A bittorrent 3.9.1es verziojat valasztottam. Ezt probaltam konzol modban futtani(btlaunchmany.py). Meglepo modon mindossze egyetlen egy sort kellett atirni benne es onnantol tokeletesen futott.&lt;br /&gt;A RawServer.py ha nem win32 paltformon fut(es ez most ce platform), akkor os.pipe-ot probal hasznalni ami ppc-s pythonnal nem letezik. De ez felfoghato a forras hibajakent is, mert azt feltetelezi hogy minden nem win32es platforom van pipe es lehet selectelni is fileokat. Ezt kellett atirni, illetve meg beleirtam a parancssoros parametert is kozvetlenul a forrasba hogy ne kelljen azzal is vacakolni. Letoltottem vele 5megas teszt filet majd ugyhagytam hogy seedelje egy ideig. Egyetlen problemam az volt hogy storage-re nem akart menteni, se az SD kartyara, se az iPAQ storera. Igy nagyobb fileokkal nem tudtam kiprobalni. De szerintem ezis egy szep eredmeny hogy gyakorlatilag egy az egyben elfut egy pc-re irt program ppc-n. Ez nem mondhato el se .netrol se javarol. Mert az elobbinel eleve compact frameworkot kell hasznalni utobbinal meg CDC/CLDC-s vm-re kell forditani. (csak olyanbol hasznalhato nem igazan van).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115505102415933194?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/08/pocket-torrent.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115369755281489624</guid><pubDate>Sun, 23 Jul 2006 22:28:00 +0000</pubDate><atom:updated>2006-07-24T01:44:51.513+02:00</atom:updated><title>Megoldas a metaclasses</title><description>Ujra vissza az elozo problemahoz. A metaclassok tulajdonkeppen olyan osztalyok amiknek a peldanyai is osztalyok. Ez igy elsore lehet furcsan hangzik mert az ember ugy tanulta hogy az osztalyok peldanyai az objectek. Objectet az ember ugy csinal hogy van egy osztalya ami sablonkent mukodik es az alapjan csinal belole peldanyt. Ugyanazt meg lehet tenni osztallyal is, azaz egy olyan masfajta osztaly kell ami maga is osztalyt ir le. Ez a masfajta osztaly a metaclass. Pythonban a legnyilvanvalobb, beepitett metaosztaly a type. De ilyen a types.ClassType is. Ez elobbi a beeptitett osztalyok metaclassa, az utobbi pedig a user altal gyarott osztalyoke. Pythonban maguk az osztalyok is objectkent vannak megvalositva, ugyanugy (legalabbis az en problemam szempontjabol) jonnek letre (egy metaclass peldanyaikent), mint a normal objectek. Ez pedig megoldast jelent szamomra, mert nincs mas dolgom mint csinalni egy uj metaosztalyt, aminek a konstruktoraba elrejtem az interface ellenorzo kodomat. Ebbol a metaosztalybol csinalni egy uj peldanyt, azaz egy normal osztalyt. Ez lesz az Interface osztaly aminek a metaosztalya az InterfaceType. Az Interface mar egy teljesen normalis osztaly, ebbol leszarmatathatok barmilyen interfacet. pl.:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ITest( Interface ):&lt;br /&gt;    def test(self, t): pass&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Mivel az Interface osztaly az InterfaceType konstruktorat orokolte (metaosztalyoknak is van konstruktoruk ami akkor fut le ha peldanyt hozunk letre belole, azaz normal osztalyt a metaosztalybol), az ITest pedig az ovet. Igy az ITest osztaly megkrealasakor, le fog futni a metaosztalyomban levo ellenorzo kod. Hangsulyozom hogy osztaly letrehozasakor, nem osztaly peldanyositasakor. Ezutan ezt az interfacet "implementalom", amihez ugyanugy az oroklest hasznalom.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Test( ITest ):&lt;br /&gt;    def test(self, t):&lt;br /&gt;        return t&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A Test osztaly letrehozasakor szinten lefut az ellenorzes. Mi is van ebben az ellenorzesbe. Eloszor is lekerdezi az aktualis osztaly metodusait. Jelen esetben a Test krealasakor ez a 'test' metodus. Lekerdezi az osztaly direkt oseit. Ha ennek az osnek az ose Interface osztaly akkor o maga egy Interface. ITest jelen esetben. Igy el tudom donteni hogy a Test osei kozul melyik az interface mert nem biztos hogy csak ITestbol fog szarmazni, lehet ott mas nem interface osztaly is. Tehat megvannak az implementalando interfacek (ITest vagy Interface osztaly letrehozasakor nem fog ilyet talalni ekkor nem is ellenoriz semmit). Az interfacek metodusait egyenkent lekerdezem, jelen esetben megkapom az Itest.test(self, t)-t, es megnezem hogy ez egyenlo-e (marmint 2 fuggveny referencia) az aktualis osztaly a Test, ugyanilyen nevu (mert hat biztos hogy van neki ilyen hiszen orokolte, kerdes hogy a user feluldefinialta-e) metodusaval. Ha a 2 referencia megegyezik akkor csak sima oroklesrol van szo, ha kulonbozo akkor felul lett definialva, azaz a user kozvetlenul beleirta a kodba, tehat implementalta. Ezutan leellenorozm meg a fuggveny parametereinek a szamat is, ha nem stimemel ugyanugy assert errorozik (azert assert, mert az letilthato egy parancsosoros parameterrel ha pl release verzional nem akarjuk ellenorizgetni). Szoval ha en azt mondom hogy class Test( ITest, Base1, Base2 ), es az ITest interfacebol szarmazik, a Base1/2 pedig normal osztaly, akkor az ITestben levo metodusokat koteles vagyok feluldefinialni.&lt;br /&gt;&lt;br /&gt;Es akkor jojjon a kod:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from types import MethodType&lt;br /&gt;&lt;br /&gt;def getMethods( clz ):&lt;br /&gt;    return [i for i in dir(clz) if type(getattr(clz, i)) == MethodType]&lt;br /&gt;&lt;br /&gt;class InterfaceType(type):&lt;br /&gt;&lt;br /&gt;    def __new__(cls, name, bases, dct):&lt;br /&gt;        return type.__new__(cls, name, bases, dct)&lt;br /&gt;&lt;br /&gt;    def __init__(cls, name, bases, dct):&lt;br /&gt;        super(InterfaceType, cls).__init__(name, bases, dct)&lt;br /&gt;&lt;br /&gt;        for b in bases:&lt;br /&gt;            if b.__base__.__name__ == 'Interface':&lt;br /&gt;                imet = getMethods( b )&lt;br /&gt;                for m in imet:&lt;br /&gt;                    assert getattr( cls, m ) != getattr( b, m ),                        'WARNING: method %s not implemented in %s' % ( m, cls.__name__ )&lt;br /&gt;&lt;br /&gt;                    assert getattr( cls, m ).func_code.co_argcount == getattr( b, m ).func_code.co_argcount,                        'WARNING: method %s not correctly implemented in %s (parameter mismatch)' % ( m, cls.__name__ )&lt;br /&gt;&lt;br /&gt;Interface = InterfaceType('Interface', (), {})&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Mivel metaclassrol van szo lathato hogy konstruktorban nem self, hanem cls, azaz metaosztaly peldanyra mutato referencia van. A __new__ az __init__ elott hivodik meg es az uj osztaly peldanyaval ( ami most szinten osztaly mivel metaclassbol hozza letre ) ter vissza ('type' osztaly factorykent mukodik). Elofordulhat hogy ugy jon letre az osztaly hogy az __init__ nem hivodik meg pl picklevel serializaljuk be, ilyenkor az ellenorzes sem fog lefutni (normal osztaly betolteskor szerintem le kell mindig). De a 2 cls parameter nem ugyanaz a 2 fuggvenyben. A __new__ban a self-el analog a metaosztaly sajat referencia van, mig a konstruktorban az aktualis metaosztaly peldany, azaz normal osztalyra mutato referencia. A for loopban a direkt ososztalyokbol kivalasztjuk azokat akiknek az ose az Interface, es ezutan kovtkezik a metodusok osszehasonlitasa. Az utolso sor nagyon fontos, Interface = InterfaceType('Interface', (), {}), itt hozok letre az InterfaceType metaosztalybol egy peldanyt, azaz egy normal Interface osztalyt.&lt;br /&gt;&lt;br /&gt;Itt pedig a test kod&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from interface import Interface&lt;br /&gt;&lt;br /&gt;class ITest( Interface ):&lt;br /&gt;    def test(self, t): pass&lt;br /&gt;&lt;br /&gt;class Cloneable( Interface ):&lt;br /&gt;    def clone(self): pass&lt;br /&gt;&lt;br /&gt;class Test( ITest, Cloneable ):&lt;br /&gt;    def lofasz(self):&lt;br /&gt;        return t&lt;br /&gt;&lt;br /&gt;    def test(self, t):&lt;br /&gt;        return t&lt;br /&gt;&lt;br /&gt;    def clone(self):&lt;br /&gt;        print 'clone'&lt;br /&gt;&lt;br /&gt;class Test2( Test):&lt;br /&gt;    pass&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A modszer meg erosen kiserleti, tesztelest igenyel, de elsore nem latok olyan problemakat mint az elozo kettonel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115369755281489624?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/07/megoldas-metaclasses.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115361707547142625</guid><pubDate>Sat, 22 Jul 2006 23:38:00 +0000</pubDate><atom:updated>2006-07-23T03:11:18.813+02:00</atom:updated><title>Masodik nekifutas</title><description>Elozo postomban leirt modszer nemigazan hasznalhato addig amig nincs osztaly decorator. Most mashogy kozelitettem meg a problemat es a class static valtozojaba taroltam a interfaceket. pl.:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ITest:&lt;br /&gt;      def test(): pass&lt;br /&gt;&lt;br /&gt;class Test:&lt;br /&gt;      __implements__ = ( 'ITest', 'interface_pkg.interfaces.iclone.clone.Cloneable', 'serializable.Serializable' )&lt;br /&gt;&lt;br /&gt;      def sample(self): pass&lt;br /&gt;      def serialize(self): pass&lt;br /&gt;      def clone(self): pass&lt;br /&gt;      def test(self): pass&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A syntax hasonlo mint zopenal (de azt nem tudom hogy ellenorzi). Lathato hogy modul/csomag nevet fel kell tunetni az osztaly neve elott. Ha nincs odairva semmi (mint az ITest-nel) akkor az aktualis fileban fogja keresni az adott osztalyt(interfacet).&lt;br /&gt;&lt;br /&gt;Az ellenorzes pedig a kovetkezokeppen mukodik. A modul importalast hookoltam, igy a sajat importerem lefog futni minden import elott (ezert kell torolni az import cachet). Ez az importer ellenorzi az importalando fileban levo osszes osztalyt, megnezi van-e valamelyiknek __implements__ static attributuma. Ha talal ilyet, akkor az abban talalhato interfaceket betolti, es lekerdezi a benne levo metodusokat. Majd megnezi hogy az implementalo oszalyban ezek benne vannak-e. Ha igen akkor visszater a modullal, egyebkent hibat ir es None-t kuld vissza, ami ImportError-t fog okozni.&lt;br /&gt;&lt;br /&gt;Hasznalat pedig a kovetkezo. Eloszor interface_checker -t kell importalni, ami hookolja magat. Innentol kezdve ha valamit importalunk akkor azt leellenorzni. Ebbol viszont mar ki lehet talalni mi a problema ezzel a modszerrel. A __main__ modul betoltesenel hamarabb nem tudja hookolni magat (mert legkorabban ott lehet importalni) igy az abban levo osztalyokat nem ellenorzni.&lt;br /&gt;&lt;br /&gt;Ezenkivul kicsit olyan haxolos benyomast kelthet a dolog. Azert teszem megis koze, mert a import hookolas egy jo feature, es hata inspiral masokat egyeb problemak &lt;br /&gt;megoldasara. Pl az &lt;a href="http://urlimport.codeshift.net/"&gt;urlimport&lt;/a&gt; - amivel httprol lehet python modult betolteni - is ezt hasznalja. De pl olyat meg nem lattam hogy adatabazisbol lehetne ugyanigy importalni, pedig ez is hasznos lehet.&lt;br /&gt;&lt;br /&gt;Ime InterfaceImporter highly experimental verzioja:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class InterfaceImporter:&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;TODO: check number of parameters&lt;br /&gt;TODO: asserterror&lt;br /&gt;TODO: check main module&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;    disable = False&lt;br /&gt;&lt;br /&gt;    def __init__(self, path):&lt;br /&gt;        print '[init]: at', path&lt;br /&gt;&lt;br /&gt;    def find_module(self, fullname, path=None):&lt;br /&gt;        if InterfaceImporter.disable: return None&lt;br /&gt;        print '[find module]: %s at %s' % ( fullname, path )&lt;br /&gt;        return self&lt;br /&gt;&lt;br /&gt;    def load_module(self, fullname):&lt;br /&gt;        print '[load module] at', fullname&lt;br /&gt;&lt;br /&gt;        InterfaceImporter.disable = True&lt;br /&gt;&lt;br /&gt;        try:&lt;br /&gt;            mod = __import__(fullname)&lt;br /&gt;&lt;br /&gt;            # get all class from the module&lt;br /&gt;            classes = [ i for i in dir( mod ) if type(getattr(mod, i)) == ClassType ]&lt;br /&gt;&lt;br /&gt;            print 'Module %s contains %s class(es)' % (fullname, classes)&lt;br /&gt;&lt;br /&gt;            try:&lt;br /&gt;                for clazz in classes:&lt;br /&gt;&lt;br /&gt;                    clazz = getattr(mod, clazz)&lt;br /&gt;&lt;br /&gt;                    if not hasattr( clazz, '__implements__'):&lt;br /&gt;                        # no __implements___ field found, skip this class&lt;br /&gt;                        print 'No interface in %s' % (clazz)&lt;br /&gt;                        continue&lt;br /&gt;&lt;br /&gt;                    interfaces = getattr( clazz, '__implements__')&lt;br /&gt;                    print '%s implements %s interface(s)' % ( clazz, interfaces )&lt;br /&gt;&lt;br /&gt;                    iobjes = []&lt;br /&gt;                    for inf in interfaces:&lt;br /&gt;                        if inf.rfind( '.' ) == -1:&lt;br /&gt;                            ipkg = fullname&lt;br /&gt;                            iname = inf&lt;br /&gt;                            inf = ipkg + '.' + inf&lt;br /&gt;                        else:&lt;br /&gt;                            iname = inf[inf.rindex('.')+1:]&lt;br /&gt;                            ipkg = inf[:inf.rindex('.')]&lt;br /&gt;&lt;br /&gt;                        iobj = __import__( ipkg )&lt;br /&gt;                        for isub in inf.split('.')[1:]:&lt;br /&gt;                            iobj = getattr(iobj, isub )&lt;br /&gt;&lt;br /&gt;                        iobjes.append( iobj )&lt;br /&gt;&lt;br /&gt;                    self.checkInterfaces( clazz, iobjes )&lt;br /&gt;&lt;br /&gt;            except AssertionError, e:&lt;br /&gt;                print "implementation error: %s" % (str(e))&lt;br /&gt;                return None&lt;br /&gt;            except Exception, ex:&lt;br /&gt;                print 'Error:', str(ex)&lt;br /&gt;                return None&lt;br /&gt;            else:&lt;br /&gt;                print 'All method implemented'&lt;br /&gt;        finally:&lt;br /&gt;            InterfaceImporter.disable = False&lt;br /&gt;&lt;br /&gt;        return mod&lt;br /&gt;&lt;br /&gt;    def getMethods( self, clz ):&lt;br /&gt;        return [i for i in dir(clz) if type(getattr(clz, i)) == MethodType]&lt;br /&gt;&lt;br /&gt;    def checkInterfaces( self, clazz, interfaces ):&lt;br /&gt;        cmethods = self.getMethods( clazz )&lt;br /&gt;        print 'class methods of %s: %s' % ( clazz,cmethods )&lt;br /&gt;        for inf in interfaces:&lt;br /&gt;            imethods = self.getMethods( inf )&lt;br /&gt;            print 'interface methods of %s: %s' % ( inf, imethods )&lt;br /&gt;            for i in imethods:&lt;br /&gt;                assert i in cmethods,                    `i` + ' not correctly implemented'&lt;br /&gt;&lt;br /&gt;# import hook&lt;br /&gt;sys.path_hooks = [x for x in sys.path_hooks if x.__name__ != 'InterfaceImporter']&lt;br /&gt;sys.path_hooks.append(InterfaceImporter)&lt;br /&gt;sys.path_importer_cache.clear()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Az import hookolasrol bovebben pep-0302-ben lehet olvasni. Itt azt is leirjak hogy milyen protocolt kell kovetnie az importer osztalynak. Ez a protocol dolog olyan a pythonnal mint az interface statictyping nyelveknel. Ez mindossze annyit tesz hogy doksiba leirjak hogy milyen metodusok szuksegesek ahhoz h mukodjon. Ha valamit kihagyunk majd runtime kiderul, de amig hapog es duck-kent viselkedik addig duck :)&lt;br /&gt;Egyebkent meg unittest rulez.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115361707547142625?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/07/masodik-nekifutas.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115348617594516370</guid><pubDate>Fri, 21 Jul 2006 12:07:00 +0000</pubDate><atom:updated>2006-07-21T18:25:26.913+02:00</atom:updated><title>Python interface</title><description>Az interface egy hasznos dolog, kulonosen ha frameworkot tervez az ember. Az adott specifikaciot eloszor interfacekkel irjuk le, majd arra adunk egy konkret implementaciot. Az interface alapjan mas is eltudja kesziteni a meglevovel kompatibilis de eltero implementaciot. A kozos interface pedig biztositja hogy meglevo mas libekkel egyutt tudjon mukodni. Pythonban nincsenek interfacek, es ugy vettem eszre hogy legtobben nem is nagyon tartanak ra igenyt. Ugyanakkor a nagyobb frameworkok mint zope, kifejlesztettek interfacekre sajat modszert. Megprobaltam en is irni egy egyszeru decoratort ami ellenorzi hogy egy osztaly implementalta-e maradektalanul a megadott interfacet.&lt;br /&gt;&lt;br /&gt;Egy ehhez hasonlot akartam eloszor csinalni, de class decorator (meg?) nincs pythonban igy a syntax ezt nem engedi meg.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@implements( [IInterface1, IInterface2] ) # not supported &lt;br /&gt;class Test:&lt;br /&gt;    ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ezert fuggveny decoratorral probalkoztam. Konstruktort altalban explicit megadja az ember igy erre huztam ra a decorator fuggvenyt. A problema ezzel hogy peldanyositaskor ellenorzi, nem pedig a modul betoltesekor, igy csak runtime derul ki ha baj van. (De talan hamarabb mintha metodus hivasnal jonnenk ra hogy nem letezik az adott fuggveny) &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ITest:&lt;br /&gt;      def testMethod(self): pass&lt;br /&gt;&lt;br /&gt;class Cloneable:&lt;br /&gt;      def clone(): pass&lt;br /&gt;&lt;br /&gt;class Test:&lt;br /&gt;&lt;br /&gt;      @implements( (ITest, Cloneable) )&lt;br /&gt;&lt;br /&gt;      def __init__(self, s, i):&lt;br /&gt;          print s, i&lt;br /&gt;&lt;br /&gt;      def testMethod(self):&lt;br /&gt;          print 'implemented'&lt;br /&gt;&lt;br /&gt;      def clone(self):&lt;br /&gt;          print 'clone test'&lt;br /&gt;&lt;br /&gt;t = Test( 'test', 1 )&lt;br /&gt;t.testMethod()&lt;br /&gt;t.clone()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A konstruktorra kell hattatni a decoratort, ami visszad egy olyan fuggvenyt ami leellenorzi az implementaciot es meghivja az eredeti konstruktort. A tovabbi problema ezzel hogy  minden egyes peldanyositaskor lefut az ellenorzes, es feleslegesen lassit. Ezt esetleg meg lehetne oldani egy global release/debug flaggel amit ha kikapcsol az ember akkor skipeli az ellenorzest. Ha valami static initializacios blokkba el lehetne helyezni hasonlo modon az ellenorzest es ugy a modul importalasanal le tudna ellenorizni akkor hasznalhato lenne. Ha valakinek van erre hasznalhato otlete az irja meg plz.&lt;br /&gt;&lt;br /&gt;A decorator amit en hasznaltam a kovetkezo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def implements( infaces ):&lt;br /&gt;    """&lt;br /&gt;       implements decorator&lt;br /&gt;       usage:&lt;br /&gt;             class Sample:&lt;br /&gt;                   @implements( (IInterface1, IInterface2, IInterfaceN  )&lt;br /&gt;                   def __init__(self, args):&lt;br /&gt;                       ...&lt;br /&gt;       warning: this will check the implementation at runtime, before every creation of the instance&lt;br /&gt;    """&lt;br /&gt;    def f( init ):&lt;br /&gt;&lt;br /&gt;        from types import MethodType&lt;br /&gt;&lt;br /&gt;        def getMethods( clz ):&lt;br /&gt;            return [i for i in dir(clz) if type(getattr(clz, i)) == MethodType]&lt;br /&gt;&lt;br /&gt;        def checkInterface( clazz ):&lt;br /&gt;            cmethods = getMethods( clazz )&lt;br /&gt;            for inf in infaces:&lt;br /&gt;                imethods = getMethods( inf )&lt;br /&gt;                for i in imethods:&lt;br /&gt;                    assert i in cmethods,                           `i` + ' not correctly implemented'&lt;br /&gt;&lt;br /&gt;        def new_init(ref, *args, **kargs): # this will be the new constructor&lt;br /&gt;            checkInterface( ref.__class__ )&lt;br /&gt;            return init(ref, *args, **kargs)&lt;br /&gt;&lt;br /&gt;        return new_init&lt;br /&gt;&lt;br /&gt;    return f&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115348617594516370?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/07/python-interface.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115265742746694110</guid><pubDate>Tue, 11 Jul 2006 22:30:00 +0000</pubDate><atom:updated>2006-07-12T00:44:33.336+02:00</atom:updated><title>Python 2.5 beta</title><description>Megjelent a python2.5 masodik betaja. Csak most volt idom kiprobalni par uj featuret ezert nemirtam az elsorol. Errol viszont most egy kicsit bovebben fogok.&lt;br /&gt;&lt;br /&gt;Nezzuk milyen ujdonsagokat rejteget szamunkra. Elszor is van amd64 portja ami tok jo (lesz majd). Mostmar van a c-s '?:'-hez hasonlo felteteles kifejezes bar teljsen mas syntaxal. "x = cond ? 1 : 0" helyett "x = (1 if cond else 0)". A zarojel nem kotelezo de azt ajanljak(nagyon helyesen) hogy hasznaljuk a jobb olvashatosag miatt. Nem tudom eldonteni hogy ez jo vagy rossz, eddig se volt nehez leirni azt 2 sort, a python pedig sose arrol volt hires hogy kevesebbet kell gepelni (mint pl perl) hanem hogy rendkivul jol olvashato a kod. Eloszor arra gondoltam hogy c-s verziot kellett volna akkor mar belerakni, mert azt mindenki ismeri es megszokta mar. Viszont az egyaltalan nem illik a python szintakszisahoz. Valoszinuleg azert viszolyogtam eloszor tole mer rogton a perles "expression if (condition)" -re asszocialtam, (Na akkor mar csak az unless hianyozna es kb dobnam kukaba az egesz nyelvet:)) node nem errol van szo ugyhogy lehet hogy hasznosnak fog bizonyulni.&lt;br /&gt;&lt;br /&gt;Van egy masik nyelvi feature aminel egyaltalan nem volt kerdes hogy jo-e vagy nem. Megpedig hogy finally megengedett lett exceptionnel egyutt.&lt;br /&gt;&lt;br /&gt;Azaz:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;try:&lt;br /&gt;   print 1/0&lt;br /&gt;except Exception, e:&lt;br /&gt;       print e&lt;br /&gt;finally:&lt;br /&gt;        print 'finally'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ez egyertelmuen ql, johetett volna hamarabb is.&lt;br /&gt;&lt;br /&gt;Ha mar finally akkor ugylatszik nem alltak meg ennel a developerek hanem tovabbmentek es csinaltak egy meg egyszerubb modszert a clean-up es hasonlo muveletek lefuttatasara. Bejott egy uj kulcsszo a "with" (es "as") aminek segitsegevel az object tulajdonkeppen sajat maga vegezheti a clean-up-ot, eroforras felszabaditast illetve minden olyat amit altalban az ember a finally blockba tesz. Kovetkezokeppen kell elkepzelni:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;with kifejezes as valtozo:&lt;br /&gt;     valtozo.fgv1&lt;br /&gt;     valtozo.fgv2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Az erdekes ebbe az hogy a with block vegen vagyha kivetel keletkezett, tehat mindekeppen lefut egy cleanup amit az osztalyban van elore definialva. Olyan objectet hasznalhatunk with blockba ami tamogatja ezt, un. Context Manager protocolt. Ami egyszeruen annyit jelent hogy egy elore meghatarozott interface metodusaival rendelkezik, de errol majd kesobb.&lt;br /&gt;&lt;br /&gt;Hogy vilagosabb legyen ime egy filekezelos pelda:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;with open('file.txt', 'r') as f:&lt;br /&gt;    for line in f: print line&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A muvelet vegen a file szepen lezarodik, anelkul hogy ki kene irni az f.close()-t.&lt;br /&gt;&lt;br /&gt;A PEP-ben erre a modszerre tobb peldat is mondanak, pl I/O muvelet mint filekezeles, thread lock hogy ne felejtsunk el releaselni, es ami nekem a legjobban tetszett az a tranzakcio kezeles. Erre fogok most kiterni.&lt;br /&gt;&lt;br /&gt;Tehat van egy db tablank akarunk valamilyen muveleteket vegrehajtani rajta, ha pl valamelyik nem sikerul egy kivetel miatt akkor rollbackelje az egeszet egyebkent mehet a commit.&lt;br /&gt;&lt;br /&gt;Ezt ezt ehhez hasonlo koddal megtehetjuk.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;db = DatabaseConnection()&lt;br /&gt;# begin transaction&lt;br /&gt;with db as cursor:&lt;br /&gt;     cursor.insert('first row')&lt;br /&gt;     cursor.delete('another row')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De nezzuk mi van a hatterben azaz hogy tudunk olyan osztalyt csinalni ami tamogatja a with-et. Eloszor is ez a bizonyos Context Manager eloirja szamunkra hogy legyen az osztalynak egy __enter__ es egy __exit__ metodusa. Az enter a blockba valo belepeskor hivodik meg es visszaadja azt az objectet amin a muveletet szeretnenk elvegezni. Ez fog az 'as' kulcsszo utan megadott valtozoba eltarolodni. ( masszoval cursor = db.__enter__() ) Kell hogy legyen tovabba egy __exit__(self, type, value, tb) amibe altalaba cleanupot tesszuk. Itt a commitot, rollbackat vagy a db connectionpooling lezarast. Az exit parameterei ugyanaz mint a sys.exc_info(). Innentol kezdve mar haszanhatjuk is a with-et.&lt;br /&gt;&lt;br /&gt;A lenti examplet a PEP-bol vettem es egeszittem ki, a DatabaseConnection az ami tudja ezt a bizonyos interfacet, van neki exit es entere. Az enter visszater a cursorral amivel insertelhetunk vagy torolhetunk az adatbzisbol. Az exit pedig ha nincs kivetel akkor commitol, egyebkent rollbackkel. Az exit visszateresi erteke is fontos, ez altalaban false, ami azt jelenti hogy a kivetelt ujradobja, a true (csak a pelda miatt true) pedig teljesen elnyeli.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from __future__ import with_statement # ez elvileg csak a betaban kell, kesobbiekben alapbol importalni fogja&lt;br /&gt;&lt;br /&gt;class Cursor:&lt;br /&gt;      def insert(self, s):&lt;br /&gt;          print 'insert', s&lt;br /&gt;&lt;br /&gt;      def delete(self, s):&lt;br /&gt;          print 'delete', s&lt;br /&gt;          raise Exception('Database exception: delete error')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class DatabaseConnection:&lt;br /&gt;      def __enter__(self):&lt;br /&gt;          self.cursor = Cursor()&lt;br /&gt;          return self.cursor&lt;br /&gt;&lt;br /&gt;      def __exit__(self, type, value, tb):&lt;br /&gt;          if tb is None: # No exception&lt;br /&gt;             # do commit&lt;br /&gt;             print 'COMMIT'&lt;br /&gt;          else:&lt;br /&gt;               # do rollback&lt;br /&gt;               print 'ROLLBACK', value&lt;br /&gt;          # release the connection object...&lt;br /&gt;          return True #False&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;db = DatabaseConnection()&lt;br /&gt;# begin transaction&lt;br /&gt;with db as cursor:&lt;br /&gt;     cursor.insert('first row')&lt;br /&gt;     cursor.delete('another row')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A program kimenete pedig a kovetkezo:&lt;br /&gt;&lt;br /&gt;insert first row&lt;br /&gt;delete another row&lt;br /&gt;ROLLBACK Database exception: delete error&lt;br /&gt;&lt;br /&gt;Ugyanis a deleteben szandekosan dobtam egy kivetelt, ellenkezo esetben kommitol.&lt;br /&gt;&lt;br /&gt;Errol lehet azt is gondolni hogy nem egy nagy dolog, raadasul eddig is siman meg lehett finallyval mostmeg irhatok neki kulon osztalyokat. A dolog lenyege inkabb az szerintem hogy ezekutan a standard runtime osztalyai es valoszinuleg a thirdparty libek nagyresze is tamoatni fogja ezt a modszer ahol ez szukseges, azaz nem nekem kell megirni a cleanupot minden muveletnel hanem az object gondoskodni fog arrol hogy a block vegen lezarja a filet, bezarja a socket kapcsolatot/adatbazist stb. Szerintem tokjo featurenek nez ki. Ja, es van egy contextlib modul amibe olyan decorator van definialva ami leegyszerusiti a context managerek fuggvenybol torteno gyartasat.&lt;br /&gt;&lt;br /&gt;Van meg relativ import, es sok mas uj feature is, ezeket mindenki olvassa el a &lt;a href="http://docs.python.org/dev/whatsnew/whatsnew25.html"&gt;whatsnew&lt;/a&gt;-ban.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115265742746694110?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/07/python-25-beta.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115081631116873135</guid><pubDate>Tue, 20 Jun 2006 15:02:00 +0000</pubDate><atom:updated>2006-06-20T17:12:24.623+02:00</atom:updated><title>Opera 9</title><description>Navegre.&lt;br/&gt;Megjelent az &lt;a href="http://opera.com/download/"&gt;Opera 9&lt;/a&gt; release valtozata.&lt;br/&gt;Lehet upgradelni a betakat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115081631116873135?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/06/opera-9.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115074799036080869</guid><pubDate>Mon, 19 Jun 2006 20:02:00 +0000</pubDate><atom:updated>2006-07-12T00:45:41.523+02:00</atom:updated><title>Vista meg a kszzammel</title><description>Mar vagy egy hete itt pihen a vista beta dvd isoja de nem tudtam kiprobalni azon egyszeru ok miatt hogy nem volt egy ures dvdm. Tegnap ez a problema is elharult, igy mar csak az install hibauzenetet kellett megfejteni hogy semmi se allhasson utamba.&lt;br /&gt;Kovetkezot irta miutan kapott egy 30G-s ntfsre formazott particiot.&lt;br /&gt;&lt;br /&gt; "windows is unable to find a system volume that meets its criteria for installation"&lt;br /&gt;&lt;br /&gt;Google-vel taltam jobbnal jobb 5leteket. Pl huzzak le rola mindent, keyboardot, egeret stb-t. Masik kedvencem h probaljam meg 2x-esen kiirni a dvdt. (ahahah 1hetet vartam mire lett egy dvd-m) Termeszetesen egyiket se probaltam ki mert mar onmagukban nevetsegesek. A problemat valojaban az okozta hogy a grub nem jelolte ki aktivra a bootolando particiot hanem folyamatosan a sol-os particonak volt beallitva a bootflag. Gyorsan orvosoltam, dd (wines), mbr beolvas 512 meretu fileba, vistas partico offsetje megkeres, 0x80 bootflaghez beiir, (a masiknal 0x00), dd visszair. Tudom hogy lehet ezt egyszerubben is :)&lt;br /&gt;Igy mar rogton eltunt a hibauzenet es szepen elkezdte pakolni az egy dvdnyi anyagot.&lt;br /&gt;Install kozbe tobbszor is rebootolgatott, a vegen pedig letrehozatott velem egy usert. A loginScreen egyebkent tokszep meg ugy altalaban minden eleg designos, max az volt illuiziorombolo amikor ugyanaz a ezereves bejelentkezo zene csendult fel&lt;br /&gt;belepesnel. Az mbr-t termeszetesen szo nelkul hazavagta, lecserelte sajat bootmanagerere. Igy vissza kellett pakolni a sajatot hogy tudjak xpt is bootolni. Na es ezutan tortent az erdekes dolog, miutan visszaraktam az mbr-be az enyemet,&lt;br /&gt;es az xp es a sol rendesen bootolt, a vista viszont mar nem. Megprobaltam grubbal, ugyanugy nem volt jo. Bejott a win bootloadere kiirt hogy vmi winloadert nem talal es annyi. DVD-rol recovery console viszont felajanlott vmi 'automatikus javitast'. Az ilyeneket nagyon szeretem mert fogalmam sincs mit csinal, szep lett volna ha megint leszedi a bootmanagert. De nem, minden maradt a regi viszont mar tudott bootolni a vista grubbal es bootmanageremmel is.&lt;br /&gt;Elso eszrevetel az hogy securitys dolgokra nagyobb hangsulyt fektettek. Pl netbeans fel se tudtam rakni mert az installnak, adminkent futtatva se volt semmilyen fileirasi joga :). Nem tudom kinek a hibajabol. A totcom install pedig valamiert el se indult. Ugyhogy ragework-ot hasznaltam. 64bites jse tigert tettem fel, es most derult ki szamomra hogy ebben nincs webstart tamogatas, ugyhogy a 32bites&lt;br /&gt;webstartot kulon kellett felrakni. Vegyesen mentek a 64 es 32bites progik, van kulon 'program fils(32)' es 64, mint a 64es xp nel is. Semmi fele teljesitmenybeli problema nem volt, ugyment kb minden mint xpn.&lt;br /&gt;Noh de terjunk ra, avalon, winfx, xaml es hasonlo buvszavakra. Eleg nehezen tudok eligazodni mar ezek kozott mert .netes hireket nem nagyon kovettem ujabban figyelemmel.&lt;br /&gt;Avalon ha joltudom az uj generacios UI framework ami d3d-t hasznal(hat) rendereleshez. XAML pedig egy xml alapu 'ui' leiro nyelv alkalmazasokhoz,&lt;br /&gt;amivel a guit tervezhetjuk meg ugy hogy egy single line C# kodot nem kell leirni. WinFS-rol is beszeltek annakidelyen de ilyen ugytudom meg nem kerult bele.&lt;br /&gt;Letoltottem a legujabb IronPythont mert annak az egyik screencastjaba lattam egy XAML-es demot. Egy szamologep guija volt leirva xaml-be, minden gombnak kulon abszolut koordinatakkal. Gondlom van layout lehetoseg is,&lt;br /&gt;de szamologep tipikusan az amit anelkul is meg lehet csinalni. Szoval a demo jol mukodott par sor koddal meg lehetett jeleniteni az xaml-bol felepitett&lt;br /&gt;ablakot. Ez egy kifejezetten jo otlet szerintem a guibuilderek szempontjabol is, mert nem kodot kell generalniuk hanem csak egy xmlt. Javaba SwiXML neven&lt;br /&gt;ismerhetunk hasonlo elven mukodo frameworkot. (meg meg lattam mast is de annak nem jut a neve eszembe).&lt;br /&gt;Javaeknak is belekene huzniuk, mert desktop oldalon .net mar a kezdetektol elorebb jart, es ugynezki egyre csak jobb lesz.&lt;br /&gt;Igaz azis hogy a .net a tudasa foleg egy platform kornyekere koncentralodik, illetve hogy szerveroldalon teljesen mas szempontok szamitanak.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/v1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/v1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/v0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/v0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ami a legjobb ebbe a vista dologba hogy elvileg a win32apit felejthetjuk el es kapunk egy annal sokkal magasabb szintu .net apit. Igy remelhetoleg&lt;br /&gt;nem csak a userek orulhetnek majd az uj oprendszernek es a desingos featureinek, hanem a fejlesztoknek is jobb dolguk lesz :].&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115074799036080869?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/06/vista-meg-kszzammel.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-115015511448774941</guid><pubDate>Mon, 12 Jun 2006 22:22:00 +0000</pubDate><atom:updated>2006-06-13T01:31:54.506+02:00</atom:updated><title>PyHook</title><description>Az utobbi egy honapban 2x kellett kicserelni a ramot a desk gepben, es meg mindig nem jo valami mert idonkent ugy random BSODzik vmitol. Eleg idegesito gepeles kozben ha elszall es kezheti elorol (legalabbis legutobbi mentestol) az ember. Ugyhogy elhataroztam h amig ez a problema fennall, rakok egy keyloggert sajat gepre. Vagyis, inkabb irni jobb lenne. Regebben csinaltam keyboard hook alapjan mukodo progit cpp/winapival de most inkabb a konnyebb utat valasztottam. A PyHook egy thirdparty lib pythonhoz amivel meglehetosen egyszeruen hookolhatjuk az egeret/billentyuzetet. Egy hookmanagert kell letrehozni, beallitani egy eventet, es aktivalni a hookot. 3sor. A callbackben pedig szepen megkapjuk a lenyomott bill kodjat, a forras ablak handlejet, titlejet, a leutes idejet.. stb. Persze az egesz win alatt muxik mert nativ win32apis hivasokat (SetWindowsHook) wrappel. De hat nekem pont ez kell.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &gt;&gt;&gt; import pyHook, pythoncom&lt;br /&gt;  &gt;&gt;&gt; def kbproc( evt ): print evt.Ascii&lt;br /&gt;  ... &lt;br /&gt;  &gt;&gt;&gt; hm = pyHook.HookManager()&lt;br /&gt;  &gt;&gt;&gt; hm.KeyDown = kbproc&lt;br /&gt;  &gt;&gt;&gt; hm.HookKeyboard()&lt;br /&gt;  &gt;&gt;&gt; pythoncom.PumpMessages()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Egy olyasmit akarok ami kategoriazalja a logot a forras app-tol fuggoen. Szoval kulon logolja azt amit a bongeszobe irok, kulon azt amit az editor, es mondjuk nem logolja azt amit az irckliensbe.&lt;br /&gt;Mivel az eventbol kiolvashato az ablak handleje ami eppen aktiv volt a billentyuzet leutes pillanataban ez eleg egyszeruen megoldhato. A handle alapjan az hozza tartozo app pid-jet kell meghatarozni, az alapjan pedig le lehet kerdezni a program nevet. (GetModuleFileName)&lt;br /&gt;&lt;br /&gt;Ime a prototipus:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  def getProcNameByPID( pid ):&lt;br /&gt;      h = None&lt;br /&gt;      try:&lt;br /&gt;         h = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, pid)&lt;br /&gt;         return os.path.basename( win32process.GetModuleFileNameEx( h, 0 ) )&lt;br /&gt;      finally:&lt;br /&gt;         if h: h.Close()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ja, es a pidet az ablak handle-bol pedig igy kaptam meg:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  win32process.GetWindowThreadProcessId( evt.Window )[1]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A keyboard proc pedig a kovetkezo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  def keyBoardProc( evt ):&lt;br /&gt;      if evt.Key == 'F12':&lt;br /&gt;         hm.KeyDown = None&lt;br /&gt;         hm.UnhookKeyboard()&lt;br /&gt;         return&lt;br /&gt;      if evt.Ascii:&lt;br /&gt;         fname = '%s.log' % ( getProcNameByPID( win32process.GetWindowThreadProcessId( evt.Window )[1] ) )&lt;br /&gt;         open( fname, 'a' ).write( "%c" % (evt.Ascii) )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lathato hogy F12-re probaltam meg unhookolni viszont, ilyenkor a lib egy AV-vel elszall, ugyhogy ez a feature nemigazan mukodik. Ha valaki tudja miert plz irja meg.&lt;br /&gt;Mindenesetre a szelektalas jol mukodik, konnyen beallithato kulonbozo filter, hogy pl ircklienst vagy jatekot ne logolja mert az egyik ugyis logol maganak, a masiknal meg tok felesleges.&lt;br /&gt;&lt;br /&gt;Majd ha lesz vmi vegleges verzio, esetleg kozzeteszem :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-115015511448774941?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/06/pyhook.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-114945724178141311</guid><pubDate>Sun, 04 Jun 2006 21:28:00 +0000</pubDate><atom:updated>2006-06-04T23:42:48.553+02:00</atom:updated><title>NetBeans Collaboration</title><description>Az elozo postomhoz kapcsolodik hogy egy tok erdekes plugint taltaltam nb-hez. Ahogy a neveben is benne van a fejlesztoknek az egyutmukodeset segiti elo. Tartlamazza a hagyomanyos IM funkciokat, uzenetkuldes, partner felvetele stb, valamint az uzenetek formazasat syntax highlightolasat. Igy nem gond ha par soros kodot akarunk kuldeni, szepen megformazva kiszinezve kuldi el. Ezzel meg persze alig lenne tobb egy normal IM-nel. A legjobb hogy a komplett projectet meg lehet osztani, a tobbi koder lathatja a forrast, modosithatja, sot buildelheti meg futtathatja is. Amig valaki editalja a forrast addig a kornyezo sorokat a tobbiek szamara bejeloli es addig ok azt a kodreszletet nem tudjak szerkeszteni, majd amikor befejezte a modositast megjeleniti a tobbiek szamara is.&lt;br /&gt;&lt;br /&gt;A plugin &lt;a href="http://www.scit.wlv.ac.uk/~c9922394/netbcollab"&gt;weblapjan&lt;/a&gt; gondolom bovebb infokat lehetne olvasni, de amiota probalom nekem nem jon be az oldal. NB5.5beta-val probaltam, update centerrol felrakhato "NetBeans Developer Collaboration" neven.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-114945724178141311?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/06/netbeans-collaboration.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-114936882521422146</guid><pubDate>Sat, 03 Jun 2006 11:00:00 +0000</pubDate><atom:updated>2006-06-03T23:17:53.773+02:00</atom:updated><title>Netbeans pluginok</title><description>Idaig foleg eclipset hasznaltam de egyre jobban kezdek atterni NB-re. Szerintem sokkal intuitivebb, a featureok magatol ertetodobbek. Kicsit lassabban reagal meg tobbet eszik, de ez konnyen orvosolhato ha megfelelo vasat tesz az ember ala. Magaval eclipsevel sincs bajom inkabb egyketto 'erdekesen mukodo'/aluldokumentalt thirdparty pluginnal van problema. NB meg amiket alapbol tartalmaz azok ugylatom jol is mukodnek. Eclipse mellett szokott azaz erv lenni hogy 'dejo sok plugin van hozza', en mint ahogy fentebb irtam ezt inkabb hatranykent elem meg. De mindenesetre megneztem a netbeans plugin kepessegeit. Tulsagosan nem merultem el benne csak 2 egyszeru modult raktam ossze. Ennek a menetet fogom most leirni.&lt;br /&gt;&lt;br /&gt;Biztos tobben voltak mar olyan helyzetbe hogy nehany soros kodreszletet kellett volna megosztani IM-en, IRCen vagy akarmilyen chaten valakivel. Kozvetlenul oda masolni ha par sornal tobb a kod akkor nem tul szerencses. Egyreszt attekinthetlen mert a tabokat altalban nem tartja meg, raadasul sok protokolon limitalva van az egyszerre elkuldheto szovegmennyiseg, legrosszabb esetben pedig a chatkliens mindenfele smiley jelekkre csereli a spec karaktereket a kodban. Erre vannak az ilyen &lt;span style="font-style:italic;"&gt;'nopaste'&lt;/span&gt; oldalak, ahol weben elpostolja a koder, az szepen kiszinezi, majd ad egy linket ahol meg lehet nezni illetve mutatni masnak. Tehat egy olyan plugint irtam ami a NB editoraban kijelolt kodot elkuldi egy ilyen oldalra majd megjeleniti a kapott linket. Az oldal pedig ami most hardcoded benne van a pluginba a &lt;a href="http://phpfi.com/"&gt;http://phpfi.com/&lt;/a&gt;. (Egyebkent meg semmi kozom a phphoz csak ezt az oldalt ismerem :) )&lt;br /&gt;Egy olyan esemenyre lesz szuksegem ami akkor kovetkezik be ha a user az editor popup menujet megnyitja. Valamint szuksegem van tovabba arra hogy lekerdezzem az eppen kijeolt kodot.&lt;br /&gt;&lt;br /&gt;Noh, akkor nezzuk lepesenkent.&lt;br /&gt;&lt;br /&gt;New project/NetBeans Plug-in Module kell nekunk.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/m1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/m1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ezutan adunk neki egy nevet meg locationt/prj dirt.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/m2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/m2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Majd package nevet, config fileokat.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/m3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/m3.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Elkeszult az uj projectunk, es most jon a lenyeg az action wizard. File/New/Action.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/m4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/m4.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tobb fele actiont lehet letrehozni, pl olyat ami context menure- vagy file menure kattintva generalodik. Ezeket kulonfele Cookie osztalyok reprezentaljak. Ami nekem kellett most azt az EditorCookie tudja, mivel rajta keresztul konnyeden elerhetem az eppen editalando forrast. GUI regisztracional az editor context menujebe regeltem be. Igy ha a forrasba jobb(ami nekem bal) gombbal kattintunk akkor felbukkano menuben benne lesz az ujjonnan beregisztralt modulunk. &lt;br /&gt;Ha ezt mind megtettuk akkor az action wizard legeneral nekunk egy skeletont osztalyt aminek az &lt;span style="font-style:italic;"&gt;performAction&lt;/span&gt; metodusa fog meghivodni a menure kattintaskor. Ide kell beirnunk a action kodunkat.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/m5.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/m5.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/m6.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/m6.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Egy EditorCookie peldanytol le tudjuk kerdezni az eppen nyitva levo JEditorPane-eket. Ez meg egy mezei swing komponens, innen mar a megszokott modon megy a kijeolt szoveg lekerdezese a &lt;span style="font-style:italic;"&gt;getSelectedText()&lt;/span&gt; metodussal. Ha ez megvan mar csak fel kell postolni a cuccot az oldalra, de ezt nem reszletezem mert nem tartozika plugin temakorhoz. Egyebkent sima &lt;span style="font-style:italic;"&gt;URLConnection&lt;/span&gt;-el csinaltam.&lt;br /&gt;&lt;br /&gt;Egy kis osszedobott kodreszlet arrol amiron fentebb beszeltem:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;pre&gt;    protected void performAction(Node[] activatedNodes) {&lt;br /&gt;        EditorCookie c = (EditorCookie) activatedNodes[0].getCookie(EditorCookie.class);        &lt;br /&gt;        if (c != null) {&lt;br /&gt;            JEditorPane[] panes = c.getOpenedPanes();&lt;br /&gt;            if (panes.length &gt; 0) {&lt;br /&gt;                String selection = panes[0].getSelectedText();                &lt;br /&gt;                if ( "".equals( selection ) || selection == null ) {&lt;br /&gt;                    JOptionPane.showMessageDialog( null, "At first you have to select the code snippet." );&lt;br /&gt;                    return;&lt;br /&gt;                }                &lt;br /&gt;                Map params = new HashMap&lt;String,String&gt;();&lt;br /&gt;                params.put( "nick", "netbeans" );&lt;br /&gt;                params.put( "descr", "netbeans code" );&lt;br /&gt;                params.put( "lang", "java" );&lt;br /&gt;                params.put( "source", selection );                &lt;br /&gt;                try {&lt;br /&gt;                    WebPost wp = new WebPost( "http://phpfi.com", params );&lt;br /&gt;                    String response = wp.post();                    &lt;br /&gt;                    LinkFrame lf = new LinkFrame();&lt;br /&gt;                    lf.setLink( wp.getUrl().toString() );                    &lt;br /&gt;                    lf.setVisible( true );                    &lt;br /&gt;                } catch ( Exception e ) {&lt;br /&gt;                    e.printStackTrace();&lt;br /&gt;                    JOptionPane.showMessageDialog( null, "error: " + e.getMessage() );&lt;br /&gt;                }                &lt;br /&gt;            }            &lt;br /&gt;        }&lt;br /&gt;    } &lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tesztelesre 2 fele lehetosegunk is van. Alapbol futtatasnal indit egy ujabb NetBeans peldanyt ami az en 512 mega rammal felvertezett gepemet nagyon megviselte(nagyon erik a ram vasarlas). Vagy betolthetjuk az eppen futo NB-be is a modult. Ekkor figyelmeztet hogy veszelyes es hasonlok, de nekem most nem volt belole gondom. Villamgyorsan (najo, NBhez kepest villamgyorsan) bedeployozta es az aktulis context menuben mar ott is figyelt a beregelt modulom. Egy klikkre pedig &lt;span style="font-style:italic;"&gt;.nbm&lt;/span&gt; filet lehet generalni az egeszbol amit mar barki be tud deployozni a sajat NetBeanse ala a Tools/Update Center/Install Manually menuben.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/m7.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2176/3054/320/m7.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Szoval osszesegeben tok jo IDEnek tunik, ami nincs benne alapbol itt is megoldhato kulso modullal, viszont nem vagyok rakenyszerulve hogy alap funkciokhoz is thirdparty pluginokat rakogassak fel. Valamin a &lt;span style="font-style:italic;"&gt;Matisse&lt;/span&gt; is egy olyan dolog amit valoszinuleg nehezen tudnek nelkulozni a jovoben.&lt;br /&gt;&lt;br /&gt;Kicsit bovebb infok + flashdemok elerhetok &lt;br /&gt;&lt;a href="http://platform.netbeans.org/tutorials/"&gt;http://platform.netbeans.org/tutorials/&lt;/a&gt; innen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-114936882521422146?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/06/netbeans-pluginok.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-114885512067850652</guid><pubDate>Sun, 28 May 2006 22:25:00 +0000</pubDate><atom:updated>2006-05-29T00:25:20.683+02:00</atom:updated><title>Solaris?</title><description>Kiprobaltam a sol10 legujabb verziojat.  De install nem ment olyan egyszeruen (kesobb kiderult nem biztos hogy a sol hibajabol) mert rogton ugy kezdte hogy:&lt;br/&gt;&lt;br/&gt;&lt;i&gt;"bzcat: Can't open input file /cdrom/Solaris_*/Tools/Boot/X.cpio.bz2: No such file or directory"&lt;br/&gt;&lt;/i&gt;&lt;br/&gt;Persze a file pontosan ott volt ahol nem talalta. Ennek ellenere tovabbment de a dns/regional settings/stb beallitasok utan vegleg elszallt ezzel az uzivel:&lt;br/&gt;&lt;br/&gt;&lt;i&gt;"ERROR: The disc you inserted is not a Solaris OS CD/DVD"&lt;br/&gt;&lt;br/&gt;&lt;/i&gt;Ilyenkor altalaban reflexbol googlehez nyul az ember. En is igy tettem, es lattam h nem vagyok egyedul ezzel a problemaval, volt mar masnak is ilyen baja. Ott bios allitgatas oldotta meg a problemat nalam az nem segitett. Mivel a gep mar regota hw hiba gyanus (pl a cdrol is hol bootolt hol nem), kicsereltem a cd &lt;i&gt;ide&lt;/i&gt; kabelet, es egybol helyrejott. &lt;br/&gt;Ezutan mar semmi problema nem volt az installal, siman felment a 4 cdnyi anyag.&lt;br/&gt;Elso eszrevetel az volt a korabbi buildhez  kepest (03/05-ot hasznaltam egy rovid ideig) hogy a bootmanagert lecsereltek grub-ra. Ez nem is baj. Viszont nem emlexem hogy mikor kerdezte volna a setup hogy hova akarok bootmanagert rakni igy egybol felulirta a sajatomat ami az mbr-be volt. Ez sem baj, majd visszarakom. (Viszont a grubba magatol beirta a wines particiot)&lt;br/&gt;&lt;br/&gt;Az alaplapom  szerepel a &lt;a href="http://www.sun.com/bigadmin/hcl/"&gt;HCL&lt;/a&gt; listan igy azzal nagy baj nem volt. Leszamitva az alaplapra integralt VT6122 chipsetes halokartyat amihez thirdparty drivert kellett googlezni. Viszont ez hamar &lt;a href="http://homepage2.nifty.com/mrym3/taiyodo/eng/"&gt;megvolt (thx to Masayuki Murayama)&lt;/a&gt;. Az  default sun &lt;i&gt;cc&lt;/i&gt; forditoval lefordult, es meglepo mondon elsore mukodott is. Az egesz muvelet keresessel, readme olvasassal, forgatassal nem volt tobb 5-10 percnel. A szinten alaplapra integralt hangkartya viszont egybol mukodott es az XSun   is tamogatja a radeon9250, igy a JDS is elsore elindult.&lt;br/&gt;&lt;br/&gt;JDS ranezesre nem nagy valtozasokon ment at (attol meg lehet hogy a changelogba 2ezer bugfix van:) ), a start(?) menu (java menu?) ikonja ugyemlexem mas volt. Szoval ugyanolyan gnomeos/gtk-s kicsit lomha de szep joszag. Ami nagyon derek hogy alapbol ott a legfrissebb java runtime, sot JMF is, ami csak egy plusz opcionalis csomag lenne, itt megkapja a user outofthebox.&lt;br/&gt;Eleg sok swinges utiliti van alapbol, es ebben a kornyezetben szerintem tokre jol is neznek ki az metal/ocean laf-al. &lt;br/&gt;Ezek kozul a kedvencem ami nagyon elnyerte tetszesemet a &lt;a href="http://www.sun.com/service/sunupdate/"&gt;Sun Update Manager&lt;/a&gt; . Winupdatehez hasonloan, kulonboz security patcheket, frissiteseket installalhatunk. Termeszetesen egy szep kis swinges kliens program van hozza, amibol ki lehet valasztgatni az installalando cuccokat a dependencyket pedig magatol lekezeli, es felrakott updateket akar uninstallni is lehet. Kulonlegessege hogy remote is managelheto &lt;a href="https://updates.sun.com/"&gt;bongeszobol&lt;/a&gt; egy webappal. Be lehet regelni tobbfele systemet amit karban akar tartani a user.  Aki nem latta meg annak itt egy &lt;a href="http://www.sun.com/service/sunupdate/flash_content.html"&gt;flashdemo&lt;/a&gt; meg egy kep:&lt;br/&gt;&lt;br/&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2176/3054/1600/sum.0.jpg"&gt;&lt;img src="http://photos1.blogger.com/blogger/2176/3054/320/sum.0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Szoval tokjo lenne az egesz ha a hardware tamogatasa nagyobb lenne. Ez idovel persze javulni fog, de addig is aki teheti vegyen egy Ultra20 workstationt azon valszinu minden mukodni fog:). Ja es szoftver tamogatottsaggal is vannak kisebb gondok, pl eclipsebol meg mindig csak motifos van ami hat akar milyen szogbol nezem szerintem ronda:). &lt;a href="http://mercury.to/"&gt;Mercury&lt;/a&gt;bol sincs alapbol solaris package vagy install, de a slackwares verziobol kioperalva siman futott a pure swinges msn/jabber kliens. Azureus package szinten csak sparcos solarisra van. Szval pont ezek a javas appok amiktol elvarna az ember (a swingestol mindenkeppen de az persze mukodott is csak a keszitoje nem csinalt solos distribet)  hogy gond nelkul mukodjenek itt is. &lt;br/&gt; &lt;a href="http://www.bytonic.de/html/jake2.html"&gt;Jake2&lt;/a&gt; -t is megprobaltam de ehhez eleve pesszimistan altam hozza mert ide nativ 3d konyvtarak is kellenek. Webstarttal nem is mukodott mivel a jnlp-be eleve csak lines meg wines libek voltak addolva, mast nem tudott letotleni. Az install szinten nem rakott fel semmit. Utaneztem es jogl-hez talaltam nativ solos libraryt, de lwjgl meg openal stb-t mar nem keresgeltem.&lt;br/&gt;Ha mar javas appoknal tartunk kerestem es talaltam egy tokjo swinges filekezelot. Webstartal ez se indult el  elsore vmier, de letoltve siman futott. Szoval &lt;a href="http://www.ragework.com/"&gt;http://www.ragework.com/&lt;/a&gt; nekem igy elsore elegge bejon, tud szambazni, ftpzni, sftpzni, es azert egy mc-nel kenyelmesebb felulete van. Ja es nem is draga csak 34$. Aki parhuzamosan hasznal tobb fele os-t annak idealis imho.&lt;br/&gt; &lt;a href="http://www.ragework.com/"&gt; &lt;/a&gt;&lt;br/&gt;Vegere akkor a summary:&lt;br/&gt;A hw/sw tamogatottsagi problema az termeszetes egy olyan os-nal ami desktopokon meg nincs kello mertekben elterjedve. Foleg az hw ami gond lehet tvtuner/wlan/usbs kutyuk/szirszar amit osszevasarol a user es ra akarja dugdosni a gepre, mert sw tulajdonkep van minden ami fontos egy atlag usernek es ha nem valogatos es nem akar azert is mast hasznalni akkor ezen a teren nem lesz gondja vele. A hw support meg remelhetoleg idovel egyre jobb lesz. Aki csak fejlesztesre akarja hasznalni (netbeans rulez), es nem egy mindenes os-kent, jatekra/multimediara/stbre annak erdemes kiprobalnia.  &lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-114885512067850652?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/05/solaris.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-28782548.post-114864982237865839</guid><pubDate>Fri, 26 May 2006 13:23:00 +0000</pubDate><atom:updated>2006-06-04T23:45:11.540+02:00</atom:updated><title>Nem zope, de megteszi</title><description>Bar zope szervert szerettem volna blogolashoz, be kell ernem ezzel. Talan a zopebol mar lehet sejetni mirol fog szolni a blog egy resze. Noh nem zoperol mert az nincs, hanem inkabb pythonrol. De elorelathatolag javarol tobb szo fog esni. Meg ugy altalaban prog/info es azzal kapcsolatos dolgok. Igyexem szemelyes dolgokrol minel kevesebbet irni, igy nem biztos hogy olyan gyakran fogok postolgatni. Kezdetnek legyen eleg ennyi info, tobbit majd kesobb.&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28782548-114864982237865839?l=zeroflag.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zeroflag.blogspot.com/2006/05/nem-zope-de-megteszi.html</link><author>noreply@blogger.com (Zeroflag)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></item></channel></rss>