Development z Zapomnianej Strony

..:: Paweł Hofman .NET Portal ::..
wrz
01

Kody Pocztowe v1.0

by Paweł | Tags: ,

MarketplaceIcon

W ten weekend miała miejsce publikacja mojej aplikacji “Kody Pocztowe” na Windows Phone 7. Umożliwia ona przeglądanie i wyszukiwanie kodów pocztowych bez połączenia z Internetem.

Zapraszam do instalacji pod tym adresem w Windows Phone Markecie.

 

Pobierz z Windows Phone Marketplace

.



Jakiś czas temu pokazałem jak skompilować dystrybucję Mono 2.10.9 na swój NAS. Jednak dlaczego nie posunąć się o krok dalej i nie uruchomić stron ASPX na naszym urządzeniu?

Jak zatem skompilować testowy serwer XSP i uruchomić go? Równie dobry opis znajduje się tutaj (tyle, że po rosyjsku).

 

Zacznijmy zabawę od pobrania i wypakowania źródeł dla serwera XSP:

wget http://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2
tar -xvf xsp-2.10.2.tar.bz2 cd xsp-2.10.2

Upewnijmy się, że kompilator mono jest widoczny, tworząc odpowiednie dowiązania do /opt/bin:

ln -s /opt/mono-2.10.9/bin/dmcs /opt/bin/dmcs
ln -s /opt/mono-2.10.9/bin/gacutil /opt/bin/gacutil
ln -s /opt/mono-2.10.9/bin/mdoc /opt/bin/mdoc

I przechodzimy do konfiguracji (w razie potrzeby instalujemy brakujące pakiety - ja musiałem chociażby pkgconfig). Tutaj tak samo, jak w przypadku instalacji Mono, nie pozwalamy na bezpośrednią instalację do katalogu /opt/bin, tylko wymuszamy folder “mono-2.10.9”. Pozwoli to trzymać serwer XSP razem z odpowiadającą mu wersją Mono, jak i w przyszłości na szybką deinstalację (razem z Mono) poprzez proste usunięcie tego folderu.

ipkg install pkgconfig
export PKG_CONFIG_PATH=/opt/mono-2.10.9/lib/pkgconfig/
./configure --prefix=/opt/mono-2.10.9 --disable-docs

Budujemy i instalujemy:

make
make install


Build Environment
Install prefix: /opt/mono-2.10.9
Datadir: /opt/mono-2.10.9/share
Libdir: /opt/mono-2.10.9/lib
Build documentation: no
Mono 2.0 compiler: /opt/bin/gmcs
Mono 4.0 compiler: /opt/bin/dmcs
Target frameworks: .NET 2.0, .NET 4.0
Build SQLite samples: yes

Na koniec tworzymy jeszcze niezbędne dowiązania, aby łatwiej uruchamiać testowe strony:

ln -s /opt/mono-2.10.9/bin/xsp2 /opt/bin/xsp2
ln -s /opt/mono-2.10.9/bin/xsp4 /opt/bin/xsp4

Finał! Uruchamiamy przykład:

cd /opt/mono-2.10.9/lib/xsp/test
xsp4 --port 8888 --applications /:.
A w oknie przeglądarki wpisujemy: http://my_nas:8888/. Nic prostszego.

Gotowe!



Synology NAS pozwala za pomocą panelu administracyjnego w bardzo łatwy sposób skonfigurować domyślną stronę WWW dla naszego urządzenia. Tak samo możemy tam włączyć strony domowe dla użytkowników.

Do wybranego katalogu serwera WWW (np. /volume1/web) wrzucamy cały kod strony html/css/php i to w zasadzie wszystko.

Problem pojawia się niestety, gdy chcemy ograniczyć dostęp do tych zasobów za pomocą najprostszego logowania. Ponieważ pod maską chodzi Apache wydawać by się mogło, że wystarczy dorzucić odpowiednio przygotowane pliki .htaccess i .htpasswd.

Nic bardziej mylnego. Tzn. one zadziałają, ale zaraz po wpisaniu hasła zostaniemy automatycznie przekierowaniu z portu 80 (lub 8080) na port 5000 albo 5001, gdzie uruchomiona jest konsola administrowania urządzeniem. Podsłuchując, co się wtedy dzieje od strony protokołu HTTP okazuje się, że zaraz po zalogowaniu otrzymujemy klasyczny “redirect” (tj. odpowiedź z kodem 302 (3xx)).

