Temat: Warsztat pracy dla programujących w Mono

Ponieważ sporo osób zadaje mi pytania w rodzaju "jakich narzędzi mogę użyć pod Mono?", przygotowałem skrót informacji na temat różnych narzędzi produkcyjnych i przydatnych bibliotek, które mogą przydać się w codziennej pracy pod Mono. Większość z nich wykorzystuję w praktyce.

Osoby, które piszą pod Mono i wykorzystują niewymienione tu komponenty, proszę o dopisywanie swoich propozycji. Jak mi się coś przypomni, będę dopisywał :)

W kilku miejscach odwołuję się do przygotowanej kiedyś przeze mnie (do pracy) prezentacji pt. Tworzenie przenośnych aplikacji z wykorzystaniem Microsoft .NET Framework oraz Xamarin Mono.
____________________________________________________________
Narzędzia developerskie
* MonoTools for Visual Studio - narzędzia pozwalające pisać kod pod VS, kompilować pod Mono i zdalnie debuggować na maszynie wirtualnej pod potrzebnym OSem.
* MonoDevelop - IDE na wzór VS lub #Developa. Posiada wbudowany edytor do tworzenia GUI w GTK#.
* Glade - IDE do tworzenia GUI w GTK. Opis GUI powstaje w XML, który następnie wczytuje się w aplikacji.
* wxFormBuilder - IDE do tworzenia GUI za pomocą wxWidgets. Opis GUI powstaje w XML (format XRC).
* Windows Forms Designer - bardzo wczesna wersja edytora GUI pod Windows Forms dla Mono.
* MoMA (Mono Migration Analyzer) - narzędzie do badania kompatybilności pakietów z Mono (np. czy są PInvoke)
* NUnit - znane narzędzie do przeprowadzania testów jednostkowych
* NAnt - znane narzędzie do budowania złożonych projektów
* Gendarme - narzędzie do badania kodu pod kątem występowania różnych problemów (np. "bad practices").

* Praktycznie wszystkie narzędzia z .netowego SDK mają swoje odpowiedniki pod Mono: al, gacutil, ngen (-aot), wsdl, disco, xsd, sn, ildasm (monodis), ilasm, webserver (xsp)

* IKVM.NET - IKVM.NET pozwala uruchomić skompilowany kod Javy w .NET (Mono).JARy tłumaczone są statycznie lub w locie na CIL (to nie to samo, co J#).

IVKM.NET zawiera m.in.:
* .netową implementację JVM
* .netową implementację klas Javy (OpenJDK, Claspath)
* narzędzia do konwersji JAR → CIL (exe, dll)
* Ikvmc – translacja statyczna
* Ikvm – translacja dynamiczna
____________________________________________________________
Różne frameworki

* MVC# - nieco zabytkowy, ale nadal przydatny framework do tworzenia aplikacji okienkowych w oparciu o wzorzec model-widok-prezenter.
____________________________________________________________
Tworzenie GUI
* wxWidgets.NET - binding wxWidgets dla .NET. Zalecam zapoznanie się z listą wad i zalet w prezentacji. Posiada świetny grid o dużych możliwościach i przydatny renderer HTML (co prawda tylko archaicznego 3.2, za to nie wymaga silników przeglądarek)
* GTK# - binding GTK dla .NET (j.w.). Świetny TreeView.
* MedSphere - kilka przydatnych kontrolek pod GTK# (m.in. grid i kontrolka wykresów). Strona nieaktywna, ale można znaleźć źródła (mogę udostępnić).
* Holly Widgets - kilka przydatnych kontrolek pod GTK#.
* DockPanelSuite - działa pod Mono z niewielkimi poprawkami. Można także użyć dokowanych okien z kodu MonoDevelopa.
* GTK SourceView - edytor z kolowaniem składni, zawarty w MonoDevelop

Lista edytorów GUI znajduje się w poprzedniej sekcji. GUI w GTK# można tworzyć ręcznie w kodzie, w designerze MonoDevelopa (powstaje kod C#) lub w Glade (powstaje plik XML).
____________________________________________________________
Bazy danych i ORMy

Dostępne są sterowniki pod wiele różnych [R/O]DB: SQL Server, Oracle, PostgreSQL, MySQL, SQLite, Sybase, Firebird, Db4o

ORMy (darmowe):
* NHibernate wraz z LINQ i FluentNH
* oryginalny Entity Framework i fork Mono
* ServiceStack Orm.Lite

ServiceStack posiada własny, lekki ORM: https://github.com/ServiceStack/ServiceStack.OrmLite. Niestety, jest to zaledwie tzw. microORM, czyli ma mocno ograniczone możliwości, za to jest naprawdę szybki.

Na potrzeby prostego CRMa czy bloga, względnie prostego prototypu (gdzie np. mamy kilka tabel mapowanych 1:1 na klasy) powinien z powodzeniem wystarczyć, jednak w poważniejszych zastosowaniach może się już nie sprawdzić. Jego ograniczenia ujawniają się dość szybko.

Na szczęście "przełączenie" się z SS.OrmLite na np. NHibernate czy EF jest praktycznie
bezbolesne: wszystkie one "zachowują" się podobnie - utworzenie fabryki sesji, zarejestrowanie w kontenerze IoC albo umieszczenie w sesji, otwarcie sesji i transakcji, wykonanie polecenia, zamknięcie transakcji i sesji.
http://www.philliphaydon.com/2012/06/using-nhibernate-...

Warto dodać, że SS.OrmLite korzysta z automapowania tabel na klasy wykorzystując konwencję nazw.
Dzięki atrybutom można je nieco dopasować do własnych potrzeb, np. gdy nazwy klasy i tabeli lub właściwości klasy i pola w tabeli różnią się od siebie. Oznacza to, że podczas pracy z SS.OrmLite wykorzystuje się podejście ModelFirst.

Dostępne są następujące providery:
* SqlServerDialect.Provider
* SqliteDialect.Provider (wersje 32/64 bit i Mono)
* MySqlDialect.Provider
* PostgreSqlDialect.Provider
* OracleDialect.Provider
* FirebirdDialect.Provider
____________________________________________________________
Aplikacje sieciowe

Dostępne są następujące technologie sieciowe:
* ASP.NET WebForms
* ASP.NET MVC (2, 3, 4) z obsługą silnika Razor
* ASP.NET WebApi
* Remoting (oczywiście poza mechanizmami właściwymi dla Windows, np. MSMQ)
* ASP.NET WebServices (.asmx)
* WCF - jedynie częściowe wsparcie. Nie będzie rozwijane. Brakuje: MEX (endpointy) – ale jest opracowywane, COM, WF, WSHttpBinding + TransactionFlow + ReliableSession, Federations, WSDualHttpBinding i ogólnie duplex, MSMQ (mechanizm Windows), DataServices, P2P
* ServiceStack - kilka słów o tym frameworku poniżej.

Żegnaj WCF, witaj ServiceStack :)

