29 października 2008

Tetris - jak niewiele kodu potrzeba do szczęścia


Przyglądając się różnym kodom źródłowym wielu dziwacznych czasem aplikacji czy tez serwerów nie zdajemy sobie sprawy, że tak niewiele kodu potrzeba, aby zapomnieć na chwilę, że komputer to nie tylko maszyna licząca, ale też zabawka :-) Dzisiejszym tematem jest gra tetris, która towarzyszy historii komputerów od dawien dawna. Chciałbym zobrazować jaki prosty algorytm przyczynił się do popularyzacji gierek typu tetris jako edukacyjny element dla programistów oraz zabawka dla nas wszystkich.

Jak nie trudno się domyślić gra tetris została napisana w różnych językach programowania od asemblera, poprzez BASIC, FORTRAN, Pascal, C, C+, Python, PHP, Java, Erlang oraz wiele egzotycznych.

Oto klasyczna gra tetris w różnych językach programowania:

http://code.google.com/p/4bricks/

http://www.katalog.pogodzinach.net/link/23479,ciapek_pl/tetris_php.html

http://survex.com/~olly/dsm_rheolism/explanation.html


http://www.ciapek.pl/index.php?go=g_tetris&ka=gry

http://www.johnymas.info/index.php?stran=tetris

http://www.javascripter.net/games/tetris/game.htm

Google API - sprawny kod, który rozdają za nic



Na stronie google API znajdziemy kilka istotnych linków do konkretnych serwisów sieciowych promowanych w ostatnim czasie przez giganta.

Skoro masa firm trzecich potrafi utrzymywać się z tego, że używają Google Translation API lub Google Adwords API, do tego dodając MUSUPy bazujące na Google Maps API, wychodzi nam bardzo złożona kanapka, którą tylko wystarczy mądrze wykorzystać :)

Czekam z niecierpliwością na Open Office pracujący on-line w przeglądarce z wymarzonym API do arkusza kalkulacyjnego, aby opierać swoje DLSe na takich rozwiązaniach bazujących na np: Google Spreadsheets API :)

Oto kilka z nich:
http://code.google.com/apis/ajaxlibs/documentation/#AjaxLibraries
http://code.google.com/apis/ajax/
http://code.google.com/apis/ajaxlibs/documentation/#mootools

26 października 2008

Guido von Robot - prosty symulator robota w Pythonie

GvR (Guido von Robot) to niewątpliwie kolejna alternatywa programowania przy pomocy żółwia analogicznie jak w języku LOGO. Istnieje jednak banalna różnica, która polega na zawężeniu zastosowania GvR do pisania algorytmu dla prostego robota wykorzystując składnie języka Python. Autor zminimalizował ilość zdefiniowanych funkcji, instrukcji oraz logikę do programowania robota. W założeniach programu jest edukacja dzieci i młodzieży - jako wstęp do podstaw programowania banalnych robotów.
O ile chcecie pobawić się w projektowanie algorytmu działania prostego robota oraz podejrzeć działanie algorytmu na własnym torze przeszkód to jest zabawka dla was.

Do dyspozycji jest pięć prymitywnych instrukcji:
1. move
2. turnleft
3. pickbeeper
4. putbeeper
5. turnoff



Dodatkowo możliwe jest używanie osiemnastu przygotowanych poniższych instrukcji specjalnych:
1. front_is_clear
2. front_is_blocked
3. left_is_clear
4. left_is_blocked
5. right_is_clear
6. right_is_blocked
7. next_to_a_beeper
8. not_next_to_a_beeper
9. any_beepers_in_beeper_bag
10. no_beepers_in_beeper_bag
11. facing_north
12. not_facing_north
13. facing_south
14. not_facing_south
15. facing_east
16. not_facing_east
17. facing_west
18. not_facing_west


Powyższe instrukcje podzielić można na kilka grup:
1. testujące obecność ściany wall
2. testujące obecność znacznika beeper,
3. testujące kierunk położenia (funkcje kompasu)


Możliwe jest wykorzystanie następujących instrukcji warunkowych:
if test:
instrukcje

if test:
instrukcje
else:
instrukcje

