poniedziałek, 31 sierpnia 2009

Polskie znaki w Pythonie S60

Zazwyczaj przerabiając kody Pythona z różnych źródeł, zauważyłem że sporo z nich wymaga przetłumaczenia na język polski. W tej sytuacji warto mieć taką ściągawkę jak zapisuje się polskie znaki w unikodzie.


from appuifw import *
import e32

class SampleApp:
```zapis polskich znaków
Ą - \u0104 ą - \u0105
Ć - \u0106 ć - \u0107
Ę - \u0118 ę - \u0119
Ł - \u0141 ł - \u0142
Ń - \u0143 ń - \u0144
Ó - \u00d3 ó - \u00f3
Ś - \u015a ś - \u015b
Ź - \u0179 ź - \u017a
Ż - \u017b ż - \u017c
```


def __init__(self):
self.new_line = u"\u2029"
app.title = u"Przyk\u0142adowa aplikacja"
app.screen = "normal"
app.menu = [( u"O programie", self.about ),
( u"Wyj\u015bcie", self.quit_app )]
self.body = Text()
app.body = self.body
self.body.add(self.new_line + u"Za\u017c\u00f3\u0142\u0107 \u017c\u00f3\u0142t\u0105 g\u0119\u015b." + self.new_line)
app.exit_key_handler = self.quit_app

def quit_app(self):
self.lock.signal()

def about(self):
note( u"Przyk\u0142adowa aplikacja", "info" )

def run(self):
self.lock = e32.Ao_lock()
self.lock.wait()
app.set_tabs( [], None )
app.menu = []
app.body = None
app.set_exit()

if __name__ == "__main__":
app = SampleApp()
app.run()

niedziela, 30 sierpnia 2009

Tworzenie paczki z aplikacją w Pythonie na komórki

Tworząc aplikacje na komórki z Symbianem trzeba robić paczkę instalacyjną. Jest trochę powodów dla których warto robić takie paczki instalacyjne. Większość ludzi nie będzie celowo instalować interpretera Pythona, żeby uruchamiać skrypt Pythona. Trochę jest z tym problemów jak się ma folderze Python kilkadziesiąt skryptów. Zrobienie paczki instalacyjnej może ułatwić szybsze uruchamianie skryptu jako aplikacji Symbian zainstalowanej w folderze Instalacje.

Obecnie są 2 silniki Pythona: Jeden silnik o nazwie "Python for s60" instaluje się głównie na komórkach z S60 3rd i ostatnia wersja nosi numer 1.4.5. Od roku czasu programiści pracują nad wersjami silnika o nazwie "Python Runtime" obecnie najnowsza wersja w chwili pisania tego artykułu nosi numer 1.9.7 i ma być docelowo dla modeli S60 5th oraz dla S60 3rd FP2 i S60 3rd FP2.

W praktyce to oznacza że nie zaleca się posiadania dwóch wersji silników na jednej komórce. Jest to podyktowane tym że silniki inaczej działają jako interpretery i jako biblioteki do uruchomienia aplikacji. Biorąc to pod uwagę to ze główna różnica pomiędzy S60 5th a S60 3rd polega na obsłudze ekranu dotykowego - wiec trzeba w przypadku aplikacji opierających się na klasie Canvas napisać tak żeby obsługiwały zdarzenia z dotykiem. Załóżmy że korzystamy z klas UI to w tej sytuacji kod aplikacji nie zmienia się. Teraz pozostało zrobić wersje instalacyjne dla tych którzy mają "Python for S60" i jak "Python Runtime".

W tym pierwszym przypadku trzeba pobrać bibliotekę Ensymble.py odpowiednią dla wersji Pythona w komputerze ze strony Google Code. Wystarczy pobrać też plik Openssl.exe z tej strony A następnie zrobić folder SampleApp i wrzucić pliki to tego folderu a następnie dodać plik skryptu Pythona, który będzie aplikacja Symbiana.

