Witam w trzecim artykule z cyklu poświęconego Mono. Chciałem na wstępnie wspomnieć, że bardzo się cieszę z tego powodu, że cykl cieszy się sporym zainteresowaniem i odzewem. Najważniejsze jest to, że społeczność Open Source dostrzegła zjawisko o nazwie Mono :-) i że projekt ma coraz więcej zwolenników także w Polsce.
Odnośnie cykliczności ukazywania się artykułów – plan był taki, żeby artykuły ukazywały się co tydzień. Staram się rozbić wszystko, aby tak właśnie było, jednakże życie weryfikuje plany – dlatego przepraszam wszystkich za opóźnienia z wydawaniem kolejnych artykułów. Staram się, żeby artykuły były dobre merytorycznie, no i zabiera to trochę czasu :-), a lepiej poczekać dwa dni dłużej niż czytać coś, co ma małą wartość…

Dzisiaj zajmiemy się tym co tygrysy lubią najbardziej czyli pisaniem programów. Długo zastanawiałem się nad tym, w jaki sposób pokazać możliwości Mono w tym względzie i uznałem, że dobrze by było gdyby przykłady były ze sobą powiązane i prowadziły do stworzenia użytecznej aplikacji. Dlatego zajmiemy się stworzeniem bardzo prostego czytnika Newsów RSS.
Zanim przejdziemy do samego programowania na początku należy zaznajomić się z narzędziami, wchodzą w skład mono i będą użyteczne przy pisaniu programu.

  • mcs – Kompilator języka C#
  • mbas – Kompilator języka Visual Basic .NET
  • ncc – Kompilator języka Nemerle
  • mint – Interpreter. Umożliwia wykonywanie programu bez używania JIT (Just in time)
  • mono – Generator CLI.

Hello World

Przy pisaniu aplikacji będziemy posługiwali się językiem c#. Jest to podstawowy język programowania w .NET framework – jednakże będę się starał w miarę możliwości pokazać także programy pisane w innych językach dostępnych pod Mono. Zaczniemy od napisania najprostszego programu w języku c#, czyli od nieśmiertelnego Hello World.

  using System;  class MainClass {    public static void Main() {       Console.WriteLine("Witaj w MONO!");    } } 

aby skompilować program wykonujemy polecenie:

 $ mcs HelloWorld.cs 

a następnie wypada uruchomić program wydając polecenie:

 $ mono HelloWorld.exe Witaj w MONO! 

Spróbujmy napisać teraz program Hello World w języku Visual Basic.NET

 Imports System  Public Module MainClass    Sub Main()      Console.WriteLine ("Witaj w MONO!")    End Sub End Module 

aby skompilować program wykonujemy polecenie:

 $ mbas HelloWorldVb.vb -------- MonoBASIC: THIS IS AN ALPHA SOFTWARE. -------- Compilation succeeded 

a następnie można uruchomić program wydając polecenie

 $ mono HelloWorldVb.exe Witaj w MONO! 

Jak szaleć to szaleć – na koniec rozdziału Hello World pokażemy jak przyrządzić podobny do poprzednich program – teraz w języku Nemerle.

 class HelloWorld {    public static Main () : void    {      System.Console.WriteLine ("Witaj w MONO!")    } } 

aby skompilować program wykonujemy polecenie:

 $ ncc Hello.n ____________________________________________________________ 

a następnie można uruchomić program wydając polecenie

 $ mono out.exe Witaj w MONO! 

Jak widać wynik działania wszystkich trzech programów jest identyczny. Ostatni przykład został napisany w języku Nemerle. Jest to język stworzony przez grupę studentów z Uniwersytetu Wrocławskiego – tak jest – rodacy też mają wkład w rozwój platformy .NET oraz Mono :-) Więcej informacji można znaleźć pod adresem: http://www.nemerle.org. Znajdziecie tam wersje instalacyjne pod Linuksa, Windows oraz inne systemy, a także opis, dokumentację i przykłady w tym języku. Nemerle zostanie także poświęcony jeden z kolejnych artykułów z cyklu.

Biblioteka

