wtorek, 27 marca 2012

i++ czy i--

Chciałem sprawdzić czy pętla z i++ oraz i-- są sobie równe. Dlatego zrobiłem mały test:
            //Test dla i++
            Stopwatch s1 = new Stopwatch();
            s1.Start();
            for (int i = 0; i < lim; i++)
            {
                //code
            }
            s1.Stop();
            Console.WriteLine("Time for i++: {0} ms",
                    s1.ElapsedMilliseconds);
            //Test dla i--
            Stopwatch s2 = new Stopwatch();
            s2.Start();
            for (int i = lim - 1; i >= 0; i--)
            {
                //code
            }
            s2.Stop();
            Console.WriteLine("Time for i--: {0} ms",
                    s2.ElapsedMilliseconds);
Dodałem możliwość powtarzania tego testu. Obliczenia powtarzałem z 10 razy, aby wyniki były bardziej wiarygodne.
           int lim = int.MaxValue; //2147483647

            long time1 =0, time2=0;
            List<long> gList1 = new List<long>();
            List<long> gList2 = new List<long>();

            for (int i = 0; i < 10; i++) //powtarza 10 razy
            {
                TestFor(lim, ref time1, ref  time2);
                gList1.Add(time1);
                gList2.Add(time2);
            }
            var avgPlus = gList1.Average();
            var avgMinus = gList2.Average();
            var maxPlus = gList1.Max();
            var maxMinus = gList2.Max();
            var minPlus = gList1.Min();
            var minMinus = gList2.Min();

            Console.WriteLine(new { avgPlus, maxPlus, minPlus }); 
            // wyświetla wyniki dla i++

            Console.WriteLine(new { avgMinus, maxMinus, minMinus });
            // wyświetla wyniki dla i--

Jednostki w przedstawionych wynikach są liczone w milisekundach.
1) Brak operacji w pętli.
{
avgPlus = 5084,
maxPlus = 5178,
minPlus = 4998
}
{
avgMinus = 6747,
maxMinus = 6828,
minMinus = 6677
}

Operacja i++ jest szybsza. Czasy dla operacji i++ są około 1,7 sekundy mniejsze niż dla operacji i--.

2) Prosta operacja zawarta w pętli.
            int iter = 0;
            iter++;

{
avgPlus = 6368,
maxPlus = 6494,
minPlus = 6319
}
{
avgMinus = 5472,
maxMinus = 5600,
minMinus = 5446
}
Wyniki są odwrotne do wyników z poprzedniego testu. W tym przypadku operacja i-- jest szybsza. Ciekawe jest, że wyniki dla prostej operacji w pętli są lepsze niż dla pętli bez operacji.

3) Operacja na stringu.
            "ab".Replace('a','b');

{
avgPlus = 127846,3,
maxPlus = 136981,
minPlus = 125358
}
{
avgMinus = 125099,2,
maxMinus = 131357,
minMinus = 123913
}
Badanie potwierdza wnioski z punktu 2, że operacja i-- jest szybsza od i++.

4) Skoro była inkrementacja w pętli to sprawdziłem dekrementacje.
            int iter = 0;
            iter--;

{
avgPlus = 6237,4,
maxPlus = 6260,
minPlus = 6225
}
{
avgMinus = 5337,6,
maxMinus = 5383,
minMinus = 5298
}
Badanie potwierdza wniosek z punktu 2. Operacja dekrementacji jest szybka od operacji inkrementacji.

5) W ciele pętli jest tworzenie obiektu.
{
avgPlus = 52622,
maxPlus = 54548,
minPlus = 51284
}
{
avgMinus = 51557,1,
maxMinus = 55958,
minMinus = 50173
}
Ostatnie badanie potwierdza, że operacja dekrementacji jest szybsza od operacji inkrementacji.

Jak na razie nie wiem dlaczego tak się dzieje. Gdyby ktoś wiedział dlaczego operacja dekrementacji jest szybsza, to proszę o kontakt.

poniedziałek, 26 marca 2012

Szybki kod dla stron

Natrafiłem na filmik przedstawiający sposoby przyspieszania ładowania stron internetowej.



A oto lista 14 zasad:
1) Zmniejsz liczbę żądań HTTP Requests
2) Stosuj Content Delivery Network
3) Dodaj wygaśnięcie w nagłówku ( header expires )
4) Stosuj komponenty GZip
5) Arkusze stylów wstawiaj w nagłówku
6) Wstawiaj skrypty na końcu dokumentu
7) Unikaj wyrażeń w css
8) JS i css zawarte w plikach
9) Zmniejsz liczbę odwołań do DNS
10) Zmniejsz wielkość pliku z js i css
11) Unikaj przekierowania
12) Usuń duplikacje
13) Ustaw ETags dla swojej strony
14) Ustaw cache dla AJAX

Więcej o innych sposobach przyspieszania strony można znaleźć tutaj oraz tutaj,a do sprawdzenia tych reguł można zastosować YSlow. To narzędzie polecał m.in. Scott Hanselman.

