Tutorial Freeswitch

December 30th, 2008 Alex

Freeswitch este o platformă pentru VoIP foarte flexibilă şi puternică.

Am scris un tutorial de publicat pe viitorul blog.sinapticode.ro, dar până una alta, o versiune iniţială (ce mai are nevoie de finisaje) găseşti aici: http://alexn.org/docs/dialer.html.

Posted in learning, tips&tricks | No Comments »

Pasiune pierdută

July 19th, 2008 Alex

Odată cu primul calculator am început să-mi cumpăr și reviste din domeniu … în primul rând CHIP, deoarece căutam informați despre noutăți în hardware, în software, dar mai ales deoarece CHIP se livra cu un CD pe care găseai bunătăți.

O nestemată pe care am găsit-o pe CD-urile CHIP și care m-a proiectat definitiv pe calea informaticii este o serie de tutoriale despre modul grafic 13 hexa cu Turbo Pascal + Asamblare ca limbaje de programare. Turbo Pascal era limbajul care ne era predat la școală, și făcusem rost de o copie ilegală pentru calculatorul de acasă.

Tutorialele sunt scrise în format txt cu același stil pe care îl folosesc azi oamenii pe bloguri, și sunt semnate de către DENTHOR of ASPHYXIA, aka Grant Smith. Știu, Internetul a născut o grămadă de nickname-uri amuzante (al meu era bonefry).

Și aventura a început de la …

Procedure SetMCGA;
  BEGIN
    asm
          mov     ax,0013h
          int     10h
    end;
  END;

Îmi amintesc cum pierdeam nopțile lucrând la demonstrați grafice, și deși aveam cu ce mă mândri, nu am arătat decât prietenilor foarte apropiați. Aș fi vrut să particip la un demoscene (tot pe CD-uri CHIP mai găseam demonstrați de la astfel de evenimente), dar eram prea timid pentru asta, și oricum eram total rupt de lume. Mai mult, din păcate harddisk-ul calculatorului meu și-a dat eventual duhul, și mi-am pierdut toată munca.

De ce pasiune pierdută?
Deoarece extazul din acea perioadă nu-l mai simt decât într-o mică măsură, și cam are de-a face cu rahaturile de proiecte la care ajung românii să lucreze (că doar nu ne caută lumea degeaba … suntem ieftini și tolerăm rahatul). La Adobe este OK, dar perioada în care am fost angajat înainte de a ajunge la Adobe mi-a lăsat cicatrici (și se întreabă lumea de ce plecăm din țară).

Mi-am amintit cu plăcere de acea perioadă, și am căutat cele 10 tutoriale, reprezentând o bucățică de amintire pe care nu aș vrea să o pierd. Sunt fericit că le-am găsit, și sunt uploadate pe serverul meu la:

http://lexoft.eu/asphyxia/

Pentru compilare am încercat FreePascal, dar nu merg fără modificări, în principiu deoarece codul a fost scris pentru procesoare 386 ce rulează în modul standard, pe 16 biți. Și în primul rând că trebuie să setezi flaguri pentru selecția arhitecturii.

Începătorii nu cred că mai sunt interesați, acum existând alternative mai high-level precum PyGame, SDL, iar pentru programatori pe Windows ar fi XNA. Dar oricum, dacă aveți curiozitatea eu zic că merită să arunci o privire la felul în care erau create jocurile în anii 80-90. Eu am intrat în posesia lor prin anul 96 (dacă nu mă înșel) și deja DirectX apăruse, dar așa cum am mai spus, acces la Internet nu aveam, și oricum mă bucur că am gustat din plăcerile programării low-level.

Și deh, totul era mai simplu pe vremuri … n-aveai IDE cu intellisense, n-aveai zeci de layere de abstractizare deasupra hardware-ului, și aveai ocazia să te ocupi de detaliile low-level care sunt chiar fun.

