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.