Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

mgrzeg.net - Admin on Rails :)

  • C2C - agenda, prelegenci - gotowe!

    Przygotowania do konferencji Communities to Communities 2008 idą pełną parą i po ostatnim konkursie Speaker Idol na WG.NET mamy ostatecznie ustawioną agendę konferencji. Poniżej ona, skopiowana żywcem ze strony konferencji - agenda.

    Więcej informacji o prelegentach.

    Zobaczymy się 5 kwietnia??? :D

    Ścieżka .NET
    Sala Aula
    08:00-09:00 Rejestracja
    09:00-09:15 Powitanie uczestników
    09:15-10:30 Test Driven Development (TDD) w praktyce – Maciej Szczepański, Paweł Leśnikowski
    10:30-10:45 Przerwa
    10:45-12:00 Debugging and Crash Dump Analysis of ASP.NET Web Sites – Martin Kulov
    12:00-13:00 Pizza time
    13:00-14:15 Wprowadzenie do Entity Framework – Jarek Kowalski
    14:15-14:30 Przerwa
    14:30-15:45 Understanding Goals and Features of the ASP.NET MVC Framework – Dino Esposito
    15:45-16:00 Przerwa
    16:00-17:15 .NET Developer Toolbox A.D. 2008 – Marcin Celej, Michał Brzozowski
    17:15-17:30 Podsumowanie i zakończenie konferencji

    Sesje w ścieżce .NET

    • Test Driven Development (TDD) w praktyce – Maciej Szczepański, Paweł Leśnikowski

      Test Driven Development (TDD) nie jest tematem nowym. Każdy z Was najpewniej słyszał o tej metodyce tworzenia oprogramowania. Wielu boi się jednak spróbować, nie wierząc, że początkowy nakład pracy zwróci się w czasie trwania projektu.

      Prezentacja ma za zadanie przełamać pierwsze opory. Na bazie trójwarstwowej aplikacji ASP.Net, stworzonej w trakcie prezentacji, pokazane zostaną techniki ułatwiające testowanie kodu oraz przedstawiony będzie wpływ testów na poprawę architektury aplikacji.

      Pokażemy, czemu aplikacje tworzone zgodnie z TDD zawierają mniej błędów i są łatwiejsze w utrzymaniu oraz zaprezentujemy, w jaki sposób efektywnie wykorzystywać narzędzia NUnit, Rhino Mocks i ReSharper.

    • Debugging and Crash Dump Analysis of ASP.NET Web Sites – Martin Kulov

      This session will show you how you can debug and resolve problems in web applications that are running on a production server. We will take a look at the features in developer's best friend - WinDbg. You will see different problem scenarios that may sound familiar to you and ways to get problem located on the live server. Additional tools for tracing and diagnostics will be shown.

    • Wprowadzenie do Entity Framework – Jarek Kowalski

      Entity Framework to nowa technologia dostępu do danych relacyjnych będąca kolejnym etapem ewolucji ADO.NET. Udostępnia bogate narzędzia do tworzenia modeli konceptualnych, odwzorowywania ich na strukturę relacyjnej bazy danych, nowoczesny język zapytań, dostęp obiektowy oraz wsparcie dla LINQ.

      Podczas sesji przedstawiony zostanie proces tworzenia prostej aplikacji opartej na Entity Framework z wykorzystaniem dostarczanych graficznych narzędzi (Entity Designer, Entity Data Source). Zaprezentowane zostaną także języki zapytań Entity SQL oraz LINQ to Entities.

    • Understanding Goals and Features of the ASP.NET MVC Framework – Dino Esposito

      Most applications, and especially Web applications, often have their presentation layer mixed up with some business logic and data access code.

      User interface facilities, in fact, tend to encourage developers to put in the UI layer more code than it should; and code that belongs to other logical layers. Using a MVC or MVP methodology helps enforce a clean separation of concerns between the models, views and controllers within an application. In the near future, ASP.NET 3.5 will include support for developing Web applications using an MVC-based architecture. Available in CTP, the ASP.NET MVC Framework represents an alternate option to Web Forms and postbacks. The ASP.NET MVC Framework doesn't support classic postbacks and viewstate and doesn't consider the requested URL as the endpoint to a physical server file to parse and compile to a class. The URLs employed by the pages of an MVC Framework application have a custom format that the application itself mandates. Each addressable URL is mapped to a controller and exposes a well-known set of operations and a uniform interface for executing operations. In this session, we'll dive into the ASP.NET MVC Framework to learn how to leverage this new alternative framework in your own applications.

    • .NET Developer Toolbox A.D. 2008 – Marcin Celej, Michał Brzozowski

      Zestaw narzędzi, którymi obecnie dysponuje programista .NET znacznie się zmienił. Na przykładzie aplikacji do zarządzania portfelem inwestycyjnym pokazane zostanie, jak, używając WPF, WCF, WWF, Linq, i wielu innych elementów .NET 3.5, można obecnie tworzyć aplikacje biznesowe. Sesja ma na celu zaprezentowanie zmiany w sposobie tworzenia aplikacji.

    opublikowano 10 marca 2008 15:56 przez mgrzeg | 11 komentarzy
    Filed under:
  • Google Groups, ITCore a WG.NET

    Jakis czas temu pisalem, ze zaangazowalem sie na ostro w dzialalnosc Warszawskiej Grupy .NET. Pisalem rowniez o Google Groups, etc. Teraz wracam do tego watku, ale z nowymi doswiadczeniami i przemysleniami.

    Google Groups bylo idealne na starcie. Lista dystrybucyjna z prostym interfejsem webowym to bylo to, czego potrzebowala ta grupa, zeby sie ruszyc z miejsca. Inne grupy w Polsce rowniez tego potrzebowaly i sam namawialem przez kawal czasu do uzywania GG jako podstawowego narzedzia do zarzadzania grupami. O ile sie nie myle, tylko grupa Wroclawska porzucila GG na korzysc Community Server 2007, ale bez przyczyn technicznych zwiazanych z GG.

    Krotka historia problemow na gg:

    1. Niewinne poczatki:
      • od wrzesnia do grudnia dostawalem kilka - kilkanascie zgloszen o problemie z edycja strony z rejestracja, szczegolnie w IE, uzycie FF zazwyczaj zalatwialo problem
      • od samego poczatku jest problem z edycja strony glownej. Na poczatku byl to wylacznie brak mozliwosci edycji 'html source', co skutkowalo przypadkowym ukladem obrazkow. Pewnym hackiem jest edycja jednej z podstron i skopiowanie wyniku na strone glowna - vide grupa PLSSUG, ktora ma podstrone ' -Kopia-' wlasnie do tego celu. Inne grupy robia podobnie i jest to potwornie upierdliwe, ale daje sie z tym zyc
      • problemy z polskimi znakami w nazwach stron - trafia je szlag, lepiej ich po prostu nie uzywac.
      • niektore pliki dodane do 'plikow' dziwnym trafem znikaly.
    2. Koniec sielanki:
      • pare tygodni temu Dawid zglosil mi problemy z edycja strony z propozycja tematow na C2C. Rzeczywiscie, na stronie byla zachowana polowa abstraktu, jednak okazalo sie, ze w poprzednich wersjach byla calosc. Skopiowalem poprzednia wersje, zapisalem jako biezaca i stwierdzilem, ze Dawid cos musial zle zrobic. Zbagatelizowalem problem, ale teraz widze, ze to byl poczatek konca.
      • prawdziwy problem zaczal sie przy stronie z 'wish-list' biblioteczki. Na poczatku dostalem bodajze ze 2 zgloszenia, ze strona sie nie zapisuje. Sprobowalem sam i udalo mi sie, wiec znow zbagatelizowalem problem. Jednak nastepnego dnia strona powrocila do poprzedniej wersji, wiec zaczalem weszyc jakis spisek. Od tamtej pory nie moglem nijak zapisac strony z wish list, gg ciagle zglaszal mi, ze ja juz edytuje te strone w innej przegladarce, co nie bylo prawda.
      • obrazki ze strony glownej wszystkich grup (w tym wg.net) przestaly sie poprawnie wyswietlac. Najwyrazniej gg dostalo nowy engine z nowym interpreterem htmla i tyle.
      • strona z wish-list biblioteczki przestala funkcjonowac poprawnie. Po edycji tworzona jest nowa wersja, ktora dostepna jest od paru chwil, przez pare minut do 1h, albo nawet pol dnia. Po tym czasie strona wraca do poprzedniej wersji i - o zgrozo - czasem pojawia sie to w starej, to w nowej wersji.
      • strona glowna zachowuje sie dokladnie tak jak wish-lista.
      • strona z rejestracja podzielila los dwoch poprzednich stron i nie zapisuje sie na dluzej. Od poprzedniego spotkania rejestracja jest w ramach dyskusji, a nie na stronie.
    3. Apogeum:
    4. Wiekszosc z powyzszych problemow weryfikowalem na kompie w robocie i w domu, roznych wersjach przegladarek. Prosilem tez niektore osoby o potwierdzanie moich omamow, ew. o edycje strony, bo mnie juz szlag trafial. Efekt zawsze ten sam.

    Stan na dzis:

    • nie dzialaja strony, nie mozna trwale edytowac istniejacych, nie mozna dodawac nowych.
    • problemy z plikami
    • strona glowna jest martwa, swiec Google nad jej duszyczka :(
    • wiadomosci w ramach dyskusji pojawiaja sie w roznym czasie - nieraz pozniejsze widac na stronie wczesniej. Podobnie dostarczanie mailem - pozniejsze pojawiaja sie wczesniej (vide wczorajsze maile rejestracyjne).

    Sklonny jestem stwierdzic z calym przekonaniem, ze prosty interfejs webowy dla listy dystrybucyjnej wg.net przestal dzialac. Zostala sama lista. A ja trace za duzo czasu na walke z materia, czyli strona grupy.

    Oczywiscie picasa, calendar i inne rzeczy dzialaja. Dzialaja roznie i do wszystkiego mozna miec wieksze lub mniejsze zastrzezenia. Jednak brak podstawowej funkcjonalnosci gg jest niewybaczalny z mojego punktu widzenia i przesadza sprawe. Moja rodzina nie wybacza mi czasu strawionego na walke z GG. A Grupa musi miec jakas strone, koniec kropka.

    ITCORE

    ITCore dla grupy to po prostu sajt WSS z mozliwoscia tworzenia podsajtow na rozne cele. Jestem nikim, jesli idzie o MOSS, czy nawet WSS, ale w czasie wczorajszego spotkania w MS, po tym jak Artur pokazal to i owo, bylem w stanie na oczach chlopakow z innych grup .NET.pl w czasie krotszym niz w ramach gg (w parenascie minut) wyklikac to co nas intersowalo i przypominalo wygladem to co widzimy obecnie na gg. A czego potrzebujemy w moim odczuciu?

    • biblioteka dokumentow, gdzie mozna skladowac materialy ze spotkan z widokiem listy czy kalendarza. Po dodaniu paru pol mamy info o tym ktore to bylo spotkanie, kiedy sie odbylo, etc. Na razie wszystkie te informacje trzymamy w nazwach plikow, co jest mocno czerstwe i nie daje sie zaprezentowac w kalendarzu,
    • kalendarz spotkan z alertami dla zarejestrowanych czlonkow grupy,
    • galeria zdjec. Jest mulitifile upload, nie ma co prawda slideshow, ale mozna sie z tym w ostatecznosci pogodzic. Nie musze 15 razy sie logowac na rozne konta, zeby dodac zdjecia i je opisac, czy nawet przejrzec, wszystko jest w jednym miejscu,
    • miejsce na video. Miejsce jest, ale z pokazaniem tego jest gorzej. W ostatecznosci zrobimy tak, jak zasugerowal Artur, ale bede Jego, Basie, Piotrka i wszystkie znane mi osoby w MS naciskal na to, zeby to bylo porzadnie zrobione w SL, bo to w koncu produkt dzialania grup. Bez wzgledu na efekt moich dzialan, tak czy siak NA PEWNO bede wrzucal video ze spotkan na itcore, bo:
      1. bedzie do tego ftp,
      2. bedzie 10 GB na to (i wiecej w miare potrzeb),
      3. wszystko w jednym miejscu.
      Nie wykluczam, ze dalej bede to i owo pchal gdzie popadnie - vimeo, google video (tu gorzej, bo obcinaja do niemozebnego rozmiaru i tak slaby material wejsciowy), etc., zeby jak najszerzej promowac grupe. Jak inne grupy beda wrzucac swoje video u siebie na itcore, to bedzie mozna agregowac to w podsajcie i pokazywac jakos wszystko na raz, na razie jest totalny pieprznik w tym wzgledzie.
    • strony do edycji: 'Propozycje tematow spotkan', 'biblioteczka' (plis, nie mowcie mi o pisaniu aplikacji, bo dla 15 osob korzystajacych szkoda na to sily), byc moze inne rzeczy (typu 'kto sie wybiera na c2c'). Czesc z tego to beda listy, czesc to beda zwykle strony dostepne do edycji dla kazdego, moze wiki, kto wie.
    • moze jakis 'blog grupowy' (jak ktos bedzie chcial to prowadzic - czemu nie? :)
    • ankietki. A to ksiazeczki do wyboru, a to cos innego. Nie ma mozliwosci wrzucania przez admina odpowiedzi na pytania (w trybie jeden czlowiek-jedna odpowiedz), wiec chyba zostaniemy przy surveymonkey, bo tam mozna po spotkaniu zebrac kartki i wrzucic odpowiedzi. (choc jest tam syf z podsumowaniem, bo grafika sie nie kopiuje, a na itcore to po prostu dziala). Oczywiscie dotyka to spraw organizacyjnych i tego, na ile grupa bedzie dzialala online, a nie tylko live. Moje doswiadczenia pokazuja jednak, ze zebranie ankiet na spotkaniu daje > 85% wszystkich odpowiedzi.
      I najwazniejszy element
    • forum. Tu ITCore nie odstaje daleko od gg, choc paru rzeczy nie ma (a przynajmniej ja o tym nic nie wiem):
      1. Tworzenie nowych watkow przy pomocy maila,
      2. odpowiadanie na istniejace mailem. Jest powiadamianie o nowych watkach / odpowiedziach, ale wymaga to dalszej interakcji z serwisem.
      Funkcjonalnosc listy dystrybucyjnej jest moim zdaniem bardzo wazna. Czy forum w postaci zaoferowanej przez ITCore jest w stanie to zastapic, czy nie - nie wiem, trzeba bedzie to uzgodnic. W razie co zostaniemy z dyskusjami na GG, chyba, ze MS da nam do dyspozycji liste dystrybucyjna wg-net@itcore.pl z jakims prostym interfejsem webowym (archiwum-forum) w ramach sajtu grupy.

    Co do stabilnosci WSS i ITCore to raczej jestem dobrej mysli. W koncu jest to produkt z jakas tam historia i jesli nie wychodzi sie poza standardowe rzeczy, to producent zdaje sie zdazyl juz przetestowac wszystko raczkami milionow userow w ramach w2k3. Z tego, co wspominal Artur, infrastruktura pod to bedzie wystarczajaca, a skoro na potrzeby grupy naprawde nie potrzebujemy nic wypasnego, to chyba nie ma sie o co martwic.

    Poza tym - support ITCore mam dwa klikniecia mysza od siebie - msn/skype Artura, Basi i innych osob jakos tam siedzacych za tym i zachecajacych do uzycia tego. W razie co telefony tez do nich mam, wiec moga spac spokojnie :D
    Na GG moge pisac na Berdyczow.

    MS i tak juz zainwestowal w to spore srodki, wiec chyba zalezy im na tym, zeby to jakos dzialalo.
    Wszystkie grupy w jednym miejscu, nie musze nic za to placic - MS 'stawia' :D. Zawsze moge poprosic o nowa funckcjonalnosc i jest szansa, ze zostane wysluchany ;) W ostatecznosci mam mozliwosc (ja, albo ktos, kto bedzie chcial mi pomoc, albo ktokolwiek z innych grup) dlubac w srodku i samemu cos dostrugac. Na razie nie pale sie do tego, ale na GG nie mam w ogole takiej mozliwosci. Po przejsciu grupy na itcore zaprosze kiedys Artura na spotkanie grupy i pokaze nam co i jak mozna tam zrobic od strony dev.

    Podsumowujac.

    Wszyscy wiedza, kto sie bawi w to wszystko - edycje, klikanie, etc. Glownie ja, co widac w statsach grupy, wiec nie czuje sie moralnie zle, jesli sam, po konsultacjach z aktywistami grupy podejme decyzje o przejsciu na itcore. Ja nie chce spedzic przy infrastrukturze wiecej, niz to konieczne, szkoda mi zycia na to. Na GG trace _za duzo_ czasu, a glownie nerwow. Poza tym trzeba pokazac cos ladniejszego sponsorom, ktorzy chca widziec swoje logo na stronie, a nawet 'Reflector.master' na WSS jest ladniejszy od tego, co mamy tutaj ;)

    Na itcore grupa WG.NET prawdopodobnie wsiadzie jakos po 17 marca. Do tego czasu dostaniemy do testow sajt dla grupy, gdzie bedzie mozna sobie wszysto poustawiac.

    opublikowano 8 marca 2008 03:12 przez mgrzeg | 1 komentarzy
    Filed under: ,
  • Wybieramy prelegenta na C2C!!!

    Call to action!

    Jeśli mieszkasz w Warszawie, a nie byłeś jeszcze na spotkaniu Warszawskiej Grupy .NET, to czas najwyższy nadrobić zaległości!

    W najbliższy czwartek, tj. 28 lutego 2008 roku, w trakcie spotkania grupy, wybieramy w drodze konkursu przypominającego Speaker Idola, osobę(y), która(e) będzie(ą) nas reprezentować na konferencji Communities to Communities 2008, organizowanej między innymi przez Warszawską Grupę .NET!

    Mało tego! Jeśli jesteś członkiem wg.net, to możesz zgłosić swoją prezentację do konkursu (do 27 lutego), masz szansę wygrać konkurs i wystąpić na C2C w roli prelegenta! Możesz być tą osobą, więc nie zwlekaj i rejestruj swoją prezentację!

    Spytacie teraz zapewne co to za konferencja i kto jeszcze będzie tam występował. Już mówię!

    Konferencja C2C, to okazja do spotkania znajomych z całej Polski, a także wysłuchania prelekcji prowadzonych przez:

    1. Ścieżka .NET:

    - Dino Esposito (tak, tego Dino!)

    - Martina Kulowa

    - Jarka Kowalskiego

    - Michała Brzozowskiego & Marcina Celeja (KGD)

    2. Ścieżka SQL:

    - Marcina Szeligę

    - Maćka Pileckiego

    - Damiana Widerę

    - Sylwestra Lewandowskiego

    i to wszystko jest za darmo i organizowane przez grupy pasjonackie .NET w Polsce.

    Podsumowując:

    - Jeśli chcesz wziąć udział w konkursie w roli prelegenta, zgłoś swoją prezentację na stronie z tematami do 27 lutego, a następnie przyjdź na spotkanie 28 lutego i olśnij wszystkich swoją osobą :D

    - Jeśli chcesz zobaczyć jak inni lśnią (;)) i móc zdecydować, na kogo chcesz zagłosować, żeby reprezentował WG.NET na C2C, to zarejestruj się na spotkanie, przyjdź i oceniaj!

    O ile mi wiadomo, dwaj nasi dobrzy znajomi z zina - Wojtek i Arek, przygotowując się do roli bohaterów w Heroes Community Launch, ociosując wzorce projektowe i robiąc inne cuda, pochylają się nad C2C i kto wie, może i Oni wystąpią w konkursie czwartkowym :)

    Póki co jednak, Wojtka można zobaczyć na zarejestrowanej na ostatnim spotkaniu grupy WG.NET sesji o MVC: tu (lub lepszej jakości tu), a przy okazji zorientować się w atmosferze spotkania. W najbliższym czasie powinno pojawić się również nagranie z sesji Arka o SVN. Nagranie z prezentacji Arka można zobaczyć tu. Nie ma co ukrywać, chłopcy z zina zdominowali spotkanie :). Przy okazji - trzecim prelegentem na wspomnianym spotkaniu grupy WG.NET był Ziemek Borowski - anioł stróż serwisu zine.net.pl. Wygląda na to, że zine na dobre zagościł na spotkaniach grupy :D.

    opublikowano 23 lutego 2008 00:39 przez mgrzeg | 2 komentarzy
    Filed under: ,
  • Quiz wiedzy o Windows Server 2008

    Tym razem krótka notka - informacyjna.

    Jeden z weteranów systemów operacyjnych MS, a zarazem polski MVP w kategorii Windows - Security, Grzegorz Tworek rusza właśnie z konkursem wiedzy o najnowszym dziecku Microsoft w kategorii systemów operacyjnych. Do wygrania fura nagród (jakiś XBOX 360, trochę softu i innego sprzętu ;)) oraz wiedza - warto chyba zajrzeć!

  • Wyniki konkursu - Etap IV - PIAB

    Enterprise Library - Policy Injection Application Block

    W odpowiedzi na czwarte zadanie konkursowe dotyczące PIAB dostaliśmy 2 odpowiedzi, obie prawidłowe! Oto lista osób, które nadesłały nam swoje prace:

    1. Sebastian Szmigielski
    2. Krzysztof Olejniczak

    Tym razem, zgodnie z założeniami ostatniego etapu konkursu, w czapce losującej znalazły się 2 losy z nazwiskiem Krzysztofa Olejniczaka i 3 z nazwiskiem Sebastiana Szmigielskiego :)
    Losowanie nagrody odbyło się na XIII Spotkaniu Warszawskiej Grupy .NET. Fotki ze spotkania pojawią się niebawem w albumie grupy.

    W wyniku szczęśliwego trafu, zwycięzcą IV-ego Etapu Konkursu został Sebastian Szmigielski, który otrzyma Programowanie Microsoft SQL Server 2005. Gratulujemy!

    Przy okazji informacja dla osób, którym się nie udało wygrać żadnego z etapów - panowie, głowa do góry! Artur Żarski z Microsoft obiecał nagrodę 'pocieszenia' ;) - 3 egzemplarze książki "The Security Development Lifecycle".

    Jeszcze raz dzięki za udział w konkursie - to jest najlepsze wsparcie dla takich pomysłów! :)

    Na koniec standardowe pytanie: jak ostatni etap? Jakies wrazenia?

  • IV Etap konkursu (PIAB) - dodatkowe 2 tygodnie!

    Postanowiliśmy dać Wam jeszcze 2 tygodnie na oddanie prac konkursowych :). Myślę, że to wystarczy, żeby dokończyć w spokoju najciekawsze chyba zadanie, spajające wszystkie dotychczasowe.
    A zatem - macie czas do 5-ego listopada na oddanie prac konkursowych!
    Powodzenia!

    opublikowano 23 października 2007 16:56 przez mgrzeg | 0 komentarzy
    Filed under:
  • Wyniki konkursu - Etap II - EHAB & Etap III - VAB

    Na wstępie krótka informacja: ze względu na małą liczbę rozwiązań, zdecydowałem się zrezygnować z jednego z ograniczeń konkursu. Dotychczasowi zwycięzcy również będą brali udział w losowaniu nagród w kolejnych etapach, o ile oczywiście podeślą prawidłowe rozwiązanie :). Zmiana dotyczy również losowań opisanych poniżej!

    Enterprise Library - Exception Handling Application Block

    W odpowiedzi na drugie zadanie konkursowe dotyczące EHAB dostaliśmy 4 odpowiedzi, wszystkie prawidłowe! Oto lista osób, które nadesłały nam swoje prace (chronologicznie względem daty wysłania):

    1. Dariusz Tarczynski
    2. Łukasz Szewczak
    3. Krzysztof Olejniczak
    4. Dawid Węgrzyn

    Zgodnie z założeniami, kartka z nazwiskiem Darka pojawiła się dwa razy w czapce losującej :)
    Losowanie nagrody odbyło się na XI Spotkaniu Warszawskiej Grupy .NET, niestety nie mamy żadnych zdjęć z tego wydarzania :(.

    W wyniku szczęśliwego trafu, zwycięzcą II-ego Etapu Konkursu został Krzysztof Olejniczak, który otrzyma "Microsoft SQL Server 2005 od środka: Mechanizm składowania danych". Gratulujemy!

    Enterprise Library - Validation Application Block

    W odpowiedzi na trzecie zadanie konkursowe dotyczące VAB dostaliśmy 4 odpowiedzi, wszystkie prawidłowe! Oto lista osób, które nadesłały nam swoje prace (chronologicznie względem daty wysłania):

    1. Dariusz Tarczynski
    2. Marcin Krupiński
    3. Sebastian Szmigielski
    4. Krzysztof Olejniczak

    Zgodnie z założeniami, kartka z nazwiskiem Darka znowuż pojawiła się dwa razy w czapce losującej :)
    Podobnie jak poprzednio, losowanie nagrody odbyło się na XI Spotkaniu Warszawskiej Grupy .NET.

    Tym razem, w wyniku szczęśliwego trafu, zwycięzcą III-ego Etapu Konkursu został Sebastian Szmigielski, który zgarnął "Microsoft SQL Server 2005 Reporting Services Krok po kroku". Gratulujemy!

    Przy okazji podziękowania dla Pawła Potasińskiego i Anety Sidorowicz, którzy przeprowadzili samo losowanie. Sebastian, Marcin i Łukasz byli na tym spotkaniu i nie widziałem, żeby mieli jakiekolwiek zastrzeżenia co do przeprowadzenia samego losowania, prawda chłopaki! :)

    Oczywiście przypominam o ostatnim już etapie konkursu - PIAB. Rozwiązania można podsyłać do poniedziałku, 22 października (z poślizgiem na wtorek do południa, tylko proszę o wcześniejsze info!), a nagrodą w ostatnim etapie jest ostatnia z dostępnych mi książek: "Programowanie Microsoft SQL Server 2005", zachęcam zatem do udziału! Wyniki + losowanie planujemy na kolejnym spotkaniu grupy wg.net, czyli 25 października :)

    Jeszcze raz dzięki za udział w konkursie - to jest najlepsze wsparcie dla takich pomysłów! :)

    A na koniec kontrolne pytanie: Jak tym razem szły rozwiązania? Był ktoś, kto zabrał się za nie i z jakiegoś powodu nie wysłał? A może jakieś uwagi dlaczego takie a nie inne zainteresowanie konkursem? Jakieś inne komentarze?!

  • XI Spotkanie WG.NET a konkurs Enterprise Library

    Grupa jedzie pełną parą i w najbliższy czwartek szykujemy kolejne spotkanie. Tym razem jedna sesja PLSSUG i jedna WG.NET. Mam przy okazji nadzieję pogadać chwilę o palących sprawach organizacyjnych grupy i rozwiązać parę zaległych etapów konkursu Ent.Libowego - EHAB i VAB :)
    Nie pozostaje mi nic innego, jak zaprosić wszystkich na meeting! :)

    Ważne! Na spotkanie wymagana jest rejestracja!

    opublikowano 16 października 2007 09:25 przez mgrzeg | 0 komentarzy
    Filed under:
  • Konkurs Enterprise Library - Validation Application Block (VAB)

    Kontynuujemy nasz konkurs i po przygodach z Logging Application Block oraz Exception Handling Application Block przechodzimy do kolejnego bloku z Enterprise Library.

    Opis znajdujący się poniżej nie stanowi jedynego słusznego sposobu wprowadzania VAB do aplikacji. Skupia się jedynie na scenariuszu związanym z aplikacjami WinForms, choć w bardzo prosty sposób da się poniższe rozwiązanie przenieść na grunt aplikacji opartych o WebForms. Wydaje mi się, że po zaznajomieniu się Czytelnika z poniższym rozwiązaniem, wykorzystanie VAB w aplikacjach Web nie będzie stanowiło żadnego problemu.

    Nie należy traktować poniższych kroków refaktoryzacyjnych jako zestawu do automatyzacji, a raczej jako zbiór wskazówek, którymi można posługiwać się podczas wdrażania Validation Application Block we własnej aplikacji.

    Poniższy tekst nie jest również tutorialem wprowadzającym w VAB i ogólniej Enterprise Library, takie teksty można znaleźć na blogach Davida Haydena i zespołu P&P Microsoftu, a także bezpośrednio na stronach związanych z projektem Enterprise Library. Szczególnie warte polecenia są znajdujące się tam webcasty poświęcone Enterprise Library 3.x oraz cykl screencastów na stronie Davida Haydena pnpguidance.net. Po więcej szczegółów oraz niezbędne linki zapraszam na stronę wprowadzającą w konkurs.

    Refaktoryzacja do Validation Application Block (VAB)

    Przypadek

    Walidacja wykonywana jest w kodzie widoku, a także w warstwie domenowej. Brak spójnej polityki reguł poprawności.

    Rozwiązanie

    Zlokalizuj walidację danych w jednym miejscu, skorzystaj z możliwości deklaratywnego definiowania reguł poprawności danych.

    Uzasadnienie

    Weryfikacja danych jest jedną z pierwszych operacji, które wykonujemy na danych dostarczanych nam przez użytkownika. Jest kilka powodów, dla których wykonujemy walidację:

    1. Bezpieczeństwo. Sprawdzamy, czy dane przekazywane przez użytkownika nie spowodują niewłaściwego działania naszej aplikacji. Błędne dane wejściowe mogą stanowić źródło wielu różnych ataków, jak chociażby SQL Injection czy ogólniej script injection.
    2. Poprawność. Gwarantujemy, że system nie będzie przetwarzał błędnych danych. Nasze reguły biznesowe często wymuszają odpowiedni format, zakres, postać, etc. danych. Oczywiście zależy nam, żeby dane były zgodne z wewnętrzną reprezentacją danych, schematami danych, etc.
    3. Wykrycie błędnych danych zatrzymuje dalsze operacje – nierzadko bardzo kosztowne.

    Co nam daje VAB?

    Najlepiej odpowiedzieć sobie na to pytanie obserwując dostępne obecnie mechanizmy walidacji danych. Zazwyczaj korzystamy z różnego rodzaju walidatorów ściśle związanych z UI, co zmusza do umieszczania logiki walidacji w wielu różnych miejscach aplikacji – 'na wejściu', przy przetwarzaniu danych pochodzących z formularzy oraz przy przekazywaniu danych dalej – przetwarzając odpowiednie reguły biznesowe. W oczywisty sposób takie podejście może prowadzić do braku konsystencji i stosowania różnych reguł określających poprawność danych. To, co nam oferuje VAB to właśnie utrzymanie spójnych reguł poprawności. Teraz wszystkie te reguły możemy określać programowo (tak jak ma to miejsce w klasycznym podejściu), korzystając z atrybutów, bądź bezpośrednio w plikach konfiguracyjnych. W czasie działania naszej aplikacji mamy do dyspozycji możliwość przełączania się między różnymi zestawami reguł poprawności i stosować je zgodnie z naszymi wymaganiami. Enterprise Library dostarcza nam integrację z Windows Forms, ASP.NET oraz WCF, kontrolka do integracji z WPF dostępna jest w ramach bliźniaczego projektu EntLib Contrib.
    Enterprise Library zawiera zestaw umożliwiający zarządzanie konfiguracją przy użyciu Group Policy lub WMI, o czym pisałem już w jednym z tekstów na blogu. Niestety VAB oraz PIAB nie są obsługiwane przez te mechanizmy.

    Sposób wykonania

    1. Przeniesienie metod walidujących z widoku do klas odpowiedzialnych za logikę.
      1. W klasie widoku, dla każdej klasy biznesowej wyodrębnij metodę realizującą walidację.
        To jest bardzo ważny krok – zlokalizowanie wszystkich konstrukcji warunkowych w których zapisane są reguły poprawności dla danej klasy z modelu danych.
      2. Wykonaj przemieszczenie metody do odpowiedniej klasy biznesowej.
        Bułka z masłem :).
      3. Wprowadź Enterprise Library, dodając do projektu odpowiednie referencje do bibliotek Enterprise Library. Zmień sygnaturę metody oraz dodaj atrybut HasSelfValidation do klasy i SelfValidation do metody walidującej. Skorzystaj z Validation Facade do przeprowadzenia walidacji.
        Od tej pory zaczyna się zabawa. Dzięki zastosowaniu SelfValidation otwieramy się na walidację opartą o atrybuty, a jednocześnie pozostawiamy sobie możliwość stosowania bardziej złożonych reguł poprawności danych bezpośrednio w kodzie.
      4. Rozłóż metodę walidującą na kilka metod, po jednej dla każdej właściwości, starając się aby w jednej metodzie obsługiwana była jedna właściwość i opatrz każdą z metod atrybutem SelfValidation. Spodziewaj się złożonego wyniku walidacji.
        W tym kroku rozdzielamy operacje walidacji dla poszczególnych właściwości. Od tej pory każdy z elementów zgłasza swój zestaw komunikatów o błędach walidacji i jesteśmy to w stanie odebrać w kodzie realizującym widok.
      5. W każdej z metod walidujących wykorzystaj odpowiednią klasę walidującą, lub ich kombinację i zastosuj je dla odpowiedniej właściwości.
        Ostatni krok przed zastosowaniem atrybutów dla właściwości. W tym momencie dobrze jest zastanowić się nad koniecznością wprowadzenia niestandardowego walidatora, którego moglibyśmy użyć do wykonania bardziej złożonej walidacji (np. PasswordComplexityValidator).
    2. Przejście z walidacji imperatywnej na deklaratywną Przeniesienie szczegółów walidacyjnych do pliku konfiguracyjnego.
      1. Każdą z metod walidujących zastąp w miarę możliwości odpowiednimi atrybutami zastosowanymi do walidowanych właściwości.
        Domyślnie atrybuty realizują And Composite Validator, więc nie musimy tego walidatora umieszczać pośród innych atrybutów. Warto również pamiętać o tym, że środowisko nie gwarantuje nam kolejności, w jakiej zostanie przeprowadzona walidacja poszczególnych właściwości (ani kolejności, w jakiej będą kolejne właściwości walidowane).
        Te metody, które nie znajdą swoich odpowiedników w atrybutach właściwości pozostawiamy na miejscu. Dzięki [SelfValidation] dalej będą podlegać walidacji opartej o atrybuty. Jeśli jednak udało nam się przenieść wszystkie metody opisane atrybutem [SelfValidation] do odpowiednich atrybutów właściwości, możemy spokojnie usunąć atrybut [HasSelfValidation] dla klasy.
        Jeśli w tym momencie mamy jeszcze dodatkowe konstruktory wieloparametrowe, lub inne metody pomocnicze, w których przeprowadzamy walidację, to czas najwyższy się ich pozbyć.Więcej szczegółów uzasadniających takie podejście można znaleźć w pozycji [CWALINA]. W przypadku stosowania walidacji opartej o atrybuty właściwości, podejście 'domyślny konstruktor-> kolejne właściwości' wydaje się być najrozsądniejsze.
      2. Przenieś każdy z atrybutów walidacyjnych do pliku konfiguracyjnego korzystając z narzędzia Enterprise Library Configuration. Dodaj plik zasobów i zdefiniuj odpowiednie komunikaty.
        Oczywiście, część atrybutów, nad którymi my jako programiści chcemy mieć kontrolę możemy zostawić i w ten sposób stosować walidację opartą zarówno na pliku konfiguracyjnym jak i atrybutach. Tu należy pamiętać, że w przypadku kolidujących ze sobą reguł, obowiązujące są te zdefiniowane w pliku konfiguracyjnym.
      3. Dodaj obiekt klasy ValidationProvider do formularza i wykorzystaj kontrolkę ErrorProvider do wyświetlenia odpowiednich komunikatów o błędach walidacji.
        (WinForms specific! Poza integracją z WinForms dostępna jest jeszcze kontrolka dla ASP.NET oraz rozwiązanie dla WCF)
        Prawdopodobnie mamy już na formularzu jakieś ErrorProvidery, jednak teraz możemy skorzystać z kontrolki integracyjnej EntLib z WinForms i wykorzystać moc drzemiącą w walidatorach. Kontrolki integracyjne możemy dodać do zakładek designera sięgając do Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WinForms.dll (dla WinForms) oraz Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.dll (dla ASP.NET).

    Przykład

    Rys 1. Przykładowy formularz

    //class UserForm
    private void Add_Click(object sender, EventArgs e)
    {
      //check for rules
      //Len(Pass) > 0, < 10
      //email contains '@' & '.'
      if (!String.IsNullOrEmpty(UserFirstName.Text)
        && !String.IsNullOrEmpty(UserLastName.Text)
        && !String.IsNullOrEmpty(UserEmail.Text)
        && !String.IsNullOrEmpty(UserPassword.Text)
        && (UserPassword.Text.Length > 0 && UserPassword.Text.Length < 10)
        && (UserEmail.Text.IndexOf('@') > -1)
        && (UserEmail.Text.IndexOf('.') > -1))
      {
        User user = new User();
        user.FirstName = UserFirstName.Text;
        user.LastName = UserLastName.Text;
        user.Email = UserEmail.Text;
        user.Password = UserPassword.Text;
        UserDAO userDao = new UserDAO();
        userDao.Add(user);
      }
      else
        MessageBox.Show("Invalid data!");
    }

    //class UserDAO
    public class UserDAO
    {
      public void Add(User user)
      {
        //user should be valid in here.
      }
    }

    1. W klasie widoku dla każdej klasy biznesowej reprezentowanej na formularzu wyodrębnij metodę realizującą walidację.

      //class UserForm
      private void Add_Click(object sender, EventArgs e)
      {
        User user = new User();
        user.FirstName = UserFirstName.Text;
        user.LastName = UserLastName.Text;
        user.Email = UserEmail.Text;
        user.Password = UserPassword.Text;

        if (!ValidUser(user))
          MessageBox.Show("Invalid data!");
        else
        {
          UserDAO userDao = new UserDAO();
          userDao.Add(user);
        }
      }

      private bool ValidUser(User user)
      {
        //check for rules
        //Len(Pass) > 0, < 10
        //email contains '@' & '.'
        if (!String.IsNullOrEmpty(user.FirstName)
          && !String.IsNullOrEmpty(user.LastName)
          && !String.IsNullOrEmpty(user.Email)
          && !String.IsNullOrEmpty(user.Password)
          && (user.Password.Length > 0 && user.Password.Length < 10)
          && (user.Email.IndexOf('@') > -1)
          && (user.Email.IndexOf('.') > -1))
        {
          return true;
        }
        else return false;
      }

    2. Wykonaj przemieszczenie metody do odpowiedniej klasy biznesowej.

      //class UserForm
      private void Add_Click(object sender, EventArgs e)
      {
        User user = new User();
        user.FirstName = UserFirstName.Text;
        user.LastName = UserLastName.Text;
        user.Email = UserEmail.Text;
        user.Password = UserPassword.Text;

        if (!User.ValidUser(user))
          MessageBox.Show("Invalid data!");
        else
        {
          UserDAO userDao = new UserDAO();
          userDao.Add(user);
        }
      }

      //class User
      public static bool ValidUser(User user)
      {
        //check for rules
        //Len(Pass) > 0, < 10
        //email contains '@' & '.'
        if (!String.IsNullOrEmpty(user.FirstName)
          && !String.IsNullOrEmpty(user.LastName)
          && !String.IsNullOrEmpty(user.Email)
          && !String.IsNullOrEmpty(user.Password)
          && (user.Password.Length > 0 && user.Password.Length < 10)
          && (user.Email.IndexOf('@') > -1)
          && (user.Email.IndexOf('.') > -1))
        {
          return true;
        }
        else return false;
      }

    3. Wprowadź Enterprise Library. Zmień sygnaturę metody oraz dodaj atrybut HasSelfValidation do klasy i SelfValidation do metody walidującej.
      Skorzystaj z Validation Facade do przeprowadzenia walidacji.

      //class UserForm
      private void Add_Click(object sender, EventArgs e)
      {
        User user = new User();
        user.FirstName = UserFirstName.Text;
        user.LastName = UserLastName.Text;
        user.Email = UserEmail.Text;
        user.Password = UserPassword.Text;

        //Validation Facade
        ValidationResults results = Validation.Validate(user);

        if (!results.IsValid)
        {
          MessageBox.Show("Invalid data!");
        }
        else
        {
          UserDAO userDao = new UserDAO();
          userDao.Add(user);
        }
      }

      //class User
      [HasSelfValidation]
      public class User {
      ...
      [SelfValidation]
      public void Validate(ValidationResults results)
      {
        if (String.IsNullOrEmpty(FirstName)
         || String.IsNullOrEmpty(LastName)
         || String.IsNullOrEmpty(Email)
         || (Email.IndexOf('@') == -1)
         || (Email.IndexOf('.') == -1)
         || String.IsNullOrEmpty(Password)
         || (Password.Length == 0 || Password.Length >= 10))
          results.AddResult(
            new ValidationResult("Invalid data!", this, null, null, null));
      }
      }

    4. Rozbij metodę walidującą wszystkie właściwości na kilka metod atomowych operujących na poszczególnych właściwościach, każdą opatrując atrybutem SelfValidation. Spodziewaj się złożonego wyniku walidacji.

      //class User
      [HasSelfValidation]
      public class User {
      ...
      [SelfValidation]
      public void ValidateFirstName(ValidationResults results)
      {
        if (String.IsNullOrEmpty(FirstName))
          results.AddResult(
            new ValidationResult("First name not valid!", this, null, null, null));
      }
      [SelfValidation]
      public void ValidateLastName(ValidationResults results)
      {
        if(String.IsNullOrEmpty(LastName))
          results.AddResult(
            new ValidationResult("Last name not valid!", this, null, null, null));
      }
      [SelfValidation]
      public void ValidateEmail(ValidationResults results)
      {
        if(String.IsNullOrEmpty(Email)
          || (Email.IndexOf('@') == -1)
          || (Email.IndexOf('.') == -1))
          results.AddResult(
            new ValidationResult("Email not valid!", this, null, null, null));
      }
      [SelfValidation]
      public void ValidatePassword(ValidationResults results)
      {
        if (String.IsNullOrEmpty(Password)
          || (Password.Length == 0 || Password.Length >= 10))
          results.AddResult(
            new ValidationResult("Password not valid!", this, null, null, null));
      }
      }

      //class UserForm
      private void Add_Click(object sender, EventArgs e)
      {
        User user = new User();
        user.FirstName = UserFirstName.Text;
        user.LastName = UserLastName.Text;
        user.Email = UserEmail.Text;
        user.Password = UserPassword.Text;

        //Validation Facade
        ValidationResults results = Validation.Validate(user);

        if (!results.IsValid)
        {
          string message = "";
          foreach (ValidationResult error in results)
            message += error.Message + System.Environment.NewLine;
          MessageBox.Show(message);
        }
        else
        {
          UserDAO userDao = new UserDAO();
          userDao.Add(user);
        }
      }

    5. W każdej z metod walidujących wykorzystaj odpowiednią klasę walidującą, lub ich kombinację i zastosuj je dla odpowiedniej właściwości.

      //class User
      [SelfValidation]
      public void ValidateFirstName(ValidationResults results)
      {
        Validator firstNameValidator = new StringLengthValidator(
          1, RangeBoundaryType.Inclusive, 50, RangeBoundaryType.Inclusive);
        results.AddAllResults(firstNameValidator.Validate(FirstName));
      }
      [SelfValidation]
      public void ValidateLastName(ValidationResults results)
      {
        Validator lastNameValidator = new StringLengthValidator(
          1, RangeBoundaryType.Inclusive, 50, RangeBoundaryType.Inclusive);
        results.AddAllResults(lastNameValidator.Validate(LastName));
      }
      [SelfValidation]
      public void ValidateEmail(ValidationResults results)
      {
        Validator emailValidator = new RegexValidator(
         @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
        results.AddAllResults(emailValidator.Validate(Email));
      }
      [SelfValidation]
      public void ValidatePassword(ValidationResults results)
      {
        Validator passwordValidator = new StringLengthValidator(
          1, RangeBoundaryType.Inclusive, 10, RangeBoundaryType.Exclusive);
        results.AddAllResults(passwordValidator.Validate(Password));
      }

    6. Każdą z metod walidujących zastąp w miarę możliwości odpowiednimi atrybutami zastosowanymi do walidowanych właściwości.

      //class User
      [HasSelfValidation]
      public class User
      {
        string password;
        public string Password
        {
          get { return password; }
          set { password = value; }
        }

        string email;
        [RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")]
        public string Email
        {
          get { return email; }
          set { email = value; }
        }

        string lastName;
        [StringLengthValidator(1, RangeBoundaryType.Inclusive, 50, RangeBoundaryType.Inclusive)]
        public string LastName
        {
          get { return lastName; }
          set { lastName = value; }
        }

        string firstName;
        [StringLengthValidator(1, RangeBoundaryType.Inclusive, 50, RangeBoundaryType.Inclusive)]
        public string FirstName
        {
          get { return firstName; }
          set { firstName = value; }
        }
        [SelfValidation]
        public void ValidatePassword(ValidationResults results)
        {
          Validator passwordValidator = new StringLengthValidator(
            1, RangeBoundaryType.Inclusive, 10, RangeBoundaryType.Exclusive);
          results.AddAllResults(passwordValidator.Validate(Password));
        }

      ...
      }

    7. Przenieś każdy z atrybutów walidacyjnych do pliku konfiguracyjnego korzystając z narzędzia Enterprise Library Configuration. Dodaj plik zasobów i zdefiniuj odpowiednie komunikaty.

      Rys 2. Konfiguracja VAB w app.config.

      //class User
      [HasSelfValidation]
      public class User
      {
        string password;
        public string Password
        {
          get { return password; }
          set { password = value; }
        }

        string email;
        public string Email
        {
          get { return email; }
          set { email = value; }
        }

        string lastName;
        public string LastName
        {
          get { return lastName; }
          set { lastName = value; }
        }

        string firstName;
        public string FirstName
        {
          get { return firstName; }
          set { firstName = value; }
        }
        [SelfValidation]
        public void ValidatePassword(ValidationResults results)
        {
          Validator passwordValidator = new StringLengthValidator(
            1, RangeBoundaryType.Inclusive, 10, RangeBoundaryType.Exclusive);
          results.AddAllResults(passwordValidator.Validate(Password));
        }

      ...
      }

    8. Dodaj obiekt klasy ValidationProvider do formularza i wykorzystaj odpowiedni obiekt klasy ErrorProvider do wyświetlenia odpowiednich komunikatów o błędach walidacji.

      Rys 3. VAB Error Provider w akcji.

      Rys 4. Właściwości kontrolki Validation Provider w oknie designera.

      Rys 5. Rozszerzenie TextBoxa o właściwości powiązane z VAB.
       

      1. Ustaw dla formularza właściwość AutoValidate: EnableAllowFocusChange.
      2. Dodaj do formularza ValidationProvider oraz ErrorProvider.
      3. Ustaw następujące właściwości dla dodanego ErrorProvidera:
        (Name): UserErrorProvider
      4. Ustaw następujące właściwości dla dodanego ValidationProvidera:
        (Name): UserValidationProvider
        ErrorProvider: UserErrorProvider
        RulesetName: BaseRuleSet
        SourceTypeName: ZineNet.VABRefactorIllustrated.BL.User, ZineNet.VABRefactorIllustrated
      5. Dla pola tekstowego UserFirstName ustaw:
        SourcePropertyName on UserValidationProvider: FirstName
        PerformValidation on UserValidationProvider: true
        Dla pozostałych pól tekstowych ustaw odpowiednie właściwości.

    [CWALINA] "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries". Krzysztof Cwalina, Brad Adams, Sep 19, 2005 by Addison Wesley Professional.

    Zadanie konkursowe #3 – Validation Application Block, Enterprise Library 3.1

    Zgodnie z obietnicą i założeniami konkursu na koniec zadania do wykonania

    Zgodnie z opisanymi powyżej krokami zrefaktoryzować kod aplikacji konkursowej tak, aby obsługa walidacji w warstwie widoku została przeniesiona do modelu danych i konfigurowana za pomocą pliku app.config. W szczególności:

    1. Walidacja danych związanych z klientem (klasa Customer) powinna obejmować pola:

      Pole Warunek
      Imię Nie dłuższe niż 25 znaków, zaczyna się od dużej litery, dozwolone są jedynie małe i duże litery alfabetu polskiego oraz może zawierać spację i myślnik
      Nazwisko j.w.
      Email Spełnia wymagania zgodnie z odpowiednim RFC :)
      Data urodzin Interesują nas osoby między 15 a 50 rokiem życia
      Adres pocztowy Ciąg znaków nie dłuższy niż 50 znaków

    2. Należy wykorzystać kontrolki ValidationProvider i ErrorProvider do informowania o błędnych danych;
    3. Walidacja imienia, emaila i adresu pocztowego powinna być sterowana plikiem konfiguracyjnym;
    4. Data urodzin podlega walidacji sterowanej atrybutami;
    5. Nazwisko podlega walidacji w kodzie.

    Uwagi

    1. Zalecane wykorzystanie pliku zasobów do przechowywania komunikatów o błędach aplikacji;
    2. W przykładowym kodzie wykonany jest dodatkowy krok związany z wprowadzeniem PIAB, nie należy tego robić w rozwiązaniu;

    Rozwiązane zadania należy przesyłać na adres mgrzeg at gmail kropka com. Reguły wiadomości:

    1. Temat wiadomości: [ENTLIB VAB] Rozwiązanie zadania konkursowego;
    2. Treść (może być w załączonym pliku .txt, .doc, .rtf) powinna zawierać krótki opis co zostało wykonane;
    3. Plik .zip zawierający kod aplikacji konkursowej po refaktoryzacji. Można dołączyć również kod wykonywalny (bez bibliotek EntLib, etc. - tylko to, co niezbędne);
    4. Dane adresowe do wysyłki nagrody - NIE! Skontaktujemy się ze "szczęśliwcem" via email i ustalimy szczegóły.

    Adresy

    W razie wątpliwości etc. proszę zadawać pytania.

    Powodzenia!

  • Wyniki konkursu - Etap I - LAB.

    Enterprise Library - Logging Application Block

    W odpowiedzi na pierwsze zadanie konkursowe dotyczące LAB dostaliśmy 4 odpowiedzi, wszystkie prawidłowe! Oto lista osób, które nadesłała nam swoje prace (chronologicznie względem daty wysłania):

    1. Dawid Węgrzyn 
    2. Sebastian Szmigielski
    3. Dariusz Tarczyński
    4. Marcin Krupiński

    Zgodnie z założeniami, kartka z nazwiskiem Dawida pojawiła się dwa razy w czapce losującej :)
    Losowanie nagrody odbyło się na X Spotkaniu Warszawskiej Grupy .NET, a zdjęcia z tego wydarzenia można obejrzeć na stronach picasaweb.

    W wyniku szczęśliwego trafu, zwycięzcą I-ego Etapu Konkursu został Marcin Krupiński. Gratulujemy!

    Przy okazji przypominam, że w konkursie dalej wszyscy mogą brać udział, chociaż tym razem Marcin już nie będzie brał udziału w losowaniu :(
    Na pocieszenie dla pozostałych uczestników: Głowa do góry! Przy podobnym odzewie w następnych turach, każdy będzie miał swoją nagrodę :)

    Przy okazji pytanie - ile czasu zajęło Wam rozwiązanie zadania? Był ktoś, kto zaczął coś robić, nie skończył i nie podesłał nam nic?

  • Społeczności, grupy pasjonackie... luźne rozważania

    Poniżej trochę moich notatek dotyczących społeczności internetowych - online i live. Staram się jakoś parę rzeczy usystematyzować w swojej główce, mam nadzieję, że pomożecie mi w tym. :))

    Awangarda.

    Z moich dotychczasowych doświadczeń i obserwacji wynika, że w każdej społeczności, która tworzy zwartą i mocną strukturę, występuje co najmniej jedna grupa, którą roboczo określę mianem 'Awangardy'.
    Siłą Awangardy może być jeden, lub kilku pasjonatów, którzy zapełniają ponad 80% ruchu, stanowiąc mniej, niż 20% populacji. Jest kilka cech tej grupy, które są łatwo dostrzegalne:

    1. Autorytet
    2. Charyzma
    3. Kreatywność
    4. Dążenie do osiągania jasno określonych celów, droga do nich nie ma znaczenia
    5. Indywidualizm
    6. Wyjątkowe traktowanie każdego, kto w jakikolwiek sposób reaguje na działania tej grupy
    7. Silna wiara we własne możliwości, przekonanie o słuszności podejmowanych działań
    8. ‘Gra w jednym teamie’

    Ktoś mógłby spytać – czym kieruje się Awangarda w swoich działaniach, jakich korzyści szuka? W moim odczuciu to grupa ‘Ideowa’, której zależy głównie na wystrzeleniu z siebie tego co mają na końcu mózgu. Tym ludziom ciągle pracują malutkie trybiki w mózgach, sama myśl, że ‘na próżno’, jest dla nich przerażająca. Oczywiście dochodzi do tego pewnego rodzaju chęć pokazania siebie, poprawienia swojego wizerunku, bądź kokieteria i chęć wzmocnienia wiary w siebie kosztem pozostałych członków społeczności.

    Jednak sama Awangarda to jeszcze za mało. Drugą, bardzo ważną grupą są

    Odbiorcy

    Są to konsumenci produktów wytworzonych przez Awangardę. Wspierają ją ‘nogami’, dodając komentarze do wypowiedzi, wysyłając maile, przychodząc na spotkania grup, proponując własne rozwiązania, etc.

    Odbiorcy kierują się głównie pragmatyzmem – praca awangardy może ułatwić im ich własne działania. Są ‘leniwi’, przelewają ciężar pracy na awangardę, jednak co chwila podsycają ją nowymi reakcjami i dają do zrozumienia silną potrzebę pewnych rozwiązań nad którymi pracuje Awangarda.

    Awangarda jest w swoistej symbiozie z Odbiorcami – jedni i drudzy istnieją dzięki sobie, karmiąc się wzajemnie.

    I na dobrą sprawę obie te grupy w zupełności wystarczają do stworzenia tworu, jakim jest community, jednak do tego, żeby ten stwór był sprawny i się rozwijał, potrzebne są dodatkowe ‘byty’.

    Sponsorzy

    To grupa osób, która wierzy w działania Awangardy, jednak kieruje się nieco innymi przesłankami, niż Odbiorcy przy wspieraniu działań Awangardy. Zazwyczaj szuka w nich pewnych korzyści dla siebie samych, dla rozwiązań, które chcą wypromować.

    Zależności między społecznościami.

    Żeby sprawę nieco skomplikować, dodajmy zależności między różnymi społecznościami. Okazuje się, że często osoba będąc w jednej społeczności w grupie Awangardy, w innej występuje jako Odbiorca, lub Sponsor. Śmiem twierdzić, że ktoś, kto występuje w przynajmniej jednej grupie jako Awangarda, pełni również pozostałe funkcje w innych społecznościach. Bardzo często społeczności przenikają się, podsuwają sobie rozmaite pomysły pozwalające na ewolucję społeczności.

    Krach Społeczności

    Do tego, aby społeczność przestała funkcjonować musi nastąpić zerwanie związku symbiotycznego. Jeżeli którakolwiek z grup zrywa wspomnianą wcześniej więź, Społeczność ulega powolnemu rozpadowi. Społeczność podlega uwstecznieniu (lecz nie upadkowi!!) po odsunięciu się Sponsorów.

    Pytanie zasadnicze: czy technologia na której pracuje dana społeczność ma znaczenie dla jej funkcjonowania?
    W moim odczuciu w ramach Awangardy każda technologia pozwalająca na sprawną wymianę myśli jest odpowiednia. To jest warunek konieczny i wystarczający do tego, żeby Awangarda mogła i chciała coś robić.
    W przypadku pozostałych grup wymagania są jednak wyższe. Odbiorcom nie wystarcza już zbiór plików na serwerze ftp - to jest 'zbyt czerstwe' i nie zachęca do korzystania. Sponsorzy muszą mieć dodatkowo możliwość promowania siebie - wymagania więc rosną.

    Konkludując - spoiwem Społeczności jest technologia. Jeżeli nie spełnia ona oczekiwań którejkolwiek z wymienionych grup, Społeczność ulega uwstecznieniu, lub powolnemu rozpadowi.

    Google Groups

    Moim zdaniem Google Groups (groups.google.com) są najlepszym przykładem technologii stanowiącej bardzo dobre spoiwo społeczności live oraz w ograniczonym stopniu online (brakuje bardziej zaawansowanych funkcjonalności wspierających wymianę myśli, typu blogi, wiki, etc).

    opublikowano 30 września 2007 02:37 przez mgrzeg | 2 komentarzy
    Filed under:
  • Zine.net offline

    Przepraszam wszystkich za tak długą przerwę w działaniu serwisu. Niestety rozchorowałem się i dopiero przed paroma minutami włączyłem kompa, a tu 'Oops!' :(.

    W sumie wszystko byłoby ok, gdyby nie to, że oczywiście zamiast przeczytać dokumentację hostingową na hostedwindows, byłem mądrzejszy i zamiast wpisać w connectionstringu nazwę serwera 'sql2005.hostedwindows.pl', jechałem na standardowym '(local)'. Całe nieszczęście polegało na zbiegu okoliczności: Ziemek przeniósł serwer SQL na inną maszynę, a ja choruteńki nie miałem jak zareagować :(

    Dziękuję wszystkim, którzy podesłali mi maile/smsy, za czujność oraz pomoc ze strony Ziemka Borowskiego, który pomógł mi wyprowadzić serwis na prostą :)

    A teraz - do pracy! Ktoś już przygotował rozwiązanie pierwszego zadania konkursowego?? ;)

  • ITCore nadciąga!

    Jak zapewne większość światka już wie, z połączenia wss.pl i codeguru.pl zrodzi się w ciągu najbliższych dni nowy serwis - itcore.pl. Dzięki Pawłowi Potasińskiemu zostałem wciągnięty - najpierw w testowanie, a później - przy udziale szerszego grona redakcyjnego - w czynny udział przy tworzeniu zawartości serwisu.

    Nie złamię chyba żadnej tajemnicy, jeśli powiem, że serwis będzie tworzony przez:

    • 9-osobową Redakcję (+ Justyna), prowadzoną przez Redaktora Naczelnego (Paweł) i Zastępcę (Olek)
    • ok. 30-osobową grupę wsparcia, czyli tzw. MCS - ludzie od zawartości i 'codziennej orki', zwani 'Ekspertami':
      1. Maciej Aniserowicz
      2. Jacek Barcikowski
      3. Michał Bednarz
      4. Jakub Binkowski
      5. Ziemowit Borowski
      6. Filip Centowski
      7. Tomasz Filipowicz
      8. Michał Grzegorzewski
      9. Jakub Gutkowski
      10. Marcin Hańczaruk
      11. Jakub Jałbrzykowski
      12. Dariusz Kiszkiel
      13. Artur Korczyński
      14. Sylwester Lewandowski
      15. Jacek Marek
      16. Grzegorz Niemirowski
      17. Tomasz Onyszko
      18. Maciej Paczewski
      19. Bartłomiej Pampuch
      20. Krzysztof Pietrzak
      21. Marcin Samelak
      22. Jacek Segit
      23. Michał Stanisławek
      24. Robert Stuczyński
      25. Marcin Szeliga
      26. Sebastian Waksmundzki
      27. Tomasz Wardziak
      28. Sebastian Wilczewski
      29. Michał Wójcik
      30. Barbara Wróbel
      31. Gabriel Zgirski
      32. Marcin Żołnierek
    • oraz moderatorzy:
      1. Łukasz Foks
      2. Łukasz Herman
      3. Radosław Kępa
      4. Jacek Kochan
      5. Maciej Rudowicz
      6. Tomasz Siwecki
      7. Radosław Zawartko
      8. Daniel Arak

    Jak widać, trafilem do grupy eksperckiej i mam wesprzeć działy developerskie. Nie chcę pisać o sprawach zakulisowych związanych z powstawaniem serwisu - nie zostałem ani do tego upoważniony, ani nie ma to też większego sensu. Po zakończeniu fazy scenariuszy wycofałem się z prac przy testowaniu serwisu, głównie dlatego, że nie mam aż tyle wolnego czasu, co studenci i inni uczestnicy tej zabawy, a obowiązki i inne prace - a i owszem. Dlatego wątek powstawania serwisu zakończę w tym miejscu.

    Co do startu - tak, zostałem zaproszony na imprezę z Justyną Steczkowską Stars, jednak ze względu na porę i raczej słabe możliwości zostawienia dzieciaków nie pojawię się tam ze swoją Małgosią, a samemu - jakoś nie widzę większego sensu. I tak zapowiedziane są kolejne spotkania 'podsumowujące' z udziałem całego teamu itcore, więc niektóre twarze jeszcze zdążę się naoglądać ;) Kolejna sprawa związana ze startem, to odwołanie się do idei 'beta usług' oferowanych w ramach trendu społecznego Web 2.0. Jak dla mnie, mówienie o ITCore na starcie jako 'wersji beta' jest nadużyciem w stosunku do tego terminu, żeby jednak nie wprowadzać atmosfery anarchii, zaznaczę tylko, że mam 'oddzielne zdanie' w tej kwestii.

    Udział w tym projekcie to dla mnie sposób na realizację pomysłów, które do tej pory były co najmniej trudne, jak np. konkursy z nagrodami (takie jak ten), etc. Liczę tu na wsparcie ze strony teamu ITCore, a także innych osób zaangażowanych w ten serwis. Mam nadzieję, że z całej tej masy speców w różnych dziedzinach da się wykrzesać to, co mają najlepszego do zaoferowania i nie będą mnie już nurtować pytania w stylu 'a dlaczego na codeguru jest tak mało publikacji w stosunku do potencjału społeczności i dlaczego żaden z aktywistów nie prowadzi regularnego bloga technicznego?' i tym podobne. Ludzie z WSS już jakiś czas temu zauważyli, że prowadzenie bloga technicznego to jest sposób na poprawienie swoich umiejętności 'pisarskich', a także zakorzenienie się w społecznościach online. Mam zatem nadzieję, że wprowadzą zdrowy 'ferment' na serwisie i ludzie z codeguru poza forum będą funkcjonować na blogach, artykułach, etc.

    Tak czy siak - serwis rusza w nocy z dziś na jutro i chyba warto uczestniczyć w tym wydarzeniu.

    opublikowano 24 września 2007 13:24 przez mgrzeg | 9 komentarzy
    Filed under:
  • Refactor to Enterprise Library 3.1 – Zapowiedź konkursu

    W trakcie wspólnych badań nad Enterprise Library, w gronie kilku osób z Redakcji Zina przygotowaliśmy trochę materiału, który można wykorzystać jako podstawę do małego konkursu poświęconego właśnie temu projektowi. Zdecydowaliśmy się zatem zorganizować konkursik z drobnymi nagrodami, sponsorowanymi przez przyjaciela serwisu.  Ale o tym nieco dalej.

    Enterprise Library jest zestawem bibliotek pozwalających wprowadzać do naszego kodu ‘dobre praktyki’ oparte o sprawdzone wzorce projektowe i rozwiązania architektoniczne, zaproponowane przez zespół P&P Microsoftu. Architekci i programiści wiedzą, że przejście z dowolnego kodu do takiego, który sensownie wprowadza pewne wzorce projektowe nie jest proste i nie istnieje tutaj żaden algorytm realizowalny programowo. Nie jest jednak aż tak źle – zwolennicy metodologii określanych mianem agile ‘zwinnych’ są zaznajomieni z pojęciem ‘refaktoryzacja’, wprowadzonym do informatyki przez Martina Fowlera. Dzięki małym (oraz większym) refaktoryzacjom można bardzo często poprawić jakość i czytelność kodu, sprawiając, że dalsze utrzymanie kodu jest prostsze i przyjemniejsze.

    Refaktoryzacja doczekała się wielu publikacji – żeby wymienić tylko kilka (przetłumaczonych na język polski):

    1. „Refaktoryzacja. Ulepszanie struktury istniejącego kodu”, opierająca się w dużej mierze na wzorcach GoF:
      „Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku”
    2.  „Refaktoryzacja do wzorców projektowych”, sięgająca często do „Architektura systemów zarządzania przedsiębiorstwem. Wzorce projektowe”

    Refaktoryzacja ma również swój serwis internetowy, prowadzony przez Martina Fowlera. Doczekała się również silnego wsparcia software’owe – zarówno w samym Visual Studio, jak i w narzędziach firm trzecich (Resharper, CodeIt.Once, etc.).

    Teksty przygotowane przez nas traktują o sposobach wprowadzenia bloków Enterprise Library do naszego kodu. Często są to notatki, wskazówki, nie mają charakteru ścisłego i sformalizowanego. Wydaje mi się jednak, że są wystarczającym źródłem informacji, pozwalającym na ujarzmienie Enterprise Library i mogą stanowić zachętę do jego wykorzystania. Staraliśmy się trzymać jak najbliżej podejścia zaproponowanego przez Fowlera we wspomnianej wcześniej książce o refaktoryzacji.

    Reguły

    Do rzeczy :) Nie jestem formalistą, przyjęliśmy jednak kilka reguł, które warto znać:

    1. W przyszłym tygodniu (co najmniej tydzień po tej publikacji) pojawi się pierwszy tekst opisujący kroki refaktoryzacyjne pierwszego z wybranych przez nas bloków z Enterprise Library 3.1.
    2. Po każdym z tekstów refaktoryzacyjnych pojawi się pytanie konkursowe, na rozwiązanie którego będzie tydzień. Staraliśmy się, żeby wykonanie każdego z zadań po przeczytaniu tekstu zawierającego kroki refaktoryzacyjne, zajęło maksymalnie 2-3 godziny ‘sezonowemu programiście’, więc tydzień jest w naszym odczuciu wystarczający na znalezienie wolnego czasu i przeprowadzenie samodzielnej refaktoryzacji na dostarczonym przez nas kodzie.
    3. Kolejne teksty będą pojawiały się w odstępach co najmniej tygodniowych, na blogach różnych autorów, oczywiście w ramach serwisu zine.net.pl.
    4. Zadanie konkursowe będzie dotyczyło aplikacji, do źródeł której link pojawi się przy każdym pytaniu konkursowym.
    5. Odpowiedzi konkursowe – kompilowalny kod wynikowy po refaktoryzacji + opis wykonywanych czynności należy nadsyłać na maila: mgrzeg At gmail kropa com. Niech to będzie zip zawierający katalogi Code z kodem i Doc z opisem w