<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[vbali]]></title>
  
  <link href="http://vbali.com/" />
  <updated>2013-04-08T11:18:59+02:00</updated>
  <id>http://vbali.com/</id>
  <author>
    <name><![CDATA[vbali]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/vbali" /><feedburner:info uri="vbali" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Key-value observing]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/ST1f8_f7iko/" />
    <updated>2013-04-08T11:13:17+02:00</updated>
    <id>http://vbali.com/2013/04/08/key-value-observing</id>
    <content type="html">&lt;p&gt;Minden Objective-C oktatási anyag már a kezdetek kezdetén tárgyalja a &lt;a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html" title="Key-Value Observing Programming Guide"&gt;KVO&lt;/a&gt; témakört, amely szorosan kapcsolódik a &lt;a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/Overview.html#//apple_ref/doc/uid/20001838-SW1" title="Key-Value Coding Programming Guide"&gt;KVC&lt;/a&gt;-hez:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Key-value coding is a mechanism for indirectly accessing an object’s attributes and relationships using string identifiers. It underpins or is related to several mechanisms and technologies special to Cocoa programming, among them Core Data, application scriptability, the bindings technology, and the language feature of declared properties. (Scriptability and bindings are specific to Cocoa on OS X.) You can also use key-value coding to simplify your program code.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Az &lt;a href="http://en.wikipedia.org/wiki/Observer_pattern" title="Observer Pattern - Wikipedia"&gt;Observer pattern&lt;/a&gt; egy elég erőteljesen alkalmazott tervezési minta a Cocoa keretrendszerben. Amikor minden az elvártnak megfelelően működik, olyankor a KVO egy áldás, amely óriási terhet vesz le a fejlesztő válláról:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Key-value observing provides a mechanism that allows objects to be notified of changes to specific properties of other objects. It is particularly useful for communication between model and controller layers in an application. (In OS X, the controller layer binding technology relies heavily on key-value observing.)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Például: megváltozik az egyik objektum valamely tulajdonsága, amelyet az őt figyelő másik objektum észrevesz és ennek következtében frissíti valamely saját tulajdonságát. Ez utóbbit figyeli egy másik observer, amely mondjuk a UI megjelenítéséért felelős. Észreveszi, hogy változás történt a megfigyelt objektumban és frissíti a felületet. Külön kód megírása nélkül, automatikusan. Egy tulajdonság megváltozása értesíti a másik objektumot, amely értesít egy harmadikat stb. és végül a felhasználói felületen megjelenik a változás, mindenféle &lt;a href="http://en.wikipedia.org/wiki/Spaghetti_code" title="Spaghetti code - Wikipedia"&gt;spagetti kód&lt;/a&gt; nélkül. Super simple!&lt;/p&gt;

&lt;p&gt;Amikor azonban valami nem úgy működik ahogyan azt a fejlesztő szeretné, olyankor könnyen rémálommá válik az observer pattern használata, mert irtó nehéz nyomon követni, hogy pontosan mi történik a háttérben. Az objektumok üzengetnek egymásnak, ezáltal fel van építve egyfajta logikai riadólánc. Majd egyszer csak &amp;#8220;eltörik&amp;#8221; valami a kódban és nem frissül a felület, vagy nem az jelenik meg ami elvárt volna. Hol lehet a probléma? Sok fejfájást tud ez okozni, amikor már egy kicsit összetettebb az adatszerkezet.&lt;/p&gt;

&lt;p&gt;A minap óriásit szívtam a fent említett példával. Kicsit változott egy adatszerkezet és valahol megszakadt a riadólánc. Egy bizonyos osztályban a KVO kifogástalanul működött, míg ennek a leszármazottjában valami rendellenesség lépett fel és a hozzá kapcsolódó felület nem reprezentálta a változásokat. Az &lt;a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html" title="NSKeyValueObserving Protocol Reference"&gt;NSKeyValueObserving&lt;/a&gt; protokollnak van egy osztálymetódusa, amely automatikusan regisztrál egy (vagy több) observert a paraméterben megadott tulajdonsághoz. Ha a megfigyelt tulajdonságok valamelyike változik, akkor azok automatikusan értesítést küldenek a változásról:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When an observer for the key is registered with an instance of the receiving class, key-value observing itself automatically observes all of the key paths for the same instance, and sends change notifications for the key to the observer when the value for any of those key paths changes.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Bár a megfelelő osztálymetódus létre volt hozva az osztály implementációjában, mégsem történt meg az automatikus KVO. Kis debuggolást követően kiderült, hogy a fent említett osztálymetódus eleve meg sem hívódik, így be sincs regisztrálva a megfelelő observer a tulajdonsághoz. De miért nem hívódik meg az osztálymetódus? Pár órás küzdelem után legyűrt a fáradtság és munkámat végezetlenül hagytam. Reggel ismét nekiültem, hogy kiderítsem a probléma okát. Átolvastam a kapcsolódó dokumentációt és pár percen belül kiszúrtam a nyilvánvalót, amely feketén fehéren le van írva a doksiban: &lt;strong&gt;When an observer for the key is registered with an instance of the receiving class …&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OMG, egész egyszerűen nem volt regisztrált observer a UI frissítését végző osztályban az adott tulajdonsághoz, így az osztálymetódus meg sem hívódott, így az adott tulajdonság nem frissült automatikusan egy másik tulajdonság függvényében és így állt elő az anomália. A két soros javítás (observer regisztráció és felszabadítás) pár másodpercet vett igénybe és működik minden ahogy annak kell.&lt;/p&gt;

&lt;p&gt;Erről beszéltem. Amikor minden az elvártnak megfelelően működik, akkor a KVO rengeteg időt és energiát spórol meg a fejlesztőnek, de az adatszerkezetek változásával ez könnyen megváltozhat, úgyhogy csak ésszel!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/ST1f8_f7iko" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2013/04/08/key-value-observing/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[_MASReceipt]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/AQoRpBe2vCE/" />
    <updated>2013-04-05T09:39:05+02:00</updated>
    <id>http://vbali.com/2013/04/05/masreceipt</id>
    <content type="html">&lt;p&gt;A &lt;a href="http://readkitapp.com" title="ReadKit"&gt;ReadKit&lt;/a&gt; kapcsán kicsit kutakodni kezdtem, hogy hogyan függetlenítették az App Store-tól a programot. Meglepő módon a binárist és minden egyéb, az alkalmazáshoz kapcsolódó állományt érintetlenül hagytak, mindössze egy könyvtárat (&lt;code&gt;_MASReceipt&lt;/code&gt;) és annak tartalmát törölték ki az alkalmazáscsomagból.&lt;/p&gt;

&lt;p&gt;Kipróbáltam, hogy mi történik az eredeti, MAS-ból letöltött alkalmazással, ha ezt a könyvtárat eltávolítom. Bár az áruházból letöltött alkalmazások DRM-mel védettek, ez csak a bináris módosíthatósága ellen véd. A könyvtár eltávolítását követően az alkalmazás probléma nélkül elindult bármelyik gépen. Kipróbáltam más csapatok által készített alkalmazásokkal a &amp;#8220;trükköt&amp;#8221;, ami néhány esetben működött, de a népszerűbb alkalmazások a módosítást követően nem voltak hajlandóak elindulni. Ebből sikerült levonnom azt a kézenfekvő következtetést, hogy a &lt;code&gt;_MASReceipt&lt;/code&gt;-tel a fejlesztőnek kell kezdenie valamit. De mi is pontosan ez a &lt;code&gt;_MASReceipt&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Amikor megvásárolunk egy alkalmazást az Store-ból, akkor a letöltési folyamat részeként az alkalmazáscsomagban létrejön a fent említett könyvtár egy &lt;code&gt;receipt&lt;/code&gt; nevű állománnyal. Ez egy Apple által digitálisan aláírt állomány, amely az alkalmazásról (csomagazonosító, verziószám stb.), valamint a letöltő számítógépről (&lt;code&gt;IOMACAddress&lt;/code&gt;) tartalmaz információkat. A receipt pontos leírását az ide vonatkozó Apple Developer cikk tartalmazza: &lt;a href="http://developer.apple.com/library/mac/#releasenotes/General/ValidateAppStoreReceipt/"&gt;Validating Mac App Store Receipts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A lényeg, hogy a receipt ellenőrzése a fejlesztőre vár. Nincs arra vonatkozóan semmilyen előírás, hogy ezt az állományt ellenőrizni kell, de ha ezt mellőzzük, akkor a fent ismertetett egyszerű trükkel egyszerűen lehet függetleníteni az alkalmazást. Ha pedig beépítjük a megfelelő ellenőrzést, akkor a cracker ilyen módon oldja meg a problémát:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://vbali.com/images/blog/cracked.png" alt="3" /&gt;&lt;/p&gt;

&lt;p&gt;Akkor mégis mi lehet a megfelelő védelem? Egyszerű:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jó minőségű szoftvert kell írni,&lt;/li&gt;
&lt;li&gt;megfelelően kell beárazni,&lt;/li&gt;
&lt;li&gt;és meg kell hallgatni a felhasználókat.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Ha valaki nem akar, úgysem fog fizetni az alkalmazásért. A meglévő felhasználókra és a potenciális vásárlókra kell koncentrálni!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/AQoRpBe2vCE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2013/04/05/masreceipt/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[A két kalap]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/tUZc05W_6zw/" />
    <updated>2013-04-04T17:27:06+02:00</updated>
    <id>http://vbali.com/2013/04/04/a-ket-kalap</id>
    <content type="html">&lt;p&gt;Kevés dolog tud jobban zavarni a &amp;#8221;&lt;a href="http://en.wikipedia.org/wiki/Code_smell" title="Code smell"&gt;bűzlő kódnál&lt;/a&gt;&amp;#8221;, pedig időnként együtt kell élni ezzel a kellemetlenséggel. Naponta szembesülök az újratervezés szükségességével amikor egy-egy új szolgáltatás megvalósításán dolgozok. Ebből kifolyólag gyakran esek abba a hibába, hogy nem tudom épp melyik kalapot viselem, az újratervezőét vagy a szolgáltatás bővítőét. Mivel a két tevékenység végzéséhez teljesen eltérő szabályokat kell alkalmazni, így egyáltalán nem mindegy, hogy épp melyik kalap van rajtunk.&lt;/p&gt;

&lt;p&gt;Napok óta törtem a fejem, hogy hol olvastam erről a problémáról korábban, míg végül bevillant Martin Flower Refactoring című könyve:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Amikor szoftverfejlesztésre használjuk az újratervezést, két különböző tevékenység között osztjuk fel az időnket: a szolgáltatások bővítése és az újratervezés között. Amikor új szolgáltatásokat adunk a programhoz, nem változtatjuk meg a meglévő kódot, csak új lehetőségeket adunk hozzá. Előrehaladásunkat tesztek létrehozásával és működőképessé tételével mérhetjük. Amikor újratervezünk, akkor szándékosan nem veszünk fel új tevékenységeket, csak átépítjük a kódot. Nem készítünk új teszteket (kivéve ha egy korábban kihagyott esetet találunk), és csak akkor változtatunk meg egy tesztet, ha erre mindenképpen szükségünk van a felület megváltoztatásának kezelése érdekében.&lt;/p&gt;

&lt;p&gt;A szoftver fejlesztése során valószínűleg gyakran kapjuk magunkat kalapcserén. Először megpróbálunk a kódhoz adni egy új szolgáltatást, és rájövünk, hogy ez sokkal egyszerűbb volna, ha más lenne a kód szerkezete. Tehát kalapot cserélünk, és egy ideig újratervezünk. Amikor a kódnak már jobb a szerkezete, kalapot cserélünk, és megírjuk az új szolgáltatást. Amint működőképes lesz, rájövünk, hogy túl bonyolultan kódoltunk, így ismét kalapot cserélünk, és újratervezünk. Mindez talán csak tíz percig tart, de &lt;strong&gt;fontos, hogy mindvégig tisztában legyünk vele, hogy éppen melyik kalapot viseljük&lt;/strong&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Oké, mostantól tisztában vagyunk azzal, hogy ha kalapot váltunk akkor mindig észben tartjuk, hogy épp melyiket viseljük. Ám az újratervezés során mindig szembejön egy olyan korábban írt kódrészlet, amelyre - bár nem kapcsolódik közvetlenül az aktuális újratervezési folyamathoz, - mégiscsak ráférne egy kis átalakítás. Bár épp az újratervező kalapjában tevékenykedünk, mégsem tehetjük meg büntetlenül, hogy ész nélkül nekiesünk a szemünk elé kerülő összes problémás részletnek, ez ugyanis újabb virtuális kalapcserével járna, majd végül egy feneketlen rekurzióban találjuk magunkat. Tudom, ez elmondva egyszerűnek hangzik, a gyakorlatban nagyon nehéz ellenállni a kísértésnek.&lt;/p&gt;

&lt;p&gt;Szerencsére az agilis fejlesztőknek minden problémára van egy alkalmazható szabálya, törvénye vagy javaslata:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Sose szakíts meg egy megszakítást&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kent Beck&lt;/strong&gt; — Test-Driven Development&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/tUZc05W_6zw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2013/04/04/a-ket-kalap/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Adj ki korán, adj ki gyakran]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/Qjms7BvH1n4/" />
    <updated>2012-10-26T08:25:00+02:00</updated>
    <id>http://vbali.com/2012/10/26/adj-ki-koran-adj-ki-gyakran</id>
    <content type="html">&lt;p&gt;Az év elején elhatároztam, hogy nyilvántartást fogok vezetni a munkaidőmről. Egy egyszerű időnyilvántartó alkalmazásra volt szükségem amelyben nyilvántarthatom az elvégzett feladataimat és lekérdezhetem, hogy az egyes projektekkel illetve az egyes tevékenységekkel mennyi időt töltöttem ténylegesen és arányaiban. Nem feladatkezelőben és todo listában gondolkodtam, hisz olyanom már van ami jól bevált. Sokkal inkább egy olyan alkalmazást szerettem volna melyet a todo lista mellett, annak kiegészítéseként tudok használni és pontos képet ad arról, hogy milyen hatékony a munkavégzésem. Ezen túlmenően mindenképp egy natív Mac-es alkalmazás illeszkedett volna legjobban az elképzeléseimhez.&lt;/p&gt;

