Web Dev »

[6 pro 2009 | 0 Comments]

Tuple je struktura podataka možda nepoznata dijelu .NET programerske publike, ali je svakako važan dio matematičke teorije i teorije struktura podataka. Pitajte Donalda Knutha ako mi ne vjerujete! Naime, radi se o nepromjenjivoj (immutable) listi elemenata enkapsuliranih u objekt. Tuple tip podataka je dosta korišten u Pythonu, dolazi sa .NET Frameworkom 4, ali u .NET 2/3.5 se moramo sami pobrinuti napraviti ga, što je vrlo jednostavan posao.

O čemu se tu radi uopće; sjetite se TryParse metode objekta Int32:

int value=0;
bool pretvorba = Int32.TryParse(“7”, out value);
// moglo bi se pisati i ovako:
// [bool] [int] = Int32.TryParse(“7”)

TryParse vraća dva podataka, bool vrijednost koja govori dali je string uspješno parsiran, i int vrijednost parsiranog stringa. Ovo je primjer gdje se može iskoristiti Tuple, pošto s njime možemo vratiti više enkapsuliranih objekata:

Tuple<bool,int> result = Int32.TryParse(“7”); 
Assert.AreEqual(true, result.Item1); 
Assert.AreEqual(7, result.Item2);

kao se može vidjeti iz primjera, kreirali smo Tuple koji sadrži bool i int objekte, i preko propertya Item1 i Item2 im pristupamo.  Ovakvih primjera vjerojatno ima još mnogo, a meni osobno se je prvo palo na pamet kao zamjena za mnoge DTO (data transfer objects) koje moram pisati za MVC aplikaciju kada šaljem podatke iz controllera u view. Ako sam do sada morao kreirati klasu koja enkapsulira List<Articles> i string Title, sada mogu preskočiti izradu klase i samo poslati Tuple<List<Article>,string).

Glavni nedostatak ovakvog pristupa upotrebe kao DTO objekta je što se apsolutno ne zna što taj Tuple sadrži, osim tipa podatka. Prije sam imenovao varijable u DTO klasi prema opisu njihove uloge u domeni, a sada samo znam da imam tri stringa, dva integera i slično, koje pozivam preko propertya Item1, Item2, itd. Čista programerska ljenost! Stoga koliko god njegova upotreba zvuči pimamljivo, i skrati par (desetaka) minuta posla, kod imalo većih projekata može zadati glavobolje i prouzrokovati brojne bugove. Upozoreni ste!
Slijedi jednostavna implementacija Tuplea za .NET Framework 2/3.5: Više...

Web Dev, Tech »

[20 lis 2009 | 4 Comments]

ssh shell vps ubuntu

Svaki pravi web developer bi sigurno htio imati jedan web server! Cijeli server, sa pristupom cijelom operativnom sustavu, da si moze naštimavati sve opcije, optimizirati, podešavati i tjunirati svaki HTTP paket koji odlazi. Kod shared hosting paketa se dobije samo FTP pristup i osnovna funkcionalnost putem nekog Control Panela, ali dalje od tih opcija se ne može. Nista od štimanja ISAPI filtera, mapiranja ekstenzija, dodavanja neograničeno domena i slicnih stvarčica. Za takve stvari ipak treba imati telnet, ssh ili remote desktop pristup, i dozvole podešavanja. To imaju Dedicated i VPS server, od kojih je ovaj prvi pre skup (cca od 50$/mj) i odmah ću ga odbaciti, ali ovaj drugi, VPS server, se ipak može pronaći za skromnije novce. Cijena uglavnom ovisi o dostupnom RAMu i procesorskoj snazi.

Pošto se ovdje radi o pokretanju .NET web aplikacija, u obzir prirodno dolaze samo Windows serveri, ali zahvaljujući Novellu i Miguel de Icazi, aplilacije možemo pokretati i na Linuxu uz pomnoć Mono projekta.

