Archive

Archive for September, 2009

Własny renderer dla DataGrid (FLEX)

September 26th, 2009 No comments

Adobe FLEX posiada komponent do wyświetlania tabelek który nazywa się DataGrid. W komórce tabeli możemy wyświetlić tekst, tekst HTML lub inny prosty komponent. Mi jednak tego było mało. Postanowiłem więc napisać swój własny renderer dla komórek tabeli. Z początku wydawało mi się to proste: napiszę nową klasę dziedziczącą po DataGridItemRenderer i w niej upakuję logikę do wyświetlania mojej komórki tabeli. Niestety rzeczywistość okazała się niezwykle zagmatwana i zmusiła mnie do dokopania się do nieprzyzwoitych paskudztw ukrytych wewnątrz FLEX.

Nie mogłem zrobić klasy pochodnej z DataGridItemRenderer, gdyż tak klasa dziczy po UITextField czyli potrafi wyświetlać tekst. A ja potrzebowałem tekst i coś jeszcze. Spróbowałem więc pisać na płótnie Canvas. Okazało się, że Canvas prawie działa. Problemem były wartości, które poprzez interfejs IDataRenderer otrzymywała moja klasa: zamiast spodziewanego obiektu reprezentującego konkretną komórkę tabeli otrzymywałem obiekt reprezentujący cały wiersz. Zastanowiło mnie też dlaczego klasa Canvas – czyli obiekt reprezentujący płótno implementuje interfejs IDataRenderer – może Wy widzicie związek? Dla mnie to tak jak mercedes standardowo wyposażony w pieska kiwającego głową.

Analizując przykłady, odkryłem że klasa CheckBox powinna zachowywać się w tej materii właściwie, czyli gdy chciałem aby komórka tabeli była wyświetlana obiektem klasy CheckBox – to obiekt ten otrzymywał dane reprezentujące konkretną komórkę a nie cały wiersz. To mnie zastanowiło, dlaczego Canvas dostaje do wyświetlenia wiersz a CheckBox dostaje wartość komórki. Pomyślałem, że problem leży gdzieś w interfejsach. Pomyślałem sobie, że może DataGrid wpisując dane do komórek swojej tabeli sprawdza – czy klasa odpowiedzialna za wyświetlenie tej komórki implementuje wskazany interfejs – i w zależności od tego wysyła do nie odpowiednie dane. To by brzmiało rozsądnie. Niestety, debugger nie potwierdził moich przeczuć.

Zajrzałem więc do źródła CheckBox i oto co znalazłem. Jest tam sobie funkcja setter na pole data wymagana przez interfejs IDataRenderer. Oto ona:

W moim odczuciu, to nie wygląda jak zwykły setter. Dla mnie to wygląda jak na kod zepsutego projektu. Taka napisana funkcja zachowuje się w sposób nieprzewidywalny. W dodatku, po co ktoś projektował interfejs skoro większość klas FLEXa go odziedziczy?

Wracając do sprawy, aby napisać własną klasę służącą do wyświetlania komórek tabeli powinniśmy zaimplementować interfejsy: IDataRendererIDropInListItemRenderer. Aby dostać wartość wiersza potrzebny jest nam IDataRenderer, jednak ten interfejs implementują prawie wszystkie komponenty FLEXa. Aby dobrać się do wartości komórki, potrzebujemy IDropInListItemRenderer. Możemy do zrobić na przykład tak:

Martwię się o FLEX. To wspaniała technologia, która umożliwia tworzenie wspaniałych rzeczy. Jednak bałagan który w niej panuje może być dla tej niej zabójczy. Bałagan, o którym wie każdy programista, który programował w FLEX. Bałagan oczywiście zawsze towarzyszy pracy programistów, jednak w niektórych projektach jest czasami nie do zniesienia.

Categories: FLEX Tags:

Gang Wars

September 24th, 2009 1 comment

Rzadko zdarza mi się pisać o grach komputerowych. Dotychczas pisałem tylko o moich szachach i o polskim Wiedźminie. Rzadko gram w gry komputerowe, bo zgodnie z założeniami ich twórców – wciągam się w nie. A na to szkoda mi czasu.

