May 08 2008

The next episode… Encodings

Category: TechnicalRpx @ 15:02

Cu totii (sau ma rog… marea majoritate) stim ce e un charset si cum sunt reprezentate caracterele pe biti. Cine a avut Windows ’95 (si chiar ’98 daca nu ma inseala memoria)isi poate aduce aminte clar de problemele ce apareau atunci cand vroiai sa deschizi un document cu caractere diacritice si nu aveai configurat sistemul pe “Eastern European”. Cel putin de la Windows 2000 incoace, UTF-8 ne-a rezolvat marea majoritate a problemelor de acest gen.

Nu de mult, a aparut “pe piata” noul UTF-16.Bineinteles, cum era de asteptat, nu e chiar backwards-compatible cu predecesorul sau, UTF-8. E lesne de inteles, avand in vedere ca reprezentarea sa necesita de 2 ori mai multi biti… De unde apare si problema, dar de aceasta data “pă net”. De la ce m-am luat?

Prima zi la noul servici, dupa ce mi-am instalat sistemul, domnul Firefox a decis de la sine putere sa se autoconfigureze pe UTF-16. Care si cum, juma’te din site-urile web nu mi se mai deschideau. Adica se deschideau ele intr-o parere, dar aratau doar caractere de’ampulea si chinezarii. Printre aceste site-uri se numarau Yahoo! Mail si http://java.sun.com. Pana una-alta, dupa cateva ore de umplut frigidere cu carne si chinuit firefoxu’, am rezolvat problema (evident, setand FF’ul sa foloseasca UTF-8).

In actualul proiect, trebuie sa culeg informatii de pe un server de web. Paginile intoarse sunt in format XML, iar serverul (IIS of course, cum foloseste orice companie ce se respecta) “cunoaste” doar pana la UTF-8. Proiectul face uz de libxml2 care vine de felul sau si cu un engine micut de FTP/HTTP. Si am zis eu… “de ce sa nu-l folosesc? De ce sa ma chinui sa trag o pagina XML in 20 de linii cand pot sa o fac intr-o singura linie de cod?” Se pare ca inevitabil am aflat si raspunsul la aceasta intrebare…

Aparent, libxml2 cauta in sistem sa vada care e cel mai “vast” charset disponibil (evident UTF-16 pe mai toate sistemele Linux moderne). Nu stiu cum si ce face el ca sa converteasca pe acolo, insa rezultatul obtinut numai XML nu era (din nou… barzauni si chinezarii). Caut eu ce caut si gasesc prin doace ceva ceva… Fara a ramane mirat, aflu ca trebuie sa-i specific charsetul manual (dooh!). Dar, (intotdeauna exista un “dar”) pentru a face asta, trebuia sa creez un context HTTP, sa declar headere-le si modul de preluare (GET/POST) si toate celelalte balarii ale protocolului. Cu alte cuvinte, ajunsesem inapoi la cele 20 de linii de cod de care am incercat sa scap cu atat de mult zel.

Heh… cel putin merge :)


May 07 2008

Cu si despre pointeri…

Category: Miscellaneous,TechnicalRpx @ 22:47

Lucrez de o vreme la un proiect de dimensiuni relativ mari (pentru o singura persoana) si ma tot lovesc de diferite probleme si problemute. In general, nu dureaza prea mult pana la gasirea unei solutii, insa sunt niste detalii care uneori iti fac viata amara. Pointerii sunt unul dintre aceste detalii.

Cu totii stim de transmiterea parametrilor in C. Prin valoare, prin referinta… in functie de ce ne trebuie. Asta e clar… insa imaginati-va urmatorul scenariu:

Am un pointer (sa zicem la int). Am o metoda in care vreau sa modific adresa respectivului pointer. O solutie (aparent evidenta) ar fi:

void f(int* p){
p=10;
}
int main(){
int *p;
p=5;
printf("%d\n",p);
f(p);
printf("%d\n",p);
return 0;
}

Output:
5
5

Solutia corecta?

void f(int** p){
*p=10;
}
int main(){
int *p;
p=5;
printf("%d\n",p);
f(&p);
printf("%d\n",p);
return 0;
}

