Author Archive: ebvalaim

Ktulu Online - szkic architektury

Pierwsza notka konkursowa za nami, czas zacząć rozwijać projekt - a od czego zacząć, jeśli nie od choćby bardzo ogólnego zarysu architektury? Doświadczenie uczy, że rzucenie się w wir kodowania bez cienia planu potrafi prowadzić co prawda do szybkiego powstania programu, który coś robi, ale dalszy rozwój staje się coraz trudniejszy. Nie chciałbym utknąć w połowie projektu, stwierdzając że muszę zacząć od nowa, więc najpierw zastanowię się, jak by go najlepiej skonstruować.

Po pierwsze, głównym celem projektu jest umożliwienie prowadzenia rozgrywek przez internet - będziemy więc mieć do czynienia z jakiegoś rodzaju aplikacją sieciową. Jeden z graczy będzie wobec tego uruchamiał serwer, a pozostali będą mogli podłączać się do niego jako klienci. Najwygodniejsze będzie zapewne zebranie i serwera, i klienta w jeden plik wykonywalny (dzięki czemu hostujący grę nie będzie musiał uruchamiać kilku programów), ale to już niezbyt istotny szczegół. Najważniejszy jest podział ról między serwer a klienty.

[Aktualizacja: przed dalszym czytaniem polecam zapoznać się z zasadami gry.]

Role serwera i klienta

W oryginalnej grze mamy prowadzącego (zwanego "Manitou"), który wszystko kontroluje - wie, kto jest kim, kto posiada posążek (w odróżnieniu od mafii, w której chodzi wyłącznie o wybicie przeciwników, w Ktulu większość celów gry obraca się wokół posążka, który z początku posiadają Bandyci), każe graczom zamykać lub otwierać oczy, zlicza głosy w głosowaniach. Ta rola będzie pełniona przez serwer - będzie on przechowywał pełen stan gry i wysyłał odpowiednie polecenia i informacje klientom. Jedyne co będą robić klienty, to powiadamiać serwer o decyzjach dotyczących wykonywanych przez siebie czynności.

(więcej…)

Daj Się Poznać 2017 - start!

Postanowiłem w tym roku wziąć udział w konkursie "Daj Się Poznać", który startuje dzisiaj. A zatem, słowem wstępu:

O co chodzi?

W skrócie, konkurs polega na rozwijaniu przez 10 tygodni projektu programistycznego i pisaniu o nim na blogu. Od dawna chciałem tchnąć w ten blog trochę życia, jednak brakowało mi motywacji. Kiedy usłyszałem o tym konkursie, pomyślałem, że to może być coś, co pomoże mi się przełamać i w końcu dać mi trochę materiału do pisania. Pomysłów na projekty leżących odłogiem trochę mam, więc wybrałem jeden z nich i postanowiłem się zarejestrować. Zatem - do dzieła!

Projekt

Moim pierwszym pomysłem na projekt konkursowy było pchnięcie w końcu do przodu generatora proceduralnego wszechświata (który opisywałem w kilku notkach jako "Projekt Universe"). Obawiałem się jednak, że w 10 tygodni nie zdołam stworzyć czegoś wartego uwagi. Wtedy moją uwagę zwrócił jeden z innych projektów, który kiedyś zacząłem, ale którego nigdy nie dokończyłem - Ktulu Online.

(więcej…)

Opublikowany nowy projekt - Labirynt 4D

Opublikowałem dziś kolejny ze swoich projektów. W tytule notki napisałem, że nowy, ale nie jest to do końca prawda.

Historia

