Múltkor ott hajítottuk el a fonalat, hogy van egy feltelepített, de ki nem próbált Lisp-ünk az SBCL képében. Itt az ideje, hogy ki is próbáljuk. Egyik egyszerű módja a clbuild-del történik (ha már fent van): ./clbuild lisp. Némi szöveg után egy barátságos csillagot kell kapnunk (ez a REPL, amiről majd máskor szólok), ahova már Lisp utasításokat lehet írni. Most egyelőre nyugodjunk meg annyiban, hogy elindult, és közöljük vele, hogy (quit) -- a zárójelekkel együtt, mire illemtudóan kilép.
Három alapozó feladatunk van még hátra a kiváló webes alkalmazás létrehozásához:
- webes környezet összerakása
- fejlesztőkörnyezet és tartozékai
- megtanulni a nyelvet :)
Ma a webes környezetet rakjuk össze.
Lisp-ünkhöz nem létezik a klasszikus értelemben vett webes keretrendszer, mint például a Ruby on Rails vagy a CakePHP. Ez nem azt jelenti, hogy a választott környezetünk gagyi, hanem jobbára azt, hogy nincs rá ilyen formában szükség.
Ahogy körülnéztem, két gyakrabban használt keretrendszert találtam, az UnCommon Web (UCW) és a Weblocks nevezetűt. Mindkettő elég elriasztó elsőre, és mindegyiknél a kulcsszó a "continuation", amitől majd egy későbbi írásban fogok szót ejteni (már írnom kell külön, hogy miket halasztok későbbre, szóval ne aggódj, tényleg fogok róla írni). Az elérhető források alapján úgy döntöttem, hogy elsőnek az UCW-vel fogok megismerkedni, mert ez tűnt kiforrottabbnak és szélesebb körben használtnak. Van benne egy alap webszerver is, ami jól is fog jönni. Van ezen kívül más út is, amit majd máskor részletezek :)
Szóval kedvenc szerverünkön tartózkodva adjuk ki ezt a parancsot: ./clbuild install ucw. Ez letölti és helyére rakja az UCW-t és a függőségeit is, és már csak ezért hálát adhatunk, hogy a clbuild-et kitalálta valaki. Persze a világ nem tökéletes, és nálam hiányolta még a closer-mop csomagot, ezért ha ezt nem láttad a felrakottak között, célszerű telepíteni a ./clbuild install closer-mop paranccsal (közben persze lehet hogy javították a clbuild-et). Hasonlóképpen vegyük magunkhoz a puri és az rfc2388-binary csomagokat: ./clbuild install puri, ./clbuild install rfc2388-binary. Ezeket majd a futtatandó példaprogram igényli.
Indítsuk el a Lisp-ünket a ./clbuild lisp paranccsal, majd közöljük vele, hogy (require 'ucw) (figyelj az aposztrófra az ucw előtt!). Ezen remélhetőleg nem sértődik meg és jó hosszan írogat amint fordítja az egyes programokat. Ha visszakapod a csillagot, akkor rendben ment minden. Ha nem, akkor kérdezni fog valamit, ami általában valamilyen csomag hiányára utal. Próbáld meg kideríteni a szövegből, hogy mi lehet az a csomag (esetleg másold be az egészet ide kommentbe), kérd meg a clbuild-et, hogy telepítse és próbáld újra.
Ha az első megpróbáltatáson túl vagyunk, töltsük be a példaprogramot. Erre való a (load "/eleresi/utvonal/fajl.lisp") parancs. A (load "/home/bkovacs/clbuild/source/ucw/manual/example-code.lisp") nálam betölti a példaprogramot. Persze a fájl elérési útvonalát cseréld le a nálad létezőre. FRISSÍTÉS: egy openvz alapú minimál-szerveren furcsa fordítási hibákkal elszállt a betöltés. Kinyomoztam, hogy egyrészt kell neki GCC, másrészt pedig a libc6-dev (vagy ezzel megegyező, libc6 fejlesztéshez szükséges) csomagot kell feltenni. Az ilyen munkához ajánlom a Linux screen programját (igény szerint erről is írok). Ha itt is visszakaptad a csillagot, akkor a neheze megvan. Ezután el kell indítani a példa szervert a (ucw-user:start-example-server) paranccsal. Ez először kérdez, mert a start-example-server nincs exportálva a ucw-user csomagból, erre 0-t nyomva (continue) továbbmegy és elindul a szerver. A logja a Lisp ablakában látszik, minden művelet itt fog zajlani. Nézd is meg, hogy melyik porton indult el a webszerver. Az alábbi sor végén látszik, hogy nálam a 8000-es portot használja.
00:40 UCW INFO Started standard-server #<STANDARD-SERVER IT.BESE.UCW.CORE:HTTPD-BACKEND 1 {C410B89}> with backend #<HTTPD-BACKEND :host 0.0.0.0 :port 8000 {C42B019}>
A teszteléshez írd be a böngésződbe a http://localhost:8000 (illetve a 8000 helyett azt a portot, amelyen nálad elindult) címet és szokatlan hibaüzenetet kell kapnod.
The page you requested was not found
"/" was not found on this server
Lehet próbálgatni a minta-lapokat:
- http://localhost:8000/example/hello.ucw
- http://localhost:8000/example/hello2.ucw
- http://localhost:8000/example/hello-action.ucw
- http://localhost:8000/example/hello-session.ucw
- http://localhost:8000/example/hello-callback.ucw
- http://localhost:8000/example/hello-components.ucw
- http://localhost:8000/example/hello-yaclml.ucw
- http://localhost:8000/example/hello-control-flow.ucw
Férfiasan bevallom, ezek a példák így bedobva még távol állnak az értelmestől. Igazából azt hivatottak demonstrálni, hogy az UCW mindenféle feladatra használható, a hagyományos "megyünk oldalról oldalra" típusú weblaptól a komoly workflow-t (itt jön majd a "continuations") megvalósító lapokig.
A következőkben a hiányzó elemeket rakjuk majd hozzá a rendszerünkhöz, mielőtt belemennénk a nyelv és az UCW rejtelmeibe. Addig is, ha kérdésed van, szólj hozzá alul!