Rozwiązanie jak uniknąć przekierowania znalazłem tutaj. Polega ono na edycji pliku PHP strony próbkowania Synology Manager, który gdy nie znajdzie nic w domyślnym folderze stron WWW, to właśnie przekierowuje na panel administratora (lub definitywnie zmieniamy mu nazwę na sample.php.bak).

vi /usr/syno/synoman/phpsrc/web/sample.php

i wykomentowujemy na samym końcu tego pliku:

# else
# {
#    header("Location: ".$admin_link);
# }

A na koniec restartujemy serwer Apache:

/usr/syno/etc/rc.d/S97apache-user.sh restart

Podpowiedzi:

  • Ponieważ .htaccess wymusza logowanie dla całego podrzewa katalogów, dlatego lepiej użyć podfolderu w katalogu głównej witryny WWW i w nim umieścić dostęp przez hasło.
    Użycie np. katalogu “secure” i umieszenie tam .htaccess, spowoduje, że domyślny folder http://www.mój-nas.pl będzie miał dostęp wolny, natomiast http://www.mój-nas.pl/secure/ będzie wymagał logowania.
    Jest to o tyle pomocne, że inne aplikacje (jak chociażby PhotoStation nie będą wymagały podania tego hasła!)
  • Zwyczajowo w pliku .htaccess umieszczamy lokalizację do pliku z hasłami bez podawania pełnej ścieżki, czyli np.

AuthUserFile .htpasswd

ale, nie oznacza to, że katalogiem, w którym poszukiwany będzie ten plik jest folder witryny WWW!. Wręcz przeciwnie, domyślnie jest nim katalog: /usr/syno/apache

I tak oto uzyskaliśmy dostęp za hasłem!



Czasem zamiast zestawić proxy (ot, chociażby tinyproxy) dużo prościej jest po prostu zalogować się na zdalny serwer i użyć przeglądarki w terminalu – lynx.

Na stacji Synology zainstalujemy ją poprzez polecenie:

ipkg install lynxI dalej z górki: (G) – wpisujemy adres witryny, (Strzałka w Górę) i (Strzałka w Dół), przechodzimy po łączach, (Spacja) – następny ekran, (Strzałka w Lewo) – cofnij do poprzedniej witryny, (Strzałka w Prawo) – otwórz zaznaczone łącze, (D) – pobierz plik…

Co jednak, jeśli chcemy za jej pomocą pobrać duże pliki? Takie powiedzmy 1GB i więcej?

To boleśnie przekonamy się o tym, że nasza stacja nie ma tyle miejsca na dane tymczasowe i wszystko zostanie urwane w połowie.

Prosta rada, to przed uruchomieniem lynxa, ustawić tę oto zmienną środowiskową:

export LYNX_TEMP_SPACE=/katalog/z/dużą/ilością/wolnego/miejsca

Ciekawostka jest taka, że nawet najnowsza wersja przeglądarki (tj. 2.8.6) nie umożliwia podania tego katalogu w pliku konfiguracyjnym lynx.cfg.

 

Udanego pobierania!



Z niewiadomych powodów Synology usunęło pakiet Mono z repozytorium ipkg. Jednak i na to znajdzie się sposób. Przecież wszystko da się skompilować ze źródeł.

Poniżej przestawię jak to zrobić. Przyznaję jednak, że jest to tylko tłumaczenie. Oryginalny post znajduje się tutaj. Wielkie dzięki dla Kennetha za jego wysiłek! Mój wkład, to przetestowanie tego na DS411 oraz użycie stabilnej wersji Mono-2.10.9 zamiast Mono-alpha-2.11.0, czyli mimo wszystko nie za dużo ;)

Ostrzeżenie: ta kompilacja można na prawdę zająć duuużo czasu, liczonego w godzinach.

 

  • Na początku instalujemy wymagane narzędzia do przeprowadzenia kompilacji:
ipkg install wget nano make automake autoconf bison \
    glib libc-dev libstdc++ m4 gcc gawk textutils gettext zlib
  • Pobieramy i wypakowujemy źródła projektu Mono:
