Archiwa kategorii: technikalia

Braid

Kupiłem sobie wczoraj grę za 2 euro (zaleta Steama – można kupować w niedziele i święta bez łamania 3 przykazania). Braid, bo tak nazywa się to cudo, warta jest każdego centa. Ale po kolei.

Fizyka

Braid to przedstawiciel szlachetnego gatunku platformówek, a więc następca tytułów takich jak Mario Bros, Superfrog czy Earthworm Jim. Zwłaszcza z tą pierwszą grą ma sporo wspólnego, ale o tym później. Bohaterem jest niejaki Tim, który skacze po różnych platformach, łazi po drabinkach, zdobywa fragmenty puzzli (główny cel gry), omija wrogów i robi wszystko to, czym zajmują się inni bohaterzy platformówek. Różnica jest jedna, ale zasadnicza. W tej grze nie można przegrać. Gdy Tim zginie, wystarczy nacisnąć Shift aby cofnąć czas do pożądanego momentu (przypomina to przewijanie do tyłu na wideo) i spróbować jeszcze raz. Mało tego – często cofnięcie czasu jest często konieczne dla rozwiązania tej czy innej łamigłówki. Możliwość takiej zabawy czasem (przewijać można też do przodu) daje naprawdę dużo możliwości i zmusza do intensywnego wysilenia szarych komórek (wszak nie w 2, lecz w 3 wymiarach się poruszamy).

Estetyka

Gra jest piękna. Po prostu. Dawno nie widziałem tak ładnej oprawy graficznej. Postaci, tła i wszystkie elementy występujące w grze wyglądają jak malowane (dosłownie), są bardzo kolorowe no i miło się na to patrzy. Czasem pojawiają się elementy przypominające te znane z uniwersum Mario Brosa (rura z żarłocznym kwiatem, zamek z chorągwią), jednak wszystko w takiej właśnie malowanej estetyce.

Muzyka jest doskonała. Ni mniej ni więcej. Wszystkie melodie nieco melancholijne, czasem smutne, czasem poważne. Kojarzą się z muzyką filmową (Źródło? Gladiator? Braveheart?) Gdy cofamy czas, również muzyka „leci od tyłu”, a całości dopełniają efekty dźwiękowe.

Psychologia

To wszystko dopiero preludium. Pamiętacie o co chodziło w Mario? Nasz hydraulik poszukiwał tam swojej Księżniczki. Dlatego pokonywał kolejne światy, łaził po tym zamkach, niszczył wrogów. W Braid cel jest taki sam, jednak potraktowany jest on znacznie poważniej, a cała rozgrywka i kolejne światy staje się rodzajem rozprawy o naturze miłości, związku, dojrzałości. Każdy świat poprzedzony jest opisem, scenką rodzajową z życia Tima i jego Księżniczki, zaś zbierane w danym świecie puzzle układają się w ilustrację obrazującą ową scenkę. A słowa, że Księżniczki nie ma w tym zamku naprawdę łapią wtedy za serce.

Wiedział, że próbowała przebaczyć, ale któż mogłby po prostu zapomnieć o kłamstwie wbitym niczym sztylet w plecy? Taka pomyłka nieodwracalnie zmienia całą relację, nawet jeśli czegoś nas ona nauczyła i nigdy się już nie powtórzy. Zwęziły się oczy Księżniczki. Oddaliła się.

newtrace

Ostrzegam – wpis raczej techniczny 😉

Jak działa traceroute (na Windows – tracert) wie każdy szanujący się student informatyki. Do hosta docelowego wysyłane są pakiety z początkowo małymi, później coraz to większymi liczbami TTL. Ponieważ TTL zmniejsza się o 1 z każdym przeskokiem do kolejnego routera to wiadomo, że osiągnie ostatecznie wartość 0. Router na którym to nastąpi zwraca do hosta źródłowego informację o przekroczeniu czasu. Host źródłowy wypisuje na ekranie kolejne adresy, które zwróciły taką informację i powstaje nam całkiem ładna trasa. Pakiet z TTL-em równym 1 pozwala nam wykryć najbliższy router, z numerem 2 kolejny i tak aż dojdziemy do celu.

Wiadomo jednak, że, tak jak kij, każdy router ma co najmniej dwa końce – są to interfejsy sieciowe. traceroute pozwala nam wykryć jedynie jeden koniec każdego routera – interfejs „po naszej stronie”. Zerknijmy na poniższy komiks:

traceroute uruchomiony na komputerze pozwoli poznać adres IP interfejsów eth0 i eth2. Niestety, interfejsy eth1 i eth3 pozostają ukryte. A raczej pozostawały – do dzisiaj!

Program newtrace pozwala na śledzenie trasy pakietu, uwzględniając wszystkie interfejsy sieciowe przez które on przechodzi. Innymi słowy, dzięki niemu otrzymamy elegancką listę routerów, zaś każdy z nich będzie miał przyporządkowane dwa adresy: interfejs wejściowy (w powyższym wypadku eth0 i eth2) i wyjściowy (na diagramie – eth1 i eth3).

Jak to działa? Przez zgadywanie. Zerknijmy raz jeszcze na diagram i załóżmy, że interesuje nas adres interfejsu eth1. Wiemy 2 rzeczy:

  1. interfejs ten fizycznie znajduje się na routerze 1,
  2. interfejs jest w tej samej podsieci, co interfejs eth2.

Ponieważ znamy adres interfejsu eth2, możemy określić listę adresów IP znajdujących się w tej samej podsieci. A raczej moglibyśmy, gdybyśmy znali również maskę. Z praktyki wynika jednak, że takie między-routerowe połączenia to bardzo małe podsieci o maskach na przykład /30 lub /29.

Załóżmy więc, że lista jest określona. Nie pozostaje nic innego, jak wysyłać żądania echo request do każdego z adresów. Kluczową rzeczą jest tu TTL – ustawiamy go na taką samą wartość, jak dla pakietu, który dotarł wcześniej do eth0 (czyli w naszym przykładzie: 1). Dzięki temu, jeśli pakiet dotrze do testowanego adresu IP zyskujemy pewność, że jest on przypisany do routera 1. A skoro jest przypisany do routera 1 i znajduje się w tej samej podsieci co eth2, to jest to eth1. â–¡

Pozostaje jeszcze sytuacja, w której przetestowaliśmy hipotetyczne podsieci o masce /30, /29, a nawet /28 i dochodzimy do jakiejś ogromnej podsieci, zawierającej setki lub więcej adresów, które trzeba przetestować. Można to robić, jeśli nam zależy. W implementacji powyższego algorytmu stosuję jednak ograniczenie – jeśli szukany adres nie znajdzie się w podsieciach o maskach większych lub równych /28, to proces szukania jest przerywany. Wartość tę można modyfikować parametrem -m podanym z linii komend.

Ponieważ program robi różne dziwne rzeczy na gniazdach, wymaga uruchomienia jako root. Źródła na githubie, można ściągnąć paczkę. Całość oczywiście w Ruby.

UPDATE 22 X 2009

Dodałem jeszcze trzy końcowe testy, wszystkie sprawdzają, czy eth0 i domniemany eth1 są na tym samym routerze:

  1. newtrace sprawdza, czy do domniemanego eth1 nie dochodzi przypadkiem pakiet z niższym TTL-em,
  2. sprawdza też, czy w odpowiedziach echo reply ustawiona jest ta sama wartość TTL-a (różne systemy mogą ją sobie różnie ustawiać),
  3. sprawdza w końcu (i to jest test ostateczny ;))czy identyfikatory pakietu IP odpowiedzi echo reply z eth0 i domniemanego eth1 są podobne (czy nie różnią się o więcej niż 10). Jeśli tak, to istnieje bardzo duże prawdopodobieństwo, że eth0 i eth1 są na tej samej maszynie. Jedynym wyjątkiem jest sytuacja, w której interfejsy są jednak na różnych maszynach, ale żadna z nich nie ustawiają pola identyfikatora (równe jest 0).

hikerlog – serwis blogów podróżniczych

Od dłuższego już czasu pracuję nad nowym serwisem o nazwie hikerlog. Strona umożliwiać będzie tworzenie blogów podróżniczych i opisywania podróży już w czasie ich trwania. Serwis zamierzam upublicznić w sierpniu, ale już teraz można tam zajrzeć, poczytać i obejrzeć kilka krótkich fotorelacji. Za tydzień będzie jeszcze ciekawiej – postaram się przetestować hikerloga w praktyce i opisywać na bieżąco wycieczkę na trasie West Highland Way.

Gingerbread – prezentacja