WCF nie został (i prawdopodobnie nie zostanie) przeniesiony w pełni na Mono. Na szczęście istnieje w pełni działająca pod .NET i Mono alternatywa dla WCF w postaci ServiceStack.

ServiceStack wykorzystuję produkcyjnie (w małych projektach i dużych przedsięwzięciach) z pełnym sukcesem od dawna. Pisanie w nim usług, czy to SOAPowych czy RESTowych jest wręcz banalnie proste. Dodatkowo przeprowadzone przeze mnie na własne potrzeby testy wydajnościowe potwierdziły "marketingowe doniesienia" jego twórców :)

Osobom, które dopiero planują napisanie aplikacji sieciowych, zwłaszcza RESTowych proponuję od razu zapoznać się z ServisStackiem. Dzięki temu nie będziecie zmuszeni śledzić postępów migracji kolejnego "klocka" .NET, a wasze rozwiązania będą działać zarówno pod Windows jak również "innymi-systemami-operacyjnymi" (dla których istnieją implementacje Mono). Jest przejrzysty, bardzo szybki i bardzo elastyczny. Dodatkowo ma lekkiego i szybkiego mikro ORMa oraz prosty IoC.

Typowy schemat pisania aplikacji RESTowej:
1. zdefiniuj DTO requesta (informacje potrzebne do zrealizowania usługi) i response (wyniki). Stosuje się tu konwencję nazw, np. DodajPacjenta i DodajPacjentaResponse.
/ W przypadku klasycznych aplikacji SOAP musimy je dodatkowo opatrzeć atrybutami DataContract i DataMember. /
2. opisz DTO requesta atrybutem routingu ze ścieżką usługi (np. "/dodaj_uzytkownika") albo dodaj ją do tablicy routingu. Routing jest bardzo elastyczny.
3. utwórz klasę hosta serwisu; do hostowania serwisu można użyć klasycznej aplikacji webowej (obiekt klasy hostującej należy utworzyć i zainicjować w global.asax w Application_Start) albo napisać "samohostującą" aplikację konsolową bądź usługę Windows.
4. utwórz klasę serwisu i dla każdej usługi zdefiniuj odpowiednią metodę reagującą na właściwy verb (ANY, POST, PUT, GET, DELETE, PATCH). Metoda taka przyjmuje jako parametr zdefiniowany wcześniej DTO requesta i zwraca DTO response'a, np. DodajPacjentaResponse POST(DodajPacjenta request) { .... logika usługi ..... return wyniki; }

Oto garść przydatnych linków:

* http://stackoverflow.com/questions/9699083/servicestac...
* Status rozwoju WCF pod MONO
* Why ServiceStack?
* ServiceStack overview
* Create your first webservice
* ServiceStack vs WCF DataServices
* ServiceStack and Redis example
* Self-hosting ServiceStack serving razor'd HTML
* My conversion from WCF to SS
* Maturing towards REST with ServiceStack
* Simple ServiceStack OrmLite Example
* Your first REST service with ServiceStack
* ServiceStack Examples
* ServiceStack example
* Run ServiceStack as a daemon on Linux
* Self hosting example
* What is the best way to run ServiceStack on Linux / Mono?
* SOAP support
____________________________________________________________
Raportowanie i wykresy
* SourceGrid - nie trzeba przedstawiać. Większośc funkcji działa. Warto przeklikać demo.
* BarcodeLib - sprawdzona przeze mnie i stosowana "produkcyjnie" biblioteka do generowania kodów kreskowych. Generuje kody w formatach: (Code 128, Code11, Code 39 (Extended/Full ASCII), Code 93, EAN-8, EAN-13, UPC-A, UPC-E, JAN-13,MSI, ISBN, Standard 2 z 5, 2 z 5 z przeplotem, PostNet, UPC, Supplemental 2, UPC, Supplemental 5, Codabar, ITF-14, Telepen, FIM)
* NPlot - znany generator wykresów, posiada kontrolkę GTK#
* ZedGraph
* fyiReporting - opensource'owy designer dla raportów w formacie RDL, posiada fork pod Mono, niestety, nie jest to klasa Microsoftowej kontrolki RDLC...
* NReports
* DocX - biblioteka do pracy z dokumentami w formacie OpenDocument. Ponieważ plik w formacie OpenDocument to spakowany ZIPem zbiór XMLi (wystarczy zmienić rozszerzenie z docx na zip by się przekonać), do jego przetwarzania nie jest potrzebna instalacja żadnego procesora tekstu (Word, OpenOffice itd). Sprawia to, że format ten świetnie nadaje się do przetwarzania serwerowego. Wystarczy rozpakować dokument, otworzyć content.xml i już można wprowadzać zmiany. Świetne rozwiązanie do generowania dokumentów na podstawie szablonów (tzw. mergefields).

* Można próbować przekompilować Jasper Reports pod IKVM albo komunikować z nim przez webservice
____________________________________________________________
Wyszukiwanie informacji

* Lucene.NET - znany silnik wyszukiwania pełnotekstowego
* SimMetrics -biblioteka metryk dla wyszukiwania przybliżonego (można zinterować z SQL Serwerem)
____________________________________________________________
Medycyna

* OpenDICOM - biblioteka do pracy z obrazami w formacie DICOM
* ECG Toolkit - biblioteka do pracy z sygnałami EKG
* NHapi - przeportowana z Javy (Hapi) biblioteka do pracy z komunikatami HL7 w wersji 2.x (potok)
* HL7SDK - biblioteka do pracy z komunikatami HL7 w wersji 2 i 3 (XML)
____________________________________________________________
Matematyka i statystyka

* Meta nummerics - biblioteka matematyczna
* Math.NET - biblioteka matematyczna
* R.NET / RServereCLI / RClr - konektory .NET dla GNU R
____________________________________________________________
Przydatne linki
http://mono-project.com/Start
http://download.mono-project.com/sources/
http://monodevelop.com
http://www.mono-project.com/MoMA
http://www.mono-project.com/Plans
http://docs.go-mono.com/index.aspx
http://www.mono-project.com/Compatibility
http://go-mono.com/status/
http://mono-project.com/Guidelines:Application_Portabi...
http://mono-project.com/Mod_mono
http://mono-project.com/Mono.Cairo_Cookbook
http://www.mono-project.com/Monkeyguide
http://www.mono-project.com/WCF_Development
http://mono-project.com/Database_Access
http://mono-project.com/Gui_Toolkits
http://monodevelop.com/Stetic_GUI_Designer
http://www.mono-project.com/GtkSharp
http://www.mono-project.com/GtkSharpBeginnersGuide
http://www.mono-project.com/GtkSharp_TreeView_Tutorial
http://www.mono-project.com/GtkSharpTutorials
http://www.tuxradar.com/hca
http://zetcode.com/gui/gtksharp
https://medsphere.org/community/project/medsphere-widgets
http://wxnet.sourceforge.net
http://www.servicestack.net
http://github.com/mrward/monodevelop-nuget-addin#readme

Różne biblioteki: http://www.mono-project.com/Libraries

____________________________________________________________
Warto także rzucić okiem na temat Open source w C#, jest tam lista serwisów z kolekcją setek open source'owych bibliotek dla .NET.

a także na prezentację Wykorzystanie komponentów na licencji GPL w rozwiązaniach o zamkniętych źródłach.