&lt;p&gt;Hosszas keresgélést követően sem találtam megfelelő szoftvert. A legtöbb időnyilvántartó programmal az a baj, hogy az elszámolásra és a számlázásra megy rá. Ezzel semmi gond sincs, ha valakinek erre van szüksége, engem azonban sokkal jobban érdekelt, hogy az egyes projektjeimmel mennyi időt töltök és a munkaórák hogyan oszlanak meg az egyes projektek között. Ezt a gondolatmeneten tovább boncolgatva arra is kíváncsi voltam, hogy a munkaidő milyen tényleges tevékenységekkel telik és ezek a tevékenységek milyen arányt képviselnek napi, heti illetve havi bontásban. Mivel nem találtam ilyen megoldást, így szabad óráimban nekikezdtem a &lt;a href="http://durationsapp.com"&gt;Durations&lt;/a&gt; alkalmazás tervezésének, majd a fejlesztésnek.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://vbali.com/images/blog/durations-draft.jpg" alt="Durations draft" /&gt;&lt;/p&gt;

&lt;p&gt;A projekt remek esettanulmányul szolgált. Egyrészt sikerült magam jobban belevetni a Cocoa mélységeibe, másrészt megtanultam, hogy &lt;strong&gt;amilyen korán csak lehet ki kell adni a szoftver első verzióját&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A programozók maximalisták, gyakran szélsőségesen. Hajlamosak egy megoldásra váró problémára sokkal több időt szentelni mint amennyit az ténylegesen megérdemel. Nem azért mert képtelenek az adott megoldással záros határidőn belül előrukkolni, inkább azért, mert nem találják az adott megoldást elég frappánsnak vagy letisztultnak, esetleg kicsit csúnya vagy bugos. Úgy gondolom, hogy ez így rendjén is van. Nincs azzal semmi gond, ha egy fejlesztő egészségesen törekszik a maximalizmusra, sokkal rosszabb ha valaki igénytelen a kódjára. Van azonban egy határ, melyet átlépve ez a törekvés már inkább hátráltató.&lt;/p&gt;

&lt;p&gt;Van egy szoftverfejlesztési bölcselet, miszerint &lt;a href="http://en.wikipedia.org/wiki/Release_early,_release_often"&gt;adjuk ki hamar, adjuk ki gyorsan&lt;/a&gt;. Ezen filozófia szerint adjuk ki a szoftver első verzióját amilyen hamar csak lehet, majd gyakran adjunk közre frissítéseket (&lt;em&gt;az Apple jóváhagyási szokásait figyelembe véve ez akár problémás is lehet&lt;/em&gt;), s közben figyeljük a felhasználók visszajelzéseit. Ez az a filozófia melyet most, hogy a Durations hamarosan elérhetővé válik, sikerült magamévá tennem, tekintve, hogy az alkalmazás csaknem három hónapig porosodott, miközben olyan feature-ök hibáitól szenvedett, melyek nem is szerepeltek az eredeti célkitűzések között.&lt;/p&gt;

&lt;p&gt;Mint említettem, a célkitűzés egy natív Mac-es alkalmazás elkészítése volt. Menet közben azonban felmerült, hogy milyen király lenne, ha a jövőben iPad-en és iPhone-on is lehetne mérni a munkaidőt, illetve riportálni. Ehhez azonban szükség lesz az adatok szinkronizálására, melyre a legkézenfekvőbb megoldás az iCloud. Bár nem első körös célkitűzés volt, mégis napokat öltem bele az &lt;a href="http://vbali.com/2012/04/19/coredata-es-icloud-fejlesztoi-szemmel/"&gt;iCloud szinkronizáció megvalósításába&lt;/a&gt;, amely végül nem váltotta be a hozzá fűzött reményeket. Mindez hónapokkal meghosszabbította az első kiadás elkészülését. Az iCloud szinkronizációhoz hasonlóan, eszméletlen mennyiségű időt fektettem a felület csiszolgatásába, csinosítására is. Bár a végeredménnyel elégedett vagyok és úgy gondolom, hogy az alkalmazás előnyére váltak ezek a finomítások, mégsem ez fogja meghatározni, hogy a szoftver sikeres lesz-e.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://vbali.com/images/blog/durations-1.0.jpg" alt="Durations 1.0" /&gt;&lt;/p&gt;

&lt;p&gt;Szerencsére menet közben sikerült ráeszmélni, hogy rossz irányba halad a fejlesztés. Szükségem volt egy kis pihenőre, hogy ismét megtaláljam a fókuszt és a motivációt és megújult erővel folytassam a fejlesztést. Ebben a kis pihenőben készült el az &lt;a href="http://mac.icactiapp.com"&gt;iCacti for Mac&lt;/a&gt;. Mindössze az iOS-es feature set implementálása volt a cél, megfejelve a Mountain Lionban debütált Notification Center figyelmeztetésekkel. Ahogy Jason Fried mondja: &lt;a href="http://www.inc.com/magazine/20091101/the-way-i-work-jason-fried-of-37signals.html"&gt;Less is less&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A korai kiadásnak megvannak a maga előnyei és hátrányai, de ha mérlegre teszük ezeket az érveket, akkor nagy valószínűséggel a korai kiadás irányába billen a mérleg nyelve. Persze ez alól kivételt képeznek azok a speciális rendszerek, melyek emberéletekért felelősek: az orvosi műszerek szoftverei vagy például a légi közlekedést irányító rendszerek, de ezektől most tekintsünk el.&lt;/p&gt;

&lt;p&gt;A &lt;a href="http://successfulsoftware.net/2007/08/07/if-you-arent-embarrassed-by-v10-you-didnt-release-it-early-enough/"&gt;Successful Software&lt;/a&gt; kellően kivesézte a témát. A lényeg:&lt;/p&gt;

&lt;h3&gt;A korai kiadás hátrányai&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Szolgáltatások hiánya:&lt;/strong&gt; felesleges azon rugózni, hogy a konkurencia szoftverében több olyan feature is van, melyet az enyém nem tartalmaz. Lehet, hogy a felhasználók nem is használják azt, vagy nincs akkora jelentősége, hogy hónapokra megakadályozza a kiadást.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hírnév:&lt;/strong&gt; a korai kiadás nem tesz rosszat a márkának? Természetesen egy rossz minőségű szoftverre nincs bocsánat. Nem a minőséget, hanem a funkciók számát kell alacsonyan tartani a kezdeti kiadásban. Előre meg kell határozni azt a minimális követelményt, amellyel a szoftver elstartolhat, miközben jól használható marad. A többi pedig jöhet majd a frissítésekkel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Támogatási többletmunka:&lt;/strong&gt; amint megjelennek a vásárlók, támogatást kell nyújtani a szoftverhez. Minél korábbi a kiadás, annál több dolgod lesz a támogatással.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiadási többletmunka:&lt;/strong&gt; a frissítések kiadása rengeteg időt vesz igénybe, még akkor is ha a legtöbb részfeladat automatizálva van. Minél több szoftverfrissítés jelenik meg az alkalmazáshoz, annál több időt kell teszteléssel és honlapfrissítéssel tölteni.&lt;/p&gt;

&lt;h3&gt;A korai kiadás előnyei&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Felhasználói visszajelzések:&lt;/strong&gt; Minden termékbejelentés egy nagy kérdés. Ha sok a versenytárs, felmerül a kérdés, hogy a vásárlók számára mennyire lesz sikeres a termék a konkurenciával szemben. Ha nincs konkurencia előfordulhat, hogy nincs is piaca a terméknek. Az is kérdéses, hogy a termék mely tulajdonságait szeretik a vásárlók és mennyit hajlandóak fizetni érte. A válaszokat a felhasználóktól lehet megtudni. Amint megjelennek a vásárlók, biztos lehetsz benne, hogy a tudtodra fogják hozni, hogy miben várnak előrelépést.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motiváció:&lt;/strong&gt; a valódi vásárlók nagyon jót tesznek a motivációnak. Remeteként fejleszteni hónapokig vagy évekig, mindenféle visszajelzés nélkül, könnyen alááshatja a motivációt és a termékbe vetett hitet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Korai bukás:&lt;/strong&gt; minden szakértelem és törekvés dacára sok termék megbukik. A te terméked lehet a következő. Ha pedig bukásra van ítélve, akkor ez történjen meg amilyen korán csak lehet, hogy minél hamarabb bele tudj kezdeni valami másba, valami újba.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Megtérülés:&lt;/strong&gt; minél korábban kezdesz el értékesíteni annál korábban megtérül a befektetésed.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;As a rule of thumb, I would say that if you aren’t embarrassed by the lack of features in v1.0, then you didn’t release it early enough.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href="http://successfulsoftware.net/2007/08/07/if-you-arent-embarrassed-by-v10-you-didnt-release-it-early-enough/"&gt;Successful Software&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/Qjms7BvH1n4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/10/26/adj-ki-koran-adj-ki-gyakran/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Effective programming]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/LSb6G6bX3nw/" />
    <updated>2012-10-18T18:38:00+02:00</updated>
    <id>http://vbali.com/2012/10/18/effective-programming</id>
    <content type="html">&lt;p&gt;A héten fejeztem be Jeff Atwood blogkönyvének, az &lt;a href="http://www.hyperink.com/Effective-Programming-More-Than-Writing-Code-b1559"&gt;Effective Programming: More Than Writing Code&lt;/a&gt; olvasását, amelyre &lt;a href="http://blog.intiweb.hu/2012/08/18/hyperink-konyvek/"&gt;Orcsik Antal bejegyzése&lt;/a&gt; hívta fel a figyelmemet. Jeff a &lt;a href="http://www.codinghorror.com/blog/"&gt;Coding Horror&lt;/a&gt; blog szerzője, a StackExchange alapítója és igazi hardcore programozó, akit remek írási készséggel is megáldott a sors. A könyv, amely tulajdonképp a Coding Horror blogon megjelent bejegyzések kivonata, egy igazán lebilincselő olvasmány, szinte le sem tudtam tenni. Azokra a mindennapos kérdésekre keresi a választ, amelyek minden programozót érintenek, kezdve a megfelelő eszközök kiválasztásától (billentyűzet, szék, világítás), a hatékony programozási munkán át, egészen a marketing tevékenységig. Mindezt könnyen emészthető és olvasmányos formában, mellőzve minden &lt;a href="http://www.codinghorror.com/blog/2004/12/happy-talk-must-die.html"&gt;Happy Talk&lt;/a&gt; bullshitet.&lt;/p&gt;