Oto kod przykładowego szablonu skryptu Pythona, który ma być aplikacją Symbiana.


from appuifw import *
import e32
import time
import sysinfo
import graphics

class SampleApp:

BLACK = (0,0,0)
BLUE = (51,204,255)

def __init__(self):
self.screen = None
app.title = u"Przykladowa aplikacja"
app.screen = "normal"
app.menu = [( u"About", self.about ),
( u"Exit", self.quit_app )]

self.canvas = Canvas( redraw_callback = self.redraw, event_callback = self.event )

app.body = self.canvas
self.timer = e32.Ao_timer()
self.width, self.height = self.canvas.size
self.screen = graphics.Image.new( (self.width, self.height) )
self.screen.clear( self.BLACK )
self.screen.text((5,15),u"Start", fill = self.BLUE)
self.canvas.blit( self.screen )
app.exit_key_handler = self.quit_app

def quit_app(self):
self.lock.signal()

def about(self):
note( u"Sample App", "info" )


def redraw(self,rect):
if self.screen:
self.screen.clear( self.BLACK )
self.canvas.blit( self.screen )

def event(self,event):
pass


def run(self):
self.lock = e32.Ao_lock()
self.lock.wait()
app.set_tabs( [], None )
app.menu = []
app.body = None
app.set_exit()

if __name__ == "__main__":
sw = SampleApp()
sw.run()

Następnie dodajemy plik wsadowy który ma zrobić paczkę dla tej aplikacji:

@echo off
SET VERSION=1.0.4
SET PYTHON=C:\Python25\python
SET APPNAME=SampleApp
SET CAPBLS=LocalServices+NetworkServices+ReadUserData+WriteUserData+UserEnvironment

%PYTHON% .\ensymble.py py2sis --version="%VERSION%" --heapsize=4k,5M --appname="%APPNAME%" --caps="%CAPBLS%" SampleApp.py "%APPNAME%%VERSION%.sis"

i wystarczy uruchomić.
Natomiast Ci którzy chcą zrobić aplikację pod "Python Runtime" wystarczy że pobiorą
PythonForS60_1.9.7_Setup.exe i zainstalują to. W menu Start -> Aplikacje będzie PythonforS60 1.9.7 -> PyS60 Application Package i uruchomią to. Pojawi się okno dzięki któremu będą mogli zrobić paczkę instalacyjną z aplikacją Symbiana ze skryptu Pythona. Nie należy tym programem robić paczek instalacyjnych w wersji dla silnika "Python for S60" 1.4.5 pomimo że jest taka opcja.

poniedziałek, 10 sierpnia 2009

Symbian OpenC/C++

Tempo rozwoju trochę stało się zawrotne w porównaniu do tego co było kiedyś, kiedy rozwój programowania pod Symbianem wydawał się bardzo powolny, bardzo ewolucyjny. Ostatnio właściwie nie ma dnia żeby coś nowego zaprezentowało się. Ponieważ już oficjalnie potwierdzono że Qt for S60 będzie podstawowym frameworkiem dla Symbian^4, co powoduje też zmianę funkcjonowania GUI. W praktyce oznacza że aplikacje pisane pod S60 przy użyciu frameworka AVKON nie będą uruchamiane w Symbian^4. Według mnie to nie jest żaden problem bo w praktyce komórki z S60 będą jeszcze bardzo długo produkowane przez Nokię tak jak teraz jest z S40. Na poziomie programistycznym kod Qt for S60, OpenC/OpenC++ przy niewielkich zmianach będzie chodził w Symbian^4, co powoduje szybkie przenoszenie aplikacji. Jeszcze nie do końca wiadomo jaka będzie referencyjna warstwa sprzętowa dla Symbiana^4. Obecnie preferowane są procesory ARM architektura RISC), być może przeniesienie kodu Symbiana na procesory Atom (architektura CISC) będzie sprzyjało powstaniu wydajnych notebooków / netbooków.

