Archive for Maj, 2009

Moje spojrzenie na Code Camp

ccwawa09_140x140.jpg

Fragment „będę na” niestety mogę już zamienić na „byłem na”. Wszystko co dobre tak szybko się kończy, ale mam nadzieję, że za rok doznam powtórki w podobnym stylu.

Do Warszawy wyruszyłem dość wcześnie ponieważ miała to być moja dziewicza podróż zakamarkami stolicy obawiałem się, że mogę nieco błądzić i dlatego postanowiłem zapewnić sobie bufor czasowy. Po 2,5 godziny koszmarnej jazdy małym, ciasnym busikiem w pozycji embrionalnej około godziny 7 postawiłem swoją wielką stopę na Placu Defilad w centrum miasta. ;) Po 20 minutach błądzenia udało mi się odnaleźć odpowiedni przystanek i autobus którym bez przeszkód dotarłem pod samą siedzibę Microsoft – chyba byłem pierwszym oczekującym. :) – I tutaj podziękowania należą się organizatorom, którzy umieścili na stronie internetowej wydarzenia numery autobusów dojeżdżających na miejsce.

Zostałem przywitany przez bardzo miłą Panią, która zaprosiła mnie na skosztowanie przygotowanych specjalnie dla uczestników napojów (kawa, soczki, woda, mleko. :)) – Jestem przekonany, że tego dnia nikt spragniony, ani nawet diabelnie głodny stamtąd nie wyszedł (w połowie konferencji wchłanialiśmy pizze! :)).

„Programowanie równoległe i rozproszone „ – Pan Tomasz Kopacz

Zdecydowanie na ten temat było za mało czasu. Dużo informacji, moim zdaniem przekaz był jasny i zrozumiały. Dowiedzieliśmy się jakiego rodzaju narzędzia znajdują się w .NET 4.0 oraz jaki będzie kierunek dalszego rozwoju programowania równoległego.

Ogólną ocenę przyznaje 8/9

„Media w Silverlight – dostarczanie niezapomnianych wrażeń” – Panowie Piotr Czekała, Krzysztof Bartkowski

Generalnie o Silverlight nie mam zbyt wielkiego pojęcia. Wiem tylko, że to co zazwyczaj widzę w internecie i jest wykonane dzięki tej technologii wygląda w większości przypadków imponująco. Panowie zdecydowanie to potwierdzili. Bardzo fajny opis wykorzystywanych narzędzi i technologii – poparty faktycznie zapierającymi dech w piersiach przykładami. :) Jednak było coś co mi strasznie przeszkadzało podczas tej prelekcji – jeden z prowadzących ciągle trzymał rękę w kieszeni – odruch nerwowy który zdecydowanie powinien poprawić.

Ogólną ocenę przyznaję 7/9

„Wyjątki kontrolowane w C#” – Pan Bartłomiej Legiędź – Zwycięzca Speaker Idola – Łódź.

Ta sesja podobała mi się najbardziej. Jasno zwięźle i na temat. Nieoceniona dawka informacji w pigułce.
Projekt nad którym pracuję Pan Bartłomiej:
Exceptional Plugin
Książkę którą polecił podczas prelekcji i po którą myślę, że za jakiś czas sięgnę ;):
Framework Design Guidelines – Krzysztof Cwalina, Brad Abrams

Ogólną ocenę przyznaję 9/9 :)

„ Ile cukru w cukrze – IronPython i jego zastosowania” – Pan Michał Żyliński

Wprawdzie prowadzący nie przekonał mnie do IronPythona, ale dał dobry wstęp do programowania w tym języku. Pod koniec sesji przedstawił bardzo ciekawy program prowadzony przez Microsoft skierowany do niewielkich firm dzięki któremu mogą przyśpieszyć swój rozwój – Zachęcam do zapoznania się ze szczegółowymi informacjami na stronie internetowej: BizSpark

