Scriituri

Pentru că după închiderea ediției autohtone a PC Magazine începuseră să mă cam mănânce degetele, o să vă chinui retina aici, pentru început cu seria asta.

Lisp-uitori din toata tara, uniti-va

iPhone şi Palm Pre din perspectiva maimuței programatoare

Tocmai am apucat să arunc primul ochi succint peste documentația SDK-ului Palm Pre. Bine, ştiu că Palm Pre pierde din start. Nu e cool. Dacă ai tricou cu De puta madre 69 şi ai Palm Pre, nu eşti cool, ai doar un gadget de care toată lumea pare să mai fi văzut. Dacă ai iPhone eşti cel mai tare de la tine de la bloc. Dar totuşi am câteva gânduri de scris pe tastatură despre asta.

Mai întâi, lucrul extrem de plăcut la SDK-ul Palm Pre este că e uşor de învățat şi de început. Objective-C e scârbos. Arată ca o rață cu testicule legate de guşă şi picioare de hipopotam. Nu-i nici chiar C, nici chiar Smalltalk, şi în consecință te simți ca şi când IDE-ul C face mişto de tine şi te pune să scrii cod Smalltalk şi iners. CocoaTouch e un framework monstruos. Până scrii un HelloWorld trebuie să treci prin vreo 100 de pagini de documentație, din care jumătate numai ca să pricepi cum se foloseşte InterfaceBuilder şi de ce.

Palm Pre foloseşte HTML, CSS şi JavaScript. Pentru mine asta e destul de naşpa, fiindcă nu pot nicicum să înghit programarea web la nivelul ăsta, nu cu instrumentele de dezvoltare de la ora actuală. Parcă am revenit la a scrie aplicații Motif, doar că arată mai frumos şi nu trebuie să fiu atent la managementul memoriei — în rest e la fel de incomod şi de enervant. Avantajul e că pot să reciclez cunoştințele pe care le am deja, ceea ce în cazul CocoaTouch nu e cazul. Practic, e ca să înveți sa foloseşti eficient Palm Pre, trebuie doar să absorbi câteva convenții, să te uiți câteva ore pe exemple şi sa parcurgi succint documentația. Asta înseamnă să foloseşti tehnologii standard, iar ideea este, din punctul meu de vedere, salutară. Ca să înveți CocoaTouch trebuie s-o iei de la Adam (cu coastele deținute integral), pe când în cazul Palm Pre, majoritatea viitorilor dezvoltatori ştiu inclusiv cum să o învețe pe Eva să facă sex anal.

Al doilea lucru care mi se pare eminamente superb la Palm Pre este că platforma de dezvoltare nu este exclusiv OS X pe procesoare Intel şi ultima versiune punct. Adică, dacă ai un PowerMac G5 dual care încă se ține excelent, şi vrei să scrii programe IpodTouch, poți să-l vinzi şi să iei juma’ de iMac pentru că nu se poate — instrumentele respective nu există. Nu pentru că ar fi imposibil per se, ci pentru că nu vrea Apple (la fel ca majoritatea lucrurilor pe care nu le poți face cu produsele lor). Nu mai vorbesc de oropsiții care vor să facă asta şi n-au decât calculatoare cu Windows.

Ba mai mult, mi se pare foarte util şi faptul că platforma respectivă nu e legată de un anume IDE. Mă calcă pe nervi când cineva face asta. XCode e un IDE foarte bun, nimic de zis, dar sunt mai productiv cu Emacs. Nu pentru că Emacs e mai tare, pentru că e extensibil sau pentru că are o jumătate de chiuvetă în plus, ci pentru că îl folosesc dinainte ca Xcode măcar să apară. Blow me, Apple.

Singura chestie prohibitivă pentru mine e că, momentan, Palm n-a pus la dispoziție un SDK nativ. Nu e vorba numai de faptul că ideea de a scrie aplicații web prefăcându-te că ai la dispoziție tehnologie desktop mi se pare abjectă, ci de performanță în sine. De exemplu, visez de mai multă vreme să scriu un emulator (ca lumea) pentru, să zicem, C64, pe care să-l am cu mine pe un dispozitiv portabil. Pe iPod nu se poate pentru ca Apple nu vrea (şi evident respinge aplicațiile respective, deci it’s a no go). Folosind JavaScript presupun că se poate, dar ideea e că nu vreau să ruleze chiar ca C64 şi sa încarce un joc în cinci minute.