Ako spojimo VPS Linux hosting i Mono framework, znači da već za 9,99$ mjesečno imamo svoj vlastiti server s kojim možemo raditi što god nas je volja! Već neko vrijeme planiram zakupiti jedan takav VPS server i poigrati se. Neki da sam konačno našao vremena, volje, i 10$ viška i zakupio mjesec dana VPSa na jednom od hosting providera. Kroz par postova ću probati opisati postupak konfiguriranja servera, u cilju pokretanja ASP.NET stranica, točnije ovog bloga, i za moje privatne (fuš) potrebe, N2CMSa. Još nisam siguran dali će N2CMS raditi, ali BlogEngine.NET provjereno radi na Mono frameworku.Više...

RIA, Web Dev »

[28 kol 2009 | 0 Comments]

Mediator

U izradi Silverlight (ili WPF, WinForms…) aplikacija, često se javlja potreba za komunikacijom različitih dijelova aplikacije, poput različitih User Control-a, instanciranih objekata i slično. Najbolje da jednim primjerom objasnim problematiku: za izradu Silverlight aplikacije za praćenje riječkog karnevala (izrađeno 2008., nadam se da je još online!) morao sam implementirati "pametno" sučelje, koje ispisuje informacije o trenutnoj skupini koja prolazi, označiti ju na listi, i još par sitnica. Te informacije sam dobivao preko web servisa u lokalni "provider" podataka, i pomoću evenata/delegata u kodu se predplaćivao na taj "providera" i slao potrebne objekte svim pretplatnicima na evente. Kako se sučelje sastoji od dosta user controla i custom controla, orkestracija pretplate prilikom starta aplikacije odnosno kreiranja objekata je bila relativno kompleksna. Na kraju izrade bilo mi je jasno da to i nije nabolje rješenje i da mora postojati jednostavniji način. Nedugo potom sam naišao na jedan design pattern, za koji sam znao da postoji ali ga nikada nisam imao priliku iskoristiti, pretpostavljam zbog samom načina rada web aplikacija. Radi se o Mediator patternu, koji definira komunikaciju između objekata.

Mediator UML sequenceJedan od mojih prethodnih blog postova objašnjava izradu ViewModela, prema Model-View-ViewModel patternu. Mediator pattern se savršeno uklapa u naš ViewModel, stoga ćemo iskoristiti MVVM i dodati potrebne klase. 
U svojoj osnovi, stvar ovako funkcionira: objekti se pretplate (Subscribe(tip poruke)) na određene poruke Mediator objektu (MessageGateway u primjeru). Ti objekti mogu i poslati poruku (Publish(ChatMessage)) Mediator objektu, koji potom prosljeđuje poruku svim pretplatnicima koji su se pretplatili na taj tip poruke (ReceiveMessage(poruka)).Više...

RIA, Web Dev »

[21 kol 2009 | 5 Comments]

MVVM Silverlight WPF

Silverlight sa svojim codebehind konceptom je pogodan, štoviše i preporučen, za implementaciju nekog od patterna za separaciju poslovne logike i logike za pristup podacima. Od njegovog izlaska, zbog bliskosti sa WPF modelom, programeri su preuzeli MVVM (Model View ViewModel) pattern (obrazac?) koji je popularan u WPF svijetu, sa određenim preinakama. Uz MVC (Model View Controller) i MVP (Model View Presenter) patterne koji su svoju populatnost stekli u web aplikacijama, odnosno stateless okruženju, MVVM je posebno pogodan za Silverlight/WPF sučelja jer koristi njihovu bogatu mogućnost Data Bindinga, odnosno deklarativnog povezivanja objekata u XAML kodu.

MVVM se sastoji od tri komponente:
1. View: XAML sa svojim code behindeom. U XAMLu deklarativno povežemo propertye UI elemenata, a u code behindeu zbog nemogućnosti nativnog povezivanja za UI evente (Command Binding u WPFu), pozivamo metodu od ViewModela. Ovo se može zaobići dodavanje MVVM toolkit (verzija sa codeplexa i od GalaSofta) ili SilverlightFX frameworka u projekt.

