python

Django VS CakePHP

Stengsiuosi pateikti tik faktus. Kuris iš jų geresnis, spręsti kiekvienam asmeniškai.

Django CakePHP

Programavimo kalba
Python PHP

Pradžia
2005 m. 2005 m.

Atviras kodas
Taip, BSD Licencija Taip, MIT Licencija

Pagalba per IRC
#django @ Freenode
~700 dalyvių
#cakephp @ Freenode
~100 dalyvių



Kaip paleisti darbinį LAMP serverį su buildout?

Jei kada bandėte programuoti su PHP, tikriausiai susidūrėte su LAMP serverio diegimu ir konfigūravimu. Žinoma Ubuntu aplinkoje tai padaroma vienos komandos pagalba, tačiau turi šiokių tokių minusų:

  • PHP, Apache ir MySQL versijos yra tokios, kokias pateikia distribucija
  • Pagal nutylėjimą, web-root katalogas yra /var/www ir turi ne itin draugiškas failų ir katalogų teises.
  • Įdiegus LAMP, kiekvieną kartą paleidus kompiuterį, automatiškai startuoja Apache ir MySQL.

Kaip paleisti Web serverį, per 5 sekundes su Python

Jei kada nors prireiks greitai paleisti Web serverį ir nenorėsite gaišti laiko konfigūruodami Apache ar panašiai, tuomet Python jums padės! Python savo didžiulėje standartinėje bibliotekoje turi HTTP serverio modulį. Panaudoję šį labai paprastą HTTP serverio modulį, labai greitai galite paversti bet kurį katalogą į Web serverio šakninį katalogą. Tam reikės turėti tik įdiegtą Python.

Tai labai naudinga, jei norite tinkle ar internete paviešintį kokius nors failus. Serveris paleidžiamas vienos komandos pagalba.

Versijų kontrolės sistema – Mercurial

Pirmiausia nežinantiems, trumpai apie tai, kas yra versijų kontrolės sistema. Tai programinė įranga, kurios pagalba galima išsaugoti daug skirtingų failo versijų. Tai reiškia, kad pakeitę failą, galite užfiksuoti pakeitimą, nurodydami ką ir kodėl keitėte. Vėliau, bet kada galėsite peržiūrėti ir atstatyti tuos pakeitimus. Tokias sistemas daugiausiai naudoja programuotojai, nes jie keičia daug failų ir nori žinoti kas kada ir kodėl buvo pakeista. Versijų kontrolės sistemos taip giliai įaugo į programavimo procesą, kad failų versijos naudojamos labai plačiai, pavyzdžiui programuotojo našumui apskaičiuoti. Tačiau failų versijų sekimas aktualus ne tik programuotojams...

Turiningas savaitgalis

Šį savaitgalį dalyvavau Kritinėje Masėje, Jaunty Release Party, PyCon-2009 – Kaunas.

Trumpai, apie viską...

Automatinis laiškų persiuntimas į Trac

Pradėjęs naudoti Archlinux taip pat radau ir naują įrankį laiškų parsiuntimui: fdm. Jis man pasirodė kur kas paprastesnis, nei fetchmail ir net gi turintis daugiau reikalingų funkcijų. Dėl tam tikrų funkcijų atsisakiau ir procmail, nes fdm gali puikiausiai atlikti ir procmail funkciją... :)

Kitas dalykas, jei dirbate su kokiais nors projektais, tai tikriausiai gaunate daug laiškų, kuriuos perskirstote ir talpinate į kokią nors Web pagrindu veikiančią projektų ar užduočių valdymo sistemą. Na, bent jau aš dirbu panašiai taip, kaip apibūdinau ir visai nesenai, mano kolega paklausė, ar įmanoma, kaip nors tuos laiškus persiųsti tiesiai į užduočių valdymo sistemą, kad ji iš to laiško sukurtų naują užduoti. Pagalvojau, kad tai tikrai puiki mintis. Tačiau paieškojęs internete neradau jokių panašių realizacijų, Trac sistemai, kurią naudojuosi.

Bet, pasirodo, kad tokį dalyką padaryti, įtraukiant į darbą fdm ir šiek tiek Python kodo, yra visiškai nesudėtinga.