Oricum, vroiam să spun doar atâta: în stilul tipic pentru ultimii doi-trei ani de evoluție a celor de la Apple, Palm le-au dat o lecție excelentă despre cum se tratează dezvoltatorii. Desigur că pe băieții din Cupertino îi interesează foarte puțin asta, fiindcă piața lor e atât de mare încât, în calitate de code monkey, suport cu stoicism faptul că, la fiecare release al programelor lor, urinează pe mine de undeva din stratosferă (din păcate asta e o atmosferă întreținută de restul audienței Apple, care nu numai că suportă cu stoicism, dar aplaudă entuziasm când respectivii se pişă pe ei, cam ca adolescenții cu aere intelectuale la concertele lui Tudor Chirilă). Dar pe mine mă interesează asta, fiindcă SDK-ul Palm Pre chiar îmi face viața de primată mai uşoară.

Când user-friendly e prea user-friendly

Post-ul de față este între altele un exercițiu de diplomație, pentru că am alergat după problema asta vreo oră şi ceva. Nu sunt enervat, doar respir ceva mai repede :-) .

Treaba e cam aşa: am zis să iau taurul de coarne şi să învăț să lucrez cu CocoaTouch, adică SDK-ul folosit la dezvoltarea aplicațiilor pentru iPhone şi iPod Touch. Seamănă leit cu Cocoa, doar că e adaptat unei platforme ceva mai limitate. Taurul are nişte coarne destul de insipide pentru mine din punct de vedere “istoric”: am lucrat cu OpenStep înainte ca Apple să schimbe instrumentele de dezvoltare, şi nici atunci prea mult. Ceea ce a ajuns Cocoa acum seamănă cu ce țineam eu minte, dar numai cât să mă înşele, fiindcă de fapt s-au schimbat cam toate detaliile. Dacă NeXT pusese la dispoziție un Developer’s Guide absolut excelent, Apple are o documentație pe care, după ce o lecturezi o zi întreagă, vii acasă şi-ți bați nevasta, copiii şi mai ales soacra, pentru că e foarte multă, foarte detaliată, foarte prost organizată şi foarte prost indexată.. Ceea ce înseamnă că poți găsi orice dacă ai timp să cauți. De asemenea, până nu demult, nu exista cam nicio carte decentă. Rezultatul e că eu învăț să folosesc CocoaTouch cu toate că n-am reuşit niciodată să folosesc Cocoa cum trebuie şi am uitat cam tot ce ştiam despre Openstep. Pentru mine, standardul în domeniu este Qt, care mi se pare un framework excelent în ciuda faptului că stă călare pe C++.

Unul dintre instrumentele cu care NeXT a rupt gura târgului atunci când a lansat NeXTStep este ceea ce astăzi a ajuns la Apple ca Interface Builder (Cocoa este de fapt fostul NeXTStep — în caz că se întreabă cineva ce-i cu NS-ul din fața tuturor claselor). Interface Builder-ul ăsta este, după cum îi spune şi numele, un program cu care poți desena interfețele — numai că face ceva mai mult de-atât, după cum o să explic imediat.

În cazul Qt, “traseul” uzual pentru realizarea interfeței este (sau ultima oară când am lucrat cu Qt, acum câteva luni, era), în mare, cam aşa: se porneşte prin a plasa butoanele, meniurile şi toate celelalte în Qt Designer. Qt Designer generează apoi (automat) o clasă care reprezintă interfața, clasa respectivă fiind însă “chioară” (constructorul ei nu inițializează conexiunile evenimentelor din interfață cu acțiunile din cod — fiindcă n-are de unde să ştie care-s alea). Pentru a realiza conexiunile respective, maimuța din fața tastaturii trebuie să scrie o clasă care o moşteneşte pe cea generată, în care să realizeze conexiunile necesare, să “numească” delegații ş.a.m.d.. Conexiunile se pot realiza şi automat, via nişte constrângeri legate de denumire a funcțiilor, dar când am folosit Qt prima dată (asta fiind, ce-i drept, acum vreo cinci ani) trebuiau făcute manual.

Prin comparație, treaba în cazul Xcode şi IB e mult mai simplă: obiectele din interfață care trebuie accesate prin cod sunt declarate punându-li-se IBOutlet în față, iar acțiunile la care evenimentele din interfață sunt conectate se declară punându-li-se IBAction în față; scrii clasa obiectului care joacă rol de controller (outlet-urile fiind între variabilele instanțelor respective, acțiunile aparținând controller-ului ca metode, strunjite evident în bunul spirit al MVC), după care IB “se prinde” automagic şi faci conexiunile respective prin cel mai tineresc drag’n'drop posibil.

