wtorek, 30 kwietnia 2013

dotnetconf (2)

Kontynuacja moich komentarzy do sesji dotnetConf. Dziś skupiam się na technologiach webowych  - responsive design, require.js, ASP.NET MVC, ASP.NET Web API, SPA (knockout.js, durandal.js, breeze) oraz JavaScript.

 

Responsive Design: Designing from Mobile Up

Problem: wczytywanie całego JS, zasobów, obrazków, które w danym przypadku nie są potrzebne. Mobile first lub stopniowa degradacja. Dobrze pobierać tylko potrzebny JavaScript w danym przypadku np. dla urządzeń mobilnych nie pobierać jquery. Można wspierać różne rozmiary obrazków. Dobre kawałki kodu, by w zależności od urządzenia ładować niektóre obrazki i pliki JavaScript ładować dynamicznie w sposób warunkowy:

image

AdaptJS - w zależności od rozmiarów ładowanie tylko potrzebnych CSS-ów

RespondJS - polyfill dla media queries dla IE < 8

EnhanceJS - załącza CSS/JS w zależności od media queries

http://wildermuth.com/2013/4/26/My_DotNetConf_Talk_on_Mobile-First_Design - materiały autora prezentacji

http://www.lukew.com/ - ojciec filozofii RWD

http://bradfrostweb.com/blog/web/mobile-first-responsive-web-design/ - mobile first RWD

http://blog.cloudfour.com/where-are-the-mobile-first-responsive-web-designs/ - artykuł o RWD

Cóż więcej dodać, Shawn Wildermuth poprzez pokazanie doładowań na żądanie oraz kilka bibliotek i linków, zrobił dobrą prezentację.

 

Using require.js in an ASP.NET MVC application

Standardy modułów - CommonJS i AMD.

image

image

Pakiet nuget RequireJS - HTML helper w przypadku ASP.NET MVC

image

image

https://github.com/jcreamer898/RequireJsMvc

 

HTTP the Right Way with ASP.NET Web API

image

image

http://webapibloggers.com/

http://aspnetwebstack.codeplex.com/

Podsumowując: prezentacja pokazuje różne możliwości ASP.NET Web API, dobra, ale nieprzełomowa. Znowu problemy z przerwami w transmisji (kolejnych kilka przebitek z pilnującym porządku słynnym Scottem Hanselmanem)

 

Single Page Web Apps (SPA) Jump Start

Prezentacja słynnego Johna Papy.

image

Capture

https://trello.com/

gmail

http://www.johnpapa.net/asp-net-spa-templates/

http://www.johnpapa.net/hottowel/

image

image

image

image

image

image

image

image

image

image

image

image

image

http://www.johnpapa.net/spa/

http://www.pluralsight.com/training/Courses/TableOfContents/single-page-apps-jumpstart

Cóż dodać, jak zwykle bardzo dobra prezentacja Johna Papy. Muszę przyznać, że gotowymi tranzycjami w kompozycji widoków w Durandal.js oraz gotowym sposobem na budowę zapytań i datacontext w Breeze zachęcił mnie bez dwóch zdań do przyjrzenia się tym frameworkom.

 

Rediscover JavaScript

Sesja z podstaw JavaScript. Jakoś nie przykuła mojej uwagi (wiele podobnych sesji już widziałem wcześniej). Autor zatoczył w swoim życiu koło, zaczynał z JavaScript dla ASP, przeszedł apogeum .NET, przeżył erę AJAX, zgłębiał jquery i na koniec znowu doszedł do czystego JavaScript i postulatu, by klient i serwer pisać w tych samych technologiach.

 

Angry Birds of Modern JavaScript Development

Świetna prezentacja o szerokiej problematyce budowania aplikacji JavaScript. Zdarzenia, moduły, weryfikacja poprawności kodu, mockowanie danych, frameworki do szablonów, wzorce projektowe (uniwersalne i typowe dla JS), narzędzia.

image

image

https://github.com/postaljs/postal.js

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

http://garann.github.io/template-chooser/

image

image

image

image

image

image

image

https://github.com/ifandelse/machina.js

image

image

image

image

image

Bower - menadżer pakietów dla web

Yeoman - workflow dla aplikacji web

http://www.elijahmanor.com/2013/03/angry-birds-of-javascript-series.html