&lt;p&gt;Korábban Jason Fried és DHH &lt;a href="http://37signals.com/rework"&gt;Rework&lt;/a&gt; könyvétől vártam hasonló élményt, de annál sajnos teljesen elmaradt a tűzijáték. Kicsit unalmas volt és leginkább a klasszikus self-help könyvekre hajazott, kevés konkrétummal, sok lelkesítő beszéddel. Szóval nem igazán tetszett. Ezzel szemben az Effective Programming szórakoztató, mégis kellőképp szakmai olvasmány, izgalmas, színes témákkal, melyek &lt;a href="http://www.joelonsoftware.com"&gt;Joel Spolsky&lt;/a&gt; régi klasszikusait juttatták eszembe.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/LSb6G6bX3nw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/10/18/effective-programming/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Tenni vagy nem tenni]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/2WGziBOSdXo/" />
    <updated>2012-10-06T12:42:00+02:00</updated>
    <id>http://vbali.com/2012/10/06/tenni-vagy-nem-tenni</id>
    <content type="html">&lt;p&gt;Jeff Atwood írt a héten egy bejegyzést &lt;a href="http://www.codinghorror.com/blog/2012/10/todont.html"&gt;Todon&amp;#8217;t&lt;/a&gt; címmel, hogy miért nincs szüksége todo listákra, valamint, hogy miért tartja azokat működésképtelennek. Van igazság abban amit említ, mégsem osztom a véleményét. Wyctim is beszélt múltkorában a &lt;a href="http://haztajigeek.com/altalkuldve/"&gt;Háztáji Geekben&lt;/a&gt; az általa tapasztalt GTD problémákról, és az ő véleményével sokkal inkább tudok azonosulni:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&amp;#8220;a GTD-vel az a baj mikor az eszközzel foglalkozol és nem azzal, hogy mit kellene csinálni.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;A todo appokkal alapvetően az a baj, hogy azt a hamis üzenetet sugározzák, hogy mindenféle erőfeszítés nélkül megoldják az ember szervezési problémáit. Jómagam legalábbis beleestem ebbe a hibába. Sokáig hittem abban, hogy a GTD és a GTD appok olyan csodaszerek amelyek nem igényelnek extra időbefektetést és egycsapásra megoldják majd a napi feladatok szervezését. A GTD-t lehet jól és lehet rosszul csinálni és a hozzám hasonló fanatikusok könnyen áteshetnek a ló túloldalára, mivel egy eszköztől várjuk a megoldást. Könnyen bele lehet esni a mikromenedzsment csapdájába és olyan szinten elbonyolítani a rendszert, hogy az már inkább akadályozza, mint segíti a produktív munkavégzést.&lt;/p&gt;

&lt;p&gt;Fel kell ismerni, hogy a GTD nem mindenható. Igenis igényel némi extra időbefektetést a feladatlisták karbantartása, de meg kell húzni a határt. Teljesen felesleges triviális infókkal teletömni a rendszert. Értelmetlen nyilvántartani azokat a feladatokat amelyek elvégzése nyilvánvaló és garantált, hogy nem felejtődnek el. A több éves tapasztalatból és a rengeteg hibából tanulva ma már odafigyelek arra, hogy semmilyen felesleges zaj ne kerüljön a rendszerembe. Hajlamos vagyok elfeledkezni dolgokról, de nagyon jól ismerem magam ahhoz, hogy egy adott input megérkezésekkor el tudjam azt dönteni, hogy el fogom-e felejteni vagy sem. Amit biztosan nem felejtek el azzal nem zajosítom a feladatlistámat, amit elfelejthetek az megy a sorba. Igyekszek nem elbonyolítani a nyilvántartást. Általános, perspektíva alapú címkézést és határidőket használok, illetve minimális számú projektbe csoportosítom ezeket. Próbálom tisztán tartani a rendszert. Rendszeresen átfutom a listákat és szigorúan kigyomlálom belőle az értelmetlen vagy értelmét vesztett információkat.&lt;/p&gt;

&lt;p&gt;Vannak még a rendszeresen ismétlődő feladatok és események. Ezek adják a magját a GTD rendszeremnek, mert ezekről különösen hajlamos vagyok megfeledkezni. Minden ilyen ismétlődő tennivalóm a rendszer részét képezi és mivel az évek alatt már többször is bizonyított így tökéletesen megbízok benne.&lt;/p&gt;

&lt;p&gt;Mára már megtanultam, hogy nem a GTD tesz produktívvá. Ugyanúgy az egyszerűségre és az átláthatóságra kell törekedni, mert az biztosítja a rendszer működését.&lt;/p&gt;

&lt;p&gt;Végezetül Jeff Atwood tollából, akinek nincs szüksége todo listára:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;At least four times a day, I walk into a room having no idea why I entered that room. I mean no idea whatsoever. It&amp;#8217;s as if I have somehow been teleported into that room by an alien civilization. Sadly, the truth is much less thrilling. Here&amp;#8217;s what happened: in the brief time it took for me to get up and move from point A to point B, I have totally forgetten whatever it was that motivated me to get up at all. Oh sure, I&amp;#8217;ll rack my brain for a bit, trying to remember what I needed to do in that room. Sometimes I remember, sometimes I don&amp;#8217;t. In the end, I usually end up making multiple trips back and forth, remembering something else I should have done while I was in that room after I&amp;#8217;ve already left it.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;strong&gt;Coding Horror&lt;/strong&gt; &lt;a href="http://www.codinghorror.com/blog/2008/11/we-are-typists-first-programmers-second.html"&gt;We Are Typists First, Programmers Second&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/2WGziBOSdXo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/10/06/tenni-vagy-nem-tenni/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Smart App Banners]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/lZWXb80GQeM/" />
    <updated>2012-09-20T22:40:00+02:00</updated>
    <id>http://vbali.com/2012/09/20/smart-app-banners</id>
    <content type="html">&lt;p&gt;Az iOS 6 egyik újdonsága eddig teljesen elkerülte a figyelmemet, nevezetesen a Smart App Banners. Ez a feature lehetővé teszi az alkalmazásfejlesztők számára, hogy a mobil Safarival érkező látogatók számára megjelenítsenek egy bannert az oldal tetején. A banner tartalmaz egy hivatkozást az alkalmazás App Store oldalára illetve megjeleníti annak ikonját, az értékelést és a képernyőképeket is. A megvalósítás igazán egyszerű, mindössze egy HTML meta taget kell beilleszteni az oldal fejlécébe amely az App ID-re hivatkozik, a bannert a Safari ebből állítja majd elő:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;apple-itunes-app&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app-id=9999999&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;a href="http://webin-apps.com/apps/icacti"&gt;&lt;img src="http://vbali.com/images/blog/smart-app-banners.jpg" alt="Smart App Banners" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ha az alkalmazás már telepítve van az adott eszközön akkor a bannerből közvetlenül el is indítható illetve paraméter is átadható a program számára az &lt;code&gt;app-argument&lt;/code&gt; mezőben. Szükség esetén &lt;a href="http://www.apple.com/itunes/affiliates/"&gt;affiliate code&lt;/a&gt; is átadható az iTunes hivatkozásnak az &lt;code&gt;affiliate-data&lt;/code&gt; mező megadásával:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;apple-itunes-app&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app-id=9999999, app-argument=xxxxxx&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;apple-itunes-app&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;app-id=9999999, affiliate-data=partnerId=99&amp;amp;siteID=XXXX&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/lZWXb80GQeM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/09/20/smart-app-banners/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Twitter kontó]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/YpnvK8GI4HA/" />
    <updated>2012-09-20T20:27:00+02:00</updated>
    <id>http://vbali.com/2012/09/20/twitter-konto</id>
    <content type="html">&lt;p&gt;2009-ben regisztráltam Twitterre, de akkor a megszokott nickkem már foglalt volt, ezért egy underscore karaktert biggyesztettem a nevem elé, így lettem @_vbali. Mindig is &lt;del&gt;zavart&lt;/del&gt; frusztrált ez a plusz karakter, miközben a hőn áhított usernevemet foglaló felhasználó sosem használta a Twitter kontóját. Nem volt sem követője, sem tweetje és ez az évek alatt ez nem is változott. Éppen ezért felvettem a kapcsolatot a Twitter supporttal és kérvényeztem, hogy mivel a nickemet &amp;#8220;bitorló&amp;#8221; user passzív, adják át nekem a fiókot. A mai napon érkezett meg a visszajelzés, hogy szabad a pálya, enyém a fiók. Mától &lt;a href="http://twitter.com/vbali"&gt;@vbali&lt;/a&gt; néven vagyok rezidens Twitteren.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/YpnvK8GI4HA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/09/20/twitter-konto/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Sublime Text 2 - Szódával elmegy]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/D2omhAgkksE/" />
    <updated>2012-08-20T17:20:00+02:00</updated>
    <id>http://vbali.com/2012/08/20/sublime-text-2-szodaval-elmegy</id>
    <content type="html">&lt;p&gt;Miután könnyes búcsút vettem a TextMate-től, hozzáfogtam a &lt;a href="http://www.sublimetext.com"&gt;Sublime Text&lt;/a&gt; testreszabásához. A &lt;a href="http://wbond.net/sublime_packages/package_control"&gt;Sublime Package Control&lt;/a&gt; volt az első kiegészítés melyet telepítettem. Hasonlóan a Linux disztribúciókból ismert csomagkezelőkhöz, a Sublime Package Control segítséget nyújt az editorhoz elérhető csomagok telepítéséhez, frissítéséhez és szükség szerint azok eltávolításához is. Bár az ST2 alaptelepítése is tartalmaz egy tucat általános kiegészítést, mégis szinte elkerülhetetlen, hogy ezeket tovább bővítsük a saját igényeinknek megfelelően.&lt;/p&gt;

&lt;h3&gt;Szinkronizáció&lt;/h3&gt;

&lt;p&gt;Mivel több Mac-et is használok, ezért visszatérő a következő probléma. Az egyik gépen gyönyörűen testre szabom az editor beállításait, feltelepítem a szükséges csomagokat, majd azokat is beállítom a saját igényeimnek megfelelően. Valamivel később letelepszek a másik gép elé és akkor szembesülök vele, hogy egészen más beállításokkal fut az editor. Természetesen nincsenek meg a másik gépre installált csomagok és a beállítások is mutatnak eltéréseket. Hamar meguntam, hogy mindkét gépen el kelljen végeznem a telepítést és a beállítást, ezért az ST2 csomag könyvtárait átmozgattam Google Drive-ra és onnan symlinkeltem vissza azokat az eredeti helyükre:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;  mv ~/Library/Application Support/Sublime Text 2/Installed Packages &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  ~/Library/Application Support/Sublime Text 2/Packages &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  ~/Library/Application Support/Sublime Text 2/Pristine Packages &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  ~/Google Drive/AppData/Sublime Text 2/
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  ln -s ~/Google Drive/AppData/Sublime Text 2/Installed Packages &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  ~/Google Drive/AppData/Sublime Text 2/Packages &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  ~/Google Drive/AppData/Sublime Text 2/Pristine Packages &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  ~/Library/Application Support/Sublime Text 2/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;A &lt;em&gt;Settings&lt;/em&gt; mappát szándékosan nem mozgattam át, mert az olyan gépspecifikus beállításokat is tartalmazhat (például az előzményeket), amelyek gépek közötti mozgatása nem biztos, hogy előnyös. Mivel az editor beállításai a &lt;em&gt;Packages/User&lt;/em&gt; mappában találhatóak, így a &lt;em&gt;Packages&lt;/em&gt; mappa symlinkelésével nem csak a telepített csomagok szinkronizálódnak a gépek között, de a felhasználó beállításai is.&lt;/p&gt;

&lt;h3&gt;Soda Theme&lt;/h3&gt;

&lt;p&gt;A legnagyobb kritika amely bennem is megfogalmazódott a Sublime Text kapcsán, az a rendszeridegenség. Ez nyilvánvalóan a platformfüggetlenség hozadéka és sajnos több fronton is tetten érhető. Egyrészről felfedezhető a program működésében. Ilyen például a projekten belüli keresési eredmények megjelenítése vagy az állományok átnevezése. Ezek megvalósítása teljesen idegen az OS X-ben megszokott konvencióktól és tartós használat után sem megszokható. Együtt lehet ugyan élni a program ezen betegségeivel, de mindig zavaró marad.&lt;/p&gt;

&lt;p&gt;A program másik problémája a megjelenés. Több olyan apró kis részlete is van a felhasználói felületnek amely csúnyácska vagy hiányos. Ezeken szerencsére többé-kevésbé lehet segíteni. Elérhető a &lt;a href="https://github.com/buymeasoda/soda-theme"&gt;Soda&lt;/a&gt; névre keresztelt UI téma, amely javítja a Sublime Text megjelenésének legtöbb problémáját és kifejezetten szépre varázsolja annak megjelenését (bár retina kijelzőn &lt;a href="https://github.com/buymeasoda/soda-theme/wiki/Theme-challenges-and-ideas"&gt;adódnak még apró problémák&lt;/a&gt;). A Soda light téma telepítése óta sokkal barátságosabbnak érzem a program megjelenését és sokkal szívesebben ülök le elé dolgozni.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://vbali.com/images/blog/sublime_text_2_with_soda.png" alt="Sublime Text 2 Soda témával" /&gt;&lt;/p&gt;

