praca dyp._stec
Transkrypt
praca dyp._stec
Politechnika Opolska Wydział Elektrotechniki, Automatyki i Informatyki Instytut Układów Elektromechanicznych i Elektroniki Przemysłowej PRACA DYPLOMOWA Studia pierwszego stopnia stacjonarne Informatyka REALIZACJA PARSERA WYRAŻEŃ MATEMATYCZNYCH NA PLATFORMIE ANDROID Pracę wykonał: Wojciech STEC nr albumu: Promotor: dr inż. Grzegorz Paweł Korbaś Opole, grudzień 2011 1 REALIZACJA PARSERA WYRAŻEŃ MATEMATYCZNYCH NA PLATFORMIE ANDROID STRESZCZENIE W pracy przedstawiony został opis realizacji oraz sposób działania parsera wyrażeń matematycznych, na podstawie programu oraz biblioteki własnego autorstwa, napisanych w języku Java oraz skompilowanych pod platformę mobilną Google Android. Program, który można uruchomić wyłącznie na wirtualnej maszynie Javy działającą na platformie Google Android jest tylko nakładką graficzną, zawierającą edytor wyrażeń matematycznych oraz klawiaturę numeryczną, na bibliotekę, która pełni tutaj tak naprawdę główną rolę całego systemu i jest w pełni przenośna na każdą platformę oraz system operacyjny. PARSER IMPLEMENTATION OF MATHEMATICAL EXPRESSIONS ON ANDROID PLATFORM SUMMARY This document presents a description and how work the mathematical expression parser based on the program and the library own authorship, written in Java and compiled into Google Android platform. A program that can be run exclusively on a Java virtual machine running on Google's Android platform is just a graphical frontend to the library, which serves here as a really key role the entire system and is fully portable to any platform and operating system. 2 1. CEL I ZAKRES PRACY Celem pracy jest stworzenie programu oraz biblioteki na mobilną platformę Android, wykonywujących podane przez użytkownika dane wejściowe oraz wyświetlenie wyniku w postaci graficznej, jak i listy kolejnych, wykonanych obliczeń. Dane nie muszą być prawidłowym wyrażeniem matematycznym, ponieważ jedną z dodatkowych funkcji biblioteki jest znalezienie oraz zaznaczenie użytkownikowi popełnionych błędów. Biblioteka programu będzie całkowicie napisana w języku Java, dzięki czemu będzie między-platformowa i będzie można ją umieszczać w projektach napisanych dla każdego systemu operacyjnego (mającego zainstalowaną maszynę wirtualną Javy). Zostanie ona w przyszłości udostępniona innym programistom wraz z jej specyfikacją, dzięki czemu będą ją mogli implementować w swoich projektach. Program będzie komunikował się z biblioteką w celu przesłania jej wpisywanych przez użytkownika wyrażeń, a w zamian będzie oczekiwał zwrócenie graficznej interpretacji wyrażenia zawierającej wyniku (w przypadku, gdy wyrażenie będzie skończone oraz prawidłowe), wskazania ewentualnych miejsc, w których znajdują się błędy oraz osobnej tablicy, zawierającej listę kolejnych wykonanych obliczeń. 3 2. WSTĘP W dzisiejszych czasach rozwiązanie skomplikowanych obliczeń łatwiej jest wykonać za pomocą kalkulatorów, niż pisemnie za pomocą kartki oraz długopisu. Istnieją różne rodzaje kalkulatorów, od tych popularnych, służących do domowego użytku zawierających jedynie cztery podstawowe typy działań – dodawanie, odejmowanie, mnożenie i dzielenie, aż do naukowych, zawierające możliwość wykonywania skomplikowanych działań czy wykresów obliczonych funkcji. Brakowało do tej pory klasyfikacji innego typu kalkulatorów, a mianowicie wyświetlającego kroki wykonanych działań. Jest to opcja przydatna szczególnie uczniom (oraz w niektórych wypadkach studentom), którzy korzystają z kalkulatora jako narzędzia do rozwiązywania całości zadań bez znajomości podstawowych zasad matematycznych, takich jak chociażby kolejność wykonywania działań, czy wzory skróconego mnożenia. Właśnie z powodu największego zainteresowania takim typem programów przez osoby uczące się, można by bez problemu taki typ programu nazwać Szkolnym. Autor nie spotkał z żadnym urządzeniem, które mogłoby obliczać samodzielnie wyrażenia, prawdopodobnie z powodu ilości pamięci instalowanych w dotychczas znanych urządzeniach typu kalkulator. Istnieją już natomiast strony internetowe, umożliwiające wykonywanie takich działań. Niestety tutaj pojawia się problem mobilności, ponieważ do obsługi tych stron potrzebne jest połączenie z Internetem, a co najważniejsze – posiadanie komputera, co wyklucza całkowicie mobilność. Można by skorzystać z laptopa – wtedy o mobilności możemy mówić, lecz takie rozwiązanie będzie nieodpowiednie dla uczniów, próbujących wykonywać obliczenia na lekcjach w szkole. Istniejące na rynku Smartfony w teorii mogły by umożliwiać otwieranie takich stron w swoich przeglądarkach Internetowych, lecz są one napisane w różnych językach programowania (jak np. Java), do obsługi których nawet telefony potrzebują specjalnych wtyczek (ang. Plug-ins). Można się natknąć na aplikacje pośredniczące w przekazywaniu wpisanych przez użytkownika wyrażeń do aplikacji Internetowej, lecz tutaj pojawia się problem z połączeniem Internetowym, które nie zawsze jest dostępne, a nawet jeśli, to odebranie wyniku może wiązać się z dosyć dużymi dodatkowymi kosztami. Najlepszym w tym wypadku rozwiązaniem jest program, który umożliwia wykonywanie większości problemów matematycznych bez konieczności połączenia z Internetem, na urządzeniu o niewielkich rozmiarach i bez potrzeby korzystania z ogromnej ilości pamięci i działający na wszystkich dotychczas wyprodukowanych urządzeniach mobilnych i udostępniający dodatkowe funkcjonalności dla programistów tworzących podobne rozwiązania. 4 3. Narzędzia i środowisko programistyczne W niniejszym rozdziale zostały opisane wykorzystane narzędzia programistyczne wraz z językiem programowania oraz środowiskiem uruchomieniowym pisanych aplikacji. Autor niniejszej pracy nie miał wyboru języka programowania pod Android, ponieważ Java jest jedynym oficjalnym językiem. Wszelkie programy uruchamiane na systemie Android są uruchamiane w osobnych wirtualnych maszynach, które interpretują jedynie język Java. Istnieją już oczywiście próby napisania aplikacji, którą będzie tłumaczyła kod napisany w innym języku na kod Javy, a następnie na język wirtualnej maszyny1, lecz jeżeli sama Java jest wolna, to takie rozwiązanie będzie katastrofą. W każdym razie, takie rozwiązania nie są wspierane przez Google, twórcę systemu Android. Zanim będzie możliwość zainstalowania niżej wymienionych narzędzi, należy zaopatrzyć się w JDK (ang. – Java Development Kit) w wersji co najmniej 5, którą można pobrać z oficjalnej strony Sun Java2. Pakiet ten jest potrzebny, ponieważ wszystkie narzędzia napisane zostały właśnie w tym języku, w przeciwnym wypadku nie będziemy mogli zainstalować żadnego z nich. 3.1. Android SDK Android SDK (ang. – Software Development Kit) jest jednym z podstawowych narzędzi, które należy zainstalować przed rozpoczęciem pracy z programem Eclipse i pisaniem aplikacji pod system Android. Znajduje się tam między innymi odpowiedni kompilator, dzięki któremu będzie możliwe uruchomienie aplikacji w jej naturalnym środowisku. Instalacja i konfiguracja tego pakietu sprowadza się jedynie do pobrania jego pliku instalacyjnego (lub spakowanego archiwum) z oficjalnej strony oprogramowania3 i uruchomienie go. 3.2. Eclipse Eclipse jest platformą typu framework napisaną w języku Java, którą można uruchomić na praktycznie każdym systemie operacyjnym, posiadającym zainstalowaną wirtualną maszynę Java (która rozpowszechniana w tym momencie jest na prak1 http://gphone.pl/artykuly/jesli-nie-java-to-co-czyli-inne-jezyki-programowania-na-platofrme-android/ http://www.oracle.com/technetwork/java/javase/downloads/index.html 3 http://developer.android.com/sdk/index.html 2 5 tycznie każdym systemie operacyjnym). Schemat aplikacji został przedstawiony na Rysunku 3.1. Rys. 3.1. Schemat interfejsu aplikacji Eclipse Sama aplikacja nie dostarcza żadnych narzędzi służących do tworzenia kodu i budowania aplikacji, oferuje jednak obsługę Pluginów (pol. – wtyczki) rozszerzających jej funkcjonalność, umożliwiających m.in. rozwijanie aplikacji w językach Java, C/C++, PHP, tworzenie GUI (ang. – Graphical User Interface, pol. – Graficzny Interfejs Użytkownika) i wiele innych. Deweloperzy zadbali o to, aby aplikacja była dostarczona w takiej formie, jakiej użytkownicy od niej oczekują, a mianowicie przygotowane są odpowiednie paczki instalacyjne zawierające wszystkie potrzebne narzędzia do rozpoczęcia pracy z wybranym językiem programowania, takie jak kompilatory i sprawdzanie poprawności kodu. Dla celów pisania niniejszej pracy, autor pobrał z oficjalnej strony internetowej projektu Eclipse wersję programu Eclipse IDE for Java Developers, która standardowo zawiera wszelkie wtyczki potrzebne do pisania aplikacji w języku Java. Środowisko jest gotowe do pisania aplikacji w języku Java, lecz pod systemy desktopowe. W celu rozpoczęcia pracy nad tworzeniem oprogramowania pod system mobilny Android, należy pobrać dodatkowy plugin ADK (ang. – Android Development Kit), który znacznie ułatwia pisanie takich aplikacji, ponieważ posiada m.in. narzędzia do debugowania (ang. – debugging, pol. – odrobaczanie, tutaj: usuwanie błędów) oraz do tworzenia graficznego interfejsu użytkownika. Aby przystąpić do pobrania ADK, należy w programie Eclipse otworzyć menu Help i wybrać opcję Install New Software... . W nowym oknie, w polu Work with: należy wpisać adres internetowy4 do pluginu ADK i zatwierdzić klawiszem Enter. Po chwili zostanie pobrana lista oprogramowania dostępnego pod podanym adresem internetowym (taka, jak widoczna na rysunku 3.2). 4 http://dl-ssl.google.com/android/eclipse/ 6 Rys. 3.2. Lista pluginów oraz ich wersji dostępnych do pobrania, znajdujących się pod wpisanym adresem serwera internetowego Po zakończeniu pobierania najlepiej zrestartować program Eclipse, a po ponownym uruchomieniu skonfigurować odpowiednio pobrane wtyczki. Aby to zrobić, należy w menu Window wybrać opcję Preferences i w sekcji Android wpisać ścieżkę do zainstalowanego SDK Androida w polu SDK Location. 3.3. Język programowania Java Zorientowany obiektowo język programowania stworzony w firmie Sun Microsystem (przejęta przez Oracle w 2010 roku) pod kierunkiem Jamesa Goslinga i opublikowany w 1995 roku wraz z JVM (ang. – Java Virtual Machine, pol. – Maszyna Wirtualna Java). Większość elementów składni języka zaczerpnięto z C++5, a rozwiązania takie jak maszyna wirtualna czy automatyczne zwalnianie pamięci z Smalltalk6. Od początku firma Sun wyznaczyła najważniejsze cechy Javy jako platformy: powinien być prosty w użyciu, z "przyjazną" składnią , powinien bezpieczny i "solidny" , powinien być neutralny architektonicznie i łatwy w rozszerzeniu , powinien zapewniać wysoką wydajność , powinien być interpretowany, wielowątkowy i dynamiczny. Język rzeczywiście posiada uproszczoną w stosunku do C++ składnię. Zrezygnowano też z dualnego dostępu do zmiennych - przez wartość i przez referencję, na rzecz przekazywania obiektów przez referencję. Język nie wspiera przeciążania operatorów (choć operator + został przeciążony dla klasy String ) ani nie umożliwia tworzenia własnych. Jednocześnie na obecnym etapie rozwoju programista ma do dyspozycji mechanizm adnotacji czy typy generyczne. Java jest językiem zorientowanym obiektowo, ponieważ poza typami obiektowymi posiada też typy proste reprezentujące liczby całkowite, zmiennopozycyjne, wartości logiczne i pojedyncze znaki. W wersji 1.5 7 języka wprowadzono mechanizm auto-boxingu, który pozwala na swobodne mieszanie typów prostych i ich obiektowych odpowiedników, a to dzięki zamianie typów prostych na obiektowe w trakcie kompilacji. 5 http://pl.wikipedia.org/wiki/C%2B%2B http://pl.wikipedia.org/wiki/Smalltalk 7 http://www.oracle.com/technetwork/java/javase/releasenotes-136954.html 6 7 Java udostępnia kilka mechanizmów zabezpieczających programistów przed popularnymi błędami. Pierwszym z nich jest automatyczne zwalnianie pamięci. Programista jest dzięki temu "zwolniony" z dbania o usuwanie nieużywanych obiektów. Nie oznacza to jednak, że nie można spowodować wycieku pamięci. Drugim jest silne typowanie oraz konieczność dostarczenia wszystkich użytych klas w czasie kompilacji. Kolejnym jest sposób obsługi wyjątków i wydzielenie grupy wyjątków weryfikowalnych, które muszą zostać obsłużone przez programistę. Ostatnim istotnym elementem jest tzw. security policy (pol. – polityka bezpieczeństwa) czyli zestaw reguł pozwalających na definiowanie dostępnych i zabronionych działań dla programów na danej JVM. Java była reklamowana hasłem "napisz raz uruchom wszędzie" (ang. – Write once, run anywhere8, WORA). Rzeczywistą zaletą jest rozgraniczenie elementów platformy systemowej i elementów dostępnych w języku bez konieczności wywołań systemowych. Ograniczyło to ilość kodu, który trzeba implementować w zależności od platformy. Teoretycznie prosta implementacja JVM powinna wymagać tylko systemowej I/O (ang. – Input / Output, pol. – Wejście / Wyjście), lecz w praktyce implementowane są również niektóre operacje, takie jak Math.sqrt(). Początkowo Java była uważana za język prosty, ale powolny i zasobochłonny. Jednakże kolejne modyfikacje oraz wprowadzenie kompilatora JIT9 (ang. – Just In Time) spowodowało, że Java stała się językiem w którym niektóre problemy mogą zostać rozwiązane szybciej niż w C, jednak nadal Java nie należy do najszybciej interpretowanych języków w informatyce. System Android został tak naprawdę wyposażony w maszynę wirtualną Da10 lvik , a nie tak jak na innych systemach – JVM. Dalvik jest zbudowany w bardzo podobny sposób, co JVM, lecz używa innej składni kodu bytowego. Jest ona napisana tak, aby działała prawidłowo na urządzeniach z małą ilością pamięci RAM oraz słabymi procesorami, aby płynność wczytywania i działania takich aplikacji nie odbiegała zbyt daleko od tych, które są pisane pod komputery klasy PC. Taki stan rzeczy nie podoba się firmie Oracle, aktualnemu właścicielowi Javy która twierdzi (zresztą słusznie), iż Google pozbawiło jego produkt przenośności i wieloplatformości, ponieważ aplikacji napisanych pod Android nie można uruchomić na żadnym innym urządzeniu, posiadającym JVM. 3.4. System operacyjny Android Google Android jest otwartym systemem operacyjnym dla urządzeń mobilnych, w chwili obecnej również tabletów, stworzony przez firmę Google. Jest to system bardzo młody, ponieważ pierwsza oficjalna wersja tego systemu została wydana 30 kwietnia 2009 roku. W Polsce pierwsze aparaty pracujące pod jego kontrolą pojawiły się w tym samym roku. Mimo tego, system zyskuje dużą popularność, pojawia się coraz więcej wyposażonych w niego urządzeń. Według raportu11 przygotowanego 8 http://java.sun.com/docs/white/platform/javaplatform.doc1.html http://pl.wikipedia.org/wiki/JIT_(informatyka) 10 [15] Dalvik Virtual Machine. [Dostęp 17 grudnia 2011] 11 https://www.npd.com/press/releases/press_100510.html 9 8 przez Grupę NPD, w 2010 roku udział Androida w rynku telefonów klasy smartphone wynosi 28% i jest większy niż udział iPhone’a (21%), natomiast w lipcu 2011 roku urządzeń z systemem od Google na rynku jest aż 42%12. System Android składa się z kilku warstw, które przedstawione są na Rysunku 3.3. Został on zbudowany na bazie systemu Linux. Jądro z gałęzi 2.6 (wszystkie dotychczas oficjalnie wydane wersje systemu Android) zostało wzbogacone m.in. o zaawansowany mechanizm komunikacji międzyprocesorowej, sterowniki specyficzne dla telefonów oraz obsługę sieci GSM. Na tym systemie zainstalowano wirtialną msazynę Dalvik, która jest wersję zoptymalizowaną na systemy mobilne wirtualnej maszyny Javy. Maszyna Dalvik jest tak napisana, aby na urządzeniu mogło efektywnie pracować wiele kopii tej maszyny. Rys. 3.3. Architektura systemu Android. Źródło : http://developer.android.com/ System Android to także zbiór bibliotek i interfejsów programistycznych13, które mogą wykorzystywać deweloperzy aplikacji. Framewrok dostarczony wraz z systemem daje dostęp do wielu elementów systemu takich jak informacje o urządzeniu, lokalizacji, alarmów czy powiadomień. System Android to w końcu zbiór aplikacji. Aplikacje dystrybuowane są w formie pakietów .apk. Aplikacje pisane są w języku Java i uruchamiane w osobnych procesach w maszynach wirtualnych Dalvik. Jeżeli chodzi o architekturę, to aplikacje są tak naprawdę zbiorami komponentów, które są zarządzane przez system. Z punktu widzenia standardowej aplikacji najważniejszymi z tych komponentów są tzw. Activities. Activiity może być rozumiane 12 13 http://myapple.pl/content/1923-udzial-ios-w-rynku-mobilnych-systemow-rosnie-android-prowadzi.html http://developer.android.com/reference/packages.html 9 jako pojedynczy ekran widoczny dla użytkownika. To, co ma pojawić się w danym ekranie kontrolowane jest przez widoki (komponenty View). To Activity decyduje, który z widoków ma zostać wyświetlony na ekranie. Obiekty widoków stanowią podstawową jednostkę budującą interfejs użytkownika. Mogą być one zarówno formatkami takimi jak pole tekstowe, jak również całymi ekranami. Obiekty te można tworzyć zarówno w kodzie jak i przy pomocy szablonów. Tworzenie interfejsu użytkownika przypomina w tym drugim przypadku bardziej tworzenie stron HTML niż programowanie interfejsu w Javie znane z bibliotek takich jak Java Swing. Szablony te zapisywane są w plikach XML i dostępne są jako zasób w naszej aplikacji. Każda aplikacja musi posiadać plik Manifest, który służy do wyspecyfikowania z jakich komponentów składa się aplikacja, który z nich powinien zostać uruchomiony po włączeniu aplikacji oraz jakich specjalnych uprawnień wymaga aplikacja. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pl.weer.kalkulator" android:versionCode="4" android:versionName="0.2011.12.17"> <uses-sdk android:minSdkVersion="10" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name=".KalkulatorActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MyPreferences" android:label="@string/app_name" /> </application> </manifest> 10 4. Wirtualizacja środowiska Android Wirtualizacja środowiska Android jest potrzebna twórcy oprogramowania, który chce przetestować napisaną aplikację w różnych środowiskach systemu przy różnych konfiguracjach, nie posiadając fizycznych urządzeń spełniających jego wymagań. Twórca zazwyczaj posiada tylko jedno urządzenie, na którym testuje prawdziwe zachowanie aplikacji, ponieważ emulatory nigdy nie zastąpią prawdziwego połączenia telefonicznego, wysłania smsa czy połączenie z GPS. Za taki stan rzeczy odpowiada brak środków finansowych początkujących programistów oraz różnorodność urządzeń, które pojawiły się i wciąż pojawiają się na rynku. Każde z nich posiada inną rozdzielczość ekranu (także inny jego rozmiar co sprawia, że dwa ekrany o tych samych rozdzielczościach lecz o różnych wielkościach zupełnie inaczej są obsługiwane), inny procesor i wersję systemu operacyjnego. Okazuje się jednak, iż nie tylko z powodu braku odpowiednich urządzeń wykorzystuje się emulatory. Mogą się one także przydać podczas prezentacji napisanego oprogramowania, ponieważ nie wszystkie smartfony posiadają wyjścia cyfrowe wideo, a jeżeli już posiadają – to nie wszystkie urządzenia wyświetlające obraz posiadają odpowiednie wejścia cyfrowe. W urządzeniach z androidem stosuje się wyjścia HDMI typu D14, więc urządzenia wyświetlające muszą posiadać również wejście HDMI dowolnego typu (przy zastosowaniu tzw. przejściówki). Zestaw oprogramowania służącego do pisania programów na platformę Android zawiera między innymi emulator tego środowiska[5], który jest niestety bardzo powolny, co jest jego największym minusem. Jest on jednak bardzo dobrym rozwiązaniem dla programistów, którzy tworzą duże oprogramowanie, które docelowo powinno działać na wszelakiej maści urządzeniach o różnych rozdzielczościach ekranu, mocy procesorów oraz układach graficznych. Emulator ten pozwala utworzyć różne profile reprezentujące różne modele telefonów z ich indywidualnymi konfiguracjami oraz z różnymi wersjami systemu Android. Aktualnie obsługuje aplikacje napisane pod Android wersję 4.0.1 (najnowszy ROM). Kolejną metodą emulacji dowolnej wersji systemu Android znalezioną przez autora, jest pobranie odpowiedniego ROMu ze strony[6] i zainstalowanie go na dysku komputera, bądź na wirtualnej maszynie. Na podanej stronie znajdują się wersje systemu Android od 1.6 do 4.0.1, które zostały zoptymalizowane pod procesory x86 i są gotowe do zainstalowania na nich. Niektóre zostały przeportowane na odpowiedni sprzęt, np. na netbooki z rodziny ASUS Eee PC i ma standardowo zainstalowane wszystkie sterowniki, które są potrzebne do korzystania ze wszystkich funkcji tego systemu operacyjnego. Minusem tego rozwiązania jest to, iż nadal jest to wirtualna 14 [14] HDMI Micro Connector, oficjalna strona twórcy standardu. [dostęp 14 grudnia 2011] 11 maszyna (bądź instalacja na dysku twardym, bez możliwości przełączania się do systemu Windows, w celu wgrania odpowiednich aplikacji na tenże emulator) i nie działa z taką wydajnością, z jaką pracuje oryginalny system na urządzeniu fizycznym. Kolejnym przetestowanym przez autora emulatorem był program YouWave[7], który niestety jest płatny, lecz można go testować za darmo przez 30 dni. Niestety, obsługuje on tylko system Android w wersji 2.3, co dla developerów jest dużym problemem. Dla autora był by to odpowiedni emulator gdyby nie fakt, że jest to nic innego jak nakładka na popularny program do emulacji wirtualnych systemów operacyjnych – Oracle VirtualBox. Co prawda został zmodyfikowany specjalnie dla testowania aplikacji w ten sposób, iż posiada pasek z dostępnymi aplikacjami, które można uruchomić po dwukrotnym kliknięciu na nie. Zostaną wtedy załadowane do wirtualnej maszyny, lecz nadal pozostaje problem – iż jest to powolna, wirtualna maszyna oraz – co gorsza – jest to płatna wersja. Ostatnim testowanym rozwiązaniem była aplikacja o nazwie Bluestack App Player[8]. Jest ona zupełnie innego typu niż pozostałe, ponieważ nie jest to wirtualna maszyna ani emulator całego systemu operacyjnego. Jest to po prostu program instalowany pod Microsoft Windows 7 (jak na razie tylko na ten system operacyjny), który zawiera wszystkie potrzebne biblioteki do uruchamiania programów napisanych w Javie i skompilowanych pod platformę Android. Po instalacji aplikacja zawiera 11 preinstalowanych programów, które uruchamiają się bardzo szybko i pracują bardzo płynnie, a są wśród nich również gry wymagające od urządzenia dużej mocy obliczeniowej. Minusem tego rozwiązania jest sposób instalacji nowych programów, ponieważ aby to uczynić, musimy mieć wcześniej zainstalowaną daną aplikacje na urządzeniu fizycznym, pracującym pod kontrolą systemu Android w dowolnej wersji. Powinniśmy także pobrać ze sklepu Android aplikację o nazwie BlueStacks Cloud Connect[9], która będzie pośredniczyła między wymianą aplikacji pomiędzy systemem Android a programem BlueStacks App Player. Po uruchomieniu aplikacji na mobilnym systemie, zostaniemy poproszeni o podanie kodu PIN do aplikacji. W celu jego uzyskania, należy wejść na stronę[10] i przejść na zakładkę Cloud Connect (pol. – połączenie przez chmurę15), gdzie zostanie on dla nas wygenerowany. Po wpisaniu go na urządzeniu przenośnym, zostaniemy przeniesieni do listy aplikacji zainstalowanych w naszym systemie. Po zaznaczeniu potrzebnych aplikacji należy kliknąć przycisk Synchronize (pol. – synchronizuj) i odświeżyć stronę internetową, gdzie po chwili pokażą się wybrane przez nas aplikacje. Teraz już wystarczy wybrać przy nich przycisk Subscribe (pol. – subskrybuj), a po chwili zostaną przesłane do aplikacji – zostanie to potwierdzone poprzez wyświetlenie dymku z odpowiednią informacją na pulpicie systemu Windows w obszarze powiadomień, obok zegarka. Po uruchomieniu aplikacji na komputerze, aplikacja zostanie automatycznie załadowana do listy aplikacji i będzie możliwe jej uruchomienie poprzez kliknięcie na niej myszką. Wszystkie aplikacje w programie BlueStacks App Player uruchamiane są w trybie landscape (pol. – tryb krajobrazowy, pozioma orientacja ekranu) i jak na razie nie można zmienić tego stanu rzeczy. Być może zmieni się to w końcowej wersji apli- 15 [11] Mariusz Kędziora: co to jest chmura (Cloud Computing)? 8 maja 2010. [dostęp 14 grudnia 2011] 12 kacji, ponieważ aktualna jest tylko w fazie Alpha16 i działa jedynie na systemach Windows. Program BlueStacks App Player wykonuje aplikacje bardzo płynnie i wydaje się, iż jest on na ten moment najlepszym programem do uruchamiania aplikacji napisanych dla systemu Android. Co prawda, w żadnym miejscu na stronie, ani w specyfikacji aplikacji nie jest napisane, pod jakie wersje systemu Android muszą być napisane uruchamiane aplikacje, lecz autor nie spotkał się z nieprawidłowo działającą emulowaną aplikacją w programie BlueStacks App Player, dlatego jego wybór padł właśnie na ten program. 16 [12] Wikipedia: Cykl życia programu. [dostęp 14 grudnia 2011] 13 5. Projekt Kalkulator Plus Projekt został stworzony spełniając zadane wcześniej cele i założenia pracy, na które składają się przede wszystkim łatwość i szybkość obsługi, możliwie jak największa liczba docelowych urządzeń oraz darmowy dostęp do aplikacji i udostępnianych przez niej bibliotek, ponieważ użytkownikami docelowymi z założenia powinni być przede wszystkim osoby uczące się. Aplikacja została zaprojektowana tak, aby działała na Smartfonach pracujących pod kontrolą systemu Google Android, ponieważ w ostatnich czasach jest to najpopularniejszy system mobilny[4], dzięki czemu zostanie spełnione główne założenie, jakim jest dostępność dla jak największej liczby użytkowników. Google wraz z wydawaniem kolejnych wersji systemu operacyjnego zwiększa stabilność oraz szybkość jego pracy, tak więc docelową wersją systemu, pod którym będzie pracowała aplikacja jest wersja 2.3.x o nazwie Gingerbread17 (pol. piernik), oraz nowsze. 3.1. Istniejące rozwiązania Próżno szukać w Internecie aplikacji matematycznych, które pokazują krok po kroku jak rozwiązać dane wyrażenie. Można znaleźć co najwyżej jedną stronę Internetową, spełniającą ten warunek, lecz interfejs graficzny jest bardzo mało intuicyjny, a edytor wyrażeń i obsługiwane funkcje również nie powalają na kolana. Strona ta nazywa się Poolicz.pl, oraz ma swój odpowiednik dla zagranicznych użytkowników – solver.com. Jednak wyświetlanie kolejnych kroków obliczeń jest tylko dodatkową opcją projektu Kalkulator Plus. Główną funkcją jest odpowiednie parsowanie wyrażeń matematycznych i podawanie prawidłowego wyniku – tutaj konkurencja już jest ogromna. Przykładem może być tutaj chociażby najpopularniejsza wyszukiwarka internetowa - Google, która bardzo dobrze radzi sobie z rozwiązywaniem równań matematycznych. Kolejnym przykładem, może być program Wolfram Mathematica, który jest potężnym narzędziem służącym do wykonywania zaawansowanych obliczeń naukowych. Możemy do tej listy dodać także program Matlab z jego wieloma dodatkowymi modułami rozszerzającymi jego funkcjonalność. Przytoczone programy mają kilka minusów – w pierwszym wypadku potrzebny jest dostęp do Internetu, a w dwóch pozostałych – dostęp do komputera. Oczywiście te ostatnie są programami płatnymi, a ich funkcje są aż za bardzo zaawansowane dla zwykłego użytkownika, który ich po prostu nie będzie używał. Nikt nie chce kupować produktów, z których w większej części nawet nie skorzysta. 17 [13] Wikipedia. Android version history. [dostęp 14 grudnia 2011] 14 Przytoczone dotychczas programy są rozwiązaniami stacjonarnymi, niemającymi swoich odpowiedników na urządzenia mobilne. Na urządzenia z Google Android jest dostępnych mnóstwo programów do obliczeń, lecz posiadając one zbyt mało funkcji, niektóre funkcje w ogóle nie działają, a niektóre programy nie są aktualizowane od wieków co sprawia, że posiadają wiele znalezionych już przez użytkowników błędów. Gdyby połączyć zalety wszystkich tych programów, to było by wtedy nad czym dyskutować, niestety tak się nie da. Większość dostępnych programów jest płatnych, tak więc można albo wszystkie kupić, ale ściągnąć z Internetu pirackie wersje, co jest niezgodne z prawem. Istnieje jeszcze jeden typ kalkulatorów, a mianowicie kalkulatory jako samodzielne urządzenia. Głównymi ich wadami jest cena, która często jest dosyć wysoka, wymiary, które są bardzo duże, brak możliwości dodawania nowych funkcji, przez co trzeba kupować coraz to nowsze urządzenia, aby móc korzystać z nowszych funkcji. 3.2. Projekt interfejsu użytkownika Interfejs użytkownika powstał z myślą o jak najbardziej intuicyjnej możliwości obsługi programu. Posiada edytor wyrażeń matematycznych, który był wzorowany na przeglądniętych programach na PC oraz Android i programową klawiaturę numeryczną. W związku z różnymi typami urządzeń, na które docelowo ma działać aplikacja, różniącymi się między sobą rozdzielczościami ekranu oraz tym, czy posiadają klawiaturę czy nie, a także szybkością procesora, aplikacja musi zajmować bardzo mało pamięci w telefonie i umieć dostosować się do odpowiedniej rozdzielczości oraz orientacji ekranu. Na rysunku 3.2 został przedstawiony podstawowy wygląd aplikacji, uruchomionej na fizycznym urządzeniu. 15 Rys. 3.1. Wygląd okna głównego aplikacji Kalkulator Plus, pokazujący się standardowo chwilę po jej uruchomieniu na smartfonie w orientacji pionowej. Edytor wyrażeń matematycznych to fragment ekranu, który odpowiedzialny jest za wyświetlanie wprowadzonych przez użytkownika cyfr oraz funkcji zadeklarowanych w programie Kalkulator Plus (Rysunek 3.2). Edytor posiada znak zachęty koloru zielonego, który informuje użytkownika o pozycji i możliwości wpisania kolejnej wartości z wirtualnej klawiatury, wbudowanej w program. Rys. 3.2. Edytor wyrażeń matematycznych z programu Kalkulator Plus, uruchomionego na urządzeniu fizycznym w orientacji pionowej. Dodatkową funkcją edytora wyrażeń matematycznych jest informowanie użytkownika o niezamkniętych nawiasach, bądź błędnie wpisanych wyrażeniach. W przypadku pojawienia się w edytorze jakiegoś błędu (kolorem czerwonym), bądź ostrzeżenia (kolorem zielonym), nie jest możliwe pokazania wyniku działania wpisanego wyrażenia matematycznego, dzięki czemu aplikacja jest odporna na błędy użytkowników i nie wyświetla błędnych wyników. Program zaznacza następujące błędy, napisane przez użytkownika: rozpoczęcie wyrażenia wpisując znak „+”, „*”, „!”, bądź „/” , wpisanie dwukrotnie tego samego znaku, bądź dwóch różnych znaków, które nie są oddzielone między sobą żadną cyfrą , wpisanie znaku końca nawiasu zaraz po wpisaniu znaków „+”, „-„, „*”, „\”, bądź po otwarciu nawiasu , nie wpisanie, bądź wpisanie złej liczby argumentów do otwartej funkcji. Ostrzeżenia zostaną wyświetlone, gdy : użytkownik otworzy nawias, lecz go nie zamknie , ostatnim wpisanym znakiem będzie „+”, „-„, „*” bądź „/”. 16 Na tym samym ekranie, po wprowadzeniu wszystkich obliczeń i przyciśnięciu odpowiedniego przycisku na wirtualnej klawiaturze, zostają wyświetlane obliczenia wykonane krok po kroku, aż do wyprowadzenia pełnego wyniku. Rys. 3.3. Edytor wyrażeń matematycznych z programu Kalkulator Plus, uruchomionego na urządzeniu fizycznym w orientacji pionowej. Możliwe jest także na programowej klawiaturze przełączanie pomiędzy kolejnymi krokami obliczeń oraz zapisanie wszystkiego w pliku tekstowym na karcie pamięci telefonu i przesłanie obliczeń do innego użytkownika, nie koniecznie posiadającego aplikację, ani nawet telefon z systemem operacyjnym Android. Dla użytkowników, którzy będą chcieli się wymienić rozwiązaniami, istnieje stosowne rozwiązanie, a mianowicie opcja „zapisz do pliku kalkulatora”. Dzięki tej opcji zostaną do pliku zapisane wszystkie informacje na temat dokonanych obliczeń wraz z objaśnieniami. Wirtualna klawiatura (rysunek 3.4), która została wbudowana w program Kalkulator Plus służy do wpisywania wyrażeń matematycznych przez użytkownika. Jest skonstruowana tak, aby nie zasłaniała całego ekranu, żeby w widoku poziomym oraz pionowym wszystkie klawisze były widoczne oraz aby nie było żadnych problemów przy wpisywaniu kolejnych cyfr. 17 Rys. 3.4. Programowa klawiatura zaprezentowana w widoku pionowym aplikacji. Klawiatura jest widoczna przez cały czas działania aplikacji (tylko w trybie wpisywania wyrażeń). Jej funkcje zmieniają się w zależności od tego, co akurat użytkownik wykonuje w programie. Jeżeli wpisuje tylko kolejne wyrażenia, to jest widoczna klawiatura przedstawiona na Rysunku 3.4. Jeżeli natomiast jesteśmy w trybie przeglądania kolejności wykonywania działań, jest możliwe tylko przełączanie się między nimi i wyczyszczenie równania tak, aby można było wpisać nowe. Przy innych czynnościach klawiatura jest nie widoczna, aby nie przeszkadzała w wykonywaniu zamierzonych działań. Jak widać na poprzednim rysunku, w centrum każdego klawisza znajduje się duży znak, oznaczający główną funkcję wykonywaną po jego zwykłym przyciśnięciu. Rys. 3.5. Jeden z przycisków z programowej klawiatury, powiększony pięciokrotnie w celu prezentacji sposobu jego użycia. Na Rysunku 3.5. został zaprezentowany jeden z przycisków, znajdujących się w programie Kalkulator Plus. Podział widoczny na nim, tak naprawdę jest tylko programowy, a nie wizualny. Przycisk został podzielony na cztery części, a każda z tych części odpowiada za 18 inną funkcję. Na przykład na klawiszu numer 2, w prawym górnym rogu znajduje się napis cos, oznaczający funkcję Cosinus. Aby dostać się do niej, należy przeciągnąć palec z dowolnego miejsca na przycisku 2 w prawą stronę po ukosie w górę tak, jak zostało to zilustrowane przy pomocy żółtej strzałki na Rysunku 3.5. Do funkcji należących do tego samego klawisza, lecz znajdujących się w dolnych rogach przycisku można dostać się w sposób analogiczny, przeciągając palec „od góry” przycisku po skosie w dół w odpowiednim kierunku (lewo bądź prawo), bez znaczenia pod jakim kątem. Należy jednak pamiętać o tym, aby palec przesunąć w dosyć znaczącą odległość, ponieważ może nie zostać rozpoznany zaprogramowany gest. W przypadku nie rozpoznania gestu lub po prostu przy próbie użycia nie przypisanego rogu przycisku (tak jak w przypadku Rysunku 3.5. z górnego, lewego rogu), zostanie zastosowana domyślna akcja, czyli ta, która przypisana jest jako duży, biały napis. Odległość, jaką musi pokonać palec, aby gest został rozpoznany to 50 pikseli od miejsca zbliżenia palca do wyświetlacza – oczywiście musi to być co najmniej 50 pikseli po osi X jak i po osi Y. Na listingu 3.1. został zaprezentowany kod zadeklarowany z programie Kalkulator Plus na obsługę tych właśnie gestów. if ((Math.abs(RoznicaX) > 50.0) || (Math.abs(RoznicaY) > 50.0)) { if ((RoznicaX < 0.0) && (RoznicaY > 0.0)) { TypPrzycisku = 1; } else if ((RoznicaX < 0.0) && (RoznicaY < 0.0)) { TypPrzycisku = 2; } else if ((RoznicaX > 0.0) && (RoznicaY < 0.0)) { TypPrzycisku = 3; } else if ((RoznicaX > 0.0) && (RoznicaY > 0.0)) { TypPrzycisku = 4; } } Listing 3.1. Kod w języku Java odpowiedzialny za rozpoznawanie czy i w którą stronę palec został przesunięty po przycisku Podczas niektórych operacji, np. wyświetlania kolejności wykonywanych działań, na większości przycisków nie są wyświetlane żadne znaki, co czyni je po prostu nieużywalnymi, ponieważ nie mają przypisanych żadnych akcji domyślnych, ani po użyciu gestów. 19 6. LITERATURA [1] E. BURNETTE: Hello, Android. Wydawnictwo HELION, Gliwice 2011. [2] S. HASHIMI, S. KOMATINENI, D. MACLEAN: Android 2. Tworzenie Aplikacji. Wydawnictwo HELION, Gliwice 2011. [3] E. GAŁĘSKA, R. TOBOŁA: Matematyka, powtórka przed maturą. Wydawnictwo PUBLICAT, Poznań 2009 [4] http://www.gartner.com/it/page.jsp?id=1848514 [5] http://developer.android.com/guide/developing/tools/emulator.html [6] http://www.android-x86.org/ [7] http://www.youwave.com/ [8] http://bluestacks.com/download.html [9] https://market.android.com/details?id=com.bluestacks.appsyncer [10] http://channels.bluestacks.com/home/cloud-connect [11] http://blogs.technet.com/b/mkedziora/archive/2010/05/08/co-jest-chmura-cloud-computing.aspx [12] http://pl.wikipedia.org/wiki/Cykl_%C5%BCycia_programu [13] http://en.wikipedia.org/wiki/Android_version_history [14] http://www.hdmi.org/manufacturer/hdmi_1_4/micro_connector.aspx [15] http://www.dalvikvm.com/ 20