Jakiś czas temu napisałem prosty widok na macierz. Postanowiłem go trochę rozszerzyć i napisać przekombinowany widok na macierz n-wymiarową. Kodu jest trochę więcej niż poprzednio, więc nie zamieszczę całości w treści posta (jest dostępny tutaj), a tutaj zamieszczę efekty.
Misja Gynvaela 003
MISJA 003            goo.gl/ZPQvV0               DIFFICULTY: ██░░░░░░░░ [2/10]
Tym razem nie trzeba nic robić. Wystarczy uruchomić poniższy skrypt, chwilkę
poczekać, a hasło zostanie wypisane. No, taką dłuższą chwilkę...
#!/usr/bin/python
def magic1(a, b):
  o = 0
  i = 0
  while i < a:
    o += 1
    i += 1
  i = 0
  while i < b:
    o += 1
    i += 1
  return o
def magic2(a, b):
  o = 0
  i = 0
  while i < b:
    o = magic1(o, a)
    i += 1
  return o
n1 = int("2867279575674690971609643216365"
         "4161626212087501848651843132337"
         "3373323997065608342")
n2 = int("1240905467219837578349182398365"
         "3459812983123659128386518235966"
         "4109783723654812937")
n = magic2(magic1(n1, n2), 1337)
print hex(n)[2:-1].decode("hex").splitlines()[0]
			Misja Gynvaela 002
MISJA 002                                        DIFFICULTY: ███░░░░░░░ [3/10]
Przechwyciliśmy fragment komunikacji pomiędzy dwoma podejrzanymi. Sądzimy, że
to hasło administratora do jednego z systemów, na których mogą znajdować się
kluczowe dla sprawy dane.
                 ╭┈┈                                     ┈┈╮  
                 ┊ QW== QT== QT== QQ== QU== Qd== QU== Qd== ┊
                   QX== QV== QW== Qe== QT== QR== QU== QT==
                   QT== QU== QX== QU== QT== QR== QT== QQ==
                 ┊ QW== Qe==               »goo.gl/4Iuxdi« ┊ 
                 ╰┈┈                                     ┈┈╯   
Niestety, pomimo, iż wiemy, że użyte zostało kodowanie Base64, nie jesteśmy w
stanie zdekodować ukrytej wiadomości. Nasi technicy uparcie twierdzą, że po
zdekodowaniu wychodzi „AAAAAAAAAAAAAAAAAAAAAAAAAA”, ale sądzimy, że nie mają
racji.
Zwracamy się więc do Ciebie z prośbą o pomoc - zrzuć okiem na powyższą
wiadomość i sprawdź czy nie ma czasem drugiego dna.
			Nowy “Programista”, a w nim mój artykuł
Nowy “Programista” (#58) jest już dostępny w wersji elektronicznej, a na papierze ma być po majówce. Znajduje się w nim mój artykuł (“Jak upiększyć kod”), opisujący idiomatyczne przekształcenia kodu w C++ zwiększające jego czytelność i subiektywne piękno.
Serdecznie zapraszam do lektury.
Misja Gynvaela 001
Gynvael rozpoczął nową świecką tradycję podrzucania prostych zadanek programistycznych na końcu swoich streamów. W tym poście opiszę jak doszedłem do rozwiązania i dlaczego zajęło mi to więcej czasu niż powinno.
Uwaga, w środku są spoilery.
Co oznacza słowo kluczowe inline?
Dość często można się spotkać ze (zrozumiałym) przeświadczeniem, że w C++ słowo kluczowe inline sprawi, że funkcja nim oznaczona zostanie zinline’owana1. Nic bardziej mylnego! W C++ efektywne znaczenie tego słowa jest zupełnie inne, a C++17 jeszcze trochę je zmienia.
Jak przeładowywać operatory w mojej klasie?
Kiedy i które operatory przeładowywać?
Dość przewrotnie odpowiem: kiedy zajdzie taka potrzeba. Podstawą jest zachowanie logiki kodu (Samochod + Samochod nie ma zbyt sensu, ale Currency + Currency już tak) oraz konwencji języka (lub frameworka), np. w przypadku operatora <<.
Wyjście i wejście ze strumienia, czyli operatory << i >>
Tutaj nie ma wielkiej filozofii. Dobrze by było osiągnąć pełną serializację, t.j. zagwarantować poprawność kodu z listingu poniżej, ale w praktyce jest to więcej roboty niż to warte dla większości klas. Szczególnie, że nawet biblioteka standardowa nie zachowuje się w ten sposób, np. dla klasy std::string.
devcrowd.pl otwiera rejestrację (Szczecin)
DevCrowd to chyba jedyna sensowna konferencja w Szczecinie. 22. kwietnia (sobota) odbędzie się tradycyjnie w budynku Wydziału Informatyki ZUT w Szczecinie.
Darmowa rejestracja jest tutaj.
Jak łatwo zaimplementować w C++ operator porównania dla twojej klasy?
Biblioteka standardowa C++ w wielu miejscach oczekuje od typów, z którymi pracuje implementacji operatora< (alternatywą jest podanie własnego komparatora). Jest tak chociażby w std::sort, std::map lub std::binary_serch. Weźmy za przykład następującą klasę:
| struct person { string first_name; string last_name; string city; int year_born; bool is_male; }; | 
Aby posortować std::vector<person>, powinniśmy zaimplementować operator<, który spełnia strict weak ordering:
Bezpieczna zamiana jednostek w C++ część 1
| sleep(300); | 
Ile śpimy? 0.3s (300ms)? 5 minut (300s)? A może parametrem powyższego sleep jest jeszcze inna jednostka? Bez zajrzenia do dokumentacji – albo kodu – nie ma na to pytanie odpowiedzi. Akurat w przypadku jednostek czasu C++11 wprowadził zestaw klas odpowiedzialnych za nie, więc można napisać taki zupełnie jednoznaczny kod:
| this_thread::sleep_for(chrono::seconds(30)); this_thread::sleep_for(500ms); // C++14 | 