&lt;h3&gt;Mappa ikonok megjelenítése&lt;/h3&gt;

&lt;p&gt;A megjelenésnek van egy másik problémája amelyen pillanatnyilag a Soda téma sem segít és csak egy csúnya hekkeléssel lehet azt orvosolni: a sidebar nem jelenít meg ikonokat az állományok és mappák mellett. &lt;strong&gt;Pillanatnyilag ezt tartom a Sublime Text 2 legnagyobb problémájának.&lt;/strong&gt; &lt;a href="http://sublimetext.userecho.com/topic/19274-theming-of-the-sidebar/#comment_110552"&gt;Találtam egy csúnya megoldást&lt;/a&gt;, melynek segítségével a könyvtárak neve mellé be lehet varázsolni a megfelelő mappa ikonokat. Tényleg nagyon csúnya a megoldás, de a mindennapi használathoz sajnos szükségét éreztem a könyvtárikonok megjelenítésének. Sajnos a megfelelő mime ikonok megjelenítése továbbra sem megoldott.&lt;/p&gt;

&lt;p&gt;Ezekben a dolgokban a TextMate fényévekkel előbbre jár, de nagyon bízok benne, hogy az ST2 következő frissítéseinek valamelyikében orvosolják majd az ikon problémát.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/D2omhAgkksE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/08/20/sublime-text-2-szodaval-elmegy/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[TextMate, egy korszak vége]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/URBZAODxXvM/" />
    <updated>2012-08-12T18:40:00+02:00</updated>
    <id>http://vbali.com/2012/08/12/textmate-egy-korszak-vege</id>
    <content type="html">&lt;p&gt;A hét egyik legmeglepőbb &lt;a href="http://blog.macromates.com/2012/textmate-2-at-github/"&gt;bejelentése&lt;/a&gt; volt, hogy nyílt forráskódú lett a &lt;a href="http://macromates.com"&gt;TextMate&lt;/a&gt;. A készítő, Allan Odgaard GPL 3 licensz alatt a teljes forráskódot elérhetővé tette &lt;a href="https://github.com/textmate/textmate"&gt;GitHub-on&lt;/a&gt;. Régi nagy rajongója voltam az editornak, amely egyike volt azon kevés programnak amelyeket folyamatosan használtam azóta, hogy áttértem Mac-re. Az idők során többször is megrendült a továbbfejlesztésbe vetett hitem. Többször &lt;a href="http://vbali.com/2010/08/24/egy-frissitest-varok-meg/"&gt;hangot is adtam&lt;/a&gt; eme elégedetlenségemnek. A TextMate egyfajta standard volt a maga súlycsoportjában és talán az okozta a legnagyobb problémát, hogy a maga nemében túl tökéletes volt és kevés perspektívát biztosított a továbbfejlesztéshez. Ezt a következtetést sikerült levonnom Allan korábbi és a friss bejelentés kapcsán megjelent nyilatkozataiból.&lt;/p&gt;

&lt;p&gt;Marco Arment tökéletesen &lt;a href="http://www.marco.org/2012/08/09/textmate-2-open-sourced"&gt;összefoglalta a TextMate lehetséges jövőjét&lt;/a&gt; illetve a pillanatnyi alternatív &lt;a href="http://www.marco.org/2012/08/10/next-text-editor"&gt;lehetőségeket&lt;/a&gt;, amelyből kiemelném a következő gondolatot:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I’ve now chosen my TextMate replacement, but before I reveal it, let me give a huge disclaimer: You will have your own opinion. It’s probably safer to talk about Jesus, gun control, Israel, global warming, parenting techniques, regional pizza styles, Linux distributions, why I don’t like cats, or my favorite PHP features.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Nagyjából hasonló lehetőségeket vizsgáltam meg amelyeken Marco is végigment. Korábban, aktív Linux felhasználóként a &lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt; volt az alapértelmezett szövegeditorom. Ez amolyan geek dolog és csak azok érthetik meg a Vim iránti szerelmemet akik megtapasztalták a benne rejlő lehetőségeket.&lt;/p&gt;

&lt;p&gt;Egyszer, még a legelső munkahelyemen beleütköztünk egy problémába ami abból adódott, hogy két rendszer között kellett adatokat cserélni. A lehetőségeink elég korlátozottak voltak, az egyik program képes volt fájl exportra, a másik program pedig fájl importra, de még véletlenül sem beszéltek azonos nyelvet. Az export állomány formátuma sajnos nem felelt meg annak a programnak amelybe szerettük volna beolvasni az állományt, így természetesen konverzióra volt szükség. Mint említettem, akkoriban a Vim volt az alapértelmezett editorom és abban nyitogattam meg a különböző állományokat és vizsgálgattam azok tartalmát és alakítgattam azokat, hogy sikeresen lemenjen a beolvasás. A végeredmény egy komplett Vim szkriptben öltött testet, amely az exportált állományt automatikusan átalakította és előkészítette a másik programban történő importálásra. Eseti jellegű problémáról volt szó, így nem merült fel annak a gondolata, hogy általános és felhasználóbarát megoldást dolgozzunk ki. Végül a tervekkel ellentétben éveken keresztül, havi rendszerességgel kellett ehhez a kis Vim szkripthez folyamodnunk segítségért és az évek alatt tökéletesen ellátta a rá bízott feladatot. Persze ez csak egy kiragadott példa amely magyarázatot ad a Vim iránti rajongásomra.&lt;/p&gt;

&lt;p&gt;OS X-en mindig is túlságosan rendszeridegennek éreztem a Vim-et így ott a kezdetektől fogva a TextMate-et használtam, kivéve a konzolt és a távoli szervereket, ahol a mai napig a Vim a default editorom. Természetesen az elmúlt években &amp;#8211; főleg mikor kilátástalannak tűnt a TextMate jövője &amp;#8211; voltak kísérleteim más népszerű és kevésbé népszerű szerkesztőkkel, név szerint: &lt;a href="http://code.google.com/p/macvim/"&gt;MacVim&lt;/a&gt;, &lt;a href="http://www.barebones.com/products/bbedit/"&gt;BBEdit&lt;/a&gt;, &lt;a href="http://www.sublimetext.com"&gt;Sublime Text&lt;/a&gt;, &lt;a href="http://www.barebones.com/products/TextWrangler/"&gt;TextWrangler&lt;/a&gt;. A Sublime Text 2 volt az amely időről-időre visszaköszönt, de mindig felszínre tört egy megmagyarázhatatlan érzés amely elriasztott a tartósabb használattól. Talán csak a váltástól való félelem okozta ezt az érzést, elvégre a TextMate az évek alatt kulcsfontosságú munkaszközömmé nőtte ki magát. Ennek ellenére az utóbbi hónapokban már a Sublime Text 2 is telepítve volt a gépemen és egyre gyakrabban használtam azt a TextMate 2 alfája mellett.&lt;/p&gt;

&lt;p&gt;Badarság lenne temetni a TextMate-et azért mert kereskedelmi szoftverből nyílt forráskódú projekté vállt, sőt akár valami komolyabb dolog is kisülhet belőle vagy valamelyik forkjából. Egy korszak lezárult a szoftver történetében és megjósolhatatlan, hogy a jövőben mi történik majd vele. A magam részéről úgy döntöttem, hogy a Sublime Text 2 szekerét tolom a továbbiakban. Pár hónappal ezelőtt megvásároltam a szoftvert és többé-kevésbé elégedett vagyok vele, illetve a fejlesztés ütemével. Alapértelmezett editorommá tettem azt pedig majd meglátjuk, hogy mit hoz a jövő.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/URBZAODxXvM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/08/12/textmate-egy-korszak-vege/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Konvenció konfiguráció helyett]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/BXWZjCBgy5k/" />
    <updated>2012-08-08T13:37:00+02:00</updated>
    <id>http://vbali.com/2012/08/08/konvencio-konfiguracio-helyett</id>
    <content type="html">&lt;p&gt;Évekkel ezelőtt történt&amp;#8230; Pár éves aktív PHP fejlesztést követően felmerült bennem az igény egy keretrendszer használatára, hogy az általános és ismétlődő megoldásokat ne kelljen újra és újra leprogramoznom vagy átemelnem a korábbi forrásaimból, hanem egy jól kidolgozott keretből kiindulva tudjak nekikezdeni egy új projekt megvalósításának. Olyan keretrendszert kerestem amely jól dokumentált, széles körben elterjedt és támogatott, valamint jól testreszabható.&lt;/p&gt;

&lt;h3&gt;Symphony vagy Zend?&lt;/h3&gt;

&lt;p&gt;Több lehetséges opció is kínálkozott, végül a &lt;a href="http://www.symfony-project.org"&gt;Symphony&lt;/a&gt; és a &lt;a href="http://framework.zend.com"&gt;Zend Framework&lt;/a&gt; akadt fenn a szűrőmön. Mindkettő jól dokumentált, széles körben elterjedt keretrendszer és átlépték már a nagykorúság határát, kinőtték gyermekbetegségeiket.&lt;/p&gt;

&lt;p&gt;Miután mindkét keretrendszert teszteltem és próbáltam magamévá tenni, szembesültem azzal a ténnyel, hogy két gyökeresen eltérő filozófiával állok szemben. Míg a Symphony kódgenerátorokat használ, megszabott könyvtárstruktúrával és állománynevekkel, addig a Zend Framework inkább egy komponensgyűjtemény, melyben minden egyes modul egy probléma absztrakt megvalósítása.&lt;/p&gt;

&lt;h3&gt;Zend Framework&lt;/h3&gt;

&lt;p&gt;A Zend filozófiáját magamhoz közelebb állónak éreztem. Tetszett az az elgondolás, hogy komponens szinten is tudom a keretrendszert használni. Nem szükséges a teljes framework-öt működésre bírni, ha csak egy adott komponensre van szükség, például PDF állományok generálására (&lt;a href="http://framework.zend.com/manual/en/zend.pdf.html"&gt;Zend_PDF&lt;/a&gt;) vagy adatbázis elérésére (&lt;a href="http://framework.zend.com/manual/en/zend.db.html"&gt;Zend_Db&lt;/a&gt;). A legjobban a &lt;a href="http://framework.zend.com/manual/en/zend.controller.html"&gt;Zend MVC architektúrája&lt;/a&gt; nyerte el a tetszésemet és rengeteg időt töltöttem el annak megismerésével. Lényegében véve azért lett nekem a Zend a befutó keretrendszer, mert &amp;#8211; szemben a többivel &amp;#8211; sokkal rugalmasabbnak találtam és szimpatikus volt, hogy az utolsó csavarig testreszabható, ezáltal megfelelő mértékű szabadságot ad.&lt;/p&gt;

&lt;p&gt;Miután kellőképp megismerkedtem és megbarátkoztam a Zend Frameworkkel, a megszerzett tudást elkezdtem alkalmazni a mindennapi munkám során. Folyamatban lévő projektjeim moduljait cseréltem le Zendes modulokra, új projekteket pedig &amp;#8211; ha a feladat lehetővé tette &amp;#8211; már eleve ebben kezdtem el fejleszteni. Ezzel egy jól dokumentált, tesztelt és folyamatosan karbantartott alapra építkeztem.&lt;/p&gt;

&lt;h3&gt;A Zend_DB problémája&lt;/h3&gt;

&lt;p&gt;Később kiderült, hogy a Zend által biztosított adatbázis-kezelő modul, nem képes maradéktalanul ellátni a feladatát. Indokolatlanul sok idő ment el az alkalmazások modelljeinek kiegészítésével és foltozgatásával, ami sokszor megakasztotta a fejlesztést, valamint a kód áttekinthetőségét is nagy mértékben rontotta. Ennek oka abban keresendő, hogy a Zend_DB a &lt;a href="http://martinfowler.com/eaaCatalog/tableDataGateway.html"&gt;Table Data Gateway&lt;/a&gt; tervezési mintára épül, amely egy egyszerű sémát biztosít az egyes táblák és az azokban lévő rekordok elérésére és módosítására tábla szinten. Sima &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt; műveletek esetén ez nem jelent problémát, sőt kifejezetten kényelmes a használata, azonban egy kicsit is összetettebb rendszerben hamar túl kell lépni a tábla szintű gondolkodáson.&lt;/p&gt;

