2014. április 25., péntek

Craft

Vége az idei Craft-nak, a Prezi által szervezett software craftmanship konferenciának. Rengeteg nagyon érdekes előadás volt, és érdekes mód nem mindegyiken lehetett volna agile bullshit bingót játszani.
Az idei konferencián érezhető volt, hogy a fejlesztők között manapság divatos craftsmanship mozgalom kezd felnőni, és már nem csak az unalomig ismételgetett alapelvekben való vakbuzgó hit az általános. Az előadók jelentős része (köztük a két keynote speaker) hangsúlyozta, hogy bár az agilis módszertanok alapvetően jók és működnek, a vakon való követésük csak ritkán vezet jóra, ehelyett érdemes lenne újra az informatika tudomány vívmányaira is támaszkodni.
Több előadásban propagálták a funkcionális nyelveket (volt például egy nagyon érdekes előadás a kategória elmélet funkcionális nyelvekben való alkalmazásáról), és megismerhettem egy számomra eleddig ismeretlen módszert, a generatív tesztelést, ami formálisabb helyességellenőrzést tesz lehetővé, mint pl. a TDD.
Nagyon jó konferencia volt, és örülök, hogy a mozgalom nem a fanatikus agile-papság létrejötte (Uncle Bob Martin pápával az élen) felé tendál. A szoftvertechnológia még mindig egy fiatal ipar- és tudományág, nagyon kíváncsi vagyok, hogy merre fog haladni. Egyelőre nekem úgy tűnik, jó irányba.

2014. március 27., csütörtök

Facebook - Oculus Rift akvizíció

Figyelemre méltó dolog történt a napokban: A Facebook bejelentette, hogy felvásárolja az Oculus Rift-et (2 milliárt dollárért). Azt az Oculus Rift-et, ami másfél éve indult egy Kickstarter kampánnyal, és a célkitűzése, hogy megalkosson egy valóban jól használható VR eszközt (a régi modellekkel sok probléma volt). A fejlesztés teljesen open source, a köré épült fejlesztői közösség létszáma eléri a 75000 főt.

A Facebook valószínűleg a saját platformjába akarja beépíteni az eszközt, de még nem tiszta, hogy milyen módon. Klasszikus példája ez a kreatív közösség és az üzleti világ szimbiózisának: a közösség megalkot egy innovatív eszközt, amit aztán az üzlet felkarol, és elárasztja vele a világot. Lehet, hogy túl optimista vagyok, de én ezt a valódi (3D-s) cyberspace felé tett első lépésként értelmezem.
 
Érdekes adalék még, hogy a nemrégiben megjelent hír kapcsán, miszerint a Google felvásárolt egy robotgyártó céget, vannak elméletek, melyek szerint a Google talán egy mesterséges intelligenciát fejleszt. Ha ez igaz, akkor egy igencsak cyberpunk közeljövő elébe nézünk (amihez az NSA is nagyban hozzájárul :D).

2014. február 20., csütörtök

Python disassembly trükk

Amióta pythonnal foglalkozom, mindig hiányoltam annak a lehetőségét, hogy megnézzem, egy programkód pontosan milyen utasításokra fordul le végrehajtás előtt. Ez ugye egy C nyelven nevelkedett fejlesztő-palántának teljesen általános elvárás, az ember könnyen hozzászokik, hogy bármely olyan programrész esetén, ahol nem vagyunk biztosak benne, hogy adott architectúrán, adott fordítóval és opciókkal milyen gépi kód fog keletkezni, könnyen bele lehet nézni az assembly kódba. Ez sokszor debuggolás közben is jól jön.
Talán más python fejlesztők körében köztudott, hogy erre python esetében is lehetőség van, én csak most fedeztem fel a trükkjét. Mivel a python program általában interpretált módon fut (én is legtöbbször így használom), ezért sokszor nincs lehetőségünk a C nyelv esetében használt módon disassembly-t készíteni. Ha natívan futtatható állományt készítünk belőle, akkor a CPython réteg miatt lesz nehezen értelmezhető az assembly kód. Szerencsére van mód arra, hogy az interpreter által előállított byte-kódot kiírassuk olvasható formában, amit lentebb be is mutatok.
Felmerülhet, hogy mi szükség van a disassembly-re, ha egyszer a python interpreter VM-ben futtat, így a generált byte-kód úgyis minden architectúrán ugyanolyan (a kauzalitási sorrend persze fordított :) ). Ettől függetlenül egy olyan fejlesztőnek, aki még csak most ismerkedik a nyelv nyalánkságaival (mint én is), hasznos lehet a mélyebb összefüggések megértéséhez.

