Marec 23, 2010

Správa softvérových projektov pomocou Tracu

Dnes si je už ťažké predstaviť softvérový projekt, kde by si vývojári vymieňali zdrojové kódoch na disketách. Správa zdrojových kódov sa presunula do systémov so skratkou SCM (Source Control Management). Z open source variánt je veľmi populárne Subversion a čoraz silnejšiu skupinu priaznivcov si získava aj Git.

Lenže nie len zdrojovým kódom je softvérový projekt živý. V projekte sa objavia rôzne chyby. Riešenie niektorých chýb si vyžaduje aj niekoľko týždňov. Na evidencie chýb a stavu ich riešenia, sú vhodné rôzne ticket systémy. Veľmi známa je napríklad Bugzilla, ktorá vznikala popri projekoch Mozilla Foundation. Tento softvér výrazne prispel k stabilizácii kódu Firefoxu, či Mozilly. Z komerčných si spomeňme napríklad JIRA, ktorú používa napríklad Adobe na bugs.adobe.com.

Dokumentácia je základnou súčasťou projektu. Rôzne poznámky a záznamy sa ukladajú do Wiki, ktorá obsahuje verzovanie. Aj keby niekto niečo omylom zmazal, vždy sa dá vťátiť k starému obsahu. Wiki sú jednoduché a rýchle. Z veľmi populárnych stojí za spomenutie MediaWiki, na ktorej je postavená napríklad Wikipédia.

To však akosi stále nie je úplne všetko, čo by človek potreboval na riadenie projektu. Ešte by to chcelo mať prehľad v tom, čo sa zmenilo v zdrojovom kóde a ktoré tickety boli uzatvorené. Tým pádom sa dajú ľahko sledovať zmeny a ich dopady. Z komerčného sveta má túto schopnosť najviac prepracovanú softvér Polarion.

Prečo použiť Trac, keď existuje toľko nástrojov? Autori Tracu si zvolili ako prioritu minimalistický prístup a to je veľmi podstatné. Zintegrovali dohromady Wiki, ticket systém, správu zdrojových kódov a sledovanie zmien. Trac je veľmi jednoduchý na používanie. Napojí sa na úložisko zdrojového kódu a vy máte okamžite prehľad o tom, čo sa v projekte deje. Pokiaľ vám nevyhovuje nejaká jeho vlastnosť, je ho možné ju odobrať. Trac sa dá jednoducho skonfigurovať, prípadne rozšíriť o nové vlastnosti pomocou pluginov. Trac je možné použiť aj na riadenie projektov, ktoré so softvérom nemusia mať vôbec nič spoločné, napríklad riadenie dodávok Hot Runner systémov na vstrekovanie plastov.

Pokiaľ potrebujete hostovať Trac, tak vám bežný PHP hosting stačiť nebude. Trac je napísaný v Pythone. Je možné ho spustiť ako samostatnú aplikáciu alebo pomocou Apache, tu odporúčam použiť WSGI. Ďalši informácie o možnostiach hostingu, školeniach a vývoji pluginov pre Trac, nájdete na stránkach SinusGear.com.

Január 25, 2010

Kompletný ebook – Vymyslite svoju vlastnú hru s Pythonom

Ani to nie je tak dávno, čo som tu písal o dôležitosti počítačových hier pre developerov a čuduj sa svete. Na internete je k dispozícii plná verzia elektronickej knihy Invent Your Own Computer Game with Python.

Kniha vás prevedie rôznymi oblasťami, ako napríklad detekcia kolízie objektov, sonar, grafika, animácia a zvuky. Je prehľadne spracovaná a zrozumiteľná pre laika. Je publikovaná pod licenciou Creative Commons.

Prajem príjemnú zábavu. Ak vytvoríte nejakú hru, nezabudnite poslať na ňu odkaz 😉

November 22, 2009

PyGTK a preklad GUI pre Windows

PyGTK je výborné rozšírenie Pythonu, ktoré umožňuje pracovať s GTK GUI. Pekne to funguje aj pod Windows. Dôkazom je napríklad aplikácia Srobick.