Štai ką aš dariau, kad atsirastų galimybė persiųsti laišką tiesiai į Trac sistemą, kaip naują užduotį.

Testinės Trac aplinkos diegimas.

Kadangi nenorėjau žaisti su veikiančiai sistemą, susikūriau atskirą aplinką testavimams:

  1. # Įdiegiau Python paketų valdymo įrankį easy_install į Archlinuxą:
  2. sudo pacman -S setuptools
  3.  
  4. # Įdiegiau Python virtualios aplinkos kūrimo įrankį:
  5. sudo easy_install virtualenv
  6.  
  7. # Susikūriau virtualią aplinką Trac programai:
  8. cd ~/www/sandbox
  9. virtualenv trac
  10.  
  11. # Aktyvavau virtualią aplinką esamame shelle:
  12. cd trac
  13. source bin/activate
  14.  
  15. # Įdiegiau Trac į virtualią aplinką:
  16. easy_install trac
  17.  
  18. # Susikūriau testinį Trac instancą:
  19. trac-admin test initenv
  20. trac-admin test permission add anonymous TRAC_ADMIN
  21.  
  22. # Paleidau Trac sistemą:
  23. tracd --port 8000 test
  24.  
  25. # Atsidariau paleistą Trac interneto naršyklėje:
  26. firefox http://localhost:8000/test

fdm konfigūravimas

Sekantis žingsnis fdm konfigūravimas ir štai, kaip turėtu atrodyti failo ~/.fdm.conf turinys:

  1. action "newticket" pipe "%h/www/sandbox/trac/mailpipe.py"
  2. account "stdin" disabled stdin
  3. match "(To|Cc):.*trac@localhost" action "newticket"

Pagal šią konfigūraciją, fdm, visus laiškus su trac@localhost perduos Python scriptui, kuris sukurs naują ticketą Track užduočių sistemoje.

Python skriptas naujų užduočių kūrimui

Tai sunkiausia dalis, nes Trac sistema, apsaugai nuo spamo naudoja visokius parametrus, todėl reikia iš pradžių nuskaityti naujo užduoties įvedimo formą, kurios užkrovimo metu sukuriama sesija ir tam tikri sausainiukai. Tada iš tos formos reikia pasiimti specialų kintamąjį, kuris nurodo, kad formos duomenys buvo išsiūsti iš ten kur reikia. Ir galiausiai reikia išsiūsti reikiamus duomenis, kad būti sukurta nauja užduotis.

Šioje vietoje nedariau jokios naudotojų autentifikacijos, bet tai nesunku prijungti, esant poreikiui.

Jei kam įdomu, tai aiškindamasis ką reikia perduoti Trac sistemai, panaudojau puikų Web debuginimo proxį burpsuite. Archlinux sistemoje jį galima įsidiegti iš nuostabiojo AUR:

  1. yaourt -S burpsuite