wget "http://download.mono-project.com/sources/mono/mono-2.10.9.tar.bz2"
tar -xf mono-2.10.9.tar.bz2
  • Konfigurujemy źródła dla naszej maszyny:
cd mono-2.10.9 ./configure --prefix=/opt/mono-2.10.9

Przełącznik ‘prefix’ pozwoli nam później zainstalować skompilowaną wersję Mono w tym właśnie folderze, zamiast użycia domyślnego “/usr”. Dzięki temu w przyszłości łatwiej będzie wszystko usunąć lub aktualizować.

  • Edytujemy konfiguracje, tak aby dodać łączenie z biblioteką “rt”.
    Rozwiązuje to problem opisany tutaj, gdzie brakuje metod odwołujących się to czasu procesora.

W plikach:

mono/metadata/Makefile
mono/mini/Makefile
mono/profiler/Makefile

Edytujemy wartość zmiennej flag dla linkera (LDFLAGS):

LDFLAGS = -lrt
  • Dodatkowo, poprawiamy problem z nieistniejącymi symbolami w bibliotece pthreads, która domyślnie instaluje się z pakietów ipkg. Problem szczegółowo opisany na forum Synology.

mv /opt/arm-none-linux-gnueabi/lib/libpthread* /opt/arm-none-linux-gnueabi/lib_disabled
cp /lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/
cd /opt/arm-none-linux-gnueabi/lib/
ln -s libpthread.so.0 libpthread.so
ln -s libpthread.so.0 libpthread-2.5.so

  • Kompilujemy:

make

  • Instalujemy (automatycznie do /opt/mono-2.10.9):

make install

  • Dowiązujemy narzędzia, tam gdzie zainstalowałyby się domyślnie:

ln -s /opt/mono-2.10.9/bin/mono /opt/bin/mono
ln -s /opt/mono-2.10.9/bin/mcs /opt/bin/mcs
ln -s /opt/mono-2.10.9/bin/gmcs /opt/bin/gmcs

  • I finalny test:

mono --version
Mono JIT compiler version 2.10.9 (tarball Tue May 29 16:18:24 CEST 2012)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
TLS: normal
SIGSEGV: normal
Notifications: epoll
Architecture: armel,soft-float
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: Included Boehm (with typed GC and Parallel Mark)

Gotowe, brawo!



Adobe wprowadziło własną obsługę formatu JSON w wersji AIR 3.0+. Udostępniona została ona poprzez obiekt JSON z głównej przestrzeni nazw (z metodami parse() oraz stringify()). Co ciekawe na PlayBooku używa ona natywnego kodu, przez co jest dużo wydajniejsza od jakiejkolwiek biblioteki napisanej w ActionScript przez kogoś w sieci!

Jeśli jednak zbudujemy projekt w FlashDevelop IDE, tak jak to opisałem wcześniej, to wszystko będzie super działało w środowisku testowym na Windowsie. Jednak przy próbie uruchomienia na urządzeniu (tj. PlayBooku z OS 2.0.1, AIR w wersji 3.1.0.38 i Flash Player w wersji 11.1.121.38), dostaniemy w prezencie piękny błąd wykonania:

ReferenceError: Error #1065: Variable JSON is not defined.

Dlaczego? Przecież wszystko jest na swoim miejscu. Niby tak, ale ciągle nie wymusiliśmy uruchomienia naszej aplikacji w AIR 3+ (czy to Flash Player 11+). Aby to poprawić, należy dodać do opcji kompilatora informacje, że korzystamy z wersji SWF 13. We właściwościach projektu w polu Additional Compiler Options wpisujemy:

-swf-version=13

Compiler_Options

I tak to właśnie działa!



Jak zrobić zrzut aktualnego ekranu na PlayBooku? Można oczywiście aparatem ;), ale jak uzyskać coś w oryginalnej rozdzielczości?

Wciśnij przyciski Volume+ i Volume- jednocześnie. A plik zostanie zapisany pośród innych utworzonych zdjęć na rolce aparatu. Niestety nie zostanie odegrany żaden dźwięk ani animacja w tym momencie, sygnalizująca wykonanie tej operacji.

Następnie używając QNX Momentics IDE i widoku Target File System Navigator, otwieramy folder, w którym obrazki te się znajdują:

    wifi:/accounts/1000/shared/camera/

