Radosław Nowak

Specyfika komputerów kieszonkowych i ich oprogramowania na przykładzie specjalistycznej aplikacji dla systemu Palm OS

Spis treści

Przedmowa

Wstęp

Rozdział I – Specyfika komputerów kieszonkowych

1. Podstawowe informacje

1.1. Definicja komputera kieszonkowego

1.2. Historia

1.3. Systemy operacyjne

2. Charakterystyka ogólna

2.1. Podręczność i łatwość obsługi

2.2. Interfejs użytkownika

2.3. Podstawowe oprogramowanie

2.4. Powiązanie z komputerem stacjonarnym

3. Specyfikacja techniczna

3.1. Procesor i procesy

3.2. Rodzaje i organizacja pamięci

3.3. Moduły platformy sprzętowej

Rozdział II – Środowisko programistyczne systemu Palm OS

1. Charakterystyka środowiska tworzenia oprogramowania (SDK)

1.1. Język programowania

1.2. Interfejs programowania aplikacji (API)

1.3. Porównanie z innymi platformami

2. Narzędzia programistyczne

2.1. Zintegrowane środowiska programistyczne (IDE)

2.2. Funkcjonowanie kompilatorów i konsolidatorów

2.3. Testowanie oprogramowania

Rozdział III – Tworzenie aplikacji systemu Palm OS

1. Elementy składowe aplikacji

1.1. Podstawowy kod źródłowy

1.2. Dołączone zasoby

1.3. Elementy towarzyszące

2. Praktyka tworzenia aplikacji

2.1. Założenia aplikacji

2.2. Projekt aplikacji

2.3. Projektowanie i tworzenie zasobów

2.4. Tworzenie kodu źródłowego

3. Wdrażanie oprogramowania komputerów kieszonkowych

3.1. Przykład zastosowania

3.2. Określenie odbiorcy docelowego

3.3. Kanały sprzedaży i marketing

Zakończenie

Posłowie

Bibliografia

Spis tablic

Spis rysunków

Spis załączników

Załączniki

Przypisy

Prawa autorskie

Przedmowa

Niniejsza publikacja stanowi moją pracę dyplomową, na podstawie której w 2008 roku uzyskałem tytuł zawodowy magistra ukończywszy studia na kierunku „informatyka i ekonometria” w zakresie informatyki ekonomicznej. Powstała ona pod kierunkiem profesora Uniwersytetu Ekonomicznego w Krakowie dr hab. inż. Jacka Wołoszyna i została bardzo dobrze oceniona zarówno przez jej recenzenta, jak i przez komisję egzaminacyjną podczas jej obrony.

Na wybór zagadnienia pracy wpłynęła przede wszystkim prowadzona przeze mnie od kilku lat działalność gospodarcza[1], która z kolei stanowi wyraz moich prywatnych zainteresowań. Dzięki niej, jako autor całej gamy oprogramowania użytkowego, znacząco pogłębiłem swoją wiedzę w zakresie komputerów kieszonkowych, będących dla niej platformą docelową. Zdobyte w ten sposób doświadczenie, przemyślenia i wnioski postanowiłem zebrać w postaci przedstawionej tutaj pracy.

Sam fakt opublikowania pracy motywuję chęcią podzielenia się jej treścią, gdyż zauważam obszary nauki mogące potencjalnie się o nią oprzeć. Uważam, iż informacje w niej zawarte mogą zostać zaczerpnięte z pożytkiem przez osoby obracające się w świecie informatyki i ekonomii. Niniejszym zachęcam do przeczytania Wstępu, przedstawiającego szczegółowo tematykę pracy, omówione w niej zagadnienia oraz sformułowane tezy.

Radosław Nowak, Kraków, 6 maja 2009 r.

Wstęp

Komputery kieszonkowe obecnie coraz częściej znajdują swoje miejsce w procesie komputeryzacji obiektów gospodarczych. Szczególnie przydatne okazują się być w podukładzie informacyjnym tych obiektów. Swoje niemałe znaczenie zawdzięczają faktowi, iż proste programy użytkowe stanowią jedną z podstawowych klas systemów komputeryzacji tego obszaru[2]. Jak zostanie wykazane w punkcie „Podstawowe informacje”, programy stworzone dla platformy sprzętowo-systemowej Palm doskonale wpasowują się w tę kategorię. Z tego też powodu, praca ta skupi się głównie na komputerach kieszonkowych tej platformy.

Dziś nie trzeba nikomu udowadniać, że komputer gwarantuje przewagę w szybkości i trafności podejmowania decyzji, dostarczając bezbłędnie przetworzone informacje teoretyczne. Mało kto jednak zdaje sobie sprawę z tego, że podręczność, szybkość dostępu i prostota obsługi specjalistycznego oprogramowania komputerów kieszonkowych mogą stanowić istotny czynnik w przyśpieszeniu wstępnej fazy procesu decyzyjnego przy wszelkich przedsięwzięciach biznesowych. Przykładem takiego przedsięwzięcia może być dowolna inwestycja, a przykładem oprogramowania – wspomagająca ją aplikacja obliczająca IRR, która zostanie omówiona w tej pracy.

Wartość IRR (wewnętrznej stopy zwrotu) jest podstawową informacją pozwalającą inwestorowi z góry przewidzieć opłacalność danej inwestycji[3]. Jej znajomość stanowi obiektywną przesłankę skłaniającą do podjęcia bądź odrzucenia przedsięwzięcia oraz ewentualnej realizacji innego – charakteryzującego się wyższą wartością wewnętrznej stopy zwrotu[4]. Inwestor powinien zatem skorzystać z możliwości niemal natychmiastowego poznania tej wartości w każdej chwili dzięki posiadaniu stosownej aplikacji na swoim komputerze kieszonkowym. Zdolność ta znajduje swoje zastosowanie w każdym rodzaju działalności gospodarczych.

Opierając się na przykładzie takiej aplikacji, praca ta ma na celu wykazanie, iż dobrze napisany program, działający na odpowiednim sprzęcie, jest w stanie w pełni sprostać wymaganiom współczesnego przedsiębiorcy, dla którego szybkość i uzasadnienie podejmowania decyzji stanowią niewątpliwy klucz do sukcesu. Zasadniczą podstawę do udowodnienia tej hipotezy stanowić będzie przedstawienie specyfiki komputerów kieszonkowych oraz wynikającego z niej charakteru oprogramowania.

Ponadto, praca ta ma za zadanie udowodnić osobom mniej lub bardziej bezpośrednio związanym z ekonomią, iż komputer może im pomóc w podjęciu decyzji gospodarczej niemal na każdym kroku. Do tej pory bowiem, pomimo znacznej komputeryzacji tego sektora, wielu ekonomistów nie odkryło jeszcze użyteczności i łatwości skorzystania ze specjalistycznego oprogramowania. Do zmiany tego stanu rzeczy może przyczynić się rozwój praktycznego i prostego w użyciu oprogramowania, czyli właśnie takiego, jakie jest najbardziej typowe dla komputerów przenośnych.

Rozdział I – zatytułowany „Specyfika komputerów kieszonkowych” – zawiera informacje ogólne mające na celu zaznajomienie Czytelnika z zagadnieniami omawianymi w niniejszej pracy, a w szczególności z pojęciem komputera kieszonkowego, oraz z architekturą sprzętowo-systemową platformy Palm. Zostały w nim zebrane również fakty dotyczące tych zagadnień, w taki sposób, by na ich podstawie w dalszej części pracy móc formułować wnioski.

Rozdział II – zatytułowany „Środowisko programistyczne systemu Palm OS” – zawiera teoretyczne informacje o specyfice tworzenia oprogramowania dla systemu Palm OS, a także o narzędziach do tego służących. Opisuje instrumenty, jakie ma do dyspozycji każdy autor oprogramowania dla tego systemu: interfejs programowania aplikacji (API), zintegrowane środowiska programistyczne (IDE), kompilatory, debugery, oraz instrumenty charakterystyczne wyłącznie dla platformy Palm.

Rozdział III – zatytułowany „Tworzenie aplikacji systemu Palm OS” – stanowi swoistą syntezę poprzedzających go rozdziałów. Na ich podstawie obrazuje on w praktyce powstawanie aplikacji dla przedsiębiorców i ekonomistów. Obejmuje wszystkie etapy tworzenia i wdrażania aplikacji – od fazy projektowania, aż po fazę marketingu. Przedstawia także przykład zastosowania utworzonego programu w rozwiązaniu typowego problemu inwestora. Udowadnia tym samym hipotezę przedstawioną wcześniej we Wstępie.

Rozdział I
Specyfika komputerów kieszonkowych

1. Podstawowe informacje

1.1. Definicja komputera kieszonkowego

Pojęcie komputera kieszonkowego jest bardzo blisko spokrewnione z pojęciami palmtop, notes elektroniczny, oraz PDA[5]. Choć w mowie potocznej różnica między tymi pojęciami praktycznie nie istnieje (używane są one zamiennie), istnieje możliwość logicznego ich skategoryzowania.

Określenie komputer kieszonkowy definiuje ogólną klasę komputerów, których gabaryty umożliwiają przenoszenie ich w dogodny sposób przez użytkowników ruchomych[6]. Cecha ta sprawia, że komputery te noszą miano jeszcze bardziej osobistych od komputerów klasy PC (personal computer – komputer osobisty) – mogą towarzyszyć właścicielowi w niemal każdej sytuacji. Są narzędziem, które zawsze jest pod ręką i służy wsparciem w wykonywaniu codziennych czynności – podobnie jak kalkulator, czy telefon komórkowy, jednak w znacznie bardziej wszechstronny i spersonalizowany sposób.

Pojęciem zbliżonym do komputera kieszonkowego jest pojęcie palmtop. Określenie to również dotyczy komputerów niewielkich gabarytowo, a jego nazwa wywodzi się od angielskiego słowa palm oznaczającego dłoń. Z definicji, palmtop (inaczej: notes elektroniczny[7]) jest to niewielkich rozmiarów komputer osobisty zasilany bateryjnie, mieszczący się w dłoni[8]. Skutkiem bliskości obu przedstawionych pojęć jest fakt, że znakomita większość palmtopów jest jednocześnie komputerami kieszonkowymi, jak i większość komputerów kieszonkowych jest też palmtopami.

Kolejnym pokrewnym pojęciem jest PDA. Definicja zawarta w słowniku wydawnictwa Europa[9] podaje, iż PDA jest to „pomocnik cyfrowy, połączenie telefonu komórkowego z komputerem osobistym; wyposażenie: arkusz elektroniczny, kontakt z siecią Internet za pomocą przystawki do TV”. Definicja ta jednak znacznie rozmija się z dosłownym rozumieniem pojęcia cyfrowego asystenta osobistego. Ponadto, może wprowadzać czytelnika w błąd, np. sugerując mylne wyobrażenie „połączenia telefonu komórkowego z komputerem osobistym”, albo determinując konieczność posiadania przez urządzenie „przystawki do TV”. W rzeczywistości tylko niektóre urządzenia PDA posiadają moduł telefonu komórkowego[10], a łączność z siecią Internet nie jest wymagana do wykonania większości czynności powierzanych tym urządzeniom.

Znacznie trafniejszą definicję PDA zawiera encyklopedia PWN[11], która podaje, iż jest to „rodzaj palmtopa; niewielki, kieszonkowy komputer przenośny [...] wyposażony w ekran wrażliwy na dotyk oraz w oprogramowanie obejmujące m.in. książkę telefoniczną, kalendarz z terminarzem, arkusz kalkulacyjny” (programy te określa się ogólnym mianem organizera lub skrótowcem PIM[12]). Definicja ta jest zgodna zarówno z ogólnym rozumieniem tego pojęcia, jak i z bezpośrednim tłumaczeniem z języka angielskiego rozwinięcia skrótowca PDApersonal digital assistant, oznaczającego cyfrowego asystenta osobistego.

Typowy komputer kieszonkowy – model Palm TX.

Rysunek 1 – Typowy komputer kieszonkowy – model Palm TX.

Źródło: Wikipedia (copyleft).

Jak prezentuje Rysunek 1, komputery kieszonkowe charakteryzują się zwartą budową. W jednej obudowie znajduje się zarówno jednostka systemowa, jak i urządzenia wejścia-wyjścia: wyświetlacz (ekran), urządzenie wskazujące (w postaci ekranu dotykowego, tzw. digitizera, współpracującego z rysikiem) oraz klawiatura, bądź jej odpowiednik[13]. Taka konfiguracja znacznie zwiększa mobilność oraz łatwość obsługi urządzenia, zmniejszając jednocześnie jego awaryjność. Dalszym skutkiem takiego rozwiązania jest fakt, iż komputer kieszonkowy z wyglądu może przypominać telefon komórkowy. Coraz częściej powstają także hybrydy obu urządzeń, powstałe bądź to przez wbudowanie modułu GSM[14] do urządzenia PDA, bądź funkcji organizera do telefonu komórkowego, bądź też poprzez stworzenie zintegrowanego urządzenia od podstaw. Komputery te noszą miano smartphone’ów, czyli w dosłownym tłumaczeniu – „mądrych telefonów”.

Komputery kieszonkowe odróżniają się od innych komputerów przenośnych (laptopów i notebooków) przede wszystkim znacznie mniejszymi gabarytami, ale także zmniejszoną mocą obliczeniową i ilością pamięci operacyjnej, brakiem urządzeń pamięci masowej, czy kontrolerów w standardzie PCMCIA[15]. Różnice sprzętowe są na tyle duże, że komputery te posiadają dedykowane systemy operacyjne[16], co z kolei wpływa na specyfikę oprogramowania użytkowego. Autorzy programów dla palmtopów, w przeciwieństwie do autorów oprogramowania dla większych maszyn, muszą pamiętać zatem o[17]:

Postulaty te stanową jednocześnie ogólną charakterystykę funkcjonowania oprogramowania na komputerach przenośnych. Pociągają za sobą też pewne konsekwencje, np. z powodu braku wbudowanej pamięci trwałej, systemy operacyjne posiadają specjalne mechanizmy służące do synchronizacji danych z komputerem stacjonarnym. Dzięki ich istnieniu, w przypadku wyczerpania się akumulatora, dane można w prosty sposób wgrać z powrotem po jego ponownym naładowaniu.

1.2. Historia

Jak podaje Encyklopedia Britannica[18], idea komputera kieszonkowego powstała w latach sześćdziesiątych XX wieku. Stworzył ją Alan Kay, pracownik firmy Xerox w ośrodku badawczym Palo Alto. Ponieważ ówczesna technologia nie pozwalała na zbudowanie takiego urządzenia, nakreślił on jedynie wizję, do której realizacji dążono przez wiele kolejnych lat w procesie miniaturyzacji części elektronicznych. Krokiem w tym dążeniu było powstanie pierwszych laptopów w latach osiemdziesiątych. Wciąż jednak komputery te były zbyt duże, ciężkie i nieporęczne, by można je nazwać kieszonkowymi, bądź by mogły nosić miano palmtopów.

Oś czasu przedstawiająca historię komputerów kieszonkowych.

Rysunek 2 – Oś czasu przedstawiająca historię komputerów kieszonkowych.

Źródło: Opracowanie własne.

Na przełomie lat osiemdziesiątych i dziewięćdziesiątych XX wieku równocześnie kilka firm (m.in. Go Corporation i Apple Computer) zapowiedziało gotowość do stworzenia pierwszych podręcznych asystentów cyfrowych. Za pierwowzór dzisiejszych palmtopów uznaje się powstałe w 1993 r. urządzenie „Newton” – produkt firmy Apple Computer. Zawierał on podstawowy zestaw kilku aplikacji służących do wykonywania typowych czynności powierzanych urządzeniom PDA. Niestety, w związku z zastosowaną w nim wciąż rozwijającą się technologią, nie odniósł on większego sukcesu marketingowego i nie zyskał popularności wśród użytkowników. Jego obsługa była zbyt skomplikowana, a działające na niedoskonałej platformie sprzętowej oprogramowanie, które samo charakteryzowało się niską efektywnością[19], jedynie odstraszało potencjalnych nabywców. Przez kolejne lata rynek komputerów kieszonkowych niemal całkowicie zaniknął.

Tak krytyczna sytuacja dobiegła swego kresu na początku roku 1996 wraz z przełomową premierą urządzeń „Palm Pilot” wyprodukowanych przez firmę Palm Computing, działających pod kontrolą systemu operacyjnego Palm OS. Był to początek świetności urządzeń mobilnych – świetności, która trwa do dziś. Głównym kluczem do sukcesu okazało się być stworzenie platformy sprzętowo-systemowej od podstaw, w taki sposób, by dopasować sprzęt do oprogramowania, a nie – jak to zwykło się robić – oprogramowanie do sprzętu[20]. Palm Computing wyprodukował pierwszego palmtopa, który był przyjazny w obsłudze, a jednocześnie posiadał ogromny potencjał funkcjonalny. Nie przeszkadzała w tym prostota jego wykonania, która wręcz przyczyniła się do przystępnej ceny urządzenia.

Kolejnym ważnym wydarzeniem w historii komputerów kieszonkowych było pojawienie się produktu firmy Microsoft pod koniec roku 1996. Był to system operacyjny Windows CE, powstały zgodnie z charakterystyką systemu Windows znanego z komputerów klasy PC. Liczni znani producenci sprzętu (m.in. Casio, Compaq, Hewlett Packard) rozpoczęli produkcję urządzeń działających pod kontrolą tego systemu. Początki popularności systemu datuje się na rok 1998[21], jednak dopiero po kilku kolejnych latach zyskał on takie uznanie użytkowników, jakim do tej pory cieszył się system Palm OS. System stopniowo ewoluował, wskutek czego w jego oparciu powstały kolejno platformy: Pocket PC (2000 r.), Windows Mobile (2003 r.) oraz inne, mniej powszechnie stosowane.

Od chwili powstania pierwszych współczesnych komputerów kieszonkowych (czyli od roku 1996) ich parametry techniczne systematycznie ulegały rozwojowi. Początkowo palmtopy dysponowały monochromatycznymi wyświetlaczami, posiadały procesory taktowane z częstotliwością 16 MHz i dysponowały pamięcią 128 KB (Palm Pilot 1000). Komunikacja z komputerem stacjonarnym odbywała się przy pomocy portu szeregowego. Wraz z kolejnymi edycjami, urządzenia otrzymywały nowe mechanizmy komunikacji, np. port podczerwieni działający w standardzie IrDA. W latach 1999 (HP Jornada 420) i 2000 (Palm IIIc) powstały pierwsze urządzenia z kolorowymi wyświetlaczami; wówczas standardem było 8MB wbudowanej pamięci; przyśpieszeniu uległy także procesory. Z czasem spopularyzowała się obsługa kart pamięci (Compact Flash, Secure Digital, Memory Stick). Palmtopy można było już łączyć za pomocą współczesnych technologii takich jak USB, Bluetooth, czy podłączać do sieci Wi-Fi. Do niektórych modeli wbudowano aparat fotograficzny, co było możliwe dzięki zwielokrotnieniu rozdzielczości ekranów. Dopracowano także sterowniki dźwięku.

Dziś palmtopy wyposażone są w procesory taktowane prędkościami kilkuset megaherców, a ilość wbudowanej pamięci osiąga kilkaset megabajtów. Coraz częściej spotyka się urządzenia zintegrowane z systemem do nawigacji satelitarnej w standardzie GPS. Dominującą od kilku lat tendencją jest tworzenie komputerów kieszonkowych zintegrowanych z telefonem komórkowym. Urządzeniom opartym na systemie Windows CE zapewnia to platforma Smartphone[22] (od 2002 r.), a wśród urządzeń z systemem Palm OS dominują dziś modele Treo (od 2002 r.) i Centro[23] (od 2007 r.) posiadające wbudowane moduły telefonii komórkowej. Z drugiej strony, także współczesne telefony komórkowe ewoluują w kierunku rozbudowanych komputerów kieszonkowych dzięki takim platformom jak „Symbian”[24] (od 2001 r.), popularny w USA „BlackBerry”[25] (od 2002 r.), czy „iPhone”[26] (od 2008 r.).

1.3. Systemy operacyjne

Wszystkie komponenty wewnętrzne komputerów kieszonkowych są bezpośrednio powiązane z odpowiednimi modułami systemu operacyjnego. W urządzeniach tych system stanowi zatem niemal doskonałe odzwierciedlenie platformy sprzętowej, na której jest zainstalowany. Dodatkowe biblioteki, służące do wykonywania czynności wyższego poziomu – a zatem innych niż obsługa podzespołów urządzenia – nie wchodzą w skład systemu operacyjnego. Jedynym wyjątkiem jest podstawowy interfejs użytkownika, umożliwiający obsługę urządzenia. Powyższa zasada charakteryzuje oba najbardziej popularne systemy operacyjne komputerów kieszonkowych: Palm OS oraz Windows CE. Jest to jedna z nielicznych wspólnych cech tych systemów – pomimo że powstały one dla podobnych urządzeń, ich założenia były odmienne, a ponadto ewoluowały w różnych kierunkach. Co więcej, systemy te ściśle są związane ze sprzętem, na którym funkcjonują. Platformy sprzętowe obu systemów nie są wzajemnie kompatybilne, zatem w komputerach przenośnych nie ma możliwości zmiany („przeinstalowania”) systemu operacyjnego na system konkurencyjny.

Palm OS powstał jako niewielki, szybki i wydajny system operacyjny z możliwością łatwej rozbudowy. Dzięki swojemu interfejsowi użytkownika jest systemem bardzo prostym w obsłudze – pozwala na wykonywanie typowych czynności bez wyświetlania zbędnych okienek, skomplikowanych komend w menu, czy zawikłanej nawigacji ekranowej. Posiada wbudowane mechanizmy służące do prostej i szybkiej wymiany danych z komputerem stacjonarnym. Charakteryzuje się wszechstronnością zastosowań – w oparciu o system Palm OS powstały rozmaite urządzenia różniące się wyglądem i funkcjonalnością[27]. Ze względu na swoje cechy, stał się on bardzo popularny nie tylko wśród użytkowników, ale także wśród producentów oprogramowania – cieszy się on ogólną liczbą napisanych aplikacji znacznie przewyższającą wszystkie inne systemy operacyjne dla komputerów kieszonkowych.

Windows CE powstał jako mobilny odpowiednik systemu Windows 95. Głównym jego założeniem było przeskalowanie funkcjonalności komputerów stacjonarnych wraz z zachowaniem podobieństwa interfejsu użytkownika. W rezultacie obsługa pierwszych palmtopów z systemem Windows CE rzeczywiście przypominała obsługę systemu Windows 95, co skusiło wielu konsumentów do nabycia komputera przenośnego. Szybko przekonali się oni jednak, że obsługa skomplikowanych funkcji w tych niewielkich urządzeniach nastręczała wiele problemów: trudność wprowadzania danych, niska rozdzielczość ekranu, czy bardzo mała moc obliczeniową procesorów, przekładająca się na powolne działanie. Efektem braku akceptacji użytkowników na takie funkcjonowanie było stworzenie przez Microsoft platformy Pocket PC. Powstała ona na jądrze systemu Windows CE, jednak posiadała całkowicie zmieniony interfejs użytkownika[28]. System zyskał na popularności i dalej ewoluował w kierunku usług multimedialnych i sieciowych, stając się podstawą dla kolejnych platform, szczególnie Windows Mobile.

Windows Mobile jest dziś najbardziej zaawansowanym technologicznie systemem operacyjnym dla komputerów kieszonkowych. Posiada on wbudowane mechanizmy obsługujące zarówno grafikę, wideo i animację, jak i dźwięk. Pozostałe systemy operacyjne wspierają powyższe technologie multimedialne w minimalnym stopniu nie tylko za sprawą skromnego oprogramowania, ale też ze względu na brak odpowiednich modułów sprzętowych.

Zadania organizera (kalendarz, terminarz, książka adresowa, notatnik, kalkulator) najlepiej spełnia system Palm OS – zapewnia mu to niezmieniona od pierwotnych wersji prostota, wygoda i szybkość działania. Najgorzej w tej kwestii klasyfikuje się system Windows Mobile, głównie ze względu na nadmierną komplikację obsługi i dostępu do najprostszych, najbardziej podstawowych zadań powierzanych urządzeniom PDA. System ten uważany jest też za niezbyt stabilny, przez co traci na niezawodności.

Na indywidualne spojrzenie zasługują jeszcze dwa systemy operacyjne. System BlackBerry kanadyjskiej firmy Research In Motion jest systemem wiodącym w dziedzinie technologii bezprzewodowych. Instalowany jest na urządzeniach przenośnych przeznaczonych do ciągłej komunikacji z siecią Internet. Zawiera ułatwienia służące ogólnie pojętej łączności: wymianie poczty elektronicznej, wiadomości tekstowych SMS, przeglądaniu stron internetowych oraz prowadzeniu rozmów telefonicznych w sieciach komórkowych. System Symbian zaś powstał z intencji największych producentów telefonów komórkowych (Ericsson, Nokia i innych) celem stworzenia hybrydy z urządzeniami PDA. Posiada stosunkowo dobre zdolności organizacyjne oraz sieciowe, ale przede wszystkim doskonale łączy je z technologią sieci GSM i CDMA[29].

system operacyjnyfunkcjonalności
orga­nizermulti­mediaInter­nettele­fonianiety­powe
Palm OS+ + +++ ++ ++ + +
Windows Mobile++ + ++ ++ ++ +
RIM BlackBerry+ +++ + ++ ++
Symbian OS+ +++ ++ + ++

Tabela 1 – Porównanie funkcjonalności systemów operacyjnych.

Źródło: Opracowanie własne.

Tabela 1 zbiorczo przedstawia charakterystykę wyżej opisanych funkcjonalności oferowanych przez współczesne systemy operacyjne urządzeń PDA. Wynika z niej jednoznacznie, że wybór systemu w znacznym stopniu determinuje możliwości funkcjonalne poszczególnych urządzeń. Fakt iż palmtopy nie umożliwiają zmiany zainstalowanego systemu na system konkurencyjny sprawia, że użytkownik już przy zakupie urządzenia musi mieć rozeznanie co do zadań, jakie zamierza przy jego pomocy wykonywać. Wybór ten jest dość oczywisty dla popularnych zadań dotyczących organizera, multimediów, czy sieci komputerowych lub telefonicznych – wystarczy skorzystać z zaprezentowanej tabeli.

Natomiast dla specjalistycznych zastosowań profesjonalnych, związanych z konkretną dziedziną działalności ludzkiej – czy to biznesowej, czy użytkowej – najlepszym wydaje się być wybór systemu operacyjnego Palm OS. W największym stopniu spełnia on kryteria istotne dla użytkownika docelowego stojącego przed wyborem systemu, na którym chciałby pracować[30]:

Dalsza część niniejszej pracy skupia się na palmtopach platformy sprzętowo-systemowej Palm właśnie ze względu na tę charakterystykę. Uzasadnia ona bowiem przeprowadzenie badania empirycznego polegającego na napisaniu przykładowej aplikacji właśnie dla tej platformy. Badanie pozwoli jednoznacznie wykazać przydatność systemu Palm OS w rozwiązaniu problemu przedstawionego we Wstępie.

2. Charakterystyka ogólna

2.1. Podręczność i łatwość obsługi

Komputer kieszonkowy, jako urządzenie podręczne, musi zawsze być gotowy do pracy, a ponadto powinien w czasie rzeczywistym wykonywać wydawane mu polecenia. Użytkownik mobilny oczekuje natychmiastowego wsparcia ze strony komputera, niezwłocznie po wyjęciu go z kieszeni. Wynika to przede wszystkim z faktu, że zadania powierzane palmtopom mają charakter całkowicie inny niż te, wykonywane na komputerach stacjonarnych. Użytkownicy tych drugich zaakceptują odczekanie kilku sekund na uruchomienie aplikacji, ponieważ planują korzystać z niej przez dłuższy czas[31]. Użytkownik palmtopa najczęściej potrzebuje wprowadzić krótką notatkę, odnaleźć adres w książce kontaktów, lub obliczyć pojedynczą wartość w specjalistycznym oprogramowaniu. Stanowi to jedynie drobny etap wykonywanych przez niego złożonych czynnościach. Oznacza to, że prędkość, wydajność i łatwość obsługi stanowią klucz do sukcesu aplikacji mobilnych.

Palmtopy są zawsze gotowe do pracy – wystarczy nacisnąć przycisk i na ekranie od razu pojawia się ten widok, który pozostał przy poprzednim wyłączeniu urządzenia. Jest to bardzo praktyczne rozwiązanie, gdyż przeciętny użytkownik korzysta z palmtopa przez okres kilku sekund, 15 do 20 razy dziennie[32]. Podczas takiego wyłączenia urządzenia, systemu operacyjnego nie wyłącza się. Wczytuje się on jednokrotnie – przy pierwszym uruchomieniu urządzenia[33], by pozostać na stałe uruchomionym. Wyłączenie urządzenia skutkuje zatem na odłączeniem urządzeń wejścia-wyjścia oraz zaprzestaniem wykonywania instrukcji przez procesor, jednak pamięć operacyjna systemu i aplikacji pozostaje stale podtrzymywana (tzw. tryb sleep mode[34]). W niektórych modelach występuje także tzw. stan uśpienia REM[35], pozwalający np. na odtwarzanie muzyki przy wyłączonym palmtopie – wyłączany jest wówczas jedynie ekran oraz digitizer (ekran dotykowy) lub klawiatura, a wszystkie pozostałe funkcje działają w trybie oszczędzającym baterię.

Komputery kieszonkowe, by spełniać swoje podstawowe założenia podręczności, muszą charakteryzować się małymi gabarytami. Implikuje to pewne ograniczenia sprzętowe, jak na przykład brak klawiatury w wielu palmtopach – w takim przypadku użytkownik ma do dyspozycji alternatywne sposoby wprowadzania danych do urządzenia (opisane w kolejnym podpunkcie), np. za pomocą funkcji rozpoznawania pisma odręcznego. Z kolei niewielki rozmiar ekranu rekompensowany jest dużymi rozmiarami wyświetlanych na nim elementów – do tekstów stosuje się dużą czcionkę, a wszelkie przyciski w okienkach programów powinny być na tyle obszerne, by można było je nacisnąć nie tylko rysikiem, ale także palcem (co często okazuje się być znacznie praktyczniejsze niż konieczność uprzedniego wysunięcia rysika z jego uchwytu i schowania go po zakończeniu pracy z urządzeniem).