Lista, în ordine, este următoarea:

  1. The Basics - Text / HTML / Package
  2. The Pallette - Text / HTML / Package
  3. Circles and Lines - Text / HTML / Package
  4. Virtual Screens - Text / HTML / Package
  5. The Scrolling Saga - Text / HTML / Package
  6. Pre-generated arrays - Text / HTML / Package
  7. Animations - Text / HTML / Package
  8. Optimisation and 3D - Text / HTML / Package
  9. 3D Solids - Text / HTML / Package
  10. Chain 4 - Text / HTML / Package
  11. Crossfade - Text / HTML / Package
  12. Full Screen Scrolling - Text / HTML / Package
  13. Starfields - Text / HTML / Package
  14. Glenzing, faster polys, fixed point and assembler - Text / HTML / Package
  15. Plasmas - Text / HTML / Package
  16. Scaling - Text / HTML / Package
  17. Pixel morphs and statics - Text / HTML / Package
  18. PCX Files and File packing - Text / HTML / Package
  19. Assembler and Fire - Text / HTML / Package
  20. 3D hidden face removal and face sorting - Text / HTML / Package
  21. Free direction texture mapping - Text / HTML / Package

Enjoy ~

Posted in learning, passion | 5 Comments »

Dragonul lui Heghway

July 6th, 2008 Alex

Am vrut să mă detașez un pic de problemele normale de servici, și să mă reîntorc la fascinațiile ce mi-au cucerit inima cândva :)

Mi-a venit idea să desenez un fractal, nimic pretențios, doar geometrie elementară ce presupune rotații, intersecții, și translații. Mi-a și ieșit ceva, însă rezultatul este prea urât ca să-l arăt momentan … încerc să-l fac să semene cu un pom real. Așa că am revenit la ceva mai simplu, și mi-am amintit de dragonul lui Heghway.

Navigând pe net am găsit și un algoritm descris de Knuth în „Arta programării calculatoarelor”, iar individul al cărui blog îl indic descrie următoare implementare în Python …

def create_dragon_set(n):
    """calculate the dragon set, according to Knuth"""
    s = set([0.0+0.0j])
    for i in range(n):
        new_power = (1.0-1.0j)**(-i)
        s |= set(x+new_power for x in s)
    return s

Încă n-am descoperit magia din spatele algoritmului (probabil trebuie să citesc capitolul corespunzător din Knuth), dar algoritmul este atât de concis scris că este aproape echivalent notației matematice.

Aș fi vrut să transform programul într-o animație Flex, și ar fi fost bestial, dar când am început rescrierea am descoperit că ActionScript nu are suport „out-of-the-box” pentru numere complexe, pentru seturi de date (unice) sau pentru list-comprehensions. Și ar fi arătat foarte urât … m-aș fi simțit nașpa să stric astfel de frumusețe.

Rezultatul pentru 5 iterații …

Pentru 7 iterații …

Pentru 10 iterații …

Pentru 12 iterații …

Pentru 19 iterații (și mărit pentru plăcere sporită) …

Putea fi, cum am spus, construit recursiv-geometric, și poate reușesc până la urmă să folosesc Flex la un task pentru care se potrivește.

Posted in learning, passion | No Comments »

Citesc…

April 26th, 2008 Alex

Citesc 2 cărți momentan (simultan, în funcție de chef):

Săptămâna trecută am citit …

Cartea „Pragmatic Programmer” este destul de bună, cu sfaturi de bun simț, problema fiind că majoritatea sfaturilor prezente în carte le știam deja din experiență, sau din alte cărți sau reiterate în diverse bloguri, și nu pot spune că mi-a deschis orizonturile în vreun fel, dar cu siguranță merită citită … de cele mai multe ori știm ce este bine pentru noi, cum ar fi să mâncăm sănătos, sau să facem mișcare regulat, sau că țigările ne fac rău, dar capacitatea noastră de a fi serioși și de a face „ceea ce este bine pentru noi” este cu siguranță limitată, așa cum și atenția și timpul sunt resursele cele mai limitate cu care ne confruntăm. Astfel sfaturile bune merită reiterate, până când ne convingem subconștientul că un sfat bun merită aplicat.

„Programming Collective Intelligence” este foarte interesantă, și deși n-am citit mult din ea, chiar îmi place și pot spune că merită citită. Nu este o carte foarte teoretică, deși oferă referințe pentru cei ce vor să afle tainele din spatele algoritmilor. În schimb cartea oferă și explică algoritmi implementați în Python pentru recomandări, clustering, decision-trees, și multe alte subiecte interesante ce țin în general de data-mining.