Štai Python scriptas, kuris daro visą darbą (atkreipkite dėmesį, kad šis skriptas parašytas Python 3.0 versijai, todėl su senesne neveiks):

  1. #!/usr/bin/env python3
  2. """This is pipe script for fdm.
  3. """
  4.  
  5. import sys
  6. import email
  7. import urllib.parse
  8. import urllib.request
  9. import http.cookiejar
  10. from html.parser import HTMLParser
  11.  
  12. class InputFieldsParser(HTMLParser):
  13. """Parse all input fields from given html string.
  14. """
  15. fields = {}
  16.  
  17. def handle_starttag(self, tag, attrs):
  18. if tag == 'input':
  19. attrs = dict(attrs)
  20. if 'name' in attrs and 'value' in attrs:
  21. self.fields[attrs['name']] = attrs['value']
  22.  
  23. def get_html_fields(html):
  24. """Returns all input fields from given html string.
  25. """
  26. parser = InputFieldsParser()
  27. parser.feed(html)
  28. parser.close()
  29. return parser.fields
  30.  
  31. def get_url_opener():
  32. """Returns urllib OpenerDirector for sending correct request...
  33.  
  34. This openner acts like a web browser with Mozilla user agent and cookies
  35. support.
  36. """
  37. cj = http.cookiejar.CookieJar()
  38. cookie_processor = urllib.request.HTTPCookieProcessor(cj)
  39. opener = urllib.request.build_opener(cookie_processor)
  40. opener.addheaders = [('User-agent', 'Mozilla/5.0')]
  41. return opener
  42.  
  43. def submet_to_trac(title, body):
  44. """Function to submit new ticket to Trac system.
  45. """
  46. params = {
  47. 'author': 'anonymous',
  48. 'field_summary': title,
  49. 'field_reporter': 'anonymous',
  50. 'field_description': body,
  51. 'field_type': 'defect',
  52. 'field_priority': 'major',
  53. 'field_milestone': '',
  54. 'field_component': 'component1',
  55. 'field_version': '',
  56. 'field_keywords': '',
  57. 'field_cc': '',
  58. 'field_owner': '',
  59. 'field_status': 'new',
  60. 'submit': 'Create+ticket',
  61. }
  62.  
  63. opener = get_url_opener()
  64. url = 'http://localhost:8000/test/newticket'
  65. fields = get_html_fields(str(opener.open(url).read()))
  66. params['__FORM_TOKEN'] = fields['__FORM_TOKEN']
  67. params = urllib.parse.urlencode(params)
  68. f = opener.open("http://localhost:8000/test/newticket", params)
  69. f.read()
  70.  
  71.  
  72. def submit(title, body):
  73. """Does all submission job to a web page form.
  74. """
  75.  
  76. # Create new functions and change this line,
  77. # for support to other systems.
  78. submet_to_trac(title, body)
  79.  
  80.  
  81. def get_message_body(msg):
  82. """Returns email message body.
  83.  
  84. Only text/plain message parts are supported.
  85. """
  86. for part in msg.walk():
  87. if part.get_content_type() == 'text/plain':
  88. return part.get_payload()
  89.  
  90. return ''
  91.  
  92.  
  93. def main():
  94. """The main function of this script.
  95. """
  96. msg = email.message_from_file(sys.stdin)
  97. title = msg.get('subject')
  98. body = get_message_body(msg)
  99. submit(title, body)
  100.  
  101.  
  102. if __name__ == '__main__':
  103. main()

Testavimas

Galiausiai viską sujungus į vieną vietą galima pradėti testuoti. Kad nereikėtų siuntinėti laiškų į kažkokius serverius, tai tam reikalui paprasčiausiai susikūriau laišką ir išsaugojau jį į failą. Štai laiško turinys:

  1. From: sirex@localhost
  2. To: trac@localhost
  3. Subject: Testinė užduotis.
  4.  
  5. Testinė užduotis Trac sistemai.

O štai komanda, kurios pagalba laiškas perduodamas fdm programai, kuri patikrina laiško headerius, pritaiko reikiamą veiksmą ir perduodą Python scriptui, kuris paverčia laiško turinį į naują Trac užduotį:

  1. cat newmail | fdm -vma stdin fetch

Pabaigai

Jei visi testavimai praeina sėkmingai, tai belieka susikurti pašto dėžutę į kurią sunčiami laiškai, automatiškai bus paverčiami Trac sistemos užduotimis. Žinoma reikės atitinkamai pakeisti fdm konfigūraciją, kad laiškai būtų imami ne iš stdin, o iš naujai susikurtos pašto dėžutės.

Programa „laikas“ sėkmingai nuportinta į Py3k

Rašiau anksčiau, kad pradėjau vystyti atvirojo kodo įrankį „laikas“.

Kadangi įrankis dar labai ankstyvoje vystymo stadijoje, tai nieko nelaukdamas nusprendžiau sutvarkyti jį taip, kad veiktų su šviežiai pasirodžiusią Python 3.0 versija.

Pasirodo sutvarkyti kodą buvo labai paprasta, užtrukau vos kelias minutes, na kodo taip pat ne per daugiausia... :) Praktiškai pašalinus visus „hackus“ dėl utf-8 palaikymo, kodas pradėjo veikti. Pradžioje pašalinau komentarą # -*- encoding: utf-8 -*- ir keletą encode() ir decode() funkcijų, nes nuo šiol visos simbolių eilutės, pagal nutylėjimą yra unicode eilutės, o ne bytestringai.

