Sunday, October 19, 2008

Windows Vista - czy warto?

Miałem jakiś czas temu okazję pobawić się vistą. Nie poraz pierwszy zresztą. No i potwierdziłem swoją opinię o tym systemie.

WSTĘP (nudne, pomiń ten akapit):
Powiedzmy to otwarcie: Programiści, którzy stworzyli windowsa vistę spartolili kilka spraw.
Ale jak to możliwe? Wiem już, że z oprogramowaniem tak jest często. W korporacjach są ludzie od cięcia kosztów, ludzie od organizacji pracy, ludzie od promocji produktu, projektanci i robole-programiści. Do tego testerzy i inni.
Ale czy to tylko programiści? Nie - to nigdy nie jest wina jednej ze stron.
Ci od cięcia kosztów skroili je zbyt mocno (dlatego w korporacjach trwa ciągła walka między nimi a pozostałymi szczeblami).
Ci od projektu nigdy nie są w stanie wszystkiego przewidzieć i zawsze robią błędy (dlatego zawsze powinni poprawiać projekt w trakcie tworzenia).
Ci od tworzenia oprogramowania na pewno też nie wszystko zrobili najlepiej - mieli zbyt małe kwalifikacje (dzięki temu są tani i dostali pracę) lub dano im zbyt mało czasu.
Menadżerowie nie rozumieją (albo nie chcą zrozumieć), że projekt trzeba zmieniać (a to wymaga znowu programowania).

ROZWINIĘCIE:
- W XP poziom bezpieczeństwa był zbyt niski - popracowano nad tym. W efekcie system Vista jest natrętny i wkurza ciągłymi pytaniami (uważam, że ta funkcjonalność byłaby świetna - gdyby jej nie z***no).
- W XP system wyglądał ładnie i to przekonało część klientów - dlatego vista jest ładniejsza. Ale warto by się zastanowić czy komputer ma być ładny, czy funkcjonalny => jeśli ma być ładny i funkcjonalny to kup Mac'a.
- W Viście spece od marketingu kombinowali jak zarobić więcej - dlatego aby zainstalować sterowniki - muszą być one podpisane cyfrowo przez Microsoft. A to kosztuje - kasę zgarnia Microsoft. Problem: Przez to (i nie tylko) trudno o sterowniki do visty.
- W Viście obcięto funkcjonalność i dodano kilka bajerów za potworną kasę - dzięki temu powstało kilka wersji visty. Tylko czy warto wydać kilka setek $ za odrobinę łądniejsze okienka?
- W Viście dorzucono szyfrowanie dysków (tylko droższe wersje visty). Ale przecież są inne sposoby na osiągnięcie tego samego celu - a do tego lepsze niż ten bit-locker.
Powyżej nie ma nic na korzyść visty.... ale może coś jednak jest w niej fajnego?
- Otóż jest! Spece od marketingu stwierdzili że ich gniot się nie sprzedaje. Aby zwiększyć sprzedaż - biblioteki graficzne DirectX wyszły tylko pod vistę - ale nie pod XP. Oficjalnie architektura XP na to nie pozwala (czyli oficjalnie powinni powiedzieć "spi*liśmy XP"). Ale jakoś w to nie wierzę...
- 64 bity! Ejże... przecież był XP 64. Czyli nic nowego. Poza tym pod 64 bitową vistą wszystko działą jeszcze wolniej niż pod 32-bitową.

ZAKOŃCZENIE:
XP jednoznacznie wygrywa z vistą (pomimo niedociągnięć) - został jednak wykluczony z walki przez sędziów (spece od marketingu) czyniąc Vistę zwycięzcą.

POSŁOWIE:
Po-słowie - nie chodzi mi o nierobów polityków (choć nie wszyscy z nich są nierobami), tylko o to, co się dodaje po zakońćzeniu części właściwej.
Odpowiem (przynajmniej spróbuję odpowiedzieć) poniżej na 3 pytania:
(1)Dlaczego jest tak niewiele oprogramowania 64-bitowego? (2)I dlaczego jest ono wolniejsze? (3)Na co komu 64-bity?

(3) Bez wdawania się w szczegóły - systemy 32-bitowe bez problemu dają radę z niecałymi 4 GiB pamięci. Nie oznacza to jednak, że obsłużenie większej ilości pamięci nie jest możliwe.
Niewiele jest aplikacji wykorzystujących tyle pamięci. Są to zazwyczaj gry i skomplikowane aplikacje obliczeniowe. Zazwyczaj jednak możnaby bez problemu przepisać takie oprogramowanie tak, aby działało na mniejszej ilości pamięci. Problem w tym, że programista woli zrobić tandetę na szybko, ale za to często, niż jedną perłę w życiu - ale za to przez cały swój żywot nie mieć kasy na życie.

