Linux jak Windows

Przez długie lata żyłem w mocnym przekonaniu, że nie zobaczę nigdy Linuxa, który w użytkowaniu byłby równie prosty jak Windows. Po wczorajszym dniu moje przekonanie zdecydowanie osłabło. Do dnia wczorajszego na moim dysku dzielnie sprawował się OpenSUSE (na zmianę z Windows oczywiście :)), ale postanowiłem ściągnąć i sprawdzić cóż takiego cudownego oferuje Ubuntu skoro o nim tak głośno.

Po ściągnięciu okazało się, że MS Virtual PC 2007 niespecjalnie chce go uruchomić. Zależało mi na tym, aby nie musieć wypalać płytki i restartować komputera ale skoro los chciał inaczej - trzeba było z nim walczyć. Nagrałem Ubuntu na płytę.

Przy bootowaniu systemu z płyty przywitało mnie logo Ubuntu z ładnym paskiem postępu na dole - nie trzeba chyba specjalnie długo się zastanawiać skąd taki pomysł ^^. Tak czy inaczej, wygląda to zdecydowanie ładniej niż “Mounting local filesystems… [ ok ]“, prawda? :) Z drugiej strony wadą jest to, że jeśli coś nie działa to nie widać tego przy uruchamianiu systemu i trzeba później przekopać logi. Pamiętajmy jednak, że Ubuntu to system dla użytkownika przesiadającego się z Windows. Takiemu nawet informacja o tym co nie działa i tak by nic nie dała więc ją ukryto ;)

Po uruchomieniu system ubrał się w GNOME - plus dla niego bo to moje ulubione środowisko graficzne. Aby nie tracić czasu, włączyłem Firefox’a z zamiarem pooglądania stronek. Okazało się jednak, że komputer nie jest podłączony do internetu. Mogłem się tego spodziewać. Problem tkwił w sterowniku do bezprzewodowej karty sieciowej. Na początku sądziłem, że nie jest on zainstalowany, ale okazało się, że sterowniki MadWiFi są i nawet działają! Problem w tym, że nie z moją kartą sieciową ^^.

To jednak nie był wielki problem, przy użyciu sterowników windows’owych, ndiswrapper‘a i herbaty uporałem się z tym dość szybko (mam doświadczenie z OpenSUSE - tam w ogóle nie było sterowników). Po uruchomieniu połączenia bezprzewodowego przyszedł czas na sprawdzenie działania filmów i plików muzycznych. Tutaj spotkała mnie wielka niespodzianka. Wszystko działa bez żadnego cudowania. Wystarczy po prostu kliknąć dwa razy na plik z filmem czy MP3 i system uruchamia odpowiedni program i zaczyna odtwarzanie! To jest nawet lepiej niż w Windows, ponieważ nie trzeba instalować programów do multimediów ani kodeków do filmów - wszystko już jest.

Pobawiłem się w systemie jeszcze trochę i postanowiłem go zainstalować. Co ciekawe - nie musiałem nawet uruchamiać ponownie komputera. Na pulpicie znajdowała się ikonka z opisem “Zainstaluj”. Kliknąłem na nią wyskoczył jakiś tam kreator instalacji, w którym wystarczyło właściwie wszędzie klikać “Dalej”. Po wszystkim na ekranie pojawiło się małe okienko (z 20×20px - mówiłem, że małe! :P). To rozpoczęła się instalacja. Problem w tym, że nie wiedziałem ile już zainstalowano i jak długo jeszcze to potrwa. Poszedłem więc odkurzać.

Po skończonym odkurzaniu wróciłem do komputera i ujrzałem komunikat o tym, że system został zainstalowany. Fajnie. Uruchomiłem ponownie komputer i zbootowałem mojego nowo zainstalowanego Linux’a. Znów trzeba było pobawić się z siecią WiFi, ale to krótka chwila. Później rozpocząłem bawienie się systemem :) Chcąc sprawdzić jak się sprawuje Wine zainstalowałem Unreal Tournament. Oczywiście nie miałem jeszcze sterowników do grafiki więc uruchomiłem go z opcją Software Rendering. Okazało się, że uruchamia się i chodzi jak marzenie! Postanowiłem więc zainstalować sterownik do grafiki. Trochę czasu mi to zajęło, ale to głównie przez moją nieuwagę. Wszystko można było zrobić w 10 minut korzystając z pomocy w internecie gdzie krok po kroku było opisane jak należy zainstalować grafikę.

Później znajomy zapytał mnie jak się sprawuje Wine z grami, więc opowiedziałem mu o UT. Poprosił mnie abym sprawdził czy Starcraft pójdzie. Sprawdziłem. Poszedł. Wystarczyło go normalnie zainstalować i wszystko śmiga jak należy. Później sprawdziłem jeszcze Heroes Of Might And Magic III - moją ulubioną wersję z całej serii. Także chodziła bez zarzutu.

Podsumowując, Ubuntu Linux jest godnym polecenia systemem dla każdego. Myślę, że kilka udogodnień nie będzie przeszkadzać zagorzałym linuxowcom skoro wszystko nadal da się zrobić w konsoli, a jest to niewyobrażalne ułatwienie dla każdego przeciętnego użytkownika komputera. Nie muszę już chyba wspominać o tym, że Ubuntu jest systemem darmowym.