Mam też zboczenie zawodowe. Na gry komputerowe, patrzę jako na potencjalną pracę do wykonania. Zawsze zastanawiam się jak napisać taką grę i jak na niej zarobić? Wydaje mi się to bardzo ciężkim kawałkiem chleba. Gry komputerowe są najbardziej poszkodowane z powodu piractwa. W dodatku starzeją się znacznie szybciej niż aplikacje dla biznesu. Może poza szachami.

Ostatnio zainteresowałem się aplikacjami na Androida w tym również grami komputerowymi. Próbowałem różnych gier. Fajnie jest pobawić się grami z ekranem dotykowym, akcelerometrem, poziomicą. Fajnie jest potrząsnąć telefonem, po to żeby rozeszły się chmury i można było dalej strzelać dotykowo. Te wszystkie hardwarowe bajery w które wyposażone są dziś telefony wpływają na radość grania i dają programistom nowe możliwości. I to mnie ciekawi. Jednak najciekawsze jest zawsze rywalizacja z innymi graczami. Pierwsze gry w które grałem ponad 20 lat temu, były super dlatego, że siedziałem z kumplami przy CPC 464 i wyrywaliśmy sobie joystick, kradnąc kurze jakie w Chuckie Egg. Była w tym rywalizacja o to kto ukradnie więcej jajek.

Gang Wars na Androida to pierwsza gra która mnie na prawdę wciągnęła. Gang Wars – to gra strategiczna. W Gang Wars wcielamy się w rolę gangstera. Naszym zadaniem jest zdobywanie pieniędzy, szacunku i doświadczenia. Aby zarobić trzeba najpierw kupić broń i dokonać kilku przestępstw takich jak grabieże i włamania. Doświadczenie zdobywamy szybciej walcząc z innymi gangsterami. Czasami, zdarza się okazja “zrobienia batonika” z innego gangstera. Zarobione pieniądze inwestujemy w nieruchomości, kupujemy lepszą broń i samochody. Sporo kasy wydamy też na doktora, który będzie leczył nas z obrażeń. Zapraszając znajomych do gry budujemy swój gang i dzięki temu możemy dokonywać bardziej wymyślnych przestępstw jak choćby napad na sklep jubilerski.

W Gang Wars rywalizujemy z innymi graczami i to jest fajne. Rywalizujemy w czasie rzeczywistym i to jest super. Dzięki Gang Wars odkryłem nowy termin – MMOSG. Odkryłem też, że gra komputerowa może być odmianą aplikacji biznesowej. Do napisania takiej gry potrzebne są umiejętności które już mam, które nabyłem pisząc aplikacje biznesowe działające w Internecie. I to mnie cieszy najbardziej.

Podzielę się moim spostrzeżeniem o tym, jak można było by zaprojektować MMOSG.

W Gang Wars energia jest elementem kluczowym. Są aż trzy rodzaje energii: siła, zdrowie, wytrzymałość. Energię tracimy wykonując zadania. Energia uzupełniana jest po czasie. I to jest genialne. Pamiętam, że gdy byłem mały to grałem w gry planszowe najchętniej w Monopoly. W grach planszowych ruchy wykonujemy turowo. W MMOSG tury nie były by możliwe, kto chciałby czekać aż na swoją kolej aż tysiące graczy wykona ruch. W Gang Wars tury zastąpiono czasem. Czas jest barierą która uniemożliwia nam wykonywanie zbyt wielu ruchów. Czas jest motywatorem, do wykonania kolejnego ruchu. W Gang Wars możemy wykonać swoje ruchy, wyłączyć telefon na godzinę czekając aż nasza energia się uzupełni i znów wykonać ruchy. Dla mnie to niesamowite odkrycie. Z tą wiedzą czuję się jak dziecko które odkryło gdzie mama trzyma cukierki.

Tury zastąpiono czasem. Dzięki temu odkryciu można przenieść koncepcje wielu gier planszowych do świata MMO.

