Feeds:
Posty
Komentarze

Archive for the ‘Programowanie’ Category

Tak jakoś zawsze się układa, że pewne projekty kończą u mnie swój żywot na fazie wstępnej. O dwóch postanowiłem dziś napisać parę słów.

Pierwszy z nich nosił roboczą nazwę Pajęczarz. W ramach zapoznawania się z biblioteką ExtJs (taki AJAXowy kombajn) wpadłem na pomysł napisania aplikacji do zarządzania kontaktami w pajęczynie De Profundis. Nic wielkiego – możliwość utworzenia „gry” z opisem, tworzenia postaci i linkowania ich do konkretnych gier. Dodatkowo ewentualnie możliwość komunikacji między graczami i jakieś tam funkcje zarządzania tym wszystkim. Szkic projektu powstał na peryferiach Wrocławia, gdy czekałem w samochodzie. Kilka stron notatek przelałem na nieco tabel w MySQL i nieco kodu w PHP. Tak się złożyło, że w tym samym czasie w pracy dostałem spory projekt do zrobienia i mniej pilna robota została odłożona na później. Początkowy entuzjazm opadł i projekt powędrował do szuflady z napisem „jeśli nie zaglądałeś tu od roku to wyrzuć bez sprawdzania co jest w środku”. Tkwi tam już chyba z dwa lata.

Kolejny niewypał dotyczył gry Do: Pilgrims of the Flying Temple.  Gra świetnie nadaje się do rozgrywania online przy użyciu np. forum. Jedyne co by się przydało to generator do losowania kamieni z sakiewki. Oczywiście pomysł szybko rozrósł się o przechowywanie informacji o postaciach, ich statusie, przebiegu gry itp. Zanim dopadły mnie nowe obowiązki zdążyłem napisać działający generator. Do minimalnej funkcjonalności zabrakło obsługi kont dla graczy i jeszcze kilku administracyjnych drobnostek. Jest jeszcze jakaś szansa, że do tego projektu akurat wrócę, choć raczej niewielka.

Jak widać wszelkie projekty wykraczające poza moje zawodowe obowiązki nie mają szczęścia. Szczególnie wykorzystujące PHP, który nie jest moim ulubionym językiem (jest za to powszechnym w hostingu). Ciekaw jestem, czy gdybym doprowadził jej do końca cieszyłyby się jakimkolwiek zainteresowaniem.

Read Full Post »

Wstępu słów klika

Po wstępnych oględzinach OpenGoo wiedzieliśmy, że nie spełnia naszych oczekiwań jako programistów. Nie było wyjścia, musielismy znaleźć coś innego. I znaleźliśmy Redmine (redmine.org). Już sama prezentacja (demo.redmine.org) wyglądała ciekawie, ale program pokazał pazur dopiero na naszym serwerze.

Okiem zabieganego człowieka

To nie jest program dla menadżera. Kierownik projektu programistycznego odnajdzie się w nim z pewnością, ale przedstawiciel handlowy nie ma tu czego szukać. Tym drugim polecam OpenGoo.

Okiem programisty

Już na pierwszy rzut oka jest dobrze. Można podłączyć repozytorium i w wyjątkowo prosty sposób wiązać zadania z rewizjami. Chcesz sprawdzić jakie wprowadzono zmiany, porównać? Żaden problem. Repozytorium Subversion, CVS, Git, Mercurial, Bazaar, Darcs? Nie ma sprawy. Podział zadań na rozwój, poprawki, naprawy błędów. Możesz zdefiniować własne. Tak samo jak role. Naprawdę duża konfigurowalność. Wiki. Forum. Zarządzanie dokumentacją. W ramach raportowania Gantt. Eksport, który robi poprawne i ładne PDFy. Przefajnie. Dostajesz to, co w każdym programie do zarządzania plus bajerki dla programistów. Oczywiście wszystko na GPL 2.

Okiem użytkownika – administratora

No dobrze, są też wady. Na byle hostingu się tego nie postawi. Ruby 1.8.7, Rails 2.3.4 oraz MySQL 4.1+ (na razie za wyjątkiem 5.1) lub PostgreSQL 8 lub SQLite 3. W domu, czy firmie nie problem coś takiego postawić, ale nie każda firma zewnętrzna oferuje coś takiego do zewnętrznego użytku.