No, všetko by bolo dobré, keby som si v jednej rozmarnej chvíli nebol zmyslel, že chcem preložené GUI. Zobral som GUI designér Glade. Prepísal som GUI do angličtiny. Vygeneroval som si prekladové súbory. Pomocou PoEditu som ich preložil. Podľa návodu som pridal set_translation_domain. Pod Linuxom to pekne chodilo. Spustím pod Windows a ajhľa. How do you jodlajdú. Všetko v angličtine.

Prebrázdil som celý internet. Od jedného konca, po druhý. Nič. Skúsil som dokonca nastavovanie systémových premenných pomocou kernel balíku a nič. Proste zúfalstvo.

Väčšina návodov je zastaralých a počíta s gtk.glade, ktorý sa už v nových verziách nenachádza. Tu je drobná finta, ako dostať preklad do chodu. Jednoducho preiterujete všetky objekty a spustíte na nich prekladovú funkciu.

Príklad na preklad tooltipov:

class GuiBuilder(gtk.Builder):
   """
   Fix for GTK builder and translation.
   Inspired by: http://old.nabble.com/gtk.Builder-and-translation-directory-td22351164.html
   """
   def translate(self):
     for obj in self.get_objects():
       # Translate tooltips
       try:
         if obj.get_has_tooltip():
          obj.set_tooltip_markup(_(obj.get_tooltip_markup()))
       except:
         pass

V kóde potom načítavanie GUI vyzerá nasledovne:

import GuiBuilder
wt = GuiBuilder()
#wt.set_translation_domain(domain = AppName)
wt.add_from_file(gui)
wt.connect_signals(self)
wt.translate()

A dôležitá informácia na záver. Na stránkach PyGTK nájdete len verziu 2.12 pre Windows, pričom pre Linux sa používa 2.16. Novší build pre Windows je tu: OptionExplicit.be

Október 28, 2009

Odosielanie mailu s diakritikou z Pythonu

Jaj. To som zase mal veľkú radosť, keď som zistil, že TurboMail má problémy s odosielaním mailov s diakritikou. Ja chápem, že ľudí v anglofónnych krajinách príliš netrápia nejaké tie srandovné veci nad písmenkami. Bez diakritiky je aplikácia pre Európu bezcenná.

Tak, dosť lamentu. Ako poslať z Pythonu mail v UTF-8?

Tu je kód, ktorý som prevzal od Mariusa Gedminasa a rozšíril som ho o pár riadkov, aby bol priamo spustiteľný.

# -*- coding: utf-8 -*-
from smtplib import SMTP
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import parseaddr, formataddr

def send_email(sender, recipient, subject, body):
    """Send an email. All arguments should be Unicode strings (plain ASCII works as well). Only the real name part of sender and recipient addresses may contain non-ASCII characters. The email will be properly MIME encoded and delivered though SMTP to localhost port 25. This is easy to change if you want something different. The charset of the email will be the first one out of US-ASCII, ISO-8859-1 and UTF-8 that can represent all the characters occurring in the email. """

    # Header class is smart enough to try US-ASCII, then the charset we
    # provide, then fall back to UTF-8.
    header_charset = 'ISO-8859-1'

    # We must choose the body charset manually
    for body_charset in 'US-ASCII', 'ISO-8859-1', 'UTF-8':
        try:
            body.encode(body_charset)
        except UnicodeError:
            pass
        else:
            break

    # Split real name (which is optional) and email address parts
    sender_name, sender_addr = parseaddr(sender)
    recipient_name, recipient_addr = parseaddr(recipient)

    # We must always pass Unicode strings to Header, otherwise it will
    # use RFC 2047 encoding even on plain ASCII strings.
    sender_name = str(Header(unicode(sender_name), header_charset))
    recipient_name = str(Header(unicode(recipient_name), header_charset))

    # Make sure email addresses do not contain non-ASCII characters
    sender_addr = sender_addr.encode('ascii')
    recipient_addr = recipient_addr.encode('ascii')

    # Create the message ('plain' stands for Content-Type: text/plain)
    msg = MIMEText(body.encode(body_charset), 'plain', body_charset)
    msg['From'] = formataddr((sender_name, sender_addr))
    msg['To'] = formataddr((recipient_name, recipient_addr))
    msg['Subject'] = Header(unicode(subject), header_charset)

    # Send the message via SMTP to localhost:25
    smtp = SMTP("localhost")
    smtp.sendmail(sender, recipient, msg.as_string())
    smtp.quit()