Jedną z fajniejszych rzeczy na studiach jest Programowanie zespołowe. Wszyscy studenci III roku podzieleni są na 5-osobowe zespoły i przez cały rok każda grupa pisze jakiś program – wymyślony przez siebie lub narzucony przez opiekuna. W maju lub kwietniu odbywa się gala, na której grupy prezentują swoje dokonania. Wszystko to naprawdę robi wrażenie i muszę przyznać, że w poprzednich latach patrzyłem na dokonania starszych kolegów z dużym podziwem. Dzięki TV UMK już po 1,5 miesiąca (!) mogę przestawić naszą prezentację. Projekt nazywa się Gingerbread.

Konkurs na najszybszego sapera

Do ostatniej gry dodałem możliwość zapisania się na liście najlepszych, więc wszystkich którzy mają w sobie ducha rywalizacji zapraszam do udziału w konkursie na najsprytniejszego atomowego sapera. Należy po prostu jak najszybciej rozbroić pole minowe wielkości 16×16. Zapraszam do zabawy. Wygraną jest możliwość udzielenia wywiadu na elitarnym blogu newton.net.pl. Konkurs trwać będzie do końca maja. Oto lista najlepszych:

Parę słów o liczbach losowych

Komputery są fajne. W pół sekundy umieją policzyć ile jest 42363 * 1234 a w czasie wyświetlania wyniku mogą przy okazji puścić ulubioną empetrójkę. Niestety, w pewnym sensie komputery są jak inteligentny, choć nudny sąsiad na imprezie. Bez problemu powie Ci, jaka jest stolica Paragwaju, ale kiedy przychodzi zrobić coś naprawdę szalonego, nie masz co na niego liczyć. Rozłoży bezradnie ręce i głupawo się uśmiechnie. Dobrze, ale dlaczego komputer miałby robić coś szalonego?

Okazuje się, że komputerom czasem przydałoby się nieco nieprzewidywalności. Kiedy grasz w Sapera, to liczysz na to, że miny będą za każdym razem w innych miejscach – inaczej gra byłaby równie ciekawa, jak rozmowa z zegarynką. Odrobina nieprzewidywalności przydaje się też w poważniejszych sytuacjach. Gdy kupujesz w Internecie roczny zapas Pepsi, wpisując swój numer karty kredytowej, to naprawdę liczysz na to, że nikt inny tych danych nie podejrzy. Komputer szyfruje całą Twoją komunikację, wykorzystując pewne dane losowe jako tak zwany klucz.

Komputer. Dane losowe. Jest w tych dwóch sformułowaniach jakaś sprzeczność (coś jakby „Mój Nudny Znajomy Z Imprezy” i „Rowerowa Wycieczka Po Pustyniach Ameryki Południowej”). Komputer wykonuje ścisłe polecenia: weź tę liczbę, dodaj to tamtej, pomnóż wynik i wyświetl to na ekranie. Te operacje łatwo mu zdefiniować. Ale jak zmusić go, by coś wylosował? Odpowiedź jest bardzo prosta: nie da się.

Po prostu, nie da się zapisać algorytmu losowania liczby, dlatego, że liczba losowa z definicji nie jest generowana żadnym algorytmem. Oczywiście miłośnicy Sapera odezwą się: hola hola, przecież komputer układa mi te miny za każdym razem w inny, losowy sposób. Prawda. Jednak nie jest to sposób losowy, a pseudolosowy. Coś jak z tą demokracją i demokracją ludową.

Istnieją pewne funkcje matematyczne, których kolejne wartości są bardzo dziwne, pozornie niezwiązane ze sobą. Nie tak jak stary dobry sinus, co się wiecznie powtarza, czy logarytm, który nie chce dorosnąć. Są to dziwne funkcje, których wartość raz wynosi 12, w kolejnym kroku 54 a za chwilę znowu 37. Ktoś kto przyjrzałby się z boku takiej funkcji, nie znając jej wzoru, krzyknąłby: „te liczby nie mają żadnego związku, wyglądają jakby były losowe”. Słusznie, takie jest ich zadanie.

Komputery, gdy prosi się je, by podały nam liczbę losową, podają po prostu kolejną wartość takiej funkcji. A my, naiwni, wierzymy, że wartość ta rzeczywiście jest dziełem przypadku. Warto zwrócić uwagę, że każda taka funkcja losowa musi od czegoś zacząć. Inaczej mówiąc: musimy komputerowi podać pierwszą liczbę (ziarno), żeby na jej podstawie wygenerował kolejną. Jeśli podamy dwa razy tę samą liczbę jako ziarno, wówczas otrzymamy ten sam rozkład min na mapie. Ziarno więc powinno być w jakiś sposób losowe.