Avantajul e că toată treaba durează puțin şi că metoda e fantastic de flexibilă. Practic, numai pe seama sus-pusei integrări, se sare peste o grămadă de etape (ceea ce am schițat mai sus e numai în linii mari şi am sărit peste câteva amănunte).

Dezavantajul vine pe urmă, dacă ai făcut vreo trăznaie. În cazul meu, trăznaia în cauză a fost aceea de a greşi clasa unui view controller. Mai exact, conectasem un view la un controller care nu era al lui (era vorba de acelaşi tip de view — un picker — doar că unul avea două “roți” şi celălalt — una singură). Inutil de spus că nu mergea. Mesajul de eroare?

*** Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<DatePickerViewController 0x525a60> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key doublePicker.’

Din păcate, tot ce am înțeles din mesajul ăsta era că încercam să accesez valorile afisate de un DatePicker folosind cheia “doublePicker”, ceea ce mi se părea extrem de improbabil pentru că nu obişnuiesc să scriu programe când sunt beat mangă. Ok, să zicem că o exegeză mai atentă a textului m-ar fi convins că e vorba de altceva, dar tot nu e destul.

Problema cu care mă confrunt în momentul ăsta e că nu “văd” tot codul din spatele aplicației. E foarte tare faptul că o bună parte din cod e generată de IB şi de Xcode, dar eu nu sunt învățat să depanez altceva decât cod din ăla bătrânesc, cu text. Sursa problemei am găsit-o până la urmă, dar cu foarte mare greutate fiindcă era într-o fereastră din InterfaceBuilder.

Bineînțeles, vina e în principiu a mea, cu atât mai mult cu cât trecerea de la C şi ASM e foarte zgrunțuroasă pentru mine. Însă e interesant cum o parte din zgrunțul trecerii ăsteia vine din faptul că instrumentele cu care am de-a face au o paradigmă atât de diferită. Dacă aş fi făcut o greşeală de genul ăsta lucrând cu Qt, reflexul meu imediat ar fi fost să mă uit pe codul generat de Qt Designer şi moc, şi probabil că mi-ar fi luat cinci minute să mă prind de unde vine. Nu pentru că Qt e mai tare şi nici pentru că Apple sunt nişte capitalişti infecți, ci pentru că mintea mea e mai învățată cu liniile de cod decât cu imaginile. Pentru mine, nivelul ăsta de user-friendly e prea… user-friendly, şi trebuie să mă învăț :-) .

De ce vreau bursă şi semestrul viitor

De-asta: Eee Keyboard

Prin urmare va trebui să pun umărul contra exigenței tovarăşului Stanciu, profesorul meu de DCE. Merită patru nopți de muncit pe brânci la amplificatoare contra un Eee Keyboard? Merită!

Brb, mă duc să lucrez :-D .

Jucărie nouă

Am o jucărie nouă: un Amiga 500, cu o bună parte a întregului tacâm (mouse, da, mouse d-ăla pătrățos, joystick şi vreo 60 de dischete, plus upgrade-ul de la 512K la 1M de memorie). Ce-mi lipseşte e un monitor de la mama lui de-acasă (monitoarele VGA actuale nu mai sunt bune pentru asta), dar treaba s-a rezolvat printr-un A520 (adaptorul RGB->Video) şi un adaptor RCA->SCART. Scade ceva din calitatea imaginii, dar e rezonabil dacă stai destul de departe de televizor.

Poze dedesubt. Nu le mai fac, dom’le, ca pe vremuri.

All your search engines are belong to us

Haskell — Primele impresii

De două zile mă joc asiduu cu Haskell. Am mai făcut asta acum vreo patru ani, dacă nu mai bine, când din păcate documentația era foarte puțină, extrem de proastă (până şi standardul Haskell 98 era mai utilizabil, şi asta spune multe…) iar bibliotecile existente nu foarte bune şi nici foarte bine puse la punct.

