StackOverflow.com otwarte

Stack Overflow to dzieło dwóch, całkiem znanych w świecie inżynierii oprogramowania osobistości – Jeffa Atwooda i Joela Spolsky’ego. Czym jest Stack Overflow? W skrócie, jest to strona, na której można zadać pytanie dotyczące programowania i otrzymać fachową odpowiedź :) Przynajmniej takie są założenia.

Po zadaniu pytania wszyscy mogą na nie odpowiadać oraz głosować na inne odpowiedzi (zarówno na + jak i na -). Odpowiedź z największą ilością plusów wędruje na samą górę. Proste i mogłoby się zdawać – mądre. Istnieje również system reputacji i odznaczeń, aby wyróżniać użytkowników.

Teraz będzie moja osobista opinia. Myślę, że na mało wyrafinowane pytania łatwo będzie tam dostać odpowiedź, gorzej ze znalezieniem już istniejącego wątku. Istnieje co prawda system tagów i wyszukiwanie, ale to chyba za mało. Jeśli nasz problem będzie krytycznie ważny, to chyba mimo wszystko nie jest to najlepsze miejsce do znalezienia odpowiedzi ;) Choćby dlatego, że nie ma tam możliwości dyskusji, zamieszczania załączników itd… Sam być może skorzystam jeśli moje pytanie będzie szybkie i łatwe do zrozumienia. Póki co, traktuję tę stronę jako zapychacz czasu – tj. wchodzę, gdy mam „międzyczas” i czytuję sobie niektóre pytania korzystając z tagów c#, asp.net, .net. Czasem można dowiedzieć się czegoś ciekawego, albo komuś pomóc :)

Aktualnie na stronie jest bardzo duży ruch. Ludzie pytają o wszystko. Począwszy od bardzo wyspecjalizowanych pytań odnośnie konkretnych funkcji, aż do wypisywania swoich ulubionych książek o programowaniu. Co tu więcej pisać, zachęcam do samodzielnego zapoznania się ze stroną. Poniżej parę linków.

Stack Overflow
Jeff Atwood o Stack Overflow
Joel Spolsky o Stack Overflow
Zabawny blog, krytykujący Stack Overflow i jego autorów :)

UPDATE: Stack Overflow jest napisany w oparciu o ASP.NET MVC :) Miło widzieć tak duży, publiczny projekt oparty na tej technologii.

Przymusowa migracja zakończona!

Uff, wczoraj udało mi się zakończyć prace nad nową wersją mojego bloga i oto jest :) Na pierwszy rzut oka nie widać wielu zmian, ale naprawdę są. Teraz powinno obyć się już bez niespodzianek, przerw w działaniu i takich tam :)

Zmiany które zaszły:

Już niedługo udostępnię źródełka :)

Transformacje w WPF

W lipcu przyszło mi wykonywać dla pewnej firmy projekt łudząco przypominający zastosowanie Microsoft Surface. W mojej gestii leżało napisać program, który na podstawie przyjmowanych od panelu dotykowego współrzędnych będzie manipulował (transformował) obrazki. Ot, taki terminal, na którym klienci mogą sobie w przyjemny sposób pooglądać zdjęcia produktu. Przy okazji tego projektu zasięgnąłem poważnej lekcji WPF-a i długo zmagałem się z transformacjami graficznych obiektów – dlatego stwierdziłem, że warto napisać o paru aspektach tego zagadnienia :)

Wygodne transformowanie obiektów graficznych w WPF-ie to jedno z dobrodziejstw, które owa technologia oferuje, w szczególności jeśli zestawić ją z WinForms i GDI. Transformować możemy obiekty wszystkich klas, które dziedziczą po UIElement. Każdy taki obiekt posiada 2 właściwości: RenderTransform i LayoutTransform do której przypisujemy naszą transformacje. Czym różnią się te właściwości? Można o tym przeczytać tu albo uruchomić krótkie demo (koniecznie w IE), dostępne tu.

Teraz może nieco o transformacjach. Dostępnych typów transformacji jest cztery:

  1. RotateTransform – obrót o podany kąt (w stopniach) i podany środek obrotu (punkt)
  2. ScaleTransform – skalowanie, w punkcie skalowania, w dwóch płaszczyznach (X i Y) o podanej skali (oddzielnie X i Y); wartości >1 powiększają a wartości należące do przedziału (0;1) pomniejszają
  3. SkewTransform – „skośne” transformowanie o podane kąty (X i Y) oraz środek „skosowania” ;) – służy często do tworzenia iluzji trójwymiarowości
  4. TranslateTransform – najzwyklejsza translacja o wektor – wymagane są dwie współrzędne wektora