Instalacja też nie należy do tych, co to się je da z zamkniętymi oczami przeprowadzić. Czeka nas trochę grzebania w plikach konfiguracyjnych i ręcznego klepania w powłoce. Efekt jest jednak tego wart.

Instalacja na Ubuntu Server 9.10 (łopatologicznie)

Instalujemy Ubuntu Server 9.10 w wersji podstawowej (bez dodatkowych pakietów).

Idąc po najlżejszej linii oporu skorzystałem z pakietu dostępnego tu: http://leapster.org/packages/redmine/ubuntu/. Nie jest to najnowysza wersja Redmine (0.8.4-1 vs. 0.8.7) – osobiście polecam zainstalowanie zgodnie z opisem na stronie domowej projektu, ale ze względu na wymagania postawione przez administrację serwera lepszym rozwiązaniem było skorzystanie z pakietu, nawet jeśli starszego. Istnieje też możliwość skorzystania z przygotowanej instalacji pod kilka systemów operacyjnych.

sudo apt-get install lynx

Teraz korzystając z przeglądarki w trybie tekstowym ściagamy potrzebny pakiet.

lynx http://leapster.org/packages/redmine/ubuntu/

Teraz skazana na niepowodzenie próba instalacji:

dpkg -i redmine_all-0.8. 4-1.deb

Dostajemy komunikat o niespełnionych zależnościach i niemożności skonfigurowania pakietu.

sudo apt-get -f install

W ten sposób uzupełniamy brakujące zależności.

dpkg -i redmine_all-0.8. 4-1.deb

Powtórzenie instalacji pakietu zapewni nam jego skonfigurowanie.

Zgodnie z komunikatem wyświetlamy sobie plik README i wykonujemy wskazane kroki:

sudo touch /etc/redmine/database.yml
sudo vi /etc/redmine/database.yml

Wprowadzamy oczywiście:

 production:
   adapter: sqlite3
   dbfile: db/production.db

Na tym etapie warto zadbać o przydatne pakiety:

sudo apt-get install sqlite
sudo apt-get install subversion

Teraz przechodzimy chwilowo na  użytkownika redmine:

sudo su – redmine
rake db:migrate RAILS_ENV=”production”
exit

Edytujemy jeszcze plik konfiguracyjny:

sudo vi /etc/default/redmine

START=true

Zanim odpalimy serwer, jeszcze drobna uwaga odnośnie subversion. Trzeba nieco przekonfigurować sposób zapamiętywania haseł dla svn, żeby nie było kłopotów z dostępem do repozytoriów:

sudo vi /etc/subversion/servers

 store-plaintext-passwords = yes

Teraz pozostaje wystartować serwer:

sudo /etc/init.d/redmine start

Domyślne login/hasło: admin/admin, a serwis dostepny na http://localhost:3000

Uwagi końcowe

Oczywiście Redmine można postawić na  MySQL lub PostgreSQL. Niestety pojawiły się pewne trudności, które ze względu na m.in. bardzo krótki czas na instalację i przetestowanie funkcjonalności zmusiły mnie do wybrania najprostrzego rozwiązania (SQLite).

Redmine współpracuje z bazami MySQL w wersji 4.1+ za wyjątkiem 5.1. Nasi administratorzy ze względu na nawał pracy wymagają, by serwery miały możliwie prostą (czytaj: domyślną) konfigurację. Ubuntu 9.10 ma najnowszą wersję MySQL, więc pozostał PostgreSQL.

PostgreSQL niestety wypiął się przy próbie migracji bazy. Komunikaty wskazywały na błędy w plikach Redmine (choć oczywiście przyczyna mogła być inna – np. błędna konfiguracja), a czas topniał. SQLite odpalił od pierwszego kopa.

Ze względu na konieczność przechowywania jawnie hasła do repozytoriów trzeba zabezpieczać się  inaczej. Osobiście proponuje na serwerze z repozytoriami wycinać dostęp po haśle z innego miejsca niż serwer z Redmine (zostawiając jako drugi kanał dostępu np. svn+ssh z logowaniem kluczami rsa), oraz udostępniać dla tego użytkownika repozytorium tylko do odczytu.

Read Full Post »

