wtorek, 16 kwietnia 2013

Node.js + Microsoft SQL Server (2)

Kontynuacja poprzedniego tematu, czyli Sql Server na node.js. Dziś poruszę kwestię obsługę procedur z parametrami output.

Jak wskazuje jeden z linków z poprzedniego posta, w aktualnej wersji drivera dla Microsoft SQL Server nie ma specjalnego wsparcia dla obsługi tej funkcjonalności (podobnie jak nazwanych parametrów). Jest propozycja, by zostało to zaimplementowane w postaci zwracania wielu rezultatów z procedury (wartości parametrów out jako pseudo-rezultaty).

No dobra, ale jak sobie poradzić teraz z tym? Driver Microsoft wydaje się najpewniejszym sposobem dostępu do Sql Server. Owszem można spotkać inne pakiety node.js, ale nie rzuciło mi się na oczy nic szczególnego, zwłaszcza z takim ficzerem. Zawsze mogę też użyć .NET dzięki edge.js… Ale istnieje też rozwiązanie problemu w samym T-SQL. Tymczasowo możemy opakować wywołanie procedury z parametrami out, tak by zasymulować zwracanie wielu wyników. Robimy to albo w postaci innej procedury lub w postaci ciągu instrukcji T-SQL przekazywanych wprost do obecnej wersji drivera!  W poniższym przykładzie skorzystałem z tej drugiej opcji.

Capture2_thumb5

sn9

Podobnie jak w poprzednim poście z metadanych i danych w wierszach buduję obiekty z właściwościami. Otrzymuję w przeglądarce dynamicznie wyniki w postaci JSON:

image

Uzyskałem wynik podobny to tego, jaki dostanę po zastosowaniu przyszłej wersji pakietu node.js dla MS SQL Server –;) 

poniedziałek, 15 kwietnia 2013

Node.js + Microsoft SQL Server (1)

Tym razem podsumuję sposoby dostępu do bazy Microsoft Sql Server z poziomu node.js.

Mamy ogólnie dwie wygodne opcje:

Jako że już sporo pisałem o Edge.js, dziś skupię się na dedykowanym pakiecie. Na początek kilka faktów:

Spróbujmy z node.js wywołać procedurę składowaną. Aby było ciekawiej weźmy taką, która zwraca dwa zbiory wyników. Odpowiedni kod w TypeScript/JavaScript wygląda następująco:

Capture2Capture

W przypadku wielu wyników callback w wywołaniu queryRaw jest wywoływany tyle razy, ile jest wyników (w moim przypadku dwa razy). Aby obsługa wielu rezultatów działała, używamy wywołania queryRaw z parametrem more. Bez niego zostanie zwrócony tylko pierwszy rezultat procedury. Wywołanie bez more zwykle stosujemy przy procedurach zwracających jeden wynik.

Kod z pętlami ma za zadanie zmienić strukturę zwracanych danych, tak by zamiast wszystkich metadanych kolumn i wierszy zwracać obiekty z odpowiednimi właściwościami. Zwracany do przeglądarki JSON wygląda w moim przypadku następująco:

image

Zmiana lub podmiana procedury w bazie powoduje zwracanie danych o innej strukturze bez żadnej modyfikacji kodu serwera. Pełna dynamiczność przy krótszym i prostszym kodzie niż C#. Do more with less!

sobota, 13 kwietnia 2013

Node.js + kod natywny

Dziś chciałbym poruszyć zagadnienie integracji node.js z kodem natywnym na platformie Windows.

Na stronie http://nodejs.org/api/addons.html znajdziemy opis tworzenia własnych rozszerzeń dla node.js w oparciu o kod C/C++. Nie jest to z pewnością łatwy proces. Wśród różnych czynności powstaje kompilowany plik *.node z bindingami. Taki właśnie zaobserwowałem w pakiecie drivera do Microsoft SQL Server.

Częściej jednak po prostu chcemy wywołać istniejącą już niezarządzaną bibliotekę .dll lub obiekt COM. Poniżej spisałem, co udało mi się ustalić.

Dynamiczne biblioteki C/C++ (.dll)

COM

A teraz pora na krótką relację z tego co udało się odpalić “na żywo”.

sn6

Pobieranie infomacji o systemie

Załóżmy, że ktoś nagle zapragnął, by aplikacja node.js wyświetlała informacje na jakiej wersji Windows jest hostowana. Kierując się czasem i wygodą możemy użyć .NET i znanego od dawna kawałka C#. W tym konkretnym przykładzie wygląda on następująco:

image

Najprostszy typowy kod integrujący:

image

Wywołanie JavaScript:

image

W przeglądarce mam ładnego JSON-a:

image

Wyświetlanie maili z Outlooka