Sztuczka z kolorami

Wcześniej pisałem o Richardzie Wisemanie. Tym razem chciałbym przedstawić jego sztuczkę z kolorami :)



wtorek, 20 marca 2012

Matryca decyzji i historia Arnolda

Większość ludzi jakich znam określa swoje decyzje na podstawie tego czy dana czynność jest przyjemna dla nich czy nie. Dajmy na to, że masz do wyboru ponad 3 godziny siedzenia i oglądania telewizora, albo ćwiczenie przez 3 godziny. Jeżeli wybór decyzji byłby uzależniony od tego czy będziesz miał z tego przyjemności, to na pewno wybrałbyś siedzenie przed telewizorem. Ale zupełnie inaczej wybierają ludzie, którzy myślą w kategorii pożyteczności dla siebie i innych. Jeżeli chciałbyś schudnąć parę kilogramów to wiesz o tym, że korzystniejsze dla ciebie jest ćwiczenia niż siedzenie przed telewizorem. Najlepiej by było gdyby taka czynność był przyjemna i pożyteczna. Jednak najczęściej tak nie jest. Jeżeli chcemy osiągną dany cel, to musimy kierować się decyzjami pożyteczności. A jeżeli coś dla nas jest nieprzyjemne, to staramy się zmienić nastawienie.

matryca decyzji




Arnold Schwarzenegger jest osobą, która postępuje zgodnie ze swoim celem, niezależnie od tego czy jego decyzja była łatwa czy nie. Starał się zmienić swoje odczucia z nieprzyjemnej w przyjemną czynność. W taki sposób robił to co lubił i osiągał sukcesy. Dzięki temu jest uważany za najpopularniejszego kulturystę, ikonę amerykańskiego kina akcji oraz senatora najlepszego stanu USA. Kiedy był młody, przemierzał 12 kilometrów na siłownię. Był krytykowany za to, że inaczej ćwiczy, za dużo czasu spędza na siłowni, mógłby zająć się czymś innym, itd. Arnold był zmotywowany i robił swoje. Podczas pobytu w wojsku były organizowane zawody Junior Mr. Europe, na które Arnold chciał pójść. Opuścił koszary bez pozwolenia i wygrał mistrzostwa. Późnej wygrał 3 razy z rzędu Mr. Universe. Stał się najmłodszym zwycięzcą tych zawodów ( w wieku 20 lat). Po kulturystyce chciał zostać aktorem. Dano mu szansę w filmie Herkules w Nowym Jorku, ale film okazał się totalną klapą. Ludzie z całego świata zaczęli naśmiewać się z niego, że jest słabym aktorem oraz nie potrafi mówić po angielsku. Arnold tym razem też nie dał za wygraną i zapisał się na kurs baletu, pobierał nauki z dykcji oraz rozmawiał z innymi aktorami. Aż w końcu stał się największą gwiazdą filmów akcji. Mając popularność chciał zostać senatorem najliczniejszego stanu. Pracował ciężko, aż w końcu osiągał swój cel. Arnold jest żywym przykładem osoby kierującym się decyzjami pożyteczności oraz wychodzącym poza swoją strefę komfortu.

Ciacho za ciacho

2 razy w roku w kościele dominikanów jest organizowana akcja charytatywna o nazwie "ciacho za ciacho". Akcja jest bardzo prosta. Pieczesz placek w sobotę, zostawiasz w kościele, a w niedzielę po mszy idziesz na krużganki i kupujesz swoje ciacho (oczywiście możesz też inne ciasta kupić). Jeśli nie umiesz piec placków (tak jak ja) to wystarczy, że kupisz ciacho.


Nie pisałbym o tej akcji, gdyby nie możliwość zakupienia książek za bardzo niską cenę. W tym roku zaskoczyła mnie książka "Applied XML Programming for Microsoft .NET" za 15 zł oraz Building Web Solutions with ASP.NET and ADO.NET również za 15 zł. Były też inne książki z wydawnictwa MS Press za tak niską cenę. Ceny książek zaczynały się od 1zł. Na kiermasz przyszedłem po godzinie 20tej, więc te ciekawsze książki były już kupione. Były książki wydane w tym roku jak i książki mające z 50 lat. Kiedyś byłem w organizacji i znalazłem książkę z 1890 roku. Bardzo żałuje, że nie kupiłem jej.

Podsumowanie SFI 2012

Studencki Festiwal Informatyczny już się zakończył, więc krótko opisze moje wrażenia z tego festiwalu. O SFI pisałem już wcześniej. Jako stary (od 2006 roku) uczestnik festiwalu, chciałbym opowiedzieć te najciekawsze tegoroczne prelekcje.



