niedziela, 2 czerwca 2013

Barman: Reloaded Again

   Dzisiaj krótka notka :-)
 
   W związku z dużą ilością próśb i zapytań opublikowałem kolejną aktualizację Barmana - tym razem zawierającą nowe przepisy na drinki oraz drobne poprawki.
Postaram się raz na jakiś czas dodawać kolejne przepisy. Tymczasem próbujcie i testujcie nowe drinki. ;-)
Miłej zabawy :-)

poniedziałek, 20 maja 2013

Barman: Reloaded

   Po prawie półtora roku od momentu publikacji mojej pierwszej aplikacji na Google Play wziąłem się do roboty i przygotowałem aktualizację Barmana. Skupiłem się głównie na uatrakcyjnieniu interfejsu graficznego. Wiem, że sporo osób zwracało uwagę na małą ilość przepisów, ale to temat następnej aktualizacji, którą planuję a nad którą praca już jest w toku.

W obecnej aktualizacji zmiany obejmują:
  • uatrakcyjnienie interfejsu graficznego aplikacji
  • wersja aplikacji dedykowana dla tabletów (nie trzeba niczego dodatkowo instalować)
  • duże zmiany w samym silniku aplikacji niewidoczne z zewnątrz, ale usprawniające jej działanie
  • sporo drobnych poprawek
Tak więc użytkownikom mojej aplikacji polecam zrobienie aktualizacji, natomiast tym, którzy nie mieli przyjemności korzystania z Barmana mogę powiedzieć tylko, żeby zainstalowali aplikację na swoich smartfonach z androidem :-)

Aktualizacja lada chwila powinna się pojawić na Google Play.

Miłej zabawy,
Szczypek

wtorek, 23 kwietnia 2013

Przygody z MeeGo i plikami GPX :-)