&lt;p&gt;Abban a pillanatban, hogy domain objektumokról kezdünk el beszélni, a Zend_DB elveszti rugalmasságát és a modellek kódja egy nehezen emészthető masszává kezd összeállni, amelyhez a programozó csak remegő kézzel mer hozzányúlni. Ha pedig még egységtesztek sem készültek a modellek tesztelésére akkor ember legyen a talpán aki határidőre megbirkózik a feladattal.&lt;/p&gt;

&lt;h3&gt;Doctrine&lt;/h3&gt;

&lt;p&gt;Ekkor jött a felismerés, hogy a Zend_DB-t el kell felejteni és valami sokkal hatékonyabb és optimálisabb megoldást kell találni a probléma mielőbbi, fájdalommentes elhárítására. Ennek eredményeként kezdtem el használni a Doctrine 1.2-t, amit annak idején &lt;a href="http://vbali.com/2010/01/24/doctrine-es-zend-framework-integracio"&gt;le is jegyeztem&lt;/a&gt;. A Doctrine legnagyobb előnye az, hogy remekül megbirkózik a bonyolult domain objektumok kezelésével anélkül, hogy ránk programozókra plusz munkát róna. Köszönhető mindezt azoknak a &lt;a href="http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/technology.html#design-patterns-used"&gt;nagyszerű tervezési mintáknak&lt;/a&gt;, melyekre a Doctrine 1.2 építkezik, többek közt az &lt;a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html"&gt;Active Recordnak&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Egy webes keretrendszer két leggyakrabban használt és kihasznált komponense az MVC layer és az adatbázis-kezelő modul. Számomra a Zend ezzel az egyik alappillérét veszítette el, míg például a Symfony &amp;#8211; amely a másik potenciális keretrendszer választásom lett volna &amp;#8211; eleve a Doctrine ORM-re épült.&lt;/p&gt;

&lt;h3&gt;Konvenció konfiguráció helyett&lt;/h3&gt;

&lt;p&gt;Mindig is vonzottak a Rails nyújtotta lehetőségek, különösen az integrált automatizált tesztek nyújtotta biztonság valamint a prototípusok gyors elkészíthetősége, de távol tartott a rendszer &amp;#8220;kötöttsége&amp;#8221; melyre a &amp;#8221;&lt;a href="http://en.wikipedia.org/wiki/Convention_over_configuration"&gt;Convention over configuration&lt;/a&gt;&amp;#8221; tervezési minta is utal. A Rails &amp;#8211; szemben például a Zend Frameworkkel &amp;#8211; óriási hangsúlyt fektet a konvenciókra, ez pedig a keretrendszer minden porcikájában tetten érhető: a szigorúan meghatározott könyvtárszerkezettől kezdve a modellek nevében használt egyes- és többesszám használatán át, egészen a kapcsolt táblák elnevezésének pontos meghatározásáig. A Rails-szel történő fejlesztésnek tehát nem az alapul szolgáló Ruby programozási nyelv jelenti a nehézségét, hanem az előbb említett konvenciók megismerése.&lt;/p&gt;

&lt;p&gt;A szigorú konvenciókövetés talán egy kicsit megnöveli a tanulási időt, mégis számos jótékony hatása van, mely által a befektetett idő többszörösen megtérül. Az elkészített kód egységes szerkezetű lesz és nem keverednek benne az eltérő gondolkodásmódból fakadó kifejezések. A Rails fejlesztők közös nyelvet beszélnek, azonos szabályokat követnek, emiatt pontosan tudják, hogy egy-egy funkcióért pontosan hova kell nyúlni. A közös szabályok elősegítik a rendszer kiegészítőinek fejlesztését is. Az sem elhanyagolható, hogy a Ruby fejlesztők webes keretrendszerért legnagyobb eséllyel a Rails-hez nyúlnak, nincs akkora szegmentáció mint a PHP alapú keretrendszerek esetén. És végül, a legtöbb PHP-s keretrendszer közvetve vagy közvetlenül a Rails-ből merített ihletet.&lt;/p&gt;

&lt;h3&gt;Minden a meta metájának a metája&lt;/h3&gt;

&lt;blockquote&gt;&lt;p&gt;Fél éven át nem tudtam aludni. Az inszomniásnak látomás a világ. Távoli vízió. Minden a másolat másolatának a másolata.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Harcosok klubja&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Programozásra lefordítva a fenti idézetet: rég nem fejlesztünk már sima HTML-ben, dinamikus HTML van, PHTML, meg ERB. CSS-t nem szeretünk már közvetlenül előállítani, LESS van meg SCSS. A sima javascript is kezd kimenni a divatból, jQuery van, meg Prototype és lehet, hogy még ezeket is csak generáljuk, mondjuk CoffeeScript közbeiktatásával. Természetesen minden responsive. Minden a meta metájának a metája.&lt;/p&gt;

&lt;p&gt;Ebben a felgyorsult világban kiemelt jelentőséggel bír a hatékonyság és a sebesség. Nincs sem idő, sem energia arra, hogy saját függvénykönyvtárakat és azokból saját keretrendszereket építsünk. A legtöbb mai framework &amp;#8211; legyen az webes, mobil vagy desktop &amp;#8211; kész megoldásokat kínál. A programozónak ma már nem egy programozási nyelv megismerése jelenti a nehézséget, hanem az, hogy az egyes keretrendszereket, azok filozófiáját, sajátosságait, erősségeit és gyengeségeit megismerje és a mindennapi munka során hatékonyan tudja ezeket használni, valamint legyen egy jó referencia amelyből könnyen segítséghez lehet jutni.&lt;/p&gt;

&lt;p&gt;A fent említett technológiákban a Rails nagyon erős és fontos szerepet töltenek be a keretrendszer működésében, ezekkel is elősegítve a &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt; tervezési minta megvalósítását.&lt;/p&gt;

&lt;h3&gt;Kódolási stílus&lt;/h3&gt;

&lt;p&gt;Herótom van attól, hogy sok PHP fejlesztő semmilyen kódolási stílust sem követ, ahogy esik úgy puffan alapon adnak nevet változóknak, függvényeknek, osztályoknak, össze-vissza tördelik a sorokat, mindenféle koncepció nélkül, persze a behúzást is állandóan változtatják 1 és 8 karakter között (véletlenszerűen!) a tabot és a szóközöket is variálva, de a fogalom nélküliség legjobb példája a kontrollerekbe ágyazott &lt;code&gt;if (..): endif;&lt;/code&gt; kifejezések.  Rémálom az ilyen kódot olvasni és értelmezni. Véleményem szerint maga a PHP nyelv is ludas a téves, szabályok nélküli elnevezésekben, ehhez elegendő átfutni a &lt;a href="http://php.net/manual/en/ref.strings.php"&gt;PHP string függvények listáját&lt;/a&gt; szabályok után kutatva. A Zend Framework egyébként egy jól alkalmazható és könnyen elsajátítható &lt;a href="http://framework.zend.com/manual/en/coding-standard.coding-style.html"&gt;kódolási stílust javasol&lt;/a&gt;, de ez sem tudja teljes mértékben orvosolni a &lt;a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/"&gt;rossz tervezésből&lt;/a&gt; eredő problémákat.&lt;/p&gt;

&lt;p&gt;A Rails konvencióinak egy része magából a programozási nyelvből fakad, mivel a Ruby ugyanúgy &lt;a href="https://github.com/bbatsov/ruby-style-guide/"&gt;tesz javaslatot a stílusra vonatkozóan&lt;/a&gt; és ezeket következetesen be is tartják. A Rails-es konvenciók pedig megkerülhetetlenek, vagy legalábbis plusz munkával jár azok figyelmen kívül hagyása, tehát semmiképp sem éri meg elmenni mellettük.&lt;/p&gt;

&lt;h3&gt;Teszt alapú fejlesztés&lt;/h3&gt;

&lt;p&gt;Mindig is szerettem volna követni a teszt alapú fejlesztés (&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt;) szabályait, de a körülményes előkészítés mindig elvette a kedvem a megvalósítástól vagy a karbantartásától. Pedig nincs annál rémisztőbb, mint amikor olyan kódot kell módosítani melynek kihatása van a program működésének több területére is és nincsenek egységtesztek melyek ellenőriznék a program helyes működését a módosítások elvégzését követően. Ilyenkor rendre előfordul, hogy a javítás során megfeledkezünk egy-egy érintett kódrészről és csak az éles környezetben derülnek ki a nem várt mellékhatások. Sokszor időpocsékolásnak tűnik az egység-, a funkcionális- és az integrációs tesztek elkészítése, pedig kettős céljuk is van:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ellenőrzik a program helyes és elvárt működését,&lt;/li&gt;
&lt;li&gt;programozói &amp;#8220;dokumentációként&amp;#8221; szolgálnak és pontos képet adnak az olvasónak a program működéséről.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A Rails alkalmazásokhoz gyerekjáték teszteket gyártani és elgördít minden akadályt a fejlesztő útjából, csak a megvalósításra kell koncentrálni. Előkészíteni és alkalmazni a teszt adatokat (&lt;a href="http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures"&gt;fixtures&lt;/a&gt;) épp oly egyszerű, mint az adatbázis-struktúra elkészítése és módosítása (&lt;a href="http://guides.rubyonrails.org/migrations.html"&gt;migrations&lt;/a&gt;) vagy a parancssoros eszközök kezelése és kiegészítése saját funkciókkal (&lt;a href="http://guides.rubyonrails.org/command_line.html"&gt;rake és rails&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;Post-PHP&lt;/h3&gt;

&lt;p&gt;Több évnyi PHP fejlesztést követően igazi élmény a Ruby programozási nyelvvel és a Rails keretrendszerrel dolgozni. Ma még a PHP megkerülhetetlen a legtöbb webfejlesztő számára és vannak kétségbe vonhatatlan előnyei, mégis felüdülést jelent a Rails-hez hasonló megoldásokkal megismerkedni és dolgozni.&lt;/p&gt;

&lt;p&gt;Végül fontos megjegyeznem, hogy ebben a bejegyzésben csak a Doctrine 1.2-ről tettem említést, miközben már rég elérhető a 2.0-ás verzió. A 2.0-ás ágban teljesen megváltozott a Doctrine szemlélete és az &lt;a href="http://martinfowler.com/eaaCatalog/activeRecord.html"&gt;Active Record&lt;/a&gt; helyett a &lt;a href="http://martinfowler.com/eaaCatalog/dataMapper.html"&gt;Data Mapper&lt;/a&gt; tervezési mintára építették. Nem volt még alkalmam közelebbi ismeretséget kötnöm vele, mert nincs közvetlen migrálási folyamat a korábbi verziókról így az aktív projektjeimben továbbra is az 1.2-t használom.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/BXWZjCBgy5k" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/08/08/konvencio-konfiguracio-helyett/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[WWDC 2012]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/X-jetKNraRE/" />
    <updated>2012-06-10T15:35:00+02:00</updated>
    <id>http://vbali.com/2012/06/10/wwdc-2012</id>
    <content type="html">&lt;p&gt;Jövő héten kerül megrendezésre az Apple éves fejlesztői konferenciája a WWDC, a holnap esti keynote során pedig megtudhatjuk, hogy milyen hardveres- és szoftveres újdonságokkal rukkol elő a cég. Hónapok óta mennek a találgatások és pletykák mindenféle futurisztikus, várt és nem várt termékek megjelenésével kapcsolatban. Röviden megpróbálom összeszedni, hogy mit is várok az eseménytől.&lt;/p&gt;

&lt;p&gt;Számomra a legfontosabb termékbejelentés az új MacBook Pro termékcsalád lenne, SSD-vel, optikai meghajtó nélküli vékonyabb kiszerelésben, nagy felbontású retina kijelzővel. Ebben reménykedem a legjobban. Ha nem lesz retinás, SSD-vel szerelt MacBook, MacBook Pro vagy Air, akkor bármit is jelent be a cég &amp;#8211; legyen az akár rézfaszú bagollyal szerelt gigászi méretű iPhone 6, magyar gondolatfelismerős Sirivel vagy bármivel &amp;#8211; számomra csalódás lesz az esemény. Az, hogy mi lesz a termék neve és pontosan hová lesz pozicionálva, az nagy kérdőjel. Retina nélküli MacBook és retinás MacBook Pro? Vagy talán 13-as retinás MacBook és szintén retinás 15-ös MacBook Pro? Talán retina nélküli Air és retinás Pro? Még a Time Capsule is retinássá válik aminek nincs is kijelzője, de mostantól lesz (NEM)? Bármit el tudok képzelni és még nem is beszéltünk az asztali gépekről, az iMac és Mac Pro vonalról.&lt;/p&gt;