Obrazek
Ten post został edytowany przez Autora dnia 03.02.14 o godzinie 12:37

Temat: Warsztat pracy dla programujących w Mono

Uwaga, w nowym Mono (3.2) jest nowy GC o nazwie "SGen". Przyczynił się on w tym tygodniu do rwania włosów z mojej biednej głowy. Losowo leciały segfaulty. 5 uruchomień usługi - OK, szósta - fail. Objawiało się to w różny sposób.

Kompletnie zapomniałem o zmianie GC i dopiero znajomy zasugerował mi, żebym przełączył sie na Boehm (--gc=boehm). Problemy ustały, wszystko działa jak złoto.

Temat: Warsztat pracy dla programujących w Mono

Niestety, ServiceStack od wersji 4 jest już płatny. Darmowe pozostają:

1. okrojona wersja 4 z następującymi restrykcjami:
* 10 Operations in ServiceStack (i.e. Request DTOs)
* 10 Tables in OrmLite
* 20 Different Types in JSON, JSV and CSV Serializers *
* 20 Different Types in Redis Client Typed APIs
* 6000 requests per hour with the Redis Client
2. wersja 3 na licencji BSD
https://github.com/ServiceStackV3/ServiceStackV3

Na szczęście dojrzewa zastępnik od Microsoftu: ASP.NET WebApi.
http://www.asp.net/web-api/tutorials/hands-on-labs/bui...
http://www.asp.net/web-api/overview/getting-started-wi...

Niestety, nie miałem czasu na testy pod Mono, ale szlak został przetarty :)
http://www.piotrwalat.net/running-asp-net-web-api-serv...

Temat: Warsztat pracy dla programujących w Mono

Podczas tegorocznej konferencji BUILD Microsoft zrobił rzecz, niezwykłą. Wiele kluczowych elementów programistycznego frameworku .NET zostało otwartych i oddanych pod opiekę specjalnie w tym celu powołanej fundacji. W jej zarządzie znalazł się m.in. Miguel de Icaza, programista znany przede wszystkim z prac nad Mono, opensource'ową implementacją .NET-u.
[...]
Najważniejsze z nich to ASP.NET MVC i ASP.NET Web API, Entity Framework, .NET Micro Framework, .NET Compiler Platform, .NET Reactive Extensions, Windows Azure .Net SDK, a także biblioteki MimeKit i Mailkit od Xamarin, firmy de Icazy.
[...]
Największe zainteresowanie wzbudziło udostępnienie kodu kompilatora .NET, znanego wcześniej pod nazwą kodową „Roslyn”. Przynosi on nowe wersje kompilatorów C# i VB, a także API do kompilatora-jako-usługi.


źródło: Microsoft oddaje .NET światu Open Source. 24 projekty pod opieką nowej fundacji

Temat: Warsztat pracy dla programujących w Mono

Ostatnimi czasy odkrywam potencjał Raspberry Pi. Pomyślałem, że gdybym tak miał do dyspozycji Mono, binding C# -> GPIO oraz moje ulubione środowisko obliczeniowe (GNU R), to otrzymałbym kawałek fajnej maszynki kontrolno-pomiarowo-sterowniczej, dla której znalazłem już kilka zastosowań. Dodać do tego 3-3.5" wyświetlacz dotykowy LCD i można budować w GTK albo Tcl/tk proste interfejsy graficzne "pod palce".

A zatem - Mono. Wpisałem "sudo apt-get install mono-complete". Poszło! "Hello world" - działa. No to dalej za ciosem - "sudo apt-get install monodevelop". Przeszło bez potknięć.

Naprawdę, ciekawe doświadczenie - widzieć uruchomiony MonoDevelop na Raspberry Pi :) Zainstalowałem go i uruchomiłem tylko po to, żeby przekonać się, czy zadziała. I działa - otwarłem nawet i zbudowałem z sukcesem jeden z moich prostszych projektów. Trwało to sporo czasu, ale udało się. Uruchomienie MD na RPi to była po prostu sztuka dla sztuki, bo komputerek mocno "przycina" (nie chcę taktować procka ponad 800MHz, choć przy 1GHz i mem split 32:480 MD chodził sporo szybciej), ale przecież nikt nie będzie z niego robił stacji roboczej. Po prostu jest fun - i o to chodzi! :) Śmiesznie wygląda napis "Debug | x86" na... ARMie.

Ważne jest jednak co innego - Mono spokojnie "daje radę" na RPi. Aplikacje konsolowe i apki pod GTK# chodzą akceptowalnie szybko. Gorzej z WinForms, odrysowują się wolno, ale... działąją. Tak więc, jeśli ktoś nie może spać bez C# :) i chciał go mieć na RPi, to powinien się ucieszyć.


Obrazek

Następna dyskusja:

oferta pracy dla programist...




Wyślij zaproszenie do