Wyszukiwanie w Menu Start a’la Vista

Ostatnim razem kiedy otworzyłem sobie menu Start->All Programs cały ekran został zasłonięty przez kilkukolumnową listę programów, które mam zainstalowane na dysku. Nie trudno się domyślić, że znalezienie jakiegoś programu w tym bałaganie graniczy z cudem. Nawet jeśli dane są posortowane to i tak niewiele daje ponieważ nie zawsze wiemy na jaką literę zaczyna się folder zawierający interesujący nas program.

Zatęskniłem wtedy do cudownego rozwiązania z systemu Windows Vista, w którym po wciśnięciu przycisku Start wystarczy wpisać jakąś frazę, a on znajdzie nam w mgnieniu oka żądany program. Kluczową sprawą w takim wyszukiwaniu jest aby fraza była wyszukiwana w nazwie pliku w taki sposób, że użytkownik pamiętając jakąś tylko którąkolwiek część tej nazwy może otrzymać to czego oczekuje. Takie wyszukiwanie można przeprowadzić z pomocą wyrażenia regularnego: “.*fraza.*”.

Menu Search v1.0Pomyślałem, że fajnie byłoby stworzyć program, który działałby na podobnej zasadzie. Postanowiłem ograniczyć wyszukiwanie tylko do menu Start. Po decyzji o napisaniu programu pozostaje oczywiście wybór narzędzia, którego użyję. Do wyboru miałem trzy: Microsoft Visual C++ 2008 Express Edition, Borland C++ Builder, oraz Microsoft Visual C# 2008 Express Edition. Dodatkowo MSVC++2k8EE znam, ale programowanie okienek w nim jakoś mi nie leży. BCB jest fajne do tworzenia programów, ale ma niesamowicie ubogie możliwości. Pozostał więc MSVC#2k8EE. Tutaj sprawa też nie miała się najlepiej ponieważ w życiu nie napisałem nic porządnego w C#. Nie byłem pewien czy dam radę, ale postanowiłem sprawdzić. W końcu jeden nieukończony projekt w tą czy w tą to i tak bez różnicy przy tak dużej ich liczbie (tych nieskończonych) ;)

Po kilku godzinach kodowania, przeszukiwania internetu i maksymalnego wykorzystania inwencji twórczej, powstał program, który można już przedstawić. Nie działa on jeszcze w pełni poprawnie, ale większość jest.

Jak wiadomo - w menu Start znajdują się głównie linki do programów, a nie same programy. Jest to pewien problem ponieważ, z linków trzeba było jakoś wydobyć informację na temat tego co pokazuje. Na szczęście w C# okazało się to być całkiem proste. Jednak nie zawsze jest tak fajnie. Większość plików i programów działa bez zarzutu, jednak niektóre z nich nie chcą się uruchomić w ten sposób, a inne pokazują okienko o błędzie i możliwości wysłania tegoż do MS.

Uruchamianie realizowane jest przez taki kod:

WshShellClass wshShell = new WshShellClass();
IWshShortcut link = (IWshShortcut)wshShell.CreateShortcut(filePath);

//wshShell.Exec(link.TargetPath);
System.Diagnostics.Process.Start(link.TargetPath, link.Arguments);

Rozwiązanie z Process.Start() działa również dla plików nie będących plikami wykonywalnymi. Po prostu pliki uruchamiane są w domyślnych programach. Problem pojawia się ze skrótem do znanego programu Skype, który jako TargetPath ma taki oto ciąg:

C:\WINDOWS\Installer\{5C82DAE5-6EB0-4374-9254-BE3319BA4E82}\Skype.ico

Widocznie jest to jakiś inny rodzaj linku ponieważ, kiedy sprawdzam właściwości skrótu w miejscu Target okienko adresu jest nieaktywne i wpisane jest tam jedynie Skype 3.6.

Nie mam pojęcia w jaki sposób sobie z tym poradzić niestety.

 BTW:  Jaką piękną mamy wiosnę! Chyba zaraz pójdę na sanki!

Jak tymczasowo pozbyć się argumentu funkcji?

Dzisiaj wpadłem na pomysł jak można tymczasowo pozbyć się argumentu z funkcji, bez komentowania jej za pomocą /**/. Przykładowo, mamy wywołanie funkcji:

jakas_funkcja( argument1, argument2, argument3 );

Załóżmy, że argument drugi jest wskaźnikiem i chcemy go chwilowo ustawić na NULL bez usuwania samego argument2. Naturalnym byłoby zastosowanie komentarza, ale dzięki specyfikacji C++ można to zrobić jeszcze fajniej ^^

jakas_funkcja( argument1, (argument2,NULL), argument3 );

