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.
I'm writing about what am I up to currently, in hungarian, my beautiful mother language :).
2014. február 20., csütörtök
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:
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
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 ;).
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 ;).
2013. augusztus 30., péntek
SIDBox Phase One
A SIDBox projektem első fázisa a végéhez közeleg. A projekt célja, hogy építsek egy áramkört a SID (a C64-ben is használt hang-chip) köré, és azt parallel porton a számítógépre kötve hangokat tudjak megszólaltatni, zenét tudjak lejátszani, stb. A saját megvalósításom a H.A.C.K. SIDBox projektjén alapul, az első tervem csak annyi volt, hogy az ottani tervek alapják építek egy sajátot, majd a szoftvert kiegészítem pár extra funkcióval.
Ehelyett az lett az egészből, hogy az áramkört kiegészítettem egy második SID chip-el (így rá lehet rakni egy 6581-est és egy 8580-ast is), át lett tervezve a teljes analóg jelformáló rész, és ennek megfelelően készítettem egy teljesen új, immáron két rétegű nyákot hozzá. Most jutottam el abba a szakaszba, hogy a tervek készen vannak, már csak meg kell venni az alkatrészeket, legyártatni a nyákot, és összeforrasztani. Aztán imádkozni, hogy működjön :).
Az új design megtartotta a legacy funkcionalitást (értsd: továbbra is lehet egy chipet vezérelni, és azt egy jack kimeneten hallgatni), de a második chip hozzáadásával kibővültek a lehetőségek. Hozzáadtam egy jack bemenetet, ami az első SID AUDIO_IN-jére van kötve, a chip kimenete pedig második SID bemenetére, majd ennek a kimenete megy a SIDBox jack kimenetére. Így mixelhető a két chip, és egy harmadik külső hangforrás kimenete is. Az egy- és két chip-es üzemmód között egy fizikai kapcsolóval lehet váltani. Ezen kívül kapott két-két potmétert is a cucc, amik a SID-ek belső A/D átalakítóira vannak kötve.
Legalábbis ez az elképzelés, ha összeraktam az áramkört, meglátjuk, hogy tényleg működik-e :). Külön köszönet illeti Varjasi Ferenc kollégát, aki rengeteget segített az áttervezésben. Nélküle aligha sikerülhetett volna idáig eljutnom.
A projekt második fázisa az lesz, hogy a H.A.C.K-esek python-ban írt SID library-jét kiegészítem úgy, hogy az én kütyümmel is működjön, majd befejezem a SIDBox Player-em, amivel sid zenei fájlokat lehet majd lejátszani az eszközön. Ebből egyelőre csak egy C64 disassembler modul (ami C64 binárist C64 assembly-vé alakít) van kész.
Alant megtekinthetitek a kapcsolási rajzot és a nyák terveket.
2013. május 26., vasárnap
Digital Media Manifesto
1.)
Man has created the myth of the computer in his own image. Or one of
them. Cold, immaculate, sterile, scientific, oppressive.
2.) You can, and must, understand computer-self.
3.) The guardianship of the computer can no longer be left to priesthood.
4.)
Technology is an expression of man’s dreams. If man did not indulge in
his fantasies, his thoughts alone would inhibit the development of
technology itself. Thus it is for the holiness of the human spirit that
we must design.
5.)
All media are extensions of some human faculty: psychic or physical. It
matters because we live in media, as fish live in water.
6.)
The new media are not bridges between man and nature; they ARE nature.
Media on the one hand, and man on the other, are inseparably linked by
an endless feedback loop.
7.)
We’re living through a radical transformation of our communications
environment. Enjoy and listen with all ears and eyes wide open.
8.)
As the unity of the modern world become increasingly technological,
rather than a social affair, the techniques of the arts provides the
most valuable means of insight into the real direction of our own
collective purposes.
Feliratkozás:
Bejegyzések (Atom)