Warto zwrócić uwagę że tak naprawdę za rozwój Symbiana obecnie odpowiada OpenC/OpenC++. Nokia wypuściła OpenC/OpenC++ w lutym 2007 roku jako rozszerzenie do SDK S60 3rd FP1 (najpierw pod nazwą PIPS). Obecnie 2 zespoły pracują nad rozwojem tej biblioteki zespół tworzący biblioteki Qt for S60 i zespół tworzący bibliotekę Pythona (PyS60 2.0). Najciekawsza jest sytuacja programistów którzy programują pod Pythona S60. Otóz mają 2 wersje bibliotek 1.4.5 (kod zródłowy i binaria) a tymi programistami którzy rozwijają wersję Python 1.9.x (kod żródłowy i SDK) Ci ostatni mają już dostęp do kodu OpenC 3.0.

Duże zainteresowanie Pythonem sprawiło że Nokia postanowiła wypuścić usługę na komórki Nokia Web Server oparty na serwerze Apache w silniku Raccon wdrażając potem możliwość tworzenia dynamicznych skryptów opartych na Pythonie. W tym celu stworzono programistom SDK do tworzenia rozszerzeń pod ten serwer. Ponieważ na programowanie pod Python Server Pages nie było zainteresowania, z drugiej strony narzucono odpowiedni framework aplikacyjny co przy braku dobrej dokumentacji nie do końca było jasne jak programować aplikacje na Nokia Web Server. W tej sytuacji eksperymentalnie postanowiono rozwijać PAMP, umożliwiając programistom PHP łatwe przemienienie aplikacji PHP na komórki (kod zródłowy i binaria) Jest to pierwszy z większych projektów w którym użyto OpenC. Dalszy rozwój tego projektu jest zależny od fundacji Symbian czy zechce wbudować serwer jako możliwość dostępu do API aplikacji Symbiana opartych na widgetach mobilnych. Jedną z ciekawszych rzeczy w PAMP jest przeniesienie silnika bazy danych MySQL na aplikacje Symbian o czym pisze wywiad z twórca tego przedsięwzięcia Johanem Wikmanem.

Wraz z udostępnieniem bibliotek OpenC Nokia zorganizowała konkurs na przeniesienie bibliotek OpenSource wygrała aplikacja MobiTubia za przeniesienie bibliotek libavcodec, z ciekawszych aplikacji to okazało sie MobiClass 2.0

Od tej pory coraz więcej powstawało bibliotek z kodami źródłowymi pod Symbianem w konsekwencji spore zainteresowanie pod kątem kodów do aplikacji multimedialnych ( do tworzenia narzędzi i gier).

Podstawową biblioteką do obsługi multimediów okazała się biblioteka SDL (dokumentacja) a także przykład gier opartych na bazie tej biblioteki: c2Doom, Starmaze, Wolf 3D, Sinvaders, Battletamagothi. Ponieważ kod silnika Pythona jest publiczny to przeniesiono kod silnika do gier pyGame. Też sprzyjało rozwojowi różnych silników od fizyki: Chipmunk S60 (kod źródłowy) a także Symbian Open Dynamics Engine, silników do grafiki 3D dla gier mIrrlicht i Irrlicht for S60, a także popularnego silnika dla grafiki 2D Cairo, przeniesiono też popularne frameworki UI: wxWidgets, fltk-s60, GTK for Symbian. Dostępność biblioteki OpenC sprzyja przenoszeniu na platformę Symbian nowych języków skryptowych Lua i jak Ruby, czy silników baz danych takich jak SQLite. Jako ciekawostkę można potraktować bibliotekę dla Argumented Reality i jak jej implementację. W najbliższym czasie można spodziewać się wydania książki Marka Wilcoxa - Porting to the Symbian Platform : Open Mobile Development in C/C++