I o co w tym chodzi? :) Otóż kiedy program dotrze do drugiego parametru funkcji, natrafi na wyrażenie (argument2, NULL). Niezależnie od tego jaki by nie był argument2 wynik takiego wyrażenia jest zawsze wynikiem ostatniego “pod-wyrażenia” - czyli w tym wypadku NULL. Dlatego też do funkcji zostanie przekazana wartość NULL. Później jeśli już chcemy przywrócić argument2 do łask - wystarczy wywalić “,NULL” i można zostawić samo “(argument2)” bo ten nawias już i tak nic nie zmienia, a w przyszłości możemy go znów wykorzystać do tego samego celu ;)

Niby nic, a czasem przydatne - zwłaszcza jeśli argument2 jest wywołaniem jakiejś funkcji i chcemy aby się ona wykonała, ale chwilowo nie chcemy przekazywać wyniku tej funkcji do jakas_funkcja().

Wpadłem na ten pomysł właściwie przed chwilą, ale to głównie dzięki mojemu profesorowi prowadzącemu wykład z C, który zwrócił mi uwagę, na fakt, że wartością całego wyrażenia - jeśli mamy kilka przecinków - jest zawsze to po ostatnim przecinku.

Podsumowując - nawet z 8-letnim doświadczeniem z C++ warto chodzić na wykłady z C ;) (poza tym to świetna okazja, żeby sobie coś zakodzić przy okazji słuchając muzyki i od czasu do czasu wykładowcy ;P)

Distortion Mesh

Pomyślałem, że fajnym pomysłem byłoby dodanie do AGE obiektu o wdzięcznej nazwie Distortion Mesh. Już po nazwie łatwo się domyślić do czego może służyć ten stwór ^^ Zresztą i tak większość wie co to jest nawet bez zbyt głębokiego zastanawiania się :)

 Tak czy inaczej - czyli, aby notka nie była za krótka - napiszę co to mniej więcej jest. Distortion Mesh można sobie przetłumaczyć na: “siatka zniekształcenia”. Na rysunku poglądowym obok widać przykładową siatkę wielkości 4×4. Cały trick teraz polega na tym, że jeśli przesuniemy jeden z punktów (zielone kropki ^^) to obrazek zostanie zniekształcony tak, aby część obrazka odpowiadająca temu punktowi nadal była pod nim. To tak jakby przykleić te punkty do gumowego obrazka i potem poruszając punkty rozciągać obrazek.

Jeśli chodzi o napisanie czegoś takiego - myślę, że najprostszy sposób będzie, jak zawsze, najlepszy. Zakładając, że chcemy mieć siatkę KxW (K - ilość kolumn; W - ilość wierszy). Wystarczy stworzyć tablicę K*W wierzchołków i początkowo rozłożyć je równomiernie na teksturze przypisując im odpowiednie koordynaty i pozycje. Później wystarczy już tylko przesuwać punkty i cieszyć się jak dziecko z otrzymanego efektu.

Myślę, że nie powinno to zająć specjalnie dużo czasu - o ile metoda, którą sobie wymyśliłem zadziała wystarczająco dobrze :)

No to idę kodzić.

Programowanie Niskopoziomowe - MARIE

Na ostatnim wykładzie z systemów operacyjnych pojawiła się MARIE (Machine Architecture that is Really Intuitive and Easy). Bardzo przyjemnie słuchało się o tym, że programiści nie musieliby już przepinać kabli na wielkich ścianach aby dodać 2 liczby, jednak sposób programowania tej maszyny - na dzień dzisiejszy - daleko odbiega od jej nazwy. Głównym problemem jest tutaj część: “Intuitive and Easy”. Mam swoje zdanie na temat intuicyjności i prostoty programowania ;)

Tak czy inaczej. Nie udało się uniknąć starcia z Assemblerem MARIE. Po szybkim zapoznaniu się z nim od razu zauważyłem, że Assembler, którego używa się w dzisiejszych komputerach jest wręcz językiem wysokiego poziomu ;) Programowanie MARIE nie jest strasznie trudne, ale dość męczące. Tym bardziej, że na wykładzie dostaliśmy zadanie napisania programu sumującego n pierwszych wyrazów ciągu Fibonacciego.

Oczywiście na rozgrzewkę trzeba było napisać sobie kilka programów. Przykładowo program do dodawania dwóch liczb pobranych od użytkownika wygląda tak:

	Input
	Store 	TMP
	Input
	Add	TMP
	Halt
TMP,	DEC	0

Napisanie programu sumującego n pierwszych liczb ciągu Fibonacciego zajęło mi dobre kilka godzin, ze względu na to, że ciężko było się w nim połapać. Obowiązuje tu zasada: “Jeśli napisany kod nie działa jak należy, zamiast naprawiać - napisz go od nowa.”, którą oczywiście właśnie wymyśliłem.

Ogromnym utrudnieniem programowania tej maszyny jest fakt, ze nie daje się dodawać ani odejmować stałych bezpośrednio w kodzie. Trzeba je ręcznie zapisywać w kodzie. Przykładowy kod zwiększający N o 1:

	Load	N
	Add	ONE
	Store	N
	Halt
N,	DEC	0
ONE,	DEC	1

Nie ma także instrukcji do mnożenia więc programowanie czegoś bardziej złożonego jest raczej trudne ^^ Tak czy inaczej, muszę się przyznać, że podobała mi się ta zabawa w programowanie Undergroundowe ;)