Załóżmy większy odlot w postaci udostępnienia dla node.js maili ze skrzynki Inbox z aplikacji Microsoft Outlook. Co prawda to z pewnością rzadki scenariusz, ale chodziło mi o wywołanie COM-a. Pobieranie maili realizuję znanym od dość dawna kawałkiem kodu w C# (nawet nie używam dynamic):

image

Kod integrujący i wywołanie z poziomu JavaScript są zrobione tak jak w pierwszym przykładzie. W przeglądarce dostaję maile:

sn8

BTW Powyższy kod samej integracji z Outlook nie jest do końca niezawodny (kwestia otworzonych instancji), ale tak samo zachowuje się poza node.js. Chodziło mi tutaj tylko o najprostsze demo.

Inaczej?

Integrację zrealizowałem dla wygody przez .NET. Jeśli chcemy wołać natywny kod bezpośrednio z JavaScript, możemy użyć pakietów node-ffi i win32ole. Umożliwiają one odpowiednio - wywoływanie natywnych bibliotek DLL oraz obiektów OLE (jest nawet podobny przykład z mailami Outlook’a). IMHO można spróbować z nich skorzystać, gdy będziemy chcieli wywołać kompletną funkcjonalność z kodu natywnego (tzn. nie będziemy chcieli skorzystać z niej w połączeniu z kodem .NET). Pakiety te wydają mi się też bardziej eksperymentalną opcją –;)

piątek, 12 kwietnia 2013

Node.js + Edge.js (2)

Dziś poruszę wywoływanie skompilowanego assembly .NET z poziomu node.js.

image

Na początku zaznaczę, że nie bedę opisywać wszystkich zagadnień i szczegółów związanych z komunikacją JavaScript (node.js) i .NET 4.5 (maszyna wirtualna CLR hostowana w procesie node.js). U mnie to będzie konkretny praktyczny przykład takiej komunikacji. Do pełnego zrozumienia omawianej tematyki polecam zapoznanie się z informacjami pod trzema adresami:

Edge.js jest dzieckiem Tomasza Janczuka, który w Microsoft najpierw zajmował się serwisami danych, później komunikacją w Silverlight, a obecnie jego zadaniem jest tworzenie rozwiązań w oparciu o node.js, JavaScript i Windows Azure.

Po co takie wywoływanie .NET z node.js?  Chcemy oczywiście jak najwięcej nowych rozwiązań, ale nic nie jest idealne. W zależności od zmieniających się warunków i priorytetów może czasami chcielibyśmy dać sobie elastyczną furtkę, by wykorzystać część dotychczasowego kodu w C#?  Po drugie przepisywanie w wielu przypadkach nie ma żadnego sensu, chyba że rzeczywiście coś na tym zyskamy np. większą wydajność, większą niezawodność czy większą wygodę używania. Jednak skompilowany C# czy C++ na pewno będą wydajniejsze niż JavaScript (choć ostatnio pojawia się prekompilacja tego ostatniego).

Wróćmy do node.js.  Załóżmy, że czasami mamy działający “legacy code” w .NET, którego nie chcemy przepisywać. Może to być coś w stylu poniższego kodu:

image

Przejdźmy do integracji. Załóżmy najpierw, że ten kod zostanie umieszczony razem z kodem integracyjnym w jednym assembly .NET 4.5. Kod integrujący wygląda w następujący sposób:

image

Zawsze musi być klasa o nazwie Startup, która zawiera jedną lub więcej metod koniecznie o sygnaturze Func<object,Task<object>>. Ta asynchroniczność jest zawsze potrzebna, nawet gdy wykonujemy w C# prostą synchroniczną operację typu 2+2. Dlaczego?  Node.js jest jednowątkowy, CLR jest wielowątkowy, ma inny model, to zupełnie inne środowisko. Przejdźmy do wywołania powyższego kodu z poziomu TypeScript/JavaScript:

image

Assembly z kodem “legacy” i kodem integrującym znajduje się w głównym folderze serwera. Całość ładnie działa i dostajemy JSON-a w oknie przeglądarki:

image

Jak debugować powyższy kod .NET w node.js?  Bardzo prosto! Uruchamiamy nasz serwer w konsoli i attachujemy się w Visual Studio 2012 do procesu node.exe (możemy sobie wybrać, jaki rodzaj debuggera chcemy użyć, powinien być tutaj do kodu zarządzanego CLR 4.0/4.5). Zgodnie z opisem autora Edge.js to po prostu działa! Zresztą praktycznie wszystko można debugować. W przypadku C# oprócz postaci skompilowanej jest to także możliwe dla postaci skryptowej (w prawie wszystkich przypadkach).