Więcej polecam poczytać więcej na MSDN, są nawet ładne rysunki :)

Przechodząc do rzeczy, aplikowanie transformacji jest bajecznie proste. Załózmy iż mamy obiekt typu ImagearrowImage i chcemy go przesunąć o wektor [50,82]. Wystarczy jedynie napisać:

arrowImage.RenderTransform = new TranslateTransform(50,82);

i gotowe :)

W taki sposób możemy jednak dodać tylko jedną transformację. Co jeśli chcemy zaaplikować naszemu obiektowi całą grupę transformacji? Wystarczy wtedy skorzystać z klasy TransformGroup:

TransformGroup transformGroup = new TransformGroup();

i teraz:

transformGroup.Children.Add(rotateTransform);

transformGroup.Children.Add(translateTransform);

transformGroup.Children.Add(scaleTransform);

pozostaje zaaplikować grupę transformacji:

arrowImage.RenderTransform = transformGroup;

tadam! Gotowe :)

Na koniec chciałbym zaznaczyć, że transformacje mają na siebie wpływ np. pomniejszenie obiektu o połowe powoduje iż translacja o wektor [8,0] jest tak naprawdę translacją o wektor [4,0]. Chyba, że zrobimy najpierw translacje, a potem pomniejszanie. Tutaj należy pamiętać, iż dodawanie transformacji nie zawsze jest przemienne: kolejność translacji nie ma znaczenia – wynik zawsze będzie taki sam; co innego np. z obrotem. Dokumentacja niestety nie jest zbyt wyczerpująca w tej kwestii. Osobiście męczyłem się tydzień, żeby zrozumieć cały mechanizm współdziałania między transformacjami – trzeba być naprawdę bardzo uważnym. Dla przykładu – najbardziej „aktualne” (te które mają być zastosowane najpóźniej) transformacje należy wstawiać na początku, a nie na końcu kolekcji.

transformGroup.Children.Add(rotateTransform); transformGroup.Children.Add(translateTransform);

Taki kod spowoduje najpierw translacje, a potem obrót. Jeśli więc chcemy uzyskać efekt wielokrotnej transformacji przydatne staje się coś takiego:

transformGroup.Children.Insert(0, pewnaTransformacja);

To by było na tyle. Jeszcze nie jestem pewien, czy mogę, ale być może wspomniana aplikacja a’la Surface zostanie opublikowana na moim blogu :) Tymczasem polecam spojrzenie na podobną aplikację – napisaną w Silverlighcie. Jej kod źródłowy jest cennym przykładem stosowania transformacji :)

30. spotkanie WG.NET

Wczoraj, to jest 11 września w godzinach 18-21 odbyło się 30. spotkanie WG.NET, połączone z 23. spotkaniem PLSSUG. Jak zwykle było miło, ciekawie i bardzo „edukacyjnie” :)

Po krótkim wstępie, który dotyczył przyszłości (w tym, zapowiedź C2C ’09!) oraz nadchodzącego MTS-a zaczęła się część zasadnicza – prelekcje. Pierwsze wystąpienie przygotowane było przez Łukasza Skrzypczyńskiego i dotyczyło BizTalka. Prezentacja bardzo mi się podobała – interesujące wprowadzenie do tego niezbyt znanego narzędzia. Niewiele suchych faktów, a dużo dem :) Bardzo fajnie było posłuchać Łukasza (jakie to ładne imię :)), mimo iż zapewne BizTalka nigdy używać nie będę :)

W przerwie między wystąpieniami było 35 minut socjalizowania się :) Jak zwykle było bardzo miło i przyjaźnie – szczególnie przyjemnie rozmawiało się z Pawłem Potasińskim o studiach, Oracle’u i Microsofcie. Pozdrawiam :)

Druga prezentacja miała nieco tajemniczy tytuł „Pesymistyczna strategia blokowania danych” i prowadził ją Wojciech Sawicki. Wystąpienie dotyczyło współpracy użytkowników bazy danych – tj. kiedy blokować, a kiedy nie, dane które mogą ulec zmianie. Prelekcja była zabawna, świetnie prowadzona – bardzo mi się podobała, mimo iż była wybitnie SQL-owa :) Temat wzbudzał wiele emocji i jednostronne przemówienie często przeradzało się wręcz w mały panel dyskusyjny – super! :) Gratulacje dla Wojtka! Dodam jeszcze, że w mojej czteromiesięcznej karierze w grupie offline’owej zdarzyło mi się wiele SQL-owych prezentacji i o dziwo, mimo iż jestem bazodanowym „newbie” bardzo dużo (ale nie wszystko :P) z nich zrozumiałem i wyniosłem – także brawo dla prelegentów i PLSSUG za dobór odpowiednich ludzi :)