Ogólną ocenę przyznaję 7/9

„Designer + Programista = Produkt Problem + Pomysł = Aplikacja” – Pan Andrzej Piotrowski – Zwycięzca Speaker Idola – Warszawa

Po tej sesji kolega siedzący obok zapytał mnie jak to możliwe, że ten Pan wygrał speaker idola… Może tragedii nie było, ale najsłabsza sesja. Chwilami czułem jak by prowadzący, nie wiedział o czym mówi. Być może jak sam powiedział zaraz po sesji, był to jego zły dzień.

Ogólną ocenę przyznaję 5/9

Ogólnie całej konferencji przyznaję ocenę 8/9 :)

Pierwsza praca

Nadszedł czas kiedy obowiązki związane ze szkołą mogę odsunąć na dalszy plan. Zbliża się mój ostatni semestr studiów, a wraz z nim szereg przedmiotów którym nie będę musiał poświęcać stu procentowej uwagi. Postanowiłem, więc rozpocząć poszukiwania swojej pierwszej pracy i podzielić się tą nieodpartą chęcią właśnie tutaj. Należę do grona osób które podczas studiów skupiały się na nauce, rozwoju własnej osoby, w moim przypadku mogę jeszcze dodać setki godzin spędzonych w domu nad pogłębianiem umiejętności programistycznych (w końcu studia to tylko zarys wielu zagadnień itd.). Skoro prawie nie mam udokumentowanego doświadczenia (napisałem tutaj „prawie” ponieważ mam za sobą 1 miesiąc praktyki podczas której zajmowałem się implementacją niewielkiego programu raportującego, ale czy warto o tym wspominać w CV…) , a te które posiadam zostało zdobyte podczas trwających jeszcze studiów (czyli tzw.„doświadczenie akademickie„) to czym mam zachęcić pracodawcę, aby pozwolił mi się zmierzyć z rozmową wstępną na stanowisko programistyczne? Co może być moją rekomendacją? Te pytania dręczą mnie od dłuższego czasu.

Może?

  • setki godzin spędzonych nad rozwiązywaniem problemów implementacyjnych związanych
    z zadaniami szkolnymi, pojawiającymi się na forum codeguru.pl, csharp.pl
  • chęć wejścia na ścieżkę certyfikacyjną poprzez uczestnictwo w zajęciach „Study Group 70-536” organizowanych wspólnymi siłami wielu osób na mojej uczelni
  • CV – w którym zapewne jedyne co mogę zrobić to wymienić to z czym zetknąłem się podczas pracy nad własnym rozwojem
  • każdy wpis, każdy komentarz na tym blogu
  • wiele podziękowań od kolegów i koleżanek na mojej uczelni za pomoc w ciągłej ich walce z programowaniem
  • etc.

Jeśli odwiedzających ten oto blog (pracodawcy i nie tylko) taka rekomendacja przekonuje-zapraszam z przyjemnością zmierzę się z rozmową wstępną, z przyjemnością dam z siebie wszystko, bo jeśli już coś robię to wkładam w to maksimum energii.

Z poważaniem
Piotr Zarzycki

Dżemik z egzotycznych owoców – Abstract Factory :)

Zgodnie z zapowiedzią prezentuję własną interpretację jednego z zadań kończącego rozdział książki p.t. „C# 3.0 Design Patterns.”. Rozdział ten dotyczył wzorca projektowego „Abstract Factory”.

Delikatny zarys tego czym chcę się podzielić:

  • Krótko o tworzeniu własnych typów generycznych w C#
  • Zadanie, opis wzorca
  • Implementujemy, produkujemy (jemy i sprzedajem ;))

Typy generyczne:

W języku C# mamy możliwość tworzenia własnych typów generycznych.

class MyGenericType<T>
{
      private T _t;
}

Powyższa klasa daje możliwość zdefiniowania typu na jakim będzie mogła operować. Dodatkowo mamy możliwość nadawania ograniczeń na typy podawane podczas inicjalizacji obiektu.

 class MyGenericType<T> where T : IOperation, new()
{
        private T _t;
}

Ograniczenie to oznacza, że typ na którym będzie operowała klasa „MyGenericType” musi implementować interfejs IOperation, oraz jest zobowiazana posiadać jawnie zadeklarowany konstruktor.

Zadanie i opis wzorca:

Jeden z rozdziałów książki traktował o wzorcu projektowy „Factory Method” – przykład prezentujący działanie wzorca był opisem zdjęcia obrazującego źródło dostaw owoców awokado. Owoce te były dostarczane z różnych krajów Afryki. Zadanie kończące rozdział o wzorcu projektowym „Abstract Factory” odnosi się właśnie do tego zdjęcia – Należy wykorzystać „Abstract Factory” i opisać poniższą sytuację.

abstactfactory.png

Abstract Factory jest to wzorzec udostępniający instancje obiektów z istniejącej rodziny klas (Mam tutaj na myśli klasy dziedziczące po wspólnej klasie, wspólnym interfejsie). Obiekty te są odizolowane od klienta nimi zainteresowanego, co daje możliwość ich wymiany podmieniając tylko ich fabrykę. „Abstract Factory” to wzorzec który odpowiada za to co jest tworzone, a nie jak jest tworzone.

Implementujemy, produkujemy (jemy i sprzedajem ;))

Postanowiłem puścić wodzę fantazji i rozpocząłem budowę fabryki od zdefiniowania jej odpowiedzialności. Powstał genericsowy interfejs wraz z poniższymi ograniczeniami.

Interfejs „IAfricaFactory”:

interface IAfricaFactory<AfricaFruit>
        where AfricaFruit : IAfricaFruit, new()
{
     IInfoFruit GetNorthAfricaFruit();
     IInfoFruit GetSouthAfricaFruit();
     IOperationFruit GetROSA();
     IOperationFruit GetSudan();
}

Poszczególne metody będą zwracać instancję obiektów które implementują takie oto dwa interfejsy.

Interfejs „IInfoFruit”:

 interface IInfoFruit
 {
     string PriceFruit { get; }
     Quality QualityFruit { get; }
}

Interfejs „IOperationFruit”:

 interface IOperationFruit
 {
     string Marmalade();
     string OnSale();
}

Fabryka ma dostarczać i przetwarzać owoce nim jednak rozpocząłem ich tworzenie powstał interfejs zlecający im odpowiedzialność :)

Interfejs „IAfricaFruit”

interface IAfricaFruit
{
     string Price { get; }
     Quality QualityFruit { get; }
     string Marmelade();
     string OnSale();
}

Owoce:

Klasa „Avocado”:

class Avocado : IAfricaFruit
{
     #region IAfricaFruit Members
     public string Price
     {
        get
        {
            return "10 zl za kilogram";
        }
     }

     public Quality QualityFruit
     {
         get
         {
             return Quality.Druga;
         }
     }

     public string Marmelade()
     {
         return "Dżemik z avocado! :)";
     }

     public string OnSale()
     {
          return "Dżemik z owoców avocado sprzedajemy po: " + Price;
     }
     #endregion

     public override string ToString()
     {
          return "Avocado";
     }
}

Podobnie powstawały klasy „Banana” oraz „Lemon”. Następnie stworzyłem konkretną fabrykę(klasę) generyczną implementującą interfejs „IAfricaFactory”. Metody tworzą instancję klas implementujących intefejsy „IInfoFruit” oraz „IOperationFruit”.

Klasa „AfricaFactory”

