[22 Aug 2014 | 0 Comments]

Inspired with this blog post: http://grasswire-engineering.tumblr.com/post/94043813041/a-url-shortener-service-in-45-lines-of-scala, here goes c# / OWIN version! Its not meant to be used anywhere, but more as a learning example how to leverage some new tech stuff that’s available.

First example is using Katana, Microsoft implementation of OWIN standard, running as a regular ASP.NET application, meaning on System.Web, meaning with IIS (Express). I didn’t use any high-level class for dealing with requests, http context and response, expect what comes from Microsoft.Owin, in purpose just to show how it looks like without any framework on top of it.  
For database, I picked RavenDb Embedded. At first I planned to use EntityFramework 6, because one of the requirement I put to myself was Async ability of db engine – just to plug that in to async OWIN stuff, but since everybody knows about EF, and not everybody about Raven, I just went with Raven in this example.

App works like this:
To generate short URL, you send a POST request with query string “path” that contains value of URL you want to shorten. For example: http://localhost:12345/?path=http://www.hudosvibe.net. As a result, you should get HTTP status 201 (created), and a hash for this URL.
To use it, just add that hash to the URL: http://localhost:12345/hash-goes-here 
And that’s it, nothing much more going onSmiješak

Now, to the interesting part, here’s the code:

The complete source is on Github (https://github.com/hudo/Sample-UrlShortener), where I’ll put other example hopefully in the near future!

How does it work:

For OWIN, well Katana, because OWIN doesn’t specify that, we need an entry point to our application. By convention, that’s the Startup class, and Configuration(IAppBuilder app) method.
As you probably know already, OWIN is series of middlewares that executes in sequence. Middleware is just a function that gets the http context and a reference to the next function. I created only one middleware here, a method closure which will be called for each request.
Just to avoid using IF or SWITCH, because that’s not so cool anymore, I created a dictionary with actions for each Http method, GET and POST. With await actions[ctx.Request.Method](session); appropriate action is executed, based on requests method.
For get request, we’ll try to load a Raven document by Id, and send a redirect to a full Url address. For post, we need to create a hash first. In this simple and naive example, we’ll just create random sequence of 7 characters. There can be conflicts, and document will be overwritten – that’s how Raven works if you manually set Id. We store that document to Raven, with hash and original full Url.

Raven is running in embedded mode, which means you don’t have to have Raven server on your computer, it run in process, with managed store engine (slower, but just fine for this example). It uses Json serialization, so anything that can be serialized can be stored. No need to create a schema, we just store json object, and Raven takes care about the rest.

Think that covers it. Next on the list is example with Nancy and ASP.NET vNext, so stay tuned for updates! 

Web Dev »

[10 Apr 2014 | 0 Comments]

Možda se nisu oglasile fanfare, ali prije oko godinu dana počelo se raditi na specifikaciji i implementaciji nove verzije ASP.NET frameworka. Ne ASP.NET 5 ili 6, nego bih ja to slobodno mogao nazvati ASP.NET 2.0. Vezija 1 je izašla 2002., a verzija 2 2014!

Ovaj hudo je poludio, sigurno vam je prvo palo na pamet, ali ovako korijenite promjene, gdje se razvoj jezgre, arhitekture i cijelog tehničkog dizajna počeo raditi iz nule, odnosno gotovo od File/New Project, a ne od File/Load “System.Web”, govori o težini i veličini nove verzije. Naravno da Microsoft, poslovično pragmatičan i oprezan što se tiče kompatibilnosti unazad, pokušava i dalje paralelno razvijati WebForms i MVC, a novije frameworke poput WebAPI i SignalR prilagoditi novoj arhitekturi, tako da će tranzicija na OWIN biti najvjerojatnije bezbolna i transparentna. Što to znači?

WebForms i MVC ostaju gdje jesu, ovisni o System.Web dijelu .NET frameworka. Ali sve ostalo što izlazi iz MS radionica će biti OWINizirano.

OWIN (Open Web Interface for dot Net) je najlakše opisati sa ovom linijom koda:

using AppFunc = Func<IDictionary<string, object>, Task>;

niti ostatak specifikacije nije nešto složeniji, uz par pravila i ograničenja sadrži spisak ključeva i tipova koji se kriju iza ove IDictionary<string, object> varijable. Povratni tip Task nam govori da je asinkrono procesiranje ugrađeno u samu specifikaciju.

OWIN i Katana arhitektura

Ali što znači ovaj linija uopće? Najjednostavnije, radi se o pipelineu (cjevovodu?), gdje su komponente (Middlelware) spojene jedna za drugom, prosljeđuju ili prekidaju izvršavanje upita. Jedna komponenta na primjer može biti logiranje, jedna autentifikacija, zatim sam web framework poput Nancyfx, ili REST framework poput WebAPI ili ServiceStack.
Našu aplikaciju čine niz povezanih komponenti, gdje smo mi odabrali samo ono što želimo da se izvršava. Ako nam ne treba session management, nećemo tu komponentu uključiti u pipeline, samim time niti “platiti” to performansama ili memorijom.

Implementacija OWIN specifikacije od strane Microsofta se ove Katana. Ona omogućava izvršavanje OWIN komponenti u IIS-u ili pak self-hostanu unutar druge aplikacije koristeći HttpListener (Nuget: Microsoft.Owin.Host.HttpListener), koristeći postojeću funkcionalnost unutar System.Web imenskog prostora.
Projekt pod nazivom Helios (Nuget: Microsoft.Owin.Host.IIS) je potpuna zamjena za System.Web u korištenju IIS-a, gdje su svi nativni pozivi na IISu nanovo napisani, a sve to zajedno donosi agilnost, puno brži release cycle, i svakako puno bolje performanse.

Evo kratki primjer kako dodati OWIN-baziranu web aplikaciju u postojeći projekt (WPF ili konzolna aplikacija, da stvar bude zanimljivija). Prvo dodajte Nubget pakete: 

Microsoft.Owin.Host.HttpListener
Microsoft.Owin.Hosting

Pokretanje Katana web servera na portu 12345:

WebApp.Start<Startup>(“http://localhost:12345”)

Sama Startup klasa prema konvenciji mora imati metodu Configuration. U njoj smo definirali 3 middleware komponente

Za LoggingMiddleware koristili smo baznu klasu, i napravili vlastitu komponentu:

Ovaj vrlo jednostavni primjer će potom raditi i na IIS-u, IIS expressu, ili pak nekom drugom serveru (Linux), jer korištene komponente ne referenciraju niti jednu klasu iz System.Web imenskog prostora.

Postojeći WebForms i MVC frameworci najvjerojatnije se nikada neće moći pokretati na nekom OWIN hostu, ali postoji i niz drugih odličnih frameworka koji ih mogu više ili manje uspješno zamjeniti (Nancy, Simple.Web, …)

Šlag na kraju je lakoća in-memory testiranja, bez potrebe za pokretanjem servera i otvaranjem portova, upotrebom Nuget paketa Microsoft.Owin.Testing i xunit-a

Nadam se da je ovaj kratki prikaz OWIN pomogao u njegovom shvaćanju, i da će te pronaći scenarij za iskoristiti ga!

Web Dev »

[29 Jan 2014 | 2 Comments]

Hello my english speaking visitors! As you maybe noticed, this blog is on croatian language, but just for your reading pleasure, this post is readable for more than 100 croatian speaking asp.net devsWinking smile

Now, back to the subject! Today is found nice link on www.asp.net home page, about using more than one model for MVC view, check it out here: http://honestillusion.com/blog/2013/11/11/Using-a-second-model-object-in-an-aspnet-mvc-view/

This will be my (short) take on this subject, offering yet another approach. We all know that MVC view can receive just one model type, that’s later available with @Model, and stuffing additional data to ViewBag is, or lets say, feels just wrong. And we’re to lazy to write a class that encapsulates all the types we need, as properties.

We can use (drum roll), yes, you are right my dear reader, TUPLE data structure! Someone may ask, what the heck are you talking about!? And you would give him some link like this one; http://www.dotnetperls.com/tuple or this one http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx and he would see how Tuple is nice and useful data structure, present in .NET from version 4 (I think, or 3. Or maybe 3.5. I don’t know)

So, without further ado, let’s see some code. Like controller:

And the view:

I’ll not show you my model code, because those are just plain old classes. Nothing interesting there.

And that’s the whole science with this technique! Just encapsulate as many types you want inside Tuple data structure, specify Tuple signature in view, and you get all the intellisense beauty in your Razor view!

Downside of this approach would be, let me think, maybe this: you can’t really tell what’s Model.Item1 and Model.Item2 just by looking at it, if you send tuple with two items of the same class it’s hard to tell which one you need to use, you brake concept ‘one view one model’ (I just invented this concept, but you get the point), etc. So, use it wisely, because with great power comes great responsibility (think about poor junior dev who will need to maintain your app few years from now)!

quick thoughts »

[23 Dec 2013 | 0 Comments]

Par riječi o protekloj godini, da se podsjetimo što se sve desilo zanimljivog i novog. Bilo je tu dosta predavanja i konferencija - Windaysi u Umagu (želim natrag u Rovinj buhuhu), ATD, odlični Kulendaysi kao spoj kvalitetnih predavanja, posebno mi se svidio koncept chalk&talk, i team buildinga, gdje sam upoznao puno zanimljivih ljudi. Prezentirao sam i svoj mali projekt seocrawler.co na WebCampZagreb, konferenciji o raznim web tehnologijana, koja je posebno zanimljiva jer nema standardnih "prodajnih" predavanja o mogučnostima alata i frameworka, nego su predavanja uglavnom o iskustvima iz programerskih rovova, sa prve linije produkcijske bojišnice. Naravno, čim uzmognem probati ću napisati koji blog post o detaljima unutar seocrawler.co crawlera, jer će siguran sam biti zanimljivo bilo kojem .NET programeru (message queueing sa RabbitMq, upotreba Azure cloud servisa, itd)

Krajem drugog mjesca sam i prvi put posjetio Ameriku, točnije MVP Summit, vidio široke američke autoceste, prepune i prejeftine šoping centre (otišao sa jednom torbom, vratio se sa dvije i povećim dugom na kreditnoj), indijanske rezervate (šoping centri su unutar rezervata, radi poreza naravno), švrljao po Seattleu, vozio se monorailom, izgubio se negdje usput, ali srećom jedan djedica mi je odmah pomogao kada je vidim kako blesavo zurim u kartu. Ameri su ful ljubazni, ali ono, plaše me koliko su srdačni i komunikativni! Naše ugostiteljstvi bi svašta mogli naučiti od njih :/ Najviše vremena sam se zadržao u science&sci fi muzeju (http://www.empmuseum.org/), a žao mi je što nisam imao više vremena obići ulice Seattlea i doživjeti grad malo bolje. Na samom MVP summitu vidio i upoznao razne njuške iz Microsofta, odnosno ASP.NET odjela (Scott Hansleman, Glenn Block, Mads Kirstensens, Damien Edwards, David Fawler, ...), to je bilo baš fora.

Čak i za nekoga tko aktivno prati zbivanja u microsoftovom razvojnom web ekosistemu, brzinom kojoj se izdaju nove stvari, poput WebAPI, OWIN komponenti, toolinga u novom VS2013, često je teško pratiti sve to, pogotovo isprobati i uči dublje u svaki od tih frameworka i biblioteka. Ali rekao bi da smo trenutno na većoj prekretnici, "resetiranju" razvojog sustava, jer od 2001 kada je izašao ASP.NET, framework u podlozi se nije posebno mjenjao. OWIN middleware bi mogao donesti novi i svježi ASP.NET, a nadam se da će zajednica prihvatiti to, i na tim temeljima razvijati nove zanimljive (open source) komponente.

Moram spomenuti i SPA koncept, gdje je, zanimljivo, sam ASP.NET razvojni tim rekao nešto poput: "uzmite JS framework koji želite, i mi ćemo vam dati framework za REST servise. Ili uzmite svoj REST framework, ionako je sve to .NET". Meni je drago što ne forsiraju određeni framework, iako se Knockout nuget paket nalazi unutar projekt predloška, ali pričajući sa drugim programerima, mnogi očekuju da im MS kaže "koristite točno ovaj framework koji smo mi napravili", jer kao time se dobije kvaliteta i sigurnost. Apsolutno razumijem i takav stav, ali nadam se da će knockout i Angular dokazati da ne treba Microsoft baš sve razviti sam, da možeo uzet i jedan open source projekt i koristiti ga u svakodnevnom korporativnom .net okruženju. Ja znam samo da se bacam na savladavanje Angulara, kako ne bi nepripremljen zatekao zahtejve budućeg projekta! Preporučujem Pluralsight tutoriale za brzo i efikasno proširiti postojeća znanja.

Web Dev »

[15 Aug 2013 | 0 Comments]

Nekidan na Twitter feedu vidio cvrkut da je Infinium napravio Ruby utility za prikaz upozorenja o korištenju cookia na webu. I pomislih, srijeda je ionako najdepresivniji dan u tjednu, ajmo se zabavit i napraviti .NET port tog utilitya! Dva sata kasnije, source je bio na Gitubu, a nedugo zatim objavljen je i PHP port!

Prema europskom zakonu web site mora prikazati obavijest da se cookiji koriste za praćenje korisnika, što je lijepo objašnjeno na Infinium blogu.

Poanta ovog utilitya (class library dll) je omogućiti dodavanje obavijesti jednostavnim umetanjem jedne linije u vaš HTML kod ASP.NET MVC aplikacije (Razor sintaksa):

@Html.Raw(Consent.Instance.Install())

ili dodavanjem opcionalnih parametara:

@Html.Raw(Consent.Instance.Install(linkUrl:"/kolaciciinfo.html"
    messageText:"ovaj web site koristi kolačiće",
    okkText:"okej",
    learnMoreText:"želim znati više!"))

za prikaz se koristi jQuery  i jQuery cookies plugin. Instalacija je putem Nuget-a. Unutar biblioteke se nalaze lokalizacije za engleski i hrvatski jezik, iako je u source dodan i klingonski, ali kod kompajliranja potrebni resource dll-ovi se ne kopiraju u Bin/Release i Debug direktorije, pa se klingonska lokalizacija nažalost ne nalazi u Nuget paketu Tužni smiješak Ako netko zna zašto .NET ne kompajlira tlh-KX kulturu, bio bih jako zahvalan na toj informaciji!
Source sadrži i potrebne unit testove, a da bi mockali (podvalili lažni) HttpContext koji nije dostupan u unit test projektu, Consent klasa prima ICookieService interface preko kojega čita i piše kolačiće. Dependency injection za sirotinju, dakle.

Par savjeta oko izrade biblioteke i distribucije putem Nugeta:
-  ako dodajete neke txt, html, … datoteke u vaš class library, označite ih kao “Embedded Resource”. Primjer čitanja takvih datoteka možete pronaći u sourceu
- ako niste vični radu u komandnoj liniji i Gitu, možete koristiti GUI alate Github Windows i Sourcetree (ja koristim Sourcetree)
- ne šaljite DLL-ove u source kontrolu! Koristite Nuget package restore funkcionalnost, i dodajte Bin/ i Debug/ foldere u .gitignore listu. Isto vrijedi za sve ostale source kontrole.
- dodajte readme.md i opišite vašu biblioteku. Github koristi markdown sintaksu pisanja
- Nuspec datoteka je XML opis vašeg paketa kojega želite objaviti na Nugetu. Za kreiranje i objavu se može koristiti Nuget Package Explorer. Nuspec također držite u Githubu.
- izrada open source softwarea je najbolji način dobivanja (novog) posla i zapošljavanja: na interview-u ili na natječaj samo pošaljite vašu Github/bibucket stranicu uz standardni CV/Linkedin profil, i dobroj firmi odnosno poslodavcu to govori jako puno o vama kao programeru!

https://github.com/hudo/EUCookiesNET