No to dzisiaj z nieco innej beczki :-)

   Żeby czasem odpocząć od aplikacji Androidowych, co jakiś czas próbuję sił w programowaniu na Nokię N9 z systemem MeeGo na pokładzie. Nie jest to rzecz regularna, ponieważ mam dostęp do tego urządzenia cyklicznie, ale zawsze to miłe urozmaicenie. A i przy okazji praktyka w wykorzystaniu platformy Qt, języka C++ i QML na pewno się przyda. Przyczyna jest prosta - korzystając z tego "frameworka" można tworzyć aplikacje od mobilnych, przez wbudowane aż po desktopowe. I to na wszystkie główne systemy operacyjne.
   O samym telefonie firmy Nokia nie będę się rozpisywał. Jednakże warto wspomnieć po krótce jego historię, ponieważ już w momencie premiery wiadomo było, że będzie to pierwszy i ostatni telefon Nokii z systemem MeeGo. Niestety wtedy już było wiadomo o mariażu fińskiego producenta telefonów z MałymMiękkim, który zapewne miał wpływ na podjętą decyzję finów ;-) Wydaje się, że telefon ten wypuszczono na rynek,tylko dlatego, że w tym momencie był już ukończonym produktem. Brak przyszłych aktualizacji niestety sprawił, że platforma ta, mimo że na prawdę porządnie i dobrze zrobiona, pozostała w cieniu i mało kto pisze na nią aplikacje.
   No i właśnie w tym momencie przejdę do meritum dzisiejszego posta. Czasem zdarza mi się jeździć rowerem - ot tak, dla zdrowia i przyjemności. I dla wprawy postanowiłem napisać prostą aplikację na moją N9, która zapisywałaby trasę mojego przejazdu w postaci pliku GPX. Plik GPX jest ustandaryzowanym formatem XMLa, który w założeniu ma ułatwiać wymianę danych między aplikacjami korzystającymi z danych pobieranych z odbiornika GPS. Oto przykładowy, prosty plik w formacie GPX (http://pygments.org/demo/76845/ ).

Przykladowy plik GPX wygenerowany przez aplikację

Na początku mamy typowe dla formatu xml deklaracje. Następnie (druga linia) znacznik gpx będący korzeniem naszego xmla. Pierwszym nodem jest metadata , w którym zamieszczamy przynajmniej granice geograficzne naszej trasy (minimalne i maksymalne wartości długości i szerokości geograficznej zmierzonej trasy), oraz czas zapisania dokumentu gpx (time).
Następnie mamy znacznik trk , który zawiera już dane z naszego odbiornika gps w telefonie. Cała trasa podzielona jest na segmenty (trkseg), które grupują kolejno następujące po sobie dane stanowiące logiczną całość. Np. dane z jednej trasy spaceru, w trakcie którego utracono na chwilę sygnał gps będą zapisane w dwóch segmentach. W reszcie przechowuje dane poszczególnych punktów pomiaru w znaczniku trkpt. W atrybutach zapisane są długość i szerokość geograficzna, a w znacznikach odpowiednio wysokość nad poziomem morza (ele) i dokładny czas dokonania pomiaru (time). Oczywiście niniejszy przyklad jest maksymalnie uproszczony, a sam standard gpx przewiduje dużo więcej możliwości. Zainteresowanych odsyłam do źródła (http://www.topografix.com/gpx/1/1/ ).
   Moja aplikacja testowa jest najprostsza, jak to tylko możliwe. W pliku MainPage.qml, tworzy i konfiguruje źródło danych GPS. W tym przypadku ustawiamy częstotliwość odczytów pozycji na jeden co 10 sekund (10000 milisekund), zaś sygnał o zmianie pozycji będzie uruchamiał funkcję updateGeoInfo, która współrzędne i czas ich pobrania wpisuje do etykiet wyświetlających te dane na interfejsie aplikacji. No i oczywiście przesyła te dane do metody writePosition klasy QGPXWriter.



   Zadaniem wyżej wymienionej klasy jest utworzenie dokumentu gpx, zapisanie do niego danych poszczególnych punktów pomiarowych (metoda writePosition ) oraz zapisanie utworzonego dokumentu do pliku na dysku telefonu.

Mimo swojej prostoty aplikacja działa bardzo dobrze i po każdym spacerze, czy jeździe na rowerze mogę pobrać z telefonu plik gpx z zapisem trasy i utworzyć na jego podstawie wpis w internetowych serwisach sportowych typu runkeeper, czy endomondo. Jak dla mnie - bomba, bo w końcu mogę Nokię N9 wykorzystywać to śledzenia mojej aktywności sportowej. No i przy okazji narodził się pomysł wykorzystania wiedzy, którą zdobyłem tworząc tą aplikację do stworzenia bardziej pełnego produktu.
Pełny kod aplikacji dostępny jest w serwisie bitbucket.
Miłej zabawy! :-)


niedziela, 25 listopada 2012

Ku pamięci :-)

Hej,

   Dzisiejszy post piszę (głównie) dla siebie - żeby potem znowu nie szukać. Ale jeśli komuś skrócę czas szukania rozwiązania to też dobrze.

Ostatnio znalazłem dwie fajne rzeczy w internecie odnośnie robienia aplikacji mobilnych na Google android.

   Pierwsza z nich (i jak na razie jest to mój osobisty faworyt), to biblioteka do pobierania obrazków z sieci i "cache'owania" ich w pamięci stałej i ulotnej telefonu. Jest napisana w ten sposób, ze bardzo łatwo można ją wykorzystać wespół z ListView do tzw lazy list loading. Krótko mówiąc rzecz polega na tym, że lista ładuje tekstową zawartość, natomiast obrazki ładowane są przez naszą bibliotekę asynchronicznie z internetu i od razu zapisywane na karcie pamięci i w samej pamięci telefonu. Autorem jest Fedor Vlasov, zaś żródła samej biblioteki dostępne są na github'ie wraz z przykładową aplikacją.
   Druga ze znalezionych rzeczy jest znacznie mniej imponująca, ale mnie się dobrze przysłużyła. Chodzi mianowicie o wysyłanie i reagowanie na wysłane Broadcasty. Wstyd się przyznać, ale zawsze myślałem, że to strasznie skomplikowane, ale ten wpis przekonał mnie, że nie taki diabeł straszny ;-)