niedziela, 28 kwietnia 2013

dotnetconf (1)

Ostatnio odbył się event dotnetConf - The .NET Community Virtual Conference. Co ma światowa społeczność .NET do powiedzenia o .NET w 2013 roku?  No właśnie, odnoszę wrażenie, że pod tym szyldem zostało wrzucone wszystko to, co ostatnio zwróciło moją bądź moich kolegów uwagę. Mamy m.in “Roslyn”, responsive design, git, open source, programowanie w JavaScript, ASP.NET MVC, ASP.NET Web API, SPA, Windows Phone 8, MongoDB, NoSQL, obsługę istniejących baz danych w EF, Windows Azure.  Po raz kolejny zniknęły tradycyjne tematy związane z .NET. Najbardziej typowe dla .NET są prezentacje o “Roslyn” (ostatnia oznaka rozwoju samego .NET/C#), ASP.NET Web API i Windows Phone 8, EF, Azure, może jeszcze jedna zahaczająca o ASP.NET MVC (6/17). Co ciekawe zabrakło prezentacji o Windows 8. Czyżby nie przekonał społeczności? Owszem są też bardziej uniwersalne tematy powiązane z .NET, jak debugowanie, testowanie, NoSQL, open source (5/17). Jednak spory udział ma JavaScript i tworzenie aplikacji webowych po stronie przeglądarki (5/17). Zobaczymy co przyniesie BUILD 2013, ale każda kolejna konferencja daje mi znak, że dotychczasowa era intensywnego rozwoju .NET i C# gdzieś się skończyła, coś przeewoluowało, teraz tylko tematy webowe lub mobilne. W każdym razie wybrałem sobie dwunastkę do obejrzenia, na razie obejrzałem dwie, o których pisze pod spodem.

 

Advanced Windows Phone 8 Development

Pakiety nuget

Json.Net – deserializacja JSON

HTTP Client Libraries - HttpClient z obsługą async!  (prerelease)

image

image

Pokaz MVVM, IoC, danych w design time, mowa, trochę agenta. Po tytule spodziewałem super zaawansowanych rzeczy, a tymczasem wszystko okazało się znajome. Jedynie dwa pakiety nuget i kod klienta JSON zwróciły moją większą uwagę. Sporo problemów podczas prezentacji z dźwiękiem, 3 czy 4 razy były przerwy i za każdym razem był pokazywany czuwający Scott Hanselman –;)

 

Utilize Compilation as a Service to create the next level plugin capability

Ponieważ ostatnio używałem najnowszej wersji “Roslyn”, więc prezentacja początkowo nie przykuwała mojej uwagi. Po kilkunastominitowej części robi się znacznie ciekawiej, bo następuje pokaz pisania plug-inu dla Visual Studio.

image

Kwestie bezpieczeństwa przy ładowaniu plug-inów. To co ostatnio akurat widziałem – complify i konsolowa aplikacja REPL. Programowanie aspektowe – Postsharp, Roslyn i refleksja:

image

image

image

W sumie nie jest to coś nadzwyczajnego. Do plug-inu Postsharpa wrzucona dynamiczna kompilacja. Jednak całościowo robi wrażenie.

sobota, 27 kwietnia 2013

Windows 8.1 - kolejne informacje

Dla odmiany pora na kolejną porcję nieoficjalnych informacji o nadchodzącym Windows 8.1 na bazie światowych serwisów: winsupersite, neowin, winbeta, windowsbleu.

Wymienione serwisy w bieżącym miesiącu poświęcają dużo uwagi buildom 9369 i 9374, ostatnio ich uwaga zaczyna się przenosić na 9385 (który podobno jest sygnowany jako “Windows Blue Preview Beta”). Pojawia się też coraz więcej sygnałów, że być może powróci przycisk “Start” oraz pojawi się opcjonalne bootowanie z pomięciem ekranu startowego.    

Dziś postaram się krótko podsumować informacje o buildzie 9374.

Ekran startowy

Szybszy dostęp do wszystkich aplikacji z poziomu ekranu startowego. Przewija się go palcem w dół lub przy myszce pojawia się przycisk ze strzałką. Całość przypomina rozwiązanie z Windows Phone, tylko orientacja jest inna.

9374_02