i możemy je przegrać na swoją maszynę.



Niestety do tej pory nie ukazała się, żadna publiczna wersja frameworka graficznego Cascades na PlayBooka. Czy to oznacza, że nie można łatwo tworzyć aplikacji graficznych na ten tablet?

Otóż nie! Jest to najbardziej otwarta platforma, z jaką miałem do czynienia pracować i gorąco zachęcam do zabawy z nią! Posiada (oprócz oczywiście Androida) pełne wsparcie dla technologii Flash! I co ciekawe, co pokażę dalej, programy można tworzyć, łatwo, szybko i przyjemnie, a wyglądają one przy tym jak te natywne. Co najważniejsze, wszystko to ZA DARMO!

 

Czego potrzebujemy? (zalecam instalację w podanej kolejności)

FlashDevelop

  • BlackBerry Tablet OS Template dla FlashDevelop (instalacja polega na wypakowaniu wszystkiego do folderu: C:\Program Files\FlashDevelop\Projects). Szablon ten wymagał niestety kilku poprawek, które zaraz opiszę, ale lepsze to, niż pisać wszystko od zera. Teraz przynajmniej, tworząc nowy projekt dostaniemy wszystko, aby szybko utworzyć pierwszą aplikację.
  • I na dokładkę coś, co po prostu umili życie oraz deployment. Instalujemy FriutBat 1.4. Na jego stronie znajduje się też mały przewodnik o tym, co jak i gdzie. Jedyne, co jest istotne to znowu, lokalizacje SDK oraz adres IP urządzenia i hasło do niego.

FruitBat_Settings

Trochę tytułem wstępu – na co dzień używam NDK 2.0 do pracy z kodem w C/C++ i dystrybuowanego razem z nim QNX Momentics IDE. W nim też mam skonfigurowane wszystkie potrzebne klucze (P12, CSJ, CSK…), debug-token itp. Dlatego ten etap pominę ;) Na tej stronie zainteresowani znajdą wszystko.

Tak naprawdę to wystarczy to zrobić RAZ, z automatu przy pomocy czarodzieja (wizzarda) z Momentics’a (nie to co w poprzedniej wersji SDK, która wymagała rejestracji w Internecie, i wymiany emaili z RIMem, która trwała kilka godzin!) i włączyć tryb developerski na urządzeniu i oczywiście zapomnieć (na jakiś czas, aż klucze nie wygasną :D). W dodatku dla wygody, FriutBat również odnajduje te klucze w ich domyślnych lokalizacjach i nie musimy tego tam ustawiać.

Jeszcze końcowa uwaga, zanim przejdziemy do mięska – wszystkie te narzędzia, które wymieniłem po liście SDK, nie są oficjalnie wspierane przez RIM, a przez grono programistów, którym się nudzi po godzinach. Mimo to wszystko działa w jak najlepszym porządku i nie spotkałem się z jakimikolwiek problemami.

Jeśli nie chcesz stosować tych sztuczek, to po prostu kup Adobe Flash Buildera, a wszystko skonfiguruje się samo.

 

Moja pierwsza aplikacja!

  • Uruchamiamy FlashBuildera i tworzymy nowy projekt (Project –> New Project) w oparciu o szablon Air BlackBerry Playbook. Nazwijmy go “MyAirTest”.

MyAirTest_Template

  • Próba kompilacji zakończy się błędem:

     

    Error: a target file must be specified
    Use 'mxmlc -help' for information about using the command line.

    Rozwiązanie: w oknie ‘Project’, naciskamy PPM na pliku MyAirTest.as i wybieramy opcję “Set Document Class”.
  • Kolejny błąd, choć tym razem inny:

MyAirTest\src\MyAirTest.as: Error: A file found in a source-path 'MyAirTest' must have the same name as the class definition inside the file 'Main'.

Rozwiązanie: Szablon źle nazywa główną klasę (tzn. Main), a powinna ona nazywa się tak samo jak plik, w którym się znajduje.

  • Otwórzmy może oryginalną dokumentację i spróbujmy skopiować przykładowy program autorów PlayBooka (pamiętajmy o nazwie głównej klasy, aby zmienić ją na MyAirTest).
  • Kompilacja powinna się udać.
  • Przeciągamy plik application.xml z katalogu ‘bin’ naszej aplikacji na okno aplikacji FruitBat. Automatycznie wczyta on wszystko o naszym programie i powinniśmy być gotowi do instalacji na urządzeniu! Brawo!

