Author Archive: ebvalaim

Edukacyjne GIFy

Powoli przygotowuję kolejny post do kategorii "Fizyka dla każdego", który ma omówić nieco dokładniej transformację Lorentza i jakie są konsekwencje tego, że opisuje ona rzeczywistość. W tym celu przygotowałem dwa GIFy:

Transformacja układu współrzędnych przez obrót (kliknij aby obejrzeć animację)

Transformacja układu współrzędnych przez tranformację Lorentza (kliknij aby obejrzeć animację)

Szerszy opis tych GIFów znajdzie się w kolejnej notce w kategorii Fizyka dla każdego :)

Kod wykorzystany do wygenerowania ich opublikowałem na GitHubie: https://github.com/fizyk20/spacetime-graph/tree/blog-post

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!