To tyle na dzisiaj :-)

Szczypek

czwartek, 22 listopada 2012

Horoskop

   Niniejsza aplikacja powstała już jakiś czas temu na prośbę jednego z potencjalnych pracodawców. Czasem tak jest, że kandydat jest proszony o napisanie próbnej aplikacji tak by pracodawca mógł sprawdzić jak sobie osoba starająca się o pracę poradzi. Produktem takiej działalności jest właśnie Horoskop.

   Aplikacja jest ekstremalnie prosta - posiada tylko dwa widoki. Listę znaków zodiaku i widok szczegółowy, który pojawia się po wybraniu jednego ze znaków.


  Ale tak na prawdę to chodzi w niej o to co dzieje się "pod maską".

Pierwszy widok jest to lista znaków zodiaku (ikona graficzna reprezentująca znak i nazwa), drugi widok zawiera treść pojedynczego horoskopu wraz z ikoną i możliwością odświeżenia danych (ponownego pobrania ich z serwera).



Dane do aplikacji pobierane są z jednego z serwisów internetowych w postaci pliku JSON z zakodowanym horoskopem na cały tydzień dla wszystkich znaków. Symbole znaków również pobierane są z internetu. Przy czym grafiki są pobierane z sieci tylko przy pierwszym uruchomieniu aplikacji i "cache'owane" w telefonie.
Horoskop wygląda dobrze zarówno w trybie portretowym, jak i w trybie "landscape" (jeśli tekst się nie mieści, to można go przewijać).


Jeśli chodzi o interfejs użytkownika, to dzięki zastosowaniu Fragments aplikacja wygląda również dobrze na ekranie tabletu.




   Ogólnie rzecz biorąc Horoskop jest przykładem zastosowania sporej liczby technologii i możliwości Androida.
   Tak więc poza wykorzystaniem Fragments do tworzenia interfejsu graficznego dzięki czemu jedną, wspólną bazą kodu obsługuję i telefony i tablety (wystarczy tylko osobny plik z opisem layoutu aplikacji dla tabletu) jest w niej przykład pobierania danych z webserwisu i parsowania ich z formatu JSON.
Grafiki pobierane są w niezależnych wątkach, dzięki czemu nawet przy pierwszym starcie aplikacja jest interaktywna i responsywna a same grafiki pojawiają się stopniowo w miarę postępów pobierania. Do tego celu wykorzystalem bibliotekę LazyList.
Same dane z horoskopami pobierane i parsowane są również w tle z wykorzystaniem Services, które informują Broadcastem widok wyświetlający dane szczegółowe o konieczności przeładowania zawartości kontrolek. Tak więc również pobieranie danych i parsowanie JSONa również nie wpływa negatywnie na responsywność aplikacji.

   Po raz pierwszy postanowiłem kod zamieścić w publicznym repozytorium. Tak więc kod aplikacji można znaleźć na serwisie github.

To tyle :-)

poniedziałek, 21 maja 2012

Kfiatki

Dzisiaj coś dla początkujących (i przypomnienie dla doświadczonych ;-) ).

Od jakiegoś czasu ślęczę nad cudzym kodem javascript (nie pytajcie jak to się stało). No i co jakiś czas wyławiam "kfiatki" typu używanie niezdefiniowanej zmiennej itp.
Ale wczoraj znalazłem coś takiego, co umocniło mnie w przekonaniu żeby na prawdę uważać przy konstruowaniu instrukcji warunkowych i zawsze kilka razy przemyśleć, czy to co wpisałem ma jakikolwiek sens. Oczywiście nie muszę chyba przypominać, żeby stawiać nawiasy wszędzie tam, gdzie jest choćby mała wątpliwość odnośnie kolejności wykonywania działań, bo po miesiącu może być krucho z przypomnieniem sobie co tak właściwie jest sprawdzane w danym "ifie".