Najbardziej podobała mi się prezentacja Bruce Lawson pod tytulem "How to destroy the web". Bruce pracuje dla Opery, w wolnych chwilach tworzy muzykę oraz ogląda koty na youtubie. Na swoim pokazie opowiadał o tworzeniu nowych niekompatybilnych standardów, różnic między przeglądarkami oraz jak zmonopolizować technologię. Najbardziej spodobała mi się jego charyzma i lekkość prezentacji.
Na drugim miejscu z najlepszych prelegentów SFI uplasował się Marcin Kosedowski. Marcin opowiadał o pracy freelancera (praktyczne kwestie oraz jego przygodzie z pracą na kontraktach). Sposób opowiadania Marcina był przyjemny i prosty.



Bardzo mi się podobała prelekcja Przemka Biecka o wizualizacji danych. Sprawozdanie Przemka z festiwalu można przeczytać z jego bloga. Baza danych RavenDB była przedstawiana przez Michała Śliwonia z firmy ABB. Prezentacje Michała można zobaczyć pod tym linkiem. Do ciekawszych prezentacji należałoby wyróżnić prezentację Marcina Jaśkiewicza z istv. Bardzo żałuję, że nie byłem na prezentacji Tadeusza Golonki.

Jeżeli chodzi o lokalizacje SFI to organizatorzy wybrali bardzo dobre miejsce. Na stronie Auditorium Maximum jest możliwość wirtualnego zwiedzania.



czwartek, 15 marca 2012

Książka "Zarządzanie projektami informatycznymi"

To jest stary wpis, ale nigdy nie miałem czasu na dokończenie oraz opublikowanie go. Ten post będzie o wskazówkach zawartych w książce "Zarządzanie projektami informatycznymi. Subiektywne spojrzenie programisty" napisanej przez Joel Spolsky. Spolsky od 2000 roku prowadzi bloga (pomysł nazwy mojego bloga pochodzi od tego Pana), był jednym z twórców Visual Basic for Applications w Excelu, jest właścicielem firmy Fog Creek oraz CEO stackoverflow.com. Książkę napisał w 2005 roku. Przedstawiając Ci te rady będę bazował na moich starych notatkach, jakie zrobiłem po przeczytaniu tej książki.



Chciałbym wymienić 12 najważniejszych rad Spolskyego odnoszących się do prowadzenia projektu informatycznego:

1) Mechanizm kontroli wersji
System kontroli wersji jest już podstawą. Tworzenie oprogramowania nie jest rozgrywką jednoosobowa, ale jest grą zespołową.

2) Kompilacja całego systemu w jednym kroku
Jeszcze pamiętam jak w pewnej firmie musiała być wyznaczona osoba, która mogła przekompilować kod i wysłać na serwer produkcyjny (testowy). Taki proces mógł zajmować nawet do 2 godzin, więc bardzo rzadko dokonywano publikacji oprogramowania.

3) Codzienna kompilacja
Proces codziennej kompilacja jest nazywany Continuous Integration. Do automatyzacji kompilacji może przydać się CC.NET




4) Baza danych dla wykrytych błędów

5) Usuwanie błędów przed napisaniem nowego kodu

6) Realizacja projektu zgodnie z wcześniejszym planem

7) Specyfikacje
Natura programisty nakazuje interpretować jednoznaczne wymagania tak, aby uprościć wymagania. Często nie jest to coś, czego chciałby klient.

8) Właściwe warunki pracy dla pracowników
W ciszy jest łatwiej skoncentrować za zadaniu. Bardzo dobrą praktyką w pracy, w pokoju składających się z kilku osób jest ustalenie cichych dni. Są to dni, w których nie jest puszczana muzyka, nie ma luźnych pogawędek o polityce oraz nie przesyła się śmiesznych linków z różnych serwisów.

9) Najlepsze narzędzia są wykorzystywane w pracy
Nie wyobrażam sobie dużej aplikacji napisanej w zwyczajnym edytorze tekstu, czy IDE bez możliwości refaktoryzacji kodu. Genialnym dodatkiem do Visual Studio jest ReSharper. Możesz pobrać testową wersję dodatku, ale uważaj. Raz spróbuje i nie będziesz chciał wrócić do starego IDE.

10) Wykorzystanie z pomocy testerów

11) Kandydaci na stanowisko muszą napisać próbny kod

12) Korytarzowe testy użyteczności
Testy korytarzowe polegają na tym, że napotkaną pierwszą osobę na korytarzu i prosi się ją o przetestowanie i wyrażenie swojej opinii na temat systemu. Każdy twórca oprogramowania uważa, że jego system jest łatwy w obsłudze i intuicyjny.

Wiele ludzi uważało wskazówki Spolskyego za nierealne do spełnienia. W dzisiejszych czasach dobre firmy postępują zgodnie z tymi radami, aby wytwarzać najlepsze oprogramowanie jakie jest możliwe. Nie opisałem wszystkich punktów, gdyż są one oczywiste. Książka Spolskyego jest świetnie napisana i bardzo praktyczna (nawet na dzisiejsze czasy). Moim zdaniem jest to bardzo dobra książka o zarządzaniu projektami dedykowana dla programisty.