Output:
5
10

Deci teoretic (cat si practic) pentru a modifica adresa pointata de catre pointer, trebuie sa declar parametrul ca pointer-la-pointer si sa trimit la apel adresa variabilei pointer… Nu stiu cat de evidenta e varianta a doua pentru majoritatea coderilor in C, insa mie mi-a luat putin sa ma prind de ce pointerii mei nu-si modificau adresele retinute…


Apr 14 2008

Starcraft goes “No-CD”

Category: Miscellaneous,TechnicalRpx @ 14:56

Vesti bune pentru fanii jocului Starcraft.

Blizzard a decis sa nu mai ceara jucatorilor verificarea CD-ului Starcraft.

——————————————————————————–
– patch 1.15.2
——————————————————————————–

Feature Changes

– StarCraft and StarCraft: BroodWar no longer require the CD while playing the
game.  To play without the CD, please follow the following instructions:

– Windows Users:
– Make sure you have “Hide extensions for known types” unchecked under
Explorer Folder Options.
– If you own only StarCraft, copy “INSTALL.EXE” from the StarCraft CD to
your StarCraft folder and rename it to “StarCraft.mpq”.
– If you own StarCraft: Brood War, copy “INSTALL.EXE” from the StarCraft:
Brood War CD to your StarCraft folder and rename it to “BroodWar.mpq”.

extras din Patch notes

Pe langa elimitarea necesitatii CD-ului din unitate (sau a unei imagini pe hard), acest lucru va elimina necesitatea loader-elor virtuale sau a crack-urilor NO-CD si va permite in acelasi timp update-ul jocului fara a fi necesara si cautarea unor noi versiuni de crack/loader pentru cei ce nu s-au gandit sa cumpere jocul.

Acesta nu e primul exemplu de acest fel. In patch-ul 1.66, acum un an, Bioware a eliminat verificarea CD-ului in jocul Neverwinter Nights.


Apr 12 2008

Welcome back Demonoid!

Category: Miscellaneous,TechnicalRpx @ 11:58

Dupa cum bine stiti, acum 6 luni de zile, trackerul Demonoid a fost fortat de catre autoritatile canadiene sa isi inceteze activitatea.

Se pare ca intr-un final, dracusorul verde si-a regasit drumul spre utilizatorii sai pe 11 Aprilie, adica ieri :)

Inregistrarile de useri noi sunt inchise pentru moment, insa se pare ca userii vechi inca se pot loga.

Long live Demonoid!!


Apr 10 2008

To Xen… or not to Xen…

Category: Miscellaneous,TechnicalRpx @ 22:22

De 3 zile sunt intr-un foc continuu… Am de instalat 7 sisteme de operare in Xen. Poate ca n-ar fi fost chiar asa o mare durere de cap daca totul ar fi mers bine. Dar nuuuuu……

A trebuit sa inceapa totul prin update-uri. Dupa ce-am facut update la ultima versiune (sau mai exact, update managerul a facut), din motive “unknown” (citat de pe forum-ul Xen), nu mai pot alege placa de retea la crearea unei noi masini… eh… trecem peste… se poate modifica fisierul de configurare al masinii la mana.

Gata cu vreo 2 sisteme… apoi a venit “marea asteptare”. De ce? Pentru ca venise randul lui (b)ubuntu… Acest bubuntu-guy s-a dovedit a fi foarte precoce in a-mi bloca Xen-ul. Mai exact il bloca atunci cand boot-a de pe CD-ul de instalare. Cat am stat, cat l-am invartit, cat l-am frecat vreo 6 ore, am depistat problema intr-un BIOS-call care nu era suportat de Xen. Mai exact nu era suportat de procesorul Intel Core 2 Duo, fapt ce facea Xen-ul sa dea cu virgula. Acel BIOS call era responsabil pentru acel “splash screen” miraculos al CD-ului de instalare Ubuntu… asa ca a venit timpul sa-l scoatem din uz.

