Carsharing: z´avˇereˇcn´a zpr´ava Filip Vaˇrecha 17. u ´nora 2010 Abstrakt Tento ˇcl´ anek slouˇz´ı jako z´ avˇereˇcn´ a zpr´ ava shrnuj´ıc´ı dˇen´ı a pokrok v projektu Carsharing za zimn´ı semestr ˇskoln´ıho roku 2009/2010. Jeho dalˇs´ı vyuˇzit´ı je jako reference pro vˇsechny co se chystaj´ı t´ımto projektem d´ ale zab´ yvat.
1
1
Historie projektu
Projekt Carsharing m´ a za sebou jiˇz pomˇernˇe dlouhou historii, bˇehem kter´e proˇsel pomˇernˇe velk´ ymi zmˇenami v cel´e jeho architektuˇre. P˚ uvodn´ı projekt, kter´ y byl obsahem nˇekolika bakal´aˇrsk´ ych prac´ı, fungoval pod n´ azvem Metrocar. Architektura sest´avala ze dvou samostatn´ ych ˇc´ast´ı: 1. Palubn´ı jednotky: jednalo se jak o hardwarovou ˇc´ast jako takovou (speci´alnˇe pro tento projekt sestaven´e zaˇr´ızen´ı), jako i softwarovou ˇc´ast napsanou v Javˇe, kter´ a tento hardware obsluhovala. Palubn´ı jednotky slouˇz´ı pro komunikaci automobil˚ u se serverem. 2. Serverov´ a aplikace: m´ a na starosti obsluhu palubn´ıch jednotek, business logiku cel´eho projektu, rozhran´ı pro z´akazn´ıky (tvorba rezervac´ı, . . . ) a pro administr´ atory. Architekturou byla zvolena webov´a aplikace. Platformou bylo PHP + MySQL + Apache2.
1.1
PHP a Drupal
Pro programovou vrstvu bylo zvoleno PHP (viz. v´ yˇse). Aby se uˇsetˇrila nˇejak´a d´ avka programov´ an´ı, bylo rozhodnuto, ˇze se pouˇzije CMS1 Drupal ve verzi 6. Jedn´ a se o open-source syst´em pro spr´avu obsahu webov´ ych str´anek zaloˇzen´ y na PHP. Jeho hlavn´ı devizou je pomˇernˇe vysok´a penetrace na trhu, d´ıky ˇcemuˇz se jedn´ a o robustn´ı syst´em s velk´ ym poˇctem dodateˇcn´ ych modul˚ u a obecnˇe spolehliv´ ym j´ adrem. Bohuˇzel se vˇsak nejedn´a o objektovˇe orientovan´ y software, nebot’ jeho v´ yvoj zaˇcal jeˇstˇe pˇredt´ım, neˇz do PHP byly objektov´e prvky ˇr´adnˇe zapracov´ any. Pˇresto se d´ a mluvit o jist´e objektovosti - alespoˇ n co se dˇediˇcnosti a polymorfismu t´ yˇce - kter´ a je doc´ılena pomoc´ı syst´emu “hook˚ u”, kter´e jednotliv´e moduly mohou implementovat. P˚ uvodn´ı projekt bˇeˇz´ı na webov´e adrese http://www.metrocar.cz. Uˇzivatelsk´e jm´eno je admin a heslo je metro1Car.
2
Transformace do Pythonu
V podobˇe popsan´e v pˇredchoz´ım odstavci tento projekt ust´al nˇekolik bakal´aˇrsk´ ych prac´ı. Jeho v´ yvoj vˇsak neskonˇcil, bylo rozhodnuto pokraˇcovat d´al, ale st´ali jsme tentkr´ at pˇred ot´ azkou, zda souˇcasn´a forma implementace je opravdu ta nejlepˇs´ı.
2.1
D˚ uvody transformace
Hlavn´ım problematick´ ym ˇcl´ ankem byl totiˇz Drupal samotn´ y. Je vhodn´ y na prezentace obsahov´ ych web˚ u. Nen´ı vˇsak jiˇz tolik vhodn´ y na programov´an´ı sloˇzit´e business logiky, kterou carsharingov´ y syst´em vyˇzaduje. Proto bylo rozhodnuto, ˇze se provede transformace a pˇredevˇs´ım oddˇelen´ı frontendu, tedy ˇcistˇe prezentaˇcn´ı ˇc´asti aplikace, a backendu coby v´ ykonn´e ˇc´asti, kde je uloˇzena hlavn´ı business logika. D´ ale bylo ustanoveno, ˇze backendov´a ˇc´ast by mˇela m´ıt vystavˇeno API, kter´e bude dostupn´e zvenˇc´ı, tedy se stane webovou sluˇzbou. Toto API by pak bylo 1 Content
Management System
2
moˇzn´e vyuˇz´ıvat nejen pro ˇcistˇe browserov´e internetov´e aplikace, ale tˇreba i z desktopov´ ych aplikac´ı napsan´ ych v Javˇe.
2.2
Volba platformy
Jako platofma byl novˇe zvolen Python. Datab´azov´ y stroj a webov´ y server byly ponech´ any. Pro usnadnˇen´ı v´ yvoje bylo rozhodnuto, ˇze se pouˇzije webov´ y framework Django, kter´ y je v posledn´ı dobˇe pomˇernˇe popul´arn´ı a snad d´ıky nˇemu se Python dost´ av´ a do povˇedom´ı i webov´ ych v´ yvoj´aˇr˚ u.
3
Implementaˇ cn´ı detaily
Jak bylo ˇreˇceno v pˇredchoz´ı ˇc´ asti, z´akladem implementace jsou n´asleduj´ıc´ı celky: • Python - s vyuˇzit´ım frameworku Django[2] • MySQL • Apache2
3.1
P˚ uvodn´ı idea funkce
P˚ uvodnˇe bylo zam´ yˇsleno, ˇze cel´ y frontend aplikace bude pouze jedna z moˇzn´ ych aplikac´ı, kter´ a bude vyuˇz´ıvat API poskytovan´e backendem. Jednalo by se tedy v podstatˇe o velmi hloupou aplikaci, kter´a by pouze prezentovala na venek sluˇzby poskytovan´e j´ adrem aplikace. Vzhledem k takto tˇesn´e vazbˇe byl jako standard pro webovou sluˇzbu pouˇzito XML-RPC2 , tedy vzd´ alen´e vol´an´ı procedur pomoc´ı XML. Tento standard je zaloˇzen na jednoduˇse zak´ odovan´em vol´an´ı procedur, kdy v kaˇzd´em requestu je pˇren´ aˇseno v podstatˇe pouze jm´eno metody a jej´ı parametry, pˇr´ıpadnˇe chybov´ y string[4]. T´ım je doc´ıleno pomˇernˇe u ´sporn´eho form´atu na u ´kor robustnosti. To n´ am ale pˇr´ıliˇs nevadilo, vzhledem k tomu, ˇze se nepˇredpokl´adalo, ˇze by tato webov´ a sluˇzba byla volnˇe dostupn´a pro veˇrejnost.
3.2
Dalˇ s´ı vyuˇ z´ıvan´ e knihovny
Naˇse aplikace pro sv˚ uj bˇeh potˇrebuje jeˇstˇe sadu dalˇs´ıch knihoven, kter´e n´am usnadnily jej´ı tvorbu. Jedn´ a se pˇredevˇs´ım o: • django xmlrpc - knihovna zaloˇzen´a na Djangu, kter´a umoˇzn ˇuje jednoduchou tvorbu XML-RPC metod[1]. • GeoDjango - rozs´ ahl´ a knihovna pro geografick´e v´ ypoˇcty a zobrazov´an´ı geografick´ ych dat[3]. Nebudu se zde zmiˇ novat o dalˇs´ıch Python knihovn´ach, kter´e jsou potˇrebn´e napˇr´ıklad pro napojen´ı na MySQL apod. 2 XML
Remote Procedure Call
3
3.3
Rozhran´ı pro komunikaci s palubn´ımi jednotkami
Pro komunikaci s palubn´ımi jednotkami jsme si vytvoˇrili vlastn´ı form´at zaloˇzen´ y na XML, kter´ y klade hlavn´ı d˚ uraz na u ´spornost k´odu. Jeho reference je uvedena v pˇr´ıloze. Toto rozhran´ı bˇeˇz´ı na adrese /comm/ a pˇr´ıjm´a POST requesty. V aplikaci ho obsluhuje handler car˙unit˙management/handler.py.
3.4
Rozhran´ı pro XML-RPC
Jako rozhran´ı pro XML-RPC kaˇzd´ y modul m˚ uˇze definovat soubor xmlrpc.py (pouze konvence pro pˇrehlednost, obecnˇe m˚ uˇze b´ yt pojmenov´an jakkoliv), jehoˇz funkce pouˇz´ıvaj´ı dekor´ ator xmlrpc˙func. Nakonec je v konfiguraˇcn´ım modulu aplikace (kter´ y zaˇc´ın´ a v settings.py) uveden soubor exportovan´ ych metod, kter´e lze vyuˇz´ıvat. Pro autentizaci slouˇz´ı dekor´ator secure˙func.
3.5
Stav implementace
Bohuˇzel, p˚ uvodn´ı vizi nov´e implementace se zat´ım nepodaˇrilo dokonˇcit vinou nedostateˇcn´e t´ ymov´e spolupr´ ace. Vˇetˇsina modul˚ u tak je nehotov´a a ˇcek´a na rozvinut´ı. Nejkompletnˇejˇs´ı je modul user˙management. D´ ale se d´a ˇr´ıci, ˇze je vcelku kompletn´ı i datab´azov´e sch´ema aplikace, kter´e bylo do velk´e m´ıry pˇrejato z p˚ uvodn´ı koncepce, pouze vylepˇseno v m´ıstech, kde nebylo zcela dotaˇzeno. V modulech se to projevuje definic´ı pouˇz´ıvan´ ych model˚ u, ze kter´ ych je toto datab´azov´e sch´ema pomoc´ı Djanga vygenerov´ ano. V´ yvojov´ a verze projektu bˇeˇz´ı na webov´e adrese http://metrocar.proj. fragaria.cz/admin. Uˇzivatelsk´e jm´eno je admin a heslo je yepr6S6r. Pro projekt nen´ı zaveden DNS z´ aznam a proto je potˇreba pˇridat n´asleduj´ıc´ı ˇr´adek do /etc/hosts (nebo C:“Windows“System32“drivers“etc“hosts): 87.236.194.138 metrocar.proj.fragaria.cz
3.6
Subversion repozit´ aˇ r
Projekt je k dispozici v SVN repozit´aˇri. SVNka obsahuje jak p˚ uvodn´ı, tak i novou implementaci projektu, vˇsechnu dostupnou dokumentaci a v˚ ubec veˇsker´e vˇedomosti a informace, kter´e byly bˇehem v´ yvoje nashrom´aˇzdˇeny. Adresa SVN je: http://svn2.assembla.com/svn/metrocar Pro pouˇzit´ı je zˇrejmˇe nutn´e m´ıt uˇzivatelsk´ yu ´ˇcet na Assemble. To by mˇel dodat garant projektu, kter´ ym je Ing. Martin Kom´arek (e-mail:
[email protected]).
4
To Do
V t´eto sekci nast´ın´ım co vˇse je potˇreba d´ale udˇelat. Bude to v podstatˇe stroh´ y v´ yˇcet okruh˚ u: • Dodˇel´ an´ı backend modul˚ u - pˇredevˇs´ım programov´an´ı logiky aplikace 4
ˇ asteˇcnˇe cars (billing) a usermanagement (sladˇen´ı s frontendem) – C´ – Z vˇetˇs´ı ˇc´ asti reservations (vytvoˇreno zat´ım pouze vkl´ad´an´ı rezervac´ı) – invoices (kompletnˇe naprogramovat), tariffs (kompletn´ı logika tarifikace, asi pˇrev´est z p˚ uvodn´ıho projektu) • Doˇreˇsen´ı frontendu - bud’ pˇrepsat, nebo kompletnˇe dot´ahnout
5
Z´ avˇ er
V tomto dokuementu jsme se zab´ yvali projektem Carsharing. Uvedli jsme jeho struˇcnou historii a d´ ale jsme se zab´ yvali jeho postupn´ ym v´ yvojem. Nakonec jsme uvedli jeho souˇcasnou podobu a lehce nast´ınili jeho implementaci.
5.1
Kontakt
V pˇr´ıpadˇe jak´ ychkoliv dotaz˚ u mˇe m˚ uˇzete kontaktovat na e-mailu: varecfil@ fel.cvut.cz.
Reference [1] G. Bins. django xmlrpc, 2009. https://launchpad.net/django-xmlrpc. [2] Django. Django, 2010. http://djangoproject.com/. [3] GeoDjango. Geodjango, 2010. http://geodjango.org/. [4] Wikipedia. Xml-rpc — wikipedia, the free encyclopedia, 2010. http://en. wikipedia.org/wiki/Xmlrpc.
5
A
Komunikaˇ cn´ı protokol pro palubn´ı jednotky
Jako referenci zde vkl´ ad´ am obsah DTD3 soubor˚ u, kter´e popisuj´ı jednotliv´e form´ aty XML poˇzadavk˚ u. Pomoc´ı tˇechto soubor˚ u nen´ı probl´em okamˇzitˇe ovˇeˇrit, zda je request validn´ı (alespoˇ n co se struktury XML element˚ u t´ yˇce).
Form´ at requestu ¡?xml version=”1.0” encoding=”UTF-8”?¿ ¡!ELEMENT r ¡!ELEMENT a ¡!ELEMENT v ¡!ELEMENT i ¡!ELEMENT s ¡!ELEMENT p ¡!ELEMENT b ¡!ELEMENT c ¡!ELEMENT q to get real ¡!ELEMENT d ¡!ELEMENT e ¡!ELEMENT l ¡!ELEMENT t ¡!ELEMENT z ¡!ELEMENT x SETTINGS--¿
(a, v?, z?)¿ (#PCDATA)¿ ¡!--autorizacni klic--¿ (i, s?, p, q*, l, t?)¿ ¡!--usage--¿ (#PCDATA)¿ ¡!--user id int--¿ (#PCDATA)¿ ¡!--since same like till (t tag)--¿ (b, c)¿ ¡!--base position--¿ (#PCDATA)¿ ¡!--base latitude double--¿ (#PCDATA)¿ ¡!--base longitude double--¿ (d,e)¿ ¡!--incremental position=what to add to base possition--¿ (#PCDATA)¿ ¡!--incremental latitude int--¿ (#PCDATA)¿ ¡!--incremental longitude int--¿ (#PCDATA)¿ ¡!--length in metres int--¿ (#PCDATA)¿ ¡!--till string formated ”YY-MM-DD HH:MM”--¿ (x+)¿ ¡!--what i need--¿ (#PCDATA)¿ ¡!--requested info, one of RESERVATIONS,
Form´ at response ¡?xml version=”1.0” encoding=”windows-1252”?¿ ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT ¡!ELEMENT
r u v i p q b s t g j k h
3 Document
(u?, g?)¿ ¡!--response--¿ (v?)¿ ¡!--reservations--¿ (i, (p—q)+, b+)¿ ¡!--user--¿ (#PCDATA)¿ ¡!--user id int--¿ (#PCDATA)¿ ¡!--user phone number string +420721214574--¿ (#PCDATA)¿ ¡!--user RFID card code string--¿ (s, t)¿ ¡!--reservation times--¿ (#PCDATA)¿ ¡!--since--¿ (#PCDATA)¿ ¡!--till--¿ (j+)¿ ¡!--settings--¿ (k, h)¿ ¡!--setting--¿ (#PCDATA)¿ ¡!--key--¿ (#PCDATA)¿ ¡!--value--¿
Type Definiton
6
Pˇ r´ıklady request˚ u ¡r¿ ¡a¿123¡/a¿ ¡v¿ ¡i¿2¡/i¿ ¡s¿09-12-21 12:00¡/s¿ ¡p¿ ¡b¿50.000¡/b¿ ¡c¿30.000¡/c¿ ¡/p¿ ¡q¿ ¡d¿0.1¡/d¿ ¡e¿1.2¡/e¿ ¡/q¿ ¡l¿4000¡/l¿ ¡t¿09-12-21 12:30¡/t¿ ¡/v¿ ¡z¿ ¡x¿RESERVATIONS¡/x¿ ¡x¿SETTINGS¡/x¿ ¡/z¿ ¡/r¿ ¡r¿ ¡a¿123¡/a¿ ¡v¿ ¡i¿2¡/i¿ ¡s¿09-12-21 12:50¡/s¿ ¡p¿ ¡b¿50.01¡/b¿ ¡c¿30.000¡/c¿ ¡/p¿ ¡q¿ ¡d¿0.1¡/d¿ ¡e¿1.2¡/e¿ ¡/q¿ ¡q¿ ¡d¿0.6¡/d¿ ¡e¿2.1¡/e¿ ¡/q¿ ¡l¿1500¡/l¿ ¡t¿09-12-21 13:20¡/t¿ ¡/v¿ ¡z¿ ¡x¿SETTINGS¡/x¿ ¡/z¿ ¡/r¿
7