Poniżej jest "kfiatek" o którym mowa. Na pierwszy rzut oka jest to instrukcja jakich wiele, ale proponuję zastanowić się co tam się dzieje:

if (!zmienna == 'jakisString') { /* ciało warunku */ }

Zmienna o nazwie zmienna jest typu znakowego (string). Ponieważ w tej instrukcji nie ma nawiasów, to interpreter javascript widzi to tak:

if ((!zmienna) == 'jakisString') { /* ciało warunku */ }

Co z tego wynika? Ano to, że nie zostaną wykonane instrukcje zawarte w ciele warunku (w tym przypadku to tylko komentarz). Stanie się tak dlatego, że interpreter javascript widząc kod: !zmienna zamieni po cichu typ zmiennej zmienna, ze string na typ logiczny i potem zastosuje operator "!". 
Po lewej stronie operatora == będziemy więc mieli zmienną typu logicznego a po prawej zwykłego string'a. Niestety javascript w tym przypadku nie dokona automatycznego rzutowania  'jakisString' do zmiennej typu logicznego, zaś próba porównania zmiennych dwóch różnych typów zwraca zawsze wartość false (no bo przecież string nie jest boolean'em), co również następuje w naszym przypadku.


Autorowi owego wybryku chodziło prawdopodobnie o sprawdzenie, czy zmienna jest różna od 'jakisString', czyli o wyrażenie:


if (zmienna != 'jakisString') { /* ciało warunku */ }

czwartek, 15 grudnia 2011

Barman


   Tym razem chciałem pochwalić się jedną z pierwszych aplikacji na Androida jakie napisałem. Powstała na początku 2010 roku, w okresie, gdy dopiero zaczynałem poznawać system operacyjny od Google'a i próbowałem swych sił w robieniu aplikacji na iPhone'a. Jest to bardzo prosta implementacja książki z przepisami na drinki. Nazwałem ją Barman.
   Ekran główny, to przewijalna lista nazw dostępnych drinków. Wybranie któregokolwiek drinka wywołuje widok szczegółowy (nazwa, składniki i sposób przyrządzania) z możliwością modyfikacji wpisu.


Dodawanie nowego drinka odbywa się przez naciśnięcie przycisku menu w głównym oknie aplikacji, po wybraniu opcji "Dodaj Drinka" użytkownik kierowany jest do pustego widoku szczegółowego i może dodać wszystkie szczegóły drinku.


Usuwanie drinków jest możliwe poprzez wywołanie menu kontekstowego dla danego drinku z listy. Aby wywołać menu kontekstowe przyciskamy nazwę wybranego drinka dopóki nie pokaże nam się menu "Usuń Drinka". Dotykamy ten element menu zatwierdzając tym samym usunięcie wpisu.




   Pomysł na "Barmana" narodził się jeszcze w czasie gdy bawiłem się w pisanie aplikacji na iPhone'a i jest wzorowany na jednej z aplikacji z książki "Head First iPhone Development", którą w ramach nauki przerabiałem (swoją drogą polecam jak ktoś chce zacząć programować na iPhone'a). Pisząc tą aplikację wspomagałem się tutorialami chłopaków z google'a (zwłaszcza Notepad, który to polecam wszystkim początkującym programistom planującym napisanie aplikacji typu lista -> widok szczegółowy), oraz (w dużo mniejszym stopniu) serwisem StackOverflow, który jest lekturą obowiązkową dla każdego twórcy aplikacji mobilnych niezależnie od stopnia zaawansowania, czy stosowanej technologii.