Więcej informacji

Zarządzanie aplikacjami

Lista wszystkich aplikacji

  • Sortowanie po nazwie, dacie, ostatnio używanych
  • Wyszukiwarka bez kontraktu Search

9374_03

Przy odinstalowywaniu aplikacji opcja dla bieżącej lub wszystkich maszyn. Więcej na In Blue: Multi-PC App Uninstall.

Wyszukiwarka

Wejście w wyszukiwarkę nie przewija już ekranu Start. W domyślnym trybie wyszukiwania w wynikach mogą być uwzględniane dane z różnych aplikacji, w tym z Internetu.

9374_06

Wyszukiwarka działa także w trybie desktop. Więcej na Windows 8.1 9374 shows search charm won't take over screen.

Menadżer plików

W trybie Modern UI jest systemowa aplikacja Files.

9374_08

Tryb kiosku

Kojarzy się trochę z Kid’s Corner z Windows Phone 8. Daje możliwość uruchomienia tylko 1 aplikacji. Jest to otwarcie się na muzea, lotniska, sklepy, restauracje, hotele, biblioteki itd, zwłaszcza aplikacje POS z ekranem dotykowym. Wystarczy utworzyć konto użytkownika z ograniczonymi uprawnieniami i skonfigurować tryb kiosku wybierając konto i aplikację.

Więcej informacji na:

Obsługa urządzeń (WinRT API)

Obsługa urządzeń POS (czytników kodów kreskowych, drukarek paragonów, czytników kart, itp…). Lepsza obsługa VPN, lepsza autentykacja za pomocą SmartCard, rozszerzona obsługa peryferyjnych urządzeń USB, itd. Więcej na Windows 8.1 API reveals extended point-of-service support.

Ustawienia

Sporo nowych zakładek i opcji konfiguracyjnych (pokazano je na filmikach z buildami 9369 i 9374). Pewnym uzupełnieniem są linki:

Warto wspomnieć o rozbudowanych opcjach synchronizacyjnych (ekran startowy - kafelki i ich układ, kolory, tło, tapeta, podobnie lock-screen, desktop - temat, pasek zadań, wysoki kontrast; przeglądarka internetowa - ulubione, strona startowa, historia, zachowane hasła;  system - m.in ustawienia językowe, klawiatury, ułatwień dostępu itd.)

Internet Explorer 11

W katalogu IE w Program Files znajduje się aplikacja F12.exe stylowana na Modern UI.

Na koniec…

Na koniec jedna jeszcze ciekawostka z buildu 9369. Podobno odkryto tam wsparcie dla systemu plików ReFS (znanego z Windows Server 2012). Więcej na Windows 8.1 build 9369 includes ReFS support.

Pamiętajmy, że są to nieoficjalne informacje. Wiążącą odpowiedź da pod koniec czerwca konferencja BUILD.

środa, 24 kwietnia 2013

Dynamiczne aplikacje Web API

ASP.NET Web Forms są powszechnie uważane za nie najnowszą już technologię. Dziś wszyscy sobie na ogół chwalą ASP.NET MVC lub coraz częściej Web API. Czy słusznie? Na ogół tak, dostajemy wszak uporządkowaną warstwową architekturę MVC czy same tylko serwisy Web API. Odkryłem jednak ostatnio, że im nowsza z wymienionych technologii tym mniej w niej dynamicznej kompilacji, co z kolei utrudnia modyfikację aplikacji bez jej ręcznej całościowej rekompilacji. I tak:

  • ASP.NET Web Forms - największy zakres dynamicznej kompilacji (można dużo zaszyć w stronach)
  • ASP.NET MVC - dynamiczną kompilacją objęte widoki (ale modeli  i kontrolerów już to nie dotyczy)
  • ASP.NET Web API - brak w standardzie dynamicznej kompilacji (same modele i kontrolery, domyślnie raz rozpoznana lista kontrolerów jest cachowana)

