Uczę się japońskiego języka

Wbrew pozorom, szyk wyrazów w tytule jest poprawny. Ale zacznijmy od początku.

Od pewnego czasu w różnych miejscach sieci migała mi nazwa rewolucyjnego – jakoby – frameworka o nazwie Ruby on Rails. Framework jest pewnym szkieletem, o który można oprzeć swoją aplikację – dzięki czemu nie trzeba się martwić np. o przejrzysty układ katalogów, o procedury obsługi bazy danych, etc. Do tej pory programowałem głównie w PHP i uważałem, że język ten jest całkiem przyjemny i dobrze nadaje się do zastosowań, do których go używam. Stosowanie frameworków PHP uważałem raczej za stratę czasu i ograniczenie elastyczności (chyba, że mój własny prosty schemat, wg. którego budowałem większość aplikacji, można nazwać frameworkiem).

Jednakże, jak już powiedziałem, buszując w Internecie zacząłem dość często natrafiać na strony poświęcone Ruby on Rails. Trafiłem tak na blog Jarosława Zabiełły, na polską stronę Railsów, wreszcie na stronę główną i na 15-minutowy filmik (screencast). Filmik ten przedstawiał ni mniej ni więcej, a tworzenie (od zera) systemu obsługi bloga. Zainteresowało mnie to – blog w 15 minut?

Poszperałem dalej. Zwykle z nieufnością podchodzę do sformułowań w stylu: „programowanie aplikacji internetowych nigdy nie było tak proste!”, jednak pewne argumenty (np. niesamowita szybkość i oszczędność kodu) powtarzały się we wszystkich miejscach poświęconych RoR.

Czym więc właściwie są te Railsy?

Jak już napisałem powyżej, Ruby on Rails to framework, znakomicie ułatwiający tworzenie aplikacji internetowych w języku Ruby. Język Ruby jest językiem stworzonym 12 lat temu w Japonii. Jest on w pełni obiektowy i pozwala dowolnie się modyfikować (można np. sposób, w jaki język obsługuje liczby całkowite). Railsy zostały stworzone kilka lat temu przez Duńczyka – Davida Heinemeiera Hanssona. Stanowią one kompletny i jednolity system, pozwalający tworzyć aplikacje w oparciu o architekturę (jak to strasznie brzmi!) Model-Widok-Kontroler (MVC).

Po zapoznaniu się z informacjami nt. RoR, pomyślałem, że jeśli wszystko co do tej pory przeczytałem jest prawdą, to jest to system nadający się idealnie dla mnie. Wizja systemu, który sam wykona za mnie najczarniejszą robotę (komunikacja z bazą danych na przykład) bardzo mi się spodobała. Tak bardzo, że postanowiłem zakupić książkę i po prostu się Railsów nauczyć. Niestety, w ofercie polskiego wydawcy nie znalazłem nic, co by mnie szczególnie zainteresowało. Znalazłem natomiast (już na innych stronach) opis książki Agile Web Development with Rails. Książka ta miała pochlebne recenzje. Jak jednak sprowadzić sobie tę książkę z zagranicznego wydawnictwa? Z pomocą przyszedł Empik.

Zamówiłem więc w niedzielę wieczorem. We wtorek rano dostałem informacje, że mogę odebrać książkę w wybranym punkcie. Tekst z tyłu okładki wyglądał zachęcająco: Twoim zadaniem jest napisać wysokiej jakości, pięknie wyglądającą aplikację internetową. Ma być gotowa na jutro, ale będziesz się nią opiekował przez lata. Chcesz użyć sztuczek takich jak AJAX by uczynić swoje aplikacje prostsze w obsłudze i lepiej odpowiadające potrzebom klientów. Chcesz również użyć technik takich jak REST, by Twoje aplikacje mogły łatwo współdziałać z innymi aplikacjami. Ruby on Rails może być tym, czego szukasz.