&lt;p&gt;Az iOS 6 és a Mountain Lion bejelentés (közvetve és közvetlenül) tulajdonképp már meg lett erősítve és ez egyébként is teljesen nyilvánvaló egy WWDC-n, ugyanakkor nagy kíváncsisággal várom, hogy milyen újdonságokkal rukkolnak elő az OS frissítésekkel. A mélyebb Facebook integrációs parasztvakításnál azért sokkal többet várok iOS fronton.&lt;/p&gt;

&lt;p&gt;Ha már iOS, akkor adódik a kérdés, hogy lesz-e iPhone 6? Véleményem szerint nem. Igaz, hogy a múltban volt már iPhone bejelentés WWDC-n, mégis azt gondolom, hogy az őszi időszakra tehető az új telefon bejelentése és megjelenése. Bár logikusnak tűnik, hogy ha meglépi az Apple a 16:9-es képarányt akkor fel kell készíteni a fejlesztőket az új eszköz érkezésére, azonban a múltban erre sosem volt példa. Az iPad megjelenése előtt sem lett beharangozva, hogy &amp;#8220;Gyerekek, hamarosan előrukkolunk egy táblával aminek ilyen paraméterei lesznek. Tessék elkezdeni a portolást az új eszközre, különben a kutya sem fogja vásárolni az új termékünket!&amp;#8221;. Ehelyett megoldották, hogy az iPhona-ra írt alkalmazások fussanak a táblán, majd idővel mindenki lefejlesztette a saját iPad-es verzióját. Emiatt azt a WWDC-s analógiát, miszerint azért jelentik be most az új iPhone-t, hogy a fejlesztőket az elkövetkező héten kioktassák a 16:9-re való portolás lehetőségeiről, nem tartom helytállónak. Egyébként sem fejleszői oldalról jelent &amp;#8220;problémát&amp;#8221; egy új képarány megjelenése, hanem UI dizájn vonalon. Egy szó mint száz, nem várok új iPhone bejelentést.&lt;/p&gt;

&lt;p&gt;Összegezve és listába szedve, amit várok:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MacBook termékcsalád frissítése processzorral, SSD-vel, retina kijelzővel, természetesen optika nélkül&lt;/li&gt;
&lt;li&gt;Asztali gépek frissítése, talán új iMac, Mac Pro vagy mindkettő&lt;/li&gt;
&lt;li&gt;Mountain Lion bejelentése pontos megjelenési dátummal a közeljövőben&lt;/li&gt;
&lt;li&gt;iOS 6 &lt;strong&gt;beta&lt;/strong&gt; bejelentése fejlesztőknek, őszi kiadási dátummal (természetesen az ősszel megjelenő iPhone-hoz időzítve).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Ha pedig WWDC akkor a kívánságlistámon szerepel a &lt;a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/Concepts/WhatAreBindings.html"&gt;Cocoa Bindings&lt;/a&gt; bejelentése iOS platformra.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/X-jetKNraRE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/06/10/wwdc-2012/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[QWERTY]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/oVhyTtqni4w/" />
    <updated>2012-06-04T10:28:00+02:00</updated>
    <id>http://vbali.com/2012/06/04/qwerty</id>
    <content type="html">&lt;p&gt;Egy ideje ismét angol kiosztású billentyűzetet használok. Annak idején ezen az elrendezésen tanultam meg gépelni és programozni, de valami érthetetlen oknál fogva váltottam magyarra, amit később mindig is bántam. Egy hétbe telt mire biztonsággal használtam újra az angol kiosztást, de erre a programozás miatt mindenképp szükségem volt, mert könnyebben érhetőek el azok a speciális karakterek melyekre fejlesztés során állandóan szükség van, így OPTION+SHIFT helyett elegendő a SHIFT-et használni, vagy még azt se. Az angolra váltással együtt a QWERTY elrendezést is megszoktam, mert &amp;#8211; a magyar QWERTZ-el ellentétben &amp;#8211; az angol eszközön az a default. Úgy vettem észre, hogy sokkal kevesebb az elütés mióta váltottam, és a QWERTZ kiosztással is úgy vagyok azóta mint sündisznó a drótkefével.&lt;/p&gt;

&lt;p&gt;Nagy bánatom, hogy az iPad-hez csatlakoztatott külső billentyűzetnek &amp;#8211; magyar kiosztás esetén &amp;#8211; nem állítható QWERTY layout, annak ellenére, hogy a szoftveres billentyűzet tudja ezt. Blogbejegyzések írásához gyakran szoktam az iPad-et használni, és bármennyire is kényelmes a szoftveres billentyű, a külső eszköz az, amivel megfelelő sebességgel és kényelemmel tudok gépelni. A számomra megfelelő kiosztás hiányában ez azonban rendszeres elütéseket eredményez és ha nem figyelem tudatosan, akkor az Y-t és Z-t állandóan felcserélem.&lt;/p&gt;

&lt;p&gt;Apró, pici hiányosság ez, számomra mégis szinte teljesen ellehetetleníti a külső billentyűzet használatát olyankor, amikor magyar ékezeteket is használok. Ezért az én iOS 6 kívánságlistámon többek közt ennek a &amp;#8220;hibának&amp;#8221; a javítása szerepel. Baromi jó lenne továbbá, ha a külső eszközzel is lehetne a futó appok között váltani CMD-TAB-bal. Bízva abban, hogy az Apple meghallgatja a kis emberek véleményét is, egy radar bejegyzésben jeleztem az igényt a hibabejelentő oldalon. Sok reményt nem fűzök a dologhoz, de úgy gondolom, hogy egy próbát mindenképp megér.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/oVhyTtqni4w" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/06/04/qwerty/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Terminál tabok elnevezése]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/2fwzw6RLYhI/" />
    <updated>2012-05-28T20:54:00+02:00</updated>
    <id>http://vbali.com/2012/05/28/terminal-tabok-elnevezese</id>
    <content type="html">&lt;p&gt;Egyedi neveket adhatunk az OS X Terminal ablakának és az egyes taboknak, az alábbiak beillesztésével a &lt;code&gt;~/.bash_profile&lt;/code&gt; állományba:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;function &lt;/span&gt;tabname &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;\e]1;$1\a&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;function &lt;/span&gt;winname &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;\e]2;$1\a&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Használata egyszerűen:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;winname &lt;span class="s2"&gt;&amp;quot;RoR&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;tabname &lt;span class="s2"&gt;&amp;quot;SERVER&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;RoR fejlesztés során például gyakran kell a terminált használni, így jól jön, ha a tabok egyedi névvel vannak ellátva.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;forrás: &lt;a href="http://thelucid.com/2012/01/04/naming-your-terminal-tabs-in-osx-lion/"&gt;&lt;strong&gt;The Lucid&lt;/strong&gt; - Naming your Terminal tabs in OSX Lion&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/2fwzw6RLYhI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/05/28/terminal-tabok-elnevezese/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Reggel]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/Po3JZJKHBaA/" />
    <updated>2012-05-27T11:08:00+02:00</updated>
    <id>http://vbali.com/2012/05/27/reggel</id>
    <content type="html">&lt;p&gt;&amp;#8230; fél ötkor kipattant a szemem. Odakint már világosodott. Éreztem, hogy az alvást nincs értelme erőltetnem, már nem fogok visszaaludni. Kiosontam a hálószobából. A feleségem és a kislányom még javában aludtak. Készítettem magamnak reggelit majd egy forró kávét és behúzódtam a dolgozószobába.&lt;/p&gt;

&lt;p&gt;Éjszakai bagoly vagyok, nem is emlékszem mikor láttam utoljára napfelkeltét. Nyugodt minden, csend van és előttem áll még az egész nap. Nem érzem,  hogy az elmaradt dolgaim után kellene rohannom. Épp ellenkezőleg. Nyugalommal tölt el, hogy egy egész nap áll még előttem, tele lehetőségekkel.&lt;/p&gt;

&lt;p&gt;Ez mindig eredményesebbé tesz. Gyakrabban kellene élnem a lehetőséggel.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/Po3JZJKHBaA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/05/27/reggel/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby függvények és paraméterek]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/jIS7sz4iZAI/" />
    <updated>2012-05-25T15:09:00+02:00</updated>
    <id>http://vbali.com/2012/05/25/ruby-fuggvenyek-es-parameterek</id>
    <content type="html">&lt;p&gt;az alcím az is lehetne, hogy egy kezdő Rubyist, hogyan döbben rá a nyelv furcsaságaira.&lt;/p&gt;

&lt;h3&gt;Objective-C finomságok&lt;/h3&gt;

&lt;p&gt;Amikor pár évvel ezelőtt elkezdtem ismerkedni az &lt;a href="http://hu.wikipedia.org/wiki/Objective-C"&gt;Objective-C&lt;/a&gt; programozási nyelvvel, akkor az egyik első furcsaság amivel szembe találtam magam, a metódusok hívásának módja volt. Az általam korábban használt programozási nyelvek &lt;code&gt;objektum.metódus(param1, param2)&lt;/code&gt; szintaxisával szemben, az Objective-C a szögletes zárójeles  (&lt;em&gt;square bracket notation&lt;/em&gt;) jelölést használja, melyet &lt;strong&gt;&lt;a href="http://developer.apple.com/library/ios/documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-SW5"&gt;Object Messaging&lt;/a&gt;&lt;/strong&gt;-nek hívnak. Valahogy így:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='objective-c'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;myRectangle&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;más nyelvekben ez általában így néz ki:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;myRectangle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;A metódusoknak &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Named_parameter"&gt;named parameter&lt;/a&gt;&lt;/strong&gt;-en (nevesített paraméter???) keresztül lehet átadni információkat, valahogy így:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='objective-c'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;myRectangle&lt;/span&gt; &lt;span class="nl"&gt;setOriginX:&lt;/span&gt;&lt;span class="mf"&gt;30.0&lt;/span&gt; &lt;span class="nl"&gt;y:&lt;/span&gt;&lt;span class="mf"&gt;50.0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;ezt általában így szoktuk meg:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;myRectangle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOrigin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;30.0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;50.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Nagyon hamar meg lehet szokni ezt a formát. Igaz, hogy sokkal több billentyűleütéssel jár a használata &amp;#8211; melyet az Xcode ügyesen kompenzál az intelligens kódkiegészítéssel &amp;#8211; cserébe viszont sokkal olvashatóbbá válik a forráskód, hiszen egy egyszerű metódushívásra tekintve azonnal látszik, hogy az egyes paraméterek mire vonatkoznak. Ez akkor válik különösen hasznossá, amikor 4 vagy annál több paraméter kerül egyidejűleg átadásra. Például:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Paraméter átadás Java-ban:&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addNewControl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;Ugyanez Objective-C-vel:&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='objective-c'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="nl"&gt;addNewControlWithTitle:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Title&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                     &lt;span class="nl"&gt;xPosition:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                     &lt;span class="nl"&gt;yPosition:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                         &lt;span class="nl"&gt;width:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="nl"&gt;height:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="nl"&gt;drawingNow:&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;A kezdeti furcsasága ellenére könnyen meg lehet szeretni ezt a formát és az Apple által javasolt konvenciók követésével igazán hatékonyan lehet így programozni, miközben a kód folyamatosan olvasható, szinte önleíró marad.&lt;/p&gt;

&lt;h3&gt;Metódus hívás Ruby-val&lt;/h3&gt;

