Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Proč jsou statické helpery zlo?

10.53 - 22. listopadu 2008 | ASP.NET 2.0

Minulý týden psal Arthur spotík o takovém tom víkendovém programování, ve kterém šlo hlavně o to, že přešel na Vistu, vytvořil si gadget pro přehrávání ČRo a taky editor hosts souboru. Napsal ho v C# a zmínil se o tom, že použil techniku, se kterou nejsem s to…

Zkrátka podědil si generickou Dictionary<TKey, TValue> a rozšířil ji o serializaci. Dictionary není serializovatelná. Je to dáno jak její generickou povahou (constraints pro atributy neexistují), tak tím, že sídlí v knihovně, která nesmí mít závislost na jiné, která serializaci zajišťuje.

public class SerializableDictionary<TKey, TValue>
  : Dictionary<TKey, TValue>, ISerializable {
  // ...
}

To byla moje chvíle, vyčmuchal jsem zde codesmell (zbytečné dědění, které by šlo vyřešit kompozicí). Neomaleně jsem vstoupil do diskuse chválící gadget a sprostě Arthura pohanil. Omlouvám se za to. Mým úmyslem bylo ho postrčit o kus dál, možná rozšířit obzory. Prostě sprostá rada, která by mi v začátcích se C# pomohla nebloudit labyrintem macatých tříd se spoustou dovedností a košatou hierarchií předků a potomků.

Alternativní řešení

V diskusi, kterou jsem tímto vyvolal, padlo i to, že jde o porušení Single Responsibility Principle, které už rozebral Borek. Arthur tedy nabídl, alternativní řešení, jak se s problémem vypořádat:

Samozřejmě jsem si mohl napsat i kašpárkovskou třídu, co má dvě statické metody (Serializuj a Deserializuj) a veřejný parametr „Dictionary“… šlo by to vyřešit mnoha způsoby, lišícími se co do pracnosti, elegance a efektivity, a já se rozhodl nedělat „composition blackbox“, ale podědit třídu – především proto, že bych musel zpřístupňovat spoustu veřejných metod od původní generiky, nebo deklarovat vložený objekt jako veřejný.

public static class DictionarySerializer<TKey, TValue> {
  public static byte[] Serialize(Dictionary<TKey, TValue> dictionary) {
    // ...
  }
  public static Dictionary<TKey, TValue> Deserialize(byte[] data) {
    // ...
  }
}

Přejdu teď composition blackbox – vrátím se snad k němu někdy jindy, ale zastavím se u statických metod. Myslím si totiž, že to je další cesta do pekel… :)

Staticky vs. Instančně

Na toto téma se vedlo jedno z vláken té jinak pěkné diskuse o šikovném gadgetu. (Platíte koncesionářské poplatky?) Osobně zastávám názor, že je lepší se statickým helperům vyhýbat. Jednak ze zkušenosti a druhak z některých signálů a pouček správného OO návrhu.

V objektových jazycích odvozených od C jsme si zvykli používat třídy. Třída je předpis, podle kterého se vyrábějí objekty. Objekty jsou přenašeči dat nebo službami. Mohou být tedy obdařeny rozhraním, přes které s ním komunikují jiné objekty. Jenže ve světě Céčkových jazyků, můžeme mít tzv. statické členy. Statický člen existuje jen jednou, po celou dobu života aplikace.

Jenže, co je to život aplikace? Nevím jak je to přesně v PHP, ale myslím, že tam je to cca jeden požadavek. Statické proměnné tu slouží jako šikovná náhrada globálních proměnných a statické metody dovolují volat akce bez nudného vytváření instance třídy. To je jistě super. Ve světě dotnetu je to však mnohem složitější. V ASP.NET žije aplikace dokud ji někdo nevypne, tj. neresetuje aplikační pool, nezmění konfiguraci nebo neaktualizuje binárky. Takže u statického členu nikdy netušíte, jak dlouho bude žít.

Dalším problémem je konkurence. V PHP se aplikace spouští při každém požadavku a po jeho skončení opět vyhnije a to vše se děje v rámci jednoho vlákna. V ASP.NET žije aplikace mnoho požadavků, které jsou zpracovány samostatnými vlákny. Vzhledem k tomu, že statické členy jsou v aplikaci jen jednou a to pro více vláken, musíte najednou začít řešit konkurenční přístup, k těmto členům.

