Podsumowanie Wiosny w Chmurach

Podsumowanie Wiosny w Chmurach

Długo nic nie pisałem na moim blogu… Cóż mamy do czynienia z paradoksem gdzie po zakończeniu sesji mam znacznie mniej czasu niż podczas niej 😛

Postaram się jednak zaległości nadrobić i przez wakacje nawrzucać paręnaście postów.

Zacznę spóźnionym trochę podsumowaniem cyklu wydarzeń ‚Wiosna w Chmurach’, który organizowałem wraz z firmą Kainos dla trójmiejskich studenckich Grup .NET

Zachęcam do przeczytania 🙂 A jeśli braliście udział w cyklu (byliście na warsztatach, prelekcjach) – opiszcie swoje wrażenia w komentarzach.

[Niedzielny Tip]Wyszukiwanie kontrolek o danym typie

Mimo, że późno to niedziela jeszcze nie minęła Uśmiech więc kolejny niedzielny tip – prosta funkcja wyszukująca wśród dzieci danej kontrolki, dzieci o danym typie. Przykładowo z kontrolki Grid o nazwie ‘content’ chcemy pobrać wszystkie buttony.

Funkcja będzie extension metod, tak jak przy przełączaniu visibility obiektu z TEGO wpisu. Nie jej wywołanie wygląda w ten sposób:

var buttons = content.FindVisualChildren<Button>();

Jak możemy zauważyć jest to funkcja generyczna, przy wywołaniu której podajemy typ w nawiasach ostrokątnych. W tym przypadku chcemy by typ był klasy DependencyObject, oraz wszystkich klas dziedziczących po niej (chcemy wszak wyszukiwać kontrolki).

Funkcja będzie wyglądać więc tak:

public static IEnumerable<T> FindVisualChildren<T>(this DependencyObject depObj) 
where T : DependencyObject 
{
  if (depObj != null) 
  { 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i);

      if (child != null && child is T)
        yield return (T)child;

      foreach (var childOfChild in FindVisualChildren<T>(child))
        yield return childOfChild;
    }
  }
}

Wewnątrz funkcji najpierw sprawdzamy czy nie próbujemy jej wykonać na pustym obiekcie, następnie przechodzimy przez wszystkie dzieci obiektu, zwracając te wybranego typu, a także za pomocą rekurencji – dzieci dzieci tego obiektu. Wszystko to jest możliwe dzięki słowu kluczowemu ‘yield’ – wyjaśnienie jak to dokładnie działa pozwolę sobie opisać w przyszłości Uśmiech

Na koniec chciałbym dodać, że powyższy fragment kodu nie jest mojego autorstwa, wygrzebałem go ze StackOverflow Puszczam oczko

Windows 8 RP – pierwsze wrażenia

Zgodnie z obietnicą przedstawię parę moich pierwszych wrażeń po zainstalowaniu i krótkiej zabawie z Windows 8 Release Candidate.

Pierwsza rzecz która rzuca się w oczy, i to dosłownie jest większa paleta motywów kolorystycznych. Koniec z tymi szaroburymi kolorami, które straszyły nas w DP i CP. No aż takie złe nie były, pasowały do okresu jesienno-zimowego, ale przyszła wiosna i będzie jaśniej 😉

Poza kolorami do interfejsu doszły także nowe tapety oraz bardzo przydatny przycisk zoom out/zoom in w prawym dolnym rogu, na prawo od scrollbar’a. Umożliwia on nam korzystanie z mechanizmu sematic zoom gdy nie korzystamy z ekranu dotykowego! Taka opcja była w CP wyłącznie dostępna w Start, aplikacje korzystające z sematic zoom musiałby obejść się smakiem. Teraz wygląda na to że nawet na klawiaturze będziemy korzystać z tego feature’u (by się upewnić zakodzę coś korzystające z sematic zoom i sprawdzę czy na pewno przycisk się pojawi).

Z innych drobnych zmian – wygląda na to że beta IE8 zniknęła z menu START jednak nie zniknęła, bo instalując na innym komputerze system jest… coś źle kliknąłem podczas instalacji pewnie :P. Pojawiły się za to aplikacje News i Sport – fajnie 🙂

Najwięcej zmian można zauważyć w aplikacji Store. Pojawiły się nowe działy jak Social, Health&Fitness, Sports itd. co powoduje, że cały sklep trochę się ‚rozlazł’ – trzeba mocno się nascrollować by dostać się np. do kategorii business czy goverment. Nawet po wykorzystaniu sematic zoom nie widzimy na ekranie wszystkich kategorii! Niby od przybytku głowa nie boli, ale jakoś kłóci się to z zasadami metro – to co mnie interesuje chcę mieć dostępne od razu po odpaleniu aplikacji – w tym przypadku przejrzystą listę kategorii.

 