Labirynt 4D jest programem, którego pierwotną wersję stworzyłem około 10 lat temu. Mój kolega z liceum wpadł wówczas na pomysł, że dość zabawną grą mogłaby być strzelanka, w której świat jest 4-wymiarowy, ale naraz widać tylko 3 z nich. W jego wizji w każdym momencie 3 z 4 współrzędnych byłyby wybrane w celu określenia, która część świata ma być rysowana, a gracz mógłby w każdej chwili zmienić ten zestaw. To mogłoby prowadzić do zabawnych sytuacji, w których gracz widzi sunący na niego płaski przekrój innego gracza, który na moment staje się w pełni 3-wymiarowy (przez chwilowe "wskoczenie" w jego przestrzeń), zabija go i znowu się spłaszcza. Postanowiłem wtedy stworzyć "proof-of-concept" czegoś takiego, jednak uznałem, że ciekawsze od dyskretnego przełączania zbiorów współrzędnych będzie obracanie widocznego przekroju w sposób ciągły.

(więcej…)

Szczególna Teoria Względności bez założenia o stałej prędkości światła

Wstęp

Szczególna Teoria Względności, jako mocno sprzeczna z intuicją wyniesioną z codziennego życia, pozostaje dla przeciętnego człowieka tematem nieco magicznym. Wnioski z niej wypływające są tak oddalone od życia, że trudno je do siebie dopuścić jako poprawny opis otaczającego nas świata.

STW poznaje się na lekcjach fizyki w liceum i jej wprowadzenie wygląda tam zwykle mniej więcej tak: pod koniec XIX wieku ludzie zdali sobie sprawę z istnienia fal elektromagnetycznych. Z równań opisujących te fale wynika pewna konkretna prędkość ich rozchodzenia się, oznaczana c i wynosząca ok. 300 000 km/s. Było to o tyle interesujące, że nie wiadomo było, względem czego ta prędkość jest określona. Ponieważ wszystkie znane fale rozchodziły się w jakichś ośrodkach, przyjęto, że także fale elektromagnetyczne posiadają swój ośrodek i nazwano go eterem, a ich prędkość dotyczy ruchu względem niego.

Kiedy już stwierdzono, że eter powinien istnieć, następnym krokiem było wykrycie go. Jednym z pomysłów na zademonstrowanie istnienia eteru było zmierzenie prędkości Ziemi względem niego. Podjęto więc takie próby, jednak nie dały one spodziewanych wyników - wyglądało na to, że Ziemia nie porusza się względem eteru. Było to nieco dziwne, zważywszy że zmienia ona swoją prędkość w ruchu dookoła Słońca, więc nawet jakby spoczywała w jednym momencie, w innym już nie powinna, tymczasem mierzona prędkość była ciągle 0. Próbowano modyfikować koncepcję eteru tak, aby wyjaśnić, czemu mogło wyjść 0 i przeprowadzać bardziej czułe eksperymenty. Jednym z nich był słynny eksperyment Michelsona-Morleya, który jednak, tak jak wcześniejsze eksperymenty, pokazał że prędkość Ziemi jest zerowa.

Naukowcy byli dość zdezorientowani tymi wynikami. Wyglądało na to, że prędkość światła względem różnych obserwatorów się nie zmienia, niezależnie od ich ruchu, co było dość bezprecedensowe. Żeby dokładniej zobrazować, co w tym dziwnego, wyobraźmy sobie, że stoimy na skrzyżowaniu w samochodzie, a przed nami stoi jeszcze jeden samochód. Gdy zapala się zielone światło, samochód przed nami rusza i rozpędza się do 15 m/s, czyli w ciągu każdej sekundy będzie się od nas oddalał o 15 m. Chwilę potem ruszamy my. Gdy rozpędzimy się do 5 m/s, spodziewamy się, że samochód przed nami będzie oddalał się od nas już tylko o 10 m co sekundę, ale gdy to sprawdzamy, ze zdumieniem odkrywamy, że nadal ucieka nam z prędkością 15 m/s. Przyspieszamy do 10 m/s - a on nadal oddala się co sekundę o 15 m. Przyspieszamy bardziej i bardziej, lecz wciąż nie możemy zacząć doganiać samochodu przed nami, mimo że nasz znajomy policjant stał z radarem na poboczu i powiedział nam, że jego prędkość to wciąż tylko 15 m/s. Otóż światło wydawało się zachowywać właśnie jak taki niecodzienny samochód.

