Author Archive: ebvalaim

Kształt horyzontu czarnej dziury

Trafiłem wczoraj w internecie na wątek, który wydawał się typowym pytaniem kogoś zainteresowanego nauką, a okazał się całkiem ciekawym problemem.

Pytanie, które padło, dotyczyło kształtu czarnej dziury. Kilka osób odpisało, że horyzont zdarzeń (czyli granica - w pewnym sensie "powierzchnia" - czarnej dziury) ma kształt kuli (co ściślej należałoby określić jako sferę, gdyż horyzont jest tylko 2-wymiarową powierzchnią, a nie 3-wymiarową bryłą). Ktoś zasugerował, że niezupełnie, gdyż czarne dziury zwykle wirują i to je spłaszcza. Wtedy w wątek włączyłem się ja, odpisując, że nawet horyzont wirujących czarnych dziur jest sferyczny - opisuje go równanie r = const. Ale czy na pewno...?

(więcej…)

Co da się zrobić ze smartfonem z zepsutym ekranem dotykowym?

Zostałem niedawno poproszony o odzyskanie danych z zepsutego telefonu. Haczyk: dane były w pamięci telefonu, opcja podłączania się przez USB jako dysk zewnętrzny była wyłączona, a ekran dotykowy nie działał. I co z takim fantem zrobić? Otóż okazało się, że da się zrobić całkiem sporo, i choć ostatecznie danych nie udało mi się odzyskać, to przebieg samej walki z telefonem był dość ciekawy i wydaje mi się, że warty opisania.

(więcej…)

Daj Się Poznać - post-mortem

Jak mogliście pewnie zauważyć, mój udział w konkursie zakończył się jakiś czas temu brakiem kolejnych notek. Niestety, okazało się, że znajdowanie czasu na regularne zajmowanie się projektem programistycznym to coś, co mnie przerasta. Praca i życie prywatne niestety wymagają sporo uwagi.

Nie znaczy to jednak, że projekt konkursowy zostaje porzucony. W chwili obecnej co prawda zajmuję się innymi rzeczami (o których też postaram się trochę wspomnieć w najbliższym czasie), ale do Ktulu Online na pewno jeszcze wrócę. Kiedy dokładnie, to się dopiero okaże.

Szkoda, że tak się to skończyło, ale tak już bywa w życiu. Jeśli w przyszłym roku będzie kolejna edycja, na pewno spróbuję jeszcze raz :)

Funkcje hiperboliczne - co to za czort?

Jeśli jesteście jak ja, to pierwszy raz zetknęliście się z funkcjami hiperbolicznymi jako "tym czymś dziwnym na kalkulatorze, co nie ma żadnego zastosowania". Ot, są jakieś przyciski oznaczone "sinh" i "cosh". W szkole w końcu wyjaśnili, co oznacza "sin" i "cos", ale o tych wariantach z "h" na końcu nikt nie wspominał. O co chodzi? Nazwa sugeruje jakieś podobieństwo do funkcji trygonometrycznych, zobaczmy co wyjdzie:

 \begin{array}{ll} \cos (1) = 0.54030230586 & \cosh (1) = 1.54308063482 \\ \cos (10) = -0.83907152907 & \cosh (10) = 11013.2329201 \end{array}

(Takie wyniki otrzymacie, jeśli macie kalkulator ustawiony na radiany - jeśli jest ustawiony na stopnie, to wartości cosinusów będą inne; na funkcje hiperboliczne to ustawienie nie ma wpływu i jeszcze zobaczymy dlaczego.)

No tak, te 11 tysięcy dla cosh(10) wygląda bardzo podobnie do funkcji trygonometrycznych. Ewidentnie to "h" zmienia całkiem sporo, ale co konkretnie...?