„Learning Antlr” este despre tool-ul Antlr, evident, și deși evit să citesc cărți despre unelte, cartea merită citită deoarece tutorialele despre Antlr de pe net cam lipsesc, și deși Antlr este practic cel mai intuitiv generator de parsere (mult mai intuitiv decât combinația Lex/Yacc), are anumite cazuri și opțiuni mai obscure ce nu pot fi decât aflate din carte. M-am apucat să lucrez cu Antlr deoarece sunt fascinat de compilatoare și de „domain-specific languages”, dar nu am suficient timp pentru a implementa „de la zero” parsere pentru ideile pe care le am momentan. Am și un mic proiect, pe care sper să-l pot lansa ca open-source, dar despre asta voi vorbi altă dată.

Din păcate timpul nu prea-mi permite să citesc aceste cărți mai rapid, și este foarte nasol mai ales că vreau să mă apuc de o grămadă de chestii.
Cărțile astea două, deși extrem de interesante, nu prea am timp să le citesc (mai ales că sunt cărți practice), și probabil îmi va lua ceva timp.

Mi-am cumpărat și un iPod ieftin (Nano, de 4 GB) și-l folosesc pentru a mă uita la prezentări video și pentru podcast-uri în metrou. Cum pierdeam 2-3 ore pe zi într-un București aglomerat și sufocant, m-am gândit că ar fi cazul să pierd timpul mai cu folos. Astfel am reluat seria de cursuri SICP, și chiar îmi părea rău că rămăsesem la episodul 6a. Am mai downloadat și de pe YouTube seria introductivă despre Cluster Computing and MapReduce, și o grămadă de alte prezentări de la Google Tech Talks … majoritatea destul de interesante.

Mai citesc și beletristică :) și ultima oară am citit „Dune” de Frank Herbert. Nu o citisem și eram chiar curios dacă îmi place, mai ales că este o serie lăudată, care a fost și ecranizată, simțindu-mă vinovat că n-am citit-o. Dar din păcate a fost o mare dezamăgire, toată cartea concentrându-se pe Lady Jessica, o Bene Gesserit fabuloasă, și deasemenea, pe a sa progenitură Paul Atreides și pe remarcabila pregătire oferită de măsa, și de tasu, devenind mentat și-ntr-un final cucerind imperiul cu supușii săi fremeni … o nație dezgustătoare ce-și bea propria salivă. Toată cartea se concentrează literalmente pe cât de minunat este Paul împreună cu măsa, și sincer, cât de greu este să-ți imaginezi o planetă plină de deșert, cu viermi uriași?
Al doilea roman din serie am încercat să-l citesc, dar din păcate n-am mai rezistat după primele două capitole.

Voi ce cărți de specialitate (sau nu) ați mai citit? Ce-mi recomandați?

Posted in learning | 5 Comments »

Alex = Alex + 1

November 20th, 2007 Alex

It always takes longer than you expect, even when you take into account Hofstadter’s Law.

Hofstadter’s Law

Mă simt limitat de paradigmele cu care am fost obișnuit lucrând cu Java sau C++ și-mi simt limitările când programez în limbaje mai funcționale gen Javascript, Ruby sau Python. Desigur, toate 3 acceptă aceleași idiome, dar degeaba folosești limbaje de scripting dacă nu-ți schimbi mentalitatea.

Cu părere de rău mă surprind mereu traversând vectori în javascript folosind

for (var i=0; i<arr.length; ++i) …

Sau în Python mă trezesc căutând maximul unui șir folosind:

for i in range(0,len(arr)): if max < v[i]: max = v[i]

Lame.

Limbajele cu metafore funcționale sunt special proiectate pentru definiții recursive iar eu nu sunt antrenat să gândesc recursiv.
Sunt un “blob programmer” și este timpul pentru o operație pe creier :)

Am început să studiez Structure and Interpretation of Computer Programs (Abelson & Sussman). Este cursul de computer science introductiv de la MIT, și deși este considerat a fi de nivel introductiv, este extrem de bun la introducerea de tehnici recursive de programare.

