Pagini

2013-01-20

Instalare Clozure Common Lisp pe Raspberry Pi

Mi-am luat o jucarie noua, un Raspberry Pi model B, cu 512 MB RAM si mi-am dedicat un weekend configurarii lui. Imi place mult cum arata, si e la un pret mai mic decat majoritatea celorlalte calculatoare similare.

Se poate porni usor cu ghidul de pe raspberrypi.org. Am descarcat Raspbian, l-am dezarhivat si apoi copiat pe un card SD mai incapator folosind Win32 Disk Imager.




I-am pus un cablu HDMI, tastatura USB, alimentator, am montat card-ul si apoi l-am pornit bagand alimentatorul in priza. Dupa ce a boot-at a pornit automat raspi-config, program in mod text in care poti sa configurezi diverse chestii, cum ar fi tastatura, fus orar (timezone) si altele, dar mai ales sa dai comanda expand_rootfs - imaginea scrisa cu Win32 Disk Imager ocupa in mod initial doar 1.9 GB, comanda asta o expandeaza pe tot spatiul card-ului SD. Tot de aici poti sa ii spui daca sa porneaza automat in LXDE sau in linie de comanda.

User / parola: pi / raspberry. E recomandat sa schimbi parola, combinatia asta se gaseste in foarte multe locuri pe internet si ar fi pacat sa intre lumea rea sa-ti ceva.

Poti sa dai comanda startx pentru a porni interfata grafica, am fost curios sa vad cum arata, este vorba despre LXDE, pe ecran sunt scurtaturi pentru Midori (browser web), IDLE (mediu de programare pentru Python), LXTerminal (linie de comanda), niste jocuri si un link catre documentatie. Din cate inteleg Pi-ul e capabil sa redea cursiv filme 1080p, dar nu prea m-a interesat momentan sa vad ce si cum - pentru filme cred ca ar putea fi mai nimerita imaginea de Raspbmc. Midori este un browser mai spartan, teoretic rapid. Zic unii ca poti sa ajungi sa te dai pe Youtube cu combinatia asta, daca muncesti un pic, e suficient sa instalezi gnash si browser-plugin-gnash folosind sudo apt-get.

Paranteza: poti instala pachete pregatite pentru Debian folosind comenzi in genul sudo apt-get install <pachet>.

E destul de dotat pentru programare, vine cu gcc, gdb, as, ld, make, Python (2.7 si 3.2), wget/curl, Perl, vim, sshd si o gramada de alte bestii pe care nu le cunosc, e chiar o surpriza placuta!

Pi are nevoie de ntp pentru setarea ceasului, nu prea inteleg cum vine asta, ca nu are ceas, se pare ca a fost scos din motive de reducere de costuri (cauta rtc). Exista modalitati prin care poate fi legat la un ceas extern, pentru cine e interesat.

Momentan il tin intr-o cutie de carton, dar cred ca merita si el sa stea intr-o cutie mai fatoasa, asa ca planuiesc sa-mi mai rup de la gura 35 RON pentru una de plastic.





Se poate considera ca acum suntem in acelasi punct in care am fi daca instalam un Ubuntu simplu de pe net.

Si ziceam de Common Lisp. SBCL (Steel Bank Common Lisp) nu merge pe arhitectura ARM, CCL FTW! Mai e un nene care zice ca a folosit cu succes ECL (Embeddable Common Lisp).

Ce ne convine la CCL (Clozure Common Lisp)? faptul ca se poate folosi cam in aceleasi conditii si pe Linux si pe Windows. Din cate inteleg SBCL s-ar putea sa fie mai rapid, dar SBCL inca nu e adus 100% pe Windows, el se simte acasa pe Linux. Ca un comentariu, se pare ca ITA Software, cumparata de Google anul trecut pe ~700 milioane $ foloseste CCL - asta e una din povestile de succes ale Common Lisp folosite destul de des.
Ce NU ne convine la CCL? cred ca in primul rand faptul ca nu are installer, trebuie sa-l iei cu Subversion. Dar asta o faci odata si apoi nu te mai deranjeaza.