if test:
instrukcje
elif test:
instrukcje
...
elif test:
instrukcje
else:
instrukcje


oraz poniższych pętli:
do dodatnia_liczba:
instrukcje

while test:
instrukcje


Co najważniejsze możliwe jest tworzenie własnych funkcji, których nazwy zawerają wyłącznie ltery i podkreślnik:
define nowa_nazwa_funkcji:
instrukcje


Całość oparta jest o dwa edytory tekstowe, w których definiujemy świat dla robota oraz piszemy algorytm jego działania. Interfejs graficzny jest maksymalnie uproszczony i pozwala na podglądanie w pracy krokowej oraz ciągłej działania stworzonego robota w uprzednio zdefiniowanym świecie. Dla wygody istnieje możliwość narysowania swojego świata w trybie graficznym. Chcąc zacząć zabawę musimy zainstalować sobie aplikację GvR np:
sudo apt-get install gvr


Oto przykładowy kod mojego świata oraz algorytm działania prymitywnego robota:

Kod świata:
Robot 4 3 N 0

Beepers 4 7 1
Beepers 4 2 2
Beepers 4 4 3
Beepers 7 2 4
Beepers 2 2 5
Beepers 7 2 6

Wall 2 6 N
Wall 2 4 N
Wall 5 4 N
Wall 5 4 W
Wall 10 4 W
Wall 4 10 W
Wall 4 10 S
Wall 5 10 S
Wall 7 9 S
Wall 7 9 W
Wall 8 8 W
Wall 6 10 S
Wall 5 8 S
Wall 8 1 W
Wall 9 2 W
Wall 8 3 W
Wall 6 4 N
Wall 6 3 N
Wall 8 2 N
Wall 8 4 N
Wall 8 4 S
Wall 8 5 S
Wall 8 2 S
Wall 9 4 S
Wall 1 2 S
Wall 4 2 S
wall 3 10 N
wall 2 10 N
wall 1 10 N
wall 8 6 N
wall 8 7 N
wall 9 7 E
wall 9 8 N
wall 8 9 E
wall 8 9 N
wall 7 10 E
wall 6 10 E
wall 7 10 N
wall 9 8 E
wall 10 6 N
wall 11 6 N
wall 11 6 E
wall 11 5 N
wall 10 5 E
wall 10 5 N
wall 11 5 E
wall 11 4 E
wall 11 3 E
wall 11 2 N
wall 10 3 N
wall 10 1 N
wall 10 1 E
wall 11 2 E
wall 11 1 E
wall 5 6 E
wall 6 5 N
wall 2 8 E
wall 2 7 N
wall 1 10 E
wall 2 10 E

Kod działania robota:

define turn_unblocked:
if front_is_blocked:
while front_is_blocked:
turnleft

define turn_from_while:
if front_is_clear:
if next_to_a_beeper:
turnleft

do 1000:
turn_from_while

if next_to_a_beeper:
pickbeeper
if front_is_blocked:
turn_unblocked
else:
move

if front_is_blocked:
turn_unblocked
else:
if any_beepers_in_beeper_bag:
putbeeper
move

move

turnoff


Tak wygląda zainstalowana i działająca aplikacja GvR:


Linki:
http://gvr.sourceforge.net/about.php
http://rur-ple.sourceforge.net/en/rur.htm
http://gvr.sourceforge.net/lessons/rfrank/
http://pyrorobotics.org/?page=Robot_20Simulators
http://en.wikipedia.org/wiki/Karel_the_robot
http://en.wikipedia.org/wiki/Robotics
http://www.nebomusic.net/computerhelp.html
http://bricxcc.sourceforge.net/nbc/
http://mindstorms.lego.com/Overview/NXTreme.aspx
http://www.youtube.com/watch?v=uLomAePdPII&NR=1
http://www.eres.alpha.pl/elektronika/articles.php?cat_id=12

23 października 2008

Konsekwentne kodowanie i testowanie aplikacji internetowych

Wymiatający jest kod, który działa, ale taki, który działa w IE6 potrafi wymiatać podwójnie ...