Visus pakeitimus galima pamatyti svn istorijoje.

Ką gi, kol kas esu labai patenkintas naująja python versija.. :)

Išleistas Python 3.0

Šiandien pasirodė Python 3.0.

Nieko nelaukdamas susikompiliavau ir išbandžiau.

Štai instrukcijos kaip susikompiliuoti į Ubuntu 8.10:

  1. sudo apt-get install build-essential checkinstall libgdbm3
  2. sudo apt-get build-dep python2.5 libreadline5 libgdbm3
  3. cd /tmp
  4. wget http://python.org/ftp/python/3.0/Python-3.0.tar.bz2
  5. echo "28021e4c542323b7544aace274a03bed *Python-3.0.tar.bz2" > md5sum
  6. md5sum -c md5sum
  7. tar -xjf Python-3.0.tar.bz2
  8. cd Python-3.0
  9. ./configure
  10. make
  11. sudo checkinstall --pkgname=py3k make altinstall

Jei bus kokių problemų su checkinstall, panašių į šias:

  1. ranlib: could not create temporary file whilst writing archive: No more archived files

Tai man padėjo tokia komanda:

  1. sudo mkdir -p /usr/local/lib/python3.0/config

O visas kitas kompiliavimas vyko ganėtinai sklandžiai.

Galiausiai paleidau python3.0 ir išbandžiau kaip viskas veikia:

  1. » python3.0
  2. Python 3.0 (r30:67503, Dec 4 2008, 20:17:48)
  3. [GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> print
  6. <built-in function print>
  7. >>> print()
  8.  
  9. >>> print(print.__doc__)
  10. print(value, ..., sep=' ', end='\n', file=sys.stdout)
  11.  
  12. Prints the values to a stream, or to sys.stdout by default.
  13. Optional keyword arguments:
  14. file: a file-like object (stream); defaults to the current sys.stdout.
  15. sep: string inserted between values, default a space.
  16. end: string appended after the last value, default a newline.
  17. >>> ą = 1
  18. >>> č = 2
  19. >>> ž = ą + č
  20. >>> print(ž)
  21. 3
  22. >>> def функцийа():
  23. ... print('Ето работает тоже...')
  24. ...
  25. >>> функцийа()
  26. Ето работает тоже...

Tai gi, kaip matyti iš pavyzdžio, dabar python su unikodu tvarkosi tiesiog puikiai ir print, nuo šiol ne kalbos dalis, o paprasčiausia funkcija.

Naujoji mano programa – laikas

Jau kurį laiką planavau padaryti kalendoriaus programą veikiančią tekstiniame režime ir naudojančią Google Calendar duomenis.

Šiandien vakare, nusprendžiau padaryti tam pradžią! Pirmiausia panaršiau internetą ir paieškojau ar nėra jau kažko panašaus padaryta. Kiek panaršęs įsitikinau, kad nieko nėra. Tada bandžiau sugalvoti pavadinimą, visi angliški pavadinimai buvo jau užimti, tai sugalvojau lietuvišką – laikas.

Nors kol kas dar niekas neveikia, tačiau pradžią galima apžiūrėti code.google.com hostinge.

Kadangi tai pirmoji mano programa su python+ncurses, tai laukiu pastabų iš tų, kurie jau yra su tuo susidūrę.

Štai dar screenshtą prisegu:

Openmoko po truputi auga: Tichy

Kaip smagu stebėti openmoko vystymąsi. Šiandien skaitinėdamas naujienas apie moko radau naują projektą, pavadinimu Tichy. Tai python apletų valdytojas (python applet manager). O tiksliau, tai aplinka skirta lengvai ir greitai susikurti įvairios paskirties programas su python. Pats Tichy taip pat parašytas su python ir veikia tiek openmoko platformoje, tiek bet kurioje vietoje, kur yra python.

Vis svarsčiau apie galimybes programuoti su python openmoko aplinkoje ir suradęs informacijos apie šį projektą, matau, kad openmoko tikrai yra draugiškas python atžvilgiu, tai gi manau problemų tikrai nekils :)

Štai kaip atrodo Tichy mano kompiuteryje:

Surinktas turinys