send_email('odosielatel@sinusgear.com',
 'prijemca@sinusgear.com',
 u'Guľôčka v jamôčke',
 u"""Lečo, haruľa, šašlík.
A ako dopadne odosielanie ďalšieho riadku? Bude na novom riadku.
A čo tak odoslať trošku dlhší reťazec znakov, než obyčajných 80, aby sme videli, ako si s tým mailer programy poradia. """)

Všetko. Stačí uložiť do send.py a zavolať: python send.py

Tisíce ďakovných listov od spokojných Pythonierov a neskonalá vďaka Mariusovi.

Október 25, 2009

Prístup na Facebook pomocou Pythonu

Facebook ponúka API pre rôzne jazyky a technológie. Poďme sa pozrieť, ako je možné vytvoriť jednoduchú dekstopovú aplikáciu v Pythone, ktorá zaktualizuje stav požívateľa.

Najskôr si stiahnime PyFacebook pomocou Gitu

git clone git://github.com/sciyoshi/pyfacebook.git

Potom nainštalujeme PyFacebook:

cd pyfacebook
python setup.py install

Ďalej je nutné zaregistrovať aplikáciu na Facebooku, čím získame API Key a Secret. Pri konfigurkácii zvolíme v záložke Advanced položku Application Type – Desktop.

facebook-desktop-appKým sa vyreplikuje zmena nastavenia aplikácie, zostavíme jednoduchý program v Pythone, ktorý bude vedieť zaktualizovať status na Facebooku. API_KEY a SECRET si nahraďte svojimi hodnotami.

import facebook
fb = facebook.Facebook(API_KEY, SECRET)
fb.auth.createToken()
fb.login()

V tomto mieste, už máme vytvorenú inštanciu triedy Facebook a môžeme veselo volať jej metódy, napríklad v konzole pomocou iPython. Na to, aby sme mohli aktualizovať status na Facebooku, budeme musieť používateľa požiadať o právo na aktualízáciu.

fb.request_extended_permission('status_update')

A môžeme aktualizovať.

fb.status.set('Uspesny update statusu pomocou PyFacebook a iPython')

Ako to vyzerá v praxi? Ukážka v iPython konzole:

facebook-ipython-updateVýsledok na Facebooku:

facebook-vysledokEšte doplním odkaz, pre vývojárov v Adobe Flex/AIR. Dobrý zdroj nájdete na adrese: http://www.adobe.com/devnet/facebook/

Október 22, 2009

WSGI mizerný výkon? Čo tak prečítať manuál?

Ako som už písal, WSGI posúva možnosti hostovania Python aplikácii o míľové kroky dopredu. U WSGI je však jedna zrada, ktorá môže spôsobiť, že vaša aplikácia má namiesto dramaticky vysokého výkonu, výkon dramaticky mizerný.

Problém je v tom, že väčšina tutoriálov vám odporúča nainštalovať WSGI a spraviť drobnú konfigurácie. Tradá a aplikácia funguje.

Lenže!

Ide relatívne rýchlo a ešte rýchlejšie vám zožiera pamäť. Pri vysokej záťaži odvarí server na load 55 a podobné radosti. V čom je problém? Neprečítali ste si manuál.

Autori WSGI už asi boli znechutený tým, ako na nich ľudia neustále frflú a  upozornenie pre používateľa dali na prvú stránku projektu. Niečo na štýl: nesušte zápalky v mikrovlnke.

Problém je v tom, že v základnom móde beží WSGI ako embeded aplikácia. Čo je tak dobré na malé jednoduché aplikácie typu Ahoj Mexiko. Pokiaľ teda nie ste expertom na tunenie Apacha, je pre vás vhodnejší mód, kedy beží aplikácia v démon procese.

Čo na to treba? Vlastne pridať len dva riadky do konfigurácie VirtualHostu:

WSGIDaemonProcess georgik.sinusgear.com threads=15 maximum-requests=10000
WSGIProcessGroup georgik.sinusgear.com

Úžasné! Rozdiel, ktorý vidíte, aj cítite 🙂