Tak naprawdę, gdy byłem dzieckiem, to nie grałem w Monopoly. To były czasy komuny i grałem w podróbki Monopoly, między innymi w klona Monopoly wykonanego przez moich rodziców. Naprawdę się napracowali: olbrzymia plansza; elegancie figurki hoteli, trolejbusów i samolotów; kostki i laminowane karty wprowadzające element losowość. To działało na moją dziecięcą wyobraźnie i zakochałem się w tej grze. Mój tata nawet chciał napisać Monopoly na CPC 464 lecz niestety zbrakło mu wytrwałości. Dzięki Gang Wars i zasadzie zastąpienia tur czasem wiem, że można było by przenieść Monopoly na świat MMOSG (zresztą pewnie już tam jest).

PS. Mój Friend Code w Gang Wars to: 053F6.

Categories: Android, Recenzje Tags:

Czy Android prześcignie IPhona?

September 18th, 2009 3 comments

Zainteresowanie Androidem przekroczyło już poziom zainteresowania Symbianem. Widać to w Google Trends. Jednak, zainteresowanie Androidem jest tylko małym ułamkiem zainteresowania IPhonem. Czy telefony z Androidem mają szansę pobić rewelacyjny marketing Apple?

Categories: Android, Recenzje Tags:

BuddyRunner vs CardioTrainer

September 12th, 2009 9 comments

BuddyRunner i CardioTrainer to dwie aplikacje które ostatnio mnie zainteresowały. Gadałem przez telefon z kumplem – też programistą . Okazało się że też ma Androida. Powiedział mi że uprawi sport. Pomyślałem że w poprzednim zdaniu brakuje słowa “też”. Powiedział mi że biega z BuddyRunnerem. Ja nie biegam. Ale pomyślałem że mogę jeździć na rolkach i będę miał lepsze czasy, co zmierzy BuddyRunner. Więc zainstalowałem na moim telefonie tą aplikację.

Niestety, pierwsza przejażdżka na czas się nie udała. Czasy się nie zapisały. A naprawdę się starałem. Pomimo krótkiego dystansu – to się nieźle zmęczyłem. Trochę mnie to wkurzyło i w tym momencie złości zauważyłem w Android Market CardioTrainera. Następnego dnia zebrałem siły by wypróbować ten produkt na serce.

Tym razem wszystko się udało. CardioTrainer zadziałał poprawnie i zapisał ścieżkę mojej przejażdżki.

Dziś znowu spróbowałem BuddyRunnera i niestety znowu się nie udało. Dlatego napiszę krótkie podsumowanie tych dwóch aplikacji:

Plusem BuddyRunnera jest przede wszystkim znakomita strona WWW o publicznym adresie URL, prostszy system rejestracji, powiadamianie na e-mail oraz integracja z Facebook. W telefonie wygląda dobrze, lecz brakuje w nim wyboru jednostek miar – są mile.

CardioTrainer wygrywa przede wszystkim w telefonie komórkowym. Lepiej odbiera sygnał GPS i pozwala go konfigurować. CardioTrainer pozwala wybrać rodzaj treningu: bieganie, rower, rolki i inne. Pozwala wybrać jednostki miary – kilometry lub mile. CardioTrainer lepiej dba o prywatność. Niestety, strona CardioTrainera jest słabsza – brakuje w niej statystyk i nie znalazłem opcji udostępniania.

Na chwilę obecną będę jeździł z CardioTrainer. Istnieje szansa, że telefon z Androidem poprawi moją kondycję.

Categories: Android, Recenzje Tags:

Bezpieczeństwa kopiowania danych podczas prac programistycznych

September 6th, 2009 4 comments

Programując nową wersję aplikacji, często zaczynamy od zrobienia kopii aktualnej wersji systemu produkcyjnego. To kusząca idea, jednak należy pamiętać o pewnych zasadach bezpieczeństwa z tym związanych. Idee jest kusząca – ponieważ budując nowe funkcjonalności testujemy je w warunkach zbliżonych do produkcyjnych. Dzięki temu łatwiej jest wyłapać błędy związane z wydajności i łatwiej jest przeprowadzać testy.