Další z problémů statických členů je ten, že třída není objekt, tudíž by se s členy třídy nemělo počítat v objektovém návrhu. :) Statické metody ani vlastnosti nelze popsat rozhraním, při jejich užití vzniká úzká vazba. Takovéto členy se také krásně vyhýbají dědičnosti. Nelze je přepsat tradičními postupy.

Takhle bych ve zkratce shrnul hlavní nevýhody statického přístupu. Platí jen pro určité případy. Nemusíte se s nimi nutně setkat a pro váš konkrétní případ mohou být i výhodné. Pokud však navrhujete API, které má být znovupoužitelné (hlavní výhoda OOP), nikdy nevíte, v jakém prostředí poběží. A když už píšeme objektově, tak proč rovnou nepsat tak, aby naše třídy znovupoužitel­né byly?

Jak tedy s těmi helpery?

Jak říká Michal Bláha, „statický helpery jsou výbornej syntax sugar.“ Jasně, proč ne? Ve skriptech může být statický helper jasným přínosem. Je ale třeba myslet na některá pravidla.

Základním pravidlem, pokud chci vytvořit statický helper, je vytvořit instanční implementaci. Dobrou ukázkou tohoto přístupu je například System.IO.File, který je statickou fasádou nad System.IO.FileInfo. Podobně funguje např. i metoda Rarous.TexyNet.Texy.Process, která slouží k rychlému převodu textu do HTML, ale je tu i silné instanční API, které tato metoda volá.

Závěr

Statické helpery jsou zlo, když jsou primárním návrhem a taky jediným. Pokud dosahujete kompozice objektů pomocí dependency injection, jsou pro vás statické helpery nedosažitelné (bez napsání instančního wraperu). Když píšete unit testy, nemůžete snadno statický helper nahradit. Pokud máte statické vlastnosti, musíte myslet na konkurenční přístup a životnost zdrojů, které takto zapouzdřujete.

public interface IDictionarySerializer<TKey, TValue, TData> {
  TData Serialize(IDictionary<TKey, TValue> dictionary);
  IDictionary<TKey, TValue> Deserialize(TData data);
}

Přece jen existuje více cest k cíli a je možné, že se někde šeredně pletu. Jaký je váš pohled na věc?

Autor: Aleš Roubíček | 5x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

Komponenty a nástroje od DevExpress zdarma

18.53 - 16. listopadu 2008 | Webdesign

Firma DevExpress je známá vývojem vizuálních komponent – v poslední době zejména pro dotnet, ale dříve také např. pro VCL nebo Delphi. Další jejich aktivitou jsou nástroje pro zvýšení produktivity práce CodeRush a Refactor! Pro, což jsou plug-iny do Visual Studia. No a nedávno došlo k uvolnění bezplatné sady komponent a express verze nástrojů.

Vizuální komponenty pro ASP.NET

Balíček bezplatných komponent obsahuje 21 kusů, jako tag cloud, menu, stránkovač, záložky, rss čtečku nebo callback panel. Určitě jsou mnohé z nich užitečné. :) Integrují se do toolboxu VS 2005 i 2008. Stáh­nout si je můžete zdarma po vyplnění registrace (jméno a e-mailová adresa).

Nástroje pro zvýšení produktivity

Pokud jste viděli videa o VS 2010, možná jste si všimli, že bude podporovat spoustu pěkných code snippets, příkazy pro generování kódu přes smart tagy apod. Tohle a mnohem víc umí už léta CodeRush. A DevExpress nyní přišli Xpress verzí, která přináší zdarma vybrané funkce zdarma. Je to třeba:

inteligentní vkládání ze schránky
když napíšete sadu fieldů a zkopírujete ji a pak vložíte do konstruktru, automaticky se vytvoří inicializace těchto fieldů,
navigace po referencích
kurzorem najedete do názvu proměnné a pomocí klávesy TAB přeskakujete po všech jejích výskytech,
generování kódu
to se hodí při TDD stylu práce, kdy napíšete test pro neexistující třídy a metody a necháte si je přes smart tag vygenerovat,
inteligentní selekce
numerickou klávesou + se označí nejbližší logická jednotka, a opakovaným stiskem třeba celý řádek, potom blok a tak dále, hodí se to třeba při psaní LINQ dotazů, které pak třeba chcete vložit do závorky a zavolat třeba metodu Take nebo ToList. Zmáčknete třikrát + a pak ( a celý LINQ dotaz je ozávorkovaný.

Krom výše zmiňované funkcionality CodeRush jsou přibaleny i některé skvělé refaktoringy z Refactor! Pro. Z těch zajímavějších vyberu třeba konverzi delegáta na lambda výraz, vytvoření lokální proměnné z označeného kusu kódu, komprimace na samo implementující property, převod ternárního operátoru na if a zase zpátky, přesun typu do samostatného souboru a další užitečné refactoringy.

Závěr

Osobně jsem spokojeným vlastníkem plné verze CodeRush a Refactor! Pro a používám spoustu dalších vychytávek, které v bezplatné verzi nejsou, ale i tak může být velice zajímavá, protože spousta věcí je velice návykových, a když je to zadarmo…

No prostě doporučuju minimálně alespoň vyzkoušet.

Poznamka: Vzhledem k licenční politice Microsoftu, nefunguje CodeRush Xpress v Express edicích Visual Studia. Pro jejich použití potřebujete alespoň Standard verzi.

Autor: Aleš Roubíček | 1x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

REST aplikace pomocí ASP.NET MVC

11.20 - 26. října 2008 | ASP.NET 2.0

Jednou z důležitých novinek v beta verzi ASP.NET MVC je bezesporu možnost přetěžování akcí a ve spolupráci s filtry na typ požadavku můžeme přejít na REST přístup k architektuře webové aplikace.

Ačkoli si mnoho lidí myslí, že když píšou v ASP.NET MVC, mají rovnou REST out of the box, není tomu tak. V plném RESTu se totiž nedostávají do URL slovesa (akce), nýbrž pouze předměty. Typický scénář CRUD operací může vypadat následovně:

POST /Customers/Create/
GET /Customers/Detail/1
POST /Customers/Update/1
GET /Customers/Delete/1

Takovéto akce snadno pokryjeme s výchozí routou /{controller}/{action}/{id} a řadič CustomersController může vypadat nějak tak:

public class CustomersController : Controller {
  public ActionResult Create(Customer customer) {
    // TODO: create customer
  }

  public ActionResult Detail(int id) {
    // TODO: find customer by id
  }

  public ActionResult Update(int id, Customer customer) {
    // TODO: update customer
  }

  public ActionResult Delete(int id) {
    // TODO: delete customer
  }
}

Jenže POSTování a GETování je jen slabou podmnožinou povolených operací na HTTP protokolu. Správný REST přístup pro CRUD operace by měl vypadat následovně:

POST /Customers
GET /Customers/1
PUT /Customers/1
DELETE /Customers/1

Co je pro to třeba udělat?

Začneme od routy. Přidáme novou routu pro CustomersController:

routes.MapRoute(
  "REST Customers",
  "Customers/{id}",
  new { controller = "Customers", action = "Rest", id = "" }
);

A původní kód obohatíme o pár atributů:

public class CustomersController : Controller {

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Post)]
  public ActionResult Create(Customer customer) {
    // TODO: save Customer to database
    return Json(new { status = "ok" });
  }

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Get)]
  public ActionResult Detail(int id) {
    // TODO: load Customer from database
    return View("Detail");
  }

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Get)]
  public ActionResult Index() {
    // TODO: load Customers from database
    return View("Index");
  }

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Put)]
  public ActionResult Update(int id, Customer customer) {
    // TODO: update Customer in database
    return Json(new { status = "ok" });
  }

  [ActionName("Rest")]
  [AcceptVerbs(HttpVerbs.Delete)]
  public ActionResult Delete(int id) {
    // TODO: delete Customer from database
    return Json(new { status = "ok" });
  }
}

A máme REST :)

Autor: Aleš Roubíček | 12x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

K WebExpu ještě jednou a pořádně

16.19 - 25. října 2008 | Webdesign

Už je to týden, co nám skončila přednáška o ASP.NET 3.5 / futures na konferenci WebExpo 2008. Rád bych se k této konferenci ještě ohlédl.

Moje prezentace

Když mě začátkem léta oslovil Vašek Stoupa, jestli nechci přednášet o ASP.NET MVC na WebExpu, měl jsem zprvu strach. Nikdy jsem veřejně nepřednášel a z malých slideshow, které jsem dělal pro kolegy nebo ve škole, jsem si byl jistý, že mé prezentační schopnosti nejsou skoro žádné. Ale pak jsem si řekl, že zkusit bych to mohl, přinejmenším je to dobrá zkušenost a raději jsem požádal Borka, aby se ke mně přidal. Proč? Protože už jsem ho viděl přednášet na WebCampu a bylo to dobré.

Takže jsme se domluvili, že přednáška bude mít trochu širší záběr než jen ASP.NET MVC, které v té době bylo pouze v ukázkových verzích. V průběhu září jsme vymysleli nějakou osnovu, Borek založil SVN repository a začali jsme připravovat prezentaci.

Nejprve jsem udělal ukázku na využití ADO.NET Data Services ve spolupráci s ASP.NET AJAX (tu najdete přibalenou). Krom toho, že ukazuje základy konzumace RESTových Data Services, tak je i hezkou ukázkou toho, jak takové služby stavět nejen nad Entity Frameworkem, ale i nad ActiveRecord/NHi­bernate. No, ukázka není úplně dokončená, protože jsem se jí přestal věnovat a už jsem nenašel chuť jí dokončit, ale základní koncepce je snad pochopitelná – snažil jsem se vše okomentovat.

Osobně nemám rád psaní zbytečného kódu. Nejsem zastáncem zbytečných ukázkových aplikací, testovacích utilitek a tak. Takže už jsem žádné další ukázkové aplikace nepsal a rozhodl se další možnosti ASP.NET ukázat na již hotových aplikacích, se kterými mám něco společného.

Základní koncept komponent a Master pages jsem se tedy rozhodl ukázat – ať nechodíme daleko – na šabloně tohoto blogu. O něco pokročilejší komponentový framework jsem pak ukazoval na šabloně obchody.atlas.cz. Tahle jedna šablona je v podstatě celý web. Bez knihovny je sice mrtvá a ještě chyběj pravidla URL rewritingu, ale jinak je tam vše. Tyhle dvě ukázky najdete taktéž přibalené.

Poslední mou ukázkou byla aplikace, kterou jsem psal kvůli potřebě naučit se ASP.NET MVC a ADO.NET Data Services prakticky ještě před konferencí a zároveň abychom se v práci zbavili nutnosti zapisovat si příchody někam na papír (formulář) a pak na konci měsíce počítat, kolik kdo dostane stravenek :). Tak vznikla docházka a taky rozcestník projektů a tím pádem základ Twareg.Intranet. Shodou okolností to možná bude i naše první komerčně prodávaná aplikace. Hezký osud bokovky…

Takže na tomto webu jsem se pokusil ukázat, jak se dělá routing, jak je ten systém modulární. Jak deklarativně pomocí atributů nastavit autorizaci k akcím a jak akce snadno přejmenovat. Na víc už moc nezbýval čas. Tahle ukázka přibalená není. Namísto ní najdete Borkovy REST služby postavené nad ASP.NET MVC, které jsme bohužel nestihli ukázat.

Co se týče mého vystoupení, tak moc spokojený nejsem, vůbec se to nedostalo ani na spodní hranici mých představ o dobré přednášce – naštěstí tam byl Borek, aby to zachránil.

Author Stream ty slajdy trochu rozsypal, ale lepší než nic. Jinak pokud si chcete slajdy nebo ukázky stáhnout, pokračujte na Slajdy a ukázky z WebExpa. Pokud vás toto téma zajímá určitě najdete spoustu zajímavých futures bits na Codeplexu. Některá témata z přednášky bych rád rozebral podrobněji tady na blogu, ale až někdy jindy.

Shlédnuté prezentace

Na WebExpu jsem naštěstí nebyl jen jako pokus o přednášejícího, ale i jako divák. Oproti původnímu plánu jsem nakonec navštívil trochu jiné přednášky. Jako opravdu výbornou můžu označit přednášku Juraje Michálka o Flexu. Hodně dobrá byla nejspíš i Karmiho přednáška o Ruby on Rails, ale zastihl jsem jen asi posledních 25 min. Přednáška o Nette z úst nejzasvěcenějšího byla zábavná, nicméně s plánovaným školením PHP frameworky na paměti značně zredukovaná.

Mezi pro mě obsahově hodnotné a pořád dobře odprezentované bych ještě rád zařadil Dagiho přednášku o Springu, přednášku Vlastimila Pečínky o architektuře v Seznamu a přednášku o SproutCore od Antonína Hildebranda. Sice jsem nedostal odpověď na otázku, jestli to funguje i bez JavaScriptu, ale i tak přednášku hodnotím jako přínosnou a můžu rubistům tiše závidět ;).

Sociální vlivy

Na tuhle akci jsem nejvíc těšil hlavně kvůli lidem. Já moc na tydlety akce nechodím, ale jednou za čas se potkat s lidmi, které často čtu, není špatné. Rád jsem osobně potkal i některé nové tváře, které jsem dosud nečetl a třeba to napravím…

Na závěr

Na závěr patří především velíké díky Vaškovi, za velikou zkušenost, za zorganizování téhle veliké party se spostou zajímavých osobností a se širokým záběrem témat. Je dobré když se člověk může podívat na to jak to dělaj jinde a něčemu se třaba přiučit nebo prodiskutovat své pohledy na věc. Ono táhnout konferenci až do první hodiny ranní není žádná sranda. Respekt!

Jo a málem bych zapomněl, na LinkedIn jsem vytvořil k této konferenci skupinu, takže pokud jste se ještě do ní nepřidali, neváhejte a udělejte to ještě teď. A pokud vás zajímají slajdy ostatních nebo chcte nasdílet své, využijte eventu na slide share.

Autor: Aleš Roubíček | 1x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

WebExpo za námi

13.08 - 20. října 2008 | Webdesign

Tento víkend jsem strávil na největší oborové konferenci o webu u nás – na WebExpu 2008. Byla to konference, kde jste mohli potkat lid nejrůznějších povolání – od marketingu přes management až ke kodérům, programátorům a vývojářům. A samozřejmě jste nemohli minout bandičku elitářských blogerů, které jistě znáte z Weblogy.cz.

Organizačně se mi konference líbila a poskytla mi i spoustu zajímavých témat k poslechu, někdy až tolik, že jsem začal přemýšlet o tom, jak využít mé rozdvojené osobnosti k tomu, abych pokryl více přednášek najednou. Nakonec tato metoda nezafungovala, takže jsem raději zaplul do šenku…

Nakonec jsem si odnesl spoustu zajímavých poznatků:

  • Radek Hulán je v pohodě a líbí se mi jeho pohled na web vs. Microsoft a jeho hlas
  • Arthur Dent spal s Davídkem a velkým plyšovým psem
  • Ruby je opravdu skvělé
  • rarouš je děsnej kořala a přednášení mu fakt nejde
  • Davídek se ztratil

Díky Vaškovi za skvělou konferenci a snad se brzy sejdeme na nějaké další ;)

Autor: Aleš Roubíček | 4x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

Slajdy a ukázky z WebExpa

12.58 - 19. října 2008 | Webdesign

Konečně jsem se dostal k tomu abych nahrál slajdy z naší přednášky na web.

Tady tedy jsou:

Autor: Aleš Roubíček | 11x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

What's Up?

15.38 - 16. října 2008 | Webdesign

Možná si říkáte, tady to umřelo, nic se neděje. Možná máte pravdu. Je to tím, že poslední dobou toho mám docela dost. Krom příprav na sobotní přednášku, jsem se musel věnovat shánění a následnému stěhování a nyní už i zařizování, což mě docela vytěžuje. :) Navíc v novém bytě ještě nemám zaveden internet, tak jsem téměř mužem v off-linu.

K příležitosti WebExpa jsem si vytvořil kalendář, kde bych se chtěl nejspíš pohybovat, uvidíme, jak to nakonec dopadne.

No a když už se to tak blíží, tak Microsoft nezapoměl vydat beta verzi ASP.NET MVC o němž chceme s Borkem povídat. Neni to jediný release před konferencí, například vyšel i Silverlight 2 o němž bude po nás povídat Štěpán Bechynský.

Vzhledem k tomu, že změny mezi Preview 5 a Beta verzí nejsou nikterak veliké (stačí pár drobných úprav, aby vše opět běželo jak má, budeme na přednášce tedy ukazovat už Betu. Já už jsem převedl moji ukázkovou aplikaci. Ta bude aplikace našeho tuaregského intranetu, takže žádná ukázková spatlanina, ale aplikace z reálného života. Dobré je, že na ní můžu ukázat jak ASP.NET MVC, tak ADO.NET Data Service, které v projektu také používám.

Tak pokud budete na WebExpu, tak mě nezapomeňte přijít pozdravit ;)