Na początku XX wieku różni ludzie proponowali kolejne wyjaśnienia, a wśród nich Lorentz, Poincare i wreszcie Einstein. Ten ostatni w 1905 roku przedstawił opis znany dziś jako Szczególna Teoria Względności, oparty na 3 założeniach:

  1. (Czaso)przestrzeń jest jednorodna i izotropowa, tj. nie ma we Wszechświecie wyróżnionych punktów ani kierunków.
  2. Nie ma wyróżnionych układów inercjalnych, w każdym z nich prawa fizyki są takie same - to jest tzw. zasada względności Galileusza.
  3. Prędkość światła jest taka sama we wszystkich układach odniesienia - wniosek z eksperymentu Michelsona-Morleya.

Eter przestał być wobec tego potrzebny - od tej pory c było po prostu prędkością uniwersalną, niezależną od tego, kto ją mierzy. Przy okazji płyną z tego różne niezwykłe wnioski, takie jak wolniejszy upływ czasu u poruszających się obserwatorów czy skracanie się ciał w ruchu.

Zostaje tu jednak pewna luka - można się kłócić, i niektórzy ludzie rzeczywiście to robią, że trzecie założenie nie jest wystarczająco udowodnione. Eksperyment Michelsona-Morleya mógł być za mało dokładny lub mógł dać zerowy wynik w pewnych szczególnych okolicznościach, mimo że prędkość światła nie jest stała. Stąd STW może być (a wg niektórych po prostu jest) nieprawdziwa.

Wszystko to prawda, ale mało kto zdaje sobie sprawę, że to trzecie założenie wcale nie jest potrzebne do otrzymania STW. Zamierzam tutaj pokazać, jak to możliwe.

(więcej…)

Nowa domena

Nie jestem szczególnie bogaty, więc gdy tworzyłem tego bloga, wolałem użyć darmowej domeny. Tak się przyjemnie składało, że mój hosting oferował darmowe subdomeny pod swoją domeną (nazwa-użytkownika.mydevil.net), więc skorzystałem z okazji i tym sposobem mój blog otrzymał adres ebvalaim.mydevil.net.

Niestety, wystąpił jeden drobny problem. Jakiś czas temu w hostingu zaszły zmiany i darmowe domeny dla użytkowników zmieniły końcówkę z .mydevil.net na .usermd.net. Domeny, które już istniały, działały nadal, dopóki nic się z nimi nie robiło. Kilka dni temu zaszła jednak konieczność wprowadzenia pewnych zmian - przeterminował się mój certyfikat SSL uzyskany dzięki Let's Encrypt. Odświeżenie go okazało się niemożliwe na starej domenie. Musiałem przejść na nową, bez możliwości ustawienia choćby przekierowania.

Umieściłem blog pod domeną ebvalaim.usermd.net, jednak zdawałem sobie sprawę, że będzie to rozwiązanie tymczasowe. Zapobieżenie podobnym nieprzyjemnościom w przyszłości (czy to przez zmiany w ramach hostingu, czy to przez konieczność zmiany samego hostingu z jakiegoś powodu) wymagało założenia zewnętrznej domeny.

Witam zatem od dziś pod świeżutką domeną ebvalaim.pl :)

Przygoda z mikrokontrolerem

Na początku maja odkopałem swoją starą zabawkę, jeszcze z czasów gimnazjum - "komputer testowy" oparty na mikrokontrolerze 80C535. Układ składa się niemal wyłącznie z kontrolera, pamięci (EPROM + RAM), podłączenia do zasilania oraz portu szeregowego (RS-232) i kilku portów wyjściowych. Gniazdo portu szeregowego służy do podłączania układu do PC-ta i wgrywania na niego programów, napisanych w prostym asemblerze.