Jeśli w dalszym toku edukacji spotkaliście się z liczbami zespolonymi, mogliście zobaczyć takie definicje:

 \begin{array}{ll} \cos x = \frac{e^{ix} + e^{-ix}}{2} & \cosh x = \frac{e^x + e^{-x}}{2} \\ \sin x = \frac{e^{ix} - e^{-ix}}{2i} & \sinh x = \frac{e^x - e^{-x}}{2} \end{array}

Tu już widać większe podobieństwo, ale... Dlaczego taka forma? Co to ma wspólnego z hiperbolami? Jeśli jeszcze nie wiecie, to teraz się dowiecie.

(więcej…)

Ktulu Online - postępy (20.03.2017)

Projekt idzie do przodu, choć powoli. Zastosowanie TDD pozwoliło mi przełamać niemoc twórczą i udało mi się zrobić całkiem spore postępy jak na ilość czasu, którą mogłem przeznaczyć na rozwój kodu. Przede wszystkim kształtu zaczęło nabierać API obiektów Manitou (serwera) oraz gracza (klienta) - zaczynanie od pisania testów bardzo pomogło w uformowaniu dość szczegółowej koncepcji.

Mimo że obecnie wciąż nie ma w projekcie niestety wiele do zaprezentowania, liczę na to, że w tym tygodniu powstanie coś ciekawego. Dawno nie czułem, że kodowanie idzie mi tak lekko, jak ostatnio :)

To chyba tyle, jeśli chodzi o postępy. W następnej notce napiszę nieco o szczegółach problemów, z jakimi się zetknąłem, próbując zdefiniować API obiektów - część z nich ma ciekawe aspekty związane z własnościami Rusta. Może to być ciekawa lektura dla osób, które jeszcze nie wiedzą zbyt dużo o tym języku :)

Ktulu Online - postępy (13.03.2017)

Ostatecznie nie znalazłem wczoraj czasu na napisanie notki, ale dobre wieści są takie, że udało mi się pchnąć projekt do przodu 🎉 Na pierwszy ogień poszła kolejność "etapów" gry.

Jak już wspominałem we wcześniejszych notkach, Ktulu toczy się w cyklu nocy i dni. Oprócz tego, w nocy dzieje się wiele rzeczy - różne postacie budzą się i korzystają ze swoich zdolności, budzą się też całe frakcje. Wszystko to dzieje się w pewnym ustalonym porządku, który powinien być zaimplementowany w grze.

Nie ma tu w zasadzie wiele materiału do rozwodzenia się ;) Tak jak wspomniałem w poprzedniej notce, zacząłem od krótkiego testu, który miał sprawdzić, czy struktura opisująca moment gry poprawnie przechodzi z "przed rozpoczęciem" do "noc 0, aktywność Dziwki". Następnie zaimplementowałem samą strukturę, rozwinąłem trochę test, rozwinąłem kod i tak powoli powstał kod, który jest obecnie: zawierający dwie tablice (odpowiadające kolejności zerowej nocy oraz dowolnej innej nocy) i metodę, która sprowadza się głównie do iterowania po tych tablicach dla nocy i przechodzenia po drodze jeszcze przez dni.

Kod prawdopodobnie będzie jeszcze wymagał przeróbek (głównie w celu lepszego reprezentowania nocnej aktywności frakcji), ale jest już jakiś punkt zaczepienia. Jest szansa, że dalej będzie coraz lepiej :)

TDD - Test Driven Development

W ciągu ostatniego tygodnia nie zrobiłem w projekcie niemal nic - główną przyczyną był, niestety, brak czasu i zmęczenie towarzyszące mi w nielicznych wolnych chwilach. Nie była to jednak jedyna przyczyna. Kilka razy udało mi się usiąść z zamiarem pisania kodu, ale wtedy uświadamiałem sobie że mimo ogólnej wizji tego, w którą stronę projekt ma zmierzać, nie bardzo wiem od czego zacząć i jak najszybciej osiągnąć kod, którego działanie będę mógł przetestować (a możliwość uruchomienia kodu i przetestowania jego działania jest ogromnym motywatorem). Postanowiłem spróbować przełamać niemoc twórczą dzięki TDD - Test Driven Development, czyli w wolnym tłumaczeniu "rozwój napędzany testami".