&lt;p&gt;A Ruby programozási nyelv szintaxisa számomra nagyon megengedő. A metódus hívására a hagyományos &lt;code&gt;objektum.metódus()&lt;/code&gt; formát használja, azonban a zárójelezés teljesen elhagyható, még akkor is ha paraméterátadás történik:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;my_rectangle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;my_rectangle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;    &lt;span class="c1"&gt;# my_rectangle.origin(30.0, 50.0)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Nagyon gyorsan lehet vele programozni, de a kód olvasása &amp;#8211; különösen egy összetett kontextusban &amp;#8211; elég nehézkessé tud válni. A &lt;a href="https://github.com/bbatsov/ruby-style-guide"&gt;Ruby Style Guide&lt;/a&gt; ezt javasolja:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Omit parentheses around parameters for methods that are part of an internal DSL (e.g. Rake, Rails, RSpec), methods that are with &amp;#8220;keyword&amp;#8221; status in Ruby (e.g. attr_reader, puts) and attribute access methods. Use parentheses around the arguments of all other method invocations.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;strong&gt;The Ruby Style Guide&lt;/strong&gt; &lt;a href="https://github.com/bbatsov/ruby-style-guide#syntax"&gt;Syntax&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;A kezdő Rails programozó rendszeresen szembe találja magát olyan kódrészekkel, melyek olvasása, értelmezése és magáévá tétele igencsak megnehezíti a dolgát:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allow_blank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;EMAIL_REGEX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;should be a valid e-mail address&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Mivel ez a Rails DSL része itt elő van írva a zárójelek elhagyása, valamint életbe lép egy másik szabály is, miszerint ha a paraméterátadás során az utolsó paraméter &lt;code&gt;Hash&lt;/code&gt; akkor a kapcsos zárójelek elhagyhatóak. A fenti kód így nézne ki zárójelekkel:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;A formázást szándékosan tördeltem szét ilyen aprólékosan, az átláthatóság érdekében&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;validates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;allow_blank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;EMAIL_REGEX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;should be a valid e-mail address&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Mikor már rááll az ember szeme, akkor az első forma könnyen olvashatóvá válik és valóban sokkal tömörebb mint a második esetben. Olyan ez mint az autóvezetés. A kellő rutin birtokában már nem kell gondolkodni azon, hogy mikor kell sebességet válltani.&lt;/p&gt;

&lt;h3&gt;Konkrét eset&lt;/h3&gt;

&lt;p&gt;Az előző példa egy konkrét esetemet reprezentálja. Nem értettem, hogy az &lt;code&gt;allow_blank: true&lt;/code&gt; miért nem inkább a :format hash-ben került átadásra, így:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;allow_blank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;EMAIL_REGEX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;should be a valid e-mail address&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;A &lt;code&gt;validates&lt;/code&gt; metódus definíciója nem sokat segített, mert az így néz ki:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;validates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Írtam pár egységtesztet és kiderült, hogy mindkét forma tökéletesen működik és ugyanazt az eredményt hozza. Ez végképp összezavart, ezért elkezdtem mazsolázni a Rails forráskódját, hogy kiderítsem mi történik a háttérben. Baromi nehéz volt értelmezni, hogy mikor mi történik a rengeteg &lt;a href="http://www.jacopretorius.net/2012/01/splat-operator-in-ruby.html"&gt;splat operátor&lt;/a&gt; mögé rejtett paraméterátadás során. Végül kiderült, hogy a külön írt &lt;code&gt;:allow_blank&lt;/code&gt;-nek akkor van jelentősége, ha egyidejűleg több validáló paramétert kap a &lt;code&gt;validates&lt;/code&gt; metódus. Ebben a formában bármelyik esetben lehet &lt;code&gt;blank?&lt;/code&gt; az &lt;code&gt;:email&lt;/code&gt; értéke:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allow_blank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;confirmation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;EMAIL_REGEX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;should be a valid e-mail address&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Míg ennél a formánál csak a &lt;code&gt;validates_format_of&lt;/code&gt; metódus hívása során:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;confirmation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;allow_blank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;EMAIL_REGEX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;should be a valid e-mail address&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;A &lt;code&gt;validates_confirmation_of&lt;/code&gt; nem engedi meg, hogy &lt;code&gt;blank?&lt;/code&gt; legyen az &lt;code&gt;:email&lt;/code&gt; értéke. A példa nem életszerű, de jól reprezentálja a problémámat. Végül kiderült, hogy a Rails API doksijában ez egyértelműen le is van írva:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Finally, the options :if, :unless, :on, :allow_blank, :allow_nil and :strict can be given to one specific validator, as a hash … or to all at the same time&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;strong&gt;Ruby on Rails v3.2.3&lt;/strong&gt; &lt;a href="http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates"&gt;ActiveModel::Validations::ClassMethods&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;Konklúzió&lt;/h3&gt;

&lt;p&gt;Ha úgy vesszük, akkor tulajdonképp a Ruby a &lt;code&gt;Hash&lt;/code&gt;-t használja név szerinti paraméterátadásnak. Objective-C-ben a függvény definíciója egyértelműen meghatározza az egyes paraméterek típusát és funkcióját, a Ruby függvények definíciója ellenben nem reprezentál ilyen pontos funkcióleírást, így a fejlesztő csak az API dokumentációjára, rosszabb esetben csak a forráskódra számíthat. Ez magyarázatot ad arra is, hogy miért nem létezik igazán jól működő kódkiegészítés a Ruby függvényekhez.&lt;/p&gt;

&lt;p&gt;A fenti &lt;code&gt;validates(*attributes)&lt;/code&gt; metódus elemzése során többször is eszembe jutott, hogy mindez Objective-C-ben mennyivel könnyebben értelmezhető lenne. Ugyanakkor nyilvánvalóan kevésbé lenne rugalmas és szabadon formázható, szemben a Rails keretrendszerrel és a Ruby nyelvvel. Egyik sem jobb a másiknál, egyszerűen csak más.&lt;/p&gt;

&lt;p&gt;Két teljesen eltérő megközelítés, az egyik forma az olvashatóságot, a másik a rugalmasságot és tömörséget részesíti előnyben.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/jIS7sz4iZAI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/05/25/ruby-fuggvenyek-es-parameterek/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Coda 2]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/PP66quaItAI/" />
    <updated>2012-05-24T17:32:00+02:00</updated>
    <id>http://vbali.com/2012/05/24/coda-2</id>
    <content type="html">&lt;p&gt;A mai napon jelent meg a &lt;a href="http://www.panic.com/coda/"&gt;Coda 2&lt;/a&gt; webszerkesztő alkalmazás a Panic gondozásában, melyet már sokan vártak. Óriási volt a hype amely a megjelenését megelőzte, ami nem is csoda, hiszen egy markáns frissítésen esett át a szoftver.&lt;/p&gt;

&lt;p&gt;Soha nem használtam a Coda korábbi verzióit, de az promóciós videó igencsak felkeltette az érdeklődésem. A Coda 2 egy gyönyörűen megrajzolt és teljesen integrált webfejlesztői program lett, amely beépítve tartalmaz HTML-, CSS- és kódszerkesztőt, fájlböngészőt, MySQL szerkesztőt és terminált. A Coda 2-vel egy időben megjelent a kicsit butított iPad verzió is &lt;a href="http://www.panic.com/dietcoda/"&gt;Diet Coda&lt;/a&gt; néven, hasonló tulajdonságokkal mint az asztali verzió, felvértezve az AirPreview-nak nevezett cukisággal, amely real-time jeleníti meg az asztali verzióban szerkesztett tartalom kimenetét, kvázi előnézetet ad.&lt;/p&gt;

&lt;p&gt;Pillanatnyilag csak egy normális editort ismerek iPad-re, a &lt;a href="http://www.textasticapp.com/"&gt;Textastic&lt;/a&gt;-ot. Fantasztikus szoftver és mindent tud amire egy webfejlesztőnek szüksége lehet, ha épp csak egy iPad áll a rendelkezésére. A VCS támogatást hiányolom belőle, de a fejlesztő &lt;a href="https://twitter.com/textastic/status/194740796610715648"&gt;Twitteren már jelezte&lt;/a&gt;, hogy dolgozik a Git integrálásán (&lt;em&gt;Hurrá!&lt;/em&gt;), illetve kicsit kényelmetlen, hogy az állományokat le-fel kell töltögetni a módosítások során.&lt;/p&gt;

&lt;p&gt;A lényeg, hogy a megjelenés napján letöltöttem a Coda 2 próbaverzióját, illetve megvásároltam a Diet Coda-t az App Store-ból. Sajnos csalódás volt számomra. Ezzel &lt;strong&gt;senkit sem akarok megbántani&lt;/strong&gt;, de véleményem szerint az egésznek nagyobb a füstje mint a lángja. Nincs semmi átütő vagy forradalmi a szoftverben a megjelenésén kívül, amit meg kell hagyni szemet gyönyörködtető.&lt;/p&gt;

&lt;p&gt;Az iPad verzió ugyan mutat néhány hiányosságot, amely - egy magamfajta fejlesztő számára - nehezen megbocsátható:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;nem lehet színsémát betölteni (hardcore fejlesztőként az életem felét ezekben az editorokban töltöm, hagy döntsem már el én, hogy mi nekem a jó, egyébként is &lt;a href="http://ethanschoonover.com/solarized"&gt;Solarized&lt;/a&gt; addict vagyok)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nem lehet fontot választani, a beépített pedig problémázik a magyar ékezetekkel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a terminál nem hajlandó elfelejteni a legutóbb megnyitott session paramétereit, így ha több projektem is van különböző szervereken, akkor simán az elsőnek megnyitott SSH sessiont mutatja, hiába zárom be a projektet és nyitok egy újat. Nem kis problémát tud ez okozni éles környezetben, mondjuk egy rossz szerveren kiadott &lt;code&gt;rm -r *&lt;/code&gt; parancs futtatásával.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Nem, nem azt mondom, hogy a Coda 2 és a Diet Coda rossz szoftverek lennének!&lt;/strong&gt; Egy jól integrált, nagyon látványos és igényes webfejlesztő szoftver, amely mutat ugyan hiányosságokat, de ezeket nyilván javítani fogják a jövőben. A problémám az, hogy semmi olyan újdonságot vagy innovációt nem mutat amely indokoltá tenné a hatalmas hype-ot. A szoftver minden komponense, többé-kevésbé különálló alkalmazásokként megtalálható minden webfejlesztő eszközarzenáljában. Jobbnál jobb kódszerkesztők, forráskódkezelők, MySQL kliensek és terminál alkalmazások vannak, melyet minden fejlesztő használt eddig is és messzemenően többet tudnak. Bárhogy is csűrjük-csavarjuk, a Coda erőssége a marketingben és a dizájnban rejlik, ami természetesen nekem is sokat számít (a dizájn része), de fejlesztőként ennél nekem sokkal többre van szükségem.&lt;/p&gt;

&lt;p&gt;Időről időre meggyűlik a bajom a &lt;a href="http://macromates.com"&gt;TextMate&lt;/a&gt;-tel, mégis lenyűgöz, hogy már évekkel ezelőtt mennyivel többet tudott mint más hasonló editorok bármely platformon. A TextMate 2 alfája is mutat problémákat, annak ellenére, hogy több éves késéssel jelent csak meg. Mégis valahányszor eldöntöm, hogy elpártolok tőle, rövid időn belül visszahúz a szívem és a kezembe rögzült shortcut-ok. Íme egy kis TextMate pornó, Ruby on Rails refactoring:&lt;/p&gt;

&lt;p&gt;&lt;video width='600' height='352' preload='none' controls poster=' /images/blog/textmate2.png'&gt;&lt;source src='http://vbali.com/video/textmate.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'/&gt;&lt;/video&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/PP66quaItAI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/05/24/coda-2/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Rails telepítés 4 lépésben]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/Zn6VM9X6XmI/" />
    <updated>2012-05-14T12:59:00+02:00</updated>
    <id>http://vbali.com/2012/05/14/rails-telepites-4-lepesben</id>
    <content type="html">&lt;p&gt;Az OS X előtelepítve tartalmazza a Ruby-t, de sajnos csak egy régebbi 1.8-as verziót. Az újabb 3.2.0 verziószámú Rails keretrendszerhez már az 1.9.3-as Ruby-t javasolják a fejlesztők. A következő 4 parancs segítségével telepíthető a legfrissebb Ruby on Rails ha az Xcode 4.2 (vagy frissebb) van telepítve a rendszeren:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;curl -L get.rvm.io | bash -s stable
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.rvm/scripts/rvm
&lt;/span&gt;&lt;span class='line'&gt;rvm install 1.9.3 --with-openssl-dir&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$rvm_path&lt;/span&gt;/usr --with-gcc&lt;span class="o"&gt;=&lt;/span&gt;clang
&lt;/span&gt;&lt;span class='line'&gt;gem install rails
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;strong&gt;&lt;em&gt;Update&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sajnos a fenti módszerrel segfaultol a Rails az openssl és iconv miatt, ezért ezeket is telepíteni kell. A lépések száma ezzel 6-ra emelkedik:&lt;/em&gt;&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;curl -L get.rvm.io | bash -s stable
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.rvm/scripts/rvm
&lt;/span&gt;&lt;span class='line'&gt;rvm pkg install iconv
&lt;/span&gt;&lt;span class='line'&gt;rvm pkg install openssl
&lt;/span&gt;&lt;span class='line'&gt;rvm install 1.9.3 --with-openssl-dir&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$rvm_path&lt;/span&gt;/usr --with-iconv-dir&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$rvm_path&lt;/span&gt;/usr --with-gcc&lt;span class="o"&gt;=&lt;/span&gt;clang
&lt;/span&gt;&lt;span class='line'&gt;gem install rails
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/Zn6VM9X6XmI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/05/14/rails-telepites-4-lepesben/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Kindle Touch]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/1zWoP0jUUKY/" />
    <updated>2012-04-23T16:29:00+02:00</updated>
    <id>http://vbali.com/2012/04/23/kindle-touch</id>
    <content type="html">&lt;p&gt;Nemrég érkezett meg az Amazontól a könyvolvasóm, egy Kindle Touch. Valamivel több mint egy hetes használat után itt az ideje, hogy összefoglaljam eddigi tapasztalataimat a termékről.&lt;/p&gt;