Robiąc kopię bazy danych, należy pamiętać o pewnych zasadach bezpieczeństwa. Gdy kopia danych systemu ma być używana do celów deweloperskich – to należy zniszczyć wszystkie wrażliwe dane w bazie: imiona i nazwiska, hasła, adresy, numery telefonów. Taka kopia danych może być bowiem użyta na laptopach programistów, lub na słabiej zabezpieczonych systemach. Warto więc wypracować pewne procedury w tym zakresie.

Kilka lat temu zaproponowałem następującą procedurę: po wykonaniu kopii wszystkie imiona, hasła, adresy, nazwy i temu podobne dane zostaną zniszczone. Są trzy typy niszczenia.

Niszczenie tekstów i nazw własnych. Dla każdego znaku w ciągu znaków powinien zostać wylosowany inny znak. Czyli na przykład, gdy w bazie danych był ciąg znaków “Antoni Jakubiak” to mógł zostać zastąpiony “Xhkkia Uksbtlka”. Dzięki temu podczas testowania systemu widzimy ciągi znaków na ekranie, i zajmują one mniej więcej tyle samo miejsca co prawdziwe dane. Jest to rozwiązanie nieco lepsze, od kasowania danych lub losowania nowych danych w całości gdyż testuje się wygodniej.

Niszczenie adresów e-mail jest szczególnie ważne. Po pierwsze, adresy e-mail naszych użytkowników nie powinny się gdzieś zgubić. Po drugie, gdy nasz system wysyła e-mail automatycznie, to głupio by były żeby wyszły one z testowego systemy do prawdziwego użytkownika: “Kupiłeś sokowirówkę – obciążyliśmy twoją kartę kredytową”. Uważam, że najlepiej jest zastąpić wszystkie adresy e-mail występujące w bazie danych – własnym adresem e-mail. Podoba sprawa dotyczy numerów telefonów, szczególnie gdy nasz system dzwoni lub automatycznie wysyła SMSy. Gorzej, jeżeli adres e-mail jest polem unikalnym – na przykład loginem. Wtedy trzeba się napracować w stylu: update auth set email=concat(‘mój.adres.email+dev’||next_val(‘jakaś.tam.sekwencja’)||’@gmail.com’. Z całą pewnością jednak warto!

Niszczenie haseł. Hasła w bazie danych zwykle są jakoś zaszyfrowane, jednak ich kradzież, szczególnie połączona z kradzieżą loginu lub e-mail, będzie kompromitująca. Uważam, że hasła najlepiej jest po prostu skasować. W testowej kopii systemu można też ustawić wszystkim użytkownikom jednakowe hasła – jednak lepiej je po prosu skasować zupełnie. Testerzy systemu założą sobie po prostu nowe hasło w procedurze jego odzyskiwania. Oczywiście, jeżeli wcześniej zmieniliśmy adresy e-mail.

Napisanie takiej procedury dobremu programiście znającemu system zajmie na pewno mniej, niż dzień roboczy. Warto, żeby była to procedura półautomatyczna, lub żeby w jakiejś dokumentacji programistycznej systemu została ona zapisana. Warto pilnować, by taka procedura była przestrzegana. Ogólnie, warto pamiętać o tym by pilnować backupów systemu.

Categories: Bazy danych Tags:

Tak zaczynał ChessIG

September 1st, 2009 1 comment

Przeglądając stary komputer znalazłem pierwsze zdjęcia projektu ChessIG. To szachy internetowe, gadżet dla IGoogle. Napisałem je, bo uczyłem się Javy i chciałem poznać smak programowania w tym języku. Dziś z sentymentem oglądam zdjęcia.

Jest Eclipse. Jest mój starusienki ukochany laptop Sony VAIO. Jest KDE. I to wszystko przy 512MB pamięci RAM której nie można rozbudować. A w rogu jest świeżo przeczytana książka Head First Java.

Uważam, że najfajniejszy program w swoim życiu napisałem siedząc przy niewygodnym, zbyt niskim stole i pracując na już wtedy przestarzałym laptopie. Szachy działają do dziś, liczba użytkowników rośnie i moje zadowolenie z tej aplikacji także. Zapraszam!

Categories: Recenzje Tags: