<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Maciej Aniserowicz</title>
    <description />
    <link>http://www.maciejaniserowicz.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>pl-PL</language>
    <blogChannel:blogRoll>http://www.maciejaniserowicz.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Maciej Aniserowicz</dc:creator>
    <dc:title>Maciej Aniserowicz</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/maciejaniserowicz" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Zawieszająca się instalacja Windows 7 i jej związek z FDD</title>
      <description>&lt;p&gt;Wielki owóż nastąpił przewrót w życiu moim zawodowym (i chyba w sumie nie tylko), gdyż wreszcie, po 4 miesiącach zwlekania, stareńkiego XP zastąpiłem nowym 7. I poszło zadziwiająco zgrabnie, 2 dni konfiguracji i prawie (...) wszystko działa tak jak chcę! Wrażeń opisywać nie będę, ponieważ pewnie większość z was i tak zdanie ma już wyrobione.&lt;/p&gt;  &lt;p&gt;Jeśli jednak ktoś ma jeszcze przyjemność instalacji &lt;em&gt;Win 6.1&lt;/em&gt; przed sobą, mała porada może okazać się wielce przydatna. Kłopoty moje pojawiły się dopiero przy trzeciej instalacji, na komputerze stacjonarnym. Dwie poprzednie, na różnych wiekowo laptopach (jak upgrade to pełną gębą, w całym domu:) ), przebiegły bezproblemowo. Problem objawiał się tym, że już samym początku, przy pierwszym ekranie (przed pojawieniem się list z wyborem wersji językowej) przez ok 10 minut oglądałem piękne błękitne tło. Po wybraniu języka - to samo - przynajmniej kwadrans oczekiwania na ekranie &amp;quot;Starting Setup&amp;quot; czy coś w ten deseń. Nie wiem ile by to trwało, bo przerwałem instalację (a raczej jej zaczątek) i wybrałem się na poszukiwanie rozwiązania.&lt;/p&gt;  &lt;p&gt;Okazało się, że ta sytuacja może mieć wiele rozwiązań. Najczęstszym tego rozwiązaniem, z tego co wyczytałem, jest to samo co zadziałało u mnie: wyłączenie w BIOSie stacji dyskietek. Chociaż nie mam jej w maszynie zainstalowanej. I pewnie właśnie jej brak powodował głupienie instalatora.&lt;/p&gt;  &lt;p&gt;Tak czy siak po tej operacji wszystko przebiegło pomyślnie. Bezsensowna pierdoła, ale krwi potrafi napsuć.&lt;/p&gt;  &lt;p&gt;Aha, jeśli ktoś jest niezdecydowany - to po 2-3 dniach obcowania z nowym systemem powiedzieć mogę (jak i ponad 90% ludzi którzy mieli z tym systemem styczność?): naprawdę warto. Jest po prostu fajnie.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/elcLxBEF0DY" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/11/09/Zawieszajaca-sie-instalacja-Windows-7-i-jej-zwiazek-z-FDD.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/11/09/Zawieszajaca-sie-instalacja-Windows-7-i-jej-zwiazek-z-FDD.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=1e3e9f6e-47dd-4894-8c6b-54ba2726f428</guid>
      <pubDate>Mon, 09 Nov 2009 17:58:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=1e3e9f6e-47dd-4894-8c6b-54ba2726f428</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=1e3e9f6e-47dd-4894-8c6b-54ba2726f428</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/11/09/Zawieszajaca-sie-instalacja-Windows-7-i-jej-zwiazek-z-FDD.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=1e3e9f6e-47dd-4894-8c6b-54ba2726f428</wfw:commentRss>
    </item>
    <item>
      <title>AutoMapper, NHibernate, lazy loading oraz problem select n+1</title>
      <description>&lt;p&gt;Ostatnio &lt;a href="http://www.maciejaniserowicz.com/post/2009/11/04/Co-to-jest-AutoMapper-i-dlaczego-warto-go-znac.aspx" target="_blank"&gt;pisałem o AutoMapperze&lt;/a&gt;, a kiedyś &lt;a href="http://www.maciejaniserowicz.com/post/2009/10/23/NHibernate-jak-zaczac.aspx" target="_blank"&gt;wcześniej o NHibernate&lt;/a&gt;. Dzisiaj złączę te dwa narzędzia niczym Jasia i Małgosię, Tristana i Izoldę, Lecha i Jarosława, a z ich nawzajemnego obcowania narodzi się problem, który dość łatwo przegapić.&lt;/p&gt;  &lt;p&gt;Wróćmy do przedstawionych ostatnio, banalnych klas:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div class="csharp"&gt;   &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; User
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;virtual&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Id { get; set; }
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;virtual&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Name { get; set; }
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;virtual&lt;/span&gt; IList&amp;lt;Address&amp;gt; Addresses { get; set; }
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; User()
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  		Addresses = &lt;span class="csKeyword"&gt;new&lt;/span&gt; List&amp;lt;Address&amp;gt;();
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt; 11:&lt;/span&gt;  }
&lt;span class="csLineNumber"&gt; 12:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt; 13:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; Address
&lt;span class="csLineNumber"&gt; 14:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt; 15:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;virtual&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Id { get; set; }
&lt;span class="csLineNumber"&gt; 16:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;virtual&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Street { get; set; }
&lt;span class="csLineNumber"&gt; 17:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;virtual&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; City { get; set; }
&lt;span class="csLineNumber"&gt; 18:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;virtual&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Country { get; set; }
&lt;span class="csLineNumber"&gt; 19:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Ich mapowań z wykorzystaniem Fluent NHibernate:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; UserMap : ClassMap&amp;lt;User&amp;gt;
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; UserMap()
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  		Id(x =&amp;gt; x.Id);
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  		Map(x =&amp;gt; x.Name);
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  		HasMany(x =&amp;gt; x.Addresses).Inverse().Cascade.All();
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  }
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt; 11:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; AddressMap : ClassMap&amp;lt;Address&amp;gt;
&lt;span class="csLineNumber"&gt; 12:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt; 13:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; AddressMap()
&lt;span class="csLineNumber"&gt; 14:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt; 15:&lt;/span&gt;  		Id(x =&amp;gt; x.Id);
&lt;span class="csLineNumber"&gt; 16:&lt;/span&gt;  		Map(x =&amp;gt; x.Street);
&lt;span class="csLineNumber"&gt; 17:&lt;/span&gt;  		Map(x =&amp;gt; x.City);
&lt;span class="csLineNumber"&gt; 18:&lt;/span&gt;  		Map(x =&amp;gt; x.Country);
&lt;span class="csLineNumber"&gt; 19:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt; 20:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Reprezentacji DTO:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  [DataContract]
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; UserDto
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Id { get; set; }
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Name { get; set; }
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; AddressDto[] Addresses { get; set; }
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  }
&lt;span class="csLineNumber"&gt; 11:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt; 12:&lt;/span&gt;  [DataContract]
&lt;span class="csLineNumber"&gt; 13:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; AddressDto
&lt;span class="csLineNumber"&gt; 14:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt; 15:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt; 16:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Id { get; set; }
&lt;span class="csLineNumber"&gt; 17:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt; 18:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Street { get; set; }
&lt;span class="csLineNumber"&gt; 19:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt; 20:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; City { get; set; }
&lt;span class="csLineNumber"&gt; 21:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt; 22:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Country { get; set; }
&lt;span class="csLineNumber"&gt; 23:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Oraz konfiguracji AutoMappera:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Mapper.CreateMap&amp;lt;User, UserDto&amp;gt;();
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  Mapper.CreateMap&amp;lt;Address, AddressDto&amp;gt;();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Raczej nic nie powinno wymagać tu wyjaśnienia (o Fluent-NH zamierzam wkrótce napisać trochę więcej).&lt;/p&gt;

&lt;p&gt;Teraz kontekst:&lt;/p&gt;

&lt;p&gt;Jakiś klient żąda od nas listy wszystkich użytkowników do wyświetlenia... gdzieś tam. Potrzebuje jedynie nazwy użytkownika oraz jego ID, adresy go nie obchodzą. Zadowoleni pobieramy więc samych użytkowników bez adresów:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  UserDto[] dtos = &lt;span class="csKeyword"&gt;null&lt;/span&gt;;
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;using&lt;/span&gt; (&lt;span class="csKeyword"&gt;var&lt;/span&gt; session = AppFacade.DataAccess.OpenSession())
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	User[] users = session.Linq&amp;lt;User&amp;gt;().ToArray();
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	dtos = Mapper.Map&amp;lt;User[], UserDto[]&amp;gt;(users);
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  }
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  &lt;span class="csComment"&gt;//...&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Ależ z nas optymalizatory! Nie potrzebujemy adresów, więc ich nie pobieramy! A przecież równie dobrze mogło to dotyczyć o wiele bardziej obciążających bazę i łącze danych. Za tak wyrafinowane rozwiązanie należy nam się browar. Czy aby na pewno?&lt;/p&gt;

&lt;p&gt;Na wszelki wypadek podejrzymy wygenerowany przez NHibernate SQL:&lt;/p&gt;
&lt;img src="http://www.maciejaniserowicz.com/image.axd?picture=automapper_nhibernate-selectn1.png" /&gt; 

&lt;p&gt;U’la’la. Nie dość, że pobieramy z bazy adresy, to jeszcze wpadliśmy w pułapkę &amp;quot;select n+1&amp;quot;. A przecież mapowanie NH nie mówiło nic o &amp;quot;&lt;em&gt;eager loading&lt;/em&gt;&amp;quot;. Oj, nie na browar zasłużyliśmy, a co najwyżej na klapsa. I to bez niespodzianki.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wtrącenie&lt;/em&gt;: w teorii powinno się mieć osobny obiekt DTO dla każdej operacji... ale często można pójść na skróty i zdefiniować jeden wykorzystywany w kilku miejscach. Moim zdaniem nie ma w tym nic szczególnie zdrożnego, należy po prostu uważać i być świadomym tego co się robi. W tym przypadku poszedłem na skróty i zdefiniowałem &lt;em&gt;UserDto&lt;/em&gt; zamiast np. &lt;em&gt;UserDto&lt;/em&gt; i &lt;em&gt;UserWithAddressesDto&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Powód takiego a nie innego zapytania jest prosty, wystarczy lekko zmodyfikować kod aby się domyślić:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  User[] users;
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;using&lt;/span&gt; (&lt;span class="csKeyword"&gt;var&lt;/span&gt; session = AppFacade.DataAccess.OpenSession())
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	users = session.Linq&amp;lt;User&amp;gt;().ToArray();
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  }
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  UserDto[] dtos = Mapper.Map&amp;lt;User[], UserDto[]&amp;gt;(users);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Takie coś będzie skutkowało &lt;em&gt;NHibernate.LazyInitializationException&lt;/em&gt; w linijce 6, czyli podczas mapowania. I... prawidłowo! AutoMapper chce dobrać się do kolekcji adresów i przepisać je do DTO. NHibernate próbuje w tym momencie załadować adresy z bazy, a że jesteśmy poza sesją – wyrzuca wyjątek. Poprzednio cały czas byliśmy w obszarze aktywności sesji i adresy były leniwie pobierane dla każdego użytkownika po kolei.&lt;/p&gt;

&lt;p&gt;Ale samo przedstawienie problemu to tylko połowa fajności pisania postów, czas na rozwiązanie.&lt;/p&gt;

&lt;p&gt;Napisałem klasę dziedziczącą z &lt;em&gt;AutoMapper.ValueResolver&lt;/em&gt;, która będzie próbowała dostać się do wartości źródłowej tylko i wyłącznie wtedy, gdy ta zostanie uprzednio zainicjowana przez NHibernate. W przeciwnym wypadku w miejsce docelowe wpisany zostanie &lt;em&gt;null&lt;/em&gt;. Oto i ona:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; NHibernateResolver : ValueResolver&amp;lt;&lt;span class="csKeyword"&gt;object&lt;/span&gt;, &lt;span class="csKeyword"&gt;object&lt;/span&gt;&amp;gt;
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;protected&lt;/span&gt; &lt;span class="csKeyword"&gt;override&lt;/span&gt; &lt;span class="csKeyword"&gt;object&lt;/span&gt; ResolveCore(&lt;span class="csKeyword"&gt;object&lt;/span&gt; source)
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;if&lt;/span&gt; (NHibernateUtil.IsInitialized(source))
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  			&lt;span class="csKeyword"&gt;return&lt;/span&gt; source;
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;return&lt;/span&gt; &lt;span class="csKeyword"&gt;null&lt;/span&gt;;
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Oczywiście trzeba odpowiednio poinstruować AutoMappera, aby wiedział że ma z tego mechanizmu skorzystać:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Mapper.CreateMap&amp;lt;User, UserDto&amp;gt;()
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  	.ForMember(dest =&amp;gt; dest.Addresses,
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	opts =&amp;gt; opts.ResolveUsing&amp;lt;NHibernateResolver&amp;gt;().FromMember(src =&amp;gt; src.Addresses));&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I wszystko jest już jak być powinno, przyjemnie i &amp;quot;reużywalnie&amp;quot;:&lt;/p&gt;
&lt;img src="http://www.maciejaniserowicz.com/image.axd?picture=automapper_nhibernate-ok.png" /&gt; 

&lt;p&gt;Wygraliśmy browar!&lt;/p&gt;

&lt;p&gt;Tip: do testowania podobnych rzeczy wykorzystuje się klasę &lt;em&gt;NHibernateUtil&lt;/em&gt; (zastosowaną zresztą w prezentowanym rozwiązaniu).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/z3mjnxTUXzM" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/11/06/AutoMapper-NHibernate-lazy-loading-oraz-problem-select-n1.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/11/06/AutoMapper-NHibernate-lazy-loading-oraz-problem-select-n1.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=91e89cc2-57d8-438e-b047-28179b1b190c</guid>
      <pubDate>Fri, 06 Nov 2009 06:59:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=91e89cc2-57d8-438e-b047-28179b1b190c</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=91e89cc2-57d8-438e-b047-28179b1b190c</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/11/06/AutoMapper-NHibernate-lazy-loading-oraz-problem-select-n1.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=91e89cc2-57d8-438e-b047-28179b1b190c</wfw:commentRss>
    </item>
    <item>
      <title>Co to jest AutoMapper i dlaczego warto go znać</title>
      <description>&lt;p&gt;W każdej aplikacji klient-serwer następuje komunikacja. Masło maślane - gdyby nie było komunikacji, nie byłoby aplikacji klient-serwer. Pomiędzy klientem i serwerem muszą być przesyłane jakieś dane. Szymon &lt;a href="http://zine.net.pl/blogs/simon/archive/2009/09/17/dto-vs-cqs.aspx" target="_blank"&gt;pisał jakiś czas temu&lt;/a&gt; o tym dlaczego warto wyrzucić ze swojej architektury DTOs, czyli Data Transfer Objects.&lt;/p&gt;  &lt;p&gt;Ja natomiast przedstawię pokrótce narzędzie, które pozwoli bardzo efektywnie WYKORZYSTAĆ koncept DTOs. Dane tak czy siak przesłać w jedną i drugą stronę trzeba a nie zawsze opłaca się budowanie dwóch modeli domeny jak to sugeruje Szymon.&lt;/p&gt;  &lt;p&gt;W dalszej części posta będę posługiwał się klasami:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div class="csharp"&gt;   &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; User
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Id { get; set; }
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; FirstName { get; set; }
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; LastName { get; set; }
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; Address Address { get; set; }
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;void&lt;/span&gt; Register()
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  		&lt;span class="csComment"&gt;//....&lt;/span&gt;
&lt;span class="csLineNumber"&gt; 11:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt; 12:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt; 13:&lt;/span&gt;  	&lt;span class="csComment"&gt;// some more domain logic...&lt;/span&gt;
&lt;span class="csLineNumber"&gt; 14:&lt;/span&gt;  }
&lt;span class="csLineNumber"&gt; 15:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt; 16:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; Address
&lt;span class="csLineNumber"&gt; 17:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt; 18:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Street { get; set; }
&lt;span class="csLineNumber"&gt; 19:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; City { get; set; }
&lt;span class="csLineNumber"&gt; 20:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; Country { get; set; }
&lt;span class="csLineNumber"&gt; 21:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;One, mimo swej karłowatej postaci, reprezentują naszą logikę wykonywaną po stronie serwera. Zakładam, że nie chcielibyśmy przesyłać ich po kablu do klientów – koniec końców klasy te mają służyć wykonywaniu operacji na danych, a nie ich prezentacji.&lt;/p&gt;

&lt;p&gt;Do przesyłania danych posłużymy się wspomnianymi wcześniej &lt;a href="http://en.wikipedia.org/wiki/Data_Transfer_Object" target="_blank"&gt;Data Transfer Objects&lt;/a&gt;, czyli na przykład:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  [DataContract]
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; UserDto
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Id { get; set; }
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; FirstName { get; set; }
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; LastName { get; set; }
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Zauważcie atrybuty WCF – one jasno określają cel powstania tej klasy, czyli reprezentację danych gotowych do transmisji GDZIEŚ.&lt;/p&gt;

&lt;p&gt;Przyjrzyjmy się kilku sposobom tworzenia i wypełniania takich obiektów&lt;/p&gt;

&lt;h3&gt;1. Manualne muskanie właściwości, czyli &amp;quot;będę doktorem&amp;quot;&lt;/h3&gt;

&lt;p&gt;Niczego prostszego nie da się chyba wymyślić. Z drugiej strony: ciężko również wymyślić coś bardziej &lt;em&gt;errorogennego&lt;/em&gt; (brudne myśli na bok!) i trudniejszego w utrzymaniu.&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  UserDto dto = &lt;span class="csKeyword"&gt;new&lt;/span&gt; UserDto();
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  dto.Id = user.Id;
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  dto.FirstName = user.FirstName;
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  dto.LastName = user.LastName;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3&gt;2. Generyczny przepisywacz wartości, czyli &amp;quot;no place to hide&amp;quot;&lt;/h3&gt;

&lt;p&gt;Pewnie wielu z was zdarzyło się pisać coś takiego. Ja pisałem to przynajmniej dwukrotnie. Działać... owszem działa. W ograniczonym zakresie, ale jednak.&lt;/p&gt;

&lt;p&gt;Wyglądać może toto mniej więcej tak:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;static&lt;/span&gt; &lt;span class="csKeyword"&gt;void&lt;/span&gt; CopyPropertiesTo(&lt;span class="csKeyword"&gt;this&lt;/span&gt; &lt;span class="csKeyword"&gt;object&lt;/span&gt; source, &lt;span class="csKeyword"&gt;object&lt;/span&gt; target)
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	Type sourceType = source.GetType();
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	Type targetType = target.GetType();
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;foreach&lt;/span&gt; (&lt;span class="csKeyword"&gt;var&lt;/span&gt; sourceProp &lt;span class="csKeyword"&gt;in&lt;/span&gt; sourceType.GetProperties())
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;var&lt;/span&gt; targetProp = targetType.GetProperty(sourceProp.Name);
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;if&lt;/span&gt; (targetProp != &lt;span class="csKeyword"&gt;null&lt;/span&gt;)
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  		{
&lt;span class="csLineNumber"&gt; 11:&lt;/span&gt;  			targetProp.SetValue(target, sourceProp.GetValue(source, &lt;span class="csKeyword"&gt;null&lt;/span&gt;), &lt;span class="csKeyword"&gt;null&lt;/span&gt;);
&lt;span class="csLineNumber"&gt; 12:&lt;/span&gt;  		}
&lt;span class="csLineNumber"&gt; 13:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt; 14:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;A korzysta się z tego tak:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  UserDto dto = &lt;span class="csKeyword"&gt;new&lt;/span&gt; UserDto();
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  user.CopyPropertiesTo(dto);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Zdecydowanie lepiej niż ręczne przepisywanie, ale...&lt;/p&gt;

&lt;p&gt;Co by się stało w obu tych przypadkach, gdybyśmy chcieli dodać coś takiego:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  [DataContract]
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; UserDto
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	&lt;span class="csComment"&gt;//...&lt;/span&gt;
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csComment"&gt;//...&lt;/span&gt;
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; AddressStreet { get; set; }
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Generyczny przepisywacz leży i kwiczy jak Lach na Siczy.&lt;/p&gt;

&lt;p&gt;Natomiast w przypadku pierwszym odpowiedź jest banalna – za każdym razem, gdy zmieni się coś w DTO - idziemy do odpowiedniego miejsca i dopisujemy odpowiednie instrukcje przypisania. Tak jak małpa w ZOO regularnie łazi do wiadra w którym co jakiś czas znajduje banana.&lt;/p&gt;

&lt;p&gt;Bycie małpą nie może być fajne (chyba że jest to &lt;a href="http://www.freewebs.com/eatmymuffins/fg.evil.monkey.jpeg" target="_blank"&gt;&lt;em&gt;evil monkey&lt;/em&gt;&lt;/a&gt;), więc zobaczmy co oferuje zapowiadany...&lt;/p&gt;

&lt;h3&gt;3. AutoMapper&lt;/h3&gt;

&lt;p&gt;Po kolei:&lt;/p&gt;

&lt;p&gt;Najpierw definiujemy mapowania, których będziemy potrzebować (jest to krok wymagany). Robimy to raz, przy starcie aplikacji, na przykład wraz z inicjalizacją NHibernatowej SessionFactory czy ASPNETMVCowych routów:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Mapper.CreateMap&amp;lt;User, UserDto&amp;gt;();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;A potem mapujemy do woli:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;var&lt;/span&gt; dto = Mapper.Map&amp;lt;User, UserDto&amp;gt;(user);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Należy zauważyć, że AutoMapper jest &amp;quot;inteligentny&amp;quot;. Przedstawiony scenariusz z AddressStreet będzie obsłużony tak jak sobie tego życzę: odpowiednia nazwa właściwości zdecyduje o tym, że pobrana zostanie wartość &lt;em&gt;Street&lt;/em&gt; ze składowej &lt;em&gt;Address&lt;/em&gt;. Widzicie jakie daje to możliwości rozbudowy i modyfikacji definicji DTO bez ingerencji w mapowania?&lt;/p&gt;

&lt;p&gt;Mało tego, ta jedna definicja pozwala na mapowanie również kolekcji danych obiektów:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;var&lt;/span&gt; dtos = Mapper.Map&amp;lt;User[], UserDto[]&amp;gt;(users);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;A jeśli chcemy ręcznie ingerować w jakieś mapowanie, na przykład zawrzeć w naszym obiekcie DTO coś takiego:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  [DataContract]
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; UserDto
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	&lt;span class="csComment"&gt;//...&lt;/span&gt;
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csComment"&gt;//...&lt;/span&gt;
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt; FullName { get; set; }
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;to oczywiście AutoMapper nam na to pozwoli:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Mapper.CreateMap&amp;lt;User, UserDto&amp;gt;()
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  	.ForMember(dest =&amp;gt; dest.FullName,
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	opts =&amp;gt; opts.MapFrom(src =&amp;gt; src.FirstName + &lt;span class="csString"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + src.LastName));&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;A gdy dojdziemy do wniosku, że wysyłanie gdziekolwiek ID użytkowników jest złym pomysłem i nie chcemy nigdy mieć tej wartości w DTO (z jakiegokolwiek powodu, a ostatnio dwukrotnie spotkałem się z takim podejściem) - nic prostszego:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Mapper.CreateMap&amp;lt;User, UserDto&amp;gt;()
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  	.ForMember(dest =&amp;gt; dest.Id, opts =&amp;gt; opts.Ignore())&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Możemy też dodać instrukcję dającą nam 100% gwarancji, że AutoMapper będzie umiał wypełnić WSZYSTKIE wartości w naszych obiektach DTO. Gdybyśmy do UserDto dodali:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  [DataContract]
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; UserDto
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	&lt;span class="csComment"&gt;//...&lt;/span&gt;
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csComment"&gt;//...&lt;/span&gt;
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	[DataMember]
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Age { get; set; }
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;wówczas wartość ta zawsze byłaby pusta: w końcu w User nie mamy takiej właściwości. Wystarczy jednak jedna linijka po definiowaniu całej konfiguracji:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Mapper.AssertConfigurationIsValid();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;i zawsze w podobnym przypadku prosto w nasze zdziwione twarze poleci wyjątek &lt;em&gt;AutoMapperConfigurationException&lt;/em&gt;. Warto o tym wiedzieć.&lt;/p&gt;

&lt;p&gt;Kilka uwag końcowych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ręczne mapowanie jest &lt;strong&gt;GŁUPIE&lt;/strong&gt; &lt;/li&gt;

  &lt;li&gt;ta prosta biblioteczka może wyeliminować masę GŁUPICH czynności i GŁUPIEGO kodu &lt;/li&gt;

  &lt;li&gt;nie dajmy się ponieść; z mapowaniem jest jak ze wszystkim innym i łatwo przesadzić, w szczególności należy pamiętać, że ten mechanizm powstał po to aby mapować domenę na DTO; stosowanie takich mapowań w innych sytuacjach może świadczyć o potrzebie ponownej analizy kodu źródłowego i ewentualnych zmian w przyjętych rozwiązaniach architektonicznych (bardzo enigmatycznie brzmiące zdanie, ale wbrew pozorom ma sens:) ) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zachęcam do samodzielnego ściągnięcia tego narzędzia (jedna dllka na &lt;a href="http://automapper.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=32994#ReleaseFiles" target="_blank"&gt;CodePlex&lt;/a&gt;) i pobawienia się nim chwilę. Nie ma tu nic szczególnie skomplikowanego, ale nie zaszkodzi również zerknąć do minidokumentacji (&lt;a href="http://automapper.codeplex.com/" target="_blank"&gt;&amp;quot;General features&amp;quot;&lt;/a&gt;) oraz&amp;#160; &lt;a href="http://code.google.com/p/automapperhome/source/browse/#svn" target="_blank"&gt;kodu źródłowego&lt;/a&gt;, a w szczególności do &lt;a href="http://code.google.com/p/automapperhome/source/browse/#svn/trunk/src/AutoMapperSamples" target="_blank"&gt;testów jednostkowych pełniących rolę sampli&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/MOpNa3sqfTM" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/11/04/Co-to-jest-AutoMapper-i-dlaczego-warto-go-znac.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/11/04/Co-to-jest-AutoMapper-i-dlaczego-warto-go-znac.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=1f678c12-f1c3-43aa-934a-b2cea07077df</guid>
      <pubDate>Wed, 04 Nov 2009 06:28:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=1f678c12-f1c3-43aa-934a-b2cea07077df</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=1f678c12-f1c3-43aa-934a-b2cea07077df</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/11/04/Co-to-jest-AutoMapper-i-dlaczego-warto-go-znac.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=1f678c12-f1c3-43aa-934a-b2cea07077df</wfw:commentRss>
    </item>
    <item>
      <title>Moje środowisko pracy z MaxiVista</title>
      <description>&lt;p&gt;Minął ponad rok od kiedy zwiększyłem swój &amp;quot;obszar roboczy&amp;quot; ponad 2x: do 19&amp;quot; Benq &lt;a href="http://www.maciejaniserowicz.com/post/2008/09/28/FullHD-na-VPC-przez-RDP.aspx" target="_blank"&gt;dorzuciłem 24&amp;quot; Hyundai&lt;/a&gt;. Od kiedy zmieniłem miejsce pracy na domowe zacisze krok ten doceniam oczywiście o wiele bardziej niż wcześniej, gdy w domu programowałem jedynie hobbystycznie. I któregoś pięknego dnia zapaliła się w nienasyconej głowie lampka: &amp;quot;&lt;em&gt;a może by tak... jeszcze więcej?&lt;/em&gt;&amp;quot;.&lt;/p&gt;  &lt;p&gt;No tak, łatwo powiedzieć. Trzeci monitor to, pomijając wydatek na sam ekran, kolejna karta graficzna (lub jakiś rozgałęziacz do aktualnie posiadanej...?). A i biurko pewnie też trzeba by było powiększyć. Wszystko to wydawało się dość ryzykownym posunięciem zważywszy na to, że nie miałem wcale pewności co do powodzenia tego eksperymentu. Przeskok z jednego na dwa monitory to zdecydowanie wyborna decyzja i wiedziałem o tym już wcześniej, ale czy tak samo będzie z trzecim ekranem?&lt;/p&gt;  &lt;p&gt;Nie budując dłużej napięcia śmiało powiedzieć mogę: WARTO! Nie jest to co prawda tak drastyczny wzrost komfortu jak przejście z 1 na 2, ale i tak &amp;quot;freelancuje&amp;quot; się o niebo lepiej. Tym bardziej, że lista narzędzi, które mam odpalone podczas normalnej pracy non stop jest dość pokaźna: wirtualka z Visual Studio &amp; company, Management Studio (&amp;quot;zdalnie&amp;quot; podłączone do bazy na wirtualce), Total Commander, Skype, X-Lite (niezbędne do testowania tworzonego systemu), OnTime (do zarządzania projektem), Excel (do lokalnego notowania postępów prac), Operę, Outlooka i okazjonalnie Gadu-Gadu. I zdarza się, że z wszystkiego tego korzystam jednocześnie – a wtedy i 5 monitorów nie byłoby wystarczające.&lt;/p&gt;  &lt;p&gt;Ale do rzeczy... Nie, nie kupiłem zestawu karta graficzna + monitor + biurko. Aktualnie moje środowisko pracy wygląda tak:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img alt="" src="http://www.maciejaniserowicz.com/image.axd?picture=maxivista-workplace.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Gdzie:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;tutaj operuję na systemie hosta korzystając z aplikacji &amp;quot;pobocznych (Opera, Outlook, Skype etc..)&amp;quot;&lt;/li&gt;    &lt;li&gt;to głównie ten pan kradnie mi dioptrię po dioptrii zawierając wirtualkę z projektem, nad którym aktualnie pracuję&lt;/li&gt;    &lt;li&gt;nie nauczyłem się jeszcze w pełni efektywnie korzystać z trzeciego monitora, więc póki co jest to śmietnik na który wrzucam wszystko co powinno być na wierzchu, ale nie wymaga ciągłej obserwacji&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Ale po co o tym piszę? Przecież nie żeby pochwalić się zdolnością gapienia się w trzy ekrany jednocześnie. Celem niniejszego posta jest przedstawienie niesamowitego kawałka softu: &lt;a href="http://www.maxivista.com/" target="_blank"&gt;MaxiVista&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Jak można zauważyć mój trzeci ekran to nie dodatkowy monitor, a najzwyklejszy laptop. Tak jest: osobny komputer pełni rolę kolejnego powiększenia obszaru roboczego mojego pulpitu, pozwalającego na interakcję z programami działającymi na moim GŁÓWNYM sprzęcie. I pisząc NAJZWYKLEJSZY mam dokładnie to na myśli – może to być autentycznie COKOLWIEK z wifi lub dziurą na kabel sieciowy. Aktualnie w tym miejscu stoi 4 czy 5-letni &lt;a href="http://www.asus.com/product.aspx?P_ID=OeFv0wFd85PMAbyz" target="_blank"&gt;Asus A6U&lt;/a&gt;, który nie powala możliwościami, ale dla MaxiVista to i tak za dużo! Z ciekawości przetestowałem ten program na stareńkiej Toshibie (10 lat?) z zainstalowanym Win98 (bo niczego nowszego nie &amp;quot;udźwignie&amp;quot;) i... działa jak marzenie! Nieważne, że w środku komputera siedzi sprzęt warty 15zł. Ważne, że ma ekran i da się to coś podłączyć do sieci.&lt;/p&gt;  &lt;p&gt;Może brzmię jak Klaudiusz z BigBradera reklamujący samoprasujące się gacie w TVSzopie, ale to jest naprawdę coś wartego uwagi. &lt;em&gt;Minimalnym&lt;/em&gt; kosztem (najtańszy sprzęt + kilkadziesiąt $ za MaxiVista) możemy rozszerzyć środowisko pracy do tak wielkiej przestrzeni, że aż do przesady – bo program umożliwia podłączenie więcej niż jednego dodatkowego komputera! Ale chyba jeszcze nie dojrzałem do sprawdzenia jak to jest z 4 ekranami :) (ale spokojnie, mam czas... &lt;a href="http://en.wikipedia.org/wiki/Jenna_Jameson" target="_blank"&gt;Jenna Jameson&lt;/a&gt; pewnie też nie od pierwszego dnia kariery wskoczyła w sam środek orgii).&lt;/p&gt;  &lt;p&gt;Oprócz opisanego rozszerzenia pulpitu na inne komputery program zawiera dodatkowo &lt;a href="http://www.maxivista.com/docs4/09/shop.php" target="_blank"&gt;o wiele więcej feature’ów&lt;/a&gt;. Nie bawiłem się jednak nimi, póki co jestem w trakcie &amp;quot;nacieszania się&amp;quot; tym jednym. A jeżeli w twoim domu wala się gdzieś jakiś zapomniany laptop, który w dzisiejszych czasach nie nadaje się już do niczego... &lt;a href="http://www.maxivista.com/download.htm" target="_blank"&gt;ściągnij demko&lt;/a&gt; i przekonaj się sam, że nawet najstarszy trup może się jeszcze do czegoś przydać!&lt;/p&gt;  &lt;p&gt;Niechaj NIESKOŃCZONA ROZDZIELCZOŚĆ ma was w swojej opiece, idźcie w pokoju.&lt;/p&gt;  &lt;p&gt;P.S. Polecam dorzucić do tego darmowe narzędzie &lt;a href="http://www.winsplit-revolution.com/" target="_blank"&gt;Winsplit Revolution&lt;/a&gt; – jest na tyle fajne, że może kiedyś doczeka się własnego posta?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/JUl16YdpROM" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/11/02/Moje-srodowisko-pracy-z-MaxiVista.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/11/02/Moje-srodowisko-pracy-z-MaxiVista.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=2d96562d-afc9-408a-99e9-79f0e35411cb</guid>
      <pubDate>Mon, 02 Nov 2009 06:29:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=2d96562d-afc9-408a-99e9-79f0e35411cb</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=2d96562d-afc9-408a-99e9-79f0e35411cb</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/11/02/Moje-srodowisko-pracy-z-MaxiVista.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=2d96562d-afc9-408a-99e9-79f0e35411cb</wfw:commentRss>
    </item>
    <item>
      <title>PrincipalMock</title>
      <description>&lt;p&gt;Podczas pisania testów jednostkowych możemy natknąć się na problem uprawnień – co jeśli testowana metoda wymaga, aby użytkownik był zalogowany, miał określoną nazwę bądź był przypisany do konkretnej roli? Nie chcemy przecież, aby testy jednostkowe w jakiś sposób logowały się do naszej aplikacji. Rozwiązaniem jest pomocnicza klasa, którą napisałem z wykorzystaniem frameworka &lt;a href="http://code.google.com/p/moq/" target="_blank"&gt;Moq&lt;/a&gt;:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div class="csharp"&gt;   &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;static&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; PrincipalMock
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;static&lt;/span&gt; IPrincipal Create(&lt;span class="csKeyword"&gt;string&lt;/span&gt; name, &lt;span class="csKeyword"&gt;params&lt;/span&gt; &lt;span class="csKeyword"&gt;string&lt;/span&gt;[] roles)
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;var&lt;/span&gt; identity = &lt;span class="csKeyword"&gt;new&lt;/span&gt; Mock&amp;lt;IIdentity&amp;gt;();
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  		identity.Setup(x =&amp;gt; x.Name).Returns(name);
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  		identity.Setup(x =&amp;gt; x.IsAuthenticated).Returns(!&lt;span class="csKeyword"&gt;string&lt;/span&gt;.IsNullOrEmpty(name));
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;var&lt;/span&gt; principal = &lt;span class="csKeyword"&gt;new&lt;/span&gt; Mock&amp;lt;IPrincipal&amp;gt;();
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  		principal.Setup(x =&amp;gt; x.Identity).Returns(identity.Object);
&lt;span class="csLineNumber"&gt; 11:&lt;/span&gt;  		roles.ToList().ForEach(role =&amp;gt; principal.Setup(x =&amp;gt; x.IsInRole(role)).Returns(&lt;span class="csKeyword"&gt;true&lt;/span&gt;));
&lt;span class="csLineNumber"&gt; 12:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt; 13:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;return&lt;/span&gt; principal.Object;
&lt;span class="csLineNumber"&gt; 14:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt; 15:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Jej wykorzystanie, na przykład w metodzie z atrybutem SetUp (w przypadku nUnit) wykonywanej przed każdym testem:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Thread.CurrentPrincipal = PrincipalMock.Create(&lt;span class="csString"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;, &lt;span class="csString"&gt;&amp;quot;role1&amp;quot;&lt;/span&gt;, &lt;span class="csString"&gt;&amp;quot;role2&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/aTh5ESf3aeM" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/10/30/PrincipalMock.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/10/30/PrincipalMock.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=7926957c-a972-4f1b-9949-481b38222759</guid>
      <pubDate>Fri, 30 Oct 2009 09:01:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=7926957c-a972-4f1b-9949-481b38222759</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=7926957c-a972-4f1b-9949-481b38222759</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/10/30/PrincipalMock.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=7926957c-a972-4f1b-9949-481b38222759</wfw:commentRss>
    </item>
    <item>
      <title>Zawód - programista. RAK kreatywności i satysfakcji.</title>
      <description>&lt;p&gt;Wielokrotnie zdarzało mi się, że budziłem się rano i na samą myśl o kolejnym dniu w pracy robiło mi się niedobrze. Czy też tak czasami macie? Pomimo całej świetności naszego zawodu, ogromnej gamy wyzwań i oczekujących na rozwiązanie pasjonujących problemów, bycie programistą może czasami dać się nieźle we znaki.&lt;/p&gt;  &lt;p&gt;Post ten jest kierowany nie tyle do samych developerów, co do ludzi o &amp;quot;jeden stopień wyżej&amp;quot;. Menadżerów? Team leaderów? Architektów? Zwał jak zwał. Poniżej zebrałem kilka rzeczy, którymi możecie naprawdę uprzykrzyć życie swoim &amp;quot;podwładnym&amp;quot; i z potencjalnie bardzo wartościowych członków zespołu uczynić bezmyślne małpy czekające na godzinę 16.00, aby zmyć się jak najprędzej do domu.&lt;/p&gt;  &lt;h2&gt;Bierz kasę, o nic nie pytaj, nic nie rób, czekaj na zadanie.&lt;/h2&gt;  &lt;p&gt;Zdarzyło mi się kiedyś pracować w firmie, w której nie musiałem robić NIC. Autentycznie! Przychodziłem do pracy i przez 8 godzin czytałem książki, oglądałem filmy, układałem pasjansa. Wszystko to w oczekiwaniu na COKOLWIEK do roboty. Wydawać się może: praca – marzenie? Nic bardziej mylnego! Mogę z czystym sumieniem powiedzieć, że była to najbardziej męcząca praca w moim życiu – a robiłem wiele rzeczy, w tym np. malowanie balkonów w USA jako zwykły &amp;quot;robol ze wschodu&amp;quot;. Nie dość, że najbardziej męcząca, to jeszcze najbardziej irytująca. Chodziłem cały czas wściekły: czy po to studiowałem? czy po to uczyłem się na własną rękę? czy po to zdobywałem certyfikat, zarywałem noce, rezygnowałem z uciech studenckiego życia?&lt;/p&gt;  &lt;p&gt;Oczywiście jakąś część tego czasu wykorzystałem niezwykle produktywnie: ile blogów się wtedy naczytałem, ile teorii wchłonąłem, ile rozwiązań mogłem &amp;quot;testowo&amp;quot; zaimplementować! Ale... co z tego? Z czasem przyszło zwykłe otępienie. Jaki jest tego cel? Kiedy mi się to przyda? Odpowiedź wydawała się banalnie prosta: NIGDY! Wysłany czasami bez sensu na spotkanie, o którego temacie nie miałem zielonego pojęcia, czy przydzielony do głupiego zadania które mógłby wykonać licealista z klasy humanistycznej, jedyne co mogłem zrobić to zżymać się w duchu i raz po raz narzekać: &amp;quot;CO JA TU ROBIĘ??&amp;quot;. Szedłem do pracy, inkasowałem pensję, układałem pasjansa, czekałem na koniec dnia, szedłem do pracy, układałem pasjansa...&lt;/p&gt;  &lt;p&gt;Aż mi teraz wstyd, że tyle czasu zmarnowałem na tego durnego pasjansa. Ale na swoje usprawiedliwienie powiedzieć mogę, że mniej zmotywowany do CZEGOKOLWIEK nie byłem ani nigdy wcześniej, ani nigdy później. Skończyło się oczywiście na rzuceniu papierami i auto-zwolnieniu, ale tych zmarnotrawionych godzin już nikt mi nie zwróci.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Kierowniku&lt;/strong&gt;: przed zatrudnieniem programisty zastanów się, czy naprawdę go potrzebujesz.&lt;/p&gt;  &lt;h2&gt;Tutaj masz opis tego CO trzeba zrobić. A tutaj: dokładny opis JAK to zrobić. Mózg: OFF i do roboty!&lt;/h2&gt;  &lt;p&gt;Czy zdarzało wam się dostać do wykonania jakieś zadanie wraz z dokładnymi instrukcjami dotyczącymi implementacji? Nie chodzi mi o wskazówki typu &amp;quot;nie zajmowałeś się tym wcześniej, więc zajrzyj na taką i taką stronę, przeczytaj ten i ten artykuł&amp;quot;, a o polecenie &amp;quot;zrób to dokładnie TAK!&amp;quot;. W przypadkach ekstremalnych: &amp;quot;masz tu kod, który kiedyś napisałem i dopasuj go do aktualnego projektu&amp;quot;. Za każdym razem, gdy miałem do czynienia z czymś podobnym, wyła we mnie z upokorzenia &lt;em&gt;istota rozumna&lt;/em&gt;. Czy JA&amp;#160; nie potrafię tego zrobić? Czy TY uważasz, że programista to namiastka xero, który zmieni nazwy zmiennych tak aby wszystko się kompilowało i tyle? Potencjalnie interesujące wyzwania mogą zostać w ten sposób całkowicie zmarnowane. Bezrozumne postępowanie zgodnie z wytycznymi krok po kroku nie może skończyć się dobrze. Normalne chyba jest, że programista w takiej sytuacji &amp;quot;weźmie co dane&amp;quot;, wrzuci do projektu i basta. Zapędzony do roli pani piszącej na maszynie nie będzie wnikał czy każdy krok jest właściwy. &amp;quot;Consider it done!&amp;quot; i już. Nie chodzi o dokładną specyfikację, bo ta jest oczywiście jak najbardziej mile widziana – a o niskopoziomowe wytyczne dotyczące samego procesu tworzenia kodu.&lt;/p&gt;  &lt;p&gt;A jeśli się okaże, że coś nie działa jak trzeba, że gdzieś kryje się błąd... czyja będzie wina i kto spędzi pół dnia w debuggerze...?&lt;/p&gt;  &lt;p&gt;Oczywiście, czas może naglić. Nie można wynajdować koła od nowa po raz n-ty. Trzeba dzielić się wiedzą i doświadczeniem. Ale: z umiarem! Każdy ma prawo do chwili satysfakcji i zrobienia czegoś fajnego.&lt;/p&gt;  &lt;p&gt;Wiem, że kiedyś sam popełniałem ten błąd i sam w taki sposób przydzielałem zadania. &amp;quot;Za wszystkie serdecznie żałuję&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Kierowniku&lt;/strong&gt;: nie traktuj programisty jak debila - daj mu się wykazać. Nie tylko ty masz prawo do czerpania przyjemności z kodowania.&lt;/p&gt;  &lt;h2&gt;Czy ktoś ma inną propozycję? OK. A teraz robimy po mojemu.&lt;/h2&gt;  &lt;p&gt;Czy możecie wymyślić coś bardziej uwłaczającego niż zostanie poproszonym o wyrażenie swojego zdania, które następnie jest całkowicie olane? Pewnie tak. Ale uczucie towarzyszące przytoczonemu zjawisku również jest nie do pozazdroszczenia. Z zapałem zabierasz się do wymyślenia ciekawego rozwiązania, potencjalnie LEPSZEGO niż to zaproponowane przez &amp;quot;górę&amp;quot;. Dumny z siebie prezentujesz efekt pracy (często wykonanej po godzinach, bo w firmie trzeba przecież KODOWAĆ) i czekasz na odrobinę uznania. Jeśli nie uznania, to dyskusji. Jeśli nie dyskusji, to wytknięcia błędów. Jeśli nie wytknięcia błędów, to choćby zauważenia włożonego wysiłku. A jedyne co słyszysz to: &amp;quot;ok, a teraz robimy po mojemu&amp;quot;.&lt;/p&gt;  &lt;p&gt;Krew człowieka zalewa.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Kierowniku&lt;/strong&gt;: bądź otwarty na alternatywy; twoi podwładni mogą mieć dobre pomysły, czasami nawet lepsze od twoich. A jeśli są gorsze to wytłumacz dokładnie dlaczego, dzięki temu ich praca nie pójdzie na marne.&lt;/p&gt;  &lt;h2&gt;Płacimy ci za kodowanie. Więc KODUJ!&lt;/h2&gt;  &lt;p&gt;Przychodzisz do biura, odpalasz ulubionego bloga - może pojawiło się coś nowego? Może na jednym z obserwowanych portali umieszczono artykuł, który przedstawi techniki pozwalające na wydajniejszą, lepszą pracę?&lt;/p&gt;  &lt;p&gt;A tu nagle, niczym siarkowy podmuch z piekielnych otchłani, mroczny szept z tyłu: &amp;quot;czy nie masz przypadkiem kodu do napisania?&amp;quot;. O nie, znowu mnie przyłapali!&lt;/p&gt;  &lt;p&gt;I cały misterny plan w p... Nieważne co robisz – ważne, abyś miał Visual Studio na monitorze.&lt;/p&gt;  &lt;p&gt;Czy to jest naprawdę wyznacznik wydajności i efektywności: stosunek czasu w którym VS ma focus do czasu spędzonego w pracy? Czy programista robi tylko to: programuje? Nie mówię o całodziennym śmiganiu po internecie i olewaniu zadań, bo oczywistym jest, że nie po to zatrudnia się developera. Ale czy kilka minut dziennie poświęconych na edukację, zorientowanie się w trendach i newsach, poszerzenie horyzontów jest takim marnowaniem czasu, że trzeba je tępić? Ja na ten przykład byłbym wniebowzięty, gdyby mój zespół był zainteresowany czymś więcej niż tylko zalepieniem zgłoszonych bugów czy dodaniem do rozwijanego projektu nowych funkcjonalności. Gdyby ludzie z własnej woli chcieli rozwijać swoje umiejętności, z dnia na dzień uczyć się czegoś nowego, stawać się coraz lepszymi w swoim fachu.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Kierowniku&lt;/strong&gt;: promuj otwarcie, zaangażowanie i aktywność. Zwalczaj bierność i marazm.&lt;/p&gt;  &lt;h2&gt;Nowe podejście do problemu? A kim ty jesteś, aby podważać aktualną strategię?&lt;/h2&gt;  &lt;p&gt;Czujesz, że praca nad projektem nie jest tak efektywna jak mogłaby być. Proponujesz: &amp;quot;może zastanowimy się nad zastąpieniem ręcznego klepania procedur jakimś ORMem?&amp;quot;. Albo: &amp;quot;nasz system przydzielania zadań bardzo spowalnia pracę, może warto zastanowić się nad alternatywą?&amp;quot;. Albo: &amp;quot;mam doświadczenie z innymi systemami kontroli wersji niż SourceSafe, może chcesz żebym pokazał ci o ile lepszy jest Subversion czy Git?&amp;quot;. Albo: &amp;quot;niektóre miejsca tego projektu naprawdę warto pokryć testami jednostkowymi&amp;quot;.&lt;/p&gt;  &lt;p&gt;A słyszysz wymowne i bezpardonowe: &amp;quot;to nie twoja działka&amp;quot;.&lt;/p&gt;  &lt;p&gt;Czy po kilku takich próbach nadal masz chęć udzielania się w jakikolwiek sposób, szukania lepszych rozwiązań, usprawniania pracy nad projektem? Wątpię.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Kierowniku&lt;/strong&gt;: nie ukręcaj łba wszystkim propozycjom, które wychodzą &amp;quot;z dołu&amp;quot;. Korzystaj z doświadczenia swojego zespołu.&lt;/p&gt;  &lt;hr class="half" /&gt;  &lt;p&gt;Pewnie dałoby się takich scenariuszy opisać o wiele więcej. Pewnie mieliście do czynienia i z wymienionymi, i z innymi (jakimi? czekam na feedback). Pewnie każdy z nas w ten czy inny sposób został kiedyś stłamszony, &amp;quot;doprowadzony do porządku&amp;quot;, każdemu z nas zostało pokazane jego miejsce... zgarbiony ludek nad klawiaturą.&lt;/p&gt;  &lt;p&gt;Przedstawione sytuacje pochodzą z różnych źródeł: część z nich z własnego doświadczenia, część z opowieści. Jedną cechę mają wspólną: wszystkie są (o zgrozo!) autentyczne. Nie wiem jak idealnie powinno się prowadzić zespół programistów (póki co – nie muszę tego wiedzieć), ale... wiem, jak zdecydowanie NIE POWINNO się tego robić.&lt;/p&gt;  &lt;p&gt;Rada na koniec: choćby spotkało cię to wszystko, nawet wszystko naraz jednego dnia: nie poddawaj się! Sam wielokrotnie zadawałem sobie pytanie: czy na tym właśnie polega zawód programisty? Czy &lt;a href="http://www.maciejaniserowicz.com/post/2008/11/06/Zawod-programista-Nadzieje.aspx" target="_blank"&gt;nadzieje z nim związane&lt;/a&gt; pozostaną na zawsze tylko naiwnymi wyobrażeniami niemającymi nic wspólnego z rzeczywistością? A jednak... z czasem wszystko się układa – tyle że nie samo z siebie. Więc &amp;quot;szukajcie aż znajdziecie&amp;quot; i nie bójcie się zmian. Na marnowanie czasu w niewłaściwym miejscu po prostu szkoda życia programisty.&lt;/p&gt;  &lt;hr class="half" /&gt;   &lt;p&gt;P.S. Ostatnio dostałem od ziomka ciekawy link: &lt;a href="http://c2.com/cgi/wiki?GruntProgrammer" target="_blank"&gt;Grunt Programmer&lt;/a&gt;. Definicja:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;victim of being treated as a Grunt Programmer is only allowed to write code; they're not allowed to think about design or user requirements -- that's someone else's job&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Jeśli jesteś zaszufladkowany jako Grunt Programmer: zbierz się w sobie i zmień to. Za zakrętem naprawdę czeka coś o wiele lepszego!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/SaodjKPxk6o" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/10/28/Zawod-programista-RAK-kreatywnosci-i-satysfakcji.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/10/28/Zawod-programista-RAK-kreatywnosci-i-satysfakcji.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=e77f81a2-fc45-4e15-8cd5-e72bdc8ddf13</guid>
      <pubDate>Wed, 28 Oct 2009 08:23:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=e77f81a2-fc45-4e15-8cd5-e72bdc8ddf13</pingback:target>
      <slash:comments>13</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=e77f81a2-fc45-4e15-8cd5-e72bdc8ddf13</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/10/28/Zawod-programista-RAK-kreatywnosci-i-satysfakcji.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=e77f81a2-fc45-4e15-8cd5-e72bdc8ddf13</wfw:commentRss>
    </item>
    <item>
      <title>Jak nie pisać testów jednostkowych</title>
      <description>&lt;p&gt;Testy jednostkowe pełnią dwie bardzo ważne role:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;poprawiają design aplikacji &lt;/li&gt;    &lt;li&gt;sprawdzają czy kod jest poprawny &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Drugi aspekt można rozumieć dwojako... Spójrzmy na przykładową metodę kalkulatora:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div class="csharp"&gt;   &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;class&lt;/span&gt; Calculator
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;int&lt;/span&gt; Add(&lt;span class="csKeyword"&gt;int&lt;/span&gt; first, &lt;span class="csKeyword"&gt;int&lt;/span&gt; second)
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	{
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  		&lt;span class="csKeyword"&gt;return&lt;/span&gt; first + second;
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	}
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	&lt;span class="csComment"&gt;// more operations...&lt;/span&gt;
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Jej przetestowanie nie powinno sprawiać nikomu problemu. Ale... czy na pewno?&lt;/p&gt;

&lt;p&gt;Jestem przekonany, że jeszcze jakiś czas temu sam napisałbym test w taki sposób:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  [Test]
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;void&lt;/span&gt; Add_ReturnsSum()
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;int&lt;/span&gt; firstArgument = 2;
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;int&lt;/span&gt; secondArgument = 3;
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;int&lt;/span&gt; result = &lt;span class="csKeyword"&gt;new&lt;/span&gt; Calculator().Add(firstArgument, secondArgument);
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  	Assert.AreEqual(2 + 3, result);
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Co nam testuje taki test? Ano to, czy kod w teście i metodzie testowanej jest taki sam. Bez sensu. Przy prostym dodawaniu wygląda to oczywiście banalnie i niewinnie, ale co w przypadku skomplikowanych algorytmów? Idąc tą drogą możemy bardzo łatwo wpaść w pułapkę &lt;em&gt;kopiuj/wklej&lt;/em&gt; polegającą na bezmyślnym &lt;strong&gt;kodowaniu dwukrotnie tego samego&lt;/strong&gt; – przyznam się, że ja kiedyś wpadłem. Czy test, który właśnie napisaliśmy, sprawdza poprawność wyniku zwracanego przez metodę Add()? Nie, on sprawdza czy wykonywane są te same operacje. Test ten powinien wyglądać tak:&lt;/p&gt;
&lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;

&lt;div class="csharp"&gt;
  &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  [Test]
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  &lt;span class="csKeyword"&gt;public&lt;/span&gt; &lt;span class="csKeyword"&gt;void&lt;/span&gt; Add_ReturnsSum()
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;int&lt;/span&gt; firstArgument = 2;
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;int&lt;/span&gt; secondArgument = 3;
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;int&lt;/span&gt; expectedResult = 5;
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	&lt;span class="csKeyword"&gt;int&lt;/span&gt; result = &lt;span class="csKeyword"&gt;new&lt;/span&gt; Calculator().Add(firstArgument, secondArgument);
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt; 10:&lt;/span&gt;  	Assert.AreEqual(expectedResult, result);
&lt;span class="csLineNumber"&gt; 11:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Czyli: dla danych argumentów metoda powinna zwrócić taki a nie inny wynik, obliczony przez nas niezależnie od samego programu. SPOSÓB obliczania tego wyniku nie powinien być przedmiotem badanym przez ten test jednostkowy.&lt;/p&gt;

&lt;p&gt;Ciekawostka: na tej zasadzie działa &lt;a href="http://msdn.microsoft.com/en-us/devlabs/cc950525.aspx" target="_blank"&gt;PEX&lt;/a&gt;: generuje argumenty metody i zwracane przez nią wyniki, gdy jest wywołana z tymi argumentami.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/t-lCb9Grfek" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/10/26/Jak-nie-pisac-testow-jednostkowych.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/10/26/Jak-nie-pisac-testow-jednostkowych.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=1b867683-dccf-4983-ab38-cb05a8096448</guid>
      <pubDate>Mon, 26 Oct 2009 07:31:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=1b867683-dccf-4983-ab38-cb05a8096448</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=1b867683-dccf-4983-ab38-cb05a8096448</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/10/26/Jak-nie-pisac-testow-jednostkowych.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=1b867683-dccf-4983-ab38-cb05a8096448</wfw:commentRss>
    </item>
    <item>
      <title>NHibernate – jak zacząć?</title>
      <description>&lt;p&gt;Ostatnio miałem kolejne podejście do NHibernate. Tym razem zdecydowanie udane. W ciągu minionych kilku tygodni trzykrotnie prowadziłem też w &amp;quot;swoim środowisku&amp;quot; rozmowę na temat taki jak w poście – jak zacząć przygodę z NHibernate? Postanowiłem więc, że warto efekt takiej rozmowy opublikować szerszemu gronu.&lt;/p&gt;  &lt;h2&gt;1. Spróbuj&lt;/h2&gt;  &lt;p&gt;Stwierdzenie pierwsze: jeżeli kiedyś odbiłeś się od NH, jeżeli odrzucało cię XML-hell, jeżeli nienaturalny wydawał ci się sposób budowania zapytań, jeżeli nie łapałeś &amp;quot;o co chodzi&amp;quot; i dlaczego warto poświęcić trochę czasu na naukę NH – wiele z tego zmieniło się podczas ostatnich miesięcy. Zapomnij o niemiłych wspomnieniach i zacznij od zera, daj sobie i NH drugą szansę – będziesz naprawdę pozytywnie zaskoczony. Provider LINQ i mapowanie w C# to projekty, dzięki którym wg mnie NH dostało wielkiego pozytywnego kopa w kategorii &amp;quot;developer-friendly&amp;quot;.&lt;/p&gt;  &lt;h2&gt;2. Co wrzucić do referencji?&lt;/h2&gt;  &lt;p&gt;Na samym początku pojawia się dylemat: no dobra, ale co tak naprawdę muszę ściągnąć, co dodać do referencji żeby zacząć zabawę? Odpowiedzi poniżej:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;NHibernate w wersji 2.1: &lt;a href="http://sourceforge.net/projects/nhibernate/files/NHibernate/2.1.0.GA/NHibernate-2.1.0.GA-bin.zip/download" target="_blank"&gt;NHibernate-2.1.0.GA-bin.zip&lt;/a&gt;; plik zawiera instrukcje txt odnośnie tego co trzeba dołączyć do projektu, ale dla leniwych: do referencji trzeba dodać &lt;em&gt;NHibernate.dll&lt;/em&gt; oraz jedną z bibliotek umożliwiających &amp;quot;lazy loading&amp;quot;, twórcy NH założyli w domyślnej konfiguracji że użytkownik doda &lt;em&gt;NHibernate.ByteCode.Castle.dll&lt;/em&gt; i nie widzę powodu aby robić inaczej &lt;/li&gt;    &lt;li&gt;provider Linq 2 NHibernate w wersji 1.0: &lt;a href="http://sourceforge.net/projects/nhibernate/files/NHibernate/2.1.0.GA/NHibernate.Linq-1.0.0.GA-bin.zip/download" target="_blank"&gt;NHibernate.Linq-1.0.0.GA-bin.zip&lt;/a&gt;; tu z referencjami nie powinno być problemu gdyż całość to jedna dll :) &lt;/li&gt;    &lt;li&gt;projekt Fluent NHibernate pozwalający na mapowanie w C#, mega-wypas: &lt;a href="http://fluentnhibernate.org/downloads/releases/fluentnhibernate-1.0RTM.zip" target="_blank"&gt;Fluent NHibernate 1.0RTM&lt;/a&gt;; referencja do &lt;em&gt;FluentNHibernate.dll&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;3. Skąd czerpać wiedzę?&lt;/h2&gt;  &lt;p&gt;Często spotykam skargi, że o NHibernate jest materiałów jak na lekarstwo... Szczerze mówiąc to tego lekarstwa można by wyprodukować całkiem sporo. Kilka linków:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;po pierwsze: oficjalna strona NHibernate to &lt;a title="http://nhforge.org/" href="http://nhforge.org/"&gt;http://nhforge.org/&lt;/a&gt;, a nie pierwszy wynik z Google czyli &lt;a title="https://www.hibernate.org/343.html" href="https://www.hibernate.org/343.html"&gt;https://www.hibernate.org/343.html&lt;/a&gt;; to faktycznie KIEDYŚ było oficjalne gniazdo NH, ale już nie jest &lt;/li&gt;    &lt;li&gt;dokumentacja na oficjalnej stronie: &lt;a title="http://nhforge.org/doc/nh/en/index.html" href="http://nhforge.org/doc/nh/en/index.html"&gt;http://nhforge.org/doc/nh/en/index.html&lt;/a&gt;, jest to właściwie cała książka i po prostu KOPALNIA wiedzy o NH; lektura obowiązkowa dla każdego nowicjusza, najlepiej od deski do deski; nie ma tam co prawda wzmianki o fluent-nh czy linq nh, bo projekty te powstały po napisaniu doca, ale i tak zawarte tam informacje po prostu TRZEBA znać &lt;/li&gt;    &lt;li&gt;blog &lt;a href="http://ayende.com/Blog" target="_blank"&gt;Ayende Rahien&lt;/a&gt;, jednego z głównych rozwijaczy NH (cały blog jest godny polecenia, ale w aktualnie omawianym kontekście: szczególnie &lt;a href="http://ayende.com/Blog/category/510.aspx" target="_blank"&gt;wpisy traktujące o NHibernate&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;cykl wpisów zatytułowanych &lt;a href="http://blogs.hibernatingrhinos.com/nhibernate/Default.aspx" target="_blank"&gt;The NHibernate FAQ&lt;/a&gt; – można to określić jako &amp;quot;demonstracja NH w praktyce z TDD&amp;quot; &lt;/li&gt;    &lt;li&gt;oficjalna strona projektu &lt;a href="http://fluentnhibernate.org/" target="_blank"&gt;Fluent NHibernate&lt;/a&gt; – tworzenie pierwszych najprostszych mapowań krok po kroku; zakres materiału dość niewielki, ale na początek bardzo przydatny &lt;/li&gt;    &lt;li&gt;może to zabrzmi banalnie, ale... wujek &lt;a href="http://www.google.com/" target="_blank"&gt;Google&lt;/a&gt; posiada odpowiedzi na naprawdę masę pytań, chociaż często trzeba poszukać dokładnej niż jesteśmy do tego przyzwyczajeni; aha, polecam na koniec pytania doklejać instrukcję &amp;quot;-hibernate&amp;quot; co odfiltruje dyskusje dotyczące dżawowego pierwowzoru NH &lt;/li&gt; &lt;/ul&gt;
&lt;p&gt;&lt;b&gt;UPDATE (26.10.2009):&lt;/b&gt; na blogu Ayende &lt;a href="http://ayende.com/Blog/archive/2009/10/24/nhibernate-webcasts-series.aspx"&gt;pojawiła się informacja&lt;/a&gt;, że wraz z Robem Conery rozpoczął publikowanie webcastów o NHibernate. Nic tylko oglądać! &lt;a href="http://tekpub.com/preview/nhibernate"&gt;LINK&lt;/a&gt;&lt;/p&gt;
  &lt;h2&gt;4. Po co?&lt;/h2&gt;  &lt;p&gt;To pytanie jest niczym zlepek słów: &amp;quot;Co robisz, Szczepanie?&amp;quot;; zawiera pytanie i odpowiedź jednocześnie. Zostawiam was z tym rebusem:).&lt;/p&gt;  &lt;hr class="half" /&gt;  &lt;p&gt;Z pewnością nie jest to mój ostatni wpis dotyczący NHibernate i Fluent NHibernate. Kilkukrotnie straciłem dobre kilka godzin próbując zrobić coś, co okazywało się banalne. Innymi razy nad ranem docierało do mnie, że podchodzę do problemu z całkowicie złej strony. W jeszcze innych sytuacjach odpowiedzi w Google naprawdę nie było i jedynie zerknięcie w źródła Fluent NH i ich testy jednostkowe okazywało się ostatnią deską ratunku. Tak więc do następnego razu, a póki co – gorąco radzę zaprzyjaźnić się z NHibernate, choćby hobbystyczne, dla własnej satysfakcji.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/NQwi6kwwwXo" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/10/23/NHibernate-jak-zaczac.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/10/23/NHibernate-jak-zaczac.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=abbbaef6-c237-4a50-aa85-d2c7b60788fd</guid>
      <pubDate>Fri, 23 Oct 2009 06:29:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=abbbaef6-c237-4a50-aa85-d2c7b60788fd</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=abbbaef6-c237-4a50-aa85-d2c7b60788fd</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/10/23/NHibernate-jak-zaczac.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=abbbaef6-c237-4a50-aa85-d2c7b60788fd</wfw:commentRss>
    </item>
    <item>
      <title>Jestem DEMONEM! by procentd</title>
      <description>&lt;p&gt;Ależ chwytny tytuł! I groźny. Ale zobaczmy:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;demon&lt;/em&gt; (za &lt;a href="http://pl.wikipedia.org/wiki/Daemon" target="_blank"&gt;Wikipedią&lt;/a&gt;) - proces, który pracuje w tle bez konieczności interakcji z użytkownikiem&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Mniej więcej tak można określić moją egzystencję przez kilka ostatnich (i jeden przyszły) tygodni. Siedzę sobie &lt;em&gt;w tle&lt;/em&gt; otoczony przez monitory i jedyną słuszną muzykę, &lt;em&gt;pracuję&lt;/em&gt;, i wszelką &lt;em&gt;interakcję&lt;/em&gt; z kimkolwiek ograniczam do minimum :). Nie będzie ogromną przesadą jeśli zasymyluję to małym kawałkiem kodu:&lt;/p&gt; &lt;!-- Code formatted with Procent.Samples: http://www.maciejaniserowicz.com/samples/CodeFormatter.aspx --&gt;  &lt;div class="csharp"&gt;   &lt;pre&gt;&lt;span class="csLineNumber"&gt;  1:&lt;/span&gt;  Procent me = Procent.Instance;
&lt;span class="csLineNumber"&gt;  2:&lt;/span&gt;  me.LifeMode = LifeMode.CrazyDeveloper;
&lt;span class="csLineNumber"&gt;  3:&lt;/span&gt;  
&lt;span class="csLineNumber"&gt;  4:&lt;/span&gt;  &lt;span class="csKeyword"&gt;while&lt;/span&gt;(&lt;span class="csKeyword"&gt;true&lt;/span&gt;)
&lt;span class="csLineNumber"&gt;  5:&lt;/span&gt;  {
&lt;span class="csLineNumber"&gt;  6:&lt;/span&gt;  	me.Swim();
&lt;span class="csLineNumber"&gt;  7:&lt;/span&gt;  	me.WriteSoftware();
&lt;span class="csLineNumber"&gt;  8:&lt;/span&gt;  	me.Sleep(TimeSpan.FromHours(4.5));
&lt;span class="csLineNumber"&gt;  9:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Ale... tak to jest, gdy pracuje się nad dwoma całkowicie różnymi projektami jednocześnie i żadnego nie traktuje jako &amp;quot;tego drugiego, mniej ważnego&amp;quot;. Szczerze mówiąc decydując się na realizację równolegle dwóch projektów obawiałem się trochę powrotu do takiego trybu życia - mimo że jedynie na czas niedługi i ściśle określony. Byłem jednak ciekaw jak to będzie... Wspomnienia z ostatniego roku studiów, gdy trzeba było pisać magisterkę ORAZ tworzyć ITCore ORAZ jeszcze startować w Imagine Cup, są niezapomniane. Ale czy po ponad dwuletniej przerwie będę w stanie pobawić się w czasy, kiedy szalone programowanie przez 30 godzin non-stop nie było niczym szczególnie nadzwyczajnym? Nie to żebym był &lt;em&gt;stary&lt;/em&gt;, ale... czy będzie się chciało?&lt;/p&gt;

&lt;p&gt;Przyjmując drugi projekt postanowiłem, że sam siebie sprawdzę. Czy to całe moje gadanie o pasji, o poświęceniu, o pracy nad sobą i ciągłym rozwoju ma w ogóle jeszcze jakieś podstawy? I powiedzieć muszę, że jestem niesamowicie zadowolony. Okazało się, że mam jeszcze tą ISKRĘ (nie mylić z ikrą) i – mówiąc wprost – daję radę. Dawno nie czułem pełni radości płynącej z programowania i zaczynałem zapominać jak to jest. A teraz, mimo tego że zmęczenie daje się we znaki i powoli wyglądam końca krótszego projektu, znowu czuję się spełniony. Nie gryzie mnie już okropnie nieprzyjemny sumienia wyrzut &amp;quot;robisz ZA MAŁO!&amp;quot;, jak miało to miejsce bardzo często przez minione kilkanaście miesięcy. Przypomniałem też sobie, z czego się bardzo cieszę, jak wiele można się nauczyć przez kilka tygodni ciężkiej pracy.&lt;/p&gt;

&lt;p&gt;Stąd też między innymi brak ciekawej aktywności na blogu ostatnimi czasy. Ale już wkrótce się to zmieni. Jako zachętę rzucę kilka tematów, które pojawiły się na mojej liście &amp;quot;to blog about&amp;quot;, więc nie usuwajcie mnie jeszcze z RSSów i ulubionych – ja żyję ;). W różnej kolejności i z różną intensywnością będę pisał między innymi o:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;WCF – kilka sztuczek, kilka porad, kilka mechanizmów, które wydają się banalne, a nad którymi można spędzić dobre 2-3 noce zanim zaczną działać tak jak się tego oczekuje &lt;/li&gt;

  &lt;li&gt;NHibernate – w połączeniu z NHLinq, Fluent NHibernate, SQLite &lt;/li&gt;

  &lt;li&gt;testy jednostkowe – znowu trochę o mockach, trochę o NH, oraz o testowaniu &amp;quot;the BDD-way&amp;quot; ze SpecUnit (i dlaczego to jest fajne) &lt;/li&gt;

  &lt;li&gt;kontrola wersji – dlaczego SVN mnie dobija (czasami autentycznie dostaję przez niego szału, co objawia sie wykrzykiwaniem wulgaryzmów i uderzaniem w otaczające mnie przedmioty), dlaczego Git rozwiązuje stwarzane przez niego problemy, ale jednocześnie dlaczego nie przenoszę się na Gita w 100% &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To oczywiście nie wszystko, ale tak czy siak pomysłów na posty więcej niż czasu na ich napisanie. Czyli jak zwykle. Czyli tak jak być powinno.&lt;/p&gt;

&lt;p&gt;Dość weekendowych zwierzeń. Stay tuned.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/voa6RGOIIJ0" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/10/10/Jestem-DEMONEM!-by-procentd.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/10/10/Jestem-DEMONEM!-by-procentd.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=83136419-4ca6-4992-bdad-088a847c32a1</guid>
      <pubDate>Sat, 10 Oct 2009 13:44:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=83136419-4ca6-4992-bdad-088a847c32a1</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=83136419-4ca6-4992-bdad-088a847c32a1</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/10/10/Jestem-DEMONEM!-by-procentd.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=83136419-4ca6-4992-bdad-088a847c32a1</wfw:commentRss>
    </item>
    <item>
      <title>Relacja z MTS 2009</title>
      <description>&lt;p&gt;29 i 30 września 2009 to dni spędzone w Pałacu imienia Józefa Stalina na konferencji &lt;a href="http://www.mts2009.pl/" target="_blank"&gt;Microsoft Technology Summit 2009&lt;/a&gt;. Tak jak &lt;a href="http://www.maciejaniserowicz.com/post/2008/10/10/Relacja-z-MTS-2008.aspx" target="_blank"&gt;rok temu&lt;/a&gt; postaram się przedstawić swoje wrażenia, więc zainteresowanych zapraszam do lektury a innych uczestników do dodawania swoich opinii w komentarzach.&lt;/p&gt;  &lt;hr class="half" /&gt;  &lt;h2&gt;Słowem wstępu...&lt;/h2&gt;  &lt;p&gt;Start rejestracji na konferencję niestety przegapiłem, ponieważ pomykałem wówczas po europejskich autostradach w ramach urlopowania się i harmonogram mogłem ułożyć dopiero po kilku dniach. Wszystkie najlepsze miejsca były więc już &amp;quot;rozebrane&amp;quot;. Na szczęście jednak udało mi się wejść wszędzie tam gdzie chciałem, a nie tam gdzie byłem zapisany, i mogę się podzielić wrażeniami z tych najciekawszych sesji.&lt;/p&gt;  &lt;p&gt;Ale wracając do samej rejestracji: przyznać muszę, że spoglądając na komplet oferowanych prelekcji byłem zawiedziony. Rok temu każdy &amp;quot;sesyjny slot&amp;quot; zawierał jakiś hit, który bardzo chciałem zobaczyć, a tym razem... Niestety tylko pięć lub sześć wystąpień faktycznie przykuło moją uwagę, a pozostałe to raczej wybór z przymusu niż autentyczne zainteresowanie tematem. Nie tego się spodziewałem, więc pierwsze &amp;quot;odczucia konferencyjne&amp;quot; – raczej negatywne.&lt;/p&gt;  &lt;p&gt;Czas jednak i na pochwałę. Po wejściu do Pałacu Kultury przeżyłem mały szok. Nie wiem jak to możliwe, ale w jakiś magiczny sposób uniknięto organizacyjnego koszmaru sprzed roku. Wydawało się, jakby tym razem do PKiN zawitała zaledwie połowa uczestników. Nie potrafię dokładnie opisać czym to się objawiało, ale po prostu nie czuło się ścisku, tłoku i atmosfery spędu bydła. Chwała organizatorom za to, brawo!&lt;/p&gt;  &lt;p&gt;I mała uwaga: nie robiłem notatek (w niektórych salach było ciemno, w innych siedziałem na podłodze), a ze strony konferencji nie można jeszcze ściągnąć prezentacji. Potocznie zatem mówiąc, jadę z pamięci.&lt;/p&gt;  &lt;hr class="half" /&gt;  &lt;h2&gt;0. Sesja generalna&lt;/h2&gt;  &lt;p&gt;Sam początek konferencji standardowo odbył się w Sali Kongresowej. Spodziewałem się drętwego spektaklu przepełnionego marketingowym bełkotem, a po wejściu zastałem na scenie zespół grający na żywo kawałki U2! Super pomysł na stworzenie luźnej atmosfery i rozpoczęcie takiego wydarzenia.&lt;/p&gt;  &lt;p&gt;Po kilku utworach miejsce zespołu zajęli już po kolei &amp;quot;wysłannicy korporacji&amp;quot; przedstawiający nam różne treści. Zaczęło się od kilku zdań na temat kryzysu i sposobu Microsoft na walkę z nim (inwestycje w rozwój i badania przy jednoczesnym cięciu &amp;quot;kosztów operacyjnych&amp;quot;), następnie pokrótce przedstawiono plany firmy na najbliższe jak i dalsze lata. Plany na lata najbliższe chyba wszyscy znaliśmy i to te dalsze perspektywy głównie przykuwały uwagę. Trzeba przyznać, że wizja roku 2019 robiła niezłe wrażenie. Pokazany filmik wyglądał jak kawałek produkcji science-fiction, a zapewniono nas że prezentowane tam rozwiązania autentycznie istnieją w laboratoriach MS. Fajnie, zapowiada się ciekawa dekada:). Zainteresowanych odsyłam &lt;a href="http://www.istartedsomething.com/20090228/microsoft-office-labs-vision-2019-video/" target="_blank"&gt;tutaj&lt;/a&gt;, gdzie można wspomniany filmik obejrzeć. Chociaż i już istniejący &amp;quot;futurystyczny&amp;quot; produkt, czyli &lt;a href="http://www.microsoft.com/surface/" target="_blank"&gt;Surface&lt;/a&gt;, prezentuje się niesamowicie imponująco, co mogliśmy zobaczyć na własne oczy.&lt;/p&gt;  &lt;p&gt;Sesja generalna zdecydowanie bardziej ciekawa niż ta sprzed roku i właściwie tylko do jednego elementu można się przyczepić... Pokaz Windows 7 był po prostu żałosny. Ja osobiście wolałbym już jakiś fajny filmik niż&amp;#160; drętwy &amp;quot;biurowy kabaret&amp;quot; z czerstwymi dialogami. I z tego co wiem, nie tylko ja. Ale to w sumie nieważne, bo i tak było lepiej niż wszyscy się spodziewali.&lt;/p&gt;  &lt;p&gt;Mała dygresja: czy Microsoft mówiąc o &lt;a href="http://www.bing.com/" target="_blank"&gt;Bing&lt;/a&gt; naprawdę nie zdaje sobie sprawy, że silnik ten nie dorasta jeszcze guglowi do pięt, czy tylko udają? :)&lt;/p&gt;  &lt;h2&gt;1. &amp;quot;Silverlight – przyszłość aplikacji biznesowych&amp;quot; Jakub Jałbrzykowski&lt;/h2&gt;  &lt;p&gt;Po tym dość pozytywnym zaskoczeniu nadszedł czas na najbardziej oczekiwany przeze mnie element konferencji. JJ wygrał rok temu konkurs Speaker Idol, dzięki czemu tym razem występował jako pełnoprawny prelegent z pełnowymiarową sesją… no i oczywiście byłem bardzo ciekaw jak mu się powiedzie. Dodatkowy czynnik podsycający atmosferę oczekiwania to mój obowiązek rzetelnego zrelacjonowania jego wystąpienia. Istniało pewne prawdopodobieństwo większe od zera, że sesja będzie do bani... A wtedy moja surowa ocena (a zdarzały się takie przy okazji moich relacji różnych sesji różnych prelegentów na różnych konferencjach) mogłaby na długo utkwić w naszej znajomości niczym gorzka drzazga niezgody. Na szczęście jednak aktualny stan rzeczy nie musi ulegać zmianie, gdyż nic takiego miejsca nie miało.&lt;/p&gt;  &lt;p&gt;Ale dość prywaty, która nikogo nie obchodzi. Temat sesji i poziom 400 mogły nastawiać bardzo optymistycznie. Z Silverlight nie miałem póki co zbyt wiele do czynienia, ale z aplikacjami biznesowymi (cokolwiek przez to rozumieć) jak najbardziej. Spodziewałem się skupienia na pierwszej części tytułu, czyli fajerwerków oferowanych przez SL wraz z demonstracją &amp;quot;jak prosto się to robi&amp;quot;. Pozytywnie się jednak zaskoczyłem, gdyż przez większość czasu Kuba skupiał się na aspekcie projektowania aplikacji i stosowania dobrych praktyk podczas tego procesu. Silverlight został przedstawiony mniej jako framework do tworzenia ładnych interfejsów a bardziej jako narzędzie, które umożliwia budowanie rozbudowanych aplikacji internetowych z wykorzystaniem jednej technologii (.NET) po obu stronach kabla, bez babrania się w HTML, JavaScript czy CSS.&amp;#160; W takiej sytuacji nie mogło oczywiście zabraknąć wielu odniesień do &lt;a href="http://www.codeplex.com/CompositeWPF" target="_blank"&gt;Prisma&lt;/a&gt;, omówienia wzorca &lt;a href="http://en.wikipedia.org/wiki/Model_View_ViewModel" target="_blank"&gt;Model-View-ViewModel&lt;/a&gt; i zaprezentowania jakże użytecznej koncepcji &lt;a href="http://compositewpf.codeplex.com/Wiki/View.aspx?title=Event%20Aggregator" target="_blank"&gt;Event Aggregatora&lt;/a&gt;. Mieliśmy również okazję wysłuchać osobistych refleksji prelegenta i jego doświadczeń z takimi pojęciami jak &lt;a href="http://code.msdn.microsoft.com/RiaServices" target="_blank"&gt;RIA Services&lt;/a&gt; czy &lt;a href="http://msdn.microsoft.com/en-us/library/ms731064.aspx" target="_blank"&gt;dwustronną komunikacją klient-serwer-klient&lt;/a&gt;. Jak dorzucimy do tego wszystkiego kilka zabawnych dowcipów, masę demek, autentycznie przydatne przykłady i super pomysł z własnoręcznym stworzeniem całej grafiki do prezentacji (koślawe leworęczne rysunki rulezzz), to mamy sesję jakiej można oczekiwać po tak wielkiej konferencji.&lt;/p&gt;  &lt;p&gt;Jeśli miałbym się do czegoś przyczepić... materiału było trochę za dużo jak na 80 minut. Poziom sesji został co prawda określony na 400, ale dorzucanie do tego wszystkiego JESZCZE &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming" target="_blank"&gt;Aspect Oriented Programming&lt;/a&gt; wraz z &lt;a href="http://www.postsharp.org/" target="_blank"&gt;Post#&lt;/a&gt; to lekkie przegięcie. Zresztą na szersze omówienie tego ostatniego tematu zabrakło czasu.&lt;/p&gt;  &lt;p&gt;Nie zgodziłbym się również z krótką wypowiedzią na temat JavaScript – moim zdaniem skreślanie i unikanie tego języka najczęściej spowodowane jest niezrozumieniem zasad panujących w świecie dynamicznego programowania i przy odpowiedniej edukacji prowadzącej do umiejętnego zastosowania całej jego potęgi JavaScript naprawdę daje się lubić.&lt;/p&gt;  &lt;p&gt;Dodatkowo na slajdzie z wadami Silverlight zabrakło mi bardzo ważnego punktu wskazującego na niedoskonałe działanie SL w niektórych przeglądarkach (vide moja kochana &lt;a href="http://www.opera.com/" target="_blank"&gt;Opera&lt;/a&gt;) oraz brak wsparcia dla systemów operacyjnych innych niż Windows. Co prawda wybierając technologię Microsoftu można się domyślać takich wad, ale ich jasne wskazanie moim zdaniem by się przydało. Tym bardziej, że konkurencyjne Flash i Adobe Air nie mają podobnych problemów.&lt;/p&gt;  &lt;p&gt;Na koniec ciekawostka – była to podobno najbardziej oblegana sesja na całej konferencji. Nice...&lt;/p&gt;  &lt;p&gt;Na koniec po końcu: Kuba prosił mnie o zamieszczenie prezentacji i demonstracji więc oto one: &lt;a href="http://www.maciejaniserowicz.com/JakubJalbrzykowski-MTS2009-Silverlight.zip"&gt;Jakub Jalbrzykowski - Silverlight - Przyszłosc aplikacji biznesowych.zip&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;8&lt;/font&gt;&lt;/strong&gt;/9 (za kawał porządnej roboty i sprawdzenie się w odpowiedzialnej roli prelegenta, który – o czym jestem przekonany – będzie od teraz jedną z głównych twarzy polskich konferencji poświęconych technologiom Microsoft)&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;2. &amp;quot;Nadciąga Azure - prawdziwa burza czy tylko lekkie zachmurzenie?&amp;quot; Daniel Celeda&lt;/h2&gt;  &lt;p&gt;Wstyd przyznać, ale słowo &amp;quot;Azure&amp;quot; kojarzyło mi się wcześniej jedynie z rysunkiem chmurki. Na sesję szedłem nie mając właściwie pojęcia co mogę usłyszeć, nie wiedziałem czego się spodziewać, nie zgadywałem nawet o czym tak naprawdę prelegent będzie opowiadał. Już na pierwszym slajdzie okazało sie, że bardzo dobrze trafiłem, gdyż docelowym słuchaczem miał być programista niemający zielonego pojęcia o Windows Azure. &amp;quot;OTO JESTEM&amp;quot;, pomyślałem; &amp;quot;ucz mnie&amp;quot;.&lt;/p&gt;  &lt;p&gt;No i cóż... faktycznie zostałem nauczony. Wiem już co wchodzi w skład Azure (compute do wykonywania operacji, storage do składowania danych), wiem że mogę sobie w tajemniczą chmurę wrzucić bazę danych sql, że mogę tam sobie uruchomić swoje .NETowe usługi. Zobaczyłem (w zbyt nudnych i chyba niepotrzebnych szczegółach) jak widziane są tam dane i jakie operacje mogę na nich wykonać. Co najważniejsze, przedstawiono również argumenty PO CO tak naprawdę warto interesować się takimi rozwiązaniami.&lt;/p&gt;  &lt;p&gt;I... to właściwie tyle. Moje jedyne oczekiwanie zostało zaspokojone: mam już pojęcie co to Azure. Normalna sesja jakich wiele, z momentami ciekawymi i momentami nudnymi. Teoretycznie mogłem dowiedzieć się tego samego ze strony &lt;a href="http://www.microsoft.com/azure/whatisazure.mspx" target="_blank"&gt;What is the Windows Azure Platform?&lt;/a&gt;, ale nie żałuję że tą sesję wybrałem.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;7&lt;/font&gt;&lt;/strong&gt;/9 (tak sporo bo dowiedziałem się tego czego chciałem; nie więcej, bo w sumie bez rewelacji)&lt;/p&gt;  &lt;h2&gt;3. &amp;quot;Visual Studio 2010 - najciekawsze cechy w praktyce&amp;quot; Bartosz Pampuch&lt;/h2&gt;  &lt;p&gt;Wchodzenie do sali, w której prezentować ma Bartek, zawsze wiąże się z pewnym podekscytowaniem. Powód jest bardzo prosty: nigdy nie wiadomo czym tym razem nas zaskoczy. Nie inaczej było i tym razem. I, jak zwykle, zaserwowano nam coś niesamowitego. Na samym początku, zamiast standardowego &amp;quot;dzień dobry, nazywam się X i programuję w .necie&amp;quot; zaserwowano nam wbijający w ziemię, profesjonalny filmik prezentujący agendę prelekcji. To się nazywa prawdziwy efekt WOW.&lt;/p&gt;  &lt;p&gt;Całość prezentacji nie odbiegała poziomem od niesamowitego wstępu. Bardzo szczegółowo zaprezentowano nam jedną z najważniejszych cech nowego Visuala, czyli historyczny debugger. Możliwości, jakie nam daje, przedstawiono na prawdziwych przykładach na które możemy natknąć się podczas normalnej pracy; żadnych tendencyjnych demek dla których nikt nigdy nie znajdzie zastosowania. Szacunek wzbudza praca, jaką Bartek wykonał eksperymentując z tym narzędziem. Samodzielne modyfikowanie wewnętrznych XMLi wykorzystywanych przez VS w celu zdefiniowania własnych zdarzeń raportowanych przez debugger to jest coś, czego nie zobaczy się na pierwszej lepszej sesji. Efekt naprawdę super – otrzymaliśmy narzędzie, które w okienku historii debuggowania wypisuje wszystkie zapytania SQL wysyłane do bazy przez aplikację. Bezcenne.&lt;/p&gt;  &lt;p&gt;Oprócz historycznego debuggera mogliśmy obserwować mocno zaawansowane i niskopoziomowe rozważania o teorii i praktyce programowania współbieżnego. W pasjonujących szczegółach Bartek pokazał czym różni się nowy &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks(VS.100).aspx" target="_blank"&gt;mechanizm zadań&lt;/a&gt; mający zastąpić dotychczasową interakcję z wątkami oraz jakie zalety wiążą się z zastosowaniem tego rozwiązania. Rzucił też nam kilka zadziwiających pułapek czyhających na programistę wkraczającego w krainę wielowątkowości, z których niewiele osób na sali zdawało sobie sprawę.&lt;/p&gt;  &lt;p&gt;Następnie przeszliśmy do możliwości rozszerzania nowego Visuala, który w nowej wersji staje się wreszcie (między innymi dzięki zastosowaniu WPF i MEF) prawdziwie ŁATWO rozszerzalną platformą. Przykład stworzenia własnego panelu wyświetlanego w edytorze za pomocą kilku linijek kodu C# robił wrażenie (więcej o mechanizmie Adornments na &lt;a href="http://blogs.msdn.com/vseditor/archive/2009/06/10/extensions-extensions-everywhere.aspx" target="_blank"&gt;blogu zespołu tworzącego edytor&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Na koniec krótkie demko pod tytułem &amp;quot;jak stworzyć własną stronę startową Visualu&amp;quot; i pasjonująca jazda po Visual Studio 2010 i okolicach dobiegła końca. No, prawie końca, ponieważ prawdziwe zakończenie to kolejny niesamowity filmik podsumowujący to co dopiero zobaczyliśmy.&lt;/p&gt;  &lt;p&gt;Po raz kolejny Bartek udowodnił, że jest prawdziwym artystą jeśli chodzi o przygotowywanie prezentacji. Brawo!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;9&lt;/font&gt;&lt;/strong&gt;/9 (jak zwykle: za prezentację, podczas której każda sekunda była wykorzystana w 100%)&lt;/p&gt;  &lt;h2&gt;4. &amp;quot;Software Development Life Cycle z Team Foundation Server 2010&amp;quot; Tadeusz Golonka i Marcin&amp;#160; Książek&lt;/h2&gt;  &lt;p&gt;Na wstępie zaznaczę, że z TFSem miałem do czynienia przy trzech projektach i mam nadzieję że nigdy więcej mnie to nie spotka. Na sesję poszedłem bardziej dla &lt;a href="http://tgolonka.blogspot.com/" target="_blank"&gt;Tadeusza Golonki&lt;/a&gt; niż samego tematu, chociaż zerknięcie &amp;quot;co nowego się kroi w tym fe-obszarze&amp;quot; także było dość pociągające.&lt;/p&gt;  &lt;p&gt;Wykład utwierdził mnie jedynie w moim &amp;quot;nielubieniu&amp;quot; TFSa. Właściwie ciężko mi napisać co wyniosłem z tej półtoragodzinnej prezentacji: przez cały czas skupiałem się bardziej na przekonaniu się do samego produktu niż zapamiętywaniu co się tam zmienia. No i niestety, nie wyszło. Nie było żadnych porywających momentów, więc trochę się nudziłem. Ożywiłem się w momencie demonstracji współpracy z repozytorium kodu, ponieważ ten aspekt współpracy z TFS był dla mnie najbardziej bolesny. Okropność! Z tego co zrozumiałem istnieje pewien scenariusz, w którym po kliknięciu na komunikat nieudanego buildu jesteśmy przenoszeni do pliku powodującego problemy, a po jego modyfikacji i wciśnięciu ctrl+s zostaje on automatycznie (&lt;em&gt;sic!&lt;/em&gt;) wysyłany do repozytorium! To jest coś, czego zdecydowanie NIE OCZEKUJĘ od systemu kontroli wersji. A jeśli coś źle zrozumiałem to bardzo proszę kogoś o sprostowanie...&lt;/p&gt;  &lt;p&gt;I... to tyle. Na koniec padło pytanie &amp;quot;jaka jest dolna granica liczebności zespołu programistów, dla której warto rozważyć wdrożenie TFS?&amp;quot; Odpowiedź &amp;quot;3&amp;quot; wydaje mi się mocno przesadzona. Pakowanie się w taką kobyłę przy projekcie innym niż jakiś naprawdę wielki system to jak dla mnie nieuzasadnione komplikowanie życia. Tym bardziej, że z TFS jest jak z MS Project: o ile ten drugi jest często wykorzystywany jedynie jako narzędzie do tworzenia diagramu Gantta, o tyle ten pierwszy to w wielu przypadkach tylko repozytorium kodu. Repozytorium kodu, które po poznaniu takich rozwiązań jak chociażby &lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; wydaje się po prostu nieużywalne.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;6&lt;/font&gt;&lt;/strong&gt;/9 (poprawna prezentacja produktu, jednak jak dla mnie – zbyt statyczna, zbyt nudna)&lt;/p&gt;  &lt;h2&gt;5. &amp;quot;Windows 7 dla deweloperów&amp;quot; Bartłomiej Zass&lt;/h2&gt;  &lt;p&gt;Drugi dzień postanowiłem rozpocząć kolejnym rzutem oka na Win7, tym razem z perspektywy programisty. Zeszłoroczny występ Bartka na Sali Kongresowej wspominam bardzo dobrze, więc spodziewałem się udanej powtórki. I szczerze mówiąc zaprezentowany materiał można określić jako imponujący. Sposób przekazywania wiedzy także nie pozostawiał nic do życzenia, wygląda na to że Bartek jest Microsoftową gwiazdą którą wypycha się na największe sale w celu pokazania najbardziej popularnych tematów. Co w tym przypadku było całkowicie uzasadnione.&lt;/p&gt;  &lt;p&gt;Dla mnie, który Win7 właściwie nie zna, wystąpienie wypakowane było po brzegi prawie samymi nowościami. Można było dowiedzieć się jak dokładnie działa przesławne XP Mode i kiedy z tego korzystać, pokazano nam również zakres problemów które ten trick rozwiązuje oraz, co nawet ważniejsze, jakie wady posiada. Zobaczyliśmy nowości w procesie uzyskiwania dla aplikacji loga mówiącego o kompatybilności programu z nowym systemem operacyjnym. Budowa i możliwości nowego paska zadań oraz sposoby na integrację z nim również budziły żywe zainteresowanie – to jest naprawdę fajny i jakże potężny mechanizm! Dodatkiem do sesji była prezentacja kontrolki wstążki dla aplikacji .NET, pozwalającej na stworzenie &amp;quot;office-like&amp;quot; menu we własnych programach. Wspomniano również o zarządzanych wrapperach na natywne biblioteki Windows pozwalające na takie czynności jak chociażby monitorowanie stanu baterii w laptopie. Każdy z tematów poparty był krótkim demkiem, więc na własne oczy mogliśmy przekonać się &amp;quot;co autor miał na myśli&amp;quot;.&lt;/p&gt;  &lt;p&gt;Dzięki tej sesji z pewnością wkrótce zainstaluję Windows 7. Leży sobie na dysku już od sierpnia i chyba nadszedł czas, aby pożegnać sie z wysłużonym XP.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;7&lt;/font&gt;&lt;/strong&gt;/9 (całkowicie poprawne przedstawienie nowości czekających na nas w nowym systemie; rewelacji brak, ale pójść było warto)&lt;/p&gt;  &lt;h2&gt;6. &amp;quot;Usługi w świecie Microsoft: WCF, REST, .NET Service Bus, Workflow Services&amp;quot; Tomasz Kopacz&lt;/h2&gt;  &lt;p&gt;Przed sesją &lt;a href="http://www.tomaszkopacz.com/" target="_blank"&gt;Tomasza Kopacza&lt;/a&gt; zawsze trzeba przygotować się na spory wysiłek intelektualny. Każde kolejne jego wystąpienie udowadnia, że w tej głowie mieści się po prostu cała encyklopedia wiedzy o technologiach Microsoft. I zawsze wiedza ta jest przed publicznością prezentowana w klarowny, profesjonalny sposób.&lt;/p&gt;  &lt;p&gt;Jednak tego dnia z sali wyszedłem z mieszanymi uczuciami. Co prawda wystąpienie było niby takie jak zawsze: szalony galop przez technologie wspomniane w temacie, ale jednak coś mi tu nie grało. Przejechanie się po całym WCF, od podstaw konfiguracji po zaawansowane scenariusze rozszerzania platformy własnymi &lt;a href="http://msdn.microsoft.com/en-us/library/aa717047.aspx" target="_blank"&gt;Message Inspectors&lt;/a&gt;, podczas 80 minut jest po prostu niewykonalne. A jak dorzucimy do tego kilka zdań o Azure, .NET Sevice Bus, przedstawienie koncepcji i implementacji REST to uzyskamy misz-masz, który, z niejasnych powodów, jakoś mi nie podpasował. Wydaje mi się że zdecydowanie lepiej byłoby odrzucić połowę agendy i bardziej skupić się na mniejszej ilości materiału niż lecieć na łeb na szyję. O tempie prezentacji świadczyć może mała anegdotka: gdy podczas jednej z miliarda demonstracji z VS wyskoczył niespodziewany wyjątek, z tyłu usłyszałem &amp;quot;nareszcie chwila przerwy&amp;quot;.&lt;/p&gt;  &lt;p&gt;Nie mogę powiedzieć że coś mi się szczególnie nie podobało czy że prelegent coś robił źle – cały czas słuchałem z zainteresowaniem. Wydaje mi się po prostu, że jeśli ktoś zagłębiał się w WCF to niewiele nowego wyniósł z sesji. A jeśli ktoś się w WCF NIE zagłębiał, to niewiele zrozumiał (teoria poparta konsultacjami ze znajomymi). WCF ma to do siebie, że przedstawienie stu demek jedno po drugim na niewiele się zdaje, tutaj trzeba w każdym scenariuszu zatrzymać się na nieco dłużej. I tego zabrakło.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;6&lt;/font&gt;&lt;/strong&gt;/9 (sam nie wierzę że TKopacz dostaje ode mnie tylko tyle, ale pomimo że prowadzenie sesji było takie jak zawsze, to jej PRZYDATNOŚĆ... już nie)&lt;/p&gt;  &lt;h2&gt;7. &amp;quot;Workflow Foundation 4.0&amp;quot; Marcin Najder&lt;/h2&gt;  &lt;p&gt;Praktyczne wykorzystanie Workflow Foundation ograniczało się w moim przypadku do budowania prostych przepływów w Sharepoint przy okazji ITCore. Słyszałem jednak o wielkich zmianach, jakie MS planuje wprowadzić w nowej wersji, więc z niecierpliwością czekałem na tą prezentację.&lt;/p&gt;  &lt;p&gt;&amp;quot;Wielkie zmiany&amp;quot; przeszły moje oczekiwania, ponieważ dowiedziałem się, że całość zostaje zaorana i napisana od nowa. Wyłuszczono nam powody, dla których podjęta została taka a nie inna decyzja, oraz jej efekt: ogromny wzrost wydajności (10-100x!) spowodowany zmianą sposobu serializacji i wewnętrznej budowy przepływów. Oprócz tego dostarczony framework będzie lepiej zaprojektowany, łatwiejszy do wykorzystania przez programistów. Nie będzie już możliwości pójścia na skróty poprzez wrzucenie na diagram &amp;quot;Code activity&amp;quot;, dwuklik i umieszczanie logiki w zboczonym pliku code-behind – i bardzo dobrze! Teraz po prostu będziemy tworzyli własne klasy umiejscowione odpowiednio w hierarchii WF. Definicja przepływu to teraz po prostu plik xaml, co znacznie uprości poruszanie się po tworzonym rozwiązaniu oraz zarządzanie nim. Designer także ulegnie poprawie, a to za sprawą zastosowania WPF w nowym Visual Studio.&lt;/p&gt;  &lt;p&gt;Dowiedzieliśmy się też o kilku wadach takiego a nie innego kroku: z frameworku całkowicie wycięto &amp;quot;state workflow&amp;quot;, w nowej wersji trzeba go będzie jakoś symulować przy pomocy standardowych sekwencyjnych przepływów. Skupiając się na ponownej implementacji istniejącej już funkcjonalności nie usprawniono mechanizmów znanych z przeszłości. Z pytań dobiegających z sali wyłapałem kilka powtarzających się kwestii, które nie zostaną w WF 4.0 ulepszone. Cofanie kroków przepływów, ubogie mechanizmy security, reakcja uruchomionych przepływów na podmianę definicji – to wszystko zostaje tak jak było z powodu &amp;quot;braku zasobów&amp;quot; po stronie MS.&lt;/p&gt;  &lt;p&gt;Generalnie sesję uważam za udaną, dowiedziałem się wszystkiego czego oczekiwałem. Przede wszystkim: że praca z nowym WF będzie wygodniejsza. Jedyne co mnie raziło to prezentowane demka. Mieliśmy tu niestety do czynienia z banalnymi przykładami &amp;quot;wypisz linię na konsolę&amp;quot;, &amp;quot;odczytaj linię z konsoli&amp;quot; i tak dalej. Bardziej zaawansowane demonstracje mogłyby sprawić, że całość prelekcji byłaby ciekawsza.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;7&lt;/font&gt;&lt;/strong&gt;/9 (właściwie dokładnie to czego się spodziewałem zaserwowane w poprawny sposób: co, jak, dlaczego i co z tego wynika)&lt;/p&gt;  &lt;h2&gt;8. &amp;quot;Czym zaskoczy Cię ASP.NET 4.0 w Visual Studio 2010?&amp;quot; Bartłomiej Zass&lt;/h2&gt;  &lt;p&gt;Na sam koniec wybrałem się ponownie do Sali Kongresowej na kolejny występ Bartka. Sam początek był dość zabawny: na slajdzie (nie wiem czy specjalnie czy nie) temat sesji brzmiał &amp;quot;Czym zaSSkoczy Cię...&amp;quot; co oczywiście kojarzyło się z nazwiskiem prelegenta. Agenda przedstawiała się interesująco: całe ASP.NET rozbito na mniejsze, odrębne części: WebForms, Ajax, MVC, Dynamic Data i każdą z nich omówiono osobno.&lt;/p&gt;  &lt;p&gt;Zmiany wprowadzone w poprzedniej wersji ASP.NET nie zasługiwały moim zdaniem na miano &amp;quot;kolejnej wersji&amp;quot;. Ot, nowe kontrolki. Okazało się że teraz jest niewiele lepiej: czy przejęcie kontroli nad generowanymi przez silnik ASP.NET identyfikatorami czy bardziej szczegółowe zarządzanie ViewState wystarcza do zwiększenia numeru wersji? Jak dla mnie – nie bardzo. Z drugiej strony może ta platforma jest już aż tak dojrzała, że nie ma tam nic innego do roboty? Fajnie prezentuje się nowa kontrolka do generowania wykresów, ale znowu: czy to taka wielka zmiana?&lt;/p&gt;  &lt;p&gt;Po WebForms przyszedł czas na Ajaxa. Prezentowane tu funkcjonalności mogły robić wrażenie. Mamy .NET po stronie serwera, mamy Silverlight po stronie klienta, a teraz... mamy prawie-.NET w JavaScript? Trochę tak to wygląda. Databinding, framework do komunikacji z DataServices, ogromne biblioteki do tworzenia bogatych interfejsów użytkownika wraz z szablonami: to wszystko w JS. Nie powaliło mnie to na ziemię, raczej zmusiło do zastanowienia nad ewolucją programowania www jako takiego. Wykorzystanie JavaScript do budowania zaawansowanych mechanizmów interakcji z użytkownikiem i przekazywania jego intencji na serwer to jedno, ale przeniesienie tak ogromnej części funkcjonalności na stronę klienta w postaci kodu JS, z zostawieniem &amp;quot;głupiego&amp;quot; serwera, to coś nad czym trzeba się chyba głębiej zastanowić. A materiału do analizowania i &amp;quot;zastanawiania&amp;quot; jest naprawdę masa. Poza &lt;a href="http://www.asp.net/ajax/" target="_blank"&gt;MS Ajax&lt;/a&gt; powiedziano co nieco o &lt;a href="http://jquery.com/" target="_blank"&gt;JQuery&lt;/a&gt;, jednak jakość tej części prezentacji pozostawiała wiele do życzenia. Odniosłem wrażenie, że prelegent nie bardzo wie o czym mówi i ogranicza się do cytowania materiałów ściągniętych naprędce z netu.&lt;/p&gt;  &lt;p&gt;Dalej nie było niestety lepiej. Kolejny poruszany element, czyli &lt;a href="http://www.asp.net/mvc/" target="_blank"&gt;ASP.NET MVC&lt;/a&gt;, mnie zmiażdżył. Tutaj nie miałem wątpliwości: prezenter nie ma zielonego pojęcia o czym mówi. Przedstawienie ASP.NET MVC jako rozwiązania nadającego się jedynie do małych projektów do wykorzystania przez &amp;quot;zaawansowanych programistów chcących poświęcić więcej czasu&amp;quot; czy stwierdzenie &amp;quot;teraz jest w wersji preview, niebawem wyjdzie RTM&amp;quot; to tylko niektóre kwiatki. Ta część całkowicie zepsuła mi całą prezentację.&lt;/p&gt;  &lt;p&gt;Na koniec posłuchaliśmy kilku słów o &lt;a href="http://www.asp.net/dynamicdata/" target="_blank"&gt;Dynamic Data&lt;/a&gt; – rozwiązaniu pozwalającym na błyskawiczne wygenerowanie stron do edycji danych na podstawie schematu bazy. Takie rozwiązania nie cieszą się moim wielkim zainteresowaniem, więc trwając w zniesmaczeniu spowodowanym poprzednim elementem cierpliwie czekałem na koniec sesji. Tym większa szkoda, że wszystkie dotychczasowe sesje Bartka wspominałem bardzo pozytywnie.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena: &lt;font color="#ff0000"&gt;5&lt;/font&gt;&lt;/strong&gt;/9 (było całkiem OK, gdyby nie kompletny brak przygotowania do niektórych części prezentacji)&lt;/p&gt;  &lt;hr class="half" /&gt;  &lt;h2&gt;Speaker Idol&lt;/h2&gt;  &lt;p&gt;Konkurs Speaker Idol zagościł chyba na stałe na MTS – i świetnie! Doskonały sposób na rozpoczęcie prelegenckiej kariery. W tym roku poziom był moim zdaniem jeszcze wyższy niż rok temu. Wszyscy finaliści (półfinału nie widziałem) zaprezentowali się bardzo profesjonalnie. Poruszane tematy były ciekawe, a pięciominutowe występy dowodziły, że chyba dla żadnego z uczestników prowadzenie sesji to nie pierwszyzna. Oglądając to widowisko byłem bardzo zadowolony ze swojej decyzji o niestartowaniu; czasami lepiej znać swoje miejsce i nie pchać się tam gdzie nie trzeba ;).&lt;/p&gt;  &lt;p&gt;Przyjemnie słuchało sie też uwag jury, które przekazywało naprawdę trafne i słuszne spostrzeżenia. Zastosowanie się do ich uwag z pewnością może przyczynić się do jeszcze wyższego poziomu wystąpień ich adresatów.&lt;/p&gt;  &lt;p&gt;Gratulacje dla zwycięzcy, &lt;a href="http://tomaszwisniewski.com/mts-2009-wrazenia-i-relacja-speaker-idol/" target="_blank"&gt;Tomasza Wiśniewskiego&lt;/a&gt;! Powodzenia, mam nadzieję że uda mi się odwiedzić twoją sesję w przyszłym roku :).&lt;/p&gt;  &lt;h2&gt;Podsumowanie&lt;/h2&gt;  &lt;p&gt;Widać postęp organizacyjny w stosunku do zeszłorocznej edycji, za co zdecydowanie czapki z głów. Jednak to oferta merytoryczna jest najważniejsza, a moim zdaniem tutaj było trochę gorzej. Jak można zobaczyć wyżej, nie trafiłem na ewidentne wpadki (co niestety miało miejsce rok temu), ale niestety nie mogę też krzyknąć: rewelacja! Właściwie cała konferencja nie wywołała u mnie większych emocji... Ot, było i nie ma.&lt;/p&gt;  &lt;p&gt;Zdecydowanie poprawić można moim zdaniem dwie rzeczy (oprócz agendy, ale to jak wiadomo subiektywne odczucia): po pierwsze półfinaliści Speaker Idol nie powinni być traktowani po macoszemu, jako &amp;quot;gadające głowy do kotleta&amp;quot;. Sam chciałem to obejrzeć, ale po prostu na korytarzu nie bardzo są do tego warunki. A po drugie: to co dzieje się pod salami, ludzkie pojęcie przechodzi. Wiem że jakoś trzeba zapewnić pierwszeństwo wejścia uczestnikom pełnoprawnie zapisanym na daną sesję i dopiero później wpuszczać pozostałych, ale może da się to jakoś lepiej zorganizować? Sodoma i gomora panujące przed wejściem na większość sesji nie powinna mieć miejsca. A napływ nowych słuchaczy 5 minut po rozpoczęciu wykładu najzwyczajniej w świecie przeszkadza... Ale na szczęście nie ja muszę myśleć co zrobić aby było lepiej:).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ocena MTS 2009: &lt;font color="#ff0000"&gt;7&lt;/font&gt;/9 &lt;/strong&gt;(ogólnie spoko, ale bez rewelacji; jakbym zapłacił 1500 zł, ile wynosiła oficjalna cena wstępu, to bym nie był szczęśliwy, chociaż widać postęp w stosunku do wersji 2008)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/7qn7fOy9z3Y" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/10/02/Relacja-z-MTS-2009.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/10/02/Relacja-z-MTS-2009.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=586c1b89-464c-46a2-b2c1-1e69c2175f07</guid>
      <pubDate>Fri, 02 Oct 2009 01:12:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=586c1b89-464c-46a2-b2c1-1e69c2175f07</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=586c1b89-464c-46a2-b2c1-1e69c2175f07</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/10/02/Relacja-z-MTS-2009.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=586c1b89-464c-46a2-b2c1-1e69c2175f07</wfw:commentRss>
    </item>
    <item>
      <title>Trzymajcie dzieci z dala od Xboxa!!!</title>
      <description>&lt;p&gt;Czego potrzeba do zostania perkusistą, jeśli nie masz warunków do nauki gry na prawdziwej perkusji? Oczywiście konsoli Xbox i gry &lt;a href="http://www.gh4.pl/"&gt;Guitar Hero&lt;/a&gt;, poczynając od edycji &lt;a href="http://www.gh4.pl/worldtour.php"&gt;World Tour&lt;/a&gt;. A jeśli nie masz ani gry, ani konsoli? Za grę robić może świetny kawałek open-source’owego napisanego w Pythonie softu pod nazwą &lt;a href="http://fretsonfire.sourceforge.net/"&gt;Frets on Fire&lt;/a&gt; z modem &lt;a href="http://code.google.com/p/fofix/"&gt;FoFiX&lt;/a&gt;. Za konsolę: zwykły PC (z urządzeniem pozwalającym na używanie bezprzewodowych kontrolerów od Xboxa, czyli &lt;a href="http://www.xbox.com/en-US/hardware/x/xbox360wirelessgamingreceiver/"&gt;Xbox 360™ Wireless Gaming Receiver for Windows®&lt;/a&gt;). Do tego &lt;a href="http://www.amazon.com/Official-Guitar-Hero-World-Xbox-360/dp/B001NJDWU2/ref=sr_1_3?ie=UTF8&amp;amp;s=videogames&amp;amp;qid=1253974674&amp;amp;sr=8-3"&gt;perkusja&lt;/a&gt; i jazda. Polecam, polecam i jeszcze raz polecam! Ostatnio nie mam niestety czasu żeby się tym odpowiednio (czyt.: dłużej niż 20 minut dziennie) delektować, ale tak czy siak zabawa jest mega-przednia.&lt;/p&gt;  &lt;p&gt;Ale ja nie o tym... Wszystkie zakupione przeze mnie akcesoria do Xboxa (perkusji dzięki łaskawości &lt;a href="http://www.mts2009.pl/agenda/prelegenci#jjalbrzykowski"&gt;takiego jednego celebryta&lt;/a&gt; kupować na razie nie musiałem:) ) posiadają instrukcję. Ja mam to do siebie, że zwykle czytam takie rzeczy i czasami naprawdę się opłaca. Tym razem opłaciło się, bo poniższe zdanie wprawiło mnie w dobry humor na dłuższy czas:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;If the Xbox console falls and hits someone, especially a small child, it could cause serious injury.&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Jeeeea, to się nazywa ostrzeżenie. Powoli zbliżają się święta, przed kupnem takiego prezentu swoim pociechom (gdybym je miał) porządnie bym się zastanowił. A już na pewno nie stawiał go nigdzie wyżej niż podłoga. Normalnie &amp;quot;&lt;em&gt;minister zdrowia i opieki społecznej ostrzega&lt;/em&gt;&amp;quot;...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/HAg-kZ9tGFQ" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/10/01/Trzymajcie-dzieci-z-dala-od-Xboxa!!!.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/10/01/Trzymajcie-dzieci-z-dala-od-Xboxa!!!.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=0a8b2445-f977-4244-9b91-dc4f74ce7d82</guid>
      <pubDate>Thu, 01 Oct 2009 10:23:00 +0100</pubDate>
      <category>priv</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=0a8b2445-f977-4244-9b91-dc4f74ce7d82</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=0a8b2445-f977-4244-9b91-dc4f74ce7d82</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/10/01/Trzymajcie-dzieci-z-dala-od-Xboxa!!!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=0a8b2445-f977-4244-9b91-dc4f74ce7d82</wfw:commentRss>
    </item>
    <item>
      <title>[Spis treści] Cykl o mock objects i Rhino Mocks</title>
      <description>&lt;p&gt;Dobiegł końca pierwszy na tym blogu &lt;em&gt;cykl&lt;/em&gt; (chociaż posty pojawiały się częściej niż &lt;em&gt;&amp;quot;teoretycznie co 28 dni&amp;quot;&lt;/em&gt;) technicznych postów rozprawiających się z jednym zagadnieniem krok po kroku. A konkretnie: pisaniem testów jednostkowych z wykorzystaniem &amp;quot;obiektów mockujących&amp;quot; dostarczanych przez mechanizm zaimplementowany w bibliotece &lt;a href="http://ayende.com/projects/rhino-mocks.aspx"&gt;Rhino Mocks&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Pomyślałem że dobrze będzie zebrać w jednym miejscu to co się wykluło od jego powstania do jego zakończenia, zatem poniżej spis postów poruszających tą tematykę:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/07/14/Testy-jednostkowe-z-wykorzystaniem-mockow-wstep.aspx"&gt;Testy jednostkowe z wykorzystaniem mocków - wstęp&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/07/16/Mock-Objects-pierwszy-test-krok-po-kroku.aspx"&gt;Mock Objects - pierwszy test krok po kroku&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/07/20/Generator-wartosci-dla-testow-jednostkowych.aspx"&gt;Generator wartości dla testów jednostkowych&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/07/22/Wybor-mock-object-framework.aspx"&gt;Wybór mock-object framework&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/07/27/Dynamic-Mock-vs-Strict-Mock-vs-Stub.aspx"&gt;Dynamic Mock vs Strict Mock vs Stub&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/07/30/Sposoby-pisania-testow-z-mockami-Expectations-vs-RecordReplay-vs-Arrange-Act-Assert.aspx"&gt;Sposoby pisania testów z mockami: Expectations vs Record/Replay vs Arrange-Act-Assert&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/08/03/Weryfikacja-parametrow-metod-w-mock-objects.aspx"&gt;Weryfikacja parametrów metod w mock objects&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/08/07/Konfiguracja-zachowania-metod-dla-stubow.aspx"&gt;Konfiguracja zachowania metod dla stubów&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/08/26/Zdarzenia-w-mock-objects.aspx"&gt;Zdarzenia w mock objects&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/09/03/Testowanie-klas-abstrakcyjnych-przy-pomocy-mockow.aspx"&gt;Testowanie klas abstrakcyjnych przy pomocy mocków&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.maciejaniserowicz.com/post/2009/09/28/Przechwytywanie-wartosci-parametrow-z-metod-mock-objects.aspx"&gt;Przechwytywanie wartości parametrów z metod mock objects&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Uwagi odnośnie całości jak zwykle mile widziane.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/6468CDz9OWg" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/09/29/Spis-tresci-Cykl-o-mock-objects-i-Rhino-Mocks.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/09/29/Spis-tresci-Cykl-o-mock-objects-i-Rhino-Mocks.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=7c778628-1ac7-4780-a606-5eca4294f8e9</guid>
      <pubDate>Tue, 29 Sep 2009 07:36:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=7c778628-1ac7-4780-a606-5eca4294f8e9</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=7c778628-1ac7-4780-a606-5eca4294f8e9</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/09/29/Spis-tresci-Cykl-o-mock-objects-i-Rhino-Mocks.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=7c778628-1ac7-4780-a606-5eca4294f8e9</wfw:commentRss>
    </item>
    <item>
      <title>Przechwytywanie wartości parametrów z metod mock objects</title>
      <description>&lt;p&gt;Dzisiaj spojrzymy na sytuację, w której będziemy potrzebowali nie weryfikować, ale zapamiętać wartości przekazywane do mock objects w celu późniejszego ich wykorzystania. Scenariusz ten jest dość nietypowy, w moim przypadku &lt;em&gt;SUT&lt;/em&gt; (System Under Test) rejestrował pewną operację w komponencie odpowiedzialnym za jej uruchomienie w odpowiednim momencie.&amp;#160; wykonanie. Rejestracja odbywała się z wykorzystaniem wyrażeń lambda, więc przetesowanie rejestrowanej akcji w sposób &amp;quot;zwykły&amp;quot; nie było możliwe. Oto jak to wyglądało:&lt;/p&gt;

  &lt;p&gt;&lt;img src="http://www.maciejaniserowicz.com/image.axd?picture=mocksparam_registerop.png" /&gt;

&lt;/p&gt;  &lt;p&gt;I jak przetestować faktyczne działanie zarejestrowanej akcji? O tak, z wykorzystaniem funkcjonalności &amp;quot;&lt;em&gt;WhenCalled()&lt;/em&gt;&amp;quot;:&lt;/p&gt; 

 &lt;p&gt;&lt;img src="http://www.maciejaniserowicz.com/image.axd?picture=mocksparam_test.png" /&gt;&lt;/p&gt;

&lt;p&gt;Nie jest to zbyt czytelne i nagroda za &lt;em&gt;design roku&lt;/em&gt; zdecydowanie mi się nie należy, więc przed zastosowaniem podobnej konstrukcji należy się porządnie zastanowić (następnym razem to zrobię, jak nic). Niemniej jednak – działa jak powinno.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/1d1IborwvUY" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/09/28/Przechwytywanie-wartosci-parametrow-z-metod-mock-objects.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/09/28/Przechwytywanie-wartosci-parametrow-z-metod-mock-objects.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=8eb6a5b4-902c-42f9-8469-0e5e7218c004</guid>
      <pubDate>Mon, 28 Sep 2009 08:35:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=8eb6a5b4-902c-42f9-8469-0e5e7218c004</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=8eb6a5b4-902c-42f9-8469-0e5e7218c004</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/09/28/Przechwytywanie-wartosci-parametrow-z-metod-mock-objects.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=8eb6a5b4-902c-42f9-8469-0e5e7218c004</wfw:commentRss>
    </item>
    <item>
      <title>Wkrocz na drogę do sukcesu - zarejestruj się na Imagine Cup 2010!</title>
      <description>&lt;p&gt;Sam się dziwię, że potrafię "skomponować", opublikować i autentycznie szczerze PODPISAĆ SIĘ pod tak ohydnie marketingowym tekstem. Ale... cóż, taka prawda. Nie jestem chyba w stanie wystarczająco dosadnie napisać jak bardzo zachęcam studentów do uczestnictwa w tym wydarzeniu. Sam z pewnością nie byłbym tu gdzie jestem teraz, gdybym kiedyś olał istnienie niesamowitych okazji, jakie daje konkurs &lt;a href="http://www.imaginecup.pl"&gt;Imagine Cup&lt;/a&gt;. Zaryzykuję nawet stwierdzenie, że decyzja o moim pierwszym starcie była najważniejszą (sic!) w mojej całej zawodowej karierze.&lt;/p&gt;
&lt;p&gt;O konkursie pisałem już dwukrotnie (&lt;a href="http://www.maciejaniserowicz.com/post/2009/05/11/Juz-niebawem-Polskie-finaly-Imagine-Cup-2009!.aspx"&gt;tutaj&lt;/a&gt; dlaczego warto w nim startować, a &lt;a href="http://www.maciejaniserowicz.com/post/2009/05/20/Relacja-z-polskich-finalow-Imagine-Cup-2009-Projektowanie-Oprogramowania.aspx"&gt;tutaj&lt;/a&gt; zrelacjonowałem ostatnie polskie finały).&lt;/p&gt;
&lt;p&gt;W ciągu ostatnich pięciu lat uczestniczyłem w IC trzykrotnie - dwa razy jako uczestnik i raz jako widz. I za każdym razem było super. Dlatego, drogi studencie, łap okazję póki czas! Nie odkładaj tego na następny rok, nie wykręcaj się ciężką sesją i natłokiem zajęć. To jest po prostu ważniejsze niż studia i imprezy.&lt;/p&gt;
&lt;p&gt;Zdecydowanym życzę powodzenia - z zainteresowaniem będę obserwował efekt waszej ciężkiej pracy na kolejnych finałach!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/jUnhTKgBfbI" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/09/21/Wkrocz-na-droge-do-sukcesu-zarejestruj-sie-na-Imagine-Cup-2010!.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/09/21/Wkrocz-na-droge-do-sukcesu-zarejestruj-sie-na-Imagine-Cup-2010!.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=751bed66-9006-4830-a825-eb2175d28696</guid>
      <pubDate>Mon, 21 Sep 2009 06:40:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=751bed66-9006-4830-a825-eb2175d28696</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=751bed66-9006-4830-a825-eb2175d28696</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/09/21/Wkrocz-na-droge-do-sukcesu-zarejestruj-sie-na-Imagine-Cup-2010!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=751bed66-9006-4830-a825-eb2175d28696</wfw:commentRss>
    </item>
    <item>
      <title>Tymczasowe wstrzymanie aplikacji ASP.NET</title>
      <description>&lt;p&gt;Krótka ciekawostka, pewnie znana większości: wrzucając do katalogu głównego aplikacji ASP.NET plik o nazwie app_offline.htm spowodujemy, że będzie on serwowany jako odpowiedź na wszystkie żądania do tej aplikacji. Zastosowań może mieć kilka, z których najbardziej oczywistym jest tymczasowe &amp;quot;zdjęcie&amp;quot; witryny podczas wgrywania nowej wersji czy rozwiązywania jakiegoś problemu: wypełniamy wówczas ten plik komunikatem o tymczasowej niedostępności i tyle, lepsze to niż standardowy komunikat o błędzie. Inny przykładowy scenariusz użycia to automatyczne przekierowanie użytkowników na inny adres – wystarczy w pliku zamieścić odpowiedni &lt;a href="http://en.wikipedia.org/wiki/Meta_refresh"&gt;meta-tag&lt;/a&gt; (&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;5;url=&lt;a href="http://example.com/&amp;quot;"&gt;http://example.com/&amp;quot;&lt;/a&gt; /&amp;gt;).&lt;/p&gt;  &lt;p&gt;Warto o tym wiedzieć, potrafi uprościć życie.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/maciejaniserowicz/~4/_vsAF5uQULU" height="1" width="1"/&gt;</description>
      <link>http://www.maciejaniserowicz.com/post/2009/09/14/Tymczasowe-wstrzymanie-aplikacji-ASPNET.aspx</link>
      <author>Procent</author>
      <comments>http://www.maciejaniserowicz.com/post/2009/09/14/Tymczasowe-wstrzymanie-aplikacji-ASPNET.aspx#comment</comments>
      <guid>http://www.maciejaniserowicz.com/post.aspx?id=b8e8569d-15e1-431c-9dc7-38aff25873c5</guid>
      <pubDate>Mon, 14 Sep 2009 06:21:00 +0100</pubDate>
      <category>pro</category>
      <dc:publisher>Procent</dc:publisher>
      <pingback:server>http://www.maciejaniserowicz.com/pingback.axd</pingback:server>
      <pingback:target>http://www.maciejaniserowicz.com/post.aspx?id=b8e8569d-15e1-431c-9dc7-38aff25873c5</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.maciejaniserowicz.com/trackback.axd?id=b8e8569d-15e1-431c-9dc7-38aff25873c5</trackback:ping>
      <wfw:comment>http://www.maciejaniserowicz.com/post/2009/09/14/Tymczasowe-wstrzymanie-aplikacji-ASPNET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.maciejaniserowicz.com/syndication.axd?post=b8e8569d-15e1-431c-9dc7-38aff25873c5</wfw:commentRss>
    </item>
  </channel>
</rss>