Idea TDD jest prosta: zaczynamy pisać kod od testów. Dodajemy test, który z początku nie będzie się nawet kompilował, bo kod, który ma testować, jeszcze nie istnieje, ale to nic. Kiedy mamy kod testu, piszemy fragment właściwego kodu - tyle, aby test zaczął przechodzić. Kiedy zobaczymy w wynikach zielony kolor, refaktorujemy kod (o ile zachodzi taka potrzeba) i piszemy następny test.

Takie podejście ma wiele zalet:

  • Osiągamy pełne lub niemal pełne pokrycie kodu testami, gdyż nie dodajemy kodu dopóki nie mamy nieprzechodzącego testu.
  • Łatwiej skupiamy się na definiowaniu wygodnego API - test jest zasadniczo kodem korzystającym z API udostępnianym przez testowany kod, więc już na etapie jego pisania będziemy widzieć, czy korzysta się z niego łatwo, czy nie, i będziemy mogli w razie czego wprowadzić zmiany.
  • Częścią powyższej korzyści jest to, że piszemy czystszy kod - żebyśmy mogli w ogóle napisać test, testowany kod musi mieć odpowiednią architekturę, która zwykle ułatwia późniejsze modyfikacje.
  • Na koniec, kwestia co do której mam nadzieję, że mi pomoże - od razu mamy wykonywalny kod, wykorzystujący funkcjonalność biblioteki (zakładając, że piszemy bibliotekę), więc na bieżąco możemy (a wręcz musimy) go uruchamiać i patrzeć, czy wszystko działa.

Są też, oczywiście, wady, z których główną dla mnie jest to, że dla niewprawionego programisty (czyli takiego jak ja :p) takie podejście jest niezbyt intuicyjne i trzeba się mocno pilnować, żeby nie wpaść w koleiny "najpierw funkcjonalny kod".

Dziś jest już późno, ale jutro powinienem w końcu mieć czas, aby wprowadzić ten pomysł w życie i zobaczyć, jak to się sprawdzi w praktyce. Wtedy też mam nadzieję mieć już materiał na kolejną notkę. Zatem - do jutra!

Zasady Ktulu

Pisząc ostatnią notkę, uświadomiłem sobie, że bez opisania zasad Ktulu jednak się nie obejdzie. Linkowanie w kółko do PDFa na zewnętrznej stronie ma mało sensu, bo pewnie i tak nikomu nie będzie się chciało go przeczytać. Postanowiłem więc pokrótce zrobić to tutaj (a przy okazji, tłumacząc notkę na angielski, stworzę nieistniejącą dotąd instrukcję dla potencjalnych niepolskojęzycznych czytelników).

Zanim przejdę do rzeczy, wspomnę, że istnieje kilka wersji zasad gry. Opiszę jedną ze starszych, do której przywykłem i którą zamierzam zaimplementować w projekcie.

Zarys fabuły

Fabuła, stanowiąca tło gry jest taka:

Dawno temu na terenie Ameryki Północnej rozbił się statek kosmiczny ufoludków. Zamieszkujący te tereny Indianie znaleźli nadajnik ufoludków i uznali go za posążek przedstawiający ich boga - Ktulu. Indianie oddawali cześć posążkowi boga Ktulu, wykonanemu z szlachetnych i rzadkich metali. Następnie do Ameryki przypłynęli biali, wybili większość Indian i odebrali im posążek. W miejscu, gdzie przedtem żyli Indianie, założyli miasteczko Bum-bum City. Posążek był dumą miasteczka, przyciągał turystów. Znaleźli się jednak bandyci, którzy postanowili ukraść posążek i swój zamiar wykonali. Gra rozpoczyna się w nocy, w trakcie której skradziony został posążek.

Podstawy gry

(więcej…)

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…)