Wstępu słów kilka

Nazbierało się w Firmie ostatnio sporo zaległych projektów. Mniejsze i większe rzeczy przesuwane na później, których nagromadzenie osiągnęło punkt krytyczny. Metody, którymi postanowiono przeciwdziałać zbliżającej się katastrofie ograniczyły się do powołania zespołu, przesunięcia do niego kilku osób w niepełnym wymiarze czasu pracy i powołaniu Kierownika. Ten zwołał naradę, przedstawił plan i rozpoczął organizację czasu pracy – jak na Informatyka przystało wspomagając się Programem.

Zarządzanie czas zacząć

Wybór padł na OpenGoo. To dość ciekawy program służący do komputerowego wspomagania procesów zarządzania – takie wirtualne biuro. Muszę przyznać, że zakres oferowanej funkcjonalności wygląda dość interesująco. Tworzenie projektów, zarządzanie użytkownikami, zadaniami, kalendarz, wersjonowanie dokumentów, raporty, monitorowanie czasu.

Okiem zabieganego człowieka

Program wygląda niezwykle symatycznie. Intuicyjny interfejs, w którym łatwo się odnaleźć. Trochę AJAXa, ale bez przesady –  akurat tyle żeby działało ładnie i w miarę szybko. Możliwość przechowywania kontaktów wraz z wcześniej wspomnianą funkcjonalnością, czyni z tego narzędzia wspaniałą pomoc dla menadżera.

Okiem programisty

To co dobre dla menadżera, nie musi być dobre dla programisty. Każdy program tego typu oferuje podobne opcje, ale z mojego punktu widzenia nie wstarczy zarządzanie czasem. Chcę więcej – choćby dostęp do podglądu repozytoriów i powiązania go z zadaniami.  Tu OpenGoo zawiódł – ostatecznie odrzuciliśmy go na rzecz innego programu.

Okiem użytkownika

OpenGoo napisany jest w PHP 5, a dopracy potrzebuje jeszcze tylko MySQLa. Prawie każdy webhosting spełnia te wymagania. Instalacja jest prosta i opiera się o skrypt w PHP. Całość jest Open Source.

Podsumowując

OpenGoo to bardzo ciekawe narzędzie (z polskojęzycznym interfejsem). Jeśli ktoś szuka dobrego organizera nie tylko dla siebie, ale dla większej grupy to szczerze polecam. Pod jednym wszakże warunkiem – nie chodzi o programowanie. Więcej o samym narzędziu dowiecie się ze strony www.opengoo.org. Warto obejrzeć jak działa. W rekomendacji mogę dodać, że zainstalowałem go sobie na serwerze mojego dostawcy usług internetowych i mogę go całkiem swobodnie używać.

Read Full Post »

Pocket Programming Language

Mam Siemensa SX66 z Windows Mobile 2003. Nic szczególnego, ale pocztę można odebrać w dowolnym cywilizowanym miejscu, a i PDFa przeczytać. Wymagań nie mam szczególnych, ale uznałem, że przydałby mi się program do symulacji kostek wszelakich. Dla znalezionych w Internecie niestety okazało się, że nie obsługują pełnego zestawu (brakowało k12). Skoro jednak co nieco o programowaniu wiem, uznałem że napiszę sobie stosowną aplikację sam. Roboty na 30 minut z zaprojektowaniem i wykonaniem GUI.

I tu niemiłe zaskoczenie. Problemy zaczęły się piętrzyć całkiem niespodziewanie. Po pierwsze Microsoft zrezygnował z udostępniania Visual eMbedded C++ 4.0, a na dodatek tak samo postąpił z SDK dla Windows Mobile 2003. Jak na złość na Windows Mobile 2003 nie ma wirtualnej maszyny Javy (pomijam Mysaifu JVM). Zresztą narzut przy takiej aplikacji byłby chyba zbyt duży.

Intensywne poszukiwania pozwoliły mi dowiedzieć się o CASL, Basic4PPC i jeszcze kilku aplikacjach. Moją uwagę jednak przyciągnął dopiero PPL. Jego aktualna wersja 1.53 okazała się być strzałem w dziesiątkę.