Dalszym ograniczeniom podlegają przyciski znajdujące się na obudowie urządzenia. Oprócz włącznika, typowy palmtop posiada jeszcze tylko kilka przycisków. Są to m.in. cztery przyciski z reguły służące do bezpośredniego uruchamiania najczęściej używanych aplikacji. Są one programowalne, a zatem dają użytkownikowi możliwość dowolnej modyfikacji swojego zestawu podręcznych aplikacji. Starsze palmtopy wyposażone były ponadto w dwa przyciski służące do przewijania wyświetlanych tekstów w górę/dół, a nowsze posiadają tzw. 5-way navigator, rodzaj niewielkiego dżojstika, dzięki któremu można nie tylko przewijać teksty w dowolnym kierunku, ale też korzystać z kontrolek interfejsu użytkownika bez konieczności dotykania ekranu.

Oprogramowanie systemu Palm OS gwarantuje, że najczęściej wykonywane zadania są łatwo dostępne za pomocą kontrolek ekranowych. Funkcje bardziej zaawansowane i rzadziej stosowane umieszczone są jako polecenia menu. Wyświetlane jest ono ponad głównym oknem aplikacji tylko w razie potrzeby, dzięki czemu nigdy nie utrudnia dostępu do podstawowych poleceń. Nawigacja wewnątrz aplikacji przemyślana jest w taki sposób, by zredukować ilość okien, jakie użytkownik musi odwiedzić, by wykonać typowe czynności. Większość aplikacji składa się z jednego okna głównego i kilku dodatkowych, wywoływanych bezpośrednio z tego pierwszego. Taki układ w zupełności wystarcza w konstruowaniu nawet najbardziej specjalistycznego oprogramowania.

W parze z podręcznością i przenośnością palmtopów idzie możliwość ich bezproblemowego połączenia z komputerami stacjonarnymi. Odbywa się to celem wymiany danych, wykonania ich kopii bezpieczeństwa (np. na wypadek wyczerpania się baterii w palmtopie), lub wgrania nowego oprogramowania. Łączność palmtopów z innymi komputerami jest głównym zagadnieniem podpunktu 2.4 znajdującego się w dalszej części niniejszej pracy.

2.2. Interfejs użytkownika

Jak wspomniano w poprzednim podpunkcie, wygodna obsługa i szybkość działania stanowią bardzo istotne cechy komputerów przenośnych. Aby je uzyskać, urządzenia te muszą być solidnie dopracowane nie tylko sprzętowo, ale również muszą pracować pod kontrolą wydajnego i przyjaznego użytkownikowi systemu operacyjnego. W przypadku palmtopów platformy Palm oba te postulaty są spełnione. Urządzenia skonstruowane są w sposób ergonomiczny, a system Palm OS dysponuje przejrzystym interfejsem użytkownika. Dzięki temu wykonanie zarówno podstawowych, jak i bardziej zaawansowanych czynności nie sprawia trudności, nie wymaga wydawania wielu komend i może być zrealizowane w bardzo krótkim czasie.

Ekran dotykowy jest podstawą komunikacji z użytkownikiem – funkcjonuje on zarówno jako urządzenie wyjścia (wyświetlacz), jak i wejścia (urządzenie wskazujące, klawiatura ekranowa). W połączeniu z dołączonym do każdego palmtopa rysikiem, zastępuje mysz komputerową. Użytkownik dotykając ekranu rysikiem lub palcem, wskazuje znajdujące się na nim elementy na zasadzie podobnej jak kursor myszy. Ponieważ większość palmtopów nie posiada sprzętowej klawiatury[36], ekran służy także do wprowadzania teksu za pomocą oprogramowania rozpoznającego ludzkie pismo lub korzystając z wyświetlanej klawiatury. Do wygodnego wprowadzenia dużej ilości tekstu konieczne jest podłączenie zewnętrznej klawiatury (dostępne są modele składane) lub skorzystanie z komputera stacjonarnego, a następnie przesłanie danych do palmtopa poprzez mechanizmy synchronizacji opisane w podpunkcie 2.4.

Wzory liter i cyfr rozpoznawanych przez oprogramowanie Graffiti.

Rysunek 3 – Wzory liter i cyfr rozpoznawanych przez oprogramowanie Graffiti.

Źródło: Opracowanie własne (zrzut ekranowy systemu Palm OS).

Podstawowym rozwiązaniem zastępującym klawiaturę jest oprogramowanie Graffiti[37] służące do rozpoznawania liter wprowadzanych na ekranie za pomocą rysika i przekształcające je w tekst komputerowy. Aby system rozpoznał wprowadzane znaki, muszą one odpowiadać wzorom ustalonym przez twórców Graffiti. Rysunek 3 przedstawia wzory liter i cyfr – powstały one poprzez uproszczenie wielkich liter alfabetu łacińskiego (za ich pomocą można wprowadzać zarówno wielkie, jak i małe litery). Wskutek tego, znaki wprowadza się pojedynczym ruchem dłoni, czyli szybciej niż w przypadku zwykłego pisma odręcznego. Na podobnej zasadzie dostępne są wzory najczęściej używanych znaków interpunkcyjnych oraz znaków diakrytycznych alfabetów narodowych. Po wykonaniu odpowiedniego ruchu rysikiem na wydzielonym do tego celu obszarze ekranu dotykowego, rozpoznany znak pojawia się w aktywnym polu tekstowym. Rozpoznawane są poszczególne litery i znaki, a następnie automatycznie łączone w ciągi znaków lub wyrazy.

Przykładowa formatka aplikacji systemu Palm OS.

Rysunek 4 – Przykładowa formatka aplikacji systemu Palm OS.

Źródło: Opracowanie własne (zrzut ekranowy systemu Palm OS).

Podstawą interfejsu użytkownika w systemie Palm OS jest tzw. formatka (ang. form) – jest to okno wyświetlane na ekranie, zawierające pozostałe elementy interfejsu. Przykładową formatkę przedstawiono na powyższym rysunku (Rysunek 4) – jest to zrzut ekranowy głównego widoku wbudowanej aplikacji „Date Book” służącej do organizacji czasu. W skład formatki mogą wchodzić m.in. następujące kontrolki:

Większość formatek posiada także pasek tytułu, zawierający nazwę aplikacji lub nagłówek danego widoku. Jego naciśnięcie powoduje wyświetlenie menu aplikacji, które może zawierać szereg komend używanych nie tak często jak te, które dostępne są pod zawsze widocznymi przyciskami formatki. Ponadto, formatka może zawierać inne elementy, które szczegółowo zostaną przedstawione w punkcie „Elementy składowe aplikacji”.

Wszystkie graficzne elementy interfejsu użytkownika zostały zaprojektowane w taki sposób, by były duże, czytelne i zrozumiałe nawet dla początkujących. Zapewnia to maksymalny komfort pracy nawet na tak małych ekranach, jakimi dysponują komputery kieszonkowe. Dodatkowo, autorzy systemu operacyjnego zaproponowali zestaw wytycznych dla indywidualnych autorów oprogramowania. Dzięki nim wszystkie aplikacje zachowują spójność, a ich użytkowanie niewiele różni się od obsługi wbudowanych aplikacji dostarczanych z każdym palmtopem[38].

2.3. Podstawowe oprogramowanie

Jądro systemu Palm OS pracuje w trybie wielozadaniowym z wywłaszczaniem[39]. Mimo to, powłoka aplikacyjna interfejsu użytkownika (moduł systemu operacyjnego zarządzający aplikacjami wyświetlającymi interfejs użytkownika) zezwala na jednoczesne uruchomienie tylko jednej aplikacji. Znacznie upraszcza to obsługę urządzeń ograniczonych sprzętowo (gabarytowo), jakimi są palmtopy. Sprawia także, że aplikacje działają w czasie rzeczywistym, a więc zawsze mogą wykonać swoje zadania w zamierzonym czasie. Wpływa to na wydajność i sprawność systemu.

Ikony podstawowych aplikacji systemu Palm OS.

Rysunek 5 – Ikony podstawowych aplikacji systemu Palm OS.

Źródło: Opracowanie własne (zrzut ekranowy systemu Palm OS).

Główną aplikacją służącą do uruchamiania aplikacji użytkownika jest tzw. Applications Launcher (od angielskiego launch uruchamiać). Wyświetla on ikony wszystkich zainstalowanych w systemie aplikacji (Rysunek 5) posegregowane w tematyczne kategorie. Ponadto, służy on do zarządzania zainstalowanym oprogramowaniem, umożliwiając:

Jedną z nietypowych cech aplikacji charakteryzujących platformę Palm jest zapamiętywanie stanu aplikacji podczas wyłączania, a następnie przywracanie go przy ponownym uruchamianiu. Dzięki temu po powrocie do aplikacji użytkownik zawsze zastaje dokładnie ten sam widok, w jakim poprzednio ją opuścił. Zachowanie takie rekompensuje brak faktycznej wielozadaniowości systemu operacyjnego, będąc jednocześnie kolejnym czynnikiem pozytywnie wpływającym na intuicyjność obsługi.

W skład wbudowanego oprogramowania użytkowego urządzeń platformy Palm wchodzi prosty kalkulator oraz cztery podstawowe aplikacje organizera:

Funkcjonalność wymienionych aplikacji, a także tych dodatkowo instalowanych przez użytkownika, powiązana jest wzajemnie na kilka sposobów oferowanych przez system operacyjny:

Wszelkie oprogramowanie działające na palmtopie funkcjonuje w jednym ogólnym profilu użytkownika. Dane prywatne zabezpieczone są jednym wspólnym hasłem, które ponadto może służyć do całkowitego zabezpieczenia dostępu do urządzenia. Takie podejście wynika z faktu, że palmtop to komputer wyjątkowo osobisty, należący do konkretnego użytkownika i towarzyszący mu przez cały czas. Przy pierwszym użyciu palmtopa przypisuje się mu identyfikator użytkownika (zwykle imię i nazwisko), który od wtedy funkcjonuje już przez cały czas. Służy on głównie do identyfikacji podczas łączności z innymi urządzeniami, a w szczególności z komputerem stacjonarnym.

2.4. Powiązanie z komputerem stacjonarnym

Żaden komputer kieszonkowy nie jest w stanie całkowicie zastąpić komputera stacjonarnego. Byłoby to niezgodne z jego ogólną ideą, jak i nierealne ze względu na ograniczenia gabarytowe i sprzętowe. Pewne zadania, takie jak wprowadzanie dużych ilości tekstu, redagowanie złożonych dokumentów, czy czasochłonne projektowanie wspomagane komputerowo (CAD) zawsze pozostaną domeną niedostępną dla palmtopów. Na chwilę obecną, również operacje wymagające dużej mocy obliczeniowej wydają się być niemożliwe do realizacji na tych niewielkich urządzeniach. Zasilane są one bateryjnie (akumulatorowo), zatem przede wszystkim ze względu na zużycie energii, prędkość ich procesorów jest ograniczona.

Twórcy platformy Palm uważają, że palmtopy powstały jako urządzenia satelickie dla komputerów stacjonarnych, a ich oprogramowanie powinno służyć głównie do prezentacji danych przetworzonych przez silniejsze maszyny[40]. Każda aplikacja wymagająca wykonywania zadań złożonych obliczeniowo, powinna posiadać swój odpowiednik na komputerze stacjonarnym. Mógłby on pobierać dane wejściowe zgromadzone na palmtopie, dokonywać stosownych obliczeń, a następnie przesyłać wyniki z powrotem na urządzenie mobilne. System operacyjny Palm OS udostępnia mechanizmy zezwalające na taką obustronną komunikację. Funkcjonują one zarówno na samym palmtopie, jak i istnieje odpowiednie oprogramowanie dla komputerów stacjonarnych pracujących pod kontrolą systemu operacyjnego Microsoft Windows.

Łączność z komputerem stacjonarnym jest jedną z podstawowych funkcjonalności oferowanych przez palmtopy. Każdy palmtop wyposażony jest w specjalny kabel lub podstawkę dokującą. Umożliwiają one komunikację, a także służą do tymczasowego zasilania urządzenia, lub do ładowania wbudowanego akumulatora. Ponadto, identyczne zadania można wykonywać przy pomocy takich protokołów łączności bezprzewodowej jak IrDA (z wykorzystaniem portu podczerwieni), Bluetooth (radiowo, w krótkim zasięgu), czy IEEE 802.11 (popularne Wi-Fi, radiowo)[41].

Zainstalowana na wszystkich komputerach platformy Palm aplikacja „HotSync” odpowiedzialna jest za inicjalizację, przebieg i sfinalizowanie każdej operacji wymiany danych z pracującą w systemie Microsoft Windows aplikacją „Palm Desktop”. Podstawowym zadaniem tego zestawu programów jest wykonywanie kopii bezpieczeństwa wszystkich danych znajdujących się na palmtopie. Dla użytkownika jest to czynność niezwykle prosta – wystarczy umieścić urządzenie w podstawce dokującej (lub podłączyć kabel, albo zainicjować połączenie bezprzewodowe) i nacisnąć znajdujący się na niej specjalny przycisk. Oprogramowanie następnie automatycznie przeprowadza cały proces synchronizacji danych (stąd nazwa HotSync, symbolizująca szybką synchronizację, zawsze możliwą do wykonania).

Wszystkie aplikacje użytkowe wbudowane w palmtopy posiadają swoje odpowiedniki stanowiące moduły aplikacji „Palm Desktop”. Umożliwiają one wykonywanie dokładnie tych samych czynności, co aplikacje mobilne (edycja notatek, zarządzanie książką kontaktów, itd.). Każdy taki moduł posiada też swój własny mechanizm komunikacji z palmtopem, tzw. conduit[42], funkcjonujący na poziomie protokołu „HotSync” i służący usprawnieniu wymiany danych. Istnienie conduitu nie jest konieczne dla wszystkich aplikacji; w szczególności gdy nie wymagają one dwustronnej komunikacji (tj. gdy dane programu modyfikowane są tylko na palmtopie i konieczna jest jedynie ich archiwizacja na komputerze stacjonarnym) oraz gdy standardowy protokół synchronizacji („HotSync”) jest wystarczająco wydajny.

Kolejnym bardzo ważnym zadaniem łączenia komputerów kieszonkowych z komputerami stacjonarnymi jest możliwość instalowania dodatkowych aplikacji. Pamięć współczesnych palmtopów jest na tyle pojemna, że może pomieścić dziesiątki, a nawet setki nowych programów. Oprogramowanie dla platformy Palm OS tworzone przez niezależnych autorów jest naprawdę liczne, a na rynku występuje duży jego wybór, jak i wynikająca z niego różnorodność zastosowań. Każdy użytkownik palmtopa może zakupić lub pobrać z sieci Internet darmowe oprogramowanie, a następnie zainstalować je na swoim urządzeniu. Kanały dystrybucji oprogramowania dla komputerów kieszonkowych zostaną szczegółowo omówione w podpunkcie „Kanały sprzedaży i marketing”.

3. Specyfikacja techniczna

3.1. Procesor i procesy

Współczesne palmtopy, ze względu na oczekiwane niewielkie zużycie energii, nie dysponują szybkimi procesorami. Zwiększenie mocy obliczeniowej wpływa wprost proporcjonalnie na pobór energii elektrycznej. Bez zastosowania nowszych technologii produkcji podzespołów (obecnie jeszcze nie odkrytych lub wciąż bardzo drogich), takie rozwiązanie skróciłoby czas pracy urządzenia między ładowaniami akumulatora. Częściowo problemowi temu zaradzić można implementując specjalne mechanizmy sprzętowe lub programowe zmniejszające taktowanie procesora podczas dłuższej bezczynności lub mniejszego obładowania. Nie zmienia to jednak zasygnalizowanego już wcześniej w niniejszej pracy faktu, że wszelkie obliczenia wymagające dużej mocy obliczeniowej nie są wskazane na komputerach kieszonkowych.

Skutkiem tych zdroworozsądkowych ograniczeń w przypadku platformy sprzętowo-systemowej Palm jest rezygnacja z udostępnienia wielowątkowości jądra systemu dla aplikacji użytkowych. Ma to na celu uproszczenie przebiegu przetwarzania poleceń oraz uniknięcie rywalizacji procesów o moc obliczeniową i dostęp do pamięci podręcznej procesora. Efektem najbardziej istotnym dla użytkownika jest fakt, że czyni to palmtopy w praktyce obsługi równie szybkimi[43], jak komputery stacjonarne. Dla porównania, autorzy platformy mobilnej Windows CE nie wprowadzili podobnego ograniczenia – ich system charakteryzuje się pełną wielozadaniowością i wielowątkowością[44]. Przejawia się to stosowanymi w tych urządzeniach nieporównywalnie silniejszymi procesorami (wyszczególnienie znajduje się na końcu tego podpunktu) względem tych, montowanych w danym czasie w urządzeniach platformy Palm (czyli nieprzerwanie od 1996 roku). Konsekwencją takiego rozwiązania zawsze był mniejszy czas pracy na bateriach urządzeń firmy Microsoft, jak i ich wyższa cena, nie przekładające się na ogólną sprawność działania.

Jak wspomniano w podpunkcie 2.3, jednoczesnemu uruchamianiu kilku procesów (wielowątkowości) w systemie Palm OS zapobiega powłoka aplikacyjna interfejsu użytkownika (ang. user interface application shell). Jest ona zwykle jedynym działającym procesem, uruchamiając kod aplikacji jako swój podproces[45]. W praktyce jedyny wyjątek dotyczący wszystkich palmtopów (platformy Palm) stanowi systemowa aplikacja „HotSync”[46], w której wprowadzono dodatkowy wątek odpowiedzialny za przesyłanie danych. Możliwość taka nie jest jednak udostępniona indywidualnym autorom oprogramowania, a przykładowo odtwarzanie muzyki w tle (podczas pracy z różnymi aplikacjami) uzyskiwane jest dzięki cyklicznemu wywoływaniu kodu aplikacji multimedialnej jako podprogram aktywnej aplikacji.

Palmtopy zazwyczaj wyposażone są w tylko jeden procesor. Nie posiadają koprocesorów numerycznych, ani graficznych (GPU). Dla autorów oprogramowania stanowi to pewne ograniczenia, które wpływają na nieco odmienny styl programowania względem np. komputerów stacjonarnych. Różnice te zostaną szczegółowo przedstawione w podpunkcie „Porównanie z innymi platformami”. Tu należy zasygnalizować jedynie, że sprzęt komputerów kieszonkowych nie potrafi m.in. wykonywać obliczeń zmiennoprzecinkowych, ani nie wspiera generowania grafiki trójwymiarowej (wykorzystywanej np. we współczesnych grach komputerowych, lub aplikacjach CAD).

Starsze komputery platformy Palm wyposażone były w proste 32-bitowe procesory zaprojektowane przez wydział „Semiconductor Products Sector” firmy Motorola (obecnie będący odrębną firmą: Freescale Semiconductor[47]), należące do rodziny „DragonBall”. Były to modele 68328, 68EZ328, 68VZ328 i 68SZ328[48], określane wspólnym mianem „Motorola 68000” lub skrótem „M68K”. W związku z rozwojem palmtopów i wzrostem ich zapotrzebowania na moc obliczeniową (np. wskutek spopularyzowania się 16-bitowych wyświetlaczy o zwielokrotnionej rozdzielczości), architektura ta przestała być wystarczająco wydajną. Niektórzy producenci sprzętu (np. Sony, produkujący palmtopy „Clié” działające pod kontrolą systemu Palm OS) wprowadzali dodatkowe koprocesory obsługujące multimedia, jednak rozwiązania te w dłuższym okresie czasu nie zyskały na popularności.

W roku 2002 firma Palm przedstawiła całkowicie nową wersję swojego systemu operacyjnego – Palm OS 5. Podstawową różnicą względem poprzednich wersji była jej kompilacja pod nową architekturę procesorów „ARM” brytyjskiej firmy Advanced RISC Machine (obecnie: ARM Holdings[49]). Do dziś powstały urządzenia z następującymi ich odmianami: ARM 720T, ARM7TDMI, ARM920T, ARM922T, ARM925, StrongARM, Xscale i ARM710A[50]. Są to również 32-bitowe procesory, jednak znacznie różniące się architekturą od procesorów „DragonBall”. Głównymi różnicami jest kolejność zapisu bajtów (ang. byte order lub endianness) oraz wyrównanie dostępu do danych wielobajtowych (ang. data alignment oraz data structure padding).

Celem zachowania kompatybilności z aplikacjami skompilowanymi dla poprzednich wersji systemu Palm OS, wersja 5 zawiera programowy emulator procesorów rodziny M68K zwany PACE[51], bez którego uruchomienie tych aplikacji nie byłoby możliwe. Wbrew powszechnemu wyobrażeniu rozmaitych emulatorów, PACE nie przyczynia się do spowolnienia wykonywania instrukcji, ani nie przysparza dodatkowych obliczeń. Spowodowane jest to faktem, iż funkcje API systemu Palm OS skompilowane są już dla macierzystej architektury „ARM”. Ten pozytywny efekt potęguje istotna charakterystyka oprogramowania platformy Palm – częste wykorzystywanie tych funkcji[52].

W tym miejscu warto wspomnieć, iż w czasach, gdy Palm stosował najprostsze modele procesorów firmy Motorola, palmtopy platformy Windows CE wyposażane były w procesory z ówczesnej „górnej półki”: Hitachi SuperH, oraz seria MIPS 41xx i MIPS 3910[53]. Również współcześnie wyposażone są one w wydajne procesory StrongARM i Motorola 821[54] względem energooszczędnych modeli rodziny „ARM” stosowanych w platformie firmy Palm. Stosowanie silnych procesorów w przypadku platformy firmy Microsoft jest konieczne ze względu na duże wymagania sprzętowe stawiane przez system operacyjny Windows CE, jak i dość skomplikowaną strukturę oprogramowania użytkowego (w porównaniu z oprogramowaniem Palm OS).

3.2. Rodzaje i organizacja pamięci

Organizacja pamięci w komputerach platformy Palm jest nietypowa nie tylko w porównaniu z komputerami stacjonarnymi, ale także z innymi platformami mobilnymi. Ta charakterystyka wynika z faktu, że zarządzanie pamięcią zostało zaprojektowane z myślą o jak najbardziej efektywnym jej wykorzystaniu. Twórcy platformy mieli do dyspozycji tylko dwa rodzaje pamięci: pamięć tylko do odczytu (ROM) i pamięć ulotną (RAM). Ich zadaniem było stworzenie takich mechanizmów, dzięki którym wszelkie operacje wykonywane na palmtopie nie wymagałyby przenoszenia, ani kopiowania danych pomiędzy tymi pamięciami, ani też w obrębie którejkolwiek z nich.

System operacyjny zapisany jest w pamięci typu NOR flash[55]. Do jej określania stosuje się częściej nazwę „ROM”, ponieważ jej modyfikacja następuje tylko w przypadku aktualizacji całego systemu. Podczas pierwszego uruchomienia palmtopa (lub po wykonaniu restartu), system zostaje zainicjowany wprost z pamięci ROM, tworząc jedynie obraz swoich zmiennych globalnych w pamięci RAM. Przez cały okres normalnego funkcjonowania, procesor wykonuje operacje systemowe pobierając instrukcje wprost z pamięci ROM. Ma on do niej bezpośredni dostęp dzięki temu, że pamięć ta jest adresowana bezpośrednio, jest pamięcią XIP[56] oraz ponieważ znajduje się ona w tej samej przestrzeni adresowej, co pamięć operacyjna[57].

Komputery kieszonkowe nie posiadają dysków twardych[58]. W konsekwencji, wszelkie dane użytkownika oraz instalowane aplikacje przechowywane są w pamięci RAM lub na zewnętrznych kartach pamięci. Pamięć RAM zatem służy nie tylko jako pamięć operacyjna, ale również jako pamięć trwała. Takie rozwiązanie posiada kolejną wymierną korzyść – procesor ma bezpośredni dostęp także do kodu maszynowego aplikacji użytkowych oraz do ich danych. Dzięki temu wiele operacji wykonywanych jest bezpośrednio w tym miejscu pamięci, w którym przechowywane są dane – unika się w ten sposób ich wczytywania oraz zapisu. Pamięć operacyjna służy zatem przede wszystkim do przechowywania niewielkich, roboczych zmiennych, a na większe struktury danych nie ma w niej miejsca – należy o tym pamiętać projektując każdą aplikację dla systemu Palm OS.

Obszar pamięci operacyjnej (ang. dynamic RAM) jest adresowo oddzielony od obszaru danych (ang. storage RAM)[59]. Dodatkowo, obszar danych jest zabezpieczony przed niekontrolowanym zapisem – dostęp do niego mają tylko specjalne funkcje menedżera danych i zasobów[60] (ang. Data and Resource Manager). Dzięki temu nawet w przypadku błędu programu lub przepełnieniu pamięci operacyjnej, dane użytkownika pozostają bezpieczne, pomimo że znajdują się fizycznie w tym samym module pamięci. Główne zagrożenie dla danych użytkownika wynika natomiast z samego faktu, że są one zapisane w pamięci ulotnej RAM. W przypadku braku zasilania (np. po wyczerpaniu się akumulatora), dane te są bezpowrotnie kasowane. Dlatego tak ważna dla palmtopów jest synchronizacja z komputerem stacjonarnym (opisana w poprzednim punkcie niniejszej pracy), dzięki której w razie konieczności można przywrócić utracone dane.

Obszar danych zorganizowany jest w charakterze bazodanowym[61]. Nie funkcjonuje tu żaden system plików, lecz w zamian dane zapisywane są w rekordach (ang. record) i grupowane w bazach danych (ang. database). Pojedynczy rekord stanowi niepodzielny obszar pamięci i gdy nie jest w użyciu może być dowolnie realokowany w pamięci. Zajmuje się tym menedżer danych i zasobów, który w razie potrzeby zapobiega fragmentacji wolnej przestrzeni. Przykładowo, „plik” wykonywalny aplikacji stanowi pojedynczą bazę danych, w której skład wchodzi m.in. rekord kodu maszynowego oraz rekordy zasobów programu. Aplikacje zapisują wszelkie swoje dane jako rekordy w tworzonych przez siebie dodatkowych bazach danych.

W 2004 roku Palm przedstawił nową architekturę pamięci wykorzystującą NVFS (Non-Volatile File System – dosłownie: nieulotny system plików)[62]. W ten sposób zbudowane urządzenia korzystają z pamięci RAM wyłącznie jako pamięci operacyjnej. Obszar danych został przeniesiony do modułu pamięci typu NAND flash[63], dzięki czemu w przypadku braku zasilania dane użytkownika nie ulegają zniszczeniu. Ponieważ jednak mają one wielokrotnie większą latencję od stosowanych wcześniej pamięci SDRAM, postanowiono wprowadzić specjalne mechanizmy sprawiające, że częste operacje na danych użytkownika nie wymagają ciągłego do nich dostępu. W pamięci RAM wydzielono w tym celu obszar pamięci podręcznej DBCache[64], do którego kopiowane są w całości ostatnio używane bazy danych. Zajmuje się tym automatycznie system operacyjny, w wyniku czego obsługa urządzeń z NVFS, jak i bez, jest dla użytkownika identyczna.

Pamięć wbudowana jest na tyle pojemna, by pomieścić setki aplikacji użytkowych oraz tysiące rekordów danych: notatek, adresów, telefonów... Jednak obrazy, wideo, pliki dźwiękowe, czy pliki map dla systemów nawigacji satelitarnej mogą łącznie zajmować wiele gigabajtów, co znacznie przekracza rozmiar wbudowanej pamięci. Wobec tego, współczesne palmtopy obsługują zewnętrzne karty pamięci typu flash: początkowo posiadały one czytnik kart Compact Flash, następnie Sony wprowadziło obsługę kart Memory Stick, a ostatecznie standardem stały się karty Secure Digital. Na karcie pamięci mogą być przechowywane również programy, jednak celem ich uruchomienia, system operacyjny musi wcześniej skopiować je do pamięci RAM. Operacja ta, podobnie jak w przypadku NVFS, odbywa się całkowicie automatycznie i niepostrzeżenie dla użytkownika. Praktycznym zastosowaniem kart pamięci (szczególnie na urządzeniach z obszarem danych znajdującym się w pamięci ulotnej) jest możliwość wykonania kopii zapasowej wszystkich danych na wypadek wyczerpania się akumulatora lub awarii urządzenia. Częściowo uniezależnia to komputery kieszonkowe od łączności z komputerami stacjonarnymi.

Znajdująca się poniżej Tabela 2 podsumowuje niniejszy podpunkt, przedstawiając zbiorczo poszczególne rodzaje pamięci występujące w platformie Palm. Wskazuje czy z danego rodzaju pamięci istnieje możliwość bezpośredniego uruchamiania aplikacji (XIP), czy jest to pamięć trwała (niewymagająca stałego zasilania bateryjnego) oraz definiuje jej przeznaczenie i typową zawartość przechowywanych w niej danych.

rodzajXIPtrwałaprzeznaczenieprzechowywane dane
ROM++obraz systemukod oraz zasoby systemu operacyjnego
RAM+pamięć operacyjnazmienne robocze systemu operacyjnego
zmienne robocze uruchomionych aplikacji
„DBCache”kopia kodu oraz zasobów aplikacji uruchomionych z pamięci NVFS
kopia baz danych otwartych w pamięci NVFS
dane i aplikacje użytkownika – „obszar danych”dane wymagające szybkiego dostępu
aplikacje wymagające szybkiego dostępu
aplikacje działające w tle
tymczasowa kopia kodu oraz zasobów aplikacji uruchomionej z karty pamięci
NVFS+dane i aplikacje użytkownikakopiowane do „DBCache” w trakcie użycia, traktowane jak dane i aplikacje z pamięci RAM
karta pam.+dane i aplikacje użytkownikadane nie wymagające szybkiego dostępu
aplikacje kopiowane do „obszaru danych” na czas uruchomienia
podręczna kopia zapasowa „obszaru danych”