Acum, învăț după Real World Haskell, care e o carte rezonabilă. Nu e grozav de bine organizată imho, iar exemplele ar fi putut fi mai real-world (comparativ cu Practical Common LISP, de exemplu, baza de date naivă cu CD-uri e mult mai rezonabilă decât pretty printer-ul JSON dezvoltat ca prim exemplu), dar oricum, comparativ cu ce mi-au văzut ochii acum patru ani, e foarte bună. Cât despre limbaj:

  • Îmi place foarte mult sintaxa; foarte curată d.p.d.v. matematic, şi în măsura în care nu e abuzată, foarte uşor de citit. Din păcate, există în carte câteva exemple de cazuri în care “curățenia” asta e dusă prea departe şi nu se mai înțelege nimic; totuşi, în măsura în care cel din fața tastaturii ştie cum să se exprime, rezultatul e ok.
  • Există vreo câteva aspecte de la care îmi iese fum pe urechi. Paradoxal, nu e currying-ul, care de fapt pare extrem de intuitiv (then again, funcțiile parțiale nu sunt un lucru nou pentru mine). Foldr-ul este în schimb :-) . De asemenea, lipsa unor structuri de date familiare mi-e destul de incomodă. Aşa că oricine a criticat ANSI CL pentru că e prea bloated este invitat să folosească Haskell, limbajul unde, pentru a implementa rezolvarea sistemelor de ecuații prin metoda Gauss, trebuie întâi să implementezi vectori şi matrici. Implicit, va trebui să mă joc un pic cu el ca să văd cum se comportă la operațiuni de number crunching (la care am de gând să-l folosesc, între altele).
  • Comparativ cu Common LISP sau cu Scheme, Haskell este în ansamblu extrem de neintuitiv. Există destule lucruri “de bază” în programarea imperativă, reținute pe bună-dreptate în majoritatea dialectelor LISP, care nu se regăsesc în Haskell. Nu e niciun corespondent 1 la 1 pentru structuri, vectori, diverse tipuri de bucle ş.a.m.d. — până şi tipurile de date efectiv reprezentate ca funcții. De-aici e o chestie de gust. Personal, îmi place ideea, mi se pare mult mai curată şi mai uniformă.
  • Ce nu îmi place şi prevăd că o să am multe ciocniri cu el este sistemul de tipuri. De când mă ştiu, am abuzat de el — am incrementat şi decrementat pointeri şi caractere, am afişat adrese şi multe alte drăcii. Sistemul de tipuri din Haskell mi se pare prea restrictiv, însă cel puțin din ce am lucrat şi văzut până acum, impactul e mai scăzut decât mă aşteptam.

Per total, cel puțin după primele două zile, am o impresie foarte bună despre Haskell. E curat, rezonabil de rapid, foarte bine documentat şi mult mai bine centralizat decât Lisp.

Ce se întâmplă, de fapt, în LHC?

Cu puțină întârziere, am terminat de scris drăcia asta. Din păcate, apocalipsa a venit mai înainte de asta (la mine s-a manifestat prin terminarea subită a borcanului de ness…), şi e puțin tardiv, dar sper să fie de ajutor.

Textul e într-o stare destul de brută. În particular, greşelile de ortografie sunt acolo nu pentru că sunt analfabet, ci pentru că n-am mai apucat să le corectez. Ştiu, desenele sunt magnifice. Orice sugestii şi corecturi sunt binevenite, şi le voi recompensa prin prezența într-o rubrică de mulțumiri.

Deci, aşteptând sfârşitul lumii, adus de The Large Hard-on… adică Hadron… Collider, să lecturăm.

În altă ordine de idei, profit de ocazie pentru ca, cu 12 minute înainte de miezul nopții, să-i urez amicului Sergiu, Împăratul Utopic al Balcaniei, un călduros la mulți ani. Împăratul schimbă prefixul. Să ne trăieşti, maestre!

Download aici: newfile11

Fişierul este PDF şi are vreo 200 KB.

(Edit: lipsa bibliografiei este neintenționată și se datorează faptului că am rătăcit cardul de memorie cu notițe. O voi posta imediat ce îl găsesc)

<b>Erată</b>

Până luni, când voi uploada o versiune actualizată cu adăugiri şi corecturi:

  • La pagina 6, referitor la energia întunecată, în loc de ,,materia nu este numai omogen distribuită ” se va citi: ,,energia întunecată nu este numai omogen distribuită”. Ştiu, ştiu, diferența e subtilă.

Un măgar încearcă Windows

Întrucât încerc să-mi aduc programul de somn în limite normale (a se citi: culcat înainte de opt dimineața, trezit înainte de două după-amiaza), am la dispoziție foarte mult timp pentru a medita la nemurirea sufletului, analiză functională şi alte asemenea probleme existențiale; aseară, tema de meditație a fost căutarea mediului de lucru perfect.