Po pierwsze GUI tworzymy w sposób znany z np. Delphi: wizualne narzędzie i przypisane do widgetów zdarzenia. Nic tylko uzupełnić kodem i gotowe.

Po drugie język jest prosty i ma spore możliwości. Wystarczy uruchomić demonstacje, żeby przekonać się, że narzędzie stworzono do programowania gier. W składni nieco przypomina C/C++, ale nie na tyle, żeby dało się zacząć pisać bez przeczytania manuala. Ogólnie podstawy do opanowania w kilka minut.

Po trzecie jest stosunkowo tanie. Wersja profesjonalna to około 70 dolarów. Gdybym zamierzał programować więcej dla urządzeń mobilnych, brałbym taki zakup pod rozwagę. Na stronie producenta (ArianeSoft)  dostępna jest wersja 30-dniowa.

Nie udało mi się zrobić wszystkiego w taki sposób w jaki zamierzałem, ale po kilku godzinach siedzenia z dokumentacją i poprawianiu niespodziewanych błędów uzyskałem satysfakcjonujący efekt, w postaci prostej aplikacji symulującej rzuty kostkami.

Narzędzie jest z pewnością warte uwagi, szczególnie że dla Windows Mobile 2003 nie znalazłem lepszego. Jeśli, ktoś ma zacięcie do programowania i potrzebę napisania czegoś pod dość stary już system operacyjny, to szczerze polecam spróbować.

Dla zinteresowanych sam program. Uprzedzam jednak, że jest to wersja surowa i jej ascetyzm bije po oczach.

Kostuch (Windows Mobile 2003)

Read Full Post »

GWT okazał się nie spełniać pewnych wymogów, które przed nim postawiłem. W międzyczasie rozgryzałem jednak inną bibliotekę – ZK. Przegląd możliwości pokazanych w demach wyglądał obiecująco. Także lista firm korzystających z tego rozwiązania jest stosunkowo okazała (m.in. Sun). Zapowiadało się więc całkiem nieźle.

ZK przysporzyło mi w Netbeans 6.1 zdecydowanie mniej kłopotów. Już wstępne przejrzenie tutoriala pozwoliło uzyskać ładną formatkę i komunikację z uzyciem technologii AJAX. ZK różni się w  podejściu od GWT – tu przede wszystkim definiujemy layout (z użyciem XML), który oprogramowujemy w Javie. Wadą tego rozwiązania jest fakt, że kompilujący się kod niekoniecznie musi działać (w GWT coś co się kompiluje wyświetli się nam poprawnie).

Podstawowy layout w ZK jest bardzo estetyczny i nie wymaga definiowania CSS. Wręcz, aż prosi się o pisanie z jego użyciem cienkiego klienta. Niestety nie jest przez to tak elastyczny jak GWT – modyfikacja wyglądu wymaga więcej pracy. Na start dostajemy jednak zdecydowanie więcej.

ZK podobnie jak GWT rozpycha strasznie plik wynikowy. Dodatkowe kilkanaście MB na start mamy jak w banku. Z drugiej strony ilość komponentów jaką udostępnia jest znacząco większa.

Z ZK warto się zapoznać, ale do stosowania zawsze i wszędzie nie zachęcam. Chyba jednak lepiej użyć  bardziej statycznej technologii, a AJAXa używać  jedynie w miarę potrzeb.

Read Full Post »

Jakoś tak się złożyło, że dostałem za zadanie rozpoznać kilka technologii AJAXowych. Ot proste założenie, że chcemy znaleźć przyjazną dla nas bibliotekę do pisania aplikacji w Java z wykorzystaniem możliwości jakie daje podpięcie JavaScriptu i komunikacji asynchronicznej. Wszystko jako cienki klient, żeby uniknąć instalowania u użytkownika czegokolwiek poza przeglądarką internetową. Na tapetę mieliśmy wziąć GWT i JSF z rozszerzeniami. Ostatecznie stało się trochę inaczej, ale w tym odcinku zajmę się doświadczeniami z GWT.

Po pierwsze piszemy z użyciem Netbeans 6.1.  Swoją drogą świetne narzędzie tak ułatwiające pracę, że pisząc pierwsze programy w Javie miałem uczucie jakby to Netbeans pisały, a ja jedynie podpowiadał im co mają robić. Naturalne było wykorzystanie pluginu GWT4NB. Konfiguracja nie nastręcza problemów i szybciutko można było się zabrać za tutoriale.