Czy jednak w nowszych technologiach nie da się uzyskać podobnych efektów? Czy musimy koniecznie żałować dynamicznej kompilacji ASP.NET? M.in na te pytania starałem się odpowiedzieć poszukując możliwości pisania aplikacji Web API w sposób dynamiczny / częściowo dynamiczny. Po praktycznych eksperymentach ukształtowały się następujące pozycje:

  1. Dynamiczne Web API (assembly resolver)
  2. Dynamiczne Web API (“Roslyn” - konsola)
  3. Dynamiczne Web API (“Roslyn” - dynamiczne odświeżanie)
  4. Dynamiczne Web API (“Roslyn” - assembly resolver)
  5. Dynamiczne Web API (scriptcs)

Omówię je teraz po kolei.

Assembly resolver

image

Zacznijmy od standardowych rozwiązań. I tak mamy w Web API interfejs IAssembliesResolver. Jego implementacja służy do określenia listy assemblies, które będą uwzględniane przy szukaniu kontrolerów. Domyślnie uwzględniane są rzeczy z naszego projektu po jego kompilacji, ale możemy to zmienić i załadować w locie dll-kę. Pokazuje to oficjalny Custom Assembly Resolver Sample. W moim wydaniu nieznacznie uległo to modyfikacji, tak by ładować dll-ki ze wskazanego folderu:

image

Tak zdefiniowany assembly resolver rejestrujemy:

Untitled

“Roslyn” (konsola, dynamiczne odświeżanie)

Jeśli rozważamy dynamiczność, to może w większym zakresie, tak by mieć dynamiczną kompilację?  W końcu ASP.NET takie coś oferuje. Z pomocą przychodzi nam przyszłościowy projekt “Roslyn”. Jest to realizacja idei “compilation as service”. Do dyspozycji dostajemy wysokopoziomowe API, które pozwala bardzo szybko w locie kompilować dynamicznie kod. Umożliwia to pisanie i dynamiczne wykonywanie C# w konsoli, co jest typowe dla skryptowych języków.