Rozpoczynający dzisiejszą wypowiedź cytat/frazes nie jest przechwalaniem się jakiej to przeglądarki używam, ale raczej powieloną na mój sposób przestrogą, że w określonych okolicznościach warto pomyśleć o archaizmach. Ponoć każdy wytwór ludzkiej wyobraźni ma swój kres, gdyż rodzi się kolejny. Każda kolejna imaginacja może być jakościowo inna. Każdy produkt powinien pasować do marki i ją reprezentować. Moim zdaniem IE6 pasuje idealnie do marki M$ i ją także świetne reprezentuje.
Tak sobie spojrzałem i nawet specjaliści od testowania posiadają ratujący ich przed IE6 komentarz, który pozwolę sobie przytoczyć:


Testerzy kontra przeglądarki


Starając się dotrzeć do jak największej ilości odbiorców, dostarczając najlepszą jakość Testerzy.pl wyświetlają się poprawnie w:

* IE 7.0 i 8.0
* FireFox 2.0 i 3.0
* Opera 9.5 i wcześniejsze

Robimy wiele aby wyświetlać się poprawnie również w IE 6.0 jednak wymaga to od nas anielskiej cierpliwości i testów po każdej aktualizacji strony.



Oczywiście jest to przykłądowy i zupełnie przypadkowo odnaleziony komunikat informujący o tym, że nawet profesjonaliści od kontroli jakości mogą mieć IE6 w d.... bo powodów jest cała masa i rozmawiać można o nich wypijając przy tym skrzynkę ciemnego miodowego trunku. Oczywiście są tacy, którzy stają w obronie i udają, że im się udaje sprostać wymaganiom IE6. Ludzie, nie tędy droga :) Gdzie są wasze wymagania, założenia projektowe, konsekwencja w trzymaniu się założeń, hahahaaa ... niektórzy skomentują to śmiechem, ale wiele wielkich firm kupuje produkty działające tylko pod jedną przeglądarką. Pytanie, czy tylko nie są aplikacje intranetowe, w których problem jest z góry załatwiony.

W dobie ogólnej GPL, GPL2, *BSD i wszelkichj OpenSourcowych dowolności niekiedy zapominamy o tym, że pisząc coś dla publikacji w internecie warto się liczyć ze statystykami. Na co dzień pojawiają się wielce znaczące artykuły, które podają udział przeglądarek w rynku, lecz to często poszlaki. Nie jest tajemnicą, że tylko giganci internetowi mogą takie realne statystyki posidać, kiedy na ich portalach i stronach są treści różne i przyciągają użytkowników w różnym wieku oraz wszelakich zainteresowaniach. Ta wiedza tajemna jest też na sprzedaż i nie oszukujmy się, że z koleji inni giganci ją po prostu kupują i artykuły jakie na jej podstawie się rodzą będą bardziej na tą a mniej na tą psioczące i nie koniecznie obiektywne. Chciałbym pominąć artykuły zlecane przez M$, bo to są sztuczki marketingowe, ale nie pomijam bo to są działania skutecznie utrudniające życie teserom i deweloperom aplikacji internetowych. O tych właśnie grupach zawodowych będzie poniżej mowa :)

Z deweloperką aplikacji internetowych spotykam się na co dzień i z testerami także. Każdy ma swój zakres obowiązków oraz zakreśla fragment koła wokół którego obraca się internet. Patrząc z punktu widzenia praktycznego jeden i drugi boryka się często z problemem zakresów, w ramach których jest coś realizowane. Tak też można egzystować, ale pytanie jak długo ... pewnie do pierwszego grubego klienta, który ewidentnie powie dość i straty spowodują koniec zabawy. Dokładniej, czy czasem robienie aplikacji bez określonych wytycznych nie jest zabawą ? Na to pytanie spróbujmy sobie sami odpowiedzieć ...