Să mă explic: de mai bine de zece ani de când am de-a face cu calculatoarele, caut sistemul de operare cu care mă înțeleg cel mai bine. Ironic e că BeOS, cu care chiar m-am înțeles cel mai bine, nu mai e prin preajmă, iar Haiku mai are ceva vreme până să-l pot folosi zi de zi. M-am mai înțeles bine cu Solaris şi FreeBSD; rezonabil cu Debian şi Gentoo. Extrem de prost cu Ubuntu, şi din ce-mi aduc aminte, de-a dreptul groaznic cu Windows. Şi totuşi (pentru că, după cum ziceam, am timp…), vreau să-ncerc din nou.

Prin urmare, marcați cu creta în calendar, zgâriați un perete etc., mâine dimineață îmi scot de la naftalină vechiul meu prieten, un Pentium 4 care încă se ține bine, şi îmi încerc norocul.

Mai pe larg: am constatat că relația mea cu sistemele de operare e de fapt destul de superfluă. În ce mă priveşte, poa’ să fie dedesubt şi Windows, şi Mach, şi Linux, şi FreeBSD şi orice alt kernel, că nu mă mişcă nicicum. Aplicații fără care nu pot trăi (şi care să nu fie extrem de portabile) n-am.

Sub Windows am mai lucrat sporadic în ultimii cinci ani — diverse proiecte de programare, am dat de el pe la facultate, m-am jucat Medieval: Total War 2 (pe laptopul stăpânit de taică-miu), dar cam atât. Nu l-am avut instalat pe niciunul din calculatoarele mele de ani de zile, şi nici nu i-am dus lipsa.

De ce vreau să-l încerc din nou? Păi:

  • E mai stabil decât ce ştiam eu. Referința mea în domeniu e Windows 2000, ultimul pe care l-am folosit pe calculatorul meu, şi asta vreme de vreun an cel mult. Cele mai pregnante amintiri le am de la Windows 98. Se înțelege ce insinuez.
  • Aplicații; doar câteva. Pe scurt, Mono e o glumă proastă, vreau să învăț Silverlight şi să joc Total War 2 :-) . Culmea, plângerile cele mai comune (…nu merge Office, de pildă), nu mă interesează: nu prea le am cu jocurile, nu folosesc Word (sau OpenOffice.org Writer, sau orice altceva de genul ăsta dealtfel), nu folosesc Fox Pro etc.
  • …de ce nu. Dacă pot pierde jumătate de zi instalând AROS, pot pierde jumătate de zi instalând Windows.

Îi dau o săptămână timp să mă “convertească” — cine ştie, poate ajung la concluzia că nu mai am nevoie de Mac Mini şi-l vând :-) . Nu-i dau mari şanse însă, pentru că de fapt belelele cele mai pregnante pentru mine nu s-au rezolvat:

  • Dezordinea. Eu sunt maniac. Mă enervează când aplicațiile îşi aruncă fişiere alandala. Sub *nix pot să şi le arunce oriunde — am un package manager. Sub OS X ştiu unde şi le aruncă şi pot face curățenie uşor (şi oricum, de vreme ce le instalez şi le folosesc ca regular user, restul discului rămâne neatins — cu câteva excepții, dar nu e deranjant). De asemenea, mă enervează inventivitatea directorului personal, care nu este /home/măgarul, nu este /Users/Măgarul, ci, for fsck’s sake, C:\Documents and Settings\Măgarul. Până scriu cârnatul ăla într-un terminal…
  • …care terminal, de fapt. Mă enervează lipsa unui shell de Doamne-ajută, cu instrumente care să-l facă şi util. Sunt o grămadă de lucruri pe care le pot face foarte uşor dintr-un terminal, dacă am cu ce, şi asta mult mai repede decât trecând prin toate ferestrele alea. A se adăuga celelalte probleme cronice ale cmd.exe. Nu, n-am încercat PowerShell.
  • Mentenanța. Eu am lucruri mai bune de făcut decât să pierd n ore pe săptămână căutând viruşi şi troieni, optimizând şi curățând sistemul şi regiştrii, updatând drivere şi alte asemenea. Nu mă interesează *de ce* se întâmplă asta (i.e. puteți să vă păcăliți în continuare că Windows e mai folosit şi e normal să aibă mai multe asemenea probleme); indiferent de meritele tehnice ale sistemului, prezente sau absente, singurii antiviruşi pe care-i ştiu sunt TBAV, Norton Antivirus şi NOD32. A se observa că TBAV e-n cap de listă.
  • Interfața. Ok, să zicem că se poate sări peste asta. Sunt blindat, am folosit Gnome.

Urați-mi succes :-) .

« Articole mai vechi