Kolejnym krokiem będzie zbudowanie już czegoś, co można nazwać aplikacją. Zbudujemy najpierw własną bibliotekę, która będzie korzystała z zewnętrznej biblioteki obsługującej kanały RSS, która znajduje się pod adresem: http://rss-net.sourceforge.net/. Następnie użyjemy naszej biblioteki do pisania aplikacji. W dzisiejszym odcinku będzie to prosty program konsolowy. Oto kod źródłowy biblioteki:

 using System; using Rss;  namespace RssLib { 	public class KanalRss 	{  		RssFeed f;  		public KanalRss(string url) 		{ 			f=RssFeed.Read(url); 		}  		public string Tytul 		{	 			get 			{	 				return f.Channels[0].Title;				 			} 		}  		public string[] TytulyWiadomosci 		{	 			get 			{	 				string[] t=new string[f.Channels[0].Items.Count];  				for (int i=0;i<t.Length;i++) 					t[i]=f.Channels[0].Items[i].Title; 				return t; 			} 		}  	} } 

Powyższa biblioteka jest bardzo prosta i zawiera dosłownie kilka linijek kodu. Nie będziemy opisywać jej działania, gdyż chyba nie ma to większego sensu. Najważniejsze są dwie właściwości Tytul właściwość zwracająca nam tytuł kanału Rss oraz TytulyWiadomosci – jest to właściwość, która zwraca w postaci tablicy elementów typu string tytuły wszystkich wiadomości z danego kanału. Biblioteka ta będzie rozbudowywana na potrzeby kolejnych artykułów z cyklu.
Aby ją skompilować, wykonujemy następujące polecenie:

 $ mcs -r RSS.NET.dll KanalRss.cs -target:library -out:RssLib.dll  

Jeżeli wszystko przebiegło prawidłowo, kolejnym krokiem będzie zbudowanie właściwej aplikacji. W tym celu najlepiej stworzyć katalog „ConsApp” i przegrać do niego pliki: RssLib.dll oraz RSS.NET.dll – są to biblioteki, które będą nam potrzebne do pracy naszego programu.
Następnie do pliku KlasaGlowna.cs wpisujemy poniższy kod:

 using System; using RssLib;  namespace ConsApp { 	class KlasaGlowna 	{ 		[STAThread] 		static void Main(string[] args) 		{ 			string tytul=string.Empty;  			if (args.Length>0) 				tytul=args[0]; 			else 				tytul=@"http://www.go-mono.com/monologue/index.rss"; 			try 			{ 				KanalRss k = new KanalRss(tytul); 				Console.WriteLine("Tytul kanalu: "+k.Tytul); 				Console.WriteLine("-----------------------"); 				for (int i=0;i<k.TytulyWiadomosci.Length;i++) 					Console.WriteLine(i+" : "+k.TytulyWiadomosci[i]); 			} 			catch(Exception ex) 			{ 				Console.WriteLine("Wystapil blad: "+tytul+" opis bledu"+ex.Message); 			} 		} 	} } 

Jest to bardzo prosty programik, którego zadaniem jest połączenie się z kanałem rss, przekazanym jako parametr programu, a w przypadku, gdy uruchomimy program bez parametrów domyslnie będzie próbował on połączyć się z kanałem http://www.go-mono.com/monologue/index.rss i wyświetlić wszystkie tytuły wiadomości w nim aktualnie dostępnych. Oczywiście, aby program zadziałał, komputer musi być podłączony do internetu :-)
Program kompilujemy wydając polecenie:

 $ mcs KlasaGlowna.cs -r:RssLib.dll  