Mam nadzieję, że to poprawią 🙂 Jak się kategorie rozmnożyły to aplikacje tym bardziej! Doszło paręnaście nowych aplikacji, głównie gier. Mamy też pierwszą apkę po polsku – „Zdjęcia” stworzona przez MS.

To w sumie większość nowinek, które ujrzałem. Poza Storem i brakiem kafelkowego IE jestem zadowolony 🙂 Hmm tak siędzę na 8 w Desktopie i zauważyłem, że chyba on jak i okienka zrobiły się bardziej kanciaste. Nie odstają już od Start.

Windows 8 RP już jest!

LINK

Już jest dostępna do pobrania nowa wersja Windows 8 – Release Preview 🙂

Opinia i wrażenia z nowego systemu będą pod wieczór. Poza tym wyszedł też nowy VS w wersji Release Candidate – szykuje się weekend pełen zabawy 😀

Impreza Napędzana Kodem–opinia

Jak pewnie większość z Was wie Microsoft ogłosił jakiś czas temu na portalu MetroOne konkurs (LINK). Konkurs nie byle jaki, ogólnopolski dla programistów starych i młodych.

image Strona konkursu

Chociaż chyba bardziej dla młodych jako, że główną wygraną jest epicki melanż organizowany przez MS (a jak ktoś na imprezach MS’owych był to wie, że określenie ‘epicki’ to nie przesada Puszczam oczko ). Mimo, że konkurs jeszcze trwa, już chciałbym podzielić się z Wami moimi odczuciami wobec niego, gdyż można je określić jako gorzko-słodkie.

W wielkim skrócie – konkurs polega na wysyłaniu fragmentów kodu wykonujących jakieś zadanie w danym języku. Wszystkie zadania i języki są powiązane z programowaniem aplikacji METRO więc spotykamy takie zadania jak zrobienie zdjęcia w js, albo obsługę ‘przewrócenia’ na bok tabletu w C++.

image Paski postępu miast

W konkursie konkurują ze sobą nie pojedyncze osoby a niektóre z polskich miast. W dwóch miastach o najwyższych notach zostanie zorganizowana wspomniana już impreza, na którą zaproszone zostanie 100 osób biorących udział w akcji ze zwycięskich miejscowości. Osoby te wybrane będą na podstawie ilości poprawnie rozwiązanych zadań, oraz w przypadku tej samej liczby – na podstawie czasu umieszczenia zadań (im wcześniej tym lepiej).

PLUSY

Najbardziej podoba mi się idea konkursu miast – nie rywalizujemy w nim my vs świat. Nie, jesteśmy my i nasze miasto – w związku z tym poza umiejętnościami pisania kodu jeśli chcemy wygrać musimy samą akcję promować wśród innych – sprawdzane są można powiedzieć umiejętności socjalne Uśmiech

Drugą rzeczą która powoduje, że z przyjemnością uczestniczę w konkursie jest to że nie zabiera dużo czasu. Ot, sprawdzę rano zamiast czytać joemonster’a jakie nowe zadanie jest, rozwiążę je i wrzucę. 15-30 minut maksymalnie roboty na dzień. Dodajmy do tego rywalizację ze znajomymi o to kto pierwszy zrobi zadanie – i konkurs od razu zyskuje na dynamice. Tematyka zadań również przypadła mi do gustu – można ‘liznąć’ innych języków do pisania aplikacji na Windows 8.

MINUSY

Ok, było miło – teraz trochę błota Uśmiech z językiem Najgorsza sprawa – uaktualnianie strony. Parę razy zdarzyło się że zadanie nie było umieszczone o północy a w godzinach późniejszych (dokładnie o której nie wiem – poszedłem spać). To jest dość mały problem, zepsuje tylko czasem rywalizację ze znajomym. Gorzej z uaktualnianiem pasków postępu miast. To są moje założenia, w żaden sposób nie potwierdzone, ale uważam, że przez parę dni osoby za to odpowiedzialne wzięły wolne – no albo żadne z miast nie poradziło sobie z żadnym z zadań Puszczam oczkoPaski ruszyły znów wczoraj w sposób też dziwny – poruszyły się miasta nie mające wcześniej dużych sukcesów. Czyżby nagłe przebudzenie tych miast połączone z karygodnymi błędami miast-liderów? Możliwe – jednak fakt nieregularnego uaktualniania pasków pozostawia miejsce na wątpliwości.