A co, jeśli mamy “legacy” kod w skompilowanym assembly dla starszej wersji .NET, np. 4.0?  Sprawdziłem również taki scenariusz umieszczając kod integrujący w assembly dla .NET 4.5, które odwołuje się do assembly .NET 4.0. Obie biblioteki umieściłem obok siebie, jak w przykładzie powyżej. Również wszystko ładnie działa (zgodnie zresztą z teorią).

Podsumowując, łączenie node.js z .NET wygląda całkiem zgrabnie, choć daleko do bezszwowej integracji jaką oferuje Windows Runtime -;) Ale wynika to pewnie z zupełnie innego podejścia do obsługi wątków w node.js i w CLR .NET. Tutaj mamy dopasowanie do czegoś, co jest tworzone z myślą o różnych systemach operacyjnych i jest zasadniczo oparte o JavaScript. W WinRT twórcy mieli wpływ na całość rozwiązania, więc mogli zrobić to lepiej.  Ale ogólnie edge.js to super rewelacja!  Będą liczne integracje z rozwiązaniami Microsoft (m.in autentykacja ASP.NET, kryptografia, obsługa certyfikatów w magazynie, Event Log, komunikacja z serwisami SOAP i WCF, Active Directory, MS SQL). O planach rozwoju można przeczytać na http://tjanczuk.github.io/edge/#/24.

BTW jeśli chodzi o języki w Edge.js, to możliwe jest napisanie wsparcia dla każdego języka CLR, natomiast na obecny moment wspierany jest C# (w postaci skompilowanej i jako skrypt dynamicznie kompilowany) oraz Python.

czwartek, 11 kwietnia 2013

Node.js + Edge.js (1)

Wiele osób mówi, że świat zmierza ku JavaScript. Jednak czy zawsze jest to taki optymalny wybór? A co z dotychczasowym naszym kodem w innych językach? Nie będziemy chyba że wszystkiego przepisywali na JavaScript –;)  Ponadto czy kod JavaScript jest wydajny tak samo jak .NET czy C++? Owszem pojawiają się już pewne sposoby jego optymalizacji, a czasami odbywa się prekompilacja,  ale weźmy pod uwagę przeciętną sytuację. A co jeśli bedziemy chcieli skorzystać z natywnych funkcjonalności Windows albo dotychczasowych komponentów napisanych w .NET?  To wszystko wymaga współdziałania innych języków z JavaScript. Jednak do tej pory z reguły nie było to takie wygodne. Przed podobnym problemem stali z pewnością twórcy WinRT, którzy wymyślili projekcję. Ale dziś skupmy się na serwerze node.js.