Podobno są plany, by zastępować kompilatory w językach .NET “Roslynem”. Podobno jest też używany wewnętrznie i został użyty w Web Matrix 2. To technologia wciąż rozwijana. Ostatnie wydanie to Microsoft "Roslyn" September 2012 CTP. Doinstalowuje się ładnie do Visual Studio 2012, także po wszystkich najnowszych aktualizacjach (co sprawdziłem osobiście). To wydanie nie wspiera już VS 2010. Nie możemy rozpowszechniać binariów z tej rozwojowej wersji, ale instalacja pakietu nuget o nazwie roslyn nie podlega już takim ograniczeniom. Dystrybucja przez nuget zawiera wszystkie niezbędne biblioteki do używania, jedynie nie dostaniemy większego wsparcia przez Visual Studio (m.in szablony, kolorowanie składni i intellisense na plikach skryptowych np. C# Script, konsola interaktywna). Warto pamiętać o “Roslyn”, zwłaszcza że na zaczynającej się jutro dotnetconf będzie to temat jednej z sesji.

Jeśli chodzi o Web API, to polecam ostatnio odkryty blog Filipa W. http://www.strathweb.com/. Jeśli chodzi o tematykę Web API + “Roslyn”, to na polecam szczególnie lekturę postów:

image

Na ich podstawie odtworzyłem sobie:

  • skryptową aplikację  hostującą Web API (uruchamianą przez program rcsi lub w Visual Studio przez View > Other Windows > C# Interactive)
  • aplikację Web API hostowaną na IIS, która buduje dynamiczne assembly ze skryptów z kontrolerami i modelami (co odbywa się w specjalnej implementacji selektora kontrolerów za każdym odświeżeniem strony lub wywołaniem z przeglądarki)

Zatrzymajmy się na chwilę przy pełnym rozwiązaniu z dynamicznym odświeżaniem kontrolerów przy każdym strzale. Umożliwia to klasa NoCacheSelector, która u mnie ma zparametryzowane ścieżki do folderów ze skryptami:

image

Powyższy selektor kontrolerów rejestrujemy:

Untitled2

Skrypty kompilowane w locie:

image   image

Dostajemy największą elastyczność. Bez rekompilacji całego projektu przy każdej interakacji dostajemy kontrolery odpowiadające aktualnie znajdującym się plikom C# w folderach Controllers (z modelami z plików C# w Models). Jak pisze jednak autor, to eksperyment z pewnym ryzykiem. Przy każdym strzale zostaje dodawane nowe assembly do domeny i pozostaje jedynie liczyć na wymuszone sprzątanie przez garbage collector.

“Roslyn” - assembly resolver

Tą wersję wymyśliłem jako miks koncepcji dotychczas zaprezentowanych. Rezygnuję z ciągłego odświeżania kontrolerów (ale także ich rekompilacji) przy każdym strzale, a w resolverze assemblies zamiast szukania i ładowania statycznych dll-ek z dysku buduję dynamiczne assembly ze skryptów z kontrolerami i modelami.

image

scriptcs

Projekt scriptcs to ostatnio bardzo medialne pojęcie. Glenn Block po swoich doświadczeniach z node.js w Windows Azure postanowił zrobić coś podobnego w… C#. Powstał projekt open source, który pozwala pisać skryptowo aplikacje w C#, taki znacznie lepszy PowerShell. Piszemy tyle C# ile potrzebujemy, odpowiednie biblioteki są dociągane przez nuget, a całość jest dynamicznie kompilowana przez “Roslyn”. Wystarczy notatnik, nie jest potrzebne Visual Studio. Do projektu jako jeden z trzech głównych osób dokoptował Filip W. który wniósł swoje wcześniejsze doświadczenia z Web API i “Roslyn”.

Kilka linków:

Warto być świadomym obecności:

Na początek wziąłem przykład webapihost.

image

Po zainstalowaniu/zbudowaniu aplikacji konsolowej scriptcs.exe, dodaniu jej do ścieżki path w systemie, możemy uruchomić przykład. Zostaną pobrane wymagane pakiety i zapisane do folderu packages. Do folderu bin trafiają używane biblioteki. Dostajemy w pełni skryptową aplikację Web API w C# hostowaną w konsoli. Czyż nie jest to wyrażenie idei “node.cs” ?

Jeszcze prościej możemy to osiagnąć za pomocą scriptcs-webapi. Całość aplikacji może wyrażać jeden plik:

image

W tym przypadku widać jeszcze większe podobieństwo do node.js. Po co definiować za każdym razem routing? Czyż nie wystarczająco i bardziej minimalistycznie jest definiować same kontrolery, które wyrażają także w jakiś sposób adres? Bawiąc się node.js miałem właśnie skojarzenie, że wystawiane metody REST-owe to jakby akcje kontrolerów… A cała prostota wynika z odpowiedniego zaprojektowania pakietu express.

Na tym kończę przegląd dynamicznych rozwiązań dla Web API. Dodam tylko, że w tym temacie miałem jeszcze zajawki odnośnie:

  • wykorzystania MEF w Web API
  • integracji ASP.NET z Web API

W przypadku MEF dla .NET 4.5 mamy obecnie jego drugą lekką wersję w postaci  MEF for web and Windows Store apps. Owszem można znaleźć w sieci wiele przykładów łączenia Web API z różnymi wersjami MEF, jednak często dotyczą one wpięcia w infrastrukturę dla IoC. Często wydają się też dość skomplikowane (np. http://kennytordeur.blogspot.com/2012/08/mef-in-aspnet-mvc-4-and-webapi.html). Dużo informacji dostarcza też wątek http://mef.codeplex.com/discussions/389317.

Jak patrzyłem po sieci, to niektórzy próbowali definiować kompozycję na folderze, ale nie wiem czy komuś udało się osiągnąć wykrywanie w czasie run-time nowych kontrolerów, bo są one domyślnie cachowane przez Web API. Może za mało wszedłem w temat, ale wydaje mi się, że również MEF musiałby robić rekompozycję przy każdym strzale, co z pewnością byłoby nie najszybsze (lub trzeba by pomyśleć o wykrywaniu zmian). Z kolei samo jednokrotnie zaczytanie dll-ek w sposób dynamiczny mogę zrealizować w całości w oparciu o infrastrukturę Web API, jak pokazałem w pierwszym przykładzie.

Co do integracji z ASP.NET, to zainspirował mnie oficjalny przykład Web Form Sample oraz post. Jednak po przeczytaniu posta architekta ASP.NET, widać jak na dłoni, że standardowa dynamiczna kompilacja ASP.NET/Razora jest znacznie gorsza od kompilacji wykonywanej za pomocą “Roslyn” (jest znacznie wolniesza, bo korzysta z emitowania i potrzebuje innego procesu). Nawet powstał projekt https://github.com/davidebbo/RoslynRazorViewEngine zaprzęgający “Roslyn” do kompilacji Razora, co znacząco zwiększa wydajność.

środa, 17 kwietnia 2013

Node.js + IIS

Konsola jest niezłym urozmaiceniem w czasach, w których przyzwyczailiśmy się, że wszystko ma graficzny interfejs. Jednak w codziennym użytkowaniu wygodniej jest, jeśli nasz serwer jest uruchamiany w postaci usługi. Ten post poświęcę kwestii hostowania node.js na platformie Windows ze szczególnym uwzględnieniem integracji z IIS.

Mamy różne sposoby uruchamiania aplikacji node.js w postaci usługi Windows:

Niewątpliwie bardzo interesującą opcją - choć dla niektórych trochę kontrowersyjną - jest hostowanie node.js na serwerze IIS. Służy temu projekt iisnode, który jest również dzieckiem Tomasza Janczuka. Na jego blogu można znaleźć wiele postów poświęconych temu zagadnieniu. Tutaj dokonam tylko krótkiego podsumowania najbardziej istotnych informacji:

iisnode

Instalacja

Nie sprawiła żadnego problemu. Wcześniej doinstalowałem moduł IIS do przepisywania adresów URL. Instalacja przykładów wg. wskazówek również bezproblemowa. Node.js wspierany w wersji 0.8.22 x86, co jest zgodne z projektem edge.js i sterownikiem do MS SQL Server. Aha, na systemach x64 w ustawieniach puli ASP.NET dla aplikacji node.js nie zezwalamy na uruchamianie aplikacji 32-bitowych (domyślnie tak właśnie jest, ale jak ktoś ma to włączone to niech wyłączy lub stworzy dedykowaną pulę).

Zmiany

Tutaj po krótce, co zmieniałem w przykładzie prezentowanym we wcześniejszych postach.

sn11

Port

W pliku server.ts (server.js) zmieniałem port na zmienną środowiskową process.env.PORT.

Konfiguracja

Zgodnie z zaleceniami do katalogu z aplikacją node.js dodałem plik Web.config

image

W handlerach informuję IIS by plik server.js nie traktował w sposób domyślny jako statyczną zawartość dla przeglądarki, tylko jego obsługę przekazał modułowi iisnode. To podstawa wszystkiego. W opcjonalnej sekcji <rewrite> konfiguruję adresy dla aplikacji, by nie zawierały słowa “server.js”. O adresach więcej w następnej sekcji.

Adresy

Po umieszczeniu aplikacji w folderze nodejs-app na IIS, zmieniłem w niej adresy endpointów tzn. np “/api/products” na “/nodejs-app/api/products”. Podobną praktykę zaobserwowałem w dostarczonych przykładach. Umieszczanie nazwy folderu IIS w kodzie aplikacji nie wydaje mi się najlepsze, ale to tylko demo. Z pewnością da się to zrobić lepiej…

Uprawnienia

Po zhostowaniu aplikacji w IIS przestał mi działać dostęp do SQL Server’a i do COM-a Outlook. Przykładowo w przypadku SQL trzeba było dodać do jego loginów konto ‘IIS APPPOOL\DefaultAppPool’. Czyli rzeczy znane z codziennej pracy pod IIS –;)

Podsumowanie

Niektóre funkcjonalności i moduły node.js częściowo dublują IIS. Ze względów wydajnościowych z reguły lepiej używać natywnych mechanizmów.  IIS czasem wprowadza ograniczenia, coś narzuca. W każdym razie w zestawieniu IIS + node.js chodzi o udaną symbiozę, tak by wziąć to, co najlepsze z obu serwerów. Node.js daje łatwe pisanie serwera w JavaScript i zakłada asynchroniczność każdej operacji przy jednym wątku (asynchroniczne handlery w ASP.NET były od zawsze możliwe do pisania, ale dopiero ostatnio się popularyzują z uwagi na znaczne uproszczenia wprowadzone przez TPL i async). IIS dodaje m.in mechanizmy bezpieczeństwa, dzielenie portów, kompresję, cachowanie, szybkie udostępnianie statycznej zawartości.

I jeszcze jedno. Konfiguracja node.js + IIS jest używana przez:

image