Komputer testowy 80C535

Komputer testowy 80C535

Pojawiły się jednak dwa problemy. Pierwszy - współczesne komputery rzadko mają gniazdo RS-232, a laptopy chyba już wcale. Ten łatwo było rozwiązać, zamawiając z internetu adapter podłączany przez USB. Drugi problem był poważniejszy.

Otóż jak nietrudno się domyślić, jako uczeń gimnazjum nie miałem większego wkładu w projekt układu. Autorem był mój nauczyciel, który wyposażył nas (mnie i innych uczestników kółka elektronicznego) również w oprogramowanie do obsługi kontrolera. Problem w tym, że w ciągu 14 lat oprogramowanie gdzieś mi zaginęło, a z nauczycielem nie mam kontaktu. Cóż, stwierdziłem, jestem teraz dorosły i całkiem nieźle obeznany w programowaniu, więc chyba jakoś sobie poradzę ;)

Tak zatem zaczęła się moja przygoda z reverse-engineeringiem zabawki z kółka elektronicznego.

(więcej…)

Rust: aplikacje z API dla wtyczek

Niektóre aplikacje pozwalają użytkownikom na modyfikowanie ich funkcjonalności. W wielu przypadkach odbywa się to za pomocą wtyczek - niewielkich bibliotek, które są wczytywane przez główny program, a następnie wykorzystywane w określonych okolicznościach. Za rozpoznawalny przykład mogą tu służyć komunikatory, takie jak np. Pidgin. W ich przypadku wtyczki mogą służyć np. do obsługi różnych protokołów (Gadu-Gadu, Jabber, Facebook...), modyfikacji wyglądu czy dodawania nowych funkcji do komunikatora. W symulatorze Orbiter można w formie wtyczek dodawać np. nowe statki kosmiczne. Potencjalnych zastosowań jest mnóstwo. W tej notce zamierzam zaprezentować, jak podobny efekt można osiągnąć w języku Rust. Mój sposób nie jest zapewne ani jedynym możliwym, ani najlepszym, wydaje mi się jednak prosty i wygodny :)

(więcej…)

Ułatwianie zabawy Ithkuilem

Ostatnie dni poświęciłem ulepszaniu dawno stworzonego narzędzia, mającego na celu ułatwienie ludziom bawienia się Ithkuilem. Ale po kolei.

Ithkuil

Ithkuil to sztuczny język, którego autorem jest John Quijada. Sztuczne języki kojarzą się zwykle z zabawami dzieci (sam tworzyłem swoje języki w wieku ok. 10-12 lat), jednak w tym przypadku trudno być dalej od prawdy. Jakkolwiek trzeba przyznać, że trudno znaleźć dla Ithkuila jakieś praktyczne zastosowanie, jest to w moim odczuciu język niezwykle interesujący.

W Ithkuilu nacisk kładziony jest na przekazanie jak największej ilości informacji w jak najkrótszej wypowiedzi. W efekcie język ten posiada 45 spółgłosek i 13 samogłosek i niemalże każda głoska w słowie niesie osobny fragment informacji. Jak to zostało osiągnięte?

Ithkuil posiada dwie główne klasy słów - ang. formatives i adjuncts. Formatives to słowa pełniące rolę rzeczowników lub czasowników, adjuncts natomiast pełnią rolę dodatkowych określeń oraz zaimków osobowych. Skupmy się na formatives. Każde z nich składa się z rdzenia, niosącego główne znaczenie (np. "dźwięk wydawany ustami"), który następnie jest "odmieniany" przez ponad 20 różnych kategorii gramatycznych za pomocą doklejanych przyrostków i przedrostków. Np. rdzeń "dźwięk wydawany ustami" (-l-) możemy odmienić, dopisując z przodu "e-" -> "el-", otrzymując "wypowiedź". Aby otrzymać najmniejsze możliwe słowo, musimy dokleić jeszcze co najmniej jedną samogłoskę i spółgłoskę -> "elal". "a" określa przypadek "oblique", będący przypadkiem neutralnym, nie niosącym żadnej szczególnej informacji. Końcówka "-l" z kolei określa, że mamy na myśli pojedynczy obiekt, funkcjonujący osobno, rozpatrujemy go w całości i chodzi nam o sam obiekt, a nie np. jego wyobrażenie. W ten sposób "elal" oznacza właśnie "wypowiedź".