Osobiście zachęcam do kartki papieru, ołówka i trzeźwego myślenia w kwestiach zasadniczych, które dotyczą przyszłego projektu. Wiele spraw, które założymy na wstępie pojawi się w trakcie, a te których nie założyliśmy zależnie od naszej konsekwencji pewnie też się pojawią. Trzymanie się ram jest o tyle ciężkim zajęciem, że zarówno indywidualnie jak i w grupie projektowej jest mnóstwo zajęć rozpraszających. Także pośrednio jesteśmy skazani na robienie wszystkiego i niczego pod warunkiem, że wiemy co znaczy konsekwencja. Dzięki niej wiele projektów jest kończonych na czas i ich jakość jest na wysokim poziomie.
Pomyślałem, że umieszczę link do wikipedii, bo nam wszystkim się przyda. Przypominanie sobie o niej uratowało niejeden projekt, więc zachęcam do kodowania konsekwentnego, któro po kodowaniu zwinnym ma tą zaletę, że nikt nam nie zarzuci, że coś mu nie działa w IE6 :-)

Kilka linków:
Testowanie w agile 2
Wojna przeglądarek
Przeglądarki używane przez internautów łączących się z polskimi witrynami z obszaru Polski. Ranking jest tworzony na podstawie liczby odsłon.

Exciting times in python testing world

Python Testing Tools Taxonomy

Agile Testing Articles and Tutorials

22 października 2008

PyCon 2008 Rybnik - wśród przeróżnych Pythonów



Zapowiadana podróż do Rybnika, gdzie odbyła się konferencja PyCon2008 uwieńczona została sukcesem w postaci świeżego spojrzenia na kilka bieżących technologii skojarzonych z językiem programowania Python. Oto moje trofea :-)