(2) Dlaczego 64-bity są wolniejsze?
i od razu
(1) Dlaczego jest tak niewiele oprogramowania 64-bitowego?
W programowaniu używa się wskaźników do miejsc pamięci. To tak jak np. numer telefonu.
32-bitowy wskaźnik jest mniejszy niż 64-bitowy.
Tak samo, jak wybranie/zapisanie numeru telefonu składającego się z 4 cyfr jest szybsze i zajmuje więcej miejsca niż wybranie/zapisanie 8-cyfrowego numeru - tak samo operowanie na takich wskaźnikach może być wolniejsze i wymaga więcej miejsca w pamięci.
Teraz niespodzianka - w systemach 64-bitowych (w zasadzie mówi się o architekturze x86_64) wszystko działa szybciej. Problem w tym, że na x86_64 można uruchomić oprogramowanie 32-bitowe. Po co więc robić osobno plik na 32 i 64 bity jak wystarczy jeden? A jak się tworzy oprogramowanie 64-bitowe to zazwyczaj wstarczy ten sam kod (32-bitowy) wykorzystać aby zrobić coś 64-bitowego.
Tutaj rodzi się problem - rezygnujemy z części przyspieszenia które daje nam x86_64. Ale skoro na pierwszy rzut oka nie widać różnicy to po co przepłacać za tworzenie oprogramowania? Tak przynajmniej myślą wielkie firmy tworzące to oprogramowanie.

Jest jeszcze jedna sprawa. Sterowniki na 64-bity (jeśli w ogóle są) - nie są tak dopracowane jak te na 32-bity. Dlatego cały system jest wolniejszy.

Jeśli ktoś to przypadkiem czyta to serdecznie pozdrawiam :)

Thursday, October 2, 2008

Oracle, cz. 2

Dzisiaj napiszę o czymś, co mnie nieco zakręciło i jest związane z agregacją.
Już jakiś czas temu korzystałem z funkcji MAX oraz GREATEST. Ale aż do dzisiaj nie miałem z nimi problemu.
W najprostszym przypadku można korzystać z nich zamiennie. Ale czasem różnice są znaczące.
Wyobraź sobie tabelę zawierającą pojedynczą kolumnę Col1 z liczbami od 1 do 9. Zapytanie SELECT MAX(Col1),GREATEST(Col1) FROM ... powinno zwrócić te same dane (ale nie sprawdzałem tego).
Jeśli chcesz znaleźć największą wartość w kolumnie - użyj MAX.
Jeśli chcesz dorzucić kolumnę zawierającą największą z wartości - użyj GREATEST.
Przykład:
INSERT INTO T VALUES (1,2,3),(5,6,2),(8,2,2)
SELECT Day1,Day2,Day3,GREATEST(Day1,Day2,Day3) FROM T
Otrzymasz wiersze (1,2,3,3),(5,6,2,6),(8,2,2,8)
SELECT MAX(Day1),MAX(Day2),MAX(Day3) FROM T
Otrzymasz wiersz (8,6,3)

A z czym miałem dzisiaj problem?
SELECT Col1, GREATEST(MAX(Day1), MAX(Day2), MAX(Day3)) Maximum FROM T GROUP BY Col1
Tutaj słowo wyjaśnienia: GROUP BY jest zbliżone do PARTITION BY (to drugie daje większe możliwości). Pozwala ono wykonać operację "SELECT Col1,MAX(Col2) FROM T GROUP BY Col1" - jak zapewne widzisz - chcę otrzymać wartości wkolumnie Col1. Dzięki GROUP BY otrzymam między 0 a n wierszy (gdzie n to ilość wierszy w tabeli T). Jeśli wartości w kolumnie Col1 się powtarzają - zostanie z nich wybrana największa. Inaczej mówiąc: podziel tabelę na grupy i wykonaj operację MAX/SUM/etc. na każdej grupie osobno.
Teraz wyjaśnienie mojego problemu: chciałem otrzymać kolumnę zawierającą największe z maksimów. Niestety Oracle nie poradzi sobie z tak nielogicznym zapytaniem: nie wiadomo czy do grupowania się tyczy funkcja MAX, czy też GREATEST (chciałem najpierw MAX a później GREATEST).
Rozwiązanie , które znalazłem, jest proste:
SELECT Col1, GREATEST(Max1,Max2,Max3) FROM ( SELECT Col1, MAX(Day1) Max1,MAX(Day2) Max2, MAX(Day3) Max3) FROM T GROUP BY Col1)