class AfricaFactory<AfricaFruit> : IAfricaFactory<AfricaFruit>
        where AfricaFruit : IAfricaFruit, new()
{
     #region IAfricaFactory<AfricaFruit> Members
     public IInfoFruit GetNorthAfricaFruit()
     {
         return new NorthAfrica<AfricaFruit>();
     }

     public IInfoFruit GetSouthAfricaFruit()
     {
         return new SouthAfrica<AfricaFruit>();
     }

     public IOperationFruit GetROSA()
     {
         return new RepublicOfSouthAfrica<AfricaFruit>();
     }

     public IOperationFruit GetSudan()
     {
         return new Sudan<AfricaFruit>();
     }
     #endregion
}

Moja fabryka potrzebowała już tylko „kontaktu” z konkretnymi częściami bądź krajami Afryki. :)

Klasa „NorthAfrica”:

class NorthAfrica<AfricaFruit> : IInfoFruit
        where AfricaFruit : IAfricaFruit, new()
{
     private AfricaFruit _africaFruit;

     public NorthAfrica()
     {
           _africaFruit = new AfricaFruit();
     }
     #region IInfoFruit Members
     public string PriceFruit
     {
          get
          {
               return _africaFruit.Price;
          }
     }

     public Quality QualityFruit
     {
          get
          {
               return _africaFruit.QualityFruit;
          }
     }
     #endregion
}

Klasa implementuje interfejs „IInfoFruit”. Właściwości spełniające wymagania interfejsu „sięgają” do obiektu którego typ zostanie określony podczas tworzenia egzemplarza tej oto klasy, jednak jest pewne, że dostarczony typ musi implementować interfej „IAfricaFruit” oraz musi zawierać zadeklarowany jawnie konstruktor. Obiek dostarczanego typu tworzę w konstruktorze klasy „NorthAfrica”

Klasa „RepublicOfSouthAfrica”:

class RepublicOfSouthAfrica<AfricaFruit> : IOperationFruit
        where AfricaFruit : IAfricaFruit, new()
{
     private AfricaFruit _africaFruit;

     public RepublicOfSouthAfrica()
     {
          _africaFruit = new AfricaFruit();
     }

     public string Marmalade()
     {
          return _africaFruit.Marmelade();
     }

     public string OnSale()
     {
            return _africaFruit.OnSale();
     }
}

Klasa implementuje interfejs „IOperationFruit”. Tak samo jak w klasie „NorthAfrica” sięgam do zwartości typu który zostanie dostarczony podczas tworzenia egzemplarza klasy. Podobnie powstały klasy „SouthAfrica” (implementuje interfejs „IInfoFruit”) oraz „Sudan” (implementuje interfejs „IOperationFruit”). Mam już wszystko czego potrzebuję. Pozostaję tylko sprzedawać i jeść pyszny dżemik z owoców afrykańskich. ;)

Wywołanie:

//Fabryka Avocado
IAfricaFactory<Avocado> factoryOfBanana = new AfricaFactory<Avocado>();
//Dostarczam instancje obiektu "NorthAfrica"

IInfoFruit northAfrica = factoryOfBanana.GetNorthAfricaFruit();
//Wykorzystuje dostępne wlasciwosci
//aby sprawdzic cene i jakosc owocow

Console.WriteLine(northAfrica.PriceFruit);
Console.WriteLine("Jakość owoców: {0}", northAfrica.QualityFruit);
 //20zl za kilogram
//Jakosc owocow: Pierwsza

IOperationFruit RPA = factoryOfBanana.GetROSA();
//Po ile sprzedajemy :)
string p = RPA.OnSale();
Console.WriteLine(RPA.OnSale());
//Dżemik!!
string d = RPA.Marmalade();
Console.WriteLine(RPA.Marmalade());

//Dzemik z owocow avocado sprzedajemy po: 10 zl za kilogram
 //Dzemik z avocado! :)

Do fabryki możemy dostarczać kolejne owoce (klasy). Ważne jest aby każdy dostarczony typ do utworzonej przy użyciu typów generycznych fabryki implementował interfejs IAfricaFruit. :) Miłego analizowania. ;)