No i zacząłem czytać. Dawno nie miałem takiej frajdy. Pomyślałem, że jeśli chcę dobrze nauczyć się tego języka i tego frameworka, to będę sumiennie wykonywał krok po kroku wszystko tak, jak jest to zapisane w książce. Jest to strasznie fajne. W dzieciństwie lubiłem układać budowle z klocków LEGO, zgodnie z zamieszczonymi instrukcjami (by później rzecz jasna utworzyć coś własnego). Nauka RoR przypomina z Agile Web Development przypomina mi tamte zabawy. Czemu tak mi się te Railsy podobają? Otóż:

  • Pozwalają zachować porządek. Każdy element aplikacji ma tu swoje miejsce, nazwę i zakres działań – wszystko ustalone z góry. Nie muszę się martwić o wymyślenie struktury tego wszystkiego – Rails robi to za mnie.
  • Są jednolite i konsekwentne. Bardzo lubię, gdy coś jest konsekwentne. Tutaj wszystkie stosowane konwencje (np. nazwy obiektów) są ustalone i przestrzegane. W PHP panuje pod tym względem pełna samowola (do niektórych funkcji można się dostać jedynie tworząc odpowiedni obiekt, nazwy niektórych funkcji sanierozdzielone, inne są_rozdzielone_podkreśleniami).
  • Posiadają ActiveController. Od długiego czasu szukałem do PHP jakiegoś systemu, który odczytałby stworzoną przez mnie bazę danych i na jej podstawie stworzył odpowiednie klasy, ze wszystkimi zależnościami, z możliwością rozszerzenia, itd. ActiveController robi to wszystko przy minimalnym udziale użytkownika (dyrektywy w stylu belongs_to lub has_many). Żadnej dodatkowej konfiguracji!
  • Bajecznie prosta obsługa AJAX-a. Możliwe jest uzyskanie nieprzeładowujących się stron dzięki zamianie jedynie kilku linii.

Myślę, że takich takich pozytywnych cech jest więcej – zapewne coś jeszcze o RoR pojawi się na blogu. Polecam.

Pachnidło

W drodze na Kongregację Odpowiedzialnych skończyłem czytać zewsząd reklamowany bestseller Pachnidło. Czymś, co zaciekawiło mnie najbardziej są opisy. Nie ma tu opisów tego jak coś wygląda, ale jak to pachnie. Przywołane zostały setki nazw zapachów. Inna sprawa, że niewiele z nich kojarze, ale podziwiam autora, który wykazał się dużym znawstwem opisywanej dziedziny. No, w każdym razie umiał stworzyć takie pozory ;). A poza tym? Przeciętne moim zdaniem – fabuła bez jakichś ogromnych niespodzianek, pomysł z głównym bohaterem – geniuszem zapachu – może i dobry, ale po tych 200 stronach zdążył się jakoś znudzić (przynajmniej mi). Końcówka wzbudziła we mnie mieszane uczucia (może to i dobrze?) – z jednej strony jakaś taka nijaka, a z drugiej to dobre zakończenie powieści, która cała jest utrzymana w turpistycznej estetyce. W skali szkolnej: 4.

Nowy umysł cesarza

Jestem właśnie w trakcie lektury książki Rogera Penrose‚a pt. Nowy umysł cesarza. Autor zastanawia się, czy możliwe jest stworzenie komputera, który działałby tak jak ludzki umysł. Ale jak ten umysł właściwie działa? Aby to wyjaśnić, autor uważa za niezbędne przedstawienie teorii kwantów, ogólnej i szczególnej teorii względności, „klasycznych” teorii fizycznych, zagadnienia obliczalności, determinizmu, twierdzenia Gödla i wielu innych ważnych teorii nauk ścisłych. Czyni to jednak w sposób zrozumiały, każda nowa teoria jasno wypływa z poprzednich, a na początku wystarczy znajomość podstaw matematyki.

Zadziwiający dla mnie jest fakt, że w celu opisania działania ludzkiego umysłu, trzeba powoływać się na tak wiele nowych i zaawansowanych teorii. Jednak nawet te zaawansowane teorie nie wystarczają, aby w pełni wyjaśnić jak to się dzieje, że człowiek potrafi wymyśleć takie rzeczy i rozwiązać takie problemy, których setka komputerów nie rozwiąże nigdy.

Człowiek jest więc zwieńczeniem stworzenia, umysł jest bytem korzystającym z najbardziej zaawansowanych (a może właśnie najbardziej pierwotnych i podstawowych) właściwości naszego świata. Czy istnieją nauki bardziej humanistyczne niż nauki ścisłe, skoro matematyka i fizyka pozwalają nam dojść do takich właśnie wniosków?

Czarne oceany

Podtytuł bloga został zaczerpnięty z mojej ulubionej książki: Czarne oceany. Autor – Jacek Dukaj – przedstawił w niej dość spójną i niestety pesymistyczną (czarną?) wizję przyszłości. Wizja ta składa się z bardzo wielu mniejszych i większych cegiełek – pomysłów Dukaja, dotyczących bardzo różnych sfer życia. Te które najbardziej utkwiły mi w pamięci, to:

Nowa Etykieta. Zaczęło się od procesów o molestowanie seksualne w pracy pod koniec lat ’90 XX wieku. Szereg precedensów doprowadził do sytuacji, w której uśmiech do przechodzącej ulicą kobiety może stać się przestępstwem karanym gigantyczną grzywną (równą życiowemu dorobkowi). Gesty takie jak poklepanie kogoś po plecach, czy wejście do czyjegoś biura bez odpowiednich formułek powitalnych jest już zbrodnią.

Metagiełda. Czyli giełda, która nie odzwierciedla niczego prócz giełdy. Zaczęło się od stosowania prostych programów eksperckich, umożliwiających sprzedaż całości akcji w czasie krachu. Z czasem programy te stawały się coraz bardziej inteligentne, aż do momentu, w którym to one podejmują wszystkie ważne decyzje. Ludzie zajmują się jedynie konserwacją. Najgorsze jest to, że nie ma z tego systemu ucieczki – kraj czy instytucja, która chciałaby zrezygnować z programów eksperckich, zostanie po prostu bankrutem – człowiek nie dorówna w metagiełdowych analizach maszynie. Skutkiem ubocznym jest to, że wskaźniki giełdowe i zależności między nimi stały się nie do pojęcia nawet dla siedzących w cztero- i pięciowymiarowych symulacjach operatorów.

Komputery osobiste. To jest pomysł, który podoba mi się najbardziej. Komputery osobiste nie mają już postaci beżowych skrzynek, nie chowa się ich nawet do kieszeni, a wszczepia bezpośrednio w układ nerwowy. Komunikacja z takimi wszczepkami odbywa się w oparciu o rzeczywistość wirtualną – obok użytkownika takiego komputera pojawia się postać menadżera wszczepki, któremu można wydawać polecenia (myślami, lub przy użyciu np. fantomowego szóstego palca). Dukaj w pełni rozumie możliwości, jakie daje taka wszczepka. W pewnym momencie bohater znajduje się w ciemnym pomieszczeniu. Menedżer wszczepki każe mu klasnąć, a następnie analizując to, jak rozchodzi się dźwięk, jest w stanie ukazać bohaterowi zarysy pomieszczenia (oczywiście w VR). Istnieją – nielegalne wprawdzie – programy w pełni modyfikujące docierającą do ich użytkownika rzeczywistość. Chętni mogą na przykład przenieść się do świata horrorów Lovecrafta. Jak wówczas jednak rozpoznać, czy docierające bodźce są ciągle elementem gry, czy też prawdziwą rzeczywistością? Istnieją również w pełni legalne edytory ruchu, wspomagające strzelanie z pistoletu czy umiejętności oratorsko-retoryczne.

Telepatia. Jednym z głównych elementów książki jest telepatia – tutaj rozumiana bardziej jako pewne upośledzenie układu odpornościowego. Oczywiście nie chodzi o odporność na zarazki, lecz o odporność na psychomemy – hipotetyczne byty, towarzyszące procesowi myślowemu dowolnej istoty. Mózg osoby nieodpornej przyjmuje psychomemy jako własne myśli i uczucia. Skutkiem jest telepatia – myślenie i czucie tego samego, co osoba znajdująca się w pobliżu. A co gdyby pojawiła się epidemia wirusa, który osłabiałby układ odporności na cudze psychomemy? Szaleństwo tłumu, czerń psychomemów zalewająca chore umysły, czarne oceany…

Zbiór Mandelbrota

Kiedyś, gdy byłem dość młodym użytkownikiem 8-bitowego komputera Atari 65XE (z magnetofonem XC12 jako pamięcią masową) zobaczyłem w telewizji program edukacyjny poświęcony fraktalom. Zaciekawiło mnie to, że każdy fragment takiego fraktala po przybliżeniu daje w obraz bardzo podobny do całości. Marzyło mi się, żeby móc narysować coś takiego na moim komputerze – niestety nie posiadałem w tamtym czasie dostatecznych umiejętności matematyczynych, by zrozumieć w ogóle czym np. taki zbiór Mandelbrota jest (nie miałem zresztą również skąd zaczerpnąć tej wiedzy).

Na szczęście teraz mam dostęp do Wikipedii, a także znam już liczby zespolone – okazuje się, że nic więcej nie potrzeba, by zrozumieć, czym jest fraktal i jak go narysować. Jeśli jednak drogi czytelniku nie wiesz, czym są liczby zespolone, to nie przejmuj się tym za bardzo. Na użytek poniższego tekstu możemy przyjąć po prostu, że liczba zespolona określa pewien punkt na płaszczyźnie (tak jak liczba rzeczywista określa pewien punkt na prostej). Liczby zespolone najczęściej zapisuje się tak: [tex](a,b)[/tex], lub tak: [tex]a+bi[/tex]. Liczba [tex]i[/tex] ma taką ciekawą właściwość, że podniesiona do kwadratu daje [tex]-1[/tex]: [tex]i^2=-1[/tex]. Wiedza ta przyda nam się do wyprowadzenia wzoru na kwadrat liczby zespolonej, który to wzór jest niezbędny do narysowania ładnego fraktala: [tex](a+bi)^2=a^2+2abi+(bi)^2=a^2+2abi-b^2=a^2-b^2+(2ab)i[/tex].