Po prelekcjach było króciutkie zakończenie i była pora zbierać się do domu. Najbliższe spotkanie mam nadzieje jeszcze we wrześniu. Już nie mogę się doczekać! :)

Niemiła niespodzianka hostedwindows.pl – kolejne zmiany

2 dni temu dostałem smutnego maila od supportu hostedwindows.pl:

Po przeszło dwóch latach udostępniania bezpłatnego hostingu stron WWW i aplikacji ASP.NET zmuszeni byliśmy podjąć decyzję o zakończeniu świadczenia usługi Free Hosting. Twoje serwisy WWW istniejące w ramach tej usługi utrzymywane będą do 7 października br. Po tym dniu w ramach HostedWindows.pl udostępniana będzie wyłącznie oferta komercyjna.

Niestety póki co nie widzi mi się wykupywanie komercyjnej oferty – czeka mnie więc migracja na coś innego, darmowego. Do tego czasu ze stroną mogą się dziać dosyć dziwne i bardzo różne rzeczy (to będzie znaczyło, że na czymś się bardzo nie znam :P). Jak to wszystko się skończy – na razie nie wiem. W każdym razie mogę obiecać, że mój blog nie zniknie z sieci :)

Tworzymy własny kanał RSS 2.0, czyli kodujemy!

Jeśli prowadzisz stronę z dynamiczną zawartością, to z całą stanowczością potrzebujesz udostępniać ją jako kanał informacyjny. Coraz więcej osób (w tym od niedawna ja ;)) przegląda niusy, wpisy na blogach tylko i wyłącznie używając syndykacji. Ba, myślę nawet, że wiele stron z powodzeniem istniałoby bez jakiegokolwiek layoutu, a jedynie jako feed :) Ale dosyć już spekulacji, do dzieła! :)

Istnieją dwa liczące się standardy kanałów są to Atom i RSS. Polecam zapoznać się z linkami z jakże niezawodnej wikipedii :) W tym miejscu wypadałoby zdecydować się na któryś standard. Ja opiszę przygotowanie feeda w RSS 2.0, ale nic nie stoi na przeszkodzie, żeby zdecydować się na Atom. RSS wydaje mi się nadal być popularniejszym (osobiste odczucie), ale Atom depcze mu po piętach.
Na początek wypadałoby utworzyć stronę o jakiejś wdzięcznej nazwie, np. Feed.aspx. To było proste, teraz jednak przechodzimy w końcu do kodu :) Nie będę się tutaj rozwodził nad specyfikacją gdyż można o niej przeczytać tutaj. Jeśli jesteś leniwy, to wikipedia przedstawia bardzo skrótowy opis i przykład, który jednak nam wystarcza. Oto fragmencik pliku generującego kanał z bloga, którego czytasz:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Feed.aspx.cs" Inherits="hLog.Views.Blog.Feed" %><%Response.ContentType = "application/xml";%><%@ Import Namespace="hLog.Models"%>


Łukasz Sowa - blog programisty .NET
http://lukaszsowa.pl
Feed z najnowszymi notkami
<% foreach(Entry entry in ViewData.Model) { %>

<![CDATA[<% Response.Write(entry.Title); %>]]>
]]>
]]>
]]>

<%} %>


Kod powinien mówić sam za siebie. Są wszystkie wymagane pola , a dodatkowo również , które jest bardzo przydatnym polem. Zwróć uwagę na formatowanie (wymagane pola, kolejność, umiejscowienie), gdyż nawet drobne odstępstwa od reguł mogą powodować poważne błędy. Mój blog, czego tutaj niestety nie widać, pobiera 10 najnowszych postów, a następnie osadza je w znacznikach. Wyjaśnienia wymaga jeszcze tajemnicza CDATA. Otóż podczas parsowania pliku, w wygenerowanej zawartości mogą znaleźć się elementy, które zaburzą układ znaczników, a co za tym idzie – cały nasz Feed wygeneruje się z błędem. Tu właśnie przychodzi z pomocą CDATA. Wszystko co znajduje się pomiędzy znacznikami CDATA jest ignorowane podczas parsowania – czyli nasze dane nie zaburzą znaczników.

No to pozostaje tylko odpalić stronkę i… ups! Kanał wyświetla się zapewne jako plaintext. Nie tego oczekujemy. Podgląd odebranego nagłówka wszystko wyjaśnia – przeglądarka traktuje dane, jako test. Musimy więc odpowiednio oprogramować zdarzenie Page_Load. Kod poniżej:

 protected void Page_Load(object sender, EvenrArgs e)
{
Response.ContentType = "application/xml";
}