Autor: Aleš Roubíček | 1x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

Stack Overflow - sociální studnice znalostí pro vývojáře

17.29 - 19. září 2008 | ASP.NET 2.0

Tento týden byla spuštěna do veřejného beta provozu nová studnice znalostí pro vývojáře s romantickým názvem Stack Overflow.

Tento web se veze na sociální vlně. Je to kombinace FAQ, Wiki a Diggu. Umožňuje hlasování o relevantnosti odpovědí, tagování, gravatary, komentáře, prostě všechny tydlety cool 2.0 věci. Zatímto zajímavám počinem pro vývojáře stojí dvě docela známé a uznávané osobnosti v blogosféře a to Jeff Atwood (Coding Horror) a Joel Spolsky (Joel on Software).

Tak honem šup šup se na něco zeptat nebo odpovědět, úspěch této aplikace závisí pouze na dostatečně relevantích přispěvatelích.

PS. technická poznámka, celé je to postaveno pomocí ASP.NET MVC frameworku.

Autor: Aleš Roubíček | Zatím bez komentáře | Delicious | FriendFeed | Facebook | Linkuj!

Vývojová infrastruktura

09.40 - 14. září 2008 | Moje práce

Na začátku vývoje každého produktu bychom si měli připravit vhodnou infrastrukturu. Základem je verzovací systém – pokud pracujete sám, je značnou výhodou, v teamu nezbytností. Další důležitou součásti je systém pro vedení úkolů a bugů. Dále je vhodná wiki a taky nějaký buildserver.

Proč je to tak důležité?

Verzovací systém je vhodný na jakýkoli projekt, nemusí to nutně být ani projekt softwarový – my ho třeba s Borkem používáme na přípravu přednášky. Je to ochrana před ztrátou dat, občas pomůže se podívat do historie, dnešní systémy umějí mergovat změny z více zdrojů a jsou snadno zařaditelné do automatizovaného procesu.

Úkolník je dobrý z mnoha důvodů, vidíte, co máte dělat, jakou to má prioritu, kolik už máte hotovo. Slouží i jako váš výkaz, že se jen neflákáte. ;)

Build server je už jen třešničkou na dortu, která za vás dělá rutinu – špinavou a nudnou práci.

Jak to bylo v Atlase

Když jsem nastupoval do vývoje Atlas.cz, fungoval tam jen Visual SourceSafe, stagovalo se přes FTP. Vše bylo dost závislé na správném připravení verze do produkčního prostředí, to připravoval člověk a snadno mohlo dojít k chybě. :) Za nějaký čas jsme se rozhodovali jak to celé zautomatizovat a usnadnit. Nakonec jsme přešli na PureCM, Atlas.Build a Atlas.Autowebsite.

PureCM je verzovací systém s integrovaným úkolníkem a s možností skriptování v pythonu a dotnetím API. Má systém repository, které mají streamy a ty lze vzájemně mergovat v rámci hierarchie. Také k nim lze dopsat tzv. Custom action. Ta u nás nebyla nic jiného než spoušť události. Služba Atlas.Build tuto událost zachytila, provedla checkout, pročistila projekt a podle jednoduchého build skriptu (zjednodušený NAnt) připravila verzi buďto na dev servery nebo na staging, kterou pak nahrála na příslušný server pod danou verzí (názvem streamu).

Vývojář pak zadal do prohlížeče adresu, třeba http://katalog.3.6.0.dev2.atlas.cz, kde na něj čekal Autowebsite, který se zeptal jakou verzi frameworku použít a pak v IIS metabázi založil nový web.

Bylo za tím spousta magie a bylo celkem jednoduché a efektní a taky ušité na míru našim potřebám.

Jak to máme v Twaregu

Když jsme přišli do Twaregu, bylo opět potřeba připravit infrastrukturu. Po týdnu zkoušení a rozhodování jsme nakonec zvolili kombinaci Subversion (SVN), Trac, TeamCity.

SVN je celkem osvědčený verzovací sytém, je zdarma a multiplatformní, existuje pro něj dostatek nástrojů, včetně integrace do Visual Studia a je podporován všemi testovanými buildservery.