Tabela 2 – Porównanie rodzajów pamięci występujących w platformie Palm.

Źródło: Opracowanie własne.

3.3. Moduły platformy sprzętowej

Do tej pory, w dwóch poprzednich podpunktach, omówione zostały dwa podzespoły komputerów kieszonkowych: procesor i pamięć. Niniejszy podpunkt opisuje pozostałe moduły, które w różnych konfiguracjach mogą wchodzić w skład sprzętu palmtopów. Procesor oraz pamięć wraz ze sterownikami urządzeń, stanowią swoisty trzon wszystkich innych elementów platformy sprzętowej.

Niewątpliwie, każdy palmtop wyposażony jest w wyświetlacz. Początkowo były to monochromatyczne moduły ciekłokrystaliczne, które ewoluowały od 1-bitowych (wyświetlających piksele całkowicie czarne lub białe[65]), poprzez 2-bitowe (dodatkowe dwa odcienie szarości) i 4-bitowe (16 odcieni szarości). Posiadały one matryce pasywne (nie świecące własnym światłem) z opcją podświetlania. Następnie wprowadzono wyświetlacze kolorowe, których matryca składała się z aktywnych diod w kolorach RGB[66]. Pomimo że fizycznie rozwiązanie takie pozwalało wyświetlać tysiące kolorów, systemowa paleta kolorów indeksowana była ośmioma bitami (maksymalnie 256 różnych kolorów widocznych jednocześnie na ekranie). Współczesne palmtopy posiadają wyświetlacze dysponujące pełną 16-bitową głębią barw (65 tysięcy kolorów).

Palmtop Palm IIIc z typowym formatem ekranu.

Rysunek 6 – Palmtop Palm IIIc z typowym formatem ekranu.

Źródło: Opracowanie własne (zrzut ekranowy Palm OS Emulator).

Rysunek 6 przedstawia palmtopa ze standardowym dla platformy Palm układem ekranu. Digitizer (powierzchnia czuła na dotyk) obejmuje całą powierzchnię ekranu, natomiast wyświetlacz (obszar wyświetlający obraz) – tylko górną część. Rozmiar całego digitizera wynosi 160 na 240 pikseli, z czego górne 160 na 160 pikseli współdzieli z wyświetlaczem. Dolny obszar, pozbawiony wyświetlacza, jest to tzw. obszar Graffiti, w którym użytkownik korzystając z rysika wprowadza teksty[67] i który zawiera przyciski ekranowe służące do wywoływania często wykonywanych poleceń.

Firma Sony, wprowadzając na rynek palmtopy z serii „Clié”, zaproponowała rozszerzenie tego standardu, stosując ekrany o podwójnej rozdzielczości (320 na 320 pikseli). Następnie, wraz z wprowadzeniem nowej wersji systemu Palm OS 5, firma Palm zaproponowała swój własny standard, który nie tylko podwajał rozdzielczość, ale także powiększał wyświetlacz do tego stopnia, iż objął on całą powierzchnię ekranu dotykowego. Od wtedy standardem platformy Palm są wyświetlacze o rozdzielczościach 320 na 480 pikseli (Rysunek 1) oraz 320 na 320 pikseli w przypadku modeli wyposażonych w klawiaturę zamiast obszaru Graffiti.

Technologia zasilania palmtopów również ewoluowała przez lata. Pierwsze palmtopy korzystały z zasilania bateriami w standardzie AAA („małe paluszki”). Konieczna była ich wymiana co jakiś czas, co dla użytkowników nie było zbyt praktycznym rozwiązaniem. Wkrótce zastąpiono je wbudowanym akumulatorem, który doładowywany był automatycznie, po umieszczeniu palmtopa w podstawce lub podpięciu do kabla zasilającego. Od tamtego czasu, średnie pojemności stosowanych akumulatorów nie zmieniły się, a zapotrzebowanie na moc wzrastało (szybsze procesory, większa ilość pamięci, więcej modułów dodatkowych, wyższa rozdzielczość ekranów, itp.). W rezultacie maksymalny czas pracy na bateriach wielokrotnie zmalał – obecnie jest to kilka godzin pracy (w trybach doze mode i running mode), lub kilka dni w trybie podtrzymania (sleep mode)[68].

Między innymi ze względu na ograniczoną ilość energii, palmtopy nie posiadają dysków twardych, ani znanych z laptopów kontrolerów PCMCIA[69] – standardu wielofunkcyjnych kart rozszerzeń. W zamian, posiadają czytniki kart pamięci[70], a także niektóre modele obsługują standard rozszerzeń SDIO (Secure Digital Input Output) obsługiwany przez czytniki kart SD (Secure Digital). Dzięki niemu, urządzenia nie wyposażone fabrycznie w moduły komunikacyjne takie jak Bluetooth, mogą z nich również korzystać.

Wspomniany moduł Bluetooth (wbudowany lub w postaci karty SDIO) umożliwia m.in. łączność z komputerem stacjonarnym, wymianę danych z innymi palmtopami, czy druk bezpośrednio kompatybilnych drukarek. Jest to standard łączności radiowej krótkiego zasięgu i o niskiej przepustowości. Stosowane w palmtopach moduły klasy 2 (standard Bluetooth Class 2) umożliwiają łączność w obrębie do 10 m i z prędkościami nie przekraczającymi 760 kilobitów na sekundę[71]. Podobną funkcjonalnością charakteryzują się wbudowane porty podczerwieni funkcjonujące w standardzie IrDA. Łączność wymaga kontaktu optycznego obu urządzeń w zasięgu 1 m i zapewnia prędkości do 115,2 kilobitów na sekundę.

Modułem służącym do zapewnienia szybszej łączności bezprzewodowej w nieco większym zasięgu jest moduł Wi-Fi funkcjonujący zgodnie ze standardem IEEE 802.11b. Umożliwia on komunikację z prędkością do 11 megabitów na sekundę w odległości nie przekraczającej 140 m w terenie otwartym. Standard Wi-Fi umożliwia tworzenie bezprzewodowych sieci LAN (local area network – sieć lokalna). Za ich pomocą palmtopy mogą łączyć się z komputerami stacjonarnymi, z innymi palmtopami, jak i mogą uzyskać dostęp do sieci Internet.

Sieć Internet dostępna jest także na komputerach kieszonkowych nie posiadających modułu Wi-Fi. Mogą one łączyć się z aparatami telefonii komórkowej za pomocą portu podczerwieni, kabla lub radiowo (Bluetooth) i dzięki nim uzyskiwać dostęp do sieci z zastosowaniem protokołu pakietowej transmisji danych GPRS (general packet radio service) lub modemu. Hybrydy palmtopów z telefonami komórkowymi mogą w ten sam sposób bezpośrednio łączyć się z Internetem. Posiadają one bowiem wbudowany moduł telefonii GSM lub CDMA (modele amerykańskie) dysponujący bezprzewodowym modemem oraz sprzętowym sterownikiem pakietowej transmisji danych. Znacznie upraszcza to dostęp do sieci. Wspomniane tu standardy zapewniają łączność o przepustowości nie przekraczającej 114 kilobitów na sekundę.

Kolejnym modułem montowanym fabrycznie do komputerów kieszonkowych jest odbiornik GPS (np. produkowane przez firmę Garmin palmtopy „iQue”[72]). Istnieją także zewnętrzne odbiorniki łączące się z palmtopem przy pomocy modułu Bluetooth. GPS (Global Positioning System – globalny system pozycjonowania) jest to system wyznaczania pozycji (lokalizacji) obiektów obejmujący swoim zasięgiem całą kulę ziemską, wykorzystujący nadajniki zamontowane na sztucznych satelitach Ziemi[73]. Odbiorniki tego systemu otrzymują sygnał z kilku satelitów i na podstawie porównania czasów ich dotarcia obliczają swoją lokalizację względną. Najbardziej popularnym sposobem wykorzystania tej informacji jest nawigacja pojazdów – oprogramowanie wyposażone w mapy potrafi obliczyć i wskazać najkorzystniejszą drogę do wyznaczonego celu. Rozwiązanie to znajduje swoje zastosowanie nie tylko w transporcie lądowym, ale też powietrznym i morskim. Istnieje specjalistyczne oprogramowanie dla palmtopów również w tej dziedzinie.

Oprócz wspomnianych modułów komunikacyjnych, współczesne palmtopy często wyposażone są w podzespoły multimedialne – posiadają wbudowany głośnik oraz służące jego zastąpieniu gniazdo słuchawkowe, mikrofon, oraz aparat fotograficzny. Funkcje dźwiękowe mają praktyczne zastosowanie w tworzeniu notatek głosowych – często bowiem prościej jest nagrać krótką wiadomość głosową, aniżeli zapisać ją przy pomocy rysika lub klawiatury. Podobną funkcjonalność posiada aparat fotograficzny, dzięki któremu można sfotografować dokumenty, przedmioty, lub np. portrety ludzi celem podłączenia fotografii do wpisu w książce adresowej.

Podsumowując niniejszy punkt, należy stwierdzić, iż sprzęt komputerów kieszonkowych zezwala na wykonywanie przy ich pomocy rozmaitych czynności, które mają praktyczny wymiar we wszystkich aspektach funkcjonowania użytkowników mobilnych. Przy obecnym rozwoju sprzętu tych komputerów, faktyczna funkcjonalność wbudowanych w nie modułów zależy już tylko od pomysłowości twórców oprogramowania. Fakt ten wskazuje na ogromne możliwości kryjące się w tworzeniu specjalistycznych aplikacji dla komputerów kieszonkowych. Procesowi temu poświęcony jest cały następny rozdział.

Rozdział II
Środowisko programistyczne systemu Palm OS

1. Charakterystyka środowiska tworzenia oprogramowania (SDK)

1.1. Język programowania

Pod względem systemu operacyjnego, platforma Palm jest platformą typową, gdyż stworzona została z zachowaniem wszelkich standardów umożliwiających tworzenie dla niej oprogramowania użytkowego. Takie podejście zapewnia programiście swobodną możliwość wyboru preferowanego języka programowania (z grupy języków imperatywnych lub obiektowych), a także przenośność kodu źródłowego z innych platform i możliwość zastosowania sprawdzonych rozwiązań.

Dla platformy Palm powstały liczne kompilatory różnych języków programowania wysokiego poziomu. Zezwalają one także na dołączanie wstawek w językach niższego poziomu (asembler). Większość z nich umożliwia generowanie kodu maszynowego zgodnego ze wszystkimi procesorami występującymi w palmtopach platformy Palm[74]. Ponadto istnieją narzędzia programistyczne oparte na formatkach[75], które praktycznie pozwalają tworzyć gotowe aplikacje bez stosowania jakiegokolwiek języka programowania (choć zezwalają na jego użycie). Wspomniane tu klasy narzędzi programistycznych zostaną szczegółowo opisane w podpunkcie 2.1.

Pomimo całkowitej dowolności w wyborze języka programowania, zdecydowanie najbardziej uniwersalnym rozwiązaniem jest zastosowanie języka C. Świadczy o tym szereg aspektów takich jak jego bliskość sprzętowa[76], czy zgodność z interfejsem programowania aplikacji (API) platformy Palm. „Język C stanowi jedno z najsprawniejszych współczesnych narzędzi programistycznych przeznaczonych do tworzenia profesjonalnych programów dla różnych platform sprzętowych i różnych systemów operacyjnych. [...] Równocześnie standardowe obiekty języka pod względem typu odpowiadają prostym elementom danych właściwych dla operacji wykonywanych bezpośrednio przez procesory większości komputerów.”[77] Taka bliskość sprzętowa pozwala tworzyć oprogramowanie bardzo sprawne, które działa względnie szybko i wykorzystuje minimalną ilość zasobów. Czynniki te mają ogromne znaczenie w przypadku komputerów przenośnych, dysponujących ograniczoną ilością pamięci i mocy obliczeniowej.

Ze względu na powyższe przesłanki, język C został wybrany do stworzenia systemu operacyjnego Palm OS. Znakomita większość jego kodu źródłowego została napisana właśnie w tym języku (wyjątek stanowią niektóre moduły służące do komunikacji z komputerem stacjonarnym, tzw. conduits[78]). Język C jest zatem językiem natywnym dla platformy Palm. W konsekwencji, wszelkie pliki nagłówkowe zawarte w oryginalnym interfejsie programowania aplikacji (API) systemu Palm OS zapisane są właśnie w tym języku[79]. Programiści posługujący się językiem C mogą więc skorzystać z tych plików bezpośrednio, w przeciwieństwie do programistów tworzących oprogramowanie w innych językach, którzy zmuszeni są do korzystania z ich tłumaczeń. Do negatywnych aspektów stosowania tłumaczeń API należy zaliczyć:

Z drugiej strony, z samego faktu programowania w języku C, oprócz wspomnianych aspektów technicznych, wynika szereg istotnych korzyści dla programisty:

Główne środowiska programistyczne dla platformy Palm umożliwiają ponadto tworzenie aplikacji zgodnych z paradygmatem programowania obiektowego – szczególnie przy użyciu języka C++. Podejście to jest jednak mało popularne, gdyż nienajlepiej wpisuje się w charakter tej platformy. Zgodnie z założeniem, aplikacje systemu Palm OS powinny być możliwie jak najmniejsze i niezbyt skomplikowane[80]. Powinny spełniać jeden konkretny cel, co w aspekcie technicznym przekłada się na stanowienie jednego logicznego obiektu. W takim przypadku podział projektu na klasy i obiekty nie byłby wręcz możliwy. Ponadto (w przypadku bardziej rozbudowanych projektów), zastosowanie obiektów przyczynia się do zwiększenia objętości aplikacji oraz zapotrzebowania na moc obliczeniową i użycie pamięci. Ze względu na niewielki wymiar tej ostatniej zależności, ma ona przede wszystkim charakter historyczny i dotyczy raczej czasów pierwszych palmtopów. Kształtowała także powstanie systemu operacyjnego Palm OS – gdyby nie ona, zostałby on zapewne w logiczny sposób podzielony na obiektowe klasy i napisany w języku C++.

1.2. Interfejs programowania aplikacji (API)

API, czyli Application Programming Interface, jest to „interfejs programów użytkowych, biblioteka wywołań systemu operacyjnego [...] z poziomu aplikacji”[81]. W praktyce, API stanowi zbiór gotowych procedur wchodzących w skład systemu, służących do kontroli sprzętu lub wykonujących typowe dla ogółu aplikacji zadania. Programiści wywołują je bezpośrednio z kodu swoich aplikacji, łącząc je tym samym w funkcjonalną całość spełniającą założenia tworzonego oprogramowania.

Ponieważ skrót API zawiera w sobie słowo „interfejs”, należy to pojęcie rozumieć także na płaszczyźnie spajającej wspomniane systemowe procedury z działalnością programisty. A zatem w skład interfejsu programowania aplikacji wchodzą także udostępnione pliki nagłówkowe (spajające system z oprogramowaniem użytkowym) oraz jego dokumentacja (niejako spajająca system z programistą). System operacyjny Palm OS przy wsparciu swojego środowiska tworzenia oprogramowania (ang. software development kitSDK) dysponuje wszystkimi wymienionymi składnikami API.

Zbiór dostępnych wywołań systemu Palm OS podzielony jest logicznie na tzw. menedżery (ang. managers) i grupy funkcyjne. Każdy menedżer zawiera funkcje powiązane ze sobą tematycznie, służące do zarządzania danym modułem sprzętowym lub wykonywania podobnych zadań. Można wyróżnić menedżery różnych poziomów:

Dostępność, charakterystyka i działanie funkcji niskiego poziomu ściśle związane są z architekturą platformy sprzętowej. Wynikają bezpośrednio ze specyfiki poszczególnych jej modułów[82]. Funkcje te często po prostu wywołują podstawowe rozkazy sterowników sprzętowych lub wręcz procesora głównego. Ponadto zapewniają ochronę integralności systemu oraz obsługę wyjątków na wypadek niekontrolowanego działania. Jednocześnie menedżery te nie udostępniają programiście gotowych rozwiązań, a jedynie oferują podstawowe narzędzia, które może on wykorzystać w najbardziej dogodny dla danego zastosowania sposób. Przykładowo, menedżer pamięci (Memory Manager) nie oferuje obsługi bardziej skomplikowanych struktur danych (np. tablic asocjacyjnych), a menedżer łańcuchów tekstowych (String Manager) nie posiada funkcji służących do wstawiania tekstu wewnątrz innego łańcucha. Funkcjonalność taka wykraczałaby poza niskopoziomowy charakter tych menedżerów, niemniej może być łatwo nadrobiona w kodzie aplikacji z wykorzystaniem istniejących funkcji.

Funkcje średniego poziomu zawarte są w tych samych menedżerach, co pokrewne im funkcje poziomu niskiego. Poszerzają one możliwości systemu w zakresie obsługi sprzętu, czy struktur danych. Do najważniejszych menedżerów tego typu zaliczają się:

Funkcje wysokiego poziomu podzielone są tematycznie na grupy, m.in.:

Ponadto, palmtopy platformy Palm posiadają menedżery, grupy funkcyjne oraz opcjonalne biblioteki związane z łącznością z innymi urządzeniami:

Wszystkie menedżery, grupy funkcyjne oraz biblioteki posiadają swoje pliki nagłówkowe. Jak zasygnalizowano w poprzednim podpunkcie, napisane są one zgodnie ze specyfikacją plików nagłówkowych języka C. Zawierają nie tylko prototypy (deklaracje) funkcji systemowych i bibliotecznych, ale także definicje struktur danych i formatu zasobów oraz definicje stałych. Publikowane są one wraz z obszerną dokumentacją na stronie internetowej producenta platformy Palm[84] i dostępne dla wszystkich zainteresowanych tworzeniem oprogramowania dla palmtopów.

Na dokumentację platformy Palm składają się dwa główne dokumenty:

Ponadto, każdy producent sprzętu publikuje swoją własną dokumentację oraz pliki nagłówkowe dotyczące modułów sprzętowych stosowanych tylko w konkretnych modelach komputerów kieszonkowych. Głównym producentem sprzętu platformy Palm jest firma Palm[85], a dokumentacja dodatkowych funkcji produkowanych przez nią urządzeń zawarta jest w dokumencie Palm programming: the developer's guide [23].

Oprócz wspomnianych elementów środowiska programistycznego (SDK) platformy Palm należy nadmienić, że zawiera ono także kody źródłowe przykładowych programów, prezentujące zalecane techniki programistyczne. Wśród przykładów dostępne są m.in. źródła wszystkich wbudowanych aplikacji organizera. Co więcej, zarejestrowanym producentom oprogramowania firma Palm udostępniana także obszerne fragmenty źródeł samego systemu operacyjnego. Dzięki temu programiści mogą dogłębnie poznać zasadę działania wielu składników systemu, uzyskując tym samym zdolność tworzenia bardziej wydajnych i lepiej zintegrowanych aplikacji.

1.3. Porównanie z innymi platformami

Swoistym podsumowaniem poprzedniego podpunktu może być stwierdzenie, iż autorzy platformy sprzętowo-systemowej Palm wyposażyli niezależnych autorów oprogramowania we wzorową dokumentację, obszerne wskazówki i kompleksowe wsparcie na każdym etapie zapoznawania się z systemem i tworzenia aplikacji użytkowych. Dzięki temu, jakość środowiska programistycznego (SDK) systemu Palm OS docenione zostało przez wielu programistów, a jego kompletność, przejrzystość i przystępność uznawane są za ponadprzeciętne na tle środowisk innych platform.

Pomimo niewątpliwych zalet wielokrotnie wymienianych wcześniej w niniejszej pracy, API platformy Palm wykazuje pewne braki w porównaniu z innymi współczesnymi interfejsami programowania aplikacji. Przykładowo, nie posiada ono mechanizmów zezwalających na tworzenie aplikacji wielowątkowych. Technika ta na innych komputerach jest często wykorzystywana do równoczesnej obsługi kilku urządzeń, albo do rozdzielenia obsługi interfejsu użytkownika od wykonywania zadań mogących go chwilowo przyblokować. Uniemożliwienie korzystania z wielowątkowości i wielozadaniowości na platformie Palm jest intencjonalne, a jego przyczyny i zastępcze środki programistyczne zostały omówione w podpunkcie „Procesor i procesy”.

Dość charakterystyczny dla komputerów kieszonkowych wszystkich wiodących platform jest brak sprzętowej obsługi liczb rzeczywistych. Odróżnia to je od komputerów stacjonarnych, gdzie już od co najmniej kilkunastu lat standardem jest wyposażenie procesora głównego w koprocesor arytmetyczny (FPU) spełniający właśnie te zadania[86]. Platforma Palm posiada zbiór funkcji zawartych w menedżerze liczb rzeczywistych (ang. Float Manager), które programowo zastępują brakujące instrukcje procesora. Niestety podstawową wadą takiego rozwiązania jest bardzo duża złożoność obliczeniowa operacji zmiennoprzecinkowych. Wprowadzenie ich do kodu programu skutkuje widocznym spowolnieniem funkcjonowania oprogramowania nawet na najszybszych palmtopach. W rezultacie, gdy zachodzi potrzeba wykonania większej ilości operacji zmiennoprzecinkowych, programiści uciekają się do zastępowania ich operacjami na zaokrąglonych liczbach całkowitych.

W porównaniu z platformą komputerów kieszonkowych Windows Mobile, platformę Palm odróżniają przede wszystkim dwa aspekty: brak systemu plików dla wbudowanej pamięci trwałej oraz brak wsparcia dla funkcji multimedialnych. Ten pierwszy aspekt skutkuje tym, że w pamięci głównej palmtopów platformy Palm nie można umieszczać plików pobranych z innych platform. Jak wykazano w poprzednim rozdziale (w podpunkcie „Rodzaje i organizacja pamięci”), Palm OS posiada odpowiednik systemu plików w postaci systemu baz danych, jednak systemy te nie są ze sobą zgodne. Jedyną możliwością przechowywania plików obsługiwaną przez Palm OS jest ich zapis na zewnętrznych kartach pamięci.

Brak wsparcia dla funkcji multimedialnych w systemie Palm OS objawia się brakiem odpowiednich funkcji systemowych, które pozwalałyby na generowanie skomplikowanej grafiki komputerowej (np. grafiki trójwymiarowej w aplikacjach CAD), oraz nieobecnością znanych z komputerów stacjonarnych kodeków[87] dźwięku i wideo, czy jeszcze parę lat temu nawet popularnych formatów graficznych takich jak JPEG, czy BMP. Braki te w niewielkim wymiarze nadrabiają systemowe funkcje służące np. do kompresji bitmap[88], jednak pomimo że są one wydajne, to nie oferują zbyt wielu możliwości, ani wysokiej efektywności. W praktyce, celem skorzystania z większości współczesnych formatów medialnych, programista aplikacji dla platformy Palm zmuszony jest samemu je oprogramować, lub zaadoptować istniejące biblioteki pochodzące z innych platform.

Jest jeden bardzo istotny czynnik, który sprawia, że aplikacje działające pod kontrolą systemu Palm OS mają małe rozmiary pomimo nawet rozbudowanej funkcjonalności. Cecha ta była niewątpliwie bardzo ważna w czasach pierwszych palmtopów, kiedy pojemność pamięci liczona była w kilobajtach lub pojedynczych megabajtach. Mowa tu o zaleceniu maksymalnego wykorzystania istniejących funkcji systemowych podczas tworzenia aplikacji użytkowych, popartego udostępnieniem ich w ponadprzeciętnych ilościach. Twórcy systemu wyszli bowiem z założenia, że wiele aplikacji pisanych dla innych platform posiada wspólny kod inicjalizacyjny, albo zawiera te same implementacje funkcji np. operujących na łańcuchach tekstowych.

W związku z powyższym, stosowanie znanych chyba każdemu programiście języka C funkcji operujących zaalokowaną pamięcią (np. malloc, free, memmove, itp.) albo manipulujących łańcuchami tekstowymi (np. strcpy, strcat, itp.) jest stanowczo odradzane podczas tworzenia oprogramowania dla platformy Palm. W zamian, zaleca się korzystać z ich odpowiedników zawartych w odpowiednich menedżerach systemu operacyjnego (np. Memory Manager i String Manager zawierają odpowiedniki wymienionych wcześniej funkcji: MemPtrNew, MemPtrFree, MemMove oraz StrCopy i StrCat). Ta sama zasada dotyczy większości funkcji dostępnych w standardowej bibliotece języka ANSI C („libc”)[89]. W rezultacie typowy rozmiar pojedynczej aplikacji dla platformy Palm oscyluje wokół 100 kilobajtów (wliczając wszelkie zasoby), podczas gdy dla podobnych platform są to wartości rzędu kilkuset kilobajtów.

2. Narzędzia programistyczne

2.1. Zintegrowane środowiska programistyczne (IDE)

Wraz z rozwojem komputerów kieszonkowych, powstało kilka zintegrowanych środowisk programistycznych przeznaczonych do tworzenia aplikacji dla platformy Palm. Jedynie dwa z nich są oficjalne wspierane przez firmę Palm: „CodeWarrior Development Studio for Palm OS” i „Palm OS Developer Suite”. Oba posiadają graficzny interfejs użytkownika i umożliwiają tworzenie aplikacji z wykorzystaniem języka C oraz graficznej edycji zasobów. Po instalacji na komputerze stacjonarnym są one od razu gotowe do użytku – programista może natychmiast przystąpić do tworzenia kodu źródłowego oraz projektowania zasobów, aby po naciśnięciu jednego przycisku dokonać kompilacji i otrzymać gotową aplikację dla systemu Palm OS.

Zintegrowane środowisko programistyczne „CodeWarrior”.

Rysunek 7 – Zintegrowane środowisko programistyczne „CodeWarrior”.

Źródło: [Professional Palm OS programming, s. 48].

„CodeWarrior Development Studio for Palm OS” (Rysunek 7) przez wiele lat było jedynym graficznym środowiskiem programistycznym dla systemu Palm OS wyposażonym w kompilator języka C. Samo środowisko „CodeWarrior” zostało stworzone przez firmę Metrowerks[90] na kilka lat przed wprowadzeniem na rynek pierwszych palmtopów[91] – służyło wówczas do tworzenia oprogramowania dla komputerów Apple[92]. W 1996 r. wraz z premierą platformy Palm, powstała wersja służąca do tworzenia dla niej aplikacji. Istnieją wersje pakietu „CodeWarrior” pracujące zarówno w systemie Microsoft Windows, jak i Apple Macintosh.

Zintegrowane środowisko programistyczne „PODS”.

Rysunek 8 – Zintegrowane środowisko programistyczne „PODS”.

Źródło: [Professional Palm OS programming, s. 64].

„Palm OS Developer Suite” to autorski pakiet stworzony w 2004 r. przez firmę Palm w oparciu o popularne środowisko programistyczne Eclipse[93] oraz zestaw narzędzi kompilująco-konsolidujących „GNU PRC-Tools”[94]. Jego główną zaletą w porównaniu ze środowiskiem „CodeWarrior” jest fakt, że jest on bezpłatny. Ze względu na wysoką cenę, „CodeWarrior” zawsze cieszył się popularnością jedynie wśród dużych firm produkujących oprogramowanie dla komputerów kieszonkowych. Indywidualni programiści uciekali się do tworzenia aplikacji przy pomocy wspomnianego zestawu narzędzi „GNU PRC-Tools” opartego na popularnym uniksowym kompilatorze „GNU Compiler Collection” („GCC”). Ze względu na ich wszechstronność, narzędziom tym poświęcony jest cały następny podpunkt.

Oprócz wymienionych standardowych środowisk programistycznych, istnieją także narzędzia oparte na formatkach (ang. forms-based development tools), które pozwalają tworzyć gotowe aplikacje bez stosowania niskopoziomowego języka programowania. Ich podstawową zaletą jest szybkość tworzenia aplikacji uzyskana poprzez udostępnienie dużej ilości „prefabrykatów”, które wystarczy odpowiednio połączyć celem stworzenia w pełni funkcjonalnej aplikacji. Nie dają one jednak możliwości rozwiązania wszystkich problemów programistycznych, a zatem stosuje się je tylko do tworzenia typowych aplikacji, głównie prezentujących dane bazodanowe. Najpopularniejszymi narzędziami tego typu wspierającymi platformę Palm są: „Compact Applications Solution Language” („CASL”), „Pendragon Forms” i „Satellite Forms”. Różnią się one głównie językiem programowania służącym do spajania elementów aplikacji oraz współpracą z różnymi standardami baz danych.

Autorzy oprogramowania korzystający z innych języków programowania niż język C również mają możliwość tworzenia aplikacji dla platformy Palm przy użyciu zintegrowanych środowisk programistycznych:

Aplikacje dla platformy Palm można tworzyć także bezpośrednio na palmtopie. Ze względu jednak na niezbyt wygodne wprowadzanie tekstu kodu źródłowego, takie rozwiązanie pozostaje głównie domeną pasjonatów i nie znajduje profesjonalnych zastosowań. Wśród popularnych kompilatorów działających pod kontrolą systemu operacyjnego Palm OS należy przede wszystkim wymienić:

2.2. Funkcjonowanie kompilatorów i konsolidatorów

W niniejszym podpunkcie zostaną omówione narzędzia wchodzące w skład zestawu „GNU PRC-Tools”. Służą one do kompilowania i konsolidowania kodu źródłowego, tworząc plik wykonywalny aplikacji systemu Palm OS. Zestaw ten zasługuje na poświęcenie mu szerszej uwagi ze względu na swoją popularność i wszechstronność. Programiści mogą z niego skorzystać bezpośrednio lub pośrednio – używając opartego na nim środowiska programistycznego „Palm OS Developer Suite”[104]. Do kompilowania zasobów służy program „PilRC”, stworzony na potrzeby współpracy z omawianymi narzędziami.