Tutorial jest stosunkowo przejrzysty – przynajmniej do miejsca, gdzie pokazywana jest komunikacja asynchroniczna. Tu zaczynają się schody. Nie dość, że w jednym z miejsc wkradł się zdaje błąd (wybaczcie piszę z pamięci, a nie mam teraz ochoty na analizę różnic między moim kodem, a tym z tutorialu – problem dotyczył użycia adnotacji @RemoteServiceRelativePath), to wskutek pewnego błędu w konfiguracji Servletu spędziłem kilka dni na bezowocnych próbach połączenia.

Nie są to jednak trudności nie do przeskoczenia, a wynikały głownie z moich znikomych doświadczeń w tym zakresie. Mimo wszystko GWT nie wywarło na mnie oszałamiającego wrażenia. Przyczyn jest kilka.

Po pierwsze, do wywołania jednej funkcji po stronie serwera trzeba zbudować trzy klasy. Do tego dochodzi konfiguracja Servletu.

Po drugi wynik w praktyce musi być albo typem prostym, albo Stringiem zawierającym XML. Stosunkowo mało to wygodne – szczególnie, że po stronie klienta nie można używać własnych klas.

Po trzecie standardowy wygląd oferowany przez bibliotekę GWT nie powala (mówiąc wprost jest brzydki jak noc). Owszem można definiować własne arkusze CSS, ale jakby nie o to chodzi.

Po czwarte wynikowy plik war z załączonymi bibliotekami aplikacji, która absolutnie nic nie robi ma bodajże 16 MB. Na pewno zdrowo powyżej 10.

Po piąte wydajność nieco odbiegała od oczekiwań.

Ogólnie GWT nie zrobiło na mnie wrażenia rozwiązania, z którego chciałbym stale korzystać. Szczególnie, że nie było jedynym jakie testowałem. Gdybym miał napisać szybko aplikację z wykorzystaniem technologii AJAX raczej nie skusiłbym się na Google Web Toolkit. Istnieją biblioteki o podobnych możliwościach, które wydają się być sympatyczniejsze w wykorzystywaniu.

Read Full Post »

CREATE OR REPLACE PACKAGE kancelaria.checksum as
 function gs1_128(kod varchar) return integer;
 -- zwraca sumę kontrolną dla kodu GS1-128 (Poczta Polska, list polecony krajowy)
 function dptt39(kod varchar) return integer;
 -- zwraca sumę kontrolną dla pochodnej kodu Danish PTT 39 Barcode (Poczta Polska, list polecony zagraniczny)
end;

CREATE OR REPLACE PACKAGE BODY kancelaria.checksum as
 --------------------------------------------------------------------
 function gs1_128(kod varchar) return integer as
 posrednie INTEGER;
 wynik INTEGER;
 i integer;
 begin
 posrednie := 0;
 for i in 1..19 loop
 if mod(i,2) = 0 then
 posrednie := posrednie + to_number(substr(kod,i,1));
 else
 posrednie := posrednie + to_number(substr(kod,i,1)) * 3;
 end if;
 end loop;

 wynik := ceil(posrednie/10)*10 - posrednie;

 return wynik;
 exception
 when OTHERS then raise_application_error(-20001, 'kancelaria.checksum.gs1_128 (others): '||SQLERRM||', ('||kod||')');
 end;
 --------------------------------------------------------------------
 function dptt39(kod varchar) return integer as
 posrednie INTEGER;
 wynik INTEGER;
 i integer;
 wagi varchar(8);
 begin
 wagi := '86423597';
 posrednie := 0;

 for i in 1..8 loop
 posrednie := posrednie + to_number(substr(kod,i,1)) * to_number(substr(wagi,i,1));
 end loop;

 wynik := 11 - mod(posrednie,11);

 if wynik = 10 then wynik := 0; end if;
 if wynik = 11 then wynik := 5; end if;

 return wynik;
 exception
 when OTHERS then raise_application_error(-20001, 'kancelaria.checksum.dptt39 (others): '||SQLERRM||', ('||kod||')');
 end;
 --------------------------------------------------------------------
end;

Read Full Post »

Older Posts »