&lt;h3&gt;Miért van szükségem könyvolvasóra?&lt;/h3&gt;

&lt;p&gt;Pár éve iPadet használok, amin egy tucat könyvet elolvastam már. Ezt megelőzően, gyakran olvastam számítógépen is, de a papír alapú könyveket részesítettem előnyben. Mikor megtapasztaltam, hogy milyen kényelmes az elektronikus eszközön az olvasás, hamar rákaptam az ízére és ez teljesen átformálta az olvasási szokásaimat.&lt;/p&gt;

&lt;p&gt;Soha nem éreztem fárasztónak az olvasást iPaden. Sokan hozzák fel ellenérvként, hogy a megvilágított kijelző mennyire fárasztó a szemnek. Nekem ellenben ez pont pozitívum volt, sötétben sem okozott problémát az olvasás. Egészen mással gyűlt meg a bajom, a fókuszálással. Nem fizikai, hanem mentális értelemben.&lt;/p&gt;

&lt;p&gt;Ha leülök olvasni egy könyvet, annak ellenére, hogy maximálisan leköt az olvasmány, a gondolataim cikáznak. Eszembe jutnak dolgok, melyeknek hirtelen utána szeretnék nézni, vagy csak simán fel kell jegyeznem valamit ami bevillant és félek, hogy később elfelejtem. Ilyenkor pillanatok alatt a böngészőben találom magam, onnan pedig már kiszámíthatatlan, hogy mikor szabadulok. Az eredetileg tervezett olvasásnak itt vége szakad és azon veszem észre magam, hogy weboldalakat nézegetek, programkódot olvasok vagy épp e-mail írok és fogalmam sincs, hogy hogyan keveredtem ide.&lt;/p&gt;

&lt;p&gt;Leggyakrabban munkával kapcsolatos dolgok viszik el a fókuszt, de mióta a Kindle-t használom olvasásra, azóta kevésbé szembesülök ezzel a problémával. Ez annak köszönhető, hogy a Kindle nem alkalmas böngészésre, vagy levelezésre, annak ellenére, hogy található benne egy kísérleti jellegű böngésző. Egyszerűen nem érzek kísértést, hogy taszkot váltsak. Amikor könyvolvasóval a kezemben jön a késztetés, hogy de jó lenne most gyorsan ránézni valamire a neten - de nincs a közelemben az iPad - akkor visszatérek az olvasáshoz. A másik dolog várhat, ha pedig elfelejteném, akkor nem is volt olyan fontos.&lt;/p&gt;

&lt;h3&gt;Rendelés és szállítás&lt;/h3&gt;

&lt;p&gt;Pillanatnyilag csak az amerikai Amazontól rendelhető az általam kiszemelt Kindle Touch, 135 dolláros áron. Erre még jött mindenféle szállítási és vámkezelési díj, ami kb. 50 dollár körül mozgott. Kedden rendeltem meg a Kindle-t az Amazon oldaláról, ahol fel volt tüntetve, hogy előre láthatóan következő hét hétfőn érkezik majd meg. Teljesen korrekt szállítási határidő a tengeren túlról. Szerdán kaptam egy értesítést, hogy sajnos szállítási problémák miatt nem sikerült útnak indítani a csomagot, így a várható szállítási határidő hétfő helyett keddre módosulna. Minden további nélkül elállhatok a rendeléstől, ha az új határidő nem felelne meg. Már miért ne felelt volna?&lt;/p&gt;

&lt;p&gt;Szerdán el is indult a csomag az USA-ból melyet az Amazon rendelések között, online lehetett követni és minden egyes mozgást percre pontosan rögzítettek. Csütörtökön már feltűnt Németország a listában. Gondoltam, hogy innen pillanatok alatt megérkezik Magyarországra, majd jön a vámkezelés, miegymás és keddre valóban kézhez vehetem a terméket. Még azon a héten pénteken csörgött a telefonom és a DHL futár hívott, hogy csomagot hozna, mikor jöhet. Kedden adtam le a rendelést, pénteken délben már a kezemben volt az új Kindle Touch. El sem akartam hinni.&lt;/p&gt;

&lt;h3&gt;A Kindle Touch&lt;/h3&gt;

&lt;p&gt;Korábban nem láttam még E Ink kijelzőt, így nagyon kíváncsi voltam rá, hogy milyen lesz. A Kindle Touch első ránézésre kisebb, mint amilyenre számítottam, annak ellenére, hogy korábban pontosan utánanéztem, hogy milyen dimenziókkal rendelkezik az eszköz. Az iPad után nagyon picinek tűnt, de egy pár perc használat után ez az érzés teljesen elillant. Az E Ink kijelző bámulatos és valóban a papír alapú könyvek hangulatát idézi. Pont megfelelő méretű az eszköz pedig nagyon könnyű. Most tapasztaltam meg igazán, hogy az iPad kézben tartása egy hosszabb olvasmány során mennyire fárasztó, ha összevetem a Kindle Touch élménnyel. Ugyanez mondható el a háttérvilágítás, E Ink összevetéséről is. Tényleg sokkal kényelmesebb és natívabb élmény az e-könyv olvasó használata.&lt;/p&gt;

&lt;p&gt;Azon vettem észre magam, hogy esténként szívesebben ülök le olvasni mint tettem azt korábban, bár ebben nyilván benne van az új eszköz iránti rajongás is. Az akku kapacitásáról még nem sokat tudok nyilatkozni. Tíz nappal ezelőtt töltöttem, amikor kézhez kaptam, azóta kb. 30%-ot merült. Ez a 30% szerintem nevezhető extrém igénybevételnek is, mert az első napokban indokolatlanul sokat nyomkodtam. A mindennapi, üzemszerű használat mellett szerintem nem lesz ekkora a fogyasztás.&lt;/p&gt;

&lt;h3&gt;Negatívum&lt;/h3&gt;

&lt;p&gt;Két negatívummal sikerült szembesülnöm a használat során. Nem olyan rettenetes probléma, de elég zavaró, hogy csak az eszközön lehet gyűjteményekbe szervezni a könyveket, mégpedig egyesével. A használatba vétel során találomra rátöltöttem úgy 30-40 könyvet, majd elkezdtem azokat a megfelelő gyűjteményekbe rendezni, hogy ne egy 4-5 oldalas listát kelljen lapozgatni (ami az E Ink kijelzővel nem túl gyors). Ezt azért nem tartom olyan nagy problémának, mert normális esetben úgysem töltögetek ilyen mennyiségű olvasnivalót az eszközre, csak a használatbavétel során.&lt;/p&gt;

&lt;p&gt;Ennél sokkal zavaróbb a következő: a Kindle Touch ki/be kapcsoló gombja a kijelző alatt, az eszköz alján található, a lehető legrosszabb helyen. Az elmúlt napokban már többször is előfordult, hogy olvasás közben véletlenül megnyomtam az egyik ujjammal amivel alulról támasztom ki a Kindle-t, de olyan is volt, hogy olvasás közben áthelyeztem a combomra és ezzel a mozdulattal sikerült is kikapcsolnom. Érthetetlen, hogy miért pont ide tervezték ezt a gombot, egyáltalán nem logikus és még zavaró is.&lt;/p&gt;

&lt;h3&gt;Readability&lt;/h3&gt;

&lt;p&gt;A &lt;a href="http://www.readability.com"&gt;Readability&lt;/a&gt;-t használom ha belebotlok valamibe amit később el szeretnék olvasni, de épp nincs időm vagy kedvem, hogy nekiessek. Általában hosszabb blogbejegyzések vagy cikkek kerülnek ebbe a listába és épp a terjedelem nem teszi lehetővé, hogy rögtön elolvassam azokat. A Readability-nek van egy remek szolgáltatása Kindle tulajdonosoknak: a későbbi olvasásra megjelölt írásokat azonnal vagy napi rendszerességgel, magazinos formában át tudja küldeni a könyvolvasóra, ahol az alkalmas időpontban, kényelmesen hátradőlve lehet lapozgatni az olvasnivalót.&lt;/p&gt;

&lt;p&gt;Korábban gyakran 15-20 bejegyzés is szerepelt a listámon, amit el szerettem volna olvasni. Mióta a Kindle-t használom ez a lista 0 és 5 közé redukálódott. Két-három naponta, esténként átfutom, hogy mit gyűjtöttem össze az elmúlt napokban és mindent elolvasok.&lt;/p&gt;

&lt;h3&gt;Magyar könyvek hiánya&lt;/h3&gt;

&lt;p&gt;Az angol nyelvű könyvekből bőséges a kínálat mind az Amazon, mind az iBooks áruházában. A magyar nyelvű irodalomról ez sajnos egyáltalán nem mondható el. Egyszerűen nem tudom felfogni, hogy a magyar kiadók miért nem képesek előállni egy 21. századi megoldással. Örömmel költeném a pénzem magyar nyelvű e-könyvekre. Őszintén bízok benne, hogy meg fog változni a kiadók gondolkodásmódja a témában és nem az lesz amit a zenével csináltak.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/1zWoP0jUUKY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/04/23/kindle-touch/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[iCacti klón]]></title>
    <link href="http://feedproxy.google.com/~r/vbali/~3/9WoZCFLCnws/" />
    <updated>2012-04-20T17:02:00+02:00</updated>
    <id>http://vbali.com/2012/04/20/icacti-klon</id>
    <content type="html">&lt;p&gt;Az imént futottam bele egy &lt;a href="http://itunes.apple.com/app/cacti-status/id518585901"&gt;frissen megjelent&lt;/a&gt; alkalmazásba az App Store-ban, amely szerverek monitorozására alkalmas. Mivel magam is jelen vagyok az áruházban &lt;a href="http://itunes.apple.com/app/icacti-server-monitor/id348529501"&gt;hasonló alkalmazással&lt;/a&gt; így gondoltam vetek rá egy pillantást, hogy lássam mivel rukkolt elő a konkurencia. A legnagyobb meglepetésemre ismerős kép fogadott és hirtelen azt gondoltam, hogy talán a saját alkalmazásom adatlapjára tévedtem :) Természetesen nem ez történt, az iCacti klónjába sikerült belefutnom.&lt;/p&gt;

&lt;p&gt;Az, hogy a klón hasonló funkcionalitást kínál nem meglepő, hiszen az adatokat és a grafikonokat a &lt;a href="http://cacti.net/"&gt;Cacti&lt;/a&gt; szolgáltatja. Az viszont már sokkal meglepőbb, hogy milyen hasonlóságok fedezhetőek fel a megjelenésben. Ezért is nevezem klónnak, mert egyértelműen látszik, hogy az iCacti inspirálta a fejlesztőt a felület elkészítésekkor. Annak megítélését, hogy ez jól sikerült-e, már a vásárlókra bízom.&lt;/p&gt;

&lt;p&gt;Három éve fejlesztem az alkalmazást. Az első verzió még csak iPhone-ra volt elérhető, az iPad-et akkor még be sem mutatták, majd folyamatosan bővült a támogatott Cacti verziók és funkciók köre, csakúgy mint a támogatott eszközöké: jött az iPad, a retina iPhone, majd nemrég a retina iPad is. Közben az alkalmazás magja teljesen újra lett írva és egy komolyabb ráncfelvarráson is átesett.&lt;/p&gt;

&lt;p&gt;Az igazat megvallva vegyes érzések fogtak el amikor szembesültem a ténnyel, hogy próbálják másolni az alkalmazást. Az egyik oldalról bosszantó, hogy jön valaki és gátlástalanul felhasználja más munkáját, a másik oldalról ezt egyfajta groteszk elismerésnek tekintem.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/vbali/~4/9WoZCFLCnws" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://vbali.com/2012/04/20/icacti-klon/</feedburner:origLink></entry>
  
</feed>