Teraz nasza przeglądarka będzie wiedziała (dzięki zmodyfikowanemu nagłówkowi), że odczytuje XML.

Teraz już powinno wszystko działać. Voila! :) Ciesz się swoim własnym kanałem.

PS. To mój pierwszy stricte techniczny tekst, więc liczę na feedback i wyrozumiałość :)

Post Zine Day 2008!

Wczoraj, po godzinie 17 zakończyła się bardzo przyjemna „mini-konferencja” związana z bloggernią zine.net. Z wielką i niepohamowaną radością podzielę się więc swoimi odczuciami i wrażeniami z imprezy :)

Na sali od początku było zdaje się około 50 osób (nie byli to sami członkowie WG.net), a wszystko zaczęło się nieco po 9, bardzo krótkim wprowadzeniem. Zaraz po otwarciu zaczęło się wystąpienie Gaela Fraiteura (autora słynnego narzędzia PostSharp) pt. „Adressing non-functional requirements with aspects”, które świetnie wprowadzało do „filozofii” AOP. Wystąpienie było bardzo zrozumiałe, a szczególnie podobało mi się to, że Gael przedstawił różne frameworki i nie promował tu zbyt szczególnie wspomnianego PostSharpa :) Ponadto warto dodać, że prelekcja była dosyć zabawna, co musiało, nawet najbardziej marudnych, uchronić przed nudzeniem się.

Drugą sesję prowadził András Belokosztolszki – „Managing change in the database world”. Jako dotnetowiec nie spodziewałem się czegoś ciekawego, ale jednak się udało mnie zaskoczyć :) Wystąpienie było również ciekawe i mimo, iż niezupełnie dotyczyło moich zainteresowań, to dowiedziałem się wielu ciekawych rzeczy.

Ostatnia prelekcja tego dnia należała do Gaela Fraiteura i Kuby Binkowskiego „More complex aspects using PostSharp”, która dotyczyła… PostSharpa :) Prowadzona była w bardzo ciekawy – fajny sposób – na zasadzie dialogu pomiędzy „biednym programistą” (Kuba), a „AOP guru” (Gael). Chłopaki pokazali naprawdę dużo interesujących „ficzerów” PostSharpa. Po tej sesji zdecydowanie zainteresowałem się tym narzędziem.

Zaraz po sesji, a właściwie już w trakcie pytań dotarła pizza – rozpoczął się networking :) Tą część wszyscy uwielbiali :) Pizzy i napitku było aż nadto (chyba wszyscy zapełnili żołądki po brzegi :)), ale rozmowom nie było końca. Miło było pogadać dłuższą chwilę w małym kółeczku zainteresowanych z Gaelem (András niestety musiał już uciec). Niestety wszystko co dobre ma kiedyś koniec… A więc po jakichś 45 minutach wszyscy (pozostali na spotkaniu) zostali zaproszeni na rozstrzygnięcie konkursu.

Jaki konkurs? Otóż jakiś czas temu Michał Grzegorzewski zorganizował konkurs na najlepszy, polski, dotnetowy program open source. Uważam, że to był świetny pomysł. Mało w Polsce takich inicjatyw i ciężko coś rozkręcić, a taka inicjatywa jak ta świetnie wspomaga dalszy rozwój. Nie wiedziałem w sumie czego spodziewać się po projektach, które zostaną przedstawione. Myślałem trochę, że może będzie nudnawo, ale… Niech żałują wszyscy, którzy wcześniej poszli sobie z Zine Day! Konkursowa część spotkania była świetna, zaryzykowałbym może nawet, że najciekawsza ;) Zaprezentowano 6 projektów. Wszystkie były bardzo różne, wszystkie były ciekawe! Mówię to z pełną powagą i bez kokieterii. Uczestnicy wykazali się naprawdę dobrymi umiejętnościami przemawiania i promowania siebie :) Gratuluję wszystkim bardzo serdecznie i stanowczo stwierdzam, że wszyscy w tym konkursie zwyciężyli, gdyż naprawdę się popisali!

