New scanner added successfully

I had to buy a new printer because my old Xerox Phaser stopped working and I got a horrible price for repairing it. After browsing the possible applicants, I found the Philips LaserMFD 6050 what have an automatic document feeder addon too. After unpacking it, I was happy because I found a driver CD with title “Mac & Linux” But I didn’t know the afternoon-long sucking will start.

At first place I want to make printer part working. After printing one of printer’s own test pages, I sat down behind my Gentoo box, and started figure out how can I introduce my new printer to Cups. The first step was easy, because it found a new printer-like device at USB port, but it had absolute no idea about the type.

After a lot of googling, i found it’s a dumb printer without PCL or PS knowledge, so I had to install ‘raster’ driver. The funny part is all Linux driver was 32 bit.

Fortunately, cups invokes parts of the driver via command-line (not via shared libraries like sane - see later), so I have very little debugging task with it. Ohh, and I have to patch it because Gentoo uses /usr/libexec for cups drivers, not /usr/lib what assumed by rastertoprinter script.

However, sometimes cups does not print the job at first try, I have to reprint it from the web interface - I didn’t guessed it why. This is a very small issue, so I marked this task completed.

Scanner part was more tricky. As I said, all drivers on the CD (and in the driver package what I downloaded from the internet) was for 32bit not for 64 bit systems. Sane’s backends are dynamic libraries, so there was no quick and painless way to add proprietary backend to my existing Sane install. As i browsed hopeless on the internet, I found a topic what said the drivers on the CD are for Ubuntu Gutsy (and works with Hardy too). This gave me an idea: what happens if I install a 32bit Ubuntu Hardy chroot?

To understand my idea you have to know Sane has a small inetd/xinetd daemon named saned and it can provide your scanner on the network. So you can connect from any (permitted) client to your server and scan even if your box is not connected to the scanner directly (e.g. via USB cable).

After emerging debootstrap, I installed Hardy into a simple /chroot32 folder, and added sane stuffs for it. I unpacked the provided sane backend into this chroot and sane finally recognized my scanner correctly. After some testing I configured saned with this xinetd config:

/etc/xinetd.d/sane-port
1
2
3
4
5
6
7
8
9
10
11
service sane-port 
{
  disable     = no
  socket_type = stream
  protocol    = tcp
  user        = root
  group       = root
  wait        = no
  server      = /usr/sbin/saned
  only_from   = 127.0.0.1 ::1 192.168.2.0/24
}

I had to run saned as root because saned got permission denied otherwise. As it’s running in chroot and restricted to the local network, it has a very low risk.

Finally I can scan via XSane. Gimp is not allow me to scan from this device, but XSane is smart enough for me.

For bulk scanning i wrote a small bash script. It needs some love because it creates a pdf in the current working directory - but it’s good for start.

Gento - Para vagy nem para

Twitteren volt egy ilyen üzenetváltás:

@hron84: Kiprobaltam megint a #gentoo -t. Mar elfelejtettem, hogy mennyit kell varni egy firefoxra. […]

@team4world: @hron84 lehet én is kipróbálom. Mennyire parás egy frissítés?

@hron84: @team4world Ha mindenbol csak stabil verziot hasznalsz, akkor abszolut nem para. Ha elkezdesz a testing arch-csal ismerkedni, figyelni kell.

@hron84: @team4world Lehet este osszeszedek egy cikket az ajanlott konfigrol.

@team4world: @hron84 az nagyon jó lenne!

Itt tartunk tehát most. Nem aznap este lett ugyan összeszedve, de hát az “aznap” szó nem is szerepelt a twittben :-). Na jó, evezzünk komolyabb vizekre.

Előrebocsátom, hogy ez nem egy Gentoo tutorial lesz, nem fogok minden fogalmat elmagyarázni, csak a legszükségesebbeket. Ha nem értesz valamit, ott a Gentoo Handbook, ott a Gentoo Wiki, olvass utána. Ennek elsősorban terjedelmi okai vannak, a Gentoo-ról szóló irományokkal egy könyvtárat meg lehet tölteni (sőt, bizonyos értelemben ez már megtörtént), ez meg itt csak egy blog.

Para vagy nem para?

Nehéz kérdés, mert mindenkinek mást jelent a “parás”. Én, aki cirka 3-3.5 évet tuti lehúzott Gentoo desktop mellett, mást érzek parásnak, mint az, aki most adja ki élete első emerge parancsát. Szóval az első körös válaszom kicsit sántít, mert valójában nincs egzakt válasz a dologra.

Van, akinek para az, hogy egy Firefoxra - géptől függően - fél és két óra között kell várni. Nekem nem volt az, mert én ezzel már tisztában voltam, így a telepítés során előbb a Google Chrome-t tettem fel, és csak részben azért, mert az elmúlt két évben ez vált az elsődleges böngészőmmé, jobban belejátszott, hogy ez csak bináris formában van jelen (elérhető a Chromium is, forrásból fordul, de ezt még binárisan se szeretem, néha ugyanis bugosabb, mint a Chrome, nem tudom, miért).