MyTestApp_Install

  • Ale nie tak szybko, bo oto kolejne problemy:

Error 305: Initial window content SWF version 11 exceeds namespace version http://ns.adobe.com/air/application/2.5

  • A zatem w application.xml zmieniamy spodziewaną wersję SDK z 2.5 na 2.6 (lub wyższą), poprzez zmianę na “http://ns.adobe.com/air/application/2.6”.
  • Poprawmy od razu informacje o naszym podpisie. W pliku blackberry-tablet.xml wpisujemy odpowiednie informacje w tagach “authorId” oraz “author”. Muszą być one zgodne z debug-toknem, który wgraliśmy na urządzenie!
  • I wgrywamy wszystko FruitBatem (utworzy on podpisany plik *.bar) i używając połączenia WiFi lub USB (zależnie od podanego adresu IP urządzania) i automatycznie je uruchomi.
    I oto cała tajemnica…

PlayBook_MyAirTest

Moja druga aplikacja!

Cóż, w tym momencie nie pozostaje nic innego jak tylko uczyć się Action Script 3. Ciekawsze przykłady – a mianowicie jak utworzyć menu, zakładki, wyszukiwanie itp. znajdują się na portalu blackberry.github.com. Pociąga to za sobą jedną niedogodność – trzeba samemu ręcznie utworzyć pliki projektów zgodne z FlashDevelop (bazując na tych z Flash Buildera). Nie jest to bynajmniej nic trudnego, a bardziej nudne zajęcie.

Jedna podpowiedź – brakujące pliki swc z referencjami głównie do klas QNX znajdują sie tutaj:

   C:\Program Files\Research In Motion\blackberry-tablet-sdk-2.0.0\frameworks\libs

W FlashDevelop, zakładka ‘Project’, PPM na dowolnym katalogu i Add –> Existing File … –> wybieramy np. qnx-screen.swc. A już po samym dodaniu go, naciskamy na nim PPM i wybieramy opcję ‘Add To Library’, co spowoduje, że nazwa zmieni się na niebieską.

 

Co dalej?

Wszystko ;) Własne aplikacje, publikacja, natywne rozszerzenia, aby mieć dostęp do natywnego kodu… jednym słowem – ‘why do I climb a mount? because I am in love!’



Jako szczęśliwy posiadacz Kindle Touch, pragnę wycisnąć maksimum z tego urządzenia. Wszystkich, którzy również borykają się z podobnymi problemami jak:

  • instalacja alternatywnych słowników (np. do języka niemieckiego)
  • poszukują źródeł darmowych książek w języku ojczystym
  • i chcą szybko opanować, co i jak

odsyłam do świata czytników. Warta uwagi strona.



Co nim może być? Otóż – polskie znaki! Pokarało mnie potwornie, bo wszędzie próbuję stworzyć użytkownika o imieniu ‘Paweł’ (aż żal, że tak nazwałem systemowego).

Och, jak ciężko w dobie powszechnej cyfryzacji, o wsparcie chociażby dla kilku głupawych znaków tu i tam. Poległ mi na tym system online FedEx, gdzie lepiej z definicji nie używać żadnych nie ASCII-7 znaków, następnie konsola do GITa, nie umie poprawnie wyświetlić mojego imienia, ani znaleźć katalogu domowego,  a teraz rady sobie nie dają narzędzia do Android na Windows 7.

I tylko jedno lekarstwo przychodzi do głowy – symlink tych wszystkich głupawych odmian, do mojego folderu. W Windows 7 junction robi się tak:

C:\Users>mklink /D "PaweĹ‚" "Paweł"

Znowu możemy poczuć się prawie jak w domu!



Autor

Paweł Hofman [CodeTitans]

ASP.NET
C/C++, C#, Objective-C
SQL

License and Disclaimer

Moje Gry i Aplikacje

Zobacz mnie na GoldenLine

Zobacz mnie na LinkedIn
Supported by Polish SQL Server User Group (PLSSUG)

Supported by WrocNet.org

Zine.net.pl

Wpisy

Projekty

Moje projekty open-source:

Sign in