To były ochy i achy, teraz jedna mała rzecz, która mogłaby zostać zorganizowana lepiej… Otóż, skoro było to Zine Day, to wg mnie było za mało Zina w Zine Day. Wydaje mi się, że dosyć mało osób związanych z Zinem przybyło (choć w sumie, może naprawdę nie mogli). Ponadto zabrakło mi czegoś o samym Zinie. To pierwszy Zine Day, więc można by było przedstawić jakoś krótko historię Zina, jego ewolucję itp. Fajnie, gdyby blogerzy piszący na Zinie powiedzieli coś o sobie lub mieli jakieś krótkie prelekcje na dowolny temat. Tak żeby lepiej poznać osoby, których wypociny czytam na co dzień. Słowem – żeby Zine się trochę promował na takim spotkaniu :) Dwuzdaniowe wprowadzenie, to zdecydowanie za mało!

To jednak zdecydowanie nie może rzutować na mojej opinii na temat Zine Day 2008. Spotkanie było naprawdę świetne – doskonale zrealizowane, zaplanowane, piekielnie ciekawe i niezwykle edukacyjne. Dziękuję Michałowi i wszystkim innym „Zinowcom” za inicjatywę i perfekcyjną realizację! Z niecierpliwością czekam na Zine Day 2009 ;)

PS. Z tego co wiem, będzie dostępny filmik z całej imprezy, gorąco zachęcam do obejrzenia, szczególnie części konkursowej.

Powakacyjne sposoby na zwiększenie produktywności

Czas się wziąć do roboty, więc postanowiłem, że muszę efektywniej wykorzystywać czas. Jakieś dwa tygodnie temu mój kochany laptop całkiem mi padł, po 4 dniach od wysłania miałem go już z powrotem – panowie z ASUSa się postarali (no może poza tym, że schrzanili coś z dźwiękiem :P). Od tego momentu stwierdziłem, że muszę wycisnąć z tej maszynki co tylko się da, żeby robić jak najwięcej i jak najkrócej :)

Moje ulepszacze:

  1. Finalnie, po krótkich dyskusjach (tu i tu) zdecydowałem się na instalację Windows XP zamiast Vista. Wnioski? Windows XP działa, przynajmniej u mnie i według mnie, o wiele, wiele szybciej!
  2. Sam Windows przeszedł też odpowiednie przyśpieszenie – programy startowe ograniczyłem do minimum, podobnie jak wszystkie zbędne efekty graficzne (estetyka nie odgrywa tu dla mnie dużej roli. :))
  3. Visual Studio również przeszło nieco liftingu, polecam przeczytanie tego.
  4. Może to głupie, ale wcześniej nie używałem żadnego agregatora kanałów. Uwielbiam czytać i przeglądanie ulubionych stron kilka razy dziennie zajmowało dużo, dużo czasu. Teraz trwa to ledwie kilka minut (o ile nic ciekawego nie ma ;)). Jeśli ktoś jeszcze nie ma agregatora, to polecam się zainteresować (ja używam RSSBandit).
  5. Dodatkowy ram, to dobra rzecz. Szczególnie, gdy moduł 1GB kosztuje ~50 zł (do mojego laptopa) – nieźle się zdziwiłem, bo dawno nie patrzyłem na ceny.
  6. Zainstalowałem wiele przydatnych narzędzi, wiele z nich znajduje się na doskonałej liście „tuli” z blogu Scotta Hanselmana.

To chyba tyle :) A jak Wy wspomagacie swoją produktywność?

Koniec beztroskiego wypoczynku, do roboty! :)

Koniec wakacjowania, czas do pracy :) Do rozpoczęcia studiów pozostał mi wciąz miesiąć, postaram się go więc wykorzystać bardzo produktywnie :) Przed rozpoczęciem wypoczynku pisałem o tym, iż zamierzam przesiąść się na gotową platformę blogową. Jednak po krótkiej wymianie zdań w komentarzach na blogu Darka Gila postanowiłem pozostać na swoim, autorskim dziele :) W końcu gotowe nie jest tak „kul” jak własne, nie? :) Przez najbliższy miesiąć zamierzam ostro popracować nad hLogiem, ulepszyć go (właśnie podpiąłęm do niego FCKeditor i piszę pierwszego posta za pomocą tego cacka)  i w końcu wypuścić gotowe źródełka :)

Co planuję odnośnie hLoga:
* porządki w kodzie
* jeszcze więcej porządków
* migracja z Preview 2 do Preview 5
* ulepszenie trasowania
* „dynamizacja” zawartości
* opcja wyszukiwania
* statystyki
* inne, kosmetyczne poprawki
* wersja silverlightowa bloga (o ile starczy czasu)
* …

Poza tym postaram się pisać dużo więcej na samym blogu. Ponadto chciałbym dołączyć się do jakichś nowych/istniejących projektów, więc jeśli ktoś poszukuje zasobów ludzkich, to polecam opcję „kontakt” :)

PS. Fajnie się piszę w FCKeditorze