Zestaw narzędzi „PRC-Tools” powstał w odpowiedzi na opublikowanie pierwszej wersji środowiska programistycznego „CodeWarrior Development Studio for Palm OS”[105]. Środowisko to było wówczas (od początku istnienia platformy Palm) jedynym oficjalnym środowiskiem programistycznym dla tej platformy. Jego mankamentem była jednak wysoka cena oraz działanie tylko na platformie Mac OS[106]. Wskutek tego, naturalnym było pojawienie się narzędzi „PRC-Tools”, mogących działać pod kontrolą systemów Unix i Microsoft Windows. W tym drugim przypadku konieczne jest użycie środowiska „Cygwin”[107], implementującego interfejs programistyczny oraz interpreter poleceń systemu Unix.

Plik wykonywalny aplikacji systemu Palm OS powstaje w wyniku działania serii narzędzi z zestawu „PRC-Tools”. Wykonują one kolejne kroki mające na celu przekształcenie źródeł aplikacji w ich postać wykonywalną. Proces ten jest wykonywany przy każdej zmianie źródeł, a zatem szczególnie często podczas tworzenia aplikacji. Celem jego automatyzacji, można skorzystać z narzędzia „make”, popularnego szczególnie wśród programistów języka C i C++ na systemach uniksowych. Służy ono do kolejnego wywoływania poszczególnych narzędzi z zastosowaniem wcześniej ustalonych parametrów. Ponadto posiada możliwość automatycznego pominięcia wywołania tych narzędzi, które działają na źródłach nie zmodyfikowanych od ostatniego przetworzenia. Często znacznie przyśpiesza to czas potrzebny na stworzenie pliku wynikowego. Zbiór instrukcji dla programu „make” zwykle zawarty jest w pliku „makefile” znajdującym się w głównym katalogu projektu.

Sercem narzędzi „PRC-Tools” jest kompilator „m68k-palmos-gcc” oparty na popularnym uniksowym kompilatorze „GNU Compiler Collection” („GCC”). To od jego nazwy, cały zestaw „PRC-Tools” jest często nazywany przez programistów platformy Palm skrótowcem „GCC”[108]. Kompilator ten przetwarza kod źródłowy zapisany w języku C lub C++ na kod maszynowy procesorów „Motorola 68000” zrozumiały dla wszystkich komputerów platformy Palm. W zestawie znajduje się także bliźniaczy kompilator „arm-palmos-gcc”, tworzący kod maszynowy procesorów „ARM” stosowanych w nowszych palmtopach. Oba kompilatory funkcjonują także jako konsolidator (ang. linker) łącznie z procesem kompilacji, lub dwukrokowo.

Po wykonaniu konsolidacji skompilowanego kodu, powstaje zbitka danych, którą następnie należy podzielić na wymagane przez system Palm OS elementy składowe. Służy do tego program „m68k-palmos-obj-res”, który w ten sposób przygotowuje podstawowe zasoby aplikacji: kod programu, kod inicjalizacyjny, parametry uruchamiania (deklarujące np. ilość wymaganej pamięci operacyjnej), wartości stałych oraz początkowe wartości zmiennych globalnych. By zakończyć etap przygotowywania zasobów, należy jeszcze skompilować dodatkowe zasoby graficzne, zawierające opis interfejsu użytkownika aplikacji. Wykorzystuje się w tym celu program „PilRC”, dla którego zasoby w wersji źródłowej przygotowuje się w jego autorskim języku. Zostanie on omówiony w podpunkcie „Dołączone zasoby”.

Ostatnim etapem powstawania aplikacji dla platformy Palm jest zebranie wszystkich utworzonych zasobów i zapisanie ich jako rekordy jednej bazy danych (lub kilku baz danych w przypadku aplikacji zlokalizowanych[109]). Zajmuje się tym program „build-prc” tworzący plik bazy danych systemu Palm OS. Jest to jednocześnie plik wykonywalny tego systemu. Każdy użytkownik może tak powstały plik aplikacji zainstalować na swoim komputerze kieszonkowym w procesie synchronizacji dokonanym przy użyciu aplikacji „HotSync”[110].

Rysunek 9 przedstawia graficznie wszystkie opisane w niniejszym podpunkcie narzędzia wchodzące w skład zestawu „GNU PRC-Tools”, zadania które one wykonują oraz pliki którymi się posługują i które generują. Jego złożoność obrazuje wielokrokowy proces, który automatyzowany jest przez narzędzie „make” lub środowisko programistyczne „Palm OS Developer Suite”. W praktyce więc uruchomienie go uzyskuje się poprzez naciśnięcie jednego przycisku, a czas jego wykonania to zwykle maksymalnie kilka sekund.

Schemat procesu powstawania aplikacji dla platformy Palm.

Rysunek 9 – Schemat procesu powstawania aplikacji dla platformy Palm.

Źródło: Opracowanie własne.

2.3. Testowanie oprogramowania

Etap testowania zajmuje około 45% czasu realizacji oprogramowania i jest najbardziej czasochłonnym etapem[111]. Sukces pierwszej kompilacji na pozór kompletnego oprogramowania niemal nigdy nie okazuje się ostateczny i należy dokonać jeszcze wielu przeróbek, nim proces tworzenia oprogramowania można uznać za ukończony. Z pomocą w doprowadzeniu aplikacji do zamierzonej funkcjonalności przychodzą programistom różne narzędzia: zarówno te wchodzące w skład zestawu „GNU PRC-Tools”, jak i dostarczone przez twórców platformy Palm.

Opisane w poprzednim podpunkcie programy składowe zestawu „PRC-Tools” to tylko niektóre z obszernej gamy narzędzi tego zestawu. Jednym z kolejnych jest program uruchomieniowy (ang. debugger[112]) „m68k-palmos-gdb”. Programy uruchomieniowe stanowią podstawowe narzędzie służące do nadzorowania przebiegu działania aplikacji. Zezwalają na umieszczenie w kodzie źródłowym aplikacji tzw. punktów wstrzymania (ang. breakpoints) służących do chwilowego zatrzymania wykonywania programu w określonym przez programistę momencie. Podczas takiego wstrzymania umożliwiają kontrolę stanu wszystkich zmiennych i rejestrów procesora oraz pozwalają kontynuować działanie w trybie pracy krokowej.

Środowisko „CodeWarrior Development Studio for Palm OS”[113] również posiada wbudowany debuger spełniający te same zadania, co „m68k-palmos-gdb” z pakietu „PRC-Tools” i środowiska „Palm OS Developer Suite”[114]. Aby skorzystać z funkcji diagnostycznych jednego z tych debugerów, konieczne jest wpierw uruchomienie aplikacji systemu Palm OS. Można to uczynić w dwójnasób: bezpośrednio na komputerze kieszonkowym lub na komputerze stacjonarnym z użyciem emulatora[115] platformy Palm. Urządzenie należy wprowadzić w tryb pracy krokowej, a następnie połączyć z procesem programu uruchomieniowego celem przekazania kontroli nad przetwarzaniem rozkazów.

Występują dwie wersje emulatorów platformy Palm wyprodukowane przez autorów tej platformy, firmę Palm:

Emulatory mają tę przewagę nad rzeczywistymi urządzeniami, iż umożliwiają przetestowanie oprogramowania w różnych konfiguracjach „sprzętowych”, imitując różne urządzenia bez potrzeby ich fizycznego posiadania. Dzięki nim nie trzeba też po każdej kompilacji wgrywać oprogramowania do palmtopa celem jego przetestowania, na czym programista mógłby tracić wiele cennego czasu. Zezwalają one także na korzystanie z bardzo praktycznej funkcji zwanej „Gremlins”, opisanej w dalszej części niniejszego podpunktu. Ponadto, posiadają zaawansowaną kontrolę stanu działającej aplikacji, dzięki czemu częściej mogą ostrzegać użytkownika o ewentualnych problemach lub zagrożeniach, jakie mogą wyniknąć w związku z zastosowanymi rozwiązaniami programistycznymi, lub które mogą zaistnieć na danym etapie przebiegu programu (np. niekontrolowany dostęp lub zapis do chronionych obszarów pamięci).

Pomimo charakteryzowania się doskonałymi zdolnościami symulacji funkcjonowania samego systemu operacyjnego, emulatory posiadają kilka wad względem rzeczywistych urządzeń. Przykładowo, ani „Palm OS Emulator”, ani „Palm OS Simulator” nie symuluje wbudowanych w palmtopy portów podczerwieni oraz nie do końca precyzyjnie odwzorowuje komunikację portów szeregowych. Dodatkowo, „Palm OS Simulator” jako narzędzie symulujące urządzenia znacznie bardziej zaawansowane technologicznie, nie w pełni obsługuje symulację następujących modułów sprzętowych:

W wymienionych powyżej przypadkach, celem testowania aplikacji bezpośrednio oprogramowujących dane moduły, konieczne jest skorzystanie z rzeczywistych urządzeń. Co więcej, ponieważ „Palm OS Simulator” nie symuluje procesorów „ARM”, aplikacje posiadające dla nich kod, muszą go mieć dodatkowo skompilowanego dla docelowej platformy symulatora. W przeciwnym wypadku działanie tego kodu na symulatorze nie jest możliwe.

Praktycznym zastosowaniem emulatorów jest skorzystanie z funkcji „Gremlins”. Gremlin jest to funkcja emulatora pozwalająca na automatyczne, pseudolosowe naciskanie przycisków i innych elementów interfejsu aplikacji, w sposób możliwy do odtworzenia[118]. Jest to technika testowania oprogramowania, która w kontrolowanym środowisku niejako symuluje zachowanie ogółu użytkowników, dzięki zastosowaniu ogromnej ilości kombinacji wywoływania wszystkich poleceń aplikacji. Może ona ujawnić wiele ukrytych lub niespodziewanych błędów programistycznych jeszcze przed oddaniem aplikacji do testów. Wszelkie poczynania tej funkcji są na bieżąco dokumentowane w specjalnym pliku dziennika (ang. log), dzięki czemu ewentualne zachowanie, które doprowadziło do błędu można łatwo zanalizować, a po modyfikacji kodu – wykonać ponownie celem weryfikacji skuteczności wprowadzonych poprawek.

Na koniec, należy zwrócić uwagę na specjalne funkcje służące do warunkowego uruchamiania aplikacji, udostępniane przez interfejs programowania aplikacji (API) systemu Palm OS. Zawarte są one w menedżerze błędów (ang. Error Manager). Zezwalają one na tworzenie obsługi wyjątków na zasadzie typowej konstrukcji „try-catch”[119] znanej z języków programowania wyższych poziomów. Są wśród nich także funkcje wyświetlające informacje o błędach wynikłych podczas działania aplikacji. Wywołania tych funkcji kompilowane są warunkowo, co oznacza, że stają się częścią kodu wynikowego tylko wtedy, gdy ustawione są specjalne stałe. Podczas tworzenia aplikacji służą one pomocą przy testowaniu oprogramowania, natomiast po zakończeniu tego procesu można w prosty sposób z nich zrezygnować, zyskując mniejszy i szybciej działający kod aplikacji[120].

Rozdział III
Tworzenie aplikacji systemu Palm OS

1. Elementy składowe aplikacji

1.1. Podstawowy kod źródłowy

Aplikacje systemu operacyjnego Palm OS z reguły posiadają graficzny interfejs użytkownika, a przebieg ich działania sterowany jest zdarzeniowo. Oznacza to, że kod programu opiera się na konstrukcjach implementujących różne reakcje uzależnione od zaistniałych w systemie zdarzeń. Kod typowej aplikacji jest odpowiedzialny przede wszystkim za obsługę zdarzeń generowanych przez użytkownika: uruchomienie aplikacji, naciskanie przycisków sprzętowych i ekranowych, wywoływanie komend menu, czy ostatecznie zakończenie działania aplikacji.

Ogólny schemat przebiegu działania aplikacji.

Rysunek 10 – Ogólny schemat przebiegu działania aplikacji.

Źródło: Opracowanie własne.

Obsługa zdarzeń uruchomienia i zakończenia pracy aplikacji odbywa się w odrębnych, skrajnych względem siebie fragmentach kodu. Pomiędzy nimi znajduje się tzw. pętla obsługi zdarzeń (ang. event loop). Jest ona odpowiedzialna za przetwarzanie zdarzeń od momentu, gdy aplikacja jest już całkiem zainicjalizowana, aż do chwili, gdy użytkownik zażąda jej wyłączenia. Opisane fragmenty kodu prezentuje Rysunek 10. Ponadto, obrazuje on przebieg działania aplikacji definiując punkty, w których przekazywana jest jej kontrola, a następnie z powrotem przejmowana przez system operacyjny. Potwierdza to wyrażone w podpunkcie „Procesor i procesy” stwierdzenie, iż systemowa powłoka aplikacyjna interfejsu użytkownika uruchamia kod aplikacji jako swój podproces.

Punktem startowym każdej aplikacji dla platformy Palm jest funkcja PilotMain[121] stanowiąca odpowiednik funkcji main w kodzie źródłowym typowej aplikacji napisanej w języku C. To właśnie tej funkcji system operacyjny przekazuje kontrolę przy uruchamianiu aplikacji. Zawiera ona wspomniane wywołania funkcji inicjalizującej program, funkcji zawierającej pętlę obsługi zdarzeń oraz funkcji kończącej działanie programu. Na zakończenie następuje powrót z tej funkcji do systemu operacyjnego.

Opisany powyżej schemat ma zastosowanie podczas typowego uruchomienia aplikacji przez użytkownika np. poprzez użycie jego ikony w programie Applications Launcher[122]. Istnieją jednak inne zdarzenia, wskutek których system wywołuje funkcję PilotMain. Parametr cmd zawiera tzw. kod uruchomieniowy (ang. launch code) mówiący o charakterze bieżącego wywołania. Do najczęściej występujących kodów uruchomieniowych można zaliczyć[123]:

W Załączniku 1 do niniejszej pracy znajduje się szkielet kodu źródłowego typowej aplikacji platformy Palm. Ostatnią funkcją, jaką on zawiera jest właśnie funkcja PilotMain (wiersz 78) wraz ze wszystkimi wspomnianymi tutaj elementami, w tym z obsługą kodu uruchomieniowego sysAppLaunchCmdNormalLaunch. Jest to jedyny kod, który powinien zostać obsłużony przez każdą aplikację (pozostałe mogą być opcjonalnie obsługiwane w miarę potrzeb danej aplikacji). Po uruchomieniu aplikacji z tym kodem, następuje wywołanie funkcji AppStart, a w przypadku jej powodzenia – kolejno funkcji: EventLoop i AppStop.

Funkcja AppStart (wiersz 61) w pierwszej kolejności sprawdza czy program został uruchomiony na odpowiednio wysokiej wersji systemu operacyjnego. W załączonym przykładzie w celu demonstracyjnym sprawdzana jest obecność wersji co najmniej 3.5, choć faktycznie szkielet ten jest na tyle prosty, że działałby z każdą wersją systemu. W przypadku współczesnych aplikacji zazwyczaj rzeczywiście istnieje potrzeba zwiększenia limitu minimalnej wersji ze względu na wykorzystanie funkcji systemowych niedostępnych w starszych wersjach. W przypadku niespełnienia wymagań co do wersji systemu, funkcja AppStart wyświetla informację o błędzie i zwraca wartość false powodującą zakończenie aplikacji bez wyświetlania właściwego interfejsu użytkownika. Natomiast jeśli wszystko przebiega zgodnie z oczekiwaniami, funkcja ta zleca wyświetlenie głównej formatki (poprzez wywołanie funkcji FrmGotoForm) i zwraca wartość true.

Należy w tym miejscu dodać, że treść komunikatu o braku wymaganej wersji systemu operacyjnego pochodzi z zasobów aplikacji. Kod źródłowy zasobów omawianego szkieletu znajduje się w Załączniku 2 do niniejszej pracy. Zdefiniowany jest tam m.in. zasób ALERT ID 1000 (wiersz 21) definiujący okienko dialogowe zawierające wspomniany komunikat.

Jeśli zgodnie z oczekiwaniami funkcja AppStart poprawnie wykona swoje czynności inicjalizujące aplikację, powinna zwrócić wartość true. Wywołana zostaje wówczas funkcja EventLoop (wiersz 49). Całość tej funkcji stanowi pętla typu „do-while”, w której następuje kolejno:

Warunkiem zakończenia przetwarzania pętli jest otrzymanie zdarzenia appStopEvent, które może się pojawić po tym jak użytkownik zażąda zakończenia pracy w danej aplikacji. Następuje wówczas opuszczenie funkcji EventLoop i powrót do funkcji PilotMain, która na koniec wywołuje funkcję AppStop. Ta ostatnia zawiera jedynie kod wymazujący z ekranu i z pamięci wszystkie aktywne formatki. W rozbudowanych aplikacjach może ona zwalniać inną zaalokowaną pamięć lub wykonywać dowolne czynności porządkowe. Opisaną procedurę przedstawia schemat zawarty na poniższym rysunku:

Schemat blokowy pętli zdarzeń typowej aplikacji.

Rysunek 11 – Schemat blokowy pętli zdarzeń typowej aplikacji.

