Development z Zapomnianej Strony

..:: Paweł Hofman .NET Portal ::..

W końcu, po tylu latach czekania udało się! Gratulacje dla firmy Xamarin, wreszcie mamy Mono w wersji hardfloat na swoje Raspberry Pi.

Jak skompilować i zainstalować tę wersję można poczytać tutaj lub tutaj. Trochę czasu to trwa,  trzeba być naprawdę cierpliwym (niemal cały dzień, jeśli robimy to na urządzeniu).

Niestety sama kompilacja wymaga też zainstalowania poprzedniej wersji Mono, która hardfloat nie była. Kończymy więc z dwoma wersjami działającymi jednocześnie (stara v2.8 w /usr/bin/mono i nowa v3.2 w /usr/local/bin/mono), przy czym domyślą dla uruchamianych plików .NET .exe jest stara wersja.

Jeśli zatem mamy program, który wyświetla tylko aktualną datę, to po uruchomieniu:

./current_date.exeotrzymamy:

Current date: 0/735244/0001 1:26:16 AM

Z kolei uruchamiając:

mono current_date.exeotrzymamy spodziewaną aktualną datę:

Current date: 1/11/2014 1:27:20 AM

Ustawmy zatem nowszą wersję Mono jako domyślną:

sudo update-alternatives --install /usr/bin/cli cli /usr/local/bin/mono 50    
sudo update-alternatives --set cli /usr/local/bin/mono

Od tej pory oba sposoby uruchamiania dadzą ten sam, spodziewany wynik.



Kolejny kamień milowy osiągnięty. Od dzisiaj biblioteka JSON@CodeTitans dostępna jest jako pakiet NuGet. Obsługiwana jest większość dostępnych aktualnie platform .NET.

Instalacja:

PM> Install-Package codetitans-jsonZapraszam do korzystania.



Święta, czas lenistwa i objadania, a może by tak w międzyczasie zrobić coś pożytecznego albo czegoś się nauczyć?

Zgodnie z poprzednimi wpisami, najnowsza wersja Synology DSM dostarcza pakiet Mono, który oprócz możliwości uruchamiania aplikacji napisanych w .NET, pozwala też tworzyć własne strony ASP.NET. Co ciekawe obsługuje też ASP MVC, a że wsparcie bazy danych MySQL jest wbudowane i nic nie trzeba robić, żeby z niej korzystać (no może oprócz zainstalowania pakietu phpMyAdmin), to już jest małe pole do popisu dla kogoś, kto nie chce dodatkowo płacić za zewnętrzny hosting. Lub po prostu szuka rozrywki i chce zobaczyć, czy to faktycznie działa, a swoich wrażliwych danych udostępniać poza własne podwórko.

O zwykłych stronkach ASP.NET oraz MVC piszą wszyscy, zatem zaproponuję coś innego. Chcę, aby każdy (w rozumieniu dowolny, o który zapyta przeglądarka) plik z rozszerzeniem “.echo” w dowolnym folderze zwracał tekst “echo” jako odpowiedź z serwera. Proste?

http://<host>/test-site/site.echo ---> “echo”    
http://<host>/test-site/wei475kra/aka2kdfhwawo24id09hg.echo ---> "echo"

Ktoś zaraz powie, że to głupie i bezsensowne, ale dla mnie nie do końca. Bo jak mamy taką usługę działającą, to już niewiele trzeba, aby z URLa zrobić REST, a proste zwracanie tekstu “echo” przerobić na odpowiedź z serwera potwierdzającą (lub nie) wykonanie zadanej akcji. Innymi słowy rozszerzona wersja, zapytania zwracałaby uwagę na sam kształt URLa, nazwy pliku oraz danych przesłanych (przy żądaniach HTTP POST request):

http://<host>/test-site/psy/list.echo ---> lista psów
http://<host>/test-site/psy/<id>/details.echo ---> szczegóły konkretnego psa
http://<host>/test-site/psy/<id>/delete.echo ---> usuwa zwierzaka z bazy
Adnotacja: dostęp do bazy MySQL otrzymamy pobierając Connector/Net v6.6.4 i używając w projekcie MySql.Data.dll dla .NET Frameworka v2.0.






Przejdźmy wreszcie do sedna, jak to wszystko poskładać:

1. Tworzymy nowy projekt ASP.NET Application w Visual Studio dla .NET Frameworka 2.0