Po prawidłowej kompilacji można uruchomić program, wpisując:

 $ mono KlasaGlowna.exe Tytul kanalu: Monologue ----------------------- 0 : Jeroen Frijters: How Not To Fix Bugs 1 : Jeroen Frijters: IKVM 0.12 Released 2 : Chris Toshok: DebuggerBrowsableAttribute 3 : Sureshkumar: Generic DB programming in mono 4 : Jeroen Frijters: New Snapshot 5 : Chris Toshok: DebuggerDisplayAttribute work 6 : Ben Maurer: Using a Bulldozer to Squish Ants 7 : Dan Winship: ...Like It's 1999 8 : Jon Trowbridge: Beagle 0.0.7 9 : Edd Dumbill: The mysterious case of the missing download 10 : Jackson Harper: 28 Feb 2005: it's a tail in a trap 11 : Paco Martinez: Check List for Aspiring Mono Windows Programmers 12 : Christian Hergert: Introducing Mono.Data.Sql 13 : Daniel Morgan: SQL# and Mono.Data.Sql 14 : Edd Dumbill: A general purpose XML indexer for dotLucene 15 : Miguel de Icaza: 27 Feb 2005: Mono Updates 16 : Jambunathan K: Going online 17 : Edd Dumbill: Not so sure I like the real world 18 : Zac Bowling: Mono Package and Deployment Framework 19 : Christian Hergert: Property Grid and MonoDevelop 20 : Joe Audette: I broke up with Fedora to go out with Suse 21 : Chris Toshok: lexical block handling 22 : Ben Maurer: RML makes per-vma rss and anon accounting 23 : Miguel de Icaza: 25 Feb 2005: Istanbul, Beirut 24 : Carlos Alberto Cortez: Reflection only now supported in Mono 25 : Daniel Morgan: GLAMP 26 : Eric Butler: Datacenter Cleanup 27 : Martin Baulig: Nullable Types ..... 28 : Joe Audette: Aqua Data Studio 29 : Carlos Alberto Cortez: I'm in Monologue!!! 30 : Zac Bowling: Mono Art & Gecko# WIN32 31 : Edd Dumbill: XTech 2005 schedule published 32 : Sebastien Pouliot: Mono Security Manager Part III - Using Non-CAS permissio ns 33 : Miguel de Icaza: 23 Feb 2005: Mono Sandboxing 34 : Jeroen Frijters: Stack Traces 35 : Dan Winship: First Post! 36 : Jeroen Frijters: Eclipse is Evil 37 : Sebastien Pouliot: Mono Security Manager Part II - Using Code Identity Perm issions 38 : Christian Hergert: House Sitting and DataCenter 39 : Ben Maurer: The Memory Problem 40 : Larry Ewing: Shell Game 41 : Sebastien Pouliot: Mono Security Manager Part I - Using CAS permissions 42 : Paco Martinez: MonoDoc in Win32 43 : Alex Graveley: Erotic cleft 44 : Ben Maurer: Memory savings from GTK+ head 45 : Jb Evain: Cecil talks 46 : Miguel de Icaza: 20 Feb 2005: 250 millions of PR budget. 47 : Duncan Mak : An Update from Me 48 : Miguel de Icaza: 19 Feb 2005 

Spróbujmy dowiedzieć się teraz co ciekawego dzieje się na 7thguard.net – w tym celu przekażemy do programu jako parametr źródło wiadomości RSS 7thguarda:

 $ mono KlasaGlowna.exe "http://rss.7thguard.net/7thguard.xml" Tytul kanalu: 7thGuard.net ----------------------- 0 : Przegląd prasy 1 : Przegląd prasy 2 : Patenty na oprogramowanie muszą być, bo ... 3 : Warlug, 03.03.2005 4 : Poznaj Linuksa 2 5 : Apel do Poznaniaków 6 : Firefox 1.0.1 wydany 7 : Onet Plejer 8 : Połączenie Conectivy i Mandrakesoft 9 : Wywiady ze znanymi osobistościami 

Jak widać dzieje się sporo :-).

Podsumowanie

Mam nadzieję, że artykuł był użyteczny i dowiódł, że tworzenie programów przy wykorzystaniu Mono jest naprawdę proste. Wszystkie źródła, które zostały użyte w artykule, oraz skompilowana biblioteka RSS znajduje się na stronie mojej firmy: http://www.possible.pl.
Chciałbym zaprosić wszystkich do dyskusji na temat tej technologii oraz przesyłanie na mój email informacji na temat tego, czy artykuł jest strawny,czy może bardziej powinniśmy wejść w arkana programowania i tłumaczenia kodu itp… Napiszcie, czego oczekujecie po następnych artykułach z serii.

Archiwalny news dodany przez użytkownika: Tomek Soroka.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Oznaczone jako → 
Share →