2. ViewModel: klasa koja sadrži podatke potrebne za renderiranje sučelja, kao i metode za operacije nad modelom. Da bi sučelje reagiralo na promjeno stanja određenih propertya, potrebno je da ViewModel klasa implementira INotifyPropertyChanged interface.  U prijevodu, kada mi promijenimo vrijednost propertya u ViewModelu, želimo da se sučelje automatski osvježi sa novom vrijednosti. Povezivanje mora biti dvosmjerno, što znači da promjenom podataka na sučelju se mijenja i sadržaj u ViewModel objektu – potrebno za spremanje podataka na server/bazu/gdjegod

3. Model: objektni model podataka naše domene. Povezivanjem na WCF servis (ili “stari” ASMX web servis), Visual Studio generira proxy klase za komunikaciju, i potpunu presliku klasa koje web servis daje. Ako smo izradili LINQ2SQL ili Entity Framework klase, te iste klase će biti dostupne i u Silverlightu!

Krenimo u izradu jednostavne Silverlight MVVM aplikacije. Zadatak je prikazati formu za editiranje podataka. Više...

Web Dev »

[10 kol 2009 | 0 Comments]

U izradi sučelja jedne ASP.NET MVC aplikacije morao sam dobiti listu radio buttona, sa jednim defaultnim odabirom. Jednostavno, pomislih, postoji HtmlHelper za to. Pogledah po spisku u Intellisense autocomplete dialogu, i stvarno je tamo, Html.RadioButtonList(). Tu je moj sreća završila, jer taj helper ništa ne radi, odnosno ja nisam uspio dokučiti što da radim sa njime! Dobijem array stringova, sa zapisima input type="radio" /> , koje bi ja trebao sa foraech petljom ispisivati, plus dodavati labele jer njih helper nije napravio. Iz vjerskih uvjerenja nisam htio odrađivati posao helpera, pa mi nije ostali ništa drugo nego da napravim svoj. I konačno malo prilike da se poigram sa Reflectionom, tim mracnim djelom frameworka kojim me baka plašila kada sam bio mali ;)
Cilj je dobiti ovakav kod:




Html Helper kao extension metoda na HtmlHelper klasu:

namespace Microsoft.Web.Mvc
{
	public static class HelperExtMethods
	{
		public static string MyRadioButtonList(this HtmlHelper helper,string name, SelectList list)
		{
			PropertyInfo DataInfo = null;
			PropertyInfo ValueInfo = null;
			StringBuilder builder=new StringBuilder();
			string pattern = "";
			foreach (var item in list.Items)
			{
                if (DataInfo == null)
				{
                    DataInfo = item.GetType().GetProperty(list.DataTextField);
					ValueInfo = item.GetType().GetProperty(list.DataValueField);
				}
                string data = DataInfo.GetValue(item, null).ToString();
				string value = ValueInfo.GetValue(item, null).ToString();
				if(list.SelectedValue==value)
					builder.AppendFormat(pattern, name, value, "radio" + value, data,"checked");
				else
					builder.AppendFormat(pattern, name, value, "radio" + value, data,"");
			}
			return builder.ToString();
		}
	}
}

Glupo ime helper, ali poslužiti će dokle ne smislim nešto bolje (RadioButtonListTurboDiesel npr?).
Upotreba helpera:

<%= Html.MyRadioButtonList("GodisnjeDoba",new SelectList(Model.ListaDoba,"Id","Naziv",Model.SelectedDoba)) %>
Doba (u Model.Doba) je klasa koja ima dva propertya, Id i Naziv. Pomoću refleksija u foreach petlji čitamo njihov sadržaj i kreiramo potrebni Html. Iako su refleksije najsporiji način dohvata vrijednosti u objektima, mislim da za ovih nekoliko objekata koje čitamo preko refleksija ne utječemo previše na vrijeme učitavanja stranice. Ako znate bolji (brži) način čitanja propertya, ostavite komentar pa ću prepraviti ovaj kod i dati drugu verziju!

Oprez: ovaj kod ne sadrži nikakve provjere valjanosti ulaznih parametra; što znači da ako mu ne pošaljete na primjer defaultnu vrijednost za selektirani radio button, dobiti će te za nagradu asp.net-ov yellow screen of death. Upozoreni ste!