2. Tworzymy własny IHttpHandler, który będzie niedługo obsługiwał zwracanie tekstu ‘echo’ dla wszystkich plików “.echo”. Przykładowo może on wyglądać tak:

public sealed class EchoService : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var response = context.Response;
        response.ContentType = "text/plain";
        response.ContentEncoding = Encoding.UTF8;
        response.Clear();
        response.BufferOutput = false;
        response.Write("echo");
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

3. Zmieniamy plik Web.config, a dokładnie dodajemy sekcję httpHandlers w system.web tak, aby przekierować obsługę plików z rozszerzeniem “.echo” do naszego nowego serwisu (w miejsce <namespace> należy wstawić dokładną przestrzeń nazw klasy w wynikowym assembly):


<system.web>
   ...

   <httpHandlers>
     <add path="*.echo" verb="*" type="<namespace>.EchoService"/>
   </httpHandlers>
</system.web>

Wydawać by się mogło, że to już wszystko. I faktycznie tak by było, gdybyśmy używali produktów Microsoftu (Cassini, IIS, IIS Express). Jednak w naszym świecie Mono + Synology musimy jeszcze troszkę się pomęczyć.

A mianowicie, gdy spróbujemy teraz wgrać naszą aplikację do folderu /volume1/web/test-site, okaże się, że otrzymujemy błąd serwera. Z pomocą przychodzi oczywiście dokumentacja modułu Mono i połączenie go z serwerem WWW Apache. Szczegóły tutaj.


4. Logujemy się z konsoli na Synology i edytujemy plik: mod_mono.conf, dodając do niego między innymi wymuszenie obsługi żądań HTTP dla plików “.echo” przez moduł Mono oraz definiując prywatną aplikację wewnątrz Mono, która sama sobą będzie zarządzać. Bez tego ostatniego kroku Mono po prostu będzie serwować pliki z dysku z zadanej lokacji i oczekiwać, że pliki “.echo” fizycznie istnieją, co przecież nie jest prawdą. Czyli w naszym przypadku cały czas po prostu zwracałoby błąd.

cd /usr/syno/apache/conf/extra
vi mod_mono.conf


I dodajemy w nim na końcu:

AddType application/x-asp-net .echo
Alias /test-site "/volume1/web/test-site"
MonoApplications "/test-site:/volume1/web/test-site"
<Location /test-site>
     SetHandler mono </Location>

5. Na koniec już tylko restart sewera Apache WWW

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

I gotowe! Wesołych świąt!



Kilka dni temu miała miejsce premiera najnowszej wersji systemu operacyjnego Synology DSM 4.1. (do pobrania tutaj). Nie ma więc na co czekać. Aktualizujemy swój NAS i oto oczom naszym ukazuje się pakiet opcjonalny “Mono 2.11.1 (beta)”, który po zainstalowaniu dostarcza nam pełną funkcjonalność .NET Frameworka. Czyli jest wszystko to, co opisywałem wcześniej (oczywiście bez etapu kilkugodzinnej kompilacji) i coś ekstra dostarczone przez Synology. Dodatkowo aktualizuje się wewnętrzny serwer Apache tak, że w katalogu “web” możemy od razu tworzyć w pełni funkcjonalne stronki ASPX i MVC!



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!



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!



Jeśli zajmujesz się na poważnie pisaniem aplikacji na Windows Phone i często korzystasz z emulatora, to jest jedna opcja, która może ci pomóc w debugowaniu. Otóż emulator wyświetla logi na konsoli! Tak, korzysta ze standardowej konsoli w Windows. Domyślnie jest ona niestety ukryta. Brakuje menu, aby ją pokazać, zatem pozostaje tylko ustawienie magicznej wartości w rejestrze:

  • na maszynie 32-bitowej:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\XDE]
"EnableConsole"=dword:00000001

  • na maszynie 64-bitowej:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\XDE]
"EnableConsole"=dword:00000001

Miłego podglądania!



maj
30

Obfuscator dla .NET

by Paweł | Tags:

Jakby tu zabezpieczyć swoje programy .NET-owe?