Van, akinek para az, hogy több, ún. slot van, ami annyit takar, hogy egy adott nevű csomagból többféle verzió is lehet a gépünkön (gondoljunk a PHP-re, az 5.3 és az 5.4 az két különböző PHP-nak számít), és ha nem az alapértelmezett slot verziót szeretnénk, akkor célzottan kell telepíteni és maszkolni azt, amit nem szeretnénk (esetünkben én nem vagyok olyan nagy PHP 5.4 fan, akkor sem, ha a hardcore PHP-sok ezért megszólnak, szóval én hanyagolom azt a verziót).

Szóval hogy mi para és mi nem, az egyénfüggő. Nagyon fontos dolog, hogy a Gentoo egy teljesen más hozzáállást igényel, mint a legtöbb disztribúció. Ez elsősorban arra irányul, hogy pontosan tisztában kell lenned azzal, hogy mit és hogyan szeretnéd, valamint nagyon oda kell figyelned arra, hogy mit csinálsz. Ha valamit nem értesz, nem lehet elbliccelni, utána kell olvasni, át kell gondolni, sokszor. De cserébe egy végletekig testreszabható rendszert kapsz, és ez nagyon sokszor megéri.

Ajánlott hardverek

Töprengtem, hogy ne az legyen az alcím, hogy “Milyen hardvert ne vegyek”, de aztán arra gondoltam, hogy nem leszek ennyire destruktív.

Szóval, Gentoo esetében legyen egy jó procid, lehetőleg sok maggal, HyperThreading kiemelten jó, ha van és be is van kapcsolva. Minél több processzort listáz a /proc/cpuinfo, annál hamarább végzel a telepítéssel.

Legyen továbbá sok RAM-od. 2G RAM alatt eszünkbe se jusson Gentoo-t telepíteni! Tapasztalataim szerint 3-4G RAM az, amivel már tűrhető (pontosabban kivárható) idő alatt összeáll valami rendszernek már nevezhető tárgy.

A winyó kiemelten fontos. Nem csak a tárhely (a gyökérre lehet nyugodtan 30G-t szánni, meghálálja a rendszer, a home legyen külön partíció) fontos, de a merevlemez pörgési sebessége is. Ha 5400 RPM-es merevlemezünk van, ne egy bödön, hanem két bödön kávét készítsünk be. Ezt az infót szokás elrejteni a merevlemez címkéjén, vagy akár le is hagyni, így telepítés előtt mindenképp nézzünk el a Google felé, a merevlemez típusszámával, az első három találat a gyártó datasheetjére fog vinni, ha nem, tegyük hozzá, hogy ‘speed’. SSD felhasználók itt komoly előnnyel indulnak.

Mit rakjak fel?

Kezdőknél ez nagyon gyakori kérdés, és a kellemetlen élmények nagy része az ezen kérdésre adott rossz válaszokból adódik. Tisztában kell lennünk azzal, hogy a Gentoo egy forrásalapú rendszer, vagyis a bináris rendszerekkel ellentétben itt a legtöbb csomag a gépünkön, forrásból fordul, legyen szó a GCC-ről vagy a Gitről. Van néhány olyan csomag, ami elérhető binárisban is, vagy épp kizárólag abban mert a gyártó nem tette elérhetővé a szoftver forrását. Ez utóbbira példa az Adobe Flash playere, az előbbire pedig a LibreOffice, mert erről köztudott, hogy még erős gépen is fél nap egy fordítás.