Update: Rozhodne si prečítajte komentár od Messa. Veľmi dobre vysvetľuje princíp fungovania Apache/Python.

https://sk.georgik.rocks/2009/10/22/wsgi-mizerny-vykon-co-tak-precitat-manual/#comment-303

Október 14, 2009

Pythoniersky Zen

Princípy implementované v Pythone veľmi pekne zhrnul Time Peters. Vytvoril 20 aforizmov, z ktorých 19 bolo spísaných a vytvorili tzv. The Zen of Python.

Dovolím si ich preklad prevziať zo stránky py.cz

Hezký je lepší než ošklivý.
Explicitní je lepší než implicitní.
Jednoduchý je lepší než komplexní.
Komplexní je lepší než komplikovaný.
Plochý je lepší než vnořený.
Řídký je lepší než hustý.
Čitelnost se počítá.
Speciální případy nejsou dost speciální na prolomení pravidel.
Ačkoliv praktičnost vyhrává nad čistokrevností.
Chyby by neměly nikdy projít tiše.
Pokud nejsou explicitně utišeny.
Čelíce dvojmyslnosti odmítat pokušení hádat.
Měla by být jedna — a nejlépe pouze jedna — zřejmá cesta, jak to udělat.
Ačkoliv tato cesta nemusí být zřejmá hned, pokud tedy nejste Holanďan.
Teď je lepší než nikdy.
Ačkoliv nikdy je často lepší než právě teď.
Pokud je těžké vysvětlit implementaci, bude to špatná myšlenka.
Pokud je snadné vysvětlit implementaci, může to být dobrá myšlenka.
Prostory jmen jsou skvělá myšlenka — nechť je takových více!

Zen je priamo zabudovaný do Pythonu, stačí zadať:

import this

September 10, 2009

Codeswarm a práca na projekte je vidieť

Pri práci na softvérových projektoch je veľmi problematické sledovať postup a množstvo práce, ktorá bola do projektu investovaná. Jednou z možných metrík je počet riadkov kódu, ktorý vývojár napísal. Táto metrika je však veľmi nepresná. Pretože pomerne často je omnoho cennejších 10 riadkov, nad ktorými vývojár premýšľal, ako 1000 riadkov, ktoré bezhlavo skopíroval a rozmnožil tak množstvo bugov. Trochu lepšie výsledky sa dajú dostať z metriky, ktorá stavia na počte zmenených riadkov a súborov.

Pokiaľ sa v projekte používa version control systém, je možné z logov tohoto systému odsledovať, čo sa kedy dialo. Toto je neoceniteľná pomôcka pre manažérov, aj samotných vývojárov. Získajú tak omnoho lepší prehľad o tom, čo sa v projekte deje. V prípade potreby dokážu vývojári rýchlo lokalizovať a izolovať zmenu, ktorá spôsobila novú nestabilitu systému.

Veľmi zaujímavý projekt, ktorý ťaží práve z zo záznamov o zmenách a vizualizuje ich je CodeSwarm.

Tu je jeden malý príklad. Zobral som logy z projektu Twisted, čo je veľmi silný sieťový engine s množstvom funkcií, ktoré ušetria veľa času pri budovaní sieťových aplikácií.

[FLOWPLAYER=/wp-content/videos/twisted-codeswarm.flv,450,388]

Hudba: Power of Dreams

August 26, 2009

Pre koho je Python?

Keď Guido začal dávať dohromady nový jazyk Python, mal už za sebou skúsenosti z návrhu jazyka ABC. Najdôležitejšim kritériom pre vývoj tohoto jazyka bola čitateľnosť. Guido potreboval jazyk, ktorý by bol jednoducho pochopiteľný aj pre bežných ľudí. O Pythone prehlasujú autority, že je to multi-paradigmový programovací jazyk a majú veru pravdu.

Python je objektový. V čase keď Python začínal, objektové programovanie už malo za sebou nejaký ten rok, ale stále bolo odsúvané na okraj záujmu. Dôkazom toho sú napríklad jazyky ako Perl a PHP, ktoré odsunuli objektovosť naneskôr a potom ju pracne doháňali. V Pythone je proste všetko objekt a hotovo.