Źródło: Opracowanie własne na podstawie [Palm OS Programmer's Companion, tom I, r. 3].

Właściwa obsługa zdarzeń w wykonaniu kodu aplikacji ma miejsce w funkcjach AppHandleEvent oraz Form1000HandleEvent. W tej pierwszej obsługiwane są zdarzenia wspólne dla wszystkich formatek aplikacji (choć przykładowy szkielet aplikacji ma tylko jedną formatkę), a ta druga obsługuje zdarzenia tylko wtedy, gdy aktywną formatką jest konkretnie formatka główna (o identyfikatorze 1000).

Funkcja AppHandleEvent (wiersz 35) obsługuje jedynie zdarzenie frmLoadEvent, które następuje zwykle po wywołaniu funkcji FrmGotoForm (które w przykładowym kodzie miało miejsce w funkcji AppStart). W reakcji na to zdarzenie aplikacja inicjalizuje daną formatkę (wywołując funkcję FrmInitForm) i ustawia ją jako formatkę aktywną (FrmSetActiveForm), czyli taką, która przejmuje wszelkie operacje wejścia i wyjścia. Na koniec, przy użyciu funkcji FrmSetEventHandler, następuje przypisanie funkcji obsługującej zdarzenia danej formatki. Ponieważ przykładowy szkielet ma tylko jedną formatkę, występuje jedno takie przypisanie: formatce o identyfikatorze 1000 przydziela się funkcję obsługi Form1000HandleEvent. Od tego momentu będzie ona wywoływana każdorazowo, przez funkcję FrmDispatchEvent zastosowaną w pętli głównej.

Przykładowa formatka oraz jej wygląd po wywołaniu menu.

Rysunek 12 – Przykładowa formatka oraz jej wygląd po wywołaniu menu.

Źródło: Opracowanie własne.

Funkcja Form1000HandleEvent (wiersz 3) niejako ożywia formatkę główną omawianego szkieletu aplikacji. Bez niej, znajdujące się na formatce kontrolki oraz polecenia menu (przedstawione na powyższych zrzutach ekranowych – Rysunek 12) nie wykonywałyby żadnych zadań. To właśnie w funkcji Form1000HandleEvent te działania są oprogramowane. Jej trzonem jest instrukcja wyboru „switch”, w której obsługiwane są następujące zdarzenia:

W opisany powyżej sposób można napisać niemal każdą aplikację systemu Palm OS. Można oprogramować niemal każdy problem i każde rozwiązanie. Wystarczy jedynie rozbudować przedstawiony szkielet, co zostanie zaprezentowane w następnym punkcie niniejszej pracy („Praktyka tworzenia aplikacji”). Konstrukcja aplikacji oparta na zdarzeniach zapewnia, że system odpowiednio zareaguje na wszystkie działania użytkownika, a w razie potrzeby odda kontrolę kodowi aplikacji (np. celem wykonania zadania wywoływanego przez naciśnięcie danego przycisku ekranowego). Ponadto, funkcja EvtGetEvent oczekując na zdarzenie, wprowadza palmtopa w tzw. tryb drzemki (ang. doze mode), wstrzymując pracę procesora i tym samym oszczędzając energię akumulatora. Można by wyliczać znacznie więcej zalet tego rozwiązania.

1.2. Dołączone zasoby

Jak sygnalizowano kilkakrotnie w niniejszej pracy[124], każda aplikacja platformy Palm zapisana jest jako baza danych, której rekordy stanowią zasoby aplikacji. Część z nich tworzona jest automatycznie przez narzędzia kompilująco-konsolidujące, tak jak opisano w podpunkcie „Funkcjonowanie kompilatorów i konsolidatorów”. W szczególności, jednym z takich zasobów jest kod maszynowy aplikacji. Wszelkie pozostałe zasoby – w tym przede wszystkim te definiujące wygląd interfejsu aplikacji – programista musi stworzyć własnoręcznie.

Programiści tworzący aplikacje dla platformy Palm przy użyciu zestawu narzędzi „GNU PRC-Tools”[125] mają do dyspozycji towarzyszący im program „PilRC”. Służy on do kompilowania kodu źródłowego zasobów w ich binarną formę. W tej postaci zasoby są zrozumiałe dla systemu operacyjnego i można je zapisać w rekordach bazy danych aplikacji. Zasoby interfejsu użytkownika można podzielić na dwie grupy:

Podstawowymi zasobami wykorzystywanymi przez interfejs systemu operacyjnego są ikony reprezentujące aplikację. Każda aplikacja systemu Palm OS powinna posiadać dwie ikony różniące się wymiarami. Zawsze jedna z nich wyświetlana jest w aplikacji Applications Launcher[126] (w zależności od preferencji użytkownika). Pojedynczy zasób może zawierać kilka ikon o jednakowych wymiarach różniących się głębią barw. Zaleca się stworzenie przynajmniej dwóch wersji każdej ikony: czarno-białej (1-bitowa głębia barw) i kolorowej (8-bitowa głębia barw). Dostępne są również wszystkie inne głębie barw obsługiwane przez system (2-bitowa, 4-bitowa i 16-bitowa), jednak ich obecność w zasobie ikony nie jest wymagana – w razie konieczności używana jest ikona o mniejszej, możliwie najwyższej głębi. Ponadto, system Palm OS 5 akceptuje ikony o podwójnej rozdzielczości (gdyż urządzenia, na których funkcjonuje posiadają ekrany o zwielokrotnionej rozdzielczości obrazu[127]). W przypadku aplikacji powstających dla tej wersji systemu zaleca się więc stworzenie kolejnych wersji ikon.

W dołączonym do niniejszej pracy Załączniku 2, źródło zasobów ikon aplikacji zdefiniowane jest jako ICON ID 1000 (wiersz 29) oraz SMALLICON ID 1001 (wiersz 35). Definicje te odnoszą się do plików graficznych (zapisanych w standardowym formacie BMP), które podczas kompilacji zasobów programem „PilRC” muszą znaleźć się w tym samym katalogu, co kod źródłowy.

Każdy program przeznaczony dla platformy Palm powinien mieć zdefiniowany numer wersji. Informacja taka przechowywana jest w pojedynczym zasobie tekstowym o nazwie VERSION (wiersz 42). Wykorzystywana jest ona przede wszystkim przez system operacyjny podczas wyświetlania zbiorczego okienka z właściwościami wszystkich zainstalowanych programów użytkownika. Okienko to dostępne jest po użyciu odpowiedniej opcji w aplikacji Applications Launcher i oprócz numeru wersji podaje ilość pamięci zajmowanej przez dany program oraz liczbę rekordów zawierających dane użytkownika przynależące do tego programu.

Oprócz wspomnianych zasobów (ikon i numeru wersji), aplikacje opcjonalnie mogą posiadać także inne zasoby wykorzystywane przez system operacyjny. Są to:

Podstawowymi zasobami wykorzystywanymi przez aplikacje podczas ich działania są formatki. To właśnie je widzi użytkownik przez większość czasu pracy z aplikacją i przemieszcza się pomiędzy nimi przy pomocy znajdujących się na nich elementów – kontrolek ekranowych. Typowa formatka posiada swój pasek tytułowy, który powinien zawierać zwięzły opis zawartej funkcjonalności. Natomiast w przypadku głównej formatki, zawiera on zwykle nazwę aplikacji. Definicja takiej formatki została zobrazowana przy pomocy kodu w Załączniku 2, w wierszach 2-8. Wspomniana formatka zawiera trzy zwykłe przyciski: BUTTON ID 1000, BUTTON ID 1001 oraz BUTTON ID 1002. Po ich naciśnięciu system generuje zdarzenie ctlSelectEvent, które wskutek działania kodu aplikacji jest obsługiwane w funkcji Form1000HandleEvent (Załącznik 1, wiersz 3) w wierszach kolejno: 11, 14 i 17. Następuje wówczas wykonanie znajdującego się tam kodu.

Oprócz przedstawionych powyżej zwykłych przycisków, na formatce mogą znajdować się także liczne inne elementy (kontrolki):

Wszystkie wspomniane elementy generują rozmaite zdarzenia, które w bardzo wygodny i fleksybilny sposób można obsługiwać w kodzie aplikacji. Ponadto, poszczególne kontrolki można programistycznie ukrywać (i z powrotem wyświetlać), dezaktywować (i ponownie aktywować), przemieszczać, czy zmieniać ich wymiary. Wygląd kontrolek przedstawiono na poniższym zrzucie ekranowym (Rysunek 13). Pochodzi on z aplikacji „Butterfly” (polskiej firmy RNS::) służącej do zmiany koloru poszczególnych grup kontrolek w całym systemie Palm OS (dla wszystkich aplikacji):

Przykładowe kontrolki interfejsu systemu Palm OS.

Rysunek 13 – Przykładowe kontrolki interfejsu systemu Palm OS.

Źródło: Opracowanie własne (zrzut ekranowy aplikacji RNS:: Butterfly).

Większości zasobów formatek towarzyszą odpowiadające im zasoby menu. Po przypisaniu danego menu do formatki, jest ono automatycznie wyświetlane przez system po tym, jak użytkownik naciśnie na pasku tytułu tejże formatki. Przykładowe menu zostało zdefiniowane w wierszach 11-18 Załącznika 2. Zawiera ono jedną grupę (PULLDOWN) zawierającą dwa polecenia: MENUITEM ID 1000 oraz MENUITEM ID 1001. Po ich naciśnięciu system generuje zdarzenie menuEvent, które obsługiwane jest w wierszach kolejno: 24 i 27, w funkcji Form1000HandleEvent (Załącznik 1).

Ostatnim ze stosowanych w niemal każdej aplikacji elementów interfejsu użytkownika systemu Palm OS jest okienko komunikatu (ang. message box). Służy ono do wyświetlania zdefiniowanego w zasobach tekstu, posiada także swój pasek tytułowy oraz przyciski. Pozwala ono poinformować użytkownika o jakimś zdarzeniu, lub poprosić go o potwierdzenie wykonania jakiegoś zadania. Przykładowe okienko komunikatu zostało omówione w poprzednim podpunkcie w kontekście informowania użytkownika o niewystarczającej wersji systemu do uruchomienia opisywanego tam szkieletu aplikacji.

Ponadto, wśród zasobów aplikacji mogą znaleźć się również zasoby dźwiękowe. Starsze wersje systemu potrafiły odtwarzać tylko dźwięk zapisany w formacie MIDI, ale wraz z rozwojem platformy, zaczęto implementować kolejne dekodery, m.in. formatu WAV oraz MP3. Zasoby mogą też zawierać dłuższe teksty wykorzystywane w różnych miejscach aplikacji, np. w okienkach pomocy podręcznej. Występują również zasoby zawierające listę elementów tekstowych, np. aplikacje operujące nazwami krajów świata mogą mieć w ten sposób zdefiniowane ich nazwy.

1.3. Elementy towarzyszące

Aplikacja przygotowana do dystrybucji powinna posiadać szereg towarzyszących jej elementów. Głównym takim elementem z punktu widzenia użytkownika jest instrukcja obsługi. Powinna ona być zawsze dostarczana wraz z plikiem wykonywalnym aplikacji, a ponadto dostępna na stronie internetowej producenta, gdzie w łatwy sposób może on dokonać jej korekty lub aktualizacji. Sama zaś instrukcja powinna w wyczerpujący sposób opisywać obsługę każdej funkcji programu. Powinna zawierać przykłady opisujące krok po kroku czynności, jakie musi wykonać użytkownik aby uzyskać dany efekt, a całość powinna być zobrazowana odpowiednimi ilustracjami (zrzutami ekranowymi, schematami). Instrukcję należy napisać takim językiem, którego zrozumienie nie wymaga fachowej wiedzy informatycznej. Ponadto, w przypadku aplikacji specjalistycznych, język ten powinien być zgodny z ogólnie przyjętą nomenklaturą stosowaną w danej dziedzinie. Wobec tego instrukcja powinna powstawać przy współpracy programisty z tym samym fachowcem, który wcześniej konstruował projekt aplikacji[128] i nadzorował proces jej powstawania.

Oprócz napisania instrukcji obsługi, praktyką często stosowaną głównie przez autorów oprogramowania klasy shareware[129] jest dołączanie do aplikacji pojedynczego pliku pomocy (zwyczajową nazwą takiego pliku jest „readme.txt”). Zawiera on podstawowe informacje o produkcie, określa sposób instalacji oprogramowania, a także zaznajamia z jego możliwościami. Zawiera dane kontaktowe autora oprogramowania i osoby odpowiedzialnej za wsparcie techniczne. Obecność takiego pliku jest wskazana celem szybkiego udzielenia użytkownikowi podstawowych wskazówek dotyczących aplikacji, jednak nie zwalnia producenta z obowiązku dostarczenia instrukcji właściwej. Aplikacjom często towarzyszy też pojedynczy plik tekstowy zawierający licencję użytkownika (ang. end-user license agreement, w skrócie: EULA), opisujący zasady dystrybucji, często kopiujący treść typowych umów licencyjnych[130].

Interfejs użytkownika platformy Palm oferuje autorom oprogramowania jeszcze jedną metodę udzielania instrukcji użytkownikowi. Mianowicie pozwala w prosty sposób skonstruować pomoc kontekstową aplikacji, czyli niejako instrukcję obsługi poszczególnych jej elementów wbudowaną w samą aplikację. Znajdujący się u góry każdego okienka dialogowego pasek tytułowy może w swoim prawym rogu zawierać ikonę, po naciśnięciu której wyświetlany jest opis danego okienka. W opisie tym może znaleźć się ogólna informacja o przeznaczeniu okienka, jak i szczegółowe instrukcje dotyczące zawartych w nim kontrolek. Z punktu widzenia twórcy aplikacji, dodanie takiego opisu do okienka polega na stworzeniu zasobu tekstowego i przypisaniu w kodzie źródłowym danej formatki jego numeru identyfikacyjnego („ID”).

Jeżeli program tworzony jest na zamówienie, celem przeniesienia do niego praw, kolejnym niezbędnym elementem jest dokumentacja projektowa. Wraz z instrukcją użytkownika i komentarzami zawartymi w kodzie źródłowym, służy ona osobom, które będą w przyszłości modyfikować lub aktualizować aplikację. Taką osobą w szczególności może być sam autor oprogramowania, który po pewnym czasie niekoniecznie wciąż musi pamiętać wszystkie zamierzenia projektowe, czy wręcz zasadność własnych rozwiązań programistycznych. Dokumentacja projektowa powinna powstać z należytą pieczołowitością (nie mniejszą niż instrukcja użytkownika) i przede wszystkim powinna opisywać te kwestie merytoryczne i techniczne związane z aplikacją, które nie muszą być zawarte w instrukcji użytkownika.

Zarówno instrukcja użytkownika, jak i dokumentacja projektowa powinny zawierać odpowiednie dane kontaktowe osób odpowiedzialnych za powstanie oprogramowania, jak i osób udzielających wsparcia technicznego. Zapewnienie wsparcia technicznego jest bowiem nieodzownym następstwem sprzedaży praw do aplikacji lub praw do jej użytkowania. Stanowi niewątpliwie bardzo ważny element towarzyszący aplikacjom komercyjnym. Autor, który może pochwalić się dobrym wsparciem dla swoich klientów, może liczyć na ich przychylność, lojalność i dalszą współpracę. Profesjonalne wsparcie techniczne jest dla firm produkujących oprogramowanie kwestią świadczącą o prestiżu, na równi ze skutkami podejmowanych zabiegów marketingowych oraz działań z zakresu public relations. Wielu producentów oprogramowania posiada rozbudowane systemy wsparcia technicznego.

Specyficzną dla platformy Palm czynnością towarzyszącą powstawaniu każdej aplikacji jest konieczność jej rejestracji w centralnej bazie na stronie internetowej firmy Palm. Każdy zarejestrowany autor oprogramowania ma możliwość wglądu i dodania własnych wpisów do tej bazy. Aplikacje w systemie Palm OS jednoznacznie identyfikowane są przy pomocy tzw. identyfikatora twórcy (ang. creator ID). To właśnie ten identyfikator należy zarejestrować, podając jednocześnie nazwę aplikacji, jej przeznaczenie, numer wersji i datę wydania. Musi on mieć unikalną wartość, co zapobiega konfliktom poszczególnych aplikacji użytkownika zainstalowanych w systemie. Wszystkie bazy danych przynależące do danej aplikacji, bądź przez nią tworzone, odznaczają się wspólną wartością identyfikatora twórcy. Technicznie jest on 4-bajtowym ciągiem znaków (przechowywanym jako pojedyncza wartość 32-bitowa), w tym liter alfabetu łacińskiego, których wielkość ma znaczenie. Identyfikatory składające się z samych małych liter zarezerwowane są dla oprogramowania stworzonego przez firmę Palm[131]. Indywidualnym twórcom aplikacji dla platformy Palm pozostaje wykorzystanie kombinacji zawierających co najmniej jeden znak nie będący małą literą alfabetu łacińskiego.

Powyżej opisano elementy, które bezwarunkowo powinny towarzyszyć każdej aplikacji. Oprócz nich, w indywidualnych przypadkach (w zależności od potrzeb) można do aplikacji dołączać dodatkowe elementy. W szczególności, aplikacje korzystające z dużej ilości danych źródłowych (np. zawierających bazę klientów lub produktów) powinny przechowywać je oddzielnie od bazy danych zawierającej kod wykonywalny. Można w tym celu dołączyć do aplikacji dodatkowe bazy danych. Jeśli mają one zawierać proste dane tekstowe, graficzne lub dźwiękowe, wówczas można je tworzyć tak samo jak zasoby głównej bazy danych aplikacji, czyli np. za pomocą programu „PilRC”[132]. W przypadku bardziej skomplikowanych struktur, istnieje konieczność programowego generowania baz danych. Można w tym celu stworzyć własne oprogramowanie funkcjonujące na dowolnej platformie sprzętowo-systemowej, opierając się na opublikowanej przez firmę Palm specyfikacji formatu plików przechowujących bazy danych systemu Palm OS.

2. Praktyka tworzenia aplikacji

2.1. Założenia aplikacji

W punkcie tym zostanie zaprezentowany sposób tworzenia przykładowej aplikacji dla systemu operacyjnego Palm OS. Zgodnie z deklaracjami znajdującymi się we Wstępie, będzie to specjalistyczna aplikacja przydatna przede wszystkim inwestorom. Służyć będzie obliczaniu wartości wewnętrznej stopy zwrotu – zwanej w skrócie IRR (od angielskiego internal rate of return).

„Nowe zjawiska zachodzące we współczesnym świecie, określane w naukowej i fachowej literaturze ekonomicznej takimi terminami jak społeczeństwo informacyjne, nowa gospodarka, gospodarka informacyjna, gospodarka elektroniczna, czy nawet gospodarka cyfrowa, wskazują na jakościowo nową rolę, jaką informacja, procesy i systemy informacyjne zajmują w gospodarce.”[133] Stwierdzenie to uzasadnia potrzebę tworzenia oprogramowania użytkowego, mającego na celu agregację informacji jednostkowych poprzez ich transformację algorytmiczną[134]. Podkreśla także wysoką i wciąż rosnącą wagę oraz znaczenie takiego oprogramowania w dzisiejszym świecie biznesu, ekonomii i gospodarki. Niewątpliwie, specjalistyczna aplikacja obliczająca wartość IRR należy do grupy oprogramowania udzielającego użytkownikowi właśnie takich informacji.

Wewnętrzna stopa zwrotu (IRR), jest to taka stopa dyskontowa, która zrównuje zdyskontowany strumień dochodów pieniężnych z wartością nakładów inwestycyjnych[135]:

NCF0 × a0 + NCF1 × a1 + … + NCFn × an = 0 [3.1]

gdzie:

NCFn - przepływy pieniężne netto w kolejnych okresach,

an - poziom współczynnika dyskontowego w kolejnych okresach.

Innymi słowy, wewnętrzna stopa zwrotu (IRR) określa tempo, w którym pomnaża się wartość kapitału zaangażowanego w przedsięwzięcie[136].

Rozwijając myśl zawartą w powyższych definicjach, można stwierdzić, iż wartość IRR jednoznacznie określa czy przy spodziewanych nakładach i przypływach dana inwestycja będzie opłacalna, a jeśli tak – to po jakim czasie. Dane służące do obliczenia tej wartości najczęściej pochodzą z prognoz i ocen[137], które inwestor musi poznać w pierwszym kroku przed podjęciem decyzji o przedsięwzięciu. W skład tych danych wchodzą sumy spodziewanych nakładów i przypływów z kolejnych okresów. Poznanie wartości IRR natomiast jest często pierwszym sygnałem dla inwestora, wskazującym na to czy powinien ostatecznie podjąć dane przedsięwzięcie, czy też nie.

Uzyskawszy dodatnią wartość IRR, można wstępnie uznać, iż w chwili zakończenia rozważanego okresu, dana inwestycja będzie opłacalna (czyli że zwrócą się jej zaktualizowane początkowe nakłady). Im większa wartość, tym większe zyski płynące z inwestycji i tym większe tempo pomnażania zainwestowanego kapitału. Z drugiej zaś strony, uzyskanie wartości ujemnej przemawia za brakiem rentowności przedsięwzięcia i postuluje o niepodejmowanie go przy ustalonych założeniach.

Równie często inwestor staje przed wyborem jednego z wielu zaoferowanych mu wariantów inwestycyjnych. Także w tym przypadku obliczenie wartości IRR dla poszczególnych wariantów umożliwia wstępny wybór tego, który wyróżnia się najwyższym tempem pomnażania kapitału. Różnice uzyskanych wartości zwykle okazują się statystycznie wystarczające do natychmiastowego, ostatecznego odrzucenia najmniej rentownych wariantów, pozostawiając do dalszej, dogłębnej analizy tylko część z nich. To w konsekwencji bezpośrednio przyczynia się do przyśpieszenia procesu decyzyjnego.

Jeszcze jednym zastosowaniem znajomości wewnętrznej stopy zwrotu jest analiza ryzyka inwestycyjnego. Polega ona na porównaniu uzyskanej oceny IRR z kosztem pozyskania kapitału. Im większa jest wartość IRR względem kosztu pozyskania kapitału, tym mniejsze ryzyko związane z przedsięwzięciem inwestycyjnym. Jeżeli zaś wartość ta jest ujemna lub bardzo mała, to nie należy podejmować danego projektu ze względu na straty, jakie prawdopodobnie on przyniesie.

Aplikacja służąca do obliczania wartości wewnętrznej stopy zwrotu powinna być napisana tak, by umożliwić jej zastosowanie we wszystkich przedstawionych powyżej trzech przypadkach. A zatem powinna służyć do oceny rentowności przedsięwzięcia, wyboru wariantu projektu oraz analizy ryzyka inwestycyjnego. W następnym podpunkcie znajduje się opis projektu takiej właśnie aplikacji.

2.2. Projekt aplikacji

Projektując aplikację obliczającą wartość IRR należy sprostać zadaniom wyrażonym w założeniach opisanych w poprzednim podpunkcie, a także uwzględnić specyfikę platformy Palm opisaną w Rozdziale I. W tym celu należy wziąć pod uwagę szereg aspektów, które umożliwią właściwe zaprojektowanie i stworzenie zasobów programu (podpunkt 2.3) oraz kodu źródłowego (podpunkt 2.4).

Główną przesłanką towarzyszącą powstawaniu programu będzie jedna z podstawowych wytycznych twórców systemu Palm OS mówiąca o tym, iż każdy program powinien być niewielki i musi spełniać konkretne, ściśle określone zadanie[138]. W opisywanym przykładzie, takim zadaniem jest niewątpliwie obliczenie wartości wewnętrznej stopy zwrotu inwestycji. Program zatem będzie musiał w pierwszej kolejności umożliwiać użytkownikowi wprowadzenie danych niezbędnych do poczynienia obliczeń (opisanych szczegółowo w poprzednim podpunkcie). Po wprowadzeniu wszystkich informacji dotyczących inwestycji i naciśnięciu odpowiedniego przycisku rozpoczynającego obliczenia, użytkownik uzyska na wynik wyświetlony na ekranie.

Kolejnym zagadnieniem jest uwzględnienie trzech zastosowań aplikacji opisanych w poprzednim podpunkcie. Każde z nich wymaga bowiem umożliwienia użytkownikowi wykorzystania obliczonych wartości IRR w nieco odmienny sposób:

O ile w pierwszym przypadku można poprzestać na wyświetleniu wyniku obliczeń na ekranie, o tyle dwa pozostałe wymagają dalszego przetworzenia danych. Ponieważ w obu przypadkach przetworzenie to jest niezwykle proste (porównanie kilku liczb rzeczywistych), wydaje się, że zadanie to najlepiej jest pozostawić do wykonania użytkownikowi w najbardziej dogodny dla niego sposób. Dodanie takiej funkcjonalności do programu mogłoby go dodatkowo skomplikować, jednocześnie przynosząc niewiele korzyści. Kłóciłoby się to również z zasadą spełniania konkretnego zadania przez poszczególne aplikacje, a nie wykonywania szeregu funkcji.

Pozbawiając użytkownika możliwości automatycznego porównania uzyskanych wyników, należy w zamian zapewnić mu możliwość ich dalszego użycia w innych aplikacjach. Najbardziej praktycznym sposobem zrealizowania tego postulatu jest wykorzystanie schowka systemowego. Należy umożliwić skopiowanie wyniku do schowka w możliwie najprostszy, najszybszy i najbardziej poręczny sposób. Następnym krokiem użytkownika będzie przełączenie się na aplikację notatnika, wklejenie tam wyniku (np. w sąsiedztwie poprzednich wyników) i powrót do aplikacji obliczającej IRR celem wykonania kolejnych obliczeń[139].

Wszystkie opisane powyżej rozwiązania projektowe można przedstawić za pomocą jednego schematu blokowego:

Ogólny schemat blokowy aplikacji obliczającej wartość IRR.

Rysunek 14 – Ogólny schemat blokowy aplikacji obliczającej wartość IRR.

Źródło: Opracowanie własne.

Szczegółowy opis wszystkich elementów zawartych na powyższym ogólnym schemacie znajduje się w dwóch kolejnych podpunktach.

Ostatnim elementem należącym do zagadnień projektowych przy powstawaniu programu komputerowego jest takie jego zaplanowanie, by powstawał on pod kątem swojego odbiorcy docelowego oraz kanałów sprzedaży. Przykładowo, oprogramowanie klas shareware i commercial[140] może wymagać odpowiednich zabezpieczeń przed nielegalnym ich powielaniem lub dystrybucją. Dodatkowo, klasa shareware może wymagać utworzenia mechanizmu odblokowania funkcjonalności niedostępnej przed uiszczeniem za nie opłaty licencyjnej. Zagadnienia te zostaną szerzej opisane w podpunktach 3.2 i 3.3. W tym miejscu natomiast należy zasygnalizować, iż powstająca na potrzeby niniejszej pracy aplikacja będzie aplikacją klasy freeware ze względu na niekomercyjny charakter pracy. Nie będzie zatem koniecznym wprowadzanie w niej dodatkowych mechanizmów zabezpieczających.

2.3. Projektowanie i tworzenie zasobów

Podczas korzystania z aplikacji, użyteczność, efektywność i intuicyjność jej interfejsu użytkownika odgrywa wiodącą rolę. To właśnie od tej strony należy rozpoczynać faktyczne projektowanie aplikacji, celem uzyskania jej największej przydatności dla użytkownika. Dopiero w kolejnym kroku po zaprojektowaniu i utworzeniu zasobów interfejsu można przystąpić do ich „ożywiania” za pomocą kodu źródłowego. Ten drugi krok zostanie opisany w podpunkcie 2.4.

Załącznik 4 zawiera kod źródłowy zasobów aplikacji obliczającej wartość IRR, do którego liczne odniesienia znajdują się w dalszej części niniejszego podpunktu. Oparty jest on o szkielet zaprezentowany w Załączniku 2, a opisany szczegółowo w podpunkcie 1.2. W związku z tym, liczne kwestie nie będę tu poruszane ponownie, ustępując miejsca zagadnieniom ściśle związanym z projektem opisywanej aplikacji i charakterystycznym tylko dla niej.

Formatka główna aplikacji obliczającej wartość IRR.

Rysunek 15 – Formatka główna aplikacji obliczającej wartość IRR.

Źródło: Opracowanie własne.

Po uruchomieniu aplikacji, pierwszym obrazem jaki zobaczy użytkownik jest formatka główna (Rysunek 15), reprezentowana w kodzie źródłowym zasobów numerem identyfikacyjnym 1000 (FORM ID 1000). Definicje jej zasobów rozpoczynają się w wierszu 2 Załącznika 4. Formatka ta posiada kilka kontrolek ekranowych oraz menu. To ostatnie wyświetlane jest po naciśnięciu rysikiem paska tytułowego zawierającego nazwę aplikacji („IRRcalc”[141]). Wśród kontrolek ekranowych należy wyróżnić przede wszystkim pole służące do wprowadzenia wysokości wkładu początkowego oraz tabelę zawierającą przepływy pieniężne dla poszczególnych okresów. Oba te elementy służą do umożliwienia użytkownikowi wprowadzenia wszystkich danych wejściowych służących aplikacji do wykonania obliczeń. Samo wykonanie obliczeń następuje po naciśnięciu przycisku „Oblicz IRR”.

Pole tekstowe „Wkład początkowy” jest polem numerycznym pozwalającym wprowadzać wyłącznie liczby nieujemne. Z założenia bowiem wkład początkowy musi przybierać wartości dodatnie. Tabela „Przepływy pieniężne” nie jest tabelą w rozumieniu kontrolek interfejsu użytkownika systemu Palm OS[142]. Zamiast tego, w projekcie aplikacji postanowiono skorzystać z listy, której kolejne wiersze wyświetlają dane przynależne do poszczególnych okresów. Powodem takiego wyboru był fakt, że lista jest znacznie prostsza w oprogramowaniu niż tabela, a w tym konkretnym przypadku jest ona w pełni wystarczająca. Za nagłówek tabeli przepływów pieniężnych posłużyły trzy nieaktywne przyciski o prostokątnych rogach i etykietach kolejno: „okres”, „przychód” i „koszt”. Ze względu na spójność interfejsu użytkownika systemu Palm OS taki swobodny wybór kontrolek nie prowadzi do zachwiania jego czytelności.

Obecność pola tekstowego na formatce (w tym przypadku pola „Wkład początkowy”) wymaga od projektanta zasobów spełnienia dwóch dodatkowych postulatów[143]. Pierwszym z nich jest dodanie kontrolki wskaźnika stanu Graffiti (ang. Graffiti state indicator). Kontrolkę tą umieszcza się zwykle w prawym dolnym rogu formatki. Służy ona użytkownikowi do kontroli stanu, w jakim znajduje się mechanizm rozpoznawania pisma ludzkiego, Graffiti[144]. W przypadku zastosowanego w przykładowej aplikacji pola numerycznego, wskaźnik ten będzie zawsze wskazywał, iż wprowadzane będą cyfry, a zmiana tego stanu nie będzie możliwa.

Drugim postulatem implikowanym przez obecność pola tekstowego jest konieczność dodania grupy „Edycja” do menu aplikacji. Powinna ona zawierać typowe komendy edycyjne, np. „Wytnij”, „Kopiuj”, „Wklej”, „Zaznacz Wszystko”. System operacyjny ułatwia obsługę tych typowych poleceń – nie jest konieczna implementacja kodu je wykonującego, a wystarczy jedynie przypisać im odpowiednie identyfikatory rozpoznawane przez systemową obsługę zdarzeń (wiersz 90). Oprócz grupy „Edycja”, menu opisywanej formatki (MENU ID 1000, wiersz 88) posiada jeszcze jedną grupę – „Pomoc”. Zawiera ona dwa polecenia: „Wskazówki” – wyświetlające tekst zaznajamiający użytkownika z obsługą oprogramowania (pochodzący z zasobu STRING ID 1000 zdefiniowanego w wierszu 71), oraz „O Programie” – wyświetlające formatkę z informacjami o autorze aplikacji, numerze wersji, licencji i prawach autorskich (FORM ID 2000, wiersz 58).

Formatka „Przepływy Pieniężne”.

Rysunek 16 – Formatka „Przepływy Pieniężne”.

Źródło: Opracowanie własne.

Po wybraniu (rysikiem) elementu z listy „Przepływy pieniężne” następuje wyświetlenie formatki służącej użytkownikowi do modyfikacji wartości dotyczących danego okresu (Rysunek 16, źródło: FORM ID 1001, wiersz 23). Zawiera ona informację o wybranym okresie i posiada dwa edytowalne pola tekstowe: „Przychód” i „Koszt”. Pola te obowiązują podobne restrykcje, jak pole „Wkład początkowy” na formatce głównej – wprowadzane w nich wartości muszą być liczbami nieujemnymi. Także na tej formatce, ze względu na istnienie pól tekstowych, musi znaleźć się wskaźnik stanu Graffiti, a menu musi zawierać grupę „Edycja”. W tym przypadku ustanowienie właściwego menu jest znacznie prostsze, gdyż posiada ono tylko jedną, typową grupę. Nie trzeba tworzyć nowego zasobu menu, a wystarczy skorzystać z odpowiedniego zasobu dostarczanego przez system operacyjny (MENUID 10000).

Formatka „Przepływy Pieniężne”, jako okno dialogowe, ma możliwość skorzystania ze standardowej pomocy kontekstowej systemu Palm OS. Mechanizm ten wyświetla treść pomocy pobraną z indywidualnego zasobu tekstowego – w tym przypadku jest to zasób STRING ID 1001 (wiersz 78). Następuje to po naciśnięciu przycisku „i” znajdującego się w prawej części paska tytułowego. Ponadto, jako okno modalne, formatka ta posiada trzy przyciski, których naciśnięcie powoduje jej zamknięcie i wykonanie odpowiednich działań w zależności przycisku:

Formatka „Obliczono Wartość IRR”.

Rysunek 17 – Formatka „Obliczono Wartość IRR”.

Źródło: Opracowanie własne.

Po wprowadzeniu wartości do poszczególnych kontrolek formatki głównej, użytkownik powinien nacisnąć przycisk „Oblicz IRR”. Następują wówczas obliczenia wykorzystujące wprowadzone dane wejściowe[145]. Ostateczny wynik wyświetlany jest w nowej formatce zatytułowanej „Obliczono Wartość IRR” (Rysunek 17, źródło: FORM ID 1002, wiersz 44). Podobnie jak opisywana wcześniej formatka „Przepływy pieniężne”, jest to modalne okno dialogowe. Posiada więc standardową pomoc kontekstową systemu Palm OS (wykorzystuje zasób STRING ID 1002, wiersz 82), nie ma jednak przypisanego menu, ani nie wyświetla wskaźnika stanu Graffiti, jako że nie posiada żadnych edytowalnych pól tekstowych.

Oprócz wyniku, formatka „Obliczono Wartość IRR” wyświetla wzór równania zastosowany do wykonania obliczeń. Wyliczona w ten sposób wartość IRR kryje się we wzorze pod zmienną r i wraz z danymi wejściowymi spełnia opisywane równanie[146]. Grafika użyta do wyświetlenia wzoru znajduje się w osobnym zasobie BITMAP ID 4000 (wiersz 131), do którego w kodzie źródłowym zasobu formatki znajduje się jedynie odniesienie (FORMBITMAP, wiersz 49). Na dole formatki znajdują się dwa przyciski ją zamykające: „OK” i „Kopiuj do schowka”. Ten drugi dodatkowo kopiuje wynik do schowka, dzięki czemu istnieje możliwość wykorzystania go w innej aplikacji systemu Palm OS. Po naciśnięciu jednego z tych przycisków, użytkownik może powtórzyć całą opisaną w niniejszym podpunkcie procedurę obliczania wartości IRR ze zmodyfikowanymi lub nowymi danymi wejściowymi (np. dla konkurencyjnej inwestycji), lub opuścić aplikację.

2.4. Tworzenie kodu źródłowego

Omawiany w niniejszym podpunkcie kod źródłowy aplikacji obliczającej wartość IRR znajduje się w Załączniku 3. W jego skład wchodzą cztery podstawowe części:

Ostatnia spośród tych części oparta jest na typowym szkielecie aplikacji systemu Palm OS zaprezentowanym w podpunkcie 1.1 niniejszej pracy i stanowi jego bezpośrednie rozbudowanie. Żaden element szkieletu nie został usunięty, ani przebudowany. Uzupełniono jedynie funkcję inicjalizującą (AppStart, wiersz 426) i kończącą działanie programu (AppStop, wiersz 452) o możliwość zapisywania i odczytywania ustawień, a także funkcję Form1000HandleEvent (wiersz 339) o obsługę zdarzeń generowanych przez specyficzne dla tej aplikacji elementy interfejsu użytkownika.

Należy zwrócić uwagę na kilka funkcji systemowych, które pojawiły się w kodzie aplikacji wskutek rozbudowy szkieletu. Służące do odczytu i zapisu ustawień aplikacji funkcje to kolejno: PrefGetAppPreferences i PrefSetAppPreferences. Wywoływane są one w funkcjach AppStart i AppStop. Z założenia, należy je wykorzystywać przede wszystkim do zapamiętywania stanu aplikacji przy wyjściu, celem jego odtworzenia przy ponownym uruchomieniu[147]. To właśnie zadanie spełniają w omawianym programie. Zapisane w ten sposób dane przechowywane są w przeznaczonej do tego celu systemowej bazie danych wspólnej dla wszystkich aplikacji.

Nowością wśród kontrolek ekranowych formatki głównej jest pole tekstowe „Wkład początkowy” (FIELD ID 1000) oraz pole listy zatytułowane „Przepływy pieniężne” (LIST ID 1001). O ile to pierwsze pole obsługiwane jest w sposób standardowy, w pełni kontrolowany przez system, o tyle to drugie wymaga szerszego omówienia. Zastosowana jest w nim bowiem niestandardowa funkcja rysująca (Form1000MainListDrawF, wiersz 295), która sprawia, że poszczególne wiersze (elementy listy) wyglądem przypominają komórki tabeli. Standardowa funkcja rysująca pozwalałaby na wyświetlenie tylko pojedynczego ciągu znaków, a nie wartości stabelaryzowanych. Aplikacja zastępuje tę funkcję swoją własną przy pomocy polecenia LstSetDrawFunction (wiersz 321) wywoływanego podczas obsługi zdarzenia otwarcia formatki głównej (frmOpenEvent).

Oprócz opisanej powyżej podmiany funkcji rysującej elementy listy „Przepływy pieniężne”, na skutek zdarzenia frmOpenEvent, już po narysowaniu formatki (funkcją FrmDrawForm), następuje przypisanie wartości początkowej pola tekstowego „Wkład początkowy” (funkcją FldInsert, wiersz 330). W przypadku gdy taka wartość nie została odczytana z preferencji aplikacji (np. podczas pierwszego jej uruchomienia), następuje jedynie ustawienie skupienia (ang. focus) na tym polu. Ma to na celu wskazanie użytkownikowi, iż wymaga ono uzupełnienia.

Menu aplikacji zawiera tylko jedną grupę poleceń („Pomoc”) zawierającą obsługiwane przez aplikację polecenia[148]. Znajdują się tam dwa polecenia wyświetlające okna dialogowe, których działanie zostało opisane w poprzednim podpunkcie. Polecenie „Wskazówki” wykorzystuje funkcję podręcznej pomocy systemowej FrmHelp (wiersz 351), gdyż wyświetla jedynie prostą informację tekstową. Polecenie „O Programie” korzysta z serii poleceń: FrmInitForm, FrmDoDialog oraz FrmDeleteForm (wiersze 289-291) służących do wyświetlenia modalnego okna dialogowego, którego definicja stanowi standardową definicję formatki w kodzie źródłowym zasobów. Skorzystanie z funkcji FrmDoDialog sprawia, iż nie jest koniecznym tworzenie dodatkowej funkcji obsługującej zdarzenia tej formatki (analogicznej do funkcji Form1000HandleEvent dla formatki głównej) – w pełni zarządza ona zdarzeniami swojej formatki, a jej opuszczenie następuje dopiero po naciśnięciu dowolnego przycisku ekranowego znajdującego się na tej formatce.

Gdy użytkownik wybierze (naciśnie rysikiem) dowolny element listy „Przepływy pieniężne” (LIST ID 1001), wygenerowane zostaje zdarzenie lstSelectEvent. W reakcji na nie, i po upewnieniu się że dotyczy ono tego właśnie pola listy[149], aplikacja wywołuje swoją funkcję MainListItemPress (wiersz 197). Jej zadaniem jest wyświetlenie okienka dialogowego umożliwiającego użytkownikowi wprowadzenie danych dotyczących przepływów pieniężnych w wybranym okresie (zatytułowanego „Przepływy Pieniężne”)[150]. Obsługa zdarzeń tego okienka również zapewniana jest przez wcześniej opisaną systemową funkcję FrmDoDialog. Przed jej użyciem, ale już po wywołaniu funkcji FrmInitForm, następuje ustawienie początkowych wartości pól tekstowych znajdujących się na formatce tego okienka (wiersze 208-233). Wykorzystywane są w tym celu dwie funkcje: FldSetTextPtr dla pola nieedytowalnego, oraz FldSetTextHandle dla dwóch pól edytowalnych. Ponadto, inicjalizacja okienka obejmuje wyświetlenie przycisku „Usuń” (funkcja FrmShowObject, wiersz 235) w przypadku gdy edytowany okres nie jest okresem ostatnim[151]. Po zmodyfikowaniu danych w okienku „Przepływy Pieniężne”, użytkownik naciska jeden z dostępnych przycisków i następuje dalszy ciąg przetwarzania poleceń funkcji MainListItemPress. Użycie przycisku „OK” powoduje pobranie nowych wartości z okienka i przypisanie ich do tablicy wartości wyświetlanych w polu listy formatki głównej, zaś użycie przycisku „Usuń” powoduje usunięcie elementu z tablicy.

Należy w tym miejscu zaznaczyć, iż wspomniana tablica w praktyce składa się z dwóch dynamicznych tablic wskazywanych przez zmienne globalne: InflowsA i OutflowsA. Tablice te zawierają wartości przepływów pieniężnych dla kolejnych okresów, i to właśnie do nich odwołuje się funkcja Form1000MainListDrawF podczas odświeżania elementów pola „Przepływy pieniężne”. Ilość elementów w tych tablicach zapisana jest w zmiennej FlowCnt (od wartości tej zmiennej należy odjąć 1, gdyż wlicza ona również ostatni, zawsze pusty element pola „Przepływy pieniężne”). Wartość wkładu początkowego przechowywana jest w kolejnej zmiennej globalnej – InitialInvestment. Wartości wszystkich przytoczonych tu zmiennych (zdefiniowanych w wierszach 22-31) stanowią komplet danych źródłowych służących do obliczenia wartości IRR. Co więcej, to właśnie one zachowywane są między poszczególnymi uruchomieniami aplikacji dzięki opisanym wcześniej mechanizmom zawartym w funkcjach AppStop i AppStart.

Sam proces obliczania wartości IRR rozpoczyna się po tym jak użytkownik naciśnie przycisk „Oblicz IRR”. Wygenerowane wówczas zostaje zdarzenie ctlSelectEvent obsługiwane w funkcji CountIRRButtonPress (wiersz 158). Funkcja ta w pierwszej kolejności sprawdza poprawność danych wejściowych (wiersze 164-172), a w razie niespełnienia założeń wyświetla stosowne informacje przy pomocy systemowej funkcji FrmAlert. Jeśli dane są poprawne, w wierszu 175 następuje wywołanie funkcji CountIRR (opisanej poniżej), poprzedzone ukryciem przycisku „Oblicz IRR” i wyświetleniem w jego miejscu tekstu „Proszę czekać...”. Obliczona wartość numeryczna IRR zamieniana jest na wartość tekstową w funkcji DoubleToPercent (wiersz 183, definicja w wierszu 66), a następnie wyświetlana w modalnym okienku dialogowym zatytułowanym „Obliczono Wartość IRR”. Okienko to jest kolejnym okienkiem opisywanej aplikacji obsługiwanym przy pomocy funkcji systemowej FrmDoDialog. W przypadku naciśnięcia przycisku „Kopiuj do schowka”, znajdującego się na tym okienku, następuje skopiowanie obliczonej wartości do schowka systemowego przy użyciu funkcji ClipboardAddItem (wiersz 192).

Właściwe obliczenia wartości IRR odbywają się w funkcji CountIRR (wiersz 126). Jest to za razem pierwsza opisywana tu funkcja specjalistyczna, wykonująca zadania ściśle związane z meritum aplikacji. Wraz ze wszelkimi funkcjami, z których korzysta, napisana jest ona w „czystym” języku C, bez wykorzystania jakichkolwiek funkcji specyficznych dla platformy Palm. Jej trzonem jest pętla „do-while”, której kolejne kroki z coraz większą precyzją ustalają wartość wewnętrznej stopy zwrotu. Składa się ona z dwu kolejnych pętli „do-while” które przy ustalonej precyzji zbliżają się do poszukiwanej wartości z obu stron osi liczbowej. Zastosowanie dwóch pętli ma na celu utworzenie mechanizmu „widełek” niewrażliwego na problemy obliczeniowe, które w przeciwnym wypadku mogłyby wystąpić w przypadku gdyby dane źródłowe układały się ciąg rozbieżny.

Wewnątrz obu pętli wewnętrznych wywoływana jest funkcja CountNPV, obliczająca wartość NPV dla próbkowanych w danym kroku wartości IRR[152]. To właśnie ta wartość musi zbliżać się do zera celem uzyskania właściwego wyniku IRR. Po przekroczeniu zera w obu pętlach (podczas postępowania z obu stron osi liczbowej) lub po osiągnięciu ujemnego ekstremum funkcji NPV (dla wartości IRR równej –1) następuje ich opuszczenie i zamiana miejscami wartości w nich obliczanych (wiersze 144-146). Ostatecznie, zwiększana jest precyzja obliczeń (wiersz 147) i następuje kolejny krok pętli zewnętrznej. Procedura ta jest powtarzana do momentu uzyskania oczekiwanej precyzji obliczeń. Na koniec, następuje zwrócenie uśrednionej wartości obu obliczonych stóp zwrotu, pomnożonej przez 100 celem otrzymania wartości procentowej, gotowej do wyświetlenia w aplikacji.

Drugą (a za razem ostatnią) funkcją specjalistyczną opisywanej aplikacji, jest zasygnalizowana wcześniej funkcja CountNPV (wiersz 107). Realizuje ona obliczenia opisane następującym wzorem:

Wzór [3.2] [3.2]

gdzie:

t - bieżący okres eksploatacji inwestycji,

n - liczba okresów eksploatacji inwestycji,

CFt - przepływy pieniężne netto w bieżącym okresie,

r - poziom współczynnika dyskontowego w kolejnych okresach,

I0 - wkład początkowy.

Wzór ten stanowi przekształcenie wzoru [3.1] (podpunkt 2.1) poprzez użycie operatora sumowania w miejsce indywidualnych składników sumy, oraz poprzez wyodrębnienie wkładu początkowego (I0) stanowiącego we wzorze pierwotnym składnik sumy o indeksie 0. Kod źródłowy funkcji CountNPV operuje na zmiennych lokalnych nazwanych zgodnie ze zmiennymi występującymi w tym wzorze. Posiłkuje się uproszczoną funkcją obliczającą dodatnią potęgę liczby rzeczywistej o całkowitym wykładniku (Power, wiersz 93) – tylko bowiem na takich liczbach w tym przypadku wykonywana jest ta operacja. Posiada także zabezpieczenie na wypadek wystąpienia wartości 0 w mianowniku ułamka[153].

3. Wdrażanie oprogramowania komputerów kieszonkowych

3.1. Przykład zastosowania

Podpunkt ten ma za zadanie wykazać, iż przy użyciu specjalistycznego oprogramowania, jakie powstało na potrzeby niniejszej pracy, obliczenie wartości IRR nawet dla najbardziej skomplikowanych inwestycji jest niezmiernie proste. W praktyce, proces ten sprowadza się do wprowadzenia danych źródłowych i naciśnięcia jednego przycisku. Stwierdzenie to jest prawdziwe również dla poniższego przykładu, który został dobrany tak, by charakteryzował się niemałą złożonością rachunkową. Przykład pochodzi z książki Finanse firm: długoterminowe zarządzanie finansami [18].

„Inwestycja wymaga poniesienia nakładów inwestycyjnych w wysokości 100000 zł, przy czym udział własny wynosić będzie 80% łącznych nakładów. Firma skorzysta z kredytu bankowego, który zakłada jego spłatę w czterech równych płatnościach annuitetowych[154], oprocentowanych 10% w skali roku. Pozyskany dzięki inwestycji majątek trwały będzie rozliczony poprzez amortyzację w okresie 10 lat. Podatek dochodowy w całym prognozowanym okresie wyniesie 19%.” Przepływy pieniężne z kolejnych okresów zestawione zostały w poniższej tabeli:

Wyszcze­gól­nienie0123456
Nakłady inwestycyjne100000 
Zaciągnięcie kredytu20000 
Nakłady na kapitał obrotowy 345238476719200
- należności 295932965816400
- zapasy 246627454813700
- zobowią­za­nia bieżące 197321943811000
Przychody ze sprzedaży 360004000048000500005000050000
Koszty operacyjne 300003200034000360003600038000
Wynik na działalności oper. 6000800014000140001400012000
Odsetki od kredytu 200015691095574  
Wynik finansowy brutto 4000643112905134261400012000
Podatek dochodowy 76012222452255126602280
Wynik finansowy netto 324052091045310875113409720
Amortyzacja 100001000010000100001000010000
Rata „an­nu­i­te­to­wa” 6309630963096309  
Wartość końcowa      44795
Przepływy pieniężne netto-8000054791008514472149482134064515

Tabela 3 – Zestawienie przepływów pieniężnych przykładowej inwestycji.

Źródło: [Finanse firm: długoterminowe zarządzanie finansami, s. 96].

Sporządzenie podobnego zestawienia jest niezbędnym pierwszym krokiem podejmowanym przy profesjonalnym rozpatrywaniu każdej inwestycji. W przypadku prostych inwestycji lub podczas dokonywania analizy wstępnej, nie jest koniecznym wykonywanie tak precyzyjnego wyszczególnienia. Do oceny przedsięwzięć inwestycyjnych i obliczenia ich podstawowych wskaźników ekonomicznych, wystarczy wówczas określić wartości komórek z jego ostatniego wiersza („Przepływy pieniężne netto”). Również wartości właśnie tych komórek należy wprowadzić do omawianej specjalistycznej aplikacji.

Aplikacja „IRRcalc” z wprowadzonymi danymi inwestycji.

Rysunek 18 – Aplikacja „IRRcalc” z wprowadzonymi danymi inwestycji.

Źródło: Opracowanie własne.

Rysunek 18 przedstawia formatkę główną aplikacji „IRRcalc”, do której wprowadzono wszystkie dane źródłowe wymagane do obliczenia wartości wewnętrznej stopy zwrotu omawianej inwestycji. Wartości komórek z kolumn od „1” do „6” zostały uwzględnione jako przychody w poszczególnych okresach w tabeli „Przepływy pieniężne”. Udział własny nakładów inwestycyjnych o wysokości 80000 zł (komórka z kolumny „0”) został wprowadzony do indywidualnego pola tekstowego „Wkład początkowy”. Należy zwrócić uwagę, iż w aplikacji wartości w kolumnie „koszt” pozostawiono zerowe. Wynika to ze specyfiki otrzymanych danych źródłowych (Tabela 3), a mianowicie z sumarycznego zestawienia przepływów pieniężnych netto dla każdego okresu. Gdyby zestawienie charakteryzowało się oddzielnymi sumami dla przychodów i kosztów, wówczas obie kolumny mogłyby być nimi odpowiednio wypełnione. Taki alternatywny i równoznaczny wariant obrazuje Rysunek 19. Oczywiście ostateczny wynik wartości IRR w obu przypadkach pozostanie identyczny.

Dane inwestycji po „rozbiciu” przepływów na przychody i koszty.

Rysunek 19 – Dane inwestycji po „rozbiciu” przepływów na przychody i koszty.

Źródło: Opracowanie własne.

Po wprowadzeniu danych, użytkownikowi aplikacji nie pozostaje nic innego, jak nacisnąć przycisk „Oblicz IRR”, by program w mgnieniu oka obliczył wynikową wartość. Jak się okazuje, wartość wewnętrznej stopy zwrotu dla przedstawionego przykładu obliczona przez omawianą aplikację wynosi 11,2175% (obrazuje to Rysunek 20), co pokrywa się z przybliżoną wartością 11,2% podaną w książce z której przykład ten pochodzi.

Obliczona przez „IRRcalc” wartość wewnętrznej stopy zwrotu.

Rysunek 20 – Obliczona przez „IRRcalc” wartość wewnętrznej stopy zwrotu.

Źródło: Opracowanie własne.

Aby uzmysłowić sobie w jakim stopniu działanie aplikacji upraszcza pracę inwestora analizującego omawianą inwestycję, można rozpisać wzór [3.2] (podpunkt 2.4) na jego części składowe właściwe dla omawianego tu przypadku:

Wzór [3.3] [3.3]

Program ma za zadanie znaleźć taką wartość zmiennej r (czyli wewnętrznej stopy zwrotu), która spełnia powyższe równanie wielomianowe. Z matematycznego punktu widzenia, obliczenia takie sprowadzają się do podstawiania przypuszczalnych wyników do tego wzoru i coraz dokładniejszego dopasowywania ich wartości w zależności od znaku wartości uzyskanej po lewej stronie równania. Kolejne obliczenia wykonywane tą metodą oscylują zatem wokół faktycznej wartości IRR, aż do chwili osiągnięcia oczekiwanej precyzji. W praktyce, w tym konkretnym przypadku, aby uzyskać wartość z dokładnością do 4 miejsc po przecinku (czyli z bardzo dużą precyzją, jednakową z tą, którą osiągnął program), należałoby około 200 razy obliczać lewą stronę zaprezentowanego równania[155]. Oczywiście doświadczony analityk (w przeciwieństwie do programu zawsze postępującego ściśle według zaprogramowanego algorytmu) potrafiłby z góry określić przybliżoną wartość IRR i prawdopodobnie dokonać precyzyjnych obliczeń już przy pomocy kilkunastu iteracji (podstawień do wzoru).

Mimo wszystko, z powyższego wynika, że czas, jaki nawet biegły inwestor musiałaby poświęcić na wykonanie opisanych obliczeń, ma się nijak do wyniku osiąganego przez specjalistyczny program komputerowy. Przykład ten doskonale obrazuje i potwierdza przedstawioną we Wstępie hipotezę, mówiącą m.in., iż dobrze napisany program jest w stanie w pełni sprostać wymaganiom współczesnego przedsiębiorcy, dla którego szybkość podejmowania decyzji stanowi niewątpliwy klucz do sukcesu.

3.2. Określenie odbiorcy docelowego

Jak zaznaczono w podpunkcie 2.2, odbiorcę docelowego oraz kanały sprzedaży należy zwykle ustalić w fazie projektowania aplikacji. Zakończenie tworzenia aplikacji dla platformy Palm otwiera jednak szereg możliwości jej dystrybucji do docelowych odbiorców i nic nie stoi na przeszkodzie, by wykraczały one poza decyzje projektowe.

Odbiorców docelowych aplikacji komercyjnych można skategoryzować w postaci hierarchii w następujący sposób:

Hierarchia odbiorców docelowych aplikacji komercyjnych.

Rysunek 21 – Hierarchia odbiorców docelowych aplikacji komercyjnych.

Źródło: Opracowanie własne na podstawie [Ochrona programu komputerowego w nowym prawie autorskim, s. 64 i 65].

Jak wynika z powyższego schematu, przed ustaleniem odbiorcy aplikacji, należy ustalić cel jej powstania. Aplikacja może bowiem powstać celem przeniesienia praw do niej lub celem udzielania licencji na jej użytkowanie[156].

W pierwszym przypadku najczęściej następuje odsprzedaż lub udzielenie leasingu programu komputerowego wraz ze wszystkimi towarzyszącymi mu materiałami, szczególnie z kodem źródłowym. Odbiorcą wówczas najczęściej jest przedsiębiorstwo (a nie podmiot indywidualny), które pragnie wykorzystać program na swoje potrzeby, lub do dalszej odsprzedaży. Taka forma handlu określana jest mianem B2B[157]. Tworzone w ten sposób oprogramowanie powstaje całkowicie z uwzględnieniem potrzeb i wymagań konkretnego konsumenta[158]. Często odbiorca taki już po zakupie dostosowuje program do swoich potrzeb lub zleca producentowi wykonanie odpowiednich zmian.

W drugim zaś przypadku udziela się licencji na korzystanie z utworzonego oprogramowania, bądź jego leasingu bez opcji przeniesienia praw. Program napisany z myślą o takim charakterze dystrybucji może powstać dla konkretnego użytkownika, albo dla wielu użytkowników, którzy nie są znani w chwili jego powstawania. Utworzenie programu dla konkretnego odbiorcy (który podobnie jak w poprzednim przypadku – najczęściej będzie przedsiębiorstwem) ma na celu zaspokojenie jego potrzeb określonych w fazie projektowania. Natomiast utworzenie programu z myślą o złożeniu oferty wielu użytkownikom ma najczęściej na celu zaspokojenie potrzeb rynku i to właśnie te potrzeby należy uwzględnić tworząc oprogramowanie. Oprogramowanie takie przeznaczone jest dla użytkowników o wspólnych potrzebach i możliwościach[159]. Taka forma handlu określana jest mianem B2C[160].

Jak opisano wcześniej w niniejszej pracy, aplikacje dla platformy Palm są niewielkie i jednostkowo niezbyt skomplikowane. Z ekonomicznego punktu widzenia marketing indywidualny takich aplikacji byłby nieopłacalny ze względu na niski koszt ich odtworzenia i małą wartość. Zarówno opcja przeniesienia praw, jak i udzielenia licencji pojedynczemu podmiotowi przyniosłaby niewielki zysk producentowi oprogramowania z powodu niskiej ceny. Jedynym wyjątkiem od tej reguły jest stworzenie całego specjalizowanego pakietu aplikacji o wspólnej tematyce i wspólnym odbiorcy docelowym, a następnie ich łączna dystrybucja. Wówczas zdecydowanie prościej można znaleźć dla nich odbiorcę docelowego, dla którego stanowiłyby one rozwiązanie kompleksowe.

Parafrazując tezę zawartą w poprzednim akapicie, należy stwierdzić, iż tworząc aplikację dla platformy Palm, najlepiej jest zdecydować się na zaoferowanie jej wielu użytkownikom. Można to uczynić tworząc aplikację klasy shareware. Implikuje to takie jej zaprojektowanie, które sprawi, że będzie ona jak najbardziej wszechstronna, zrozumiała i dostępna dla potencjalnego docelowego odbiorcy. Tworząc aplikację należy określić jakie jest zapotrzebowanie rynkowe na tego typu produkt, a następnie odpowiednio ją opublikować i wypromować. Pomimo niewielkiej ceny jednostkowej, dobra promocja i odpowiednia dostępność aplikacji powinna zaspokoić wymagania producenta związane ze zwrotem kosztów jej utworzenia oraz szybko zacząć przynosić zyski. Niewątpliwym atutem są także niskie koszty dystrybucji takiej aplikacji oraz towarzyszące temu dodatkowe możliwości opisane szczegółowo w podpunkcie 3.3.

Istnieje jeszcze jedna klasa programów, o której należy wspomnieć. Jest to oprogramowanie public domain lub inaczej freeware[161]. Dystrybucja takiego oprogramowania wydaje się najprostszą z tu przedstawionych i taką rzeczywiście jest. Nie wymaga ona implementowania aparatu pobierania opłat za jego użytkowanie lub sprzedaż. W przypadku licencji typu open source, nie jest wymagane nawet zabezpieczenie aplikacji przed dekompilacją, jak i przed innymi czynnościami, na które zezwala jedynie ta licencja. Wbrew pozorom, aplikacje rozpowszechniane na wolnych (bezpłatnych) licencjach nie są całkowicie nieuzasadnione z marketingowego punktu widzenia. Stanowią one odpowiednik wersji próbnych w przypadku oprogramowania klasy shareware, ale na poziomie firmy producenta, a nie konkretnego produktu. Mogą one służyć na przykład jako swoista „wizytówka” programistyczna danej firmy produkującej oprogramowanie. Mogą one też stanowić dla firmy bezpłatną reklamę w serwisach internetowych (i nie tylko) poświęconych wyłącznie oprogramowaniu tej klasy. Podobnie jak w przypadku oprogramowania klasy shareware, odbiorcą takiego oprogramowania potencjalnie może być każda osoba, która na przykład w Internecie poszukuje informacji o tematyce związanej z przedmiotową aplikacją.

3.3. Kanały sprzedaży i marketing

Poruszając zagadnienia dotyczące sprzedaży oprogramowania dla platformy Palm, znów należy podkreślić jego małą złożoność, która bezpośrednio przekłada się na jego niską wartość jednostkową. Biorąc to pod uwagę oraz opisaną w poprzednim podpunkcie charakterystykę użytkownika docelowego, okazuje się, iż do sprzedaży takiego oprogramowania najlepszym (i w większości przypadków jedynym rentownym) medium jest Internet. Oferuje on liczne formy promocji, sprzedaży, obsługi klienta oraz badań marketingowych, których dostępność i skuteczność zwykle rekompensuje brak możliwości skorzystania z metod tradycyjnych.

Tradycyjna forma sprzedaży oprogramowania dla platformy Palm w większości przypadków byłaby całkowicie nieopłacalna (szczególnie w przypadku udzielania licencji na użytkowanie w relacji B2C). Już koszt jego powielenia oraz dystrybucji mógłby przekroczyć wartość produktu, podczas gdy w Internecie koszt ten jest kosztem stałym, a zwykle wręcz pobocznym[162]. Ponadto, Internet zapewnia interaktywny kontakt z klientem, szeroką o nim wiedzę, a także personalizację pod kątem jego wymagań. Dostęp do informacji o produkcie jest nieograniczony, szybki i nie wymagający dodatkowych nakładów. Marketing internetowy opiera się na szybkim przepływie informacji, charakteryzuje się dużą elastycznością, a jego oddziaływanie jest nieograniczone czasowo. Dominuje strategia pull, w której klient świadomie sięga po takie produkty, jakich oczekuje[163]. Głównymi formami handlu w Internecie są[164]:

Punktem wyjścia dla marketingu w Internecie jest własna witryna internetowa przedsiębiorstwa. Może ona zawierać zarówno materiały promocyjne i informacyjne, jak i sklep internetowy służący do bezpośredniego zakupu oferowanego oprogramowania. Stanowi także interaktywny trzon kontaktu firmy z klientem i klienta z firmą. W relacjach B2B[165] zezwala na wszczęcie negocjacji przed wykonaniem oprogramowania na zamówienie. Spopularyzowanie witryny w sieci stanowi główne źródło pierwszego kontaktu potencjalnego nabywcy z producentem oprogramowania. Dlatego tak istotnym jest odpowiednie rozpowszechnienie jej adresu za pomocą konwencjonalnych środków public relations, jak i różnych usług internetowych. Do najpopularniejszych metod promocji zaliczyć można rejestrację w wyszukiwarkach i katalogach adresów internetowych, ogłoszenia na forach dyskusyjnych i grupach Usenet, oraz reklamy (np. w postaci bannerów[166], lub za pomocą wymiany hiperłączy) na witrynach innych firm (np. oferujących podobne produkty dla innych platform, albo produkujących sprzęt komputerowy)[167].

Oprócz posiadania funkcji sklepu na własnej witrynie sieciowej, producenci handlujący w relacjach B2C[168] często zamieszczają swoje oprogramowanie na witrynach rozmaitych sklepów internetowych (online retailers). Celem zamieszczenia tam produktów jest przede wszystkim ich dostępność w miejscach, w których potencjalny klient może ich poszukiwać pośród innych, podobnych produktów. Układają się one w następujący hierarchiczny sposób:

Podział ten klasyfikuje sklepy ze względu na szerokość sprzedawanej oferty – począwszy od sklepów horyzontalnych, a na wertykalnych skończywszy[170]. Handel aplikacjami dla platformy Palm w sklepach ogólnotematycznych zwykle nie jest realny, gdyż w większości przypadków oferta nie trafia tam ani do posiadaczy komputerów przenośnych, ani do osób zainteresowanych funkcjonalnością danego oprogramowania. Z drugiej zaś strony, handel w sklepach ściśle związanych z platformą oraz w sklepach specjalistycznych (np. oferujących oprogramowanie dla ekonomistów) pozwala autorowi oprogramowania dotrzeć bezpośrednio do grupy konsumentów potencjalnie zainteresowanych jego produktem. Koszt prezentacji oprogramowania w sklepach internetowych z reguły jest zerowy, a jedynie pobierana jest marża od sprzedaży. Sprawia to, iż inwestycja producentów w skorzystanie z takich sklepów jest pozbawiona ryzyka. Ponadto, zajmują się one często nie tylko samą dystrybucją oprogramowania, ale oferują też rozmaite usługi jego promocji, a nawet wsparcia technicznego dla użytkowników docelowych.

Pasaże handlowe w Internecie są to serwisy prezentujące i zestawiające ofertę pochodzącą z wielu indywidualnych sklepów internetowych[171]. Kładziony jest w nich większy nacisk na zastosowanie produktu, niż na jego pochodzenie (producenta, dystrybutora), jednak sam proces dokonywania zakupu niewiele różni się od tego, który występuje w sklepach internetowych. Również podobnymi zależnościami charakteryzuje się ich zastosowanie w sprzedaży i marketingu oprogramowania dla komputerów kieszonkowych.

Aukcje internetowe służą głównie relacjom B2C, jednak stanowią często pierwszy krok w rozwoju firm oferujących oprogramowanie dla innych przedsiębiorców (B2B). Pod względem marketingowym niewiele różnią się od sklepów internetowych, czy pasaży handlowych, inna jest jedynie forma ustalania ceny zakupu – charakterystyczna dla serwisów aukcyjnych[172]. Rynki elektroniczne również można uznać za swoistą odmianę sklepów lub pasaży, z tą różnicą, że oprócz oferowania produktów poszczególnych firm, „dostarczają cennych informacji i porad”[173]. Obie te formy handlu (aukcje internetowe i rynki elektroniczne, z wyłączeniem rynków horyzontalnych) równie dobrze jak sklepy i pasaże nadają się do sprzedaży aplikacji dla platformy Palm.

Pozostałe formy handlu w Internecie z różnych przyczyn nie są wskazane w handlu oprogramowaniem dla komputerów kieszonkowych. Giełdy wirtualne stanowią „bardzo skomplikowany model biznesowy sektora B2B, dopiero rozwijający się w Internecie”[174], przez co ryzyko korzystania z nich jest wciąż wysokie. Z drugiej strony, serwisy ogłoszeniowe są dość prostymi rozwiązaniami, jednak dotyczą głównie ofert pracy lub pojedynczych ogłoszeń kupna-sprzedaży[175] i z założenia nie służą handlowi oprogramowaniem, który złożony jest z powtarzających się procesów sprzedaży.

Zakończenie

W tworzeniu specjalistycznego oprogramowania dla komputerów kieszonkowych tkwi ogromny potencjał. Praca ta wykazała, iż aplikacje mobilne potrafią w znacznym stopniu przyspieszyć i uprościć pracę inwestorów, jednocześnie wcale nie będąc dla nich skomplikowanymi w użyciu. Co więcej, samo ich projektowanie i programowanie też nie nastręcza trudności ich autorom. W praktyce jednak, niewielu inwestorów korzysta z podręcznych i wygodnych rozwiązań oferowanych przez komputery kieszonkowe. Problem niewykorzystania tego potencjału wynika zapewne z niedoceniania tak małych urządzeń, jakimi są palmtopy, a także związany jest z siłą przyzwyczajeń i obawą przed nowymi technologiami.

Moc obliczeniowa komputerów kieszonkowych często jest bagatelizowana przez osoby, które potencjalnie mogłyby z nich skorzystać w swojej pracy zawodowej. Głównym powodem takiego stanu rzeczy jest brak rzetelnej informacji o możliwościach palmtopów. W miejsce faktycznych wiadomości, jako pierwsze nasuwają się skojarzenia z funkcjonalnością prostego kalkulatora, telefonu komórkowego, czy nieprofesjonalnego gadżetu. Nic bardziej mylnego – jak wykazał Rozdział I, palmtopy są o wiele bardziej zbliżone funkcjonalnością do komputerów stacjonarnych, czy komputerów przenośnych, takich jak laptopy. Jednocześnie, w sposób niezaprzeczalnie bezkonkurencyjny, przewyższają je możliwością natychmiastowego użycia w niemal każdej sytuacji.

Rozdział II wykazał, iż stworzenie specjalistycznej aplikacji wykrojonej na potrzeby konkretnej branży jest niezwykle proste w świetle korzyści, jakie może ona przynieść w codziennej pracy użytkownika docelowego. Kod źródłowy takiej aplikacji stanowi de facto obudowę szkieletu aplikacji standardowym kodem języka C, natomiast kod źródłowy zasobów złożonością niewiele wykracza poza kod zasobów tegoż szkieletu. W rezultacie, zespół składający się tylko z jednego projektanta, będącego profesjonalistą z danej branży i jednego informatyka, jest w stanie wyprodukować w pełni funkcjonalną i w wielu przypadkach niezwykle użyteczną aplikację w bardzo krótkim czasie i przy bardzo niskich nakładach.

Na wolnym rynku nie ma oczywiście podaży bez popytu. Wobec tego, produkcja nawet tak prostego oprogramowania, wciąż dziś leży poza zainteresowaniami firm informatycznych. Ten stan rzeczy może diametralnie ulec zmianie dzięki zwiększeniu świadomości profesjonalistów różnych dziedzin w zakresie wykorzystania nowych technologii. Opisana w Rozdziale III przykładowa aplikacja rozwiązuje jedynie wąski problem konkretnego zagadnienia biznesowego – podejmowania decyzji inwestycyjnych. Nic jednak nie stoi na przeszkodzie, by w analogiczny sposób powstały liczne aplikacje realizujące spokrewnione zadania. Prowadząc analogię jeszcze dalej, uzasadnionym staje się tworzenie podobnych aplikacji dla różnorodnych gałęzi biznesu. Niemal wszędzie bowiem podstawowe założenie jest prawdziwe – szybkość i sprawność podejmowania początkowych decyzji daje przewagę w całej rozciągłości każdego przedsięwzięcia.

Oczywistym kierunkiem dalszych rozważań w omawianej problematyce wydaje się być promocja komputerów kieszonkowych i ich specjalistycznego oprogramowania w poszczególnych grupach zawodowych. Niniejsza praca może niewątpliwie stanowić podstawę w uzasadnieniu takich działań. Są to jednak kwestie, które w skali dzisiejszego świata biznesu może udźwignąć przede wszystkim promocja i lobbing producentów sprzętu i oprogramowania. W nieco mniejszym tempie może na nie także wpłynąć ewolucja podejścia do nowoczesnych technologii, które staje się coraz bardziej otwarte wśród profesjonalistów wszystkich dziedzin.

Posłowie

Dziś, nieco ponad pół roku po powstaniu niniejszej pracy, przedmiot jej rozważań – mniej lub bardziej spodziewanie – przeszedł do historii. Jak się bowiem okazało 11 lutego 2009 roku, platforma Palm umarła śmiercią niezbyt naturalną. Dnia tego dyrektor generalny firmy Palm, Ed Colligan ogłosił, iż jego firma nie wyprodukuje już żadnego nowego modelu palmtopa pracującego pod kontrolą systemu operacyjnego Palm OS[176]. Jako że firma ta była jedyną produkującą takie urządzenia w ostatnich latach, należy przyjąć, iż deklaracja ta stanowi jednocześnie koniec ery całej platformy Palm.

Palm OS, którego niezaprzeczalne zalety zostały wykazane w niniejszej pracy, pomimo wręcz nieograniczonych możliwości dalszego rozwoju, uległ – jak się wydaje – działaniom marketingowym prowadzonym przez wielkie przedsiębiorstwa, w tym przez samą firmę Palm. Zapewne pojawiły się argumenty strategiczne, które umotywowały producenta do porzucenia niezwykle popularnej i dobrze zapowiadającej się platformy. Nastąpiło to prawdopodobnie przy silnym lobby ze strony firmy Microsoft, która ze względu na platformę Pocket PC stanowiła bezpośrednią konkurencję dla platformy Palm. Ta niezaprzeczalnie potężniejsza firma (choć wyłącznie ze względu na dominację na innych rynkach) niejako zapoczątkowała proces zatracania tożsamości przez firmę Palm. Po raz pierwszy objawiło się to pod koniec roku 2005, gdy szefowie obu firm zaprezentowali pierwszy komputer kieszonkowy konkurencyjnej platformy Pocket PC produkowany przez firmę Palm[177]. Działania te doprowadziły już kilka lat temu do wyhamowania rozwoju własnej platformy firmy Palm, aby w ostateczności wydanie decyzji definitywnie ją przekreślającej stało się już tylko kwestią czasu.

W przeciągu kilku miesięcy od czasu powstania niniejszej pracy, do momentu ogłoszenia decyzji kończącej historię platformy Palm, nie nastąpiły żadne zmiany związane z samą platformą, ani systemem operacyjnym Palm OS, ani też urządzeniami działającymi pod jego kontrolą. Niniejszym można stwierdzić, iż praca ta przeobraziła się w znakomite „epitafium” opiewające platformę Palm w czasach jej największej świetności, a także w swoiste podsumowanie całej jej historii.

Publikując dziś moją pracę magisterską, nie mam już zamiaru nikogo przekonywać do zawartej w niej tezy. Pomimo że wciąż pozostaje ona prawdziwa, to jednak całkowicie straciła swój wydźwięk praktyczny. Pozostaje mi wyrazić nadzieję, iż ta „krótka opowieść o specyfice pewnej platformy, która niegdyś wielką była” w perspektywie czasu zainteresuje niejednego informatyka, a szczególnie w jej nowym świetle – ekonomistę analizującego przypadki historyczne.

Radosław Nowak, Kraków, 6 maja 2009 r.

Bibliografia

  1. Bickerton P., Bickerton M., Pardesi U., Marketing w Internecie: jak najlepiej wykorzystać sieć w sprzedaży produktów i usług?, wyd. I, Gdańskie Wydawnictwo Psychologiczne, Gdańsk 2006, ISBN 83-89574-95-0
  2. Boling D., Programming Microsoft Windows CE, wyd. II, Microsoft Press, Redmond, Washington, 2001, ISBN 0-7356-1443-1
  3. Byrska M., Ochrona programu komputerowego w nowym prawie autorskim, wyd. I, Akademicka Oficyna Wydawnicza PLJ, Warszawa 1994, ISBN 83-7101-601-8
  4. Dobija M., Dyskonto, wyd. I, Wydawnictwa Szkolne i Pedagogiczne, Warszawa 1992, ISBN 83-02-04906-9
  5. Encyklopedia Britannica, http://www.britannica.com/ , 5 września 2008 – 14 października 2008.
  6. Encyklopedia PWN, http://encyklopedia.pwn.pl/ , 3 września 2008 – 17 września 2008.
  7. Foster L. R., Palm OS programming bible, wyd. I, IDG Books Worldwide, Inc., 2000, wydanie elektroniczne, ISBN 0-7645-4676-7
  8. Foster L. R., Bachmann G., Professional Palm OS programming, wyd. II, Wiley Publishing, Inc., Indianapolis 2005, ISBN 0-7645-7373-X
  9. Frąckiewicz E., Marketing internetowy, wyd. I, Wydawnictwo Naukowe PWN, Warszawa 2006, ISBN 83-01-14634-6
  10. Gregor B., Stawiszyński M., e-Commerce, wyd. I, Oficyna Wydawnicza Branta, Bydgoszcz, Łódź 2002, ISBN 83-89073-03-X
  11. Informatyka dla ekonomistów: studium teoretyczne i praktyczne, praca zbiorowa pod redakcją A. Nowickiego, wyd. I, Wydawnictwo Naukowe PWN, Warszawa 1997, ISBN 83-01-12476-8
  12. Informatyka ekonomiczna, praca zbiorowa pod redakcją E. Niedzielskiej, wyd. I, Wydawnictwo Akademii Ekonomicznej Im. Oskara Langego we Wrocławiu, Wrocław 1998, ISBN 83-7011-326-5
  13. Inżynieria systemów informatycznych w e-gospodarce, praca zbiorowa pod redakcją E. Kolbusza, W. Olejniczaka i Z. Szyjewskiego, wyd. I, Polskie Wydawnictwo Ekonomiczne, Warszawa 2005, ISBN 83-208-1562-2
  14. Ligonnière, R., Prehistoria i historia komputerów: od początków rachowania do pierwszych kalkulatorów elektronicznych, wyd. I, Zakład Narodowy im. Ossolińskich – Wydawnictwo, Wrocław 1992, ISBN 83-04-03809-9
  15. Małysiak H., Pochopień B., Wróbel E., Procesory arytmetyczne, wyd. I, Wydawnictwa Naukowo-Techniczne, Warszawa 1993, ISBN 83-204-1499-7
  16. Metzger, P., Siemieniacki M., Anatomia PC: architektura komputerów zgodnych z IBM PC, wyd. VIII, Wydawnictwo Helion, Gliwice 2003, ISBN 83-7361-244-0
  17. Miniaturyzacja w analityce, praca zbiorowa pod redakcją Z. Brzózki, wyd. I, Oficyna Wydawnicza Politechniki Warszawskiej, Warszawa 2005, ISBN 83-7207-563-8
  18. Nesterak J., Kowalik M., Finanse firm: długoterminowe zarządzanie finansami, wyd. I, Wydawnictwo ANVIX, Kraków 2004, ISBN 83-910812-2-2
  19. Oleński J., Ekonomika informacji, wyd. I, Polskie Wydawnictwo Ekonomiczne, Warszawa 2001, ISBN 83-208-1311-5
  20. Palm OS Platform Developer Guide. Software and Hardware, wyd. V, Palm, Inc., 2006, wydanie elektroniczne, http://www.palm.com/us/support/
  21. Piecha, J., Elementy architektury komputerów, wyd. I, Wyższa Szkoła Biznesu, Dąbrowa Górnicza 2004, ISBN 83-88936-13-1
  22. Płoski Z., Informatyka: słownik encyklopedyczny, wyd. I, Wydawnictwo Europa, Wrocław 1999, ISBN 83-87977-16-0
  23. Rhodes N., McKeehan J., Palm programming: the developer's guide, wyd. I, O'Reilly & Associates, Inc., 1998, wydanie elektroniczne, ISBN 1-56592-525-4
  24. Stevens W. R., Unix network programming: networking APIs: Sockets and XTI, tom I, wyd. II, Prentice Hall, Upper Saddle River 2001, ISBN 0-13-490012-X
  25. Thompson, R. B., Thompson, B. F., PC hardware: almanach, wyd. III, Wydawnictwo Helion, Gliwice 2004, ISBN 83-7361-342-0
  26. Wigley A., Moth D., Foot P., Microsoft mobile development handbook, wyd. I, Microsoft Press, Redmond 2007, ISBN 978-0-7356-2358-3
  27. Wilson G., Ostrem J., Bey C., Palm OS Programmer's Companion, Palmsource, Inc., Sunnyvale 2004, wydanie elektroniczne, ISBN 978-05-9573-717-8, http://www.palmos.com/dev/support/docs/
  28. Wilson G., Ostrem J., Bey C., Dugger M., Palm OS Programmer's API Reference, Palmsource, Inc., Sunnyvale 2004, wydanie elektroniczne, ISBN 978-05-9573-711-6, http://www.palmos.com/dev/support/docs/
  29. Wołoszyn J., Wprowadzenie do języka C, wyd. I, Akademia Ekonomiczna w Krakowie: Wydawnictwo Uczelniane, Kraków 1997, ISBN 83-87239-10-0
  30. Wykorzystanie narzędzi informatycznych w naukach ekonomicznych: przykłady i zadania, praca zbiorowa pod redakcją Halesa C., wyd. I, Wydawnictwo Uniwersytetu Rzeszowskiego, Rzeszów 2007, ISBN 978-83-7338-310-4

Spis tablic

Tabela 1 – Porównanie funkcjonalności systemów operacyjnych.

Tabela 2 – Porównanie rodzajów pamięci występujących w platformie Palm.

Tabela 3 – Zestawienie przepływów pieniężnych przykładowej inwestycji.

Spis rysunków

Rysunek 1 – Typowy komputer kieszonkowy – model Palm TX.

Rysunek 2 – Oś czasu przedstawiająca historię komputerów kieszonkowych.

Rysunek 3 – Wzory liter i cyfr rozpoznawanych przez oprogramowanie Graffiti.

Rysunek 4 – Przykładowa formatka aplikacji systemu Palm OS.

Rysunek 5 – Ikony podstawowych aplikacji systemu Palm OS.

Rysunek 6 – Palmtop Palm IIIc z typowym formatem ekranu.

Rysunek 7 – Zintegrowane środowisko programistyczne „CodeWarrior”.

Rysunek 8 – Zintegrowane środowisko programistyczne „PODS”.

Rysunek 9 – Schemat procesu powstawania aplikacji dla platformy Palm.

Rysunek 10 – Ogólny schemat przebiegu działania aplikacji.

Rysunek 11 – Schemat blokowy pętli zdarzeń typowej aplikacji.

Rysunek 12 – Przykładowa formatka oraz jej wygląd po wywołaniu menu.

Rysunek 13 – Przykładowe kontrolki interfejsu systemu Palm OS.

Rysunek 14 – Ogólny schemat blokowy aplikacji obliczającej wartość IRR.

Rysunek 15 – Formatka główna aplikacji obliczającej wartość IRR.

Rysunek 16 – Formatka „Przepływy Pieniężne”.

Rysunek 17 – Formatka „Obliczono Wartość IRR”.

Rysunek 18 – Aplikacja „IRRcalc” z wprowadzonymi danymi inwestycji.

Rysunek 19 – Dane inwestycji po „rozbiciu” przepływów na przychody i koszty.

Rysunek 20 – Obliczona przez „IRRcalc” wartość wewnętrznej stopy zwrotu.

Rysunek 21 – Hierarchia odbiorców docelowych aplikacji komercyjnych.

Spis załączników

Załącznik 1 – Szkielet kodu źródłowego typowej aplikacji platformy Palm.

Załącznik 2 – Kod źródłowy podstawowych zasobów typowej aplikacji platformy Palm.

Załącznik 3 – Kod źródłowy aplikacji obliczającej wartość IRR.

Załącznik 4 – Kod źródłowy zasobów aplikacji obliczającej wartość IRR.

Załączniki

Załącznik 1 – Szkielet kodu źródłowego typowej aplikacji platformy Palm.

1	#include "PalmOS.h"
2	
3	Boolean Form1000HandleEvent (EventPtr e) {
4	switch (e->eType) {
5	case frmOpenEvent:
6		FrmDrawForm (FrmGetFormPtr (e->data.frmOpen.formID));
7		return true;
8	case ctlSelectEvent:
9		switch (e->data.ctlSelect.controlID) {
10		case 1000:
11			//TUTAJ kod wykonujący zadania przycisku nr. 1
12			return true;
13		case 1001:
14			//TUTAJ kod wykonujący zadania przycisku nr. 2
15			return true;
16		case 1002:
17			//TUTAJ kod wykonujący zadania przycisku nr. 3
18			return true;
19		}
20		return false;
21	case menuEvent:
22		switch (e->data.menu.itemID) {
23		case 1000:
24			//TUTAJ kod wykonujący zadania polecenia menu nr. 1
25			return true;
26		case 1001:
27			//TUTAJ kod wykonujący zadania polecenia menu nr. 2
28			return true;
29		}
30		return false;
31	}
32	return false;
33	}
34	
35	Boolean AppHandleEvent (EventPtr e) {
36	if (e->eType==frmLoadEvent) {
37		FormPtr formP;
38		formP= FrmInitForm (e->data.frmLoad.formID);
39		FrmSetActiveForm (formP);
40		switch (e->data.frmLoad.formID) {
41		case 1000:
42			FrmSetEventHandler (formP, Form1000HandleEvent);
43			return true;
44		}
45	}
46	return false;
47	}
48	
49	void EventLoop () {
50	EventType evt;
51	do {
52		UInt16 err;
53		EvtGetEvent (&evt, evtWaitForever);
54		if (!SysHandleEvent (&evt))
55			if (!MenuHandleEvent (0, &evt, &err))
56				if (!AppHandleEvent (&evt))
57					FrmDispatchEvent (&evt);
58	} while (evt.eType!=appStopEvent);
59	}
60	
61	Boolean AppStart () {
62	UInt32 actual_os_version;
63	UInt32 minimum_os_version;
64	minimum_os_version= sysMakeROMVersion (3, 5, 0, sysROMStageRelease, 0);
65	FtrGet (sysFtrCreator, sysFtrNumROMVersion, &actual_os_version);
66	if (actual_os_version<minimum_os_version) {
67		FrmAlert (1000);
68		return false;
69	}
70	FrmGotoForm (1000);
71	return true;
72	}
73	
74	void AppStop () {
75	FrmCloseAllForms ();
76	}
77	
78	UInt32 PilotMain (UInt16 cmd, void* cmdPBP, UInt16 launchFlags) {
79	switch (cmd) {
80	case sysAppLaunchCmdNormalLaunch:
81		if (AppStart ()) {
82			EventLoop ();
83			AppStop ();
84		}
85		return 0;
86	}
87	return 0;
88	}

Załącznik 2 – Kod źródłowy podstawowych zasobów typowej aplikacji platformy Palm.

1	//Główna formatka:
2	FORM ID 1000 AT (0 0 160 160) NOFRAME MENUID 1000
3	BEGIN
4		TITLE "Szkielet Aplikacji"
5		BUTTON "Przycisk 1" ID 1000 AT (CENTER@80 62 AUTO AUTO)
6		BUTTON "Przycisk 2" ID 1001 AT (PREVLEFT PREVBOTTOM+5 AUTO AUTO)
7		BUTTON "Przycisk 3" ID 1002 AT (PREVLEFT PREVBOTTOM+5 AUTO AUTO)
8	END
9	
10	//Menu dla głównej formatki:
11	MENU ID 1000
12	BEGIN
13		PULLDOWN "Grupa 1"
14		BEGIN
15			MENUITEM "Opcja 1" ID 1000 "O"
16			MENUITEM "Opcja 2" ID 1001 "P"
17		END
18	END
19	
20	//Okienka z wiadomościami:
21	ALERT ID 1000 ERROR
22	BEGIN
23		TITLE "Błąd Uruchamiania"
24		MESSAGE "Ten program wymaga nowszej wersji systemu - co najmniej Palm OS 3.5."
25		BUTTONS "OK"
26	END
27	
28	//Ikony:
29	ICON ID 1000 COMPRESS
30	BEGIN
31		BITMAP "Icon_1bpp.bmp" BPP 1
32		BITMAP "Icon_8bpp.bmp" BPP 8 TRANSPARENTINDEX 0
33	END
34	
35	SMALLICON ID 1001 COMPRESS
36	BEGIN
37		BITMAP "SmallIcon_1bpp.bmp" BPP 1
38		BITMAP "SmallIcon_8bpp.bmp" BPP 8 TRANSPARENTINDEX 0
39	END
40	
41	//Opisy aplikacji:
42	VERSION "1.0"

Załącznik 3 – Kod źródłowy aplikacji obliczającej wartość IRR.

1	//Deklaracja nagłówków API systemu Palm OS:
2	#include "PalmOS.h"
3	
4	//////////////////////////////////////////////////////////////////////////////////////
5	// Definicje stałych: //
6	//////////////////////////////////////////////////////////////////////////////////////
7	
8	//Identyfikator twórcy:
9	#define creatorID 'Rpm2'
10	
11	#define invalidInitialInvestment -1
12	#define precision 10000
13	
14	//////////////////////////////////////////////////////////////////////////////////////
15	// Zmienne globalne: //
16	//////////////////////////////////////////////////////////////////////////////////////
17	
18	//wskaźnik na aktywną formatkę:
19	FormPtr CurrentFormP;
20	
21	//wkład początkowy:
22	Int32 InitialInvestment;
23	
24	//ilość okresów + 1 pusty okres (możliwy do uzupełnienia):
25	UInt16 FlowCnt;
26	
27	//tablica przychodów:
28	Int32* InflowsA;
29	
30	//tablica kosztów:
31	Int32* OutflowsA;
32	
33	//////////////////////////////////////////////////////////////////////////////////////
34	// Makrodefinicje i funkcje pomocnicze: //
35	//////////////////////////////////////////////////////////////////////////////////////
36	
37	//Pobierz indeks kontrolki o danym ID w zasobach formatki:
38	#define GetObjectIndex(_id) (FrmGetObjectIndex (CurrentFormP, _id))
39	
40	//Wyświetl kontrolkę o danym ID:
41	void ShowObject (UInt16 id) {
42	FrmShowObject (CurrentFormP, GetObjectIndex (id));
43	}
44	
45	//Ukryj kontrolkę o danym ID:
46	void HideObject (UInt16 id) {
47	FrmHideObject (CurrentFormP, GetObjectIndex (id));
48	}
49	
50	//Pobierz wskaźnik na kontrolkę o danym ID:
51	void* GetObjectP (UInt16 id) {
52	return FrmGetObjectPtr (CurrentFormP, GetObjectIndex (id));
53	}
54	
55	//Przekształć tekst z pola tekstowego o danym ID w liczbę:
56	Int32 TextFieldToNumber (UInt16 id) {
57	char* c= FldGetTextPtr (GetObjectP (id));
58	if ((!c) || (StrLen (c)==0)) {
59		return invalidInitialInvestment;
60	} else {
61		return StrAToI (c);
62	}
63	}
64	
65	//Przekształć wartość zmiennoprzecinkową na tekst wartości procentowej:
66	void DoubleToPercent (double value, char* dest) {
67	UInt16 len= 0;
68	NumberFormatType nf;
69	Int32 integer, decimal, i;
70	char comma;
71	nf= PrefGetPreference (prefNumberFormat);
72	comma= ((nf==nfCommaPeriod) || (nf==nfApostrophePeriod))?'.':',';
73	integer= (10L* precision)* value;
74	if (integer<0) {
75		integer*= -1;
76		dest[len++]= '-';
77	}
78	integer= (integer+ 5)/ 10;
79	if (integer==0) len= 0;
80	decimal= integer% precision;
81	integer= integer/ precision;
82	StrIToA (dest+ len, integer);
83	len+= StrLen (dest+ len);
84	dest[len++]= comma;
85	for (i= 10; i<precision; i*= 10) if (decimal<i) dest[len++]= '0';
86	StrIToA (dest+ len, decimal);
87	len+= StrLen (dest+ len);
88	dest[len++]= '%';
89	dest[len]= 0;
90	}
91	
92	//Oblicz dodatnią potęgę liczby:
93	double Power (double base, UInt16 exponent) {
94	UInt16 i;
95	double result= base;
96	for (i=1; i<exponent; i++) {
97		result= result* base;
98	}
99	return result;
100	}
101	
102	//////////////////////////////////////////////////////////////////////////////////////
103	// Funkcje spacjalistyczne: //
104	//////////////////////////////////////////////////////////////////////////////////////
105	
106	//Oblicz wartość NPV:
107	double CountNPV (Int32 initialInvestment, double discountRate) {
108	double I0= initialInvestment;
109	double r= discountRate;
110	double sum= 0;
111	UInt16 t;
112	for (t= 0; t<FlowCnt- 1; t++) {
113		double CFt;
114		double denominator;
115		denominator= Power (r+ 1, t+ 1);
116		if (denominator==0) {
117			return -1; //lim=(-100%)
118		}
119		CFt= InflowsA[t]- OutflowsA[t];
120		sum= sum+ (CFt/ denominator);
121	}
122	return sum- I0;
123	}
124	
125	//Oblicz wartość IRR:
126	double CountIRR (Int32 initialInvestment) {
127	double step= 1;
128	double r1= 1;
129	double r2= 0;
130	double irr;
131	do {
132		double npv;
133		double rx;
134		do {
135			npv= CountNPV (initialInvestment, r1);
136			if (r1- step<=-1) break;
137			r1= r1- step;
138		} while (npv<=0);
139		do {
140			npv= CountNPV (initialInvestment, r2);
141			if (r2+ step<=-1) break;
142			r2= r2+ step;
143		} while (npv>=0);
144		rx= r1;
145		r1= r2;
146		r2= rx;
147		step= step/ 2;
148	} while (step>(1.0/ (1000L* precision)));
149	irr= (r1+ r2)/ 2;
150	return irr* 100;
151	}
152	
153	//////////////////////////////////////////////////////////////////////////////////////
154	// Funkcje interfejsu: //
155	//////////////////////////////////////////////////////////////////////////////////////
156	
157	//Użytkownik nacisnął przycisk "Oblicz IRR":
158	void CountIRRButtonPress () {
159	double irr;
160	char c[32];
161	FieldPtr F;
162	FormPtr popupFormP;
163	UInt16 button;
164	InitialInvestment= TextFieldToNumber (1000);
165	if ((InitialInvestment<=0) || (InitialInvestment==invalidInitialInvestment)) {
166		FrmAlert (1001);
167		return;
168	}
169	if (FlowCnt<2) {
170		FrmAlert (1002);
171		return;
172	}
173	HideObject (1002);
174	ShowObject (1003);
175	irr= CountIRR (InitialInvestment);
176	HideObject (1003);
177	ShowObject (1002);
178	if (irr<-100.0+ (1.0/ precision)) {
179		StrCopy (c, "<=-100%");
180	} else if (irr>=10000) {
181		StrCopy (c, ">=10000%");
182	} else {
183		DoubleToPercent (irr, c);
184	}
185	popupFormP= FrmInitForm (1002);
186	F= FrmGetObjectPtr (popupFormP, FrmGetObjectIndex (popupFormP, 3000));
187	FldSetTextPtr (F, c);
188	button= FrmDoDialog (popupFormP);
189	FrmDeleteForm (popupFormP);
190	if (button==1001) {
191		//Naciśnięto "Kopiuj do schowka":
192		ClipboardAddItem (clipboardText, c, StrLen (c));
193	}
194	}
195	
196	//Użytkownik wybrał element listy przepływów pieniężnych:
197	void MainListItemPress (ListPtr L) {
198	UInt16 itemNum;
199	char time[32];
200	MemHandle textHandleInflow, textHandleOutflow;
201	char* textPtrInflow;
202	char* textPtrOutflow;
203	FieldPtr F;
204	FormPtr popupFormP;
205	UInt16 button;
206	Int32 valueInflow, valueOutflow;
207	popupFormP= FrmInitForm (1001);
208	//przygotuj bufor tekstowy dla pola "Okres":
209	itemNum= LstGetSelection (L);
210	StrIToA (time, itemNum+ 1);
211	//przygotuj bufor tekstowy dla pola "Przychód":
212	textHandleInflow= MemHandleNew (32);
213	textPtrInflow= MemHandleLock (textHandleInflow);
214	textPtrInflow[0]= 0;
215	//przygotuj bufor tekstowy dla pola "Koszt":
216	textHandleOutflow= MemHandleNew (32);
217	textPtrOutflow= MemHandleLock (textHandleOutflow);
218	textPtrOutflow[0]= 0;
219	if (itemNum<FlowCnt-1) {
220		StrIToA (textPtrInflow, InflowsA[itemNum]);
221		StrIToA (textPtrOutflow, OutflowsA[itemNum]);
222	} else {
223		FrmSetFocus (popupFormP, FrmGetObjectIndex (popupFormP, 3001));
224	}
225	MemHandleUnlock (textHandleInflow);
226	MemHandleUnlock (textHandleOutflow);
227	//Przypisz bufory tekstowe do pól tekstowych:
228	F= FrmGetObjectPtr (popupFormP, FrmGetObjectIndex (popupFormP, 3000));
229	FldSetTextPtr (F, time);
230	F= FrmGetObjectPtr (popupFormP, FrmGetObjectIndex (popupFormP, 3001));
231	FldSetTextHandle (F, textHandleInflow);
232	F= FrmGetObjectPtr (popupFormP, FrmGetObjectIndex (popupFormP, 3002));
233	FldSetTextHandle (F, textHandleOutflow);
234	//Wyświetl przycisk "Usuń" jeśli nie jest to ostatni wiersz:
235	if (itemNum<FlowCnt-1) FrmShowObject (popupFormP, FrmGetObjectIndex (popupFormP, 1002));
236	button= FrmDoDialog (popupFormP);
237	//Odczytaj nową wartość z pola "Przychód":
238	textPtrInflow= MemHandleLock (textHandleInflow);
239	valueInflow= StrAToI (textPtrInflow);
240	MemHandleUnlock (textHandleInflow);
241	//Odczytaj nową wartość z pola "Koszt":
242	textPtrOutflow= MemHandleLock (textHandleOutflow);
243	valueOutflow= StrAToI (textPtrOutflow);
244	MemHandleUnlock (textHandleOutflow);
245	FrmDeleteForm (popupFormP);
246	switch (button) {
247	case 1000:
248		//Naciśnięto "OK":
249		InflowsA[itemNum]= valueInflow;
250		OutflowsA[itemNum]= valueOutflow;
251		if (itemNum==FlowCnt- 1) {
252			Int32* t1;
253			Int32* t2;
254			//Powiększ tablicę przychodów:
255			t1= MemPtrNew (sizeof(Int32)* (FlowCnt+ 1));
256			MemMove (t1, InflowsA, (sizeof(Int32)* FlowCnt));
257			t1[FlowCnt]= 0;
258			MemPtrFree (InflowsA);
259			InflowsA= t1;
260			//Powiększ tablicę kosztów:
261			t2= MemPtrNew (sizeof(Int32)* (FlowCnt+ 1));
262			MemMove (t2, OutflowsA, (sizeof(Int32)* FlowCnt));
263			t2[FlowCnt]= 0;
264			MemPtrFree (OutflowsA);
265			OutflowsA= t2;
266			FlowCnt++;
267			LstSetListChoices (L, 0, FlowCnt);
268		}
269		LstDrawList (L);
270		break;
271	case 1001:
272		//Naciśnięto "Anuluj":
273		break;
274	case 1002:
275		//Naciśnięto "Usuń":
276		MemMove (&(InflowsA[itemNum]), &(InflowsA[itemNum+ 1]), sizeof(Int32)* (FlowCnt-
277			itemNum));
278		MemMove (&(OutflowsA[itemNum]), &(OutflowsA[itemNum+ 1]), sizeof(Int32)* (FlowCnt-
279			itemNum));
280		FlowCnt--;
281		LstSetListChoices (L, 0, FlowCnt);
282		LstDrawList (L);
283		break;
284	}
285	}
286	
287	//Użytkownik wybrał opcję menu "O Programie":
288	void AboutBoxShow () {
289	FormPtr popupFormP= FrmInitForm (2000);
290	FrmDoDialog (popupFormP);
291	FrmDeleteForm (popupFormP);
292	}
293	
294	//Funkcja rysująca poszczególne wiersze listy przepływów pieniężnych:
295	void Form1000MainListDrawF (Int16 itemNum, RectangleType* bounds, char** itemsText) {
296	char c[32];
297	UInt16 cLength, cWidth;
298	//kolumna "okres":
299	StrIToA (c, itemNum+ 1);
300	cLength= StrLen (c);
301	cWidth= FntCharsWidth (c, cLength);
302	WinDrawChars (c, cLength, bounds->topLeft.x+ 11- (cWidth/ 2), bounds->topLeft.y);
303	if (itemNum<FlowCnt- 1) {
304		//kolumna "przychód":
305		StrIToA (c, InflowsA[itemNum]);
306		cLength= StrLen (c);
307		cWidth= FntCharsWidth (c, cLength);
308		WinDrawChars (c, cLength, bounds->topLeft.x+ 82- cWidth, bounds->topLeft.y);
309		//kolumna "koszt":
310		StrIToA (c, OutflowsA[itemNum]);
311		cLength= StrLen (c);
312		cWidth= FntCharsWidth (c, cLength);
313		WinDrawChars (c, cLength, bounds->topLeft.x+ 143- cWidth, bounds->topLeft.y);
314	}
315	}
316	
317	//Inicjalizacja wartości początkowych kontrolek formatki głównej
318	void Form1000Open () {
319	ListPtr L= GetObjectP (1001);
320	LstSetListChoices (L, 0, FlowCnt);
321	LstSetDrawFunction (L, Form1000MainListDrawF);
322	LstSetSelection (L, -1);
323	FrmDrawForm (CurrentFormP);
324	if (InitialInvestment==invalidInitialInvestment) {
325		FrmSetFocus (CurrentFormP, GetObjectIndex (1000));
326	} else {
327		char c[32];
328		FieldPtr F= GetObjectP(1000);
329		StrIToA (c, InitialInvestment);
330		FldInsert (F, c, StrLen (c));
331	}
332	}
333	
334	//Odczyt wartości kontrolek formatki głównej
335	void Form1000Close () {
336	InitialInvestment= TextFieldToNumber (1000);
337	}
338	
339	Boolean Form1000HandleEvent (EventPtr e) {
340	switch (e->eType) {
341	case frmOpenEvent:
342		Form1000Open ();
343		return true;
344	case frmCloseEvent:
345		Form1000Close ();
346		return false;
347	case menuEvent:
348		switch (e->data.menu.itemID) {
349		case 1000:
350			//Wybrano "Wskazówki":
351			FrmHelp (1000);
352			return true;
353		case 1001:
354			//Wybrano "O Programie":
355			AboutBoxShow ();
356			return true;
357		}
358		return false;
359	case ctlSelectEvent:
360		switch (e->data.ctlSelect.controlID) {
361		case 1002:
362			//Naciśnięto "Oblicz IRR":
363			CountIRRButtonPress ();
364			return true;
365		}
366		return false;
367	case lstSelectEvent:
368		switch (e->data.lstSelect.listID) {
369		case 1001:
370			//Wybrano element listy przepływów pieniężnych:
371			MainListItemPress (e->data.lstSelect.pList);
372			return true;
373		}
374		return false;
375	}
376	return false;
377	}
378	
379	Boolean AppHandleEvent (EventPtr evt) {
380	if (evt->eType==frmLoadEvent) {
381		CurrentFormP= FrmInitForm (evt->data.frmLoad.formID);
382		FrmSetActiveForm (CurrentFormP);
383		switch (evt->data.frmLoad.formID) {
384		case 1000:
385			FrmSetEventHandler (CurrentFormP, Form1000HandleEvent);
386			return true;
387		}
388	}
389	return false;
390	}
391	
392	void EventLoop () {
393	EventType evt;
394	do {
395		UInt16 err;
396		EvtGetEvent (&evt, evtWaitForever);
397		if (!SysHandleEvent (&evt))
398			if (!MenuHandleEvent (0, &evt, &err))
399				if (!AppHandleEvent (&evt))
400					FrmDispatchEvent (&evt);
401	} while (evt.eType!=appStopEvent);
402	}
403	
404	void LoadPreferences () {
405	UInt16 prefsSize= 0;
406	if (PrefGetAppPreferences (creatorID, 0, 0, &prefsSize, false)==noPreferenceFound) {
407		FlowCnt= 1;
408		InflowsA= MemPtrNew (sizeof(Int32));
409		OutflowsA= MemPtrNew (sizeof(Int32));
410		InitialInvestment= invalidInitialInvestment;
411	} else {
412		Int32* prefsCopy= MemPtrNew (prefsSize);
413		PrefGetAppPreferences (creatorID, 0, prefsCopy, &prefsSize, false);
414		FlowCnt= (((prefsSize/ (sizeof(Int32)))- 1)/ 2)+ 1;
415		InflowsA= MemPtrNew (sizeof(Int32)* FlowCnt);
416		MemMove (InflowsA, &(prefsCopy[1]), (FlowCnt- 1)* sizeof(Int32));
417		OutflowsA= MemPtrNew (sizeof(Int32)* FlowCnt);
418		MemMove (OutflowsA, &(prefsCopy[1+ FlowCnt- 1]), (FlowCnt- 1)* sizeof(Int32));
419		InitialInvestment= prefsCopy[0];
420		MemPtrFree (prefsCopy);
421	}
422	InflowsA[FlowCnt-1]= 0;
423	OutflowsA[FlowCnt-1]= 0;
424	}
425	
426	Boolean AppStart () {
427	UInt32 actual_os_version;
428	UInt32 minimum_os_version;
429	minimum_os_version= sysMakeROMVersion (3, 5, 0, sysROMStageRelease, 0);
430	FtrGet (sysFtrCreator, sysFtrNumROMVersion, &actual_os_version);
431	if (actual_os_version<minimum_os_version) {
432		FrmAlert (1000);
433		return false;
434	}
435	LoadPreferences ();
436	FrmGotoForm (1000);
437	return true;
438	}
439	
440	void SavePreferences () {
441	UInt16 prefsSize= sizeof(Int32)* (1+ (2* (FlowCnt- 1)));
442	Int32* prefsCopy= MemPtrNew (prefsSize);
443	prefsCopy[0]= InitialInvestment;
444	MemMove (&(prefsCopy[1]), InflowsA, sizeof(Int32)* (FlowCnt- 1));
445	MemMove (&(prefsCopy[1+ FlowCnt- 1]), OutflowsA, sizeof(Int32)* (FlowCnt- 1));
446	MemPtrFree (InflowsA);
447	MemPtrFree (OutflowsA);
448	PrefSetAppPreferences (creatorID, 0, 0, prefsCopy, prefsSize, false);
449	MemPtrFree (prefsCopy);
450	}
451	
452	void AppStop () {
453	FrmCloseAllForms ();
454	SavePreferences ();
455	}
456	
457	UInt32 PilotMain (UInt16 cmd, void* cmdPBP, UInt16 launchFlags) {
458	switch (cmd) {
459	case sysAppLaunchCmdNormalLaunch:
460		if (AppStart ()) {
461			EventLoop ();
462			AppStop ();
463		}
464		return 0;
465	}
466	return 0;

Załącznik 4 – Kod źródłowy zasobów aplikacji obliczającej wartość IRR.

1	//Główna formatka:
2	FORM ID 1000 AT (0 0 160 160) NOFRAME MENUID 1000
3	BEGIN
4		TITLE "IRRcalc"
5	
6		LABEL "Wklad poczatkowy:" AUTOID AT (5 20) FONT 1
7		FIELD ID 1000 AT (PREVRIGHT+5 PREVTOP 48 AUTO) EDITABLE UNDERLINED RIGHTALIGN
8			SINGLELINE NUMERIC MAXCHARS 9
9	
10		LABEL "Przeplywy pieniezne:" AUTOID AT (5 33) FONT 1
11		BUTTON "okres" AUTOID AT (5 46 26 11) DISABLED RECTFRAME
12		BUTTON "przychod" AUTOID AT (PREVRIGHT+1 PREVTOP 61 PREVHEIGHT) DISABLED RECTFRAME
13		BUTTON "koszt" AUTOID AT (PREVRIGHT+1 PREVTOP PREVWIDTH PREVHEIGHT) DISABLED RECTFRAME
14		LIST ID 1001 AT (5 58 150 AUTO) VISIBLEITEMS 7
15	
16		BUTTON "Oblicz IRR" ID 1002 AT (5 141 AUTO 13)
17		BUTTON "Prosze czekac..." ID 1003 AT (CENTER@80 PREVTOP AUTO 13) NONUSABLE NOFRAME
18	
19		GRAFFITISTATEINDICATOR AT (150 144)
20	END
21	
22	//Formatka "Przepływy Pieniężne":
23	FORM ID 1001 AT (2 82 156 76) FRAME MODAL MENUID 10000 HELPID 1001 DEFAULTBTNID 1001
24	BEGIN
25		TITLE "Przeplywy Pieniezne"
26	
27		LABEL "Okres:" AUTOID AT (5 16) FONT 1
28		FIELD ID 3000 AT (64 PREVTOP 48 AUTO) NONEDITABLE RIGHTALIGN SINGLELINE
29		LABEL "Przychod:" AUTOID AT (5 29) FONT 1
30		FIELD ID 3001 AT (64 PREVTOP 48 AUTO) EDITABLE UNDERLINED RIGHTALIGN SINGLELINE
31			NUMERIC MAXCHARS 9
32		LABEL "Koszt:" AUTOID AT (5 42) FONT 1
33		FIELD ID 3002 AT (64 PREVTOP 48 AUTO) EDITABLE UNDERLINED RIGHTALIGN SINGLELINE
34			NUMERIC MAXCHARS 9
35	
36		BUTTON "OK" ID 1000 AT (4 59 46 13)
37		BUTTON "Anuluj" ID 1001 AT (PREVRIGHT+5 PREVTOP PREVWIDTH PREVHEIGHT)
38		BUTTON "Usun" ID 1002 AT (PREVRIGHT+5 PREVTOP PREVWIDTH PREVHEIGHT) NONUSABLE
39	
40		GRAFFITISTATEINDICATOR AT (146 43)
41	END
42	
43	//Formatka "Obliczono Wartość IRR":
44	FORM ID 1002 AT (2 52 156 106) FRAME MODAL HELPID 1002 DEFAULTBTNID 1000
45	BEGIN
46		TITLE "Obliczono Wartosc IRR"
47	
48		LABEL "Zastosowany wzor:" AUTOID AT (5 16) FONT 1
49		FORMBITMAP AT (16 PREVBOTTOM+5) BITMAP 4000
50		LABEL "Wartosc IRR:" AUTOID AT (5 70) FONT 1
51		FIELD ID 3000 AT (PREVRIGHT+5 PREVTOP 60 AUTO) USABLE NONEDITABLE SINGLELINE NUMERIC
52	
53		BUTTON "OK" ID 1000 AT (4 89 46 13)
54		BUTTON "Kopiuj do schowka" ID 1001 AT (PREVRIGHT+5 PREVTOP 84 PREVHEIGHT)
55	END
56	
57	//Formatka "O Programie":
58	FORM ID 2000 AT (2 56 156 102) FRAME MODAL
59	BEGIN
60		TITLE "O Programie"
61		LABEL "IRRcalc" AUTOID AT (CENTER@78 22) FONT 7
62		LABEL "Wersja:" AUTOID AT (5 48) FONT 1
63		LABEL "1.0" AUTOID AT (50 PREVTOP)
64		LABEL "Autor:" AUTOID AT (5 60) FONT 1
65		LABEL "Radoslaw Nowak" AUTOID AT (50 PREVTOP)
66		BUTTON "OK" AUTOID AT (5 84 42 13)
67		LABEL "\xa92008" AUTOID AT (RIGHT@149 85)
68	END
69	
70	//Teksty pomocy:
71	STRING ID 1000	"Witaj w programie IRRcalc.\n\n" \
72			"Uzyj tej aplikacji aby obliczyc wartosc wewnetrznej stopy zwrotu (IRR) " \
73			"dla twoich inwestycji.\n\n" \
74			"Wprowadz dane dotyczace wkladu poczatkowego oraz przeplywow pienieznych " \
75			"danej inwestycji i nacisnij przycisk \"Oblicz IRR\" aby natychmiast " \
76			"otrzymac wynik."
77	
78	STRING ID 1001	"Ta formatka umozliwia wprowadzenie wielkosci przyplywow i kosztow " \
79			"dotyczacych danego okresu.\n\n" \
80			"Nacisnij przycisk \"Usun\" aby usunac dany okres z listy przeplywow."
81	
82	STRING ID 1002	"Ta formatka wyswietla obliczona wartosc wewnetrznej stopy zwrotu " \
83			"(IRR) a takze wzor, ktory posluzyl do jej wyliczenia.\n\n" \
84			"Uzyj przycisku \"Kopiuj do schowka\" aby skopiowac obliczona wartosc " \
85			"do schowka systemowego celem uzycia jej w innej aplikacji."
86	
87	//Menu dla głównej formatki:
88	MENU ID 1000
89	BEGIN
90		PULLDOWN "Edycja"
91		BEGIN
92			MENUITEM "Cofnij" ID 10000 "U"
93			MENUITEM "Wytnij" ID 10001 "X"
94			MENUITEM "Kopiuj" ID 10002 "C"
95			MENUITEM "Wklej" ID 10003 "P"
96			MENUITEM "Zaznacz Wszystko" ID 10004 "S"
97			MENUITEM SEPARATOR
98			MENUITEM "Klawiatura" ID 10006 "K"
99			MENUITEM "Pomoc Graffiti" ID 10007 "G"
100		END
101		PULLDOWN "Pomoc"
102		BEGIN
103			MENUITEM "Wskazowki" ID 1000 "W"
104			MENUITEM "O Programie" ID 1001 "O"
105		END
106	END
107	
108	//Okienka z wiadomościami:
109	ALERT ID 1000 ERROR
110	BEGIN
111		TITLE "Błąd Uruchamiania"
112		MESSAGE "Ten program wymaga nowszej wersji systemu - co najmniej Palm OS 3.5."
113		BUTTONS "OK"
114	END
115	
116	ALERT ID 1001 WARNING
117	BEGIN
118		TITLE "Brak Danych"
119		MESSAGE "Nie wprowadzono poprawnej wartosci wkladu poczatkowego."
120		BUTTONS "OK"
121	END
122	
123	ALERT ID 1002 WARNING
124	BEGIN
125		TITLE "Brak Danych"
126		MESSAGE "Nie wprowadzono danych dotyczacych przeplywow pienieznych."
127		BUTTONS "OK"
128	END
129	
130	//Bitmapy:
131	BITMAP ID 4000 COMPRESS
132	BEGIN
133		BITMAP "Bitmap_IRR_4bpp.bmp" BPP 4 TRANSPARENTINDEX 0
134		BITMAP "Bitmap_IRR_4bpp_hd.bmp" BPP 4 TRANSPARENTINDEX 0 DENSITY 144
135	END
136	
137	//Ikony:
138	ICON ID 1000
139	COMPRESS
140	BEGIN
141	BITMAP "Icon_1bpp.bmp" BPP 1
142	BITMAP "Icon_8bpp.bmp" BPP 8 TRANSPARENTINDEX 0
143	BITMAP "Icon_1bpp_hd.bmp" BPP 1 DENSITY 144
144	BITMAP "Icon_8bpp_hd.bmp" BPP 8 TRANSPARENTINDEX 0 DENSITY 144
145	END
146	
147	SMALLICON ID 1001
148	COMPRESS
149	BEGIN
150	BITMAP "SmallIcon_1bpp.bmp" BPP 1
151	BITMAP "SmallIcon_8bpp.bmp" BPP 8 TRANSPARENTINDEX 0
152	BITMAP "SmallIcon_1bpp_hd.bmp" BPP 1 DENSITY 144
153	BITMAP "SmallIcon_8bpp_hd.bmp" BPP 8 TRANSPARENTINDEX 0 DENSITY 144
154	END
155	
156	//Opisy aplikacji:
157	VERSION "1.0"

Przypisy

[1] Firma RNS::, więcej informacji na oficjalnej stronie: http://www.ranosoft.net/

[2] [Informatyka ekonomiczna, s. 160]

[3] Więcej informacji o wewnętrznej stopie zwrotu, a także przykład zastosowania aplikacji obliczającej tę wartość znajduje się w punkcie „Praktyka tworzenia aplikacji”.

[4] [Dyskonto, s. 23]

[5] Od angielskiego personal digital assistantcyfrowy asystent osobisty.

[6] [Informatyka: słownik encyklopedyczny, hasło „użytkownicy ruchomi”]

[7] [Informatyka: słownik encyklopedyczny, hasło „palmtop”]

[8] [http://encyklopedia.pwn.pl/haslo.php?id=3953618 , hasło „palmtop”, 3 września 2008]

[9] [Informatyka: słownik encyklopedyczny, hasło „PDA”]

[10] Fakt: powstaje takich urządzeń coraz więcej; jednak nie było to regułą w chwili powstania słownika.

[11] [http://encyklopedia.pwn.pl/haslo.php?id=3955355 , hasło „PDA”, 3 września 2008]

[12] Od angielskiego personal information managerzarządca informacji osobistych.

[13] Szczegółowe informacje w podpunkcie 2.2.

[14] Lub modułów innych systemów sieci komórkowych, np. CDMA.

[15] Szczegółowe informacje w punkcie 3.

[16] Szczegółowe informacje w podpunkcie 1.3.

[17] [Palm OS programming bible, s. 4 i 5]

[18] [http://www.britannica.com/EBchecked/topic/130429/computer/ , hasło „computer”, 5 września 2008]

[19] [http://www.britannica.com/EBchecked/topic/30632/Apple-Inc/ , hasło „Apple Inc.”, 5 września 2008]

[20] [Palm programming: the developer's guide, r. 1 p. 1]

[21] [Programming Microsoft Windows CE, wprowadzenie]

[22] Więcej informacji na stronie producenta: http://www.microsoft.com/windowsmobile/

[23] Więcej informacji na stronie producenta: http://www.palm.com/us/products/smartphones/

[24] Więcej informacji na stronie producenta: http://www.symbian.com/phones/

[25] Więcej informacji na stronie producenta: http://www.blackberry.com/

[26] Więcej informacji na stronie producenta: http://www.apple.com/iphone/

[27] [Professional Palm OS programming, s. 2]

[28] [Programming Microsoft Windows CE, r. 11 p. 3]

[29] CDMA – standard sieci komórkowych popularny głównie w Ameryce Północnej i Południowej.

[30] [Informatyka dla ekonomistów: studium teoretyczne i praktyczne, s. 352 i 353]

[31] [Palm OS programming bible, s. 5]

[32] [Palm OS Programmer's Companion, tom I, r. 1]

[33] Ponadto, w każdej chwili można dokonać restartu urządzenia, który powoduje ponowne załadowanie systemu operacyjnego, jednak nie jest to czynność typowa – wykonuje się ją przede wszystkim w przypadku awarii urządzenia lub oprogramowania.

[34] [Professional Palm OS programming, s. 12]

[35] [Palm OS Platform Developer Guide. Software and Hardware, r. 9, p. 4]

[36] Wyjątkiem są palmtopy zintegrowane z telefonem komórkowym, np. Palm Treo, które posiadają wbudowaną klawiaturę (w standardowym układzie „qwerty”). Wraz z ewolucją palmtopów w stronę urządzeń hybrydowych, można się spodziewać zwiększenia odsetka urządzeń z klawiaturą.

[37] Oprogramowanie autorskie firmy Palm obecne w palmtopach tejże firmy od samego początku.

[38] [Palm OS programming bible, s. 133]

[39] [Palm OS programming bible, s. 16]

[40] [Palm OS Programmer's Companion, tom I, r. 1]

[41] Szczegółowe informacje w podpunkcie 3.3.

[42] Angielskie słowo oznaczające przewód, łącze.

[43] A wręcz szybszymi, jak wykazano w podpunkcie 2.1.

[44] [Programming Microsoft Windows CE, r. 8]

[45] [Palm OS programming bible, s. 16]

[46] Szczegółowe informacje w podpunkcie 2.4.

[47] Więcej informacji na stronie producenta: http://www.freescale.com/

[48] [Professional Palm OS programming, s. 271 i 272]

[49] Więcej informacji na stronie producenta: http://infocenter.arm.com/

[50] [Professional Palm OS programming, s. 271 i 272]

[51] Od angielskiego Palm Application Compatibility Environmentśrodowisko kompatybilności aplikacji.

[52] Szczegółowe informacje w podpunkcie „Interfejs programowania aplikacji (API)”.

[53] [Programming Microsoft Windows CE, r. 14]

[54] [Programming Microsoft Windows CE, r. 6]

[55] [Palm OS Platform Developer Guide. Software and Hardware, r. 9, p. 8]

[56] Od angielskiego execute in placewykonuj w miejscu.

[57] [Palm OS Platform Developer Guide. Software and Hardware, r. 9, p. 8]

[58] Jedynym wyjątkiem pośród palmtopów platformy Palm jest urządzenie „LifeDrive” wyposażone w dysk twardy o pojemności 4 GB. Dzięki technologii „Microdrive”, posiadającej interfejs w standardzie „Compact Flash”, dysk ten funkcjonuje na zasadach podobnych do kart pamięci, a więc traktowany jest jako pamięć zewnętrzna, pomimo że fizycznie na stałe znajduje się wewnątrz urządzenia.

[59] [Palm OS Programmer's Companion, tom I, r. 5]

[60] Szczegółowe informacje w podpunkcie „Interfejs programowania aplikacji (API)”.

[61] [Palm OS Programmer's Companion, tom I, r. 6]

[62] Więcej informacji na stronie producenta: http://kb.palm.com/ , numer artykułu: 35222.

[63] [Palm OS Platform Developer Guide. Software and Hardware, r. 9, p. 8]

[64] [Palm OS Platform Developer Guide. Software and Hardware, r. 9, p. 8]

[65] W rzeczywistości nie białe, lecz szarozielone – taki był kolor wygaszonej matrycy.

[66] Poszczególne barwy uzyskiwane poprzez kombinacje kolorów: czerwonego, zielonego i niebieskiego.

[67] Szczegółowe informacje w podpunkcie 2.2.

[68] [Professional Palm OS programming, s. 12]

[69] Więcej informacji na stronie twórców standardu: http://www.pcmcia.org

[70] Szczegółowe informacje w podpunkcie 3.2.

[71] [http://encyklopedia.pwn.pl/haslo.php?id=3878478 , hasło „Bluetooth”, 30 września 2008]

[72] Więcej informacji na stronie producenta: http://www.garmin.com

[73] [http://encyklopedia.pwn.pl/haslo.php?id=3907249 , hasło „GPS”, 30 września 2008]

[74] Szczegółowe informacje w podpunkcie „Procesor i procesy”.

[75] Ang. forms-based development tools – szczegółowe informacje w podpunkcie 2.1.

[76] [Wprowadzenie do języka C, s. 7]

[77] [Wprowadzenie do języka C, s. 7]

[78] Szczegółowe informacje w podpunkcie 2.4.

[79] Szczegółowe informacje w podpunkcie 1.2.

[80] [Palm programming: the developer's guide, r. 1 p. 1]

[81] [Informatyka: słownik encyklopedyczny, hasło „API”]

[82] Szczegółowe informacje w punkcie „Specyfikacja techniczna”.

[83] [Unix network programming: networking APIs: Sockets and XTI, s. 57]

[84] [http://www.palm.com/]

[85] Produkcją urządzeń platformy Palm zajmują lub zajmowały się m.in. następujące firmy: Palm, Handspring, Sony, Tapwave, Kyocera, Garmin, Samsung, IBM.

[86] Swego czasu popularne w Polsce procesory i386 i i486 firmy Intel posiadały opcję współpracy z koprocesorem numerycznym, a rodzina procesorów Intel Pentium posiadała już zestaw instrukcji zmiennoprzecinkowych w standardzie. W przypadku komputerów Apple, integracja CPU z FPU nastąpiła wraz z wprowadzeniem procesorów MC68040 firmy Motorola.

[87] Ang. codec – koder-dekoder, program przeznaczony do kompresji i dekompresji strumienia danych.

[88] W praktyce obsługiwana jest tylko liniowa kompresja obrazu polegająca na kodowaniu długości serii.

[89] [Palm OS Programmer's Companion, tom I, r. 1]

[90] Firmę Metrowerks w 1999 r. wykupiła firma Motorola, ta natomiast w wyniku wydzielenia mniejszych jednostek w 2003 r. przekazała projekt CodeWarrior w ręce powstałej firmy Freescale Semiconductor.

[91] Oficjalna premiera środowiska miała miejsce na konferencji „Worldwide Developers Conference” firmy Apple w maju 2004 r.

[92] Więcej informacji na stronie producenta: http://www.freescale.com/codewarrior

[93] Więcej informacji na stronie twórców środowiska: http://www.eclipse.org/

[94] Szczegółowe informacje w podpunkcie 2.2.

[95] Więcej informacji na stronie producenta: http://www.massena.com/darrin/pilot/asdk/

[96] Więcej informacji na stronie producenta: http://www.hewgill.com/pilot/jump/

[97] Więcej informacji na stronie producenta: http://www.nsbasic.com/palm

[98] Więcej informacji na stronie producenta: http://www.pocketsmalltalk.com

[99] Więcej informacji na stronie producenta: http://www.winsoft.sk/pstudio.htm

[100] Więcej informacji na stronie producenta: http://www.hotpaw.com/rhn/hotpaw

[101] Więcej informacji na stronie producenta: http://www.sourceforge.net/projects/onboardc/

[102] Więcej informacji na stronie producenta: http://www.ppcompiler.org/

[103] Więcej informacji na stronie producenta: http://www.quartus.net/

[104] Szczegółowe informacje w podpunkcie 2.1.

[105] Szczegółowe informacje w podpunkcie 2.1.

[106] W późniejszym czasie powstała także wersja dla systemu Microsoft Windows.

[107] Więcej informacji na stronie producenta: http://www.cygwin.com/

[108] [Palm OS programming bible, s. 58]

[109] Aplikacja zlokalizowana charakteryzuje się tym, że posiada różne wersje językowe.

[110] Szczegółowe informacje w podpunkcie „Powiązanie z komputerem stacjonarnym”.

[111] [Informatyka dla ekonomistów: studium teoretyczne i praktyczne, s. 209 i 214]

[112] [Informatyka: słownik encyklopedyczny, hasło „program uruchomieniowy”]

[113] Szczegółowe informacje w podpunkcie 2.1.

[114] Szczegółowe informacje w podpunkcie 2.1.

[115] Emulator to programowanie duplikujące funkcje jednego systemu operacyjnego w innym.

[116] [Professional Palm OS programming, s. 117]

[117] W związku z tym, aplikacje napisane w zgodności z procesorami „Motorola 68000” działają na symulatorze tak samo jak na emulatorze, natomiast aplikacje posiadające kod dla procesorów „ARM”, celem uruchomienia na symulatorze, muszą go mieć dodatkowo skompilowanego dla docelowej platformy symulatora.

[118] [Palm OS programming bible, s. 846]

[119] Konstrukcja ta umożliwia zdefiniowanie w jaki sposób obsłużyć wyjątek (ostrzeżenie o nieprawidłowym działaniu oprogramowania), jeśli zostanie on zgłoszony w danym fragmencie kodu.

[120] [Professional Palm OS programming, s. 147]

[121] Nazwa tej funkcji związana jest ze słowami „Pilot” oraz „Palm Pilot”, którymi firma Palm określała swoje pierwsze komputery kieszonkowe.

[122] Szczegółowe informacje w podpunkcie „Podstawowe oprogramowanie”.

[123] Kompletny wykaz znajduje się w [Palm OS Programmer's API Reference, r. 1].

[124] Np. w podpunktach „Rodzaje i organizacja pamięci” oraz „Funkcjonowanie kompilatorów i konsolidatorów”.

[125] Szczegółowe informacje w podpunkcie „Funkcjonowanie kompilatorów i konsolidatorów”.

[126] Szczegółowe informacje w podpunkcie „Podstawowe oprogramowanie”.

[127] Jedynym wyjątkiem jest urządzenie Handspring Treo 600 pracujące w standardowej rozdzielczości.

[128] Przykład projektu specjalistycznej aplikacji dla platformy Palm znajduje się w podpunkcie 2.2.

[129] Szczegółowe informacje w podpunkcie 3.2.

[130] Szczegółowe informacje w podpunkcie 3.2.

[131] [Palm OS programming bible, s. 56]

[132] Szczegółowe informacje w podpunkcie 1.2.

[133] [Ekonomika informacji, s. 13]

[134] [Ekonomika informacji, s. 215]

[135] [Finanse firm: długoterminowe zarządzanie finansami, s. 90]

[136] [Dyskonto, s. 21]

[137] [Dyskonto, s. 23]

[138] [Palm programming: the developer's guide, r. 1 p. 1]

[139] Takie przełączanie się między aplikacjami jest w systemie Palm OS czynnością niezwykle prostą i całkowicie naturalną, co zostało uzasadnione w podpunkcie „Podstawowe oprogramowanie”.

[140] [Ochrona programu komputerowego w nowym prawie autorskim, s. 64]

[141] Od angielskiego IRR calculatorkalkulator wewnętrznej stopy zwrotu.

[142] Szczegółowe informacje w podpunkcie 1.2.

[143] Gdyby ponadto pole tekstowe posiadało więcej niż jeden wiersz, należy spełnić jeszcze trzeci postulat: dodania i obsługi pionowych pasków przewijania (system Palm OS nie obsługuje pasków poziomych).

[144] Szczegółowe informacje w podpunkcie „Interfejs użytkownika”.

[145] Szczegółowe informacje w podpunkcie 2.4.

[146] Wyprowadzenie opisywanego wzoru oraz sposób jego zastosowania przedstawiono w podpunkcie 2.4.

[147] Zalecenie zastosowania mechanizmu zapisującego i odtwarzającego stan aplikacji zostało przedstawione w podpunkcie „Podstawowe oprogramowanie”.

[148] Pozostałe (wchodzące w skład grupy „Edycja”) obsługiwane są przez system operacyjny – szczegółowe informacje w podpunkcie 2.3.

[149] W przypadku opisywanej formatki zdarzenie to zawsze dotyczy opisywanego pola listy, gdyż jest to jedyne pole tego typu, jednak dobrą praktyką jest właśnie takie upewnienie się że tak rzeczywiście jest.

[150] Szczegółowe informacje w podpunkcie 2.3.

[151] Ostatni element pola „Przepływy pieniężne” nie może zostać usunięty, gdyż służy do dodawania nowych okresów do listy – szczegółowe informacje w podpunkcie 2.3.

[152] Obliczenie wartości IRR następuje wskutek przyrównania wartości NPV do zera, co wyjaśniono i uzasadniono w podpunkcie 2.1.

[153] Zabezpieczenie to pozostawiono, pomimo że w przypadku opisywanej aplikacji taka sytuacja nigdy nie wystąpi, ze względu na warunki kończące pętle w funkcji CountIRR.

[154] Annuitety są to raty o jednakowej wysokości dla każdego okresu spłaty, najczęściej roku.

[155] Wartość ta została podana na podstawie zliczenia ilości wykonanych obliczeń wartości NPV przez odpowiednio zmodyfikowaną wersję programu „IRRcalc”.

[156] [Ochrona programu komputerowego w nowym prawie autorskim, s. 64 i 65]

[157] Od angielskiego business to businessprzedsiębiorstwo dla przedsiębiorstwa.

[158] [Informatyka dla ekonomistów: studium teoretyczne i praktyczne, s. 352]

[159] [Informatyka dla ekonomistów: studium teoretyczne i praktyczne, s. 351]

[160] Od angielskiego business to consumerprzedsiębiorstwo dla konsumenta.

[161] [Ochrona programu komputerowego w nowym prawie autorskim, s. 64]

[162] Na przykład jeśli firma posiada już swój serwis internetowy, koszty transferu oprogramowania (a zatem powielania i dystrybucji) zwykle wliczone są w cenę abonamentu za hosting.

[163] [Marketing internetowy, s. 17]

[164] [Inżynieria systemów informatycznych w e-gospodarce, s. 21]

[165] Definicja w podpunkcie 3.2.

[166] [e-Commerce, s. 348]

[167] [Marketing w Internecie: jak najlepiej wykorzystać sieć w sprzedaży produktów i usług?, s. 280-286]

[168] Definicja w podpunkcie 3.2.

[169] Od angielskiego electronic software distributorelektroniczny dystrybutor oprogramowania.

[170] [e-Commerce, s. 129]

[171] [e-Commerce, s. 143]

[172] Więcej informacji w [Inżynieria systemów informatycznych w e-gospodarce, s. 23].

[173] [Inżynieria systemów informatycznych w e-gospodarce, s. 24]

[174] [Inżynieria systemów informatycznych w e-gospodarce, s. 25]

[175] [Inżynieria systemów informatycznych w e-gospodarce, s. 23]

[176] [http://www.precentral.net/palm-ceo-ed-colligan-talks-pre-investors]

[177] Był to model Palm Treo 700w zaprezentowany 26 września 2005 r. na wspólnej konferencji prasowej m.in. dyrektorów generalnych firm Palm (Ed Colligan) i Microsoft (Bill Gates), który trafił do sprzedaży z początkiem roku 2006 i zapoczątkował serię podobnych urządzeń.

Prawa autorskie

Autor niniejszej publikacji zastrzega sobie prawa autorskie i prawa własności (z wyłączeniem praw osób trzecich – autorów tekstów, fotografii, oprogramowania, itp., którym prawa autorskie przysługują). Wykorzystywanie materiałów znajdujących się na stronie (zwłaszcza powielanie, tłumaczenie) w celach komercyjnych jest zabronione. Wszelkie wykorzystywanie zawartych na stronie treści wymaga wcześniejszej pisemnej zgody autora.

Copyright © 2008-2009, Radosław Nowak