Dochodzimy do punktu wyjścia: skąd do … wziąć liczbę, którą podamy jako owe ziarno? Można użyć się na przykład bieżącego czasu (Saper uruchomiony o tej samej godzinie na innym komputerze będzie miał miny w tym samym miejscu), dla kolegów informatyków zapiszę ten pomysł jako

srand(time(NULL));

Inni używają na przykład temperatury procesora, czy danych na temat brzęczenia dysku twardego – uciekamy się więc do świata rzeczywistego, który jest naprawdę nieprzewidywalny (świetnym przykładem jest MZK Toruń, w szczególności linia nr 15). Wszystko to jednak nieco koślawe.

W świecie Internetu można by w elegancki sposób rozwiązać ten problem. Dlaczegóż by nie posadzić 100 osób, by rzucały setką kostek do gry, wpisywały wyrzucone liczby do komputera i zamieszczały je w Internecie, jako liczby rzeczywiście losowe, które każdy mógłby sobie ściągnąć? Pomysł ten został zresztą zrealizowany (z tym, że bez kostek, no i bez 100 osób).

Każde dziecko wie, że najbardziej nieprzewidywalną rzeczą na świecie jest pogoda (no, oprócz kobiet, ale je ciężko podłączyć do komputera). Wiedzą to i twórcy serwisu random.org, który pobiera tak zwany szum atmosferyczny i przetwarza go na eleganckie liczby. Serwis Prawdziwie Losowych Liczb – oto slogan owej strony (brzmi niczym nazwa strony z ocenami z egzaminu z Programowania Równoległego).

Od pogody jest jednakże coś bardziej nieprzewidywalnego – jest to atom promieniotwórczy. Ha! Zabrzmiało groźnie. Otóż taki atom promieniotwórczy może się rozpaść. Może też się nie rozpaść. O tym, czy w danej chwili atom się rozpadnie czy nie, wie tylko on sam. My, jako ludzie XXI wieku znamy prawdopodobieństwo zajścia jednego lub drugiego zdarzenia, ale to wszystko. Taki atom świetnie zastępuje osobę rzucającą kostką do gry, a urządzenie z większą ilością atomów mądrzy ludzie podłączyli do komputera i wyniki przesyłają na żądanie w serwisie hotbits. Atomowy saper – to jest gra warta napisania.

OK, wszyscy humaniści mogą się już oddalić, zaś miłośnikom języka Ruby polecam bibliotekę RealRand, która daje wygodny interfejs do obu serwisów:

require 'random/online'

generator1 = Random::RandomOrg.new
generator1.proxy_host = 'your.proxy.here'
generator1.proxy_port = 8080
generator1.proxy_usr  = 'your.user.here'
generator1.proxy_pwd  = 'secret'
puts generator1.randbyte(5).join(",")
puts generator1.randnum(100, 1, 6).join(",")  # Roll the dice 100 times.

Rubik

Dawno już nie zdarzyło mi się, bym tak długo pisał program, który robi tak mało. Moje najświeższe dzieło wyświetla mianowicie kostkę Rubika – jest to projekt na zaliczenie przedmiotu o dźwięcznej nazwie Laboratorium Grafiki i Multimediów. Kostkę można oczywiście układać, obracać, itd. Zapraszam do zabawy. Gdyby coś nie działało, zainstalujcie sobie .NET Framework 2.0.

Aktualizacja: kostka sam się układa.

=====> Pasek postępu =====>

Pasek postępu to esencja informatyki. Chyba każdy użytkownik komputera dał się zahipnotyzować tym wypełniającym się prostokątom i magicznym cyfrom obok: 23%… 57%… 99% (ta ostatnia liczba czasem widniała na ekranie równie długo jak wszystkie poprzednie razem wzięte). Nieważne czy czekamy na koniec instalacji najnowszej gry, ściągnięcie pliku z Internetu czy włączenie komputera – progress bar jest nieodłącznym elementem tego procesu. Zwykle nie można robić wtedy nic innego na komputerze, wielozadaniowość bierze w łeb i zostaje tylko nas dwóch – pasek i ty. Niniejsza notka to hołd naszym towarzyszom oczekiwania na Przyszłe.

Czytaj dalej