Deci. Urmeaza o bucata de articol in care trebuie sa ai acces la linia de comanda: ori nu pornesti LXDE, ori pornesti LXTerminal in interiorul sau.

Cautam pe net ce trebuie si ajungem la o pagina scrisa de un suflet bun (Rainer Joswig, nume pe care l-am auzit destul de des in zona asta de CL). Urmeaza o traducere prescurtata a textului de acolo, pentru ca instructiunile au functionat ™!

Se instaleaza urmatoarele pachete: subversion, emacs, m4 (sudo apt-get install subversion, ...). De ce m4? nu stiu, asa zice Rainer si eu il cred. El zice si de gcc, ld, as, make dar, dupa cum scriam mai sus, astea au venit deja instalate in imaginea folosita de mine.

Sa zicem ca-l instalam in ~/ccl/.
$ cd ~
$ svn co http://svn.clozure.com/publicsvn/openmcl/trunk/linuxarm/ccl
$ cd ccl
$ ./armcl

Ei, aici nu mi-a aparut REPL de CCL, asa ca ma intristasem un pic. Am zis sa merg mai departe si vedem noi ce-o fi.

cd lisp-kernel/linuxarm/
vi float_abi.mk
Comenteaza penultima linie si decomenteaz-o pe ultima:

# This file should define FLOAT_ABI as one of "softfp" or "hard".
# If you change this, do 'make clean' to remove any object files
# compiled for the other ABI.
#FLOAT_ABI = softfp
FLOAT_ABI = hard
Schimba iar in directorul ccl:

cd ~/ccl
make clean
make
./armcl
Welcome to Clozure Common Lisp Version 1.9-dev  (LinuxARM32)!
? 
De data asta a mers, s-a pornit CCL-ul!

? (ccl:rebuild-ccl :full t)
Asta a durat cred ca vreo 10-15 minute.
Acum sa pregatim mediul de lucru. Descarca Quicklisp:

curl http://beta.quicklisp.org/quicklisp.lisp >quicklisp.lisp

Deschide din nou CCL:

./armcl
? (load "quicklisp.lisp")
? (quicklisp-quickstart:install)

Poti sa lasi Quicklisp sa se porneasca automat odata cu CCL, evaluand

? (ql:add-to-init-file)

sau poti sa faci o functie in ~/.ccl-init.lisp si s-o apelezi numai cand ai nevoie de QL, dupa cum sugereaza Rainer:

(defun load-quicklisp ()
  (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                         (user-homedir-pathname))))
    (when (probe-file quicklisp-init)
      (load quicklisp-init))))

Recomand prima varianta, sa pornesti automat Quicklisp.
Acum instalam SLIME:

? (ql:quickload "quicklisp-slime-helper")

Adaugam doua linii in ~/.emacs:

(load (expand-file-name "~/quicklisp/slime-helper.el"))
(setq inferior-lisp-program "/home/pi/ccl/armcl")

Cam asta ar fi. Porneste Emacs si apoi SLIME, cu M-x slime, adica tii apasat Alt si x, apoi scrii slime si apesi Enter. Conventia in comenzile Emacs este sa scrii M- cand trebuie apasate simultan tasta Alt impreuna cu alte taste, si C- pentru tasta Ctrl.



Hai sa mai zicem ca vrem sa vedem si o pagina web. Instaleaza HUNCHENTOOT si apoi porneste-l pe Pi:

? (ql:quickload :hunchentoot)
? (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242))

Deschide un browser si acceseaza http://127.0.0.1:4242/ - normal, asta presupunand ca intri de pe Pi.


Gata, acum ai pornit si un server web in Common Lisp! (eu am fost foarte incantat cand am ajuns in punctul asta)

Spor la treaba!

P.S. am omis rezultatele rularii comenzilor in Lisp - cred ca ti-ai dat seama de asta. Dar n-ar trebui sa fie o problema, poti sa vezi cand ai primit o eroare si cand treaba a mers struna.

Niciun comentariu:

Trimiteți un comentariu

S-ar putea sa nu vedeti comentariul aparand imediat, asta inseamna ca el asteapta aprobarea mea. Aceasta e o masura anti-SPAM.