Integracja aplikacji serwerowej node.js z kodem natywnym jest jak najbardziej możliwa, aczkolwiek do wygodnych i prostych nie należy. Z wielką pomocą przychodzi projekt Edge.js, który sprawadza się do hostowania CLR .NET 4.5 w procesie node.js. Ogromnie to upraszcza interoperabilność JavaScript z .NET (C#, F#, Python, w zasadzie każdy język CLR), a także korzystanie z natywnego API Windows czy komponentów COM. Co ciekawe C# możemy używać w postaci kompilowanych dll-ek, ale także w postaci skryptowej,  kojarzącej mi się z przyszłościowym projektem “Roslyn”, ale także… ze zwyczajnym ASP.NET Web Forms i MVC.

Poniżej prosty przykład wyciągający informacje z bazy Microsoft SQL Server. Tak wiem, teraz jest modny no-SQL i on jest typowy dla node.js, ale przecież relacyjne bazy danych nadal są popularne, w niektórych zastosowaniach są lepsze, a bardzo często nowe projekty muszą opierać się o istniejące rozwiązania.

Stosunkowo niedawno został wydany Microsoft Driver for Node.JS for SQL Server Preview (WindowsAzure / node-sqlserver).  Aczkolwiek są zgłoszone różne bugi, nie wszystko jest w nim zaimplementowane i potrzebny jest natywny klient do SQL Server 2012… Czy jest jakieś inne rozwiązanie? 

Tak, jeśli skorzystamy z hostowania kodu .NET. Zresztą autor Edge.js w przykładach daje prostą obsługę podstawowych operacji select, add, update, delete za pomocą ADO.NET (poniższy screen).  Bardziej złożone przypadki możemy oprogramować sobie w C# sami, przecież to już znamy. Jeśli bierzemy przykład autora to pamiętajmy ustawić zmienną środowiskową “OWIN_SQL_CONNECTION_STRING” na connection string do naszej bazy. Oczywiście instalujemy też pakiet “edge” na node.js.

sn4

Dysponując już takim API do danych wywołujemy go z poziomu JavaScript, co jak widać jest bardzo naturalne i proste.

sn1

Odpalamy serwer…

sn2

Sprawdzamy, co nam wypluje serwer REST-owy… Jak widzimy otrzymujemy na wyjściu JSON-a z danymi zwracanymi wprost z bazy danych.

sn3

Na razie tyle. Kolejne informacje wkrótce.

środa, 3 kwietnia 2013

Windows 8.1 (aka Windows “Blue”) + kolejne trzy nowe ficzery…

Zabawię się w chipa czy inne popularne pismo komputerowe i pozwolę sobie zacytować najnowsze nieoficjalne informacje ze światowych serwisów wyspecjalizowanych w eksplorowaniu nadchodzącej przyszłości (m.in http://www.neowin.net, http://winsupersite.com/)

Po pierwsze Windows “Blue” ma zostać wydany pod nazwą Windows 8.1.  Potwierdza to zrzut ekranu z nieco nowszego już buildu 9375 w serwisie (neowin).

LI9QRKo

W ostatnich dniach zostały odkryte trzy kolejne ficzery w Windows “Blue”. Są to:

Obsługa WebGL w Internet Explorer 11

Obsługa SPDY w Internet Explorer 11

Zintegrowany search

piątek, 29 marca 2013

Windows “Blue” (build 9364)

O nowej kompilacji Windows “Blue” z numerem 9364 pisze prasa polska komputerowa i zagraniczna od kilku dni. Co nowego?

Kafelki w małym rozmiarze (domyślnie po instalacji żaden z kafelków nie jest ustawiony w takim wymiarze)

02_9364_start3

Personalizacja (motyw tła, kolor tła i kolor wiodący)

07_9364_conf1

09_9364_start3

Nowe aplikacje - Alarms, Calculate, Sound Recorder, Movie Moments, File Manager* (ukryty)

Alarms

03_9364_alarms

04_9364_timers

05_9364_stopwatch

Fajne dotykowe ustawienia czasu, co nie ?

Umieszczanie 2 aplikacji na ekranie w stosunku 1:1 (przykładowo Sound Recorder i Calculate)

06_9364_half

File Manager* (jest ukryty, trzeba go znaleźć i uruchomić ręcznie)

09_9364_file_manager

Inne nowe funkcjonalności w tym buildzie:

  • Internet Explorer 11 (synchronizacja zakładek, zmiana zakładek w trybie desktopowym podobna do trybu znanego z Modern UX, podszywanie się pod Firefox’a w celu uniknięcia ładowania starych CSS-ów)
  • obsługa mniejszej rozdzielczości 1024 x 768 (z myślą o tańszych tabletach 7 i 8 calowych)
  • synchronizacja ustawień kafelków na ekranie startowym
  • przebudowany panel konfiguracyjny, lepsze zarządzanie zainstalowanymi aplikacjami
  • automatyczna aktualizacje aplikacji instalowanych z Windows Store
  • możliwość wyświetlania na lock-screen obrazków (podobnie jak w Windows Phone 8)
  • lepsze wsparcie dla wielu monitorów (nowe możliwości wyświetlania aplikacji, w tym także pulpitu)
  • Share –> robienie screenshotu z ekranu startowego
  • zamykanie systemu odpowiednim pociągnięciem lock-screena w dół (ukryta funkcjonalność, podobnie jak w Windows Phone)

Wymieniłem ogólnikowo. Szczegółowe informacje można znaleźć w sprawdzonych od lat źródłach:

Polecam też nieco wcześniejszy filmik Microsoft Research o Fresh Paint dla Windows Blue.

Chodzą wieści że Windows “Blue” (znaczący dodatek/service pack dla całego ekosystemu Windows - czyli Windows 8/RT, Windows Phone 8, Windows Server, Skydrive itp) w pierwszej publicznej wersji Preview będzie miał premierę na tegorocznej konferencji BUILD mającej odbyć się od 26 do 28 czerwca w San Francisco. Finalna wersja “Blue” ma osiągnąć RTM latem i zostać wydany jesienią tego roku. Mają pojawić się nowe kontrolki, nowsze narzędzia a aplikacje między Windows 8 a Windows Phone 8 mają być łatwiejsze w przenoszeniu…  W ostatnich dniach pojawiają się też o pracach nad Office “Gemini”, który ma towarzyszyć Windows Blue. Windows 9 to natomiast temat bardziej odległy - ma mieć premierę pod koniec 2014 roku. Pamiętajmy, że to wszystko nieoficjalne informacje, choć często znajdują później potwierdzenie w znaczącym stopniu. Zobaczymy jak to wyjdzie tym razem.

A tymczasem spisawszy dobre nowiny z dni ostatnich, życzę wszystkim dobrze spędzonych świąt Wielkanocnych.