Bináris fájlok
Sajnos a jó életnek máris vége abban a pillanatban, ahogyan egy készre konvertált állományunk van csak. Nem csak azért, mert a bináris kódot Neo tudja csak elolvasni, hanem azért is, mert ezek piszok nagyok is lehetnek.
Lássunk egy egyszerű példát, ami pl. a játékfordítók rémálma: kész a mű, tele van idegen nyelvű videóval. Valahogy rá kéne tenni egy feliratot, de az eredeti programozó erre nem készítette fel. Megkeressük azt a szoftvert, ami fel tudja dolgozni a videóink, majd azt is, amivel bele tudjuk sütni a szöveget... és itt jön a pofára esés: egy videó is több 100 MB. Ha javítani kell benne valamit később, ezt fel-le tölteni egy szerverről sem túl nyerő dolog. Főleg, ha több 10 ezres letöltésre lehet számítani. Ha történetesen a játék a miénk, akkor sem szeretnénk a szerencsétlen userre rávágni több 10 GB letöltést a saját hibáink miatt, a videónak pedig nincsen forráskódja, azt nem lehet darabokban kiadni újra, hogy rakja össze magának.
Mit tehetünk?
Nálunk okosabb emberek kitalálták, hogy két fájlt binárisan is össze lehet vetni, majd a belőlük képzett különbségeket elmentve lényegesen kevesebb helyet foglal a folt, mint a teljes állomány. Nagyjából arról van szó, hogy bitenként végigjárja a fájlunk a program, ahol pedig változás van, azt elmenti. Valójában ennél sokkal komplexebb rekurzív függvényekkel dolgozik, de ezt nekünk nem kell ismernünk.
A Linux alatt két csomag van telepítve a bináris patchek feldolgozása mellé: a bsdiff és bspatch.
Tegyük fel, hogy van tehát két videónk: egyikbe belesütöttük a feliratot. Menjünk most a Terminal-ba, majd adjuk ki a:
$ bsdiff video1 video2 video.p
..parancsot. Ha "ügyesek" voltunk, akkor az égvilágon semmit sem értünk el mert totál más kódolást választottunk a második videó mellé, így nem lesz egyezés. Ám, ha a két videó között, csak a feliratozott képek változtak, akkor most egy pár MB nagyságú fájlt kaptunk.
Mihez kezdhetünk vele? Nos, elküldhetjük a felhasználóknak, egy kis csomag kíséretében, ami a következőt tartalmazza majd:
#!/sbin/sh
bspatch video1 video2 video.p
exit 1
Mentsük is le RunMe!.sh néven a patch mellé és máris kész a normál méretű javítás. Persze írhatunk mellé sokkal komolyabb programot is, illetve máris megismerhetjük a bspatch modernebb verzióját, amit az Android rendszer OTA frissítései használnak főként.
A kis csomag apply_patch névre hallgat és ott lapul az összes Androidos készülékben, illetve a bináris x86 verziót letölthetitek itt is: Letöltés
A használata a következőképpen zajlik:
$ chmod +x applypatch_static
$ ./applypatch_static forrásfájl újfájl újfájl sha1 kulcsa újfájl mérete byte-ban
forrás sha kulcsa:path fájl
(Végig sordobás nélkül, ahogy ide sajnos nem fér el...)
Ez így elsőre elég meredek. Főként azért, mert az SHA kulcsokat nem tudjuk, főként nem azt a fájlt, amit most szeretnénk megkapni. Ám aggodalomra semmi ok, hisz mi adjuk a frissítést most vagy úgy kapjuk, hogy megkapjuk mellé az értékeket is.
Akasztják a hóhért... már nézni is rossz, de higgyük el, nagyon hasznos kis program!
Erre a fajta ellenőrzésre azért volt fokozottan szükség, mert garantálja mindkét (ki és bemeneti) fájl sértetlenségét az SHA1 kulcsok által.
Tipp:
Az SHA1 (Secure Hash Algorithm Version 1) kulcsokat mi is könnyen ellenőrizhetjük a Terminalban. Csak adjuk ki az:
$ openssl sha1 fájlunkneve
...parancsot. Máris láthatjuk a kimenetben a várt számsort, vagy éppen azt, hogy nem sikerült a művelet.
A cikk még nem ért véget, kérlek, lapozz!