Mai usor de zis decat de facut. De ce? Pentru ca NU aveam cum sa editez prin metode conventionale o imagine ISO. Pana una-alta, am aflat de pe forumurile Xen ca exista un patch pentru imaginea de Ubuntu special pentru problema asta. L-am incercat azi dimineata si chiar a mers. Happy me :)

Happy me pana am ajuns la Fedora Core 8. Indivizii de la Redhat se pare ca s-au “molipsit” de la bubuntisti si au inceput si ei sa faca prostii cu BIOS-calluri. “Simplu.. caut patch-ul pt fedora” am zis eu retoric.

Iarasi… mai usor de zis decat de facut. Pentru FC8 nu exista inca asa ceva. Asa ca pune-te tu si fa propriul patch. Identificasem problema in fisierul isolinux/isolinux.cfg pe prima linie… Asa ca am luat frumos si am scris un scriptulet in Perl care sa-mi ia fisierul ISO la puricat si sa-mi caute pe ce pozitie este acel string. Apoi mai trebuia inlocuita prima litera din string cu # ca sa il considere comentariu. Et voila… I’m installing FC8 right now.

Pe langa astea, mai am de pus doar Debian 4 si vreo 2 BSD-uri. Din cate am vazut, DVD-ul cu debian porneste fara probleme pe Xen, deci n-ar trebui sa ma ingrijorez.

Insa adevarata distractie….. adevarata distractie…. vine cu BSD-urile…. Acolo o sa fie porno tare faza avand in vedere ca Xen nu suporta BSD in mod oficial. Si daca la sistemele astea care chipurile sunt suportate in mod oficial m-am chinuit mai rau ca un chinez, nici nu vreau sa stiu ce ma asteapta odata cu BSD-urile alea.

Bine macar ca vine weekend-ul…


Apr 04 2008

Wallpaper pentru pasionati

Category: TechnicalIuliana @ 17:12

Am gasit un wallpaper super dragut si care se potriveste cat de cat domeniului in care lucrez si de care sunt pasionata. Si mi-am zis sa il impart cu cei care ar putea fi interesati. (Pe mine privirea pinguinului ma amuza tare :) )
eclipsewallpaper.jpg


Apr 04 2008

Problema cu furnicile

Category: TechnicalIuliana @ 9:41

Problema: Se da un triunghi. In fiecare colt al triunghiului se afla o furnica. Daca se considera ca aceste furnici se pot misca doar pe laturile triunghiului, care este probabilitatea unei coliziuni in timpul deplasarii lor?

Rezolvarea matematica: Probabilitatea ca o furnica sa se miste in oricare din cele doua directii este de 1/2. Fiind vorba de trei furnici, fiecare cu cate 1/2 probabilitate de a urmari oricare din cele doua directii, probabilitatea se calculeaza in felul urmator: [(combinari de 3 luate cate 1) + (combinari de 3 luate cate 2)] * (1/2)*(1/2)*(1/2) = 6/8 = 3/4.

(Pentru generalizare: cosiderand un poligon cu n laturi, probabilitatea de coliziune va fi: [(combinari de n luate cate 1) +…+(combinari de n luate cate n-1)]*[(1/2) la puterea n])

Rezolvare inginereasca: Putem considera furnicile ca fiind variabile cu doua stari, (0,1), reprezentand cele doua directii posibile in care se pot deplasa furnicile. In cazul asta triunghiul cu cele trei furnici poate fi considerat un automat cu 8 stari determinate de cele trei intrari(000,001,010, 011, 100, 101, 110, 111). Avand in vedere ca cele trei furnici nu se vor intalni daca toate aleg aceeasi directie de deplasare din start doua stari nu ne intereseaza (000,111) si atunci raman 6 cazuri in opt, in care macar doua furnici isi aleg directii opuse de deplasare. => Probabilitatea de coliziuneeste 6/8 = 3/4.

(Pentru generalizare: daca o sa avem un poligon cu n laturi si n furnici stiind ca fiecare furnica are doua posibilitati de deplasare, vom avea intodeauna 2 la puterea n stari, din care doua vor caracteriza intotdeauna cazurile in care furnicile nu se intalnesc, deci probabilitatea de coliziune va fi [(2 la n) -2]/(2 la n)).