Példaként először nézzünk meg, hogyan történik a disassemblálás (van erre szép magyar szó egyáltalán?) C nyelvnél, GCC használatával. Vegyünk példának egy aprócska programot (add.c):

int main(void)
{
    int a, b;
    a = 1;
    b = a + 2;
    return 0;
}


Ezután assembly nyelvre fordítjuk (a példa kedvéért expliciten kikapcsolt optimalizációval):

$> gcc -S -fverbose-asm -o add.asm -O0 add.c

Megjegyzendő, hogy az assembly kódba GDB-n belül is belenézhetünk, sőt akár egyenként hajthatjuk végre az utasításokat a stepi/nexti parancsokkal.
A keletkezett kód a szokásos GCC-assembleres sallangokat figyelmen kívül hagyva tiszta és lényegre törő:

        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp    #
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp      #,
        .cfi_def_cfa_register 6
        movl    $1, -8(%rbp)    #, a
        movl    -8(%rbp), %eax  # a, tmp62
        addl    $2, %eax        #, tmp61
        movl    %eax, -4(%rbp)  # tmp61, b

        movl    $0, %eax        #, D.1590
        popq    %rbp    #
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
        .section        .note.GNU-stack,"",@progbits



Hogy néz ki ugyanez pythonban? A pythonnak ehhez külön modulja van, amit berántva könnyen megnézhetjük a generált byte-kódot olvasható formában. Legegyszerűbben az interaktív shell-ben tehetjük ezt meg:

>>> from dis import dis
>>> co = compile("a = 1; b = a + 2", "<string>", "exec")
>>> dis(co)
  1           0 LOAD_CONST               0 (1)
              3 STORE_NAME               0 (a)
              6 LOAD_NAME                0 (a)
              9 LOAD_CONST               1 (2)
             12 BINARY_ADD
             13 STORE_NAME               1 (b)
             16 LOAD_CONST               2 (None)
             19 RETURN_VALUE



Érdemes ezt kipróbálni a fontosabb vezérlési szerkezetekre (for, try, with, stb.), és megnézni, mit hogyan valósít meg a python a motorháztető alatt. Remélem segíthet ez a trükk néhány hozzám hasonló kezdő python fejlesztőnek, hogy mélyebben megismerje a nyelvet.

2014. január 14., kedd

Cicada 3301

2012 elején az interneten felbukkant egy feladvány-sorozat, amiről azóta sem derült ki, hogy ki/mi áll a hátterében. Elsőként egy 4chan-on megjelent képen kellett megtalálni egy elrejtett üzenetet, majd annak alapján jutottunk el a következőhöz, és így tovább. Azóta 2013-ban, és most 2014-ben is felbukkant egy-egy újabb feladvány.

Mivel a feladvány nyomai egymástól nagyon távoli helyeken bukkannak fel, ezért gondolják, hogy valamilyen nagyobb szervezet áll mögötte. Sokan azt tartják a legvalószínűbbnek, hogy valamelyik titkosszolgálat próbál ezzel embereket toborozni (a feladványok megoldásához a legtöbb esetben szükséges kriptográfiában, szteganográfiában, valamint programozásban való jártasság). Ez mindenesetre kizárja, hogy csak egy egyszerű marketingfogás lenne a dolog.

Az interneten közösségek alakultak, hogy közös erővel fejtsék meg a rejtvényeket. Eddig senki nem hallott olyanról, aki eljutott volna egy-egy fejtörő legvégéig, ami persze nem jelenti azt, hogy még nem is sikerült senkinek. Arról sincs senkinek információja, hogy mit kap az, aki megoldja.

Aki érez kedvet, megpróbálhatja az idei feladványt, ami igazi megvilágosodást ígér:

 

2013. december 27., péntek

Újra csak az NSA

Bár eddig nem volt rá bizonyíték, hogy az NSA a p2p titkosított kommunikációt is képes lehallgatni (így én is azt hittem határtalan naivitásomban, hogy a web-of-trust alapú PKI módszerekkel titkosított levelezésem biztonságban van), Buhera legutóbbi bejegyzéséből kiderül, hogy az NSA ezt a "problémát" is megoldotta. Ahogy azt sejteni lehetett, most sem a szakmai tudásuk (olyan ugyanis nincs nekik), hanem a politikai kapcsolataik és a pénzük vezette őket sikerre.