Szukałem, szukałem i znalazłem – darmowy obfuscator Eazfuscator.NET. Mnogość funkcji oraz wsparcie dla wszystkich współczesnych wersji platformy Microsoft .NET stawia go moim zdaniem na równi z płatnymi wersjami wielu innych firm znanych na rynku. Jedyne, czego życzyłbym sobie jeszcze w tym zestawie, to wsparcie dla Mono (chociaż samej manipulacji metadanymi), ale i tak duże wrażenie robi zaangażowanie autora w ten projekt przez tyle lat!

Życzę dalszej i równie dużej motywacji.



Testowanie - niestety temat zapomniany i zupełnie zignorowany przez twórców Windows Phone 7. Jakoś w głowie mi się nie mieści, że premiera telefonu odbyła się trzy miesiące temu, po raz pierwszy telefon pokazano światu w marcu 2010 i do dzisiejszego dnia nie doczekał się od oficjalnego frameworka testowego zintegrowanego z Visual Studio. Aż jestem ciekaw, jakim cudem tak dobrze go przetestowali i czy w ogóle zamierzają coś w tę stronę ruszyć. Bo widzę, nawet po kursie na virtualstudy.pl, że dużo ludzi interesuje się dużo bardziej cyklem życia aplikacji, niż prowadzeniem dobrego projektu na tej platformie (nie obrażając nikogo oczywiście).

Na samym początku wyjaśnię zatem, że oczywiście chodzi nam o pisanie testów, do których już przywykliśmy – czy to używając MS Unit Testing Framework, czy NUnit, używając atrybuty, które znamy i które nie sprawiają nam kłopotu oraz całego tego podejścia.

Tak, czy inaczej, błądząc po Internecie i marnując kolejne godziny możemy znaleźć garść przydatnych materiałów, które pozwolą uzbroić nas w środowisko do zabawy. Podejrzewam, że większość nie ma za dużo czasu, zatem przejdźmy od razu do meritum. Polecam zatem przestudiowanie przynajmniej:

  • Wystąpienia Jeffa Wilcoxa na MIX2010 o testowaniu Silverlight3 i Silverlight4. Co ciekawe, jest on członkiem zespołu Silverlight (tworzącego między innymi Silverlight Toolkit) i pokazuje on tam między innymi swój autorski projekt. Doprawdy, podziwiam takich ludzi. Ale ciągle daje mi do myślenia, dlaczego Microsoft nie wspiera tego aktywniej (albo samemu?).
  • Najnowszą wersję bibliotek, które trzeba dołączyć do projektu automatycznego testowania (o czym za chwilkę) znajdziemy na jego blogu. Dla potomności skopiowałem to również tutaj. Niestety jest to wersja z maja 2010, a mamy ostatni dzień grudnia i choć dzisiaj działa, to ciekawe jak będzie w niedalekiej przyszłości. Kontaktowałem się z Jeffem i obiecał rzucić okiem (popatrzeć na problemy, które mu zgłosiłem) i wypuścić nową wersję niedługo. Wszyscy jednak wiemy, jak to jest z wolnym czasem… no jest wolny ;)

Na koniec zostawiłem sobie zbudowanie aplikacji testowej. Oryginalny post, na którym bazuję znaleźć można tutaj. Jednak jak dla mnie jest on nieco przekombinowany. W skrócie mówi on o tym, że:

  1. Trzeba już mieć zainstalowane narzędzia do pracy z Windows Phone 7.
  2. Utworzyć najzwyklejszy projekt Silverlight3 dla Windows Phone 7.
  3. Dodać referencje do bibliotek Jeffa.
  4. Usunąć wszystkie strony aplikacji, gdyż to framework będzie je tworzył sam (za chwilkę).
  5. Zmodyfikować konstruktor aplikacji App() tak, aby oprócz monitorowania wyjątków, ustawiał odpowiednio widok (wszystko inne należy skasować z konstruktora):
    this.RootVisual = UnitTestSystem.CreateTestPage();
  6. I najważniejsze – CreateTestPage(), posiada też wersję, która przyjmuje dodatkowe opcje konfiguracji (UnitTestSettings). Wśród nich jest między innymi lista assembly, które mają być przeszukiwane w celu lokalizacji testów. Dodajemy do niej oczywiście wszystkie, które nas interesują. Po co? No ja osobiście wolę oddzielić same testy, od aplikacji, która je odpala. Mimo wszystko testy można użyć jeszcze gdzieś indziej, a tej aplikacji to już nie zawsze.

Wesołego TDD!



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