Wiemy już, czym są liczby zespolone, jak można taką liczbę podnieść do kwadratu, możemy więc określić, czym jest zbiór Mandelbrota. Otóż, zbiór Mandelbrota, to zbiór takich liczby zespolonych [tex]p[/tex], dla których ciąg określony wzorem rekurencyjnym:

[tex]z_0=0[/tex]
[tex]z_{n+1}={z_n}^2+p[/tex]

ma określoną granicę (nie dąży do nieskończoności). W praktyce wystarczy sprawdzić, czy punkt określony przez tę liczbę zespoloną, leży w odległości mniejszej od [tex]\sqrt{2}[/tex] od początku układu współrzędnych (w Wikipedii napisane jest, że dla [tex]2[/tex], a nie dla [tex]\sqrt{2}[/tex], ale widocznie działa i tak i tak). Odległość punktu określonego przez liczbę zespoloną od początku układu współrzędnych można dość prosto obliczyć. Dla liczby zespolonej [tex](a,b)[/tex] jest to po prostu [tex]\sqrt{a^2+b^2}[/tex]. Odległość ta nazywa się modułem liczby zespolonej. Moduł ten musi więc wynosić mniej niż [tex]\sqrt{2}[/tex] dla pewnej liczby pierwszych wyrazów ciągu [tex]z_n[/tex]. Powstaje oczywiście pytanie: ile tych pierwszych wyrazów trzeba zbadać. Odpowiedź nie jest taka prosta – im mniej wyrazów zbadamy, tym szybszy uzyskamy algorytm, ale z drugiej strony – tym mniej dokładny obraz fraktala powstanie.

Pozostaje jeszcze pytanie o kolory. Fraktale, które widziałem w telewizji były bardzo kolorowe, tymczasem w/w algorytm pozwala nam jedynie domyśleć się, gdzie postawić kropkę, a gdzie jej nie stawiać. Otóż, jeśli w pewnych punktach [tex]n[/tex]-ty wyraz ciągu z ma moduł większy od [tex]\sqrt{2}[/tex], to [tex]n[/tex] możemy sobie zapamiętać i na jego podstawie pokolorować punkt, który aktualnie rozważamy.

„Przepis” na narysowanie fraktalu Mandelbrota jak widać nie jest bardzo skomplikowany, a pozwala uzyskać zadziwiające efekty. Pół godziny pracy w C# zaowocowało następującym obrazkiem:

Zbiór Mandelbrota narysowany przy użyciu programu w C#.

Jednak to nie koniec. Zachęcony powodzeniem tej operacji, postanowiłem sprawdzić, czy małe Atari poradzi sobie z narysowaniem fraktala (pomyślałem, że wystarczy przedstawienie dwukolorowe). Efektem krótkiego (nieco ponad 20 linijek!) programu w Basicu jest następujący obrazek:

Zbiór Mandelbrota narysowany przy użyciu Atari 65XE.

Mimo, że program w Basicu był krótszy niż ten w C# (a może właśnie dlatego), wykonywał się on o wiele dłużej. Uruchomiłem go na emulatorze z opcją Full speed (prędkość 10-krotnie przewyższająca oryginalne Atari), a mimo to obrazek powstawał przez kilkanaście godzin. Może gdyby zakodować to w asemblerze

Listing programu w Basicu.

Źródła w C#.

Początek.

To mój pierwszy wpis, więc wypadałoby się przedstawić. Jestem Newton, studiuję informatykę na UMK, działam w Ruchu Światło-Życie. Te dwie moje główne aktywności wyznaczają dość dobrze spektrum moich zainteresowań: od informatyki (ostatnio szczególnie VoIP, od dłuższego czasu PHP), poprzez matematykę, filozofię, literaturę, aż po teologię. Myślę, że blog jest dobrym miejscem, by podzielić się przeczytaną książką, czy radością z dodania rewolucyjnej opcji do otwartej centralki Asterisk. Nie wydaje mi się natomiast, żeby blog był dobrym miejscem na dzielenie się osobistymi problemami, czy wydarzeniami – dlatego też wielbiciele ekshibicjonizmu nie znajdą tu zbyt wiele interesujących postów.