Trac je wiki a systém pro vedení úkolů s pěkným webovým prohlížečem repository. S SVN je spjat pupeční šňůrou a dá se dobře automatizovat tvorba nových projektů. Navíc je to OpenSource a je zdarma.

TeamCity je skvělý buildserver podporující Javu i dotnet (nejen tyto), umí se připojit do SVN a zvládá i vzdálené předtestované commity, což je killer feature. Pokud se dokážete smířit s omezením na 3 build agenty, 20 uživatelů a 20 konfigurací, pak je zdarma. Má pěknou integraci do Visual Studia a má API pro rozšiřování.

První měsíc v Twaregu jsem (nejen) připravoval infrastrukturu. Napsal jsem službu, která zakládá nové repository, připraví do nich základní adresářovou strukturu a založí projekt v tracku. Automatizované zakládání pro TeamCity zatím není a ještě nevím, jestli je potřeba. Jednotlivé konfigurace je lepší projít ručně a nastavit dle požadavků daného projektu. Na projektu většinou máme dvě konfigurace, jednu, která je pro vzdálený předtestovaný commit do vývojového branche a druhou, která se spouští při commitu do trunku. Provede se kompletní build, spustí se testy, pokud je vše ok, vytvoří se dokumentace a nahraje na intranet, provede se deploy knihoven do společného úložiště a vytvoří se weby, pokud nějaké v projektu jsou.

Co se všechno má udělat je řízeno MSBuild skriptem, pro který jsem připravil několik tasků. Upravil jsem xUnit.net task, aby se posílaly zprávy do TeamCity a přibalily výsledky testů do sumáře o buildu.

Je fakt, že tady máme build skripty mnohem ukecanější něž v Atlasu, ale jsou mnohem flexibilnější – vzhledem k heterogennímu prostředí je to potřeba.

Závěr

Investujete-li na začátku nějaký čas na vybudování infrastruktury, jistě se vám to vrátí později v podobě nevytrhaných vlasů a neokousaných nehtů, když někdo někomu omylem přemázne celodenní práci nebo vydeployuje nefunkční verzi. Nemít verzovací systém je vyložený hazard, nemít úkolník je přinejmenším nepohodlné a bez build serveru se dá žít…

A jakou infrastrukturu/sys­tém používáte vy?

Autor: Aleš Roubíček | 21x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

Stáhněte si Texy.net a NForms přes SVN

16.02 - 13. září 2008 | ASP.NET 2.0

Projekty, které se rozhodnu vypustit ven, většinou hostuju na CodePlexu. Jeho UI mi přijde mnohem rychlejší než konkurenční SourceForge a přehlednější než Google Code. Nevadí mi, že za tímto hostingem stojí velký zlý Microsoft, naopak to vítám. Tento projekt byl jedním z prvních krůčků na podporu OpenSource ze strany Microsoftu a navíc je místem, kde samotný Microsoft uveřejňuje spoustu zajímavých projektů. Například budoucí části ASP.NET.

Ale zpět k tématu. Tento hosting je postaven na Team Foundation Serveru (TFS), který je centrem pro týmovou práci, verzovacím systémem a v neposlední řadě i systémem pro vedení požadavků a úkolů. Tím se odlišuje od konkurence, která většinou používá tradiční SVN, což je po léta de-facto standard pro verzování OpenSource projektů. Komunita dlouho volala po tom, že chtějí SVN i CodePlexu. V MS nakonec udělali kompromis.

SVN Bridge

SVN Bridge byl první krok. Je to taková malá utilitka, kterou si spustíte na vašem počítači a ona překládá vaše SVN požadavky do řeči, které rozumí TFS. Můžete s ní pak používat oblíbené nástroje jako TortoiseSVN nebo VisualSVN. Ale pořád je tu nutnost donahrát si utilitu a ani URL repository ve tvaru http://localhost:8081/<tfs.server.name>/<projectname> nejsou nějak úchvatná.

Tento měsíc však došlo k zásadní změně. Na Codeplexu byl nasazen serverový SVN bridge, takže už nemusím pouštět lokální verzi, ale rovnou můžu pro snadný přístup přes SVN nástroje používat adresy následující:

  1. pro NForms https://nforms.svn.codeplex.com/svn
  2. pro Texy.net https://texynet.svn.codeplex.com/svn

No a vy také ;)

Autor: Aleš Roubíček | 5x komentováno | Delicious | FriendFeed | Facebook | Linkuj!