Hron blogja

  • Qt fordítás kezdőknek

    Gabor Garami 2012. April 20.
    0 komment

    Naszóval, ez a cikk itten arról fog szólni, hogy hogyan fordítsunk magunknak forrásból Qt-t úgy, hogy az ne piszkítsa össze a rendszerünket.

    Hogy ez miért is jó?

    • A rendszerünk régi Qt-t szállít, mi pedig egy újhoz szeretnénk fejleszteni
    • A Qt nyelvi fájlokba akarunk beletúrni

    Az első lépés a megfelelő git repo leklónozása. Ez általában a git://gitorious.org/qt/qt.git, de használhatunk más klónokat is:

    hron@laptop workspace $ git clone git://gitorious.org/qt/qt.git && cd qt
    hron@laptop qt (master) $

    Egy pár szót a promptról: az első két szekció mindenkinek ismert kell hogy legyen, ugye felhasználónév@gépnév illetve az aktuális mappa neve. A zárójeles rész trükkösebb, ide az aktuális git branch neve kerül, hogy egyértelmű legyen, hol dolgozunk. Általában az alapértelmezett branch a master nevű, klónozás után tehát ide jutunk.

    Ezután ki kell választani a megfelelő branchet (a master szinte percről-percre változik, azzal nem érdemes foglalkozni). A lehetőségek tárházát a "git branch -r" parancs mutatja meg, választani a "git checkout -b branch origin/branch" paranccsal tudunk. Én most a 4.7-es branchet fogom előszedni:

    hron@laptop qt (master) $ git checkout -b 4.7 origin/4.7
    hron@laptop qt (4.7) $

    Ezután kezdődhet az érdemi fordítás. A fordítás ugyan nem autoconf/automake alapú, a kezdeti lépést mégis a configure script megfelelő paraméterekkel történő futtatása jelenti:

    hron@laptop qt (4.7) $ ./configure -developer-build -opensource -confirm-license -nomake demos -nomake examples
    hron@laptop qt (4.7) $

    A scriptnek van --help kapcsolója, mely ismerteti az összes használható kapcsolót, én az itt használt négyet emelném ki:

    • -developer-build: Arra utasítja a fordítási rendszert, hogy ne a szokásos /usr/lib/ jellegű útvonalon keresse a libeket, hanem az aktuális könyvtárban
    • -opensource: A nyílt forrású verziót fordítjuk
    • -confirm-license: Egy kis könnyebbség, nem kell interaktívan elfogadni a licencet. Scriptelésnél hasznos.
    • -nomake: A paraméterként megadott könyvtárban levő cuccokat nem fogja lefordítani. Nagyjából a fenti két könyvtár esetében van értelme használni, a többinél funkciovesztést kapunk ha használjuk (az src könyvtár kizárásával meg nem kapunk semmit :-) ).

    Ezután egy kis molyolás következik, lefordul a qmake eszköz, mely a Qt projektek fordításáért felelős, majd ha már ott van, le is futtatódik az összes qt-s cuccon, legenerálva a szükséges Makefile-okat.

    Ezután a jól ismert make parancs következik, mely leforgatja a Qt forrást.

    Ha a nyelvi fájlok frissítésén törjük a fejünket, akkor ezen a ponton van még egy teendőnk: ha eldöntöttük mely nyelvi fájlokkal akarunk dolgozni (a példában ez a 'hu' lesz), akkor az alábbi parancsra van szükségünk:

    hron@laptop qt (4.7) $ make ts-hu
    hron@laptop qt (4.7) $

    Értelemszerűen, ha a spanyol fájlokkal akarunk dolgozni, akkor a paraméter ts-es lesz. Fontos tudni, hogy ez csak a már regisztrált nyelvekre van meg, új nyelvnél előbb létre kell hozni a megfelelő TS fájlokat, lemásolva egy már létező fájlt.

    Ezután neki lehet esni a frissített fájloknak a Linguist nevű programmal, mely a bin/ könyvtárban található.

    Tipp: ha csak 1-1 projekthez tartozó fájlt akarunk frissíteni, azt így tehetjük meg:

    hron@laptop qt (4.7) $ make ts-designer-hu
    hron@laptop qt (4.7) $

    A fenti parancsa  translations/designer_hu.ts fájlt frissíti be.

    Nagyon fontos: Ha belenyúlunk egy ts fájlba, és nem vagyunk az adott nyelv fordítói csapatának tagja, feltétlenül vegyük fel a fordító(kk)al a kapcsolatot! Ha nem válaszolnak, vagy nincs támpontunk hozzá hogy hol keressük őket; Oswald Buddenhagen vezeti a Qt fordítását, őt mindig meg lehet találni az irc.freenode.net IRC szerveren, általában ossi nick alatt.

  • Teszt cikk

    Gabor Garami 2012. April 18.
    0 komment

    Teszt cikk, az URL-hez.

  • A legjobb Git workflow - továbbfejlesztve

    Gabor Garami 2012. April 18.
    0 komment

    Közönségkérésre, most bevezetem az olvasóimat abba a Git repo kezelési módszertanba, amit a saját projektjeimnél használok.

    Alapul az egyik talán legnépszerűbb Git workflow szolgált, melynek leírása itt tekinthető meg.

    Lássuk az alapfogalmakat, amiket a leírásban használni fogok, ez az én terminológiám:

    • Master branch: A repo alapértelmezett branche. A frissen létrehozott git repo-nál ez a "master" nevű branch, de akárhogy is lehet hívni.
    • Develop branch: Ezen az ágon folyik a fejlesztés, de közvetlenül ide nem commitolunk (lsd. később)
    • Feature branch: egy új feature fejlesztése zajlik rajta. Ez lehet egy új gomb és a mögöttes kód, lehet a tesztek írására szolgáló branch, a lényeg, hogy az itt zajló változások vagy új funkcionalitást adnak a projekthez, vagy annyira jelentősen módosítanak egy meglevő funkcionalitást, ami már nem fér bele a hotfix branchekbe.
    • Hotfix branch: Ide elsősorban hibajavítások jönnek, amelyek jöhetnek valamilyen bugtrackerből, vagy akár bemondásra is, ez már egyéni metodika kérdése. A lényeg: ide olyan változtatás nem küldhető be, mely nagy mértékben változtat a funkcionalitáson.

    Szóval. amikor indul a repo életciklusa, akkor létrejön a master branch. A kezdő commit általában vagy egy .gitignore fájl beküldéséből áll (ez a legtöbb esetben hasznos, ha megvan), vagy valami hasonló, jelentéktelen változtatásból. Rails projekt esetében én azt szoktam csinálni, hogy a legenerált és kitisztított projektfát küldöm be, amiben még semmi nincsen, csak a mappák vannak létrehozva, illetve pár dolog felkonfigurálva (pl. rspec, cucumber, meg hasonlók). Mindenesetre az alkalmazás itt kezdi meg életciklusát.

    Ez után rögtön le is ágaztatom a develop branchet, majd a develop branchből az első feature branchet. Fontos, hogy minden feature és hotfix branch a develop ágból származik.

    A feature branchen elkezdem az első dolgokat implementálni, majd amikor az első feature kész (pl. van egy belépő felület), akkor azt rámergelem a develop branchre. A mergelések mindig szigorúan --no-ff kapcsolóval történnek, mert ez biztosítja számunkra azt, hogy a későbbi grafikus megjelenítéseknél jól elkülöníthetően látszódjon, hogy honnét származik a változtatás.

    Példa:

    myproject (feature-add-loginform) $ git checkout develop
    myproject (develop) $ git merge --no-ff feature-add-loginform

    A hotfix branchekkel ugyanígy járok el.

    Hogy ne legyen konfliktus merge-léskor, a feature/hotfix brancheket időnként rebase-lem a develop-hoz (csak ahhoz), hogy meglegyenek azok a változások is, amelyeket más branchen követtem el. Ez ugye pl. webalkalmazásnál fontos, hogy ha a dizájnon változás van, vagy a js-hez új funkcionalitás került, akkor azt egy, ettől függelten feature fejlesztése során is tudjam használni (tipikus példa erre az a pont, amikor az átmeneti combobox-okat leváltja egy automatikus kiegészítés alapú megoldás). Ez egyrészt kényelmi okokból fontos, másrészt pedig azért, mert ilyenkor már zajlik a dogfooding, vagyis a saját kód felhasználói szempontból történő tesztelése. Volt már, hogy itt jöttek elő olyan hibák, melyeket sem a tesztek, sem az első kattintgatások nem hoztak ki.

    Van néhány olyan eset, amikor közvetlenül a develop ágra commitolok. A legfőbb szempont ilyenkor, hogy ez csak olyan változás lehet, ami nagyon kevés fájlt érint, illetőleg a branchek nagy részének fontos változtatás. Ilyen lehet például a .gitignore fájl felbővítése, ha valaki hirtelen boldog Mac tulajdonos lesz, és a Mac fájlrendszer csodáit (.DS_Store) ki szeretnénk zárni a projektből. De ilyen lehet az is, amikor egy általunk elütést javítunk ki egy nyelvi fájlban, mert erre pl. felesleges lehet egy új branchet szülni. Persze ez a fejlesztő/fejlesztők által követett módszertantól is erősen függhet.
    Ilyenkor viszont fontos, hogy minden branch értesüljön a változásokról, és rebase-zel maga alá tegye azokat.

    Amikor a projekt elérkezett egy milestone-hoz, akkor történik a master branchre mergelés, közvetlenül a develop branch-ről. Ha a projekt olyan, hogy ez szükséges, ilyenkor a master branchen tagelek is (ez főleg azért érdekes, mert pl. a GitHub minden tagelt branch-ből létrehoz egy letölthető forrás csomagot, így ezzel nekem nem kell törődnöm).

    A fő szempont a master-nél, hogy itt mindig stabil, minden változtatástól mentes kód legyen, amely bármikor bárhova deployolható, és azonnal működőképes.

    Érdekes kérdés, hogy mi legyen azokkal a hotfix típusú változtatásokkal, amelyek a master branchez kellene hogy menjenek, hiszen az éles alkalmazásban van a hiba, ugynakkor a develop ágon már mergelve van egy feature, amit nem szívesen mergelnénk rá a master ágra. Nos, én általában megpróbálok a helyzethez igazodni. Először is, meg kell nézni, hogy az adott hiba előjött-e már a develop ágon, és fixálva lett-e. Ha nem, akkor ez az első lépés, plusz a megfelelő tesztesetek legyártása, hogy a továbbiakban ilyen probléma elő ne fordulhasson.
    Ha a hiba nem kritikus, a legegyszerűbb megoldás a hiba javítását a következő milestone-ig eltolni. De nyilván vannak kritkus hibák is, lássuk mi a teendő ezekkel.

    A legegyszerűbb eset, amikor még nem történt mergelés a develop-ra a master ágra történt mergelés óta, ilyenkor simán át lehet venni a hotfix branch javítását.

    Más esetekben meg kell nézni, hogy a hotfix által érintett fájlok milyen mértékben változtak a master-hez képest. Erre a git diff parancs ad lehetőséget. Ha a fájl ettől a változtatástól eltekintve nem változott, akkor a beküldött commit-nak veszem a diff-jét (git diff HEAD^..HEAD), majd alkalmazom csak ezt a javítást a master branchre. Ilyenkor a következő mergelésnél figyelni kell, mert konfliktus léphet fel, ezt sajnos egyedileg le kell kezelni.

    Egy másik megoldása a problémának, hogy mivel a master ág az gyakorlatilag a develop ág egy snapshot-ja, így abból indítom a hotfix branchet, és mind a két ágra visszamergelem. Ez talán a legegyszerűbb megoldása a problémának - csakhogy tapasztalatom szerint ez az, ami a legritkábban is működik. Ugyanis nincs értelme álmodozni, a master-ről indított hotfix branchek az esetek nagy részében nem illeszkednek a develop ágra, conflict alakul ki, és elég sok nyűg van, mire oda beilleszkedik, plusz utána a master-ra történő mergeléskor megint kialakulhat conflict. Mindenesetre van, ahol ez a megoldás is működik.

    Alternatív megoldás lehet még a cherry-pick használata, mellyel egy darab commit-ot tudunk a develop branchből átvenni a masterre, a mergelés kockázata nélkül. Erről még csak hallottam, nincs gyakorlatom vele, hogy milyen százalékban okozhat conflict-ot, illetve hogy a --no-ff merge képes-e elkezelni az átvett commit-ot. Illetve ez is csak akkor működik, ha nincsenek gyökeres változások a develop ágban erre a fájlra nézve.

    Amit a commit-okról még érdemes elmondani: én mindig ún. topic commit-okat használok. Ez azt jelenti, hogy mindig igyekszem olyan commit-okat gyártani, amelyek önállóak, és pontosan egy dolgot csináljanak. Tehát ha pl. teszteket írok, és közben születnek javítások is, amelyek a tesztek lefutásához kellenek, nem nyitok mindig új hotfix branchet (mert egy lusta disznó vagyok), hanem a tesztek ágába belerakom a változást is. Mivel a tesztek az appra nézve nem jelentenek funkcionális változást, a javítás viszont igen, így én nem érzem azt, hogy ennek kockázata lenne. Ellenben nagyon fontos ügyelni arra, hogy ilyenkor mindig pontosan azokat a változtatásokat küldjük be, amelyeket azzal a committ-tal javítunk. Ha kell, hunk (ez a változtatások egysége, a diff kimenetében egy, három kukaccal kezdődő sorral szeparált blokk) szinten bontom szét a változásokat. Erre nagyon jó lehetőséget ad a git add parancs -p kapcsolója.
    Ennek a megoldásnak a legfőbb haszna az, hogy bárhol meg lehet bontani a develop branchet, bárhol le lehet ágaztatni róla egy új branchet, mindig viszonylag konzisztens állapotot fogunk kapni.

    Összességében tehát a legfőbb alapelvek:

    • A master branchre lehetőleg csak mergelés történjen, ide közvetlenül (a kezdő commit-tól eltekintve) ne küldjünk semmit.
    • A develop branch-en lehet játszani, de érdemes figyelni a konzisztenciájára
    • Hotfix branchen a működést alapjaiban érintő változtatás nem történhet
    • Mind a hotfix mind a feature brancheket érdemes frissen tartani a develop-hoz képest, hogy ne érjenek minket nagy meglepetések

    Véleményeket itt alul lehet írni, ahogy időm engedi reagálni fogok rájuk.

  • Brno - A very different place

    Gabor Garami 2012. March 15.
    0 komment

    I am arrived from Brno. This is a very beautiful town and a very good place. If I need to compare with Budapest, the whole Brno looks like the centre of Budapest but not at now but in 30-40 years ago.

    The mass transit is a surprise. Before I started I read the main vehicle is a tram but I didn't expect how it looks like in the reality. If you take a look for the city you understand: if there is a wider road, they place tramway and expand an existing line to it or start a new line. There are some buses but as I think they goes where the terrain is too step and the tram cannot climb up on it. During the two days while I was in the town, I saw only one bus. Not one bus line but one vehicle (this wear number 84 btw :-) ).

    This system is interesting from other aspects too. The town is splitted to zones (zóny) and the tickets are contains some time for travel and permission to cross some zone-borders. The most expensive ticket is valid in 5 zone and few hours. But, if you want to buy some tickets, especially if you want to buy them from a small shops (all newspaper-stand sells tickets, and all place where you see "JÍZDENKA"), you need ask it by it's price. I choosen this even if there is a ticket machine in every stop, because as I saw most machines do not know about other languages but Czech. And the buttons are not titled except the ticket selection button. So, there wasn't a help to handle them if you do not know the language (I think there are some machines what can say in foreign languages and there are some machines what titled correctly, but I didn't meet with them). I used machines to write down the price of the tickets, to ask them correctly from the sellers (ticket is a fixed-price stuff, so do not matter where you buy it).

    I choosen the Hotel Brno because it offered a cheapest room in booking.com (where is a correct description about places and the services). The hotel had a very good transport possibilities and placed at a silent, nice place. The room wasn't too big but for two people when they woulnd't like stay in the room for a whole day is absolute correct. Because I was alone this was more than enough for me.

    The terrain under the city is quite hilly. I never saw a too fat people under the two days and I think I understand why :-)

    As @kozka told me the office of RedHat is placed near the universities. Currently RedHat occupies a whole building but the next building is under construction so they growing fast. As I saw some levels are equipped recently (I smelled the fresh painting) so they are growing really fast.

    The people are very nice and they help you even if you do not understand what they tell you.

    The other thing what surprised me is the moral on the roads. If you stop at the pedestrian crossing, the cars are stops even if there is a rush hour. It seems like a reflex. I will need condition me back to the hungarian moral to not start crossing the road because the cars are not stop every time for you.

    Btw the interview was good I think I passed on it, but I didn't got a reply from RH, but they informed me I will got a result today. And I collected two business card too :-)

  • Travelling to Brno

    Gabor Garami 2012. March 11.
    0 komment

    The next Tuesday (2012.03.13) will be the day when I leave Hungary again. This will be the second travel to abroad in my life. I am very excited because I not just go to abroad but go alone into the country where I do not know the main language too.

    This travel will not be just for fun, I will participate in a job interview for RedHat CZ, and if I will be applied, I will be a part of the QA team behind RedHat Linux (if I know correclty). I would like say many-many thanks to @kozka who help me in a lot of thing before and he promised he will help me to reach the head office to not late from the interview.

    But, because I never been in Bohemia before, after testing my knowledge against RedHat requirements, I will become a simple tourist and enjoy beautifulness of Brno (RedHat CZ is located at this town). I heard and read a lot of good things about this city, so I am very curious about them.

    When I come back at Wednesday, I will post here about my experiences and - of course - the result of the interview too.

    Stay tooned, seriously :-)

  • Some new rules / Új szabályok

    Gabor Garami 2012. March 11.
    0 komment

    I just forgotten write down new rules for this blog. If it is possible and I am not too tired for it, I will write posts in English to practice this language. I found if I write continous text I can change my mind into English and I start thinking in English too. After this I can speak English easier too.

    However, this rule will be dynamic. If I am too lazy, I will write Hungarian posts too, primarily because I wouldn't like loose my Hungarian readers who do not know in English, such as my mom.

    Stay tooned.

    Elfelejtettem leírni a blog új szabályát. Ha csak lehetséges, és nem vagyok túl fáradt hozzá, a blogban angol nyelvű postok lesznek, a nyelv gyakorlásának céljából. Ez főleg azért van, mert azt találtam, hogy ha hosszabb, egybefüggő szöveget kezdek el írni, akkor az agyam automatikusan átvált angolra, és utána már sokkal könnyebben tudok pl. beszélni is angolul.

    Azonban, ez a szabály rugalmas lesz. Ha túl lusta vagyok, akkor magyarul is fogok írni, többek közt azért, mert nem szeretném elveszíteni csak magyarul tudó olvasóimat, pl. édesanyámat.

    Stay tooned.

  • Jenkins, RVM, Bundler

    Gabor Garami 2012. February 15.
    0 komment

    Preface: Sorry for my poor english.

    So, today I started thinking on how can I compile my rails app to different Ruby versions. Luckily, I discovered, Jenkins can use RVM to run rake tasks.

    I initialized rvm following this tutorial but I just skipped EC2 instance creation, because I currently has a CI server. I installed three ruby version, MRI 1.8.7, MRI 1.9.3, and JRuby latest stable.

    First, I created a Rakefile.bootstrap file in my project root to make bundle install phase to rake-ized because I wouldn't like run this via shell state, as because I need to select the correct rvm what is can be changed and I wouldn't like administer it on thee or more places.

    Then, I was naive. I thinked I use separated gemset to avoid infecting global ruby scope with my project's gems.

    This is quite easy, I sudo-ed to jenkins, and created gemset by `rvm gemset create rhcp`. After viewing and saving Jenkins' main configuration are, rake plugin recognized this gemset, and offered to use it.

    I clicked on it, saved the project, clicked on build, and pray (in the future: c&p). No luck.

    I spent a half of hour with investigation, and I found I need install rake to the target gemset too, not enough if it is installed with ruby or installed to the @global gemset. I installed rake, c&p. No luck.

    After it, I ran into this problem. Because rake loaded twice, it lost in the stack, and just gave up.

    So, I added rake proxy for my bootstrap Rake file. It means calls the rake command prefixed by 'bundle exec' since Jenkins cannot do this. Bundler cleans out unneccessary gems (eg.g what coming from @global, or from ruby itself) and executes rake command.

    This is the final Rakefile.bootstrap if you want to use it:

     

  • Re, back, valami

    Gabor Garami 2012. February 14.
    0 komment

    Felélesztem ezt a blogot, hátha lesz is belöle valami. Most visszaolvastam és durván régen nem írtam ide semmit, de megmondom öszintén, nem vagyok az a blogolós típus. Mégis, valahogy zavar ez az üres lap itten, hát majd kitalálok valamit.

    Most éppen Rails fejlesztek nagyban. Szinte minden új, ez kicsit frusztrál is, de hát haladni kell a korral. Rails 3, Devise, Resque, ActiveAdmin - csak hogy a föbb dolgokat említsem.

    A legjobb a Rails fejlesztésben, hogy ha otthon vagy a HTML-ben, CSS-ben, JS-ben, akkor könnyü vele a munka, de ezekre mindenképpen szükség van, mert sok megoldás lényegét csak akkor lehet megérteni, ha az ember ismeri, hogy a fent említett trió hogyan müködik, mi a célja, és hogy lehet használni.

    Van egy angol srác, IRC-n találkoztunk, tanítgatom öt Railsre. Néha kicsit frusztráló dolog tud lenni, mert nehéz elvonatkoztatni attól, hogy én - még úgy is, hogy most tanulom újra az egész Rails-t - relatíve sokkal többet tudok, mint ö. Szegénykém sajnos nagyon bizonytalanul mozog a JS terén - erre sikerült neki egy igencsak JS intenzív appba belekezdenie. Filózok rajta, hogy elkezdem öt arra szorítani, hogy olvasgasson JS tutorialokat, mert nem lesz ez így jó... Amikor egy eseménykezelőbe való kódot csak úgy bevág valahova, az sose jó irány.

    Mondjuk nekem meg az angol nyelv okoz nehézségeket, nagyon sokszor szaladok bele abba, hogy nem tudok tovább menni. Bár nagyon sokszor alkalmazom azt a trükköt, hogy ha nem tudod kimondani, írd körül, van, amikor még a körülíráshoz is hiányoznak a szavak. És olyankor sajnos csalnom kell, és a Google Translate - ilyen szempontból - kétes minőségű segítségére hagyatkozni.

    Aztán itt van még a felújítás projekt is. Borzasztó dolog, pár évig biztos nem vetemedek ilyen egetverő őrültségekre. Először is, szívszaggató romokban látni a lakást. Másodszor, egy ilyen mindig elhúzódik, függetlenül attól, mennyire tervezted meg. Ez lassan negyed éve kínlódik.. :s és még nincs vége.

    Na, becsukom a panaszládát, megyek vissza kódolni, csak ezt így egyben ki kellett már írnom...

  • Google Authenticator for SSH

    Gabor Garami 2011. July 18.
    2 komment

    Na, ezt is kipróbáltam, yo.

    A /etc/pam.d/system-remote-login fájlban az auth include kezdetü sor ment át erre:

    auth            required        pam_tally2.so onerr=succeed
    auth            required        pam_shells.so
    auth            required        pam_nologin.so
    auth            required        pam_env.so
    auth            sufficient      pam_google_authenticator.so

    Kéri az authentikator kódjat, enter, es belép. A Pubkey auth felülvágja, ofc.

    Szerk: ja, és kell neki a ChallengeResponseAuthentication yes

  • Dr Ötker

    Gabor Garami 2011. July 10.
    2 komment

    Tegnap tettem egy rövid látogatást kedvenc Interspar-omban, és vettem egy csomó acciós gyümölcslevesport, télen-nyáron kiváló turmix van belölük. Hogy-hogy nem, bekerült a sorba egy sárgabarackos tejberizs is - valószínüleg mellényúltam. Mindenesetre árban nem volt nagy difi, belefért.

    Hogy ne vesszen pocsékba, csak kárba, gyorsan összedobtam rá valamit.

     - 1/2 doboz 0.5l-es SPAR vaniliás ital (egy kicsit sokat vettem belöle a jómúltkor...)
     - 1 pohár tej (ez eddig ugye fél liter, ennyi folyadék áll a zacsin)
     - 1 zacsi tejberizs kezdemény (ez ugye most a sárgabarackos)

    Totál a zacsi szerint jártam el, alapos felforralás (megvártam, mig takarékon elkezd kinézni a fazékból - ez csak elég alapos...), 1 perces (alapos) keverés,
    10 perc (alapos :-) ) fedö. Na itt állunk most.

    Uhh, el is felejtettem frissíteni. Na, szóval feledhetetlen volt, bár legközelebb picit kevesebb vaniliás tejet és egy picit több sima tejet rakok bele.