Author Archive: ebvalaim

Zdarzenia i czasoprzestrzeń

Pierwsza notka z serii będzie dość podstawowa, ale myślę, że parę omówionych zagadnień okaże się ciekawych. Opowiemy sobie o tym czym są czasoprzestrzeń, zdarzenia, i pokażemy skąd bierze się teoria względności. No to jedziemy :)

O pojęciu czasoprzestrzeni mówi się nieco w szkole, ale zwykle bardzo mało uwagi poświęca się temu, jak doniosłe konsekwencje ma połączenie czasu i przestrzeni w jeden byt. Żeby jednak to zrozumieć, trzeba najpierw nieco wgłębić się w szczegóły całej idei.

(więcej…)

Generic-array ma 100 000 pobrań!

Mój projekt, generic-array (biblioteka do Rusta) został pobrany już 100 000 (słownie: sto tysięcy) razy! To jest mój pierwszy projekt o takiej popularności.

Zaczęło się od prostego hacka, omijającego jedno z ograniczeń języka - i to ograniczenie wyraźnie przeszkadzało wielu osobom, ponieważ kilka nadesłało swoje modyfikacje (też pierwszy taki przypadek dla mnie), a ogromna liczba pobiera bibliotekę. Nie wiem w sumie, co jeszcze napisać, po prostu się cieszę, że okazała się dla kogoś przydatna ;)

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