Dzisiejszy odcinek jest sponsorowany przez problem zarządzania prywatnymi finansami. Wpadłem na pomysł zrobienia usługi + aplikacji klienckich (Web i Windows Phone) do zbierania danych o moich wydatkach. Mogłem oczywiście sprawę rozwiązać Excelem. Przeklikiwanie arkusza na telefonie nie należy jednak do najprzyjemniejszych rzeczy.

Rozważałem napisanie usługi w pythonie, jednak chciałem sprawdzić nowości na platformie firmy Microsoft. Ostatecznie wybór padł na ASP.NET vNext. Nowa wersja ASP.NET ma ogromną zaletę - łączy usługi Web API ze stronami WWW frameworka MVC. Dzięki temu, jestem w stanie napisać usługę REST i aplikację WWW opartą o Angular.js w jednym projekcie. Aplikacja będzie działała w trybie self-hosted na Raspberry Pi.

Czym jest ASP.NET 5?

W dużym skrócie, ASP.NET 5 (vNext) jest:

  • przyszłą, pisaną od nowa, wersją ASP.NET MVC (6),
  • połączeniem ASP.NET MVC, ASP.NET Web API i ASP.NET Web Pages,
  • otwartym kawałkiem kodu, który możemy dowolnie edytować.

Jedną z większych zalet ASP.NET 5 jest wieloplatformowość - aplikacje mogą być uruchamiane zarówno na Windowsie, jak i systemach GNU/Linux czy Mac OS X. Co istotne, wszystkie platformy są oficjalnie wspierane przez Microsoft.

Dlaczego Raspberry Pi?

Raspberry Pi było akurat pod ręką. Miniaturowy komputer leżał nieużywany w szafie i czekał aż z niego skorzystam. Miał służyć jako multimedialny hub, ostatecznie jednak postawiłem na usługi zewnętrzne (Spotify).

Instalacja pakietów

Zanim rozpoczniemy właściwą instalację, potrzebujemy kilkunastu pakietów. Większość z nich to zależności mono.

UWAGA: Moje Raspberry Pi działa pod kontrolą Raspbiana. Jeżeli posiadasz inny system operacyjny (np. Pidora), być może będziesz musiał/a skorzystać z innego managera pakietów (yum, pacman etc.).

  1. Logujemy się przez SSH na Raspberry Pi.
  2. Aktualizujemy repozytorium pakietów:
$ sudo apt-get update
  1. Pobieramy niezbędne pakiety:
$ sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev build-essential git-core automake libtool libglib2.0-dev libxrender-dev libfontconfig1-dev libpng12-dev libgif-dev libjpeg8-dev libtiff5-dev libexif-dev mono-complete screen lynx

GNU Screen

Kompilacja mono trwa kilka godzin. W razie zerwania sesji SSH, proces zostanie przerwany. Rozwiązaniem jest wykonywanie poleceń w sesji screen. GNU Screen jest programem utrzymującym uruchomione zadania po wylogowaniu użytkownika. Posiada też inne zastosowania (podobno ktoś z nich korzysta). Uruchomienie nowej sesji sprowadza się do wykonania:

$ screen -S mono

Odłączamy się od sesji za pomocą skrótu CTRL + A, D. Po tej operacji możemy bez problemu się wylogować. Aby przywrócić odpiętą sesję, wystarczy wpisać:

$ screen -r mono

Voila. Możemy spokojnie odłączyć się od RPi w trakcie kompilacji.

Instalacja mono

Wszystko gotowe, czas zainstalować środowisko uruchomieniowe

  1. Ściągamy najnowsze źródła mono:
$ sudo git clone git://github.com/mono/mono.git
  1. Przechodzimy do repozytorium:
$ cd mono
  1. Uruchamiamy konfigurator autogen:
$ sudo ./autogen.sh -prefix=/usr/local -enable-nls=no

Plotki mówią, że zamiast parametru -prefix/-enable-nls, konieczne może być użycie .prefix/.enable-nls.

  1. Ściągamy binarkę mini-kompilatora C# monolite (część mono jest napisana w C#; żeby skompilować mono, musimy najpierw posiadać mono ;-))
$ sudo make get-monolite-latest
  1. Kompilujemy mono:
$ sudo make EXTERNAL_MCS="${PWD}/mcs/class/lib/monolite/gmcs.exe"
  1. Instalujemy mono:
$ sudo make install
  1. Sprawdzamy, czy wszystko poszło zgodnie z planem...
$ mono -V
Mono JIT compiler version 3.10.1 (master/8d9f05e czw, 23 paź 2014, 20:16:10 CEST)

Super; możemy odpalić pierwszy program!

  1. Uruchamiamy testowy program:
$ echo 'namespace Test { public static class TestClass { public static void Main() { System.Console.WriteLine("Hello, Mono!"); } } } ' > Main.cs
$ sudo chmod -x Main.cs
$ mcs Main.cs
$ mono Main.exe
Hello, Mono!

Jak widać, wszystko przebiegło pomyślnie. Możemy kompilować programy przeznaczone na platformę .NET 4.5 i niższe.

Instalacja ASP.NET vNext

Centralnym punktem frameworka ASP.NET vNext jest menedżer wersji kvm (K Version Manager). Za jego pomocą instalujemy różne wersje frameworka, a także przełączamy się między nimi.

  1. Instalujemy kvm:
$ curl https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.sh | sh && source ~/.kre/kvm/kvm.sh
  1. Przechodzimy do repozytorium:
  1. Instalujemy najnowsze kre:
$ kvm upgrade

Wielki test

W celu sprawdzenia konfiguracji naszego nowego serwera ASP.NET vNext, uruchomimy prostą aplikację.

  1. Ściągamy repozytorium:
$ git clone https://github.com/Keraxel/MvcNext.git && cd MvcNext
  1. Dodajemy certyfikaty (są niezbędne do pobrania zależności):
$ sudo certmgr -ssl -m https://go.microsoft.com
y
y
y
y
$ sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net
y
$ sudo certmgr -ssl -m https://nuget.org
y
y
$ mozroots --import --sync
  1. Uzupełniamy zależności projektu:
~/MvcNext $ kpm restore -s https://www.myget.org/F/aspnetvnext/ -f https://nuget.org/api/v2/
~/MvcNext $ mv ~/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-alpha4/native/darwin/universal/libuv.dylib ~/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-alpha4/native/darwin/universal/libuv.dylib.backup
~/MvcNext $ cp libuv.so.1 ~/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-alpha4/native/darwin/universal/libuv.dylib
  1. Uruchamiamy projekt:
~/MvcNext $ cd MvcNext
~/MvcNext/MvcNext $ k kestrel
Started

Działa! Możemy wejść do aplikacji: http://[ip]:5004/Users.

Aplikacja ASP.NET vNext na Raspberry Pi (Kestrel)
Aplikacja ASP.NET vNext na Raspberry Pi

Do aplikacji można się dostać również poprzez przeglądarkę Lynx, bezpośrednio na Raspberry Pi:

$ lynx http://[ip]:5004/Users

W następnym wpisie napiszę o samym ASP.NET vNext: zmianach, nowościach i niespodziankach, które zaserwował Microsoft.