2013. december 16., hétfő

10min Space Strategy

Nemrégiben csatlakoztam egy indie játékfejlesztési projekthez, aminek a programozását egyedül végzem (egyelőre). Létezik belőle egy letölthető, működő verzió, de mivel a korábbi programozó elhagyta a projektet, és nem túl szép kódot hagyott hátra (pure C, DirectX 5, egyetlen 37ezer soros fájlba zsúfolt kód, stb.), ezért úgy döntöttünk, hogy újraírom az alapoktól, C++-ban, egy modern, multiplatform engine-re alapozva. Az első körös class- és package-terv elkészült, az implementáció pedig halad, ahogy az időm engedi. A projektről a Goblin Lunatics blogján lehet többet megtudni:

Goblin Lunatics

A játék zenéit pedig itt lehet meghallgatni:

Enter Hyperspace

2013. szeptember 23., hétfő

Function X 2013

Idén szeptember 13 és 15 között immár tizedik alkalommal került megrendezésre a Function X, Magyarország és kelet-európa legnagyobb demó party-ja. Újra összegyűlt a demoscene apraja-nagyja, régi és új arcok egyaránt. Egy dolog azonnal szembe ütköző volt, amint megérkeztük: már pénteken elfogytak a női Function-ös pólók, amiből azt hiszem levonható a következtetés, hogy immár elavult a sztereotípia a lányok és a kockák vonatkozásában. Ami azt illeti, én is két lányt vittem oda :D.
Péntek este mondhatni csak bemelegítés volt, a megnyitó után a játékfejlesztés compo jött, majd az Errorport koncert. Ők egy magyar együttes Bécsből, akik egy gitárral és egy hegedűvel tolják chiptune-os és egyéb elektronikus baseline-okra. Méghozzá elég durván. Közben az udvaron paprikáskrumpli készült kedélyes 8-bit zenére.
Másnap délben indultak az igazán érdekes programok. A fotó compo után előadások hangzottak el játékfejlesztés témakörben, amikről én sajnos lemaradtam, de bőven kárpótolt az utána következő grafika- és zenei verseny. A grafikai compón belül két kategória volt, handdrawn és freestyle. Mindkettőben születtek nagyon jó munkák, bár a freestyle pályamunkák között volt pár elég primitív. A zenék szintén nagyon jók voltak, Ziona igazán kiérdemelte az első helyet az Old Sample Maniac-el, mint ahogy Vincenzo is a másodikat az Eat my arp-al (amit saját bevallása szerint egy óra alatt csinált egy tracker programmal... amit el is hiszek neki, nem sok ideje jut mostanában entry-ket gyártani). Ezután következett, amire a legtöbben vártak: a SIDRip Alliance koncert. Ha valaki nem ismerné őket, ők régi játékok zenéit dolgozzák fel. Ahhoz képest, hogy "csak" egy hobbi-zenekar, profi rockbandaként viselkedtek a színpadon. A banda előadta Vincenzo egyik saját zenéjét is, a Rage of the emperor-t (soundcloud-on megtaláljátok), azon pedig külön meglepődtem, hogy a Supremacy zenéjére mennyien csápoltak.
Ezután következtek az igazán érdekes versenyek, a demo- és intro compók. A function az egyetlen demoparty, ahol van 256byte méretkorlátos compo, így hát jónéhány demo született erre a kategóriára, igaz, egy részük javascript-ben, amit én furcsállottam, dehát végülis nem muszáj mindenkinek DOS assembly-ben tolni. Utána a 64k-s intro verseny következett, ami viszont engem meglepett. Konkrétan azért, mert egy igazán kiemelkedő intro sem volt a party-n, ami akár megközelítette volna a néhány évvel ezelőtt készült 64k-s intrókat. A méretkorlát nélküli demo versenyen viszont nagyon erős volt a mezőny, szinte az összes entry nagyon ötletes és látványos lett. Bár még így sem okozott meglepetést, hogy a Fairlight nyert.
Összességében nagyon jó volt az idei Function, akit érdekel a demoscene, érdemes lesz jövőre is ellátogatnia. Ami biztos, hogy akkor már mi is az indulók között leszünk, több kategóriában is. Stay tuned ;).