Być może nieco szczupłe będą moje notatki w porównaniu do wielkości tematów poruszanych na konferencji. Tak się złożyło, że uczestniczyłem we wszystkich wykładach i udawało mi się zadawać konstruktywne pytania prelegentom, z których snuję sobie wnioski. Jest ich kilka i chcę się nimi podzielić:


  • nie jest prawdą, że Python to niszowy język programowania - wręcz przeciwne w porównaniu do znanego wszystkim gimnazjalistom (i nie tylko) PHP - jest tylko słabo wypromowany (nie pomijam oczywiście rekomendacji firmy google.com ) i dający duże możliwości prezentacji naszych pomysłów pod konsolą, na stronie www, w postaci aplikacji desktopowej, w urządzeniach wbudowanych, telefonach komórkowych i okazuje się, że również w laboratoriach badawczych/naukowych.

  • jest prawdą, że Python ma słabą społeczność w Polsce bo nie ważne wg. jakiej metryki byśmy to mierzyli ponad 100 osób chętnych na spotkanie w jednym miejscu i łaknący wymiany doświadczeń to skromnie ... ale to jest pierwsza impreza w Polsce pod dumnym hasłem PyCon, natomiast jest to druga tej skali obok poznańskiego RuPy i jest to dla mnie istotne, że temat jest godny konferencji. Są też takie języki programowania, w których programiści zabijają się o zlecenia i niechybnie zapominają o higienie pracy, konsekwencji w kodowaniu - bo tłumaczą się czasem, że np. język narzuca im niechlujstwo, zbyt wiele rozwiązań, brakuje dobrze napisanych bibliotek, etc ...

  • jest sprawą oczywistą, że skoro mowa o Python, to też mowa o sporych możliwościach, czyli przetestowanych zbiorach modułów, które wspiera społeczność na całym świecie, kilku liczących się frameworkach i sukcesywnych wdrożeniach różnych aplikacji, między innymi webowych. Mam na myśli Django, o którym wspomniał na tej konferencji Marcin Mierzejewski (polecam też podstawy Django, które przygotował Marcin Kaszyński na Django - EuroPython 2008) i do tego CMS z możliwością rozbudowy Plone

  • bo Python też trochę wyznaje filozofię Ubuntu, tzn. tej słynącej dystrybucji Linux jest niejako elementarną częścią, bo przejmuje rolę w Desktopach dość dopracowanej obsługi notyfikacji, obsługi komunikatów systemowych i uruchamiania jakże istotnych apletów ;)

  • traktuje obiektowość minimalistycznie - w kilku linijkach napiszemy dość konkretne funkcjonalności (np: serwer, który nasłuchuje, udostępnia usługi w sieci i wykonuje odpowiednie polecenia w wątkach, wyzwala procesy cykliczne, generuje raporty w PDF i wysyła na e-mail, ftp, ssh), ale specjalnie dla zaniepokojonych programistów Java będą niebawem typowe interfejsy, które już dziś można tworzyć w określony sposób. Dodatkowo Python 3000 to nie będzie akcja typu piszę w PHP4 a teraz w PHP5 - a za rok się przesiadam na PHP6, bo providerzy też już go mają :) - społeczność poszła krok dalej i przeprowadzona będzie formalna migracja pozwalająca przetestować, czy aplikacje w Python 2.4 i 2.5 będą działały w Python 3000 ... a to już mnie przekonuje do zabawy więcej w węże a mniej w słonie :-)

  • okazuje się, że spora jest liczba dopracowanych bibliotek standardowych do pisania skryptów oraz niezależnych projektów OpenSource t.j. Sourceforge.net, koders.com,

  • szybki start programowania i sprzyjająca kodowaniu w konwencjonalnym stylu napisana dokumentacja np: Python Docs WebOb. Wybór języka Python przez NASA też nie był przypadkowy.

  • możliwość pisana wirtualnych interpretatorów przy pomocy samego języka i osadzania go w innych to taki kosmos, jaki już oferuje Python. Chcąc dla przykładu napisać sobie dedykowaną funkcjonalność garbage collection nie będziemy osamotnieni, bo projekt omawiany na konferencji PyPy nam to z miejsca umożliwia

  • moje ulubione testy rozmyte i wszelakie inne pisze się w Pythonie po prostu konsekwentne i z dużym naciskiem na stosowanie framworków tzn. znajdziemy swój ulubiony sposób testowania jednostkowego, funkcyjnego, regresyjnego, jak również przeprowadzimy bardzo ważne fuzz testing, o których był dość konkretny i obiecujący wykład na konferencji

  • wyczytałem kiedyś, że PHP5 wygląda na zaprojektowany na kolanie i chciałbym od razu zaznaczyć, że Python nie posiada tej wady, bo autor języka bardzo restrykcyjnie dobiera moduły biblioteczne, nie dopuszczając doń szajsowatych, niewnoszących nic rozwiązań

  • pozwala mi na używanie gotowych i przetestowanych rozwiązań do obsługi GDATA w ramach aplikacji googla. Rozjaśniając mój telefon + kalendarz googla to jedna i ta sama baza danych, którą synchronizuje też z innym, egzotycznym systemem korporacyjnym ... do tego stopnia bezboleśnie, bo na telefonie i komputerze PC mam kod napisany w Python

  • okazuje się, że można napisać program bez użycia instrukcji i zmiennych, bo w Pythonie jest możliwe programowanie funkcyjne. Do tego jesteśmy formalnie w stanie dowieść, że program jest bezbłędny. Może Python to nie Ocaml, ale zawsze można inny język na nim osadzić :-) Podstawy języka funkcyjnego w Pythonie to: lambda, map, reduce, filter

  • w ramach metodyki TDD i BDD, przy założeniach, że chcemy mieć pełne pokrycie testowe jest też wiele frameworków do testowania np: PyUnit, unittest, doctest, nosetest

  • jest wiele powodów, dla których w Narodowym Archiwum Cyfrowym aplikacje są tworzone właśnie w Pythonie ... ponoć jeden z nich to problem obsłużenia 2.5 milionów rekordów w bazie danych archiwum. Na szczęście jest Python + niskopoziomowa obsługa zapytań z pominięciem wszelkiej maści ORMy oraz partycjonowanie tabel poprzez mechanizmy dziedziczenia w PostgreSQL i do tego język wbudowany PL/Python zamiast PL/SQL)






Zachęcam do zapoznania się z językiem programowania Python, bo warto wiedzieć więcej.

Oto kilka uzupełniających słów ze zdjęciami z konferencji PyCon 2008 ... ja nie zrobiłem żadnego, bo za bardzo byłem skupiony na treściach przekazu :-)

Ciekawe linki:
Zarejestrowane konferencje PyCon
http://www.gapminder.org/
http://video.google.com/videoplay?docid=7996617766640098677
http://www.ted.com/index.php/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen.html