Én az alábbi metodikát követem:

  • Először összerakok egy alaprendszert. Legyen konzolom, legyen egy friss és jól mőködő kernelem, Grub (1-es mert én azt szeretem), hálózatom, meg más effélék, egyszóval álljon meg a saját lábán a rendszer, ne kelljen hozzá LiveCD. Szerencsés esetben ez olyan 2 óra alatt abszolválható feladat, kezdőknek se sokkal több.
  • Következő lépés: Legyen egy alap grafikus felületem. Itt általában már felteszem a kérdést: most rögtön akarok a rendszerrel dolgozni, vagy van időm hogy mindent klappoljon? Ha az első a válasz, akkor mindenféle preferenciát figyelmen kívül hagyva, komolyabb USE flag állítgatások nélkül felszórok egy IceWM-et, egy Google Chrome-t, meg valami terminált, mondjuk XTerm-et. Ez nem eredményez összkomfortos rendszert, ennek csak az a célja, hogy miközben a ház épül-szépül, legyen hol dolgozni meg aludni. Amennyiben ráérek, átugrom ezt a pontot.
  • Ezután rá lehet térni a preferenciáknak megfelelő rendszer telepítésére. Először mindig az USE flag állítgatásokat kezdem el. Mivel én GNOME-fan vagyok, így a make.conf -ba mindenképpen bekerülnek a gnome, gtk, avahi flagek, ezen felül PulseAudio-ellenes vagyok, így a alsa és -pulseaudio is. Elég jó alapbeállításokat lehet szerezni az eseletc profile list kimenete alapján kiadott eselect profile set <szám> paranccsal is, ahol a <szám> a lista elemei mellett látható számot jelenti, kockás zárójelek nélkül. Sorrendileg először mindig a konzolos cuccokat szoktam felszórni, nem csak azért, mert ezek hamar fordulnak, hanem mert ezeket utána már tudom használni, amíg a grafikus cuccok születnek. A teljesség igénye nélkül egy kis lista:

    • flaggie: hasznos cucc a csomagonkénti USE flag es keyword állításra. Ezen felül tud licenceket is elfogadni, de én általában minden licencre rábólintok, mert így könnyebb az életem. A /usr/portage/licenses alatt lehet kultúrálódni egyébként.
    • portage-utils: újabban része a stage3 alaprendszernek. Hasznos kis utilityk győjteménye, a q --help parancs nagyon szolgálatkészen mutatja be őket egyenként.
    • eix: A Google helyi megfelelője :-). Alapvetően csomagkeresgélésre használható, részletes információkkal szolgál arról, hogy milyen csomagok érhetőek el a rendszerben. A kézikönyvekben ajánlott emerge --sync parancs helyett (ha már fenn van az eixmindig azeix-sync` parancsot használjuk, mert ez frissíti az eix adatbázisát is a sync végén, plusz ad egy kedves listát az új/frissült/törölt csomagokról. Ezt gondosan tanulmányozzuk.
    • gentoolkit: Szintén hasznos csomagkezelő gyűjtemény. Én egy parancsot használok belőle permanensen, a többit csak szükség esetén, ez pedig a glsa-check. Mind desktopon, mind pedig szerveren kiemelten fontosnak tartom ugyanis, hogy ne legyen fenn olyan csomag, melyben ismert sebezhetőség van. Egy idő után hajlamos az ember rászokni arra, hogy ha egy frissebb verzió bugos lenne egy adott csomagból, akkor a bugos verziót és afelettieket kimaszkolja, majd az egészet elfelejtse. Ilyenkor jó a glsa-check, ami figyelmeztet, hogy bizony-bizony abba a verzióba már találtak egy komoly bugot, és talán érdemes lehet megfontolni a frissítést.
    • eselect és pluginjei: maga az eselect szintén az alaprendszer része, a pluginjei pedig a legtöbb esetben a hozzátartozó csomaggal kerülnek fel. Az update-alternatives-nek felel meg, csak kissé okosabb és színesebb. Érdemes ismerkedni vele.
    • bash-completion: akinél a Tab billentyűről már lekopott a festék (mint nálam :-) ), annak kötelező elem. Konfigurőlni eselect-tel lehet, hogy mely kiegészítések legyenek engedélyezve. Figyeljünk, hogy alapértelmezés szerint per-user állítgatjuk ezeket, globális engedélyezéshez használjuk a --global kapcsolót.
    • mc: kell-e bemutatni a Midnight Commandert? Szerintem nem. Figyeljünk, hogy kapjon samba és sftp flageket valahonnan, különben félkarú óriás. A slang flag pedig a szép magyar felülethez segít hozzá minket.
    • nano: Ha mcedit pártiak vagyunk, akkor nem érdekes, ha vim/emacs pártiak, nézzünk rá erre a kis editorra, amíg kedvencünk fordul. Syntax coloring, keresés, vágólap… és egyszerő használat. Része az alaprenszernek.
    • sudo: sajnos nem része az alaprendszernek ez a kötelező kis program. Tegyük fel, alig van függősége.
    • layman: a külső csomagtárólók kezelője. Okosan paraméterezve rögtön feldobja a 3 legnépszerűbb verziókezelt is, függőségként.

    Ezután jön a grafikus rendszer. GNOME pártiként én a gnome-light csomaggal indítok, ez egy metacsomag, semmit nem telepít, csak függőségei vannak, mint egy rossz drogosnak. Viszont mindent felrak, ami egy alap GNOME desktophoz kell. Emellé érdemes beütemezni a xorg-x11 csomagot is, ami a grafikus felület megjelenítését szolgáló X11 szervert rakja fel. Figyeljünk arra, hogy ha sehol másutt nem is, de itt mindenképpen használjuk az emerge --ask vagy --pretend kapcsolóinak egyikét, hogy kiírja, mit telepítene. Azért fontos, mert első körben be kell lőni a videókártya és a beviteli eszközök típusát a make.conf -ban, és itt egész jó tippeket kapunk a lehetséges értékekről a xorg-drivers sorában. Ne feledjük, hogy a mínusz jel mindig kivonást jelöl, vagyis az nincs kiválasztva. Beviteli eszköznek általában a keyboard-ot, a mouse-t és az evdev-et szoktam választani (ez utóbbi mindenképp kell), tapipad mániákusok ne feledjék a synaptics-ot is kérni az eladótól a meglepetések elkerülése okán. Kell egy jó login manager is, GNOME esetében ez a GDN, bár én most LightDM-et raktam fel, csak úgy próbából. Nem rossz, de a GDM jobb.

    Most jövök rá, hogy KDE fanok is vannak itt. Nekik rossz hírem van: nem nagyon tudok mit ajánlani, mert ritkán vetemedek KDE használatra, mostanság ez a gyakoriság a sohához tendál. Asszem a kdebase-startkde csomag visz el az alaprendszerig, kdm csomag van, és a kde-l10n csomagtól lehet várni lokalizációt. A xorg-x11 pedig itt is kötelező elem.

    Figyeljünk arra, hogy amennyiben nem KDE desktop a cél, első két körben tiltsuk a qt4 USE flaget, mert ez magával hozná a Qt grafikus könyvtár telepítését, ami elég hosszadalmas móka. KDE-s álmok esetében viszont épp ellenkezőleg: engedélyezzük, méghozzá minél koraibb szakaszban, a KDE-s cuccok nagy része le fogja fikázni a rendszerünket, ha nincs mindenütt Qt támogatás.

    Grafikus cuccokra ajánlatok:

    • Porthole: Gtk alapú csomagkezelő, Debianon Synaptic-nak hívnak egy ehhez nagyon hasonló cuccot. Az USE flag kezelőjének használatát lehetőleg mellőzzük, a Ctrl+R megnyomására feljövő parancssorból használjuk a flaggie-t. Igy nem érnek meglepetések egy frissítésnél. KDE rendszerhez a Kuroo jobb, de a Kuroo4 fejlesztése még igen aktívan tart, nem tudom, mennyire stabil a cucc. USE flageket itt is inkább flaggie-vel, bár a régi Kuroo (a KDE 3-as) rendesen kezelte a package.use fájlt.
    • Gitg: Roppant hasznos cucc, ha Git-tel dolgozunk. Soronként stage-elhető commit és history tallózó segíti a munkát.
    • NetworkManager: furcsa, de nem alapértelmezett a telepítése. Desktopon, wifi-mentes környezetben nincs is rá szükség, laptopon viszont kötelező elem, a hálózati konfigokat másképp nem fogjuk tudni kényelmesen managelni. A hasonló nevő (csak végig kisbetős) USE flag beállítása szintén fontos. Régebben volt valami PolicyKites para, de úgy tudom, az már megoldódott, mert más disztróban is volt, és azokban már meg van oldva.

Frissítés

Ide jön az, amit első körben válaszoltam a kérdezőnek: ha mindig csak stabil cuccokkal dolgozol, akkor nincs para, a Gentoo fejlesztőknél elég szigorú a QA, ha nincs elég community visszajelzés a csomagről, akkor nem is lesz stabil. Viszont amíg van komoly hiba vele, szintén nem lesz az. Vagyis stabil csomag általában csak stabil dologból lesz. Néha előfordulnak csomagolói melléfogások, véletlen stabilnak jelölések, de ez szimpla emberi mulasztás, és nagyon-nagyon ritka, mindenesetre érdemes hetente ellátogatni a Gentoo főoldalára, és csekkolni a híreket.

Azért arra mindenképp figyeljünk, hogy legalább hetente egyszer futtassuk meg a frissítő parancsot (ez az emerge -DuNa world), célszerően hétvégén, vagy lefekvés előtt. Reggelre tuti végez. Ha nagyon nincs időnk, havinál ritkább frissítést akkor se ütemezzünk, különben nagyon sokat kell várnunk.

Para akkor szokott lenni, ha külső csomagtárolókból (layman) teszel fel testinges (~ arch-os, ez egy tilde jellel prefixelt architektúra nevet, pl. ~amd64 jelent) csomagokat. Nagy para meg akkor, ha nagyon bevállalós vagy, és kipróbálsz pl. live ebuildeket (közvetlenül verziókezelőből forduló csomagokat), vagy két csillaggal megjelölt unstable cuccokat (a live ebuildek egyébként ez utóbbiak részhalmazát képezik). Kezdőknek és középhaladóknak nagy ívben kerülendő terület ez.

A fenti parancsot használva néha megjelennek sárga USE flagek is a csomagok mellett. Ez azért van, mert a -N kapcsoló a USE flag frissülésekre is rámegy, ez ugyanis sokszor valamilyen plusz támogatást is jelent, verzióváltás nélkül. Bekapcsolt ccache mellett, ha csak kikapcsolt flag került be, a csomagok secc-pecc lefordulnak, ha van, akkor pedig gazdagabbak leszünk egy, az igényeinknek jobban megfelelő csomagnak (amennyiben az USE flageket a saját, és nem a szomszéd igényei alapján állítottuk be).

A frissítéseknél lehet azért trükközni. A -DuNa mindent felsorol, ami épp frissülni akar, de ha mondjuk nem akarunk egy Firefox forgatásba belekezdeni, akkor csinálhatjuk úgy is, hogy kézzel felsoroljuk a frissítendő csomagokat egy emerge -u1 parancs argumentumaiként, verziószám nélkül, kihagyva a Firefox-ot, egy későbbi időpontban frissítve azt.

Nagyjából ennyi lenne. Elég hosszúra nyúlt ez az írás is, nem véletlenül mondtam az elején, hogy könyvtárakat lehet megtölteni a Gentoo-ról szóló ismeret anyagokkal.

Rename Windows 8 Profile dir

So, I ran into a weird situation: when I installed Windows, I used Live account to create my user. In preview version of Windows 8 it created a profile dir based on the user part of e-mail address of the Live account, so from [email protected] it created an user hrgy with same profile dir. However, the final version is changed it to create account based on your first name, it was “Gábor” in this case. Notice the accented second letter.

The problem with folders containing non-ASCII char in its name is obvious: not all program can handle it correctly. It has a displaying problems in some apps, and some apps cannot create their files in this profile.

The fix was not so easy but I now describe required steps.

First if you do not have an another administrator user than you, then you have to create it. Windows 8 does not allow to log into the built-in Administrator account anymore, so you have to create one in Control Panel. It’s pretty straighforward and net contains a bunch of howtos for it, so I skip describing this step.

Now, log out from your account, and log in into the new one.

Start regedit and navigate to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

In the subkeys (subfolders) find one what displays your old dirname in ProfileImagePath attribute. In my case the value was C:\Users\Gábor. Right click, edit and replace last part of the path to what you want to use.

Important: Even if world collapsing, do not log in into your own account (what being modified) until you finish these steps!

Then, you have to reboot into Safe mode. The easiest way is press Shift + F8 during boot. If you seeing the Windows splash displaying in “wrong” resolution then you are in Safe mode.

Important: you have to log in into the newly created admin account, not into your own one!

Then you have to rename your profile folder. Start a command prompt in Safe mode, and type following:

cd C:\Users
move old_name new_name

The old_name is the old name of your profile directory, the new_name is what you specified in RegEdit. In my case it was:

cd C:\Users
move Gábor hron

Now you are done! If you striclty follwed this tutorial, then if you reboot and log in into your account, you do not see any change, except the %USERPROFILE% environment variable carries the new name.

Note: I saw only one bug: iCloud Photo stream stored the full path of my Pictures folder in its database and I had to relocate it. It’s a bug in iCloud, not a Windows problem.

Disclaimer: This tutorial is tested by me but I do not guarantee anything. Take a backup from your important data before start doing this. I am not responsible if your data lose, you cannot login anymore or your kitten vanishes.

Nginx és PHP

Az előző cikkben alapszinten megismerkedtünk az Nginx-szel, valamint megtudtuk, mitől és miben gyorsabb, mint a kihívójának szánt Apache.

Ebben, és a következő cikkben azt vizsgáljuk, hogy hogyan tudunk egy PHP alapú site-t futtatni vele, például egy Drupal alapú portált.

Házi, magam sütöttem

A cím az utolsó betűig igaz - de csak addig. Pár hete (hmm… hónapja?) jártam-keltem a KÖKI Terminálon nyílt Tescoban, és nem tudtam elmenni egy fahéjas sütemény mellett, nevetséges áron volt, “Hamar kész” - hirdette a felirat. Naná hogy vettem.

Ma jutottam el odáig, hogy megint eszembe jutott (egy fenét, pár napja kerestem valamit a fagyasztóban és szembejött), mondom pocsékba ne vesszen már, megcsinálom.

Szóval, vettem egy nagy levegőt, meg egy még nagyobb tepsit (úgy értem, a levegőnél…) és belevágtam. A címke szerint 80 percet kell pihentetni, hát gondoltam, ez nem olyan betű szerinti dolog, hogy percre kellene betartani, ebédcsinálás előtt kiraktam, ebéd + pihi után álltam neki megcsinálni. Volt az 90-120 perc is, de ki számolja…

Aztán olyat mondott a címke, hogy vegyek sütőpapírt, borítsam a tepisbe, és utána rá a sütit. Na most nekem elég sokféle papír kószál itthon, sütőpapír az pont nem. Mivel már belevágtam (az ilyet nem szabad visszafagyasztani, mert elég undorító lesz utána) így a sütőpapírt kicseréltem alufóliára, mert az volt itthon. A csere egyszerű volt, tepsiből nem létező sütőpapír kidob, alufólia beterít.

A következő utasítás az volt, hogy 185 fokon kell sütni. Mivel nekem csak ilyen nempontos gázsütőm van, belöktem 5-ös fokozatra, és felhúztam az órát öt percre, ha nagyon elszaladna a ló, ott még lehet korrigálni mondjuk egy 4-es fokozattal. Kimentem, semmi extra, rápörgettem még 5-öt a kisvekkerre (a címke 10-12 perces sütést ír, de ez valami sablonból van, sosem vettem még olyan terméket, amit tényleg meg lehett volna csinálni ennyi idő alatt. A jobbik esetben nyers volt, a rosszabbikban… hát… érdekesen sötét).

Csörgésre lustán kiballagtam (+1-2 perc), megvizsgáltam úgy szemileg, meg megbökdöstem a kés hegyével, lagymatag és puha volt, szóval kollektív döntésként született, hogy kell neki még 5 perc. Kisvekker orrát megtekertem megint.

Miután megint egy cikk kellős közepébe csörgött bele a határidő, így úgy döntöttem, hogy egy életem, egy halálom, én bizony ezt nem fogom visszarakni a sütőbe, lett légyen akármilyen is az a sütemény. Végül nem volt szükség ilyen kemény elhatározásra, a süti magától is nagyon szép állagú lett, picit barna, de az nem baj.

Suti @ Tepsi

A kiszedéssel viszont megszenvedtem. Mondjuk úgy, hogy nem véletlen ajánlanak ehhez sütőpapírt, bár az is csak felezi a kiszedési időt, ellenben megkönnyíteni nem fogja. A fahéjas töltelék ugyanis elég ragaszkodó természetű, viszont engem annyira nem kedvel, inkább az alufólia iránt mutatott élénk érdeklődést. Végül több, mint 20 perces hősies küzdelem után rá tudtam beszélni arra, hogy egy rongyos, összetépett, ragacsos alufólia közel sem annyira vonzó, mint egy szép új kéztőrlővel leterített tiszta tányér.

Suti @ Tanyer

Tanulságok:

  • Kell venni egy tekercs sütőpapírt, akkor is, ha csak szökőévente egyszer támad ilyen ötletem. Mivel nem romlik meg, nem szagosodik meg, valamint alig foglal helyet, így mindenképpen megéri, főleg, mert elég sok időt megspórol.
  • Sose higyjünk a címkére írt sütési utasításnak vakon. Mindig ellenőrizzük szemileg a készülő termék állagát, mert azt a címkét Átlag Istvánné szül. Mindegy Jolán számára írták, nem pedig nekünk.

Ettől eltekintve ízre semmi probléma, a kicsit megkaramellizálódott alap pedig abszolút nem okoz problémát.

Rails pre-commit hook

I just created this small hook for my Rails projects. It helps me to make my codebase clean.

You can clone it at Gist

Gitiles Install Howto

I sucked a bit with Gitiles, Gerrit’s Gitweb implementation, because this project lacks an INSTALL file.

So, basically you have to do following:

  • First, check out of the source:

    git clone https://gerrit.googlesource.com/gitiles

  • After you cloned the source, compile it with Maven:

    mvn package -Dmaven.test.skip=true

Now, you got gitiles-war-1.0-SNAPSHOT.war in gitiles-war/target folder. Deploy it under your application server, in this case I put it to Jetty’s webapps folder.

  • Tricky part is coming: you will faced with an error message, what says some configuration options are missing. This is because you didn’t created any configuration file yet. By default, webapp searches its configuration in the webapp root folder, but - because jetty explodes this folder every restart, I decided to put it to some more persistent place. I am do not run any other thing under this Jetty than Gerrit and Gitiles, so I created the gitiles.config under Jetty’s etc folder:
gitiles.config
1
2
3
4
5
6
7
8
9
10
11
[gitiles]
    # Repositories placed here
    basePath = /srv/git/repositories
    # Do not check they are exported
    exportAll = true
    # This URL will be displayed as clone URL. DO NOT FORGET TRAILING SLASH!
    baseGitUrl = ssh://cr.hron.me:29418/
    # Title of site (doh)
    siteTitle  = Gitiles - kingmax.hron.me:/srv/git/repositories
    # I dunno why, but it is have to be configured.
    canonicalHostName = kingmax.hron.me
  • The config file above is cool, but Gitiles still crying… yeah, because you have to tell where it should find that. To do this, you must export a System property com.google.gitiles.configPath. I was very lazy, so I edited jetty.xml and before last closing tag I pasted this:
jetty.xml
1
2
3
4
<Call class="java.lang.System" name="setProperty">
    <Arg>com.google.gitiles.configPath</Arg>
    <Arg><SystemProperty name="jetty.home" default="." />/etc/gitiles.config</Arg>
</Call>

Nginx - Bevezetés

Ezen cikk a tervek szerint egy sorozat része lesz, amely majd szép lassan (ahogy időm engedi) kerül ki a blogra.

Lássuk tehát az első részt, mely - ahogy a cím is utal rá - egyfajta általános bemutatása lesz ennek a pici webszervernek.

Mi az Nginx?

Az Nginx neve az angol Engine X (X motor) kifejezésből származik, ejteni is eszerint kell, tehát ˈen-jən eks.

Magát a motort egy Igor Sysoev nevű srác fejleszti 2002 óta, a kód maga 2004-ben lett nyilvános. Az elsődleges cél egy pehelysúlyú, ugynakkor skálázható webszerver létrehozása volt, mely képes egy online tartalomszolgáltatónál felmerülő legtöbb problémával megbirkózni, például az ún. C10K problémával, a legtöbb akkori webszervernek ugyanis problémát okozott egyidejűleg több, mint 10 000 kapcsolatot kezelni.

Jelenleg az Nginx a világ harmadik legnépszerűbb webszervere, a 2012-es NetCraft felmérés szerint az összes mért oldal 12.07%-át Nginx segítségével szolgálják ki.

Az Nginx előnyei

De mi teszi oly népszerűvé ezt a furcsa nevű webszervert? Mi az, amiért egyre-másra jelennek meg leírások, tutorialok hozzá, ami a legbiztosabb jele egy termék népszerűségének?

Az egyik kétségtelen ok a gyorsaság. Az Nginx statikus fájlok kiszolgálásában és proxyként is sokkal nagyobb sebességgel szolgál ki elődjeinél. A Wordpress.com mérései szerint - megfelelő gép mellett - az átlagos 70000 req/s simán elérhető vele.

Ennek az egyik oka az, hogy az Nginx nem feltétlenül forkol mindig külön processzt vagy szálat az új kapcsolatoknak, ahogy pl. az Apache egyes feldolgozómoduljai (prefork, ITK) teszik, sőt erre nincs is szüksége, mert eseményalapú a feldolgozása, így nem csak több kapcsolatot, de több eseményt is le tud egyetlen feldolgozó szál kezelni. Ennek köszönhető egyébként az is, hogy hasonló terhelés mellett a memóriaigénye messze elmarad a klasszikus webszerverekétől. Erről bővebben itt lehet olvasni.

A másik oka az, hogy az Nginx sokkal agresszívebben cachel a memóriában az elődjeinél. Megfelelő konfigurálás és többé-kevésbé fix (nem, vagy ritkán változó) tartalom mellett elérhető az, hogy gyakorlatilag a memóriából történjen a kiszolgálás.

A pufferelés egyébként nagyon sokrétűen konfigurálható, ugyanakkor nem a legkönnyebben emészthető téma.

Előnye még a jó minőségű dokumentáció. A legtöbb modulnak nagyon részletes dokumentációja van, néhány konkrét használati eseteket is bemutat, mely teljes biztonsággal átvehető egy az egyben a saját konfigurációnkba.

További előnyeként szokták sorolni a konfigurációs fájl könnyű érthetőségét. Akik valamilyen C szintaxisú nyelvben (PHP, Perl, C/C++, Java, stb) programoznak, azoknak nagyon is ismerős lehetnek a blokkok és a sorvégi pontosvesszök, melyekből a konfiguráció felépül.

A következő cikkben az Nginx és a PHP kapcsolatát fogom bemutatni, és példákon keresztül szemlélteni

Avatar történelem

Este újra megnéztem az Avatar-t, éjjel pedig furcsa álmom volt. Gyakorlatilag továbbálmodtam a történetet, pedig ez ritka eset nálam.

Szóval, a sztori lényege az, hogy Jake, miután az emberek többsége elhagyja a bolygót, két ottmaradt tudóssal nekiáll felfedezni azt. Az gondolom már a filmből is mindenki számára világos volt, hogy ez gyakorlatilag egy hatalmas, dúsan burjánzó dzsungel. Ami nem, az az, hogy a bolygón vannak olyan helyek, “szent helyek”, ahova még a Navik se mennek túl sűrűn. Jake bemerészkedik az egyik ilyen helyre (amit persze a népe nem igazán helyesel, de nem igazán tiltják meg, bár figyelmeztetik őt a veszélyre). Mint kiderül, ezek a helyek valójában romok, egy fejlett, de letűnt civilizáció romjai.

Ha hasonlítani kellene, akkor a földi dél-amerikai civilizációhoz hasonlítanám, azonban annál sokkal fejlettebb, idősebb civilizációról van szó. Azt tudjuk, hogy a ma ismert Navik együtt élnek a természettel, igyekeznek minél kevesebb kárt okozni. Nos, elődeik kapcsolata a természettel ennél sokkal bonyolultabb volt. Bár ők is természetimádó nép voltak, azért az nem okozott nekik gondot, hogy a nagy erdőségekből kis ligeteket csináljanak, miközben terjeszkedtek.

No, de vissza a sztorihoz. Szóval Jake bemerészkedik az egyik ilyen romba, felderíti, és találnak pár érdekes leletet, köztük néhány vésetekkel teli kőtáblát. Ezeken főképp képek láthatóak, írás szinte alig, de annyit azért sikerül kiolvasni belőle, hogy itt egy fejlett civilizáció lakott, elég nagy lélekszámmal. Találtak néhány térképet is a holdról, illetve olyan szintű leírásokat az óriásbolygóról, ami egyértelművé teszi, hogy űrutazásra képes fajról van szó.

Egy másik romban, találnak egy furcsa, fallal lezárt helységet. Majd’ egy hónapjuk rámegy, mire sikerül kitalálni, hogy jussanak be. Bent két asztalt találnak, két-két székkel, a mennyezeten pedig fura díszítésű panelek lógnak a két asztal felett. Az egyik kutató, aki korábban azt próbálta meg kitalálni, hogy milyen jellegű mezőgazdasága volt a civilizációnak, fáradtan roskadt le az egyik székre… majd meglepően gyorsan el is aludt. Néhány perc múlva felébredt, és elmondta, hogy rájött a megoldásra, ilyen és ilyen eszközöket használtak, stb. Mivel erre vonatkozóan eddig semmilyen bizonyítékot nem leltek, persze mindenki kételkedett a szavában. Pár nappal később azonban felfedeztek pár mezőgazdasági témájú vésetet, ami pontosan megfelelt a kutató által vázoltaknak. Néhány további kísérlet után rájöttek, hogy a szoba egyfajta tudástárként működik, letölti a betérő fejébe azokat a válaszokat, melyekre kiváncsi.

Jake közben talál egy kötáblát, tele neveknek és dátumoknak tűnő vésetekkel. Ő is kipróbálja a szobát, és valami különös történik…

Az a tábla valóban neveket tartalmazott, méghozzá különböző uralkodók neveit. Amikor Jake leül a szobában, egy név jár folyamatosan a fejében, a szoba pedig hozzáférhetővé teszi számára ezen uralkodó naplóját. Mint kiderül, a Navik ősei nem volt egységes faj, az egyes klánok közt folyamatos volt a viszálykodás. Az az uralkodó, akinek a naplójához Jake hozzáfért, az utolsók egyike volt. A faj hosszú életű volt, a száz helyi év teljesen átlagos kornak számított, a mai embernél talán valahol 50-60 évnek felel meg. Az uralkodó naplójába gondosan feljegyezte az általa vívott harcok minden eseményét. Pusztító harcok voltak ezek, rengeteg áldozattal. A naplóbejegyzésekből azonban az is kiderül, hogy írójuk belefásult a harcba, értelmetlennek találja, ő maga már nem is nagyon támadt, csak a városát védelmezte. Mivel tisztában van azzal, hogy nem győzhet, összedob egy csapatot nőkből és gyerekekből, akiket beküld az egyik erdőbe. Pár évvel később egy - közelebbről meg nem nevezett - fegyver elpusztítja az egész civilizációt, a naplót író uralkodó is teljesen véletlenül menekül meg.

Csatlakozik a menekültek csapatához, és elhatározzák, hogy újrakezdik, de az alapoktól. Megtiltja, hogy visszamenjenek a romokhoz (nem mintha nagyon lenne miért…), és elkezdenek az ősi módon élni, gyűjtögetni, vadászni… Ő maga is csak egyszer megy vissza - a halála előtt nem sokkal -, hogy befejezze a naplóját.

A Navik faja tehát újrakezdés, visszatértek ősi gyökereikhez, és teljesen elfeledték a múltat.

Jake és csapata úgy dönt, hogy erről nem szólnak a Naviknak. Ha egyszer maguktól megtalálják a tudástárt, hát legyen, de nem látják értelmét annak, hogy ezt a népet megbolygassák ilyen szörnyű emlékekkel.

Rails - polimorf világ

Azért vannak dolgok, amikkel lehet szépeket szívni.

A feladat valami olyasmi volt, hogy kell egy újrafelhasználható “cím” osztály, ami külön táblára is képeződne le, hogy ne a megfelelő táblákat terheljük feleslegesen, plusz a címek amúgy se mindig kellenek pl. a felhasználókezeléshez. Azért kell újrafelhasználhatónak lennie, mert két különböző dolog is használ címeket a rendszerben.

Nem akarom nagyon húzni az időt, az alábbi kód született rá:

Polimophic user profile
1
2
3
4
5
6
7
8
9
class Address < ActiveRecord::Base
  belongs_to :addressable, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many  :addresses, :as => :addressable
  has_one   :billing_address , :as => :addressable, :class_name => 'Address', :conditions => { :billable => true, :shippable => false }
  has_one   :shipping_address, :as => :addressable, :class_name => 'Address', :conditions => { :shippable => true, :billable => false }
end

Erre kedves barátom azt mondaná, hogy szép baleset. És akkor még nagyon finoman fogalmazna. Nézzük, mik azok a buktatók, amin át lehet esni egy ilyet nézve:

  • A has_many asszociáció ugye azért kell, hogy legyen valami, ami polimorf. Elvben bele lehet suvasztani a has_one mellé is, de nekem egyébként is kell tudnom a címeket egyben lekérni, akkor meg miért ne emelném ki?
  • Az előbbi asszociáció alapján definiálunk két hozzárendelést. Ugye itt a hangsúly a :conditions hashen van, ez mondja meg, hogy a polimorf tömbből mely adatok kellenek (pontosabban, hogy az asszociáció alapján generált query-ben a WHERE feltétel hogyan bővüljön)
  • Az egyik trükk az, hogy mindenképp meg kell adni az osztályt is, ugyanis a has_one asszociáció nem kéri le ezt az infót a hivatkozott polimorf asszociációtól, hanem saját maga áll neki találgatni - természetesen rosszul.
  • A másik trükk pedig, hogy mivel ez egy kétparaméteres, egymást kölcsönösen kizáró feltétel, így mindkettőt meg kell adni, különben létrehozáskor előjöhet olyan csúfság, hogy valaki meghinteli a dupla false-t - vagyis úgy mentünk el pl. egy billing címet, hogy az elvész az :addresses tömb nevű fekete lyukban (van értelme amúgy a dupla false-nak is, csak abból nem billing meg shipping címek lesznek, hanem csak címek). Azaz, mentéskor a billing_address-en keresztül mentünk, de a mentés után a billing_address pont ugyanolyan nil lesz, mint előtte volt vala.

Azért ezzel is sikerült egy jó órát szívni…