Limbajul folosit în curs este Scheme, un dialect de LISP extrem de ușor de folosit și de învățat. Și deși aveam o idee extrem de bună despre capabilitățile de meta-programare din LISP, singurul limbaj de programare high-level unde diferența dintre structuri de date și proceduri nu există - dar nu aveam idee până unde se ajunge.

Un concept care mi-a spart toate perspectivele este că Scheme poate fi definit complet în termeni Scheme … fiind astfel recursivă chiar și definiția limbajului. Pentru a exemplifica voi defini principalele proceduri pe care se bazează programarea în Scheme folosind tot Scheme …

Să definim o procedură ce ia ca parametru o listă și un scalar și înmulțește fiecare element cu acel scalar, rezultatul fiind tot o listă.

Pseudocodul ar fi:
1. daca lista este nula atunci returneaza o lista goala, altfel …
2. extrage primul element din lista si inmulțește-l cu scalarul
3. executa recursiv metoda pentru restul listei (in afara de elementul extras)
4. concateneaza rezultatul de la pasul 2 cu lista rezultata la pasul 3 si intoarce
rezultatul

Codul în Scheme este …

(define (scale-list s l)
(if (null? l)
nil
(cons (* (car l) s)
(scale-list s (cdr l)))))

Codul este destul de citibil dacă clarificăm funcțiile folosite …

  • funcția (cons a b) returnează o pereche (aka listă) formată elementele a și b
  • funcția (car L) returnează primul element din listă astfel încât (car (cons a b)) => a
  • funcția (cdr L) returnează al 2-lea element din pereche (restul listei în afară de primul element), astfel încât (cdr (cons a b)) => b
  • funcția (null? L) returnează adevărat dacă lista dată ca parametru este goală

În mod normal cons, car și cdr folosesc primitive predefinite din LISP (aka liste), dar le putem redefini în termeni de proceduri (fara să avem nevoie de primitive magiceale limbajului) astfel -

(define (cons a b)
(lambda (nr)
(if (= nr 1) a b)))


(define (car list)
(list 1))

(define (cdr list)
(list 2))

Mai sus am definit cons ca fiind o procedură ce întoarce o altă procedură, procedură ce acceptă un parametru ce indică indexul elementului (din cele 2 elemente) ce trebuie returnat. Procedurile car și cdr iau ca parametru această procedură creată de cons și o apelează pentru a returna cele 2 elemente.
Pentru a înțelege conceptul mai bine, hai să scriem același cod în Python -

def cons(a,b): return lambda(nr): a if nr==1 else b

def car(list): return list(1)

def cdr(list): return list(2)

OK, parcă aud … și ce dacă?

Eh, păi hai să dăm definiția unei liste ce conține toate numerele de la 1 la 4 (o terminăm cu un null) …

(define 1-to-4
(cons 1 (cons 2 (cons 3 (cons 4 nil)))))

sau în Python …

one_to_four = cons(1, cons(2, cons(3, cons(4, False))))

Și revenind la funcția scale-list, am putea generaliza procesul …

(define (map p l)
(if (null? l)
nil
(cons (p (car l))
(map p (cdr l)))))

iar functia originala o putem defini astfel:

(define (scale-list s l)
(map
(lambda (x) (* x s))
l))

Plecând de la cons, car și cdr, funcții ce îndeplinesc următorul contract -

  • (car (cons a b)) => a
  • (cdr (cons a b)) => b

putem defini orice structuri de date high-level, indiferent de complexitate, deoarece funcțiile returnează tot obiecte ce pot fi combinate cu alte obiecte (adică în termeni matematici obiectele din LISP sunt închise sub operațiile cons, car și cdr), adică funcțiile pot combina orice structuri de date ar fi conținute de variabilele a sau b. În curs se dă un exemplu de operație din alt limbaj de programare ce nu este închidere pentru obiectele limbajului - în Fortran poți avea vectori de primitive, dar nu poți avea vectori de vectori.

Este într-un fel trist deoarece astfel de tehnici sunt cunoscute din anii 70-80, iar abstractuzările posibile sunt nelimitate. Dar nu spuneți managerilor voștrii asta ;)

Toate aceste definiții vin din SICP. Cursurile video și cartea sunt disponibile gratuit online.

Posted in edu, learning | 5 Comments »