Python obsahuje prvky funkcionálneho programovania. Môj osobný pocit z funkcionálneho programovania je, že vlastne myslíte naruby. Človek musí úplne prevrátiť myslenie, pokiaľ sa chce dostať z procedurálnej paradigmy na funkcionálnu. A oplatí sa to. Získate kratší, účinnejší a čitateľnejší kód. Je síce pravda, že čitateľ musí trochu rozumieť princípom funkcionálneho programovania, ale aj bežný používateľ počítača viacmenej pochopí význam. Dobrá lambda abstrakcia môže výrazne skrátiť kód.

Python umožňuje použiť Aspektovo orientované programovanie – AOP. Pokiaľ vám táto téma nie je ešte známa, odporúčam si vypočuť diel podcastu z Software Engineering Radio – Úvod do AOP. Podstatnou vlastnosťou AOP je lepšia modularizácia kódu, čo má za dôsledok lepšiu znovupoužíteľnosť kódu.

Python umožňuje lietať.

A kde teda začať? Určite treba navštíviť stránky venované Pythonu. A pre začiatočníkov rozhodne odporúčam nainštalovať si IPython shell, ktorý vám môže ušetriť množstvo času. Pre priaznivcov Eclipse odporúčam PyDev s nádherným debuggerom. Pre nepriaznivcov Eclipse odporúčam prostredie Eric, ale mali by ste zvážiť, či sa náhodou nestanete radšej priaznivcami Eclipse 😉

Nezabudnite si po spustení Python shellu zadať príkaz: import this

August 9, 2009

Ladenie PHP aplikácie v Eclipse

Eclipse je výborné IDE, ktoré môže ušetriť veľa času. Napríklad v prípade, že pracujete súčasne na projektoch vo viacerých jazykoch ako Java, Python, Perl, či nebodaj PHP. S konfiguráciou Eclipse a PDT pluginom som dlho nemal úspech. Vždy došlo k nejakej neočakávanej chybe. Problémy boli rôzne, nedostupný server, halušky v Eclipse. Ale to už bolo dávno. Tak som sa pustil do zisťovania, či sa v tomto smere niečo nezmenilo. Milé deti, zmenilo a k lepšiemu. 😉

Lokálne ladenie PHP aplikácie v Eclipse je brnkačka, nepotrebujete ani nainštalovaného Apache, či inú web potvoru. Postup je jednoduchý, ale zradný. Ak šliapnete mimo vyznačenej cesty, hrozí vám prepad do bažiny, kde vás zožerie nejaká chyba.

  1. stiahnite Eclipse for PHP developer (návod je písany na Eclipse 3.5)
  2. rozbaľte ho, vytvorí sa adresár eclipse (pre Windows odporúčam použiť na rozbaľovanie 7zip, natívny rozzipátor akosi nefunguje správne, aspoň mne nerozbalil všetko)
  3. doinštalujte Zend Debugger, EclipseHelpInstall new softwareAdd
  4. Name: PDT, URL: http://downloads.zend.com/pdt, Ok, vyberte Zend Debugger a pokračujte v inštalácii
  5. presvedčte sa, že po reštarte Eclipse máte zvolený správny debugger, EclipseWindowPreferencesPHPPHP Executables, mali by ste mať zvolené niečo ako PHP 5.2.9 CGI z adresára, kde je Eclipse

A hurá debuggovať. EclipseNewPHP Project – zadať Project name – Finish. Pozor! Ak dáte Next namiesto Finish, je možné, že skončíte s chybovým hlásením duplicated entry. Pravdepodobne chyba vo workflow.

Vytvorte si nový PHP súbor, napríklad pozdrav.php:

<?php
echo “Ahoj Georgik!”;
?>

Dvojkliknite na pásik panelu vľavo na riadku 2, čím nastavíte break point.

eclipse-php-break-poing

A môžeme s chuťou debuggovat. Pravý klik v editovacom okne – Debug asPHP script. Eclipse sa prepne do PHP Debug perspektívy a zastaví sa na break pointe. Ovládanie debuggera som už popisoval :-).

Takto nastavený Eclipse môžete použiť na lokálne ladenie. Nezabudnite používať vhodný framework na písanie PHP aplikácii. Skupina zubných lekárov odporúča framework Nette. 😉