Rozwiązanie tego byłoby dość proste i rozwiązałoby 3 problem – brak informacji zwrotnej czy zadanie zostało wykonane dobrze czy nie. Nie chodzi mi o natychmiastowy feedback w stylu – „Tak, pięknie rozwiązałeś nasz problem, Twoje miasto powinno być z Ciebie dumne” a krótką informację powiedzmy po 12 h od początku nowego zadania (czyli podczas uaktualniania paska) czy zostało wykonane dobrze czy źle. Dzięki temu można by dorzucić dodatkowe elementy rywalizacyjne wewnątrz miast i znudzonych sesją znajomych Uśmiech

Pomimo tych wad i tak uważam konkurs za bardzo udany, z niecierpliwością oczekuję wyników. Zachęcam również wszystkich programistów z Gdańska do wzięcia udziału i wspieraniu miasta. Programistów z innych miast też zachęcam (Gdańska i tak nikt nie przegoni Szeroki uśmiech)

[Niedzielny Tip]Opóźnianie akcji

Kolejna niedzielna, kolejny prosty kawałek kodu który może się komuś przydać 🙂

Zacznijmy od krótkiego ‚story’ – tworzymy grę w Silverlightcie i chcemy by miała ekran tytułowy w stylu gier np. z konsoli NES – tj. przez paręnaście sekund widzimy ekran menu, a potem odpala się ‚demo’.

Sprawa jest banalna – wystarczy utworzyć nowy obiekt typu DispatcherTimer, zainicjować go, podać interwał oraz co ma wykonać po określonym czasie. Załóżmy, że metoda uruchamiająca demo to void StartDemo();

var timer = new DispatcherTimer(); 
timer.Interval = TimeSpan.FromMilliseconds(300); 
timer.Tick += (o, arg)=> 
{ 
   StartDemo(); 
   timer.Stop(); 
}; 
timer.Start();

Należało jeszcze pamiętać o zatrzymaniu timer’a po wykonaniu metody – inaczej by co 300 ms odpalał StartDemo.

Wyszło fajnie, ale… 6 linijek kodu (klamr nie liczę) na tak prostą rzecz jak opóźnienie metody? Coś za dużo, szczególnie jakbyśmy chcieli coś takiego robić dla innych metod, lub w innych miejscach aplikacji. Poza tym ten kawałek kodu nie jest super czytelny…

Zamieńmy więc go na funkcję, która będzie przyjmować obiekt akcji i czas opóźnienia. Czemu obiekt akcji? W momencie przekazywania bezparametrowej metody zwracającej void do funkcji – jest ona konwertowana w obiekt Action, na którym możemy zrobić wywołanie tak jakbyśmy wołali metodę.

Powinna ona wyglądać tak:

public static void DelayAction(Action action, TimeSpan delay)
{
    var timer = new DispatcherTimer();
    timer.Interval = delay;
    timer.Tick += (o, arg) =>
    {
        action();
        timer.Stop();
    };
    timer.Start();
}

Teraz opóźnienie naszej metody zajmuje jedną linijkę :

TimeHelper.DelayAction(StartDemo, TimeSpan.FromMiliseconds(300));

Jest też o wiele bardziej czytelniejsze, co docenią osoby pracujące z Wami nad tym samym kodem lub Wy sami za jakiś czas Uśmiech

[Niedzielny Tip] Przełączanie Visibility obiektów

Może nam się od czasu do czasu zdarzyć, że chcemy z kodu przełączać atrybut Visibility danego obiektu wyświetlanego na ekranie, np. na kliknięcie przycisku. Rozwiązanie jest dość proste – piszemy taki fragment kodu:

 if (myControl.Visibility == Visibility.Visible)
          myControl.Visibility = Visibility.Collapsed;
 else
          myControl.Visibility = Visibility.Visible;

Ok, 4 linijki kodu – bardzo mało, program śmiga jesteśmy zadowoleni. Potem jednak dla innej akcji chcemy zmieniać Visibility innej kontrolki. I kolejnej, i następnej itd.

Zaczynamy powielać kod, co dobre nie jest…

Rozwiązanie tego problemu jest bardzo proste – napiszmy rozszerzenie dla kontrolek by mogły zmieniać swoje Visibility. Szybko dojdziemy do tego, że bazową klasą, która zawiera ten atrybut jest UIElement. Tak więc tworzymy klasę statyczną w której trzymać będziemy rozszerzenia (a może już taką mamy?) i dodajemy do niej metodę ToggleVisibility:

public static void ToggleVisibility(this UIElement uiElem)
{
   if (uiElem.Visibility == Visibility.Visible)
       uiElem.Visibility = Visibility.Collapsed;
   else
       uiElem.Visibility = Visibility.Visible;
}

Teraz aby przełączać widoczność kontrolki, wystarczy wywałać na niej tę metodę.

myControl.ToggleVisibility();