(więcej…)

Obliczanie wschodów i zachodów Słońca

Dziś przesilenie zimowe - najkrótszy dzień w roku, a najdłuższa noc. Nie każdemu jednak znany jest fakt, że mimo iż dni będą już coraz dłuższe, to jednak Słońce nadal będzie wschodziło coraz później. Jest to spowodowane kształtem orbity Ziemi, który nie jest idealnie okrągły, a eliptyczny. Teraz zbliża się moment, w którym Ziemia będzie najbliżej Słońca w ciągu swojej rocznej wędrówki, a przez to również porusza się szybciej niż zwykle. To z kolei opóźnia południe słoneczne każdego dnia o kilkanaście sekund, powodując, że godziny wschodów są wciąż coraz późniejsze.

Kiedy zatem mamy najpóźniejszy wschód i najwcześniejszy zachód, jeśli nie w przesilenie? Mógłbym pewnie sprawdzić gdzieś w internecie, ale po co, skoro mogę policzyć sam przy pomocy komputera ;)

Do realizacji zadania wybrałem Haskella - głównie dlatego, że wciąż słabo go ogarniam, a jest to dla mnie bardzo ciekawy i zmieniający sposób myślenia język. Zdecydowałem więc, że warto go poćwiczyć.

(więcej…)

Geometria różniczkowa w Ruście

W ciągu ostatnich paru tygodni pracowałem nieco nad biblioteką, która pozwalałaby na prowadzenie obliczeń w zakresie geometrii różniczkowej w Ruście. Przez geometrię różniczkową mam tu na myśli głównie rachunek tensorowy, tylko w krzywych przestrzeniach bądź czasoprzestrzeniach. Coś tego typu stworzyłem już swego czasu w C++, postanowiłem jednak spróbować wykorzystać niektóre możliwości Rusta do stworzenia ulepszonej wersji w tym języku.

Co Rust mógłby zrobić lepiej?

Tensory do celów obliczeń najwygodniej zapisywać jako tablice liczb. Problem w tym, że sprowadzenie tensora do liczb wymaga wybrania układu współrzędnych w przestrzeni, w której ten tensor jest zdefiniowany. Różne operacje, np. dodawanie dwóch tensorów, mają sens jedynie wtedy, kiedy tensory biorące w niej udział są zdefiniowane w tym samym układzie współrzędnych. Jedyną możliwością zakodowania tej zasady w C++ było zakodowanie układu współrzędnych jako właściwości obiektu tensora i sprawdzanie w kodzie różnych operatorów, czy wszystko się zgadza. W ten sposób, jeśli zrobimy w kodzie jakiś błąd, program wychwyci go w trakcie wykonania.

Ok, czyli błędy były wykrywalne, co tu można zrobić lepiej? Ano można byłoby zrobić tak, żeby tensory zapisane w różnych układach współrzędnych miały nie tylko różną wartość jednej właściwości, ale były wręcz obiektami różnych typów. W ten sposób o błędzie może nas powiadomić jeszcze kompilator, zanim program w ogóle zostanie przekształcony w postać wykonywalną. W C++ nie byłoby to praktyczne, natomiast system typów Rusta pozwala to zrobić o wiele ciekawiej.
EDIT: Zwrócono mi uwagę, że szablony w C++ też pozwalają na coś takiego. Tym niemniej, zrobienie tego w Ruście było ciekawym eksperymentem :)

(więcej…)