Tumblelog by Soup.io
Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

August 25 2019

09:10

Prince of Persia (2008)

Prince of Persia, jest jednym z klasyków gier komputerowych. Oryginalnie wydany w 1989 roku na komputer Apple II (a później w zasadzie na wszystkie inne platformy), przeszedł długą drogę od oryginalnej trylogii, wykupienie praw do serii przez Ubisoft i stworzenie przez nich trylogii Piasków Czasu, aż do 2008 roku gdzie zostanie wydana gra o takiej samej nazwie: Prince of Persia. Co powoduje że muszę dodać do tytułu tego wpisu rok jej wydania, by ludzie wiedzieli o której grze pisze.

Głównym powodem dla którego Ubisoft Montreal – w którym powstały między innymi gry z trylogii Piasków Czasu – postawił na taki ruch był reset serii. Z perspektywy ponad dekady, możemy stwierdzić z pewnością, że reset był nieudany. W tej sub serii gier powstała tylko jedna gra – tytułowy Prince of Persia (2008) – i jedno DLC, które z tego co rozumiem zawiera zakończenie którego brak w bazowej grze. A kolejną grą z serii (ignoruje gry mobilne i Ty drogi czytelniku także powinieneś) jest The Forgotten Sands który kontynuuje historię z Piasków Czasu.

Miała być to pierwsza gra z serii wydana na konsole next gen™, którymi wtedy były Playstation 3 i Xbox 360. Jak dobrze pamiętam, jej port na PC miał nie mieć żadnego DRM, co było interesującym wyborem w tamtym czasie. Trudno mi stwierdzić czy się to opłaciło, na Wikipedii jest napisane że w miesiąc (gra była wydana w grudniu 2008 roku, a raport jest ze stycznia 2009) sprzedano ponad dwa miliony kopii na wszystkie platformy.

Zanim przejdę do krytyki gry, chciałbym wspomnieć że grałem w tą grę na PC plus/minus dekadę temu, nawet w jego pełną polską wersję której teraz nie da się kupić oficjalnie (przynajmniej w sklepie Ubisoftu). Na początku myślałem że jest to sytuacja podobna jak przy pierwszym Assassin’s Creedzie którego w Polsce wydawała Cenega i Ubisoft nie ma praw do jego tłumaczenia, ale nie na Wikipedii jest napisane że to Ubisoft Polska wydawał tutaj grę. Więc decyzja o tym, by nie można było kupić tego tytułu po polsku jest dość dziwna.

Wracając z tej dygresji, chciałem napisać że miałem z tą grą związane miłe wspomnienia – z dzisiejszej perspektywy kompletnie nie rozumiem czemu – ale pamiętałem też o tym że końcówka była rozczarowująca. Dekadę później odświeżam sobie tą grę na PS3. Mając ten wstęp za sobą możemy omówić grę:

Jak można się spodziewać gra o nazwie Książę Persji opowiada historię nieznajomej hieny cmentarnej, która wracając z grabieży zgubiła zrabowany skarb i przez swoją własną niezdarność została wplątana w wojnę dobra ze złem. Można powiedzieć że trochę przesadzam, ale protagonista nigdy nie zostaje w historii przedstawiony, a jedyne co wiemy na początku to jest to że zrabował niedawno jeden z grobowców i dlatego ucieka przez pustynie.

Pustynia okazuje się dla niego nieprzyjaznym miejscem z dwóch powodów: pierwszym będzie burza piaskowa – tak mocna że powoduje spadki FPSów, a drugim utrata skarbu który niosła jego oślica. Nieszczęścia jednak chodzą trójkami i nasz bohater spada do – jak się później dowiadujemy – kanionu, który musiał być dość dobrze ukryty skoro nasz bohater go nie zauważył, choć z drugiej strony nigdy nie łaziłem po pustyni w trakcie burzy piaskowej, więc może miał prawo go nie zauważyć.

W kanionie spotyka Elikę – księżniczkę tej krainy – która ucieka przed strażnikami nasłanymi na nią przez jej ojca. W tym momencie kończy się przerywnik filmowy i zaczyna się prawdziwa rozgrywka. Gra rozpoczyna się od przedstawienia nam mechaniki poruszania się, jak i mechaniki walki.

Po przejściu tego samouczka, dowiadujemy się że w tym miejscu znajduje się więzienie dla Arymana – Boga Ciemności. Ojciec Eliki – z jakiegoś powodu – postanowił po wielu latach Go uwolnić i to właśnie dlatego Elika musi go powstrzymać. Nieksiąże jest sceptycznie nastawiony do tego i nawet stwierdza że Aryman jest straszydłem którym straszy się niegrzeczne dzieci. Ale jako że gra postanowiła w trakcie samouczka że niepers nie może po prostu uciec z kanionu – bo jedyna droga z niego została zniszczona – to postanawia że póki nie znajdzie innej drogi to pomoże Elicę z jej zadaniem.

Po dostaniu się razem z Eliką do celi Arymana, dowiadujemy się też że sam Bóg Ciemności nie jest jeszcze uwolniony i mamy czas by „uzdrowić płodne pola” które spowodują że Aryman zostanie ponownie zamknięty. Nie będzie to jednak takie łatwe, dlatego że każdego z tych płodnych pól chroni jeden z pomagierów głównego złego.

Jeśli chodzi o historię, to nie jest to zła podstawa. Mamy zdefiniowane zło, którym jest… po prostu Bóg Ciemności i jego pomagierzy, jak i mamy zdefiniowane dobro, którym jest Elika i z braku laku nieznajomy. Jeśli chodzi zaś o rozgrywkę, to nie jest to zły początek, bo mamy ustawiony konkretny cel (uwięź Arymana, a to zrobisz dzięki uzdrowieniu płodnych pól) i drabinę do pokonania: pokonaj każdego z pomagierów.

Główną mechaniką gry jest poruszanie się – i co trzeba przyznać autorom – udało im się stworzyć system w którym fajnie się porusza. Jest to przede wszystkim zasługa modeli i animacji, dlatego że sam system poruszania się jest bardzo prosty. Do dyspozycji mamy aż trzy przyciski: skok, akcja kontekstowa i akcja kontekstowa z Eliką.

W późniejszych etapach gry odblokowujemy dodatkowe mechaniki, tylko są one przypisane do poszczególnych sekcji na mapie gry i nie można z nich skorzystać wtedy gdy ma się na to ochotę.

Ale nie jest to problem sam w sobie, takie Mario też ma ograniczony zestaw ruchów które możemy wykonać od początku gry, a jednak ludzie na niego nie narzekają. Dlaczego?

Największą różnicę w tej grze robi projekt map, albo może raczej decyzja twórców o tym że gra powinna mieć otwarty świat i to dzięki temu projekt map jest bardzo prosty, powtarzalny i nigdy nie ewoluuje.

Świat gry jest podzielony na 24 sekcje, mamy 4 pomagierów gdzie każdy dostaje 6 swoich sekcji. Z tej puli można usunąć jedną sekcje per boss, bo jest to tylko walka z bossem. Pozostała sekcje podążają tym samym schematem: wszystkie są zbudowane na obrzeżach kanionu, a jeśli nie to będą częścią jakiejś kołowatej struktury której obrzeża będziemy mogli zwiedzać. Skutkuje to tym, że będziemy mieli zawsze dwie drogi, jedną do przodu a drugą do tyłu.

Jedyne rozwidlenie jakie napotkamy będzie nas prowadziło, albo do korytarza prowadzącego do innej sekcji, albo do korytarza prowadzącego nas do środka sekcji gdzie znajduje się boss i płodne pole. Wszystkie sekcje zapychające – z pominięciem pierwszej – wymagają w tym miejscu by mieć odblokowaną jedną z mocy – o której później – która pomoże w przedostaniu się dalej.

Zazwyczaj w/w moc pomoże nam w przedostaniu się na samą arenę gdzie będziemy mogli stoczyć walkę z pomagierem. Po jego pokonaniu, możemy przystąpić do uzdrowienia pola i collectathonu, o którym także później. I każda sekcja zapychająca ma ten sam schemat.

Sekcje w której jest tylko walka z bossem, też są schematyczne. Dlatego że zawsze będą składały się z dwóch części: sekwencja platformowa która wymaga skorzystania z dwóch mocy, a nie tylko z jednej i ostatniej walki z pomagierem.

Nie byłoby w tym nic złego, gdyby nie to, że same przeszkody które pokonujemy w każdej z sekcji się mocno ze sobą pokrywają. Nie ma też wariacji samych przeszkód, a każda z nich to de facto jedno wejście i jedno wyjście.

I by była jasność, nie potrzebuje by raz na parę godzin gra zmieniała swoje mechaniki w taki sposób że byłaby to de facto inna gra. Chciałbym by cyklicznie były wprowadzane nowe mechaniki tak by poruszanie się po mapie ciągle sprawiało przyjemność. Albo by projekt map był wystarczająco interesujący.

Gdy dojdziemy do bossa danej sekcji i go pokonamy to następnie musimy uleczyć płodne pole. Powoduje to, że z całej sekcji zostaje usunięta czarna maź, która jak mniemam reprezentuje moce Ahrimana. Razem z mazią z mapy są usuwani wszyscy przeciwnicy. Co więc mamy do roboty w sekcji która została już uleczona?

Collectathon. Czyli zbieranie kul… energii? światła? plemników? Nie za bardzo wiem czego, a że piszę ten wpis długo po tym jak przeszedłem tą grę to już nie pamiętam jak je nazywała gra. Po uleczeniu płodnego pola w sekcji pojawiają się kule – przede wszystkim blisko głównej ścieżki. Nie ma kul które byłyby ukryte i w całej grze są tylko dwie które wymagają pewnej techniki by je zdobyć. A w grze ich wszystkich jest 1001.

Same kule służą do odblokowywania specjalnych mocy, o których wspominałem wcześniej. Dwie z tych mocy są wariacją na temat skoku, a dwie kolejne to latanie i bieganie po ścianie, oba ograniczone przez wcześniej wytyczony korytarz. Tych mocy nie można wykorzystać od razu po odblokowaniu, tylko należy znaleźć specjalny przycisk – który będzie się świecił na kolor wcześniej odblokowanej mocy – w świecie gry.

Warto wymienić irytującą cechę wyżej wymienionych mocy: latania i chodzenia po ścianach: bardzo łatwo źle oszacować przez jaką dziurę twórcy chcą byśmy przelecieli, szczególnie że decyzje musimy podjąć w pół-sekundy przy dziwnej perspektywie. Tak samo irytujące jest to, że gdy podczas chodzenia po ścianach wystarczy – nawet nie dotknąć, tylko – musnąć przeszkodę: byśmy spadli. Co tworzy frustrującą rozgrywkę typu: trial & error.

Ostatnią mechaniką którą chciałbym przedstawić jest walka. Nie pasuje ona do tej gry, dlatego że jest bardzo statyczna i nie wykorzystuje potencjału ruchowego nieksięcia. W czasie walki nie możemy skakać po ścianach by zdobyć jakąś przewagę nad przeciwnikiem, tylko stoimy jak ten cieć i staramy się zbliżyć do przeciwnika by można było zacząć atakować.

I odległość od przeciwnika na której możemy zacząć go atakować, jest irytująco mała. Niepers ma jeden atak „dystansowy”, którym jest rzucenie Eliki do walki. Ale by go uruchomić należy być na tej samej odległości gdzie możemy zaatakować przeciwnika innymi atakami. Jest to o tyle śmieszne, że animacja sugeruje że Elika wyskakuje zza nieksięcia by doskoczyć na zawrotną odległość pół metra.

Kolejną irytującą rzeczą jest arena na której toczą się walki. Za każdym razem jest to koło o dość niskim promieniu, które jest jeszcze bardziej ograniczane przez maź która lubi być na brzegach każdej areny. Warto tu wspomnieć, że gdy to my wejdziemy do tej mazi to „musimy walczyć o życie” w QTE. A gdy przeciwnik w nią wejdzie to jest wzmacniany. Nie byłby to problem gdyby nie sposób walki.

Walka jest na tyle prosta i niewymagająca, że można całą grę przejść nie bawiąc się zdobywanie żadnych kombosów. Jednak jeśli chcemy zadać więcej obrażeń, to musimy się ich nauczyć, bo łączenie różnych ataków pozwoli nam na pozbycie się przeciwnika szybciej. Irytującą cechą tego systemu jest to że niepers będzie się dużo przemieszczał po arenie, dzięki czemu bardzo łatwo jest trafić w maź lub na skraj areny. Mi wielokrotnie zdarzyło się, że po bardziej skomplikowanej sekwencji, przeciwnik i ja lądowaliśmy w mazi która odradzała jego życie i a ja musiałem „walczyć o życie”.

Wróćmy jednak do historii, dlatego że chcę zaspoilerować jej końcówkę która mnie irytuje. Nie martwcie się, jeśli nie przeszliście tej gry przez ostatnie 10 lat, to pewnie jej i tak jej nie przejdziecie. Ale jeśli z jakiegoś powodu nijakość was przyciąga, to możecie ominąć 6 następnych akapitów.

W trakcie gry nieznajomy i Elika poznają dlaczego jej ojciec (który przez całą grę nie został przedstawiony z imienia) ją zdradził i chciał uwolnić Arymana. Okazuje się, że przy jednym z jej skoków wpadła do jakiegoś dołu i zginęła. Jej ojciec by ją uratować zawarł pakt z diabłem, za który swoją drogą zapłacił bo nie dożył końca gry. Historia tragiczna, dlatego że gdy Ahriman został ponownie zamknięty w swojej celi i jego moce przestały działać na ten świat to Elika umarła.

I co robi w takiej sytuacji nieksiąże? Po przejściu przez 24 sekcje mapy, po pokonaniu wszystkich pomagierów, po doświadczeniu mocy Arymana i nawet po byciu zarażonym przez jego maź w jednym momencie. Po zapewnieniach Eliki że Aryman jest najgorszym co mogłoby się przytrafić tej krainie jak i samemu światu?

Postanawia pomyśleć penisem i zawrzeć pakt z diabłem by wskrzesić Elikę. What the fuck?

Nie ma to dla mnie sensu z perspektywy charakteru nieznajomego. Poznajemy go jako awanturnika, który nie dba o zdanie innych i nie przejmuje się innymi. Więc końcówka świadczy o tym, że niczego się nie nauczył. Że nadal jest samolubnym chujem.

Co więcej, zostawił świat w gorszej sytuacji niż go zastał na początku historii. Bo na samym początku Elika chciała uratować świat i może by się jej to udało bez pomocy nieksięcia (wątpliwe, ale możliwe). A teraz po jej wskrzeszeniu jest to niemożliwe, bo niepers i Elika przerwali wypuszczanie Arymana gdy chciał to zrobić jej ojciec. Nieznajomy zaś go po prostu wypuścił.

Z perspektywy rozgrywki też nie ma to sensu, dlatego że ostatnie 15 godzin które spędziłem z tą grą idą do kosza. Świat jest w jeszcze gorszej pozycji niż go zastaliśmy, bo Bóg Ciemności może swobodnie się szlajać po świecie.

Takie rzeczy jak złe zakończenie historii i kiepska mechanika która przez całą grę nie ewoluuje w znaczący sposób, powodują że nie mogę polecić tej gry. Nawet dla fanów serii będzie to za mało formuły która powodowała że w Piaski Czasu się fajnie grało.

Nie warto w tą grę grać.

August 18 2019

13:30

Konfiguracja Linuksa

Największym plusem Linuksa jest to że można go mocno spersonalizować i dostosować do swoich potrzeb. W tym wpisie opiszę konfiguracje z której ja korzystam i która – mam nadzieje – ułatwi Wam w jakiś sposób korzystanie z Linuksa.

GRUB

Jedną z pierwszych rzeczy którą pamiętam przy korzystaniu z Linuksa było to że przy uruchamianiu go zawsze wyświetlał się log zamiast tak zwanego splash screenu. Aktualnie nie jest to jednak domyślna konfiguracja. By to zmienić należy zmodyfikować plik: /etc/default/grub i zmienić linie:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

na:

GRUB_CMDLINE_LINUX_DEFAULT=""

Po modyfikacji należy wykonać następujące polecenie:

sudo update-grub2

Snap

Snap jest jednym z wielu menedżerów paczek który jest dostępny na Linuksa – głównie na Ubuntu i ich różnego rodzaju dystrybucje. Jego plusem jest to że dystrybuuje aplikacje razem z zależnościami i umieszcza je w stosownym sandboxie.

Nie miałem z nim problemów, do czasu aż nie zauważyłem że wrzuca wszystkie zainstalowane aplikacje do /var/snap: który u mnie jest na mniejszym – szybszym dysku. Jako że przez snapa zainstalowałem między innymi dockera, nie podobała mi się perspektywa by cały dockerowy cache, volumeny i tego typu pliki przetrzymywać na dysku systemowym. Ale jako że nie jest to windows, można ten katalog przenieść w inne miejsce.

By przenieść snapa, nie można po prostu przenieść katalogu i zrobić symlinka, jako że snap korzysta z AppArmour które tego typu zachowań nie lubi. By go przenieść, musimy więc zamountować odpowiedni katalog.

Na samym początku należy wyłączyć samego demona snapa:

services snapd stop

Gdy już to zrobimy należy – jako root – skopiować zawartość katalogów: /var/lib/snapd i /var/snap do nowych lokalizacji – tam gdzie ich miejsce, przy okazji z oryginałów robiąc backup:

cp -r /var/lib/snapd ~/.offload_drive/snapd
cp -r /var/snap ~/.offload_drive/snap

mv /var/lib/snapd /var/lib/snapd.bak
mv -r /var/snap /var/snap.bak

Później należy utworzyć te katalogi na nowo, jako że gdy chcemy coś zamountować, to musimy mieć do tego katalog.

mkdir /var/lib/snapd
mkdir /var/snap

Na sam koniec należy dodać do pliku /etc/fstab następujące linie:

/home/psychob/.offload_drive/lib_snapd    /var/lib/snapd  none  bind     0    0
/home/psychob/.offload_drive/var_snap     /var/snap       none  bind     0    0

I zatwierdzić to poleceniem:

mount -a

Źródło: 1

Bash

Bash jest domyślnym shellem w Ubuntu i wyłącznie z tego powodu jest tym z którego korzystam. A skoro już z niego korzystam, to miło jest go sobie spersonalizować. Tutaj jedyne co opiszę to jak zmodyfikować $PS1, czyli tak zwany prompt.

Najprostszą rzeczą przy modyfikacji promptu, jest skorzystanie z gotowych generatorów, na przykład z bashrcgenerator.com. Na tej stronie wystarczy wyklikać sobie wymarzonego prompta, i gdy skończymy to wystarczy wygenerowany kod dodać na końcu pliku: ~/.bashrc.

Ale skoro już upiększyliśmy sobie prompta, to fajnie byłoby gdyby wyświetlał nam brancha jeśli jesteśmy w jakimś repozytorium. By to zrobić, należy do $PS1 dodać następujące wyrażenie:

$PS1 +="\$(__git_ps1 '(%s) ')"

Ale nie zadziała to tak od razu, bo potrzebujemy mieć jeszcze definicje funkcji __git_ps1, można ją znaleźć na stronach githuba. By wszystko zadziałało, należy dodać przed skorzystaniem z w/w funkcji kod który dołączy ten plik do naszego ~/.bashrc.

source ścieżka-do-pliku

Źródło: 1,2,3,4

Docker

Docker jest jednym z tych narzędzi które na stałe weszły do zestawu narzędzi każdego dewelopera (czy tego chce czy nie), więc dobrze jest go sobie poprawnie skonfigurować.

By nie było potrzeby przełączanie się na roota za każdym razem gdy chcemy coś zrobić z naszymi kontenerami, warto dodać naszego użytkownika jako zaufanego. By to zrobić należy dodać siebie do grupy docker.

sudo usermod -a -G docker psychob

Przy czym może zdarzyć się to, że po zainstalowaniu dockera, nie będziemy mieli takiej grupy. W takim wypadku należy ją stworzyć:

sudo groupadd docker

Docker domyślnie korzysta z sieci 172.12/16, może być to dość niefortunne gdy w naszym domu lub pracy korzystamy z takiego zakresu, na szczęście łatwo jest to zmienić w konfiguracji. W pliku /etc/docker/daemon.json (lub jeśli zainstalowaliście dockera przez snapa to: /var/snap/docker/current/config/daemon.json), należy dodać następującego json’a:

{
  "bip": "172.26.0.1/16"
}

Po tym należy zrestartować dockera

Źródło: 1,2

SSH

SSH jest wygodnym sposobem na uwierzytelnienie siebie w komunikacji z innymi serwerami. W szczególności jeśli korzystamy z szyfrowania asymetrycznego i kluczy RSA.

Zawsze gdy konfiguruje na nowo system, to nigdy nie pamiętam jakie uprawnienia mają mieć pliki id_rsa i id_rsa.pub:

chmod 0600 id_rsa      # RW only for owner
chmod 0644 id_rsa.pub  # RW for owner, Read for anyone else

Innym problem zaczyna się wtedy, gdy musimy korzystać z większej ilości kluczy, jak wtedy zarządzać nimi by ssh samo wiedziało który klucz służy do jakiego połączenia? Służy do tego plik ~/.ssh/config.

Należy w nim wymienić zapisać hosty z którymi się chcemy łączyć, jak i kluczy z których powinien korzystać.

Host work.git.com
    HostName work.git.com
    User git
    IdentityFile ~/.ssh/id_rsa_work


Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa


Źródło: 1, 2

Firefox

Bardzo dużo czasu spędziłem na Windowsie i przyzwyczaiłem się do konfiguracji firefoxa która jest domyślnie na tym systemie. Co prawda nie rozumiem dlaczego różni się ona między systemami, ale pewnie jest to jedna z tych rzeczy które dawno temu zostały ustalone i nikt nie chce ich teraz zmienić.

By zmienić niżej wymienione rzeczy należy wejść na stronę about:config i zmienić następujące rzeczy:

Co jest zmieniane Klucz Wartość Klawisz backspace odpowiada za cofnięcie się do poprzedniej strony browser.backspace_action 2 Firefox nie wyłącza się gdy zamkniemy ostatnią kartę browser.tabs.closeWindowWithLastTab false

Źródło: 1, 2

VIM

VIM jest jednym z tych narzędzi na którego ludzie lubią psioczyć, nie bez powodu. Jest to trudne w obsłudze narzędzie które ma tą zaletę że jest w zasadzie zainstalowane wszędzie. Można je nawet ulepszyć stosując odpowiednią konfiguracje, a taka znajduje się na wiki vima. Dla mnie jest wygodniej jak wyłączy się obsługę myszy:

" Enable use of the mouse for all modes
" set mouse=a

Źródło: 1

PHPStorm/Jetbrains IDE

Projekty przy których pracujemy mogą być bardzo duże, dlatego środowiska programistyczne od jetbrains sugerują by dostosować konfiguracje systemu. Dzięki zmianie konfiguracji PHPStorm czy jakiekolwiek inne środowisko od nich będzie potrafiło szybciej indeksować zmiany w naszym projekcie.

By zwiększyć maksymalną ilość obserwowanych plików należy utworzyć nowy plik: /etc/sysctl.d/60-jetbrains.conf, z zawartością:

# Set inotify watch limit high enough for IntelliJ IDEA (PhpStorm, PyCharm, RubyMine, WebStorm).
# Create this file as /etc/sysctl.d/60-jetbrains.conf (Debian, Ubuntu), and
# run `sudo service procps start` or reboot.
# Source: https://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
# 
# More information resources:
# -$ man inotify  # manpage
# -$ man sysctl.conf  # manpage
# -$ cat /proc/sys/fs/inotify/max_user_watches  # print current value in use

fs.inotify.max_user_watches = 524288

Zmiana zostanie zaaplikowana po restarcie.

Źródło: 1, 2

Spotify

Z jakiegoś powodu, gdy zainstalowałem spotify przez snapa, środowisko graficzne – u mnie jest to mate – nie potrafiło wyświetlić go przy widgecie który odpowiadał za głośność systemu.

Poprawienie tego było proste, należało zmienić nazwę jednego pliku:

sudo mv /var/lib/snapd/desktop/applications/spotify_spotify.desktop /var/lib/snapd/desktop/applications/spotify.desktop

Źródło: 1

August 11 2019

09:18

Obsługa błędów w PHP

Co się powinno dziać gdy w programie zostanie napotkany błąd? W najlepszym przypadku: poinformuje nas o tym kompilator lub interpreter, co – przynajmniej w teorii – zmusi nas do jego naprawienia. Innym dobrym rozwiązaniem jest przerwanie wykonywania programu tak by nieprawidłowa operacja nie wyrządziła żadnych szkód. Opcjonalnie dobrze by było by aplikacja mogła przechwycić tego typu błąd, by później go wyświetlić w zjadliwej formie. W najgorszym wypadku, aplikacja zignoruje ten błąd i będzie kontynuowała wykonywanie.

Problem

PHP posiada dwa mechanizmy raportowania błędów, które wpisują się w całe spektrum przedstawione wyżej. Ma ono wyjątki (Exception) jak i błędy (trigger_error, ale nie możemy mylić tego ze specjalną wersją wyjątku Error, czy też inną specjalną wersją wyjątku ErrorException). Miło by było, gdyby w następnej wersji jedna z tych funkcjonalności została porzucona (i by to były błędy) na korzyść drugiej (czyli wyjątków).

Wyjątków tutaj nie chce jakoś mocno omawiać, bo są one zaimplementowane podobnie jak w każdym normalnym języku programowania, a jeśli macie doświadczenie z Javą to się szybko z nimi odnajdziecie.

Błędy są specyficznym mechanizmem który składa się z dwóch kroków: pierwszy to wyświetlenie na ekranie błędu który właśnie wystąpił, a drugi to – w zależności od tego czy interpreter potrafi poradzić sobie z błędem – przerwanie skryptu albo wykonanie go zakładając że to czego nie ma to NULL.

Tego typu błędy są wyzwalane (z ang. trigger) w zasadzie w każdej sytuacji gdy PHP nie potrafi poradzić sobie z błędem, dla przykładu:

<?php
    $array = [
        // this array doesn't have any key
    ];

    // this line will emit warning
    var_dump($array['missing-key']);

    // this line will also emit warning
    var_dump($non_existing_var);


Jeśli wykonamy taki kawałek kodu, to dostaniemy taką informacje z interpretera:

PHP Notice:  Undefined index: missing-key in /home/psychob/Projekty/Blog/php-error-handling-weirdness/01-php-emitting-errors.php on line 9
PHP Stack trace:
PHP   1. {main}() /home/psychob/Projekty/Blog/php-error-handling-weirdness/01-php-emitting-errors.php:0
/home/psychob/Projekty/Blog/php-error-handling-weirdness/01-php-emitting-errors.php:9:
NULL
PHP Notice:  Undefined variable: non_existing_var in /home/psychob/Projekty/Blog/php-error-handling-weirdness/01-php-emitting-errors.php on line 12
PHP Stack trace:
PHP   1. {main}() /home/psychob/Projekty/Blog/php-error-handling-weirdness/01-php-emitting-errors.php:0
/home/psychob/Projekty/Blog/php-error-handling-weirdness/01-php-emitting-errors.php:12:
NULL


Jak można zauważyć, PHP założył że w zmiennych których nie ma znajduje się wartość NULL.

Innym miejscem gdzie interpreter nas poinformuje błędem, jest jeśli podamy do funkcji niepoprawną ilość argumentów, na przykład:

<?php
    var_dump(strlen('string', 'bad-argument'));
    var_dump(strlen());


Taki skrypt na wyjściu da nam:

PHP Warning:  strlen() expects exactly 1 parameter, 2 given in /home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php on line 5
PHP Stack trace:
PHP   1. {main}() /home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php:0
PHP   2. strlen() /home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php:5
/home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php:5:
NULL
PHP Warning:  strlen() expects exactly 1 parameter, 0 given in /home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php on line 6
PHP Stack trace:
PHP   1. {main}() /home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php:0
PHP   2. strlen() /home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php:6
/home/psychob/Projekty/Blog/php-error-handling-weirdness/02-incorrect-argument-count-to-system-function.php:6:
NULL

Ten konkretny przypadek może być jednak zmieniony w wyjątek automatycznie jeśli skorzystamy z „nowej” funkcjonalności PHP czyli declare(strict_types=1), na przykład:

<?php
    declare(strict_types=1);

    var_dump(strlen('string', 'bad-argument'));
    var_dump(strlen());

Ale nie zadziała to przy wywoływaniu funkcji które my zdefiniowaliśmy, na przykład:

<?php
    declare(strict_types=1);

    function my_func($abc, $def)
    {
    }

    my_func(1, 2, 3, 4);


Jak widać, PHP wyzwoliło dwa rodzaje błędów: Notatkę (Notice) i Ostrzeżenie (Warning). Oba typy błędów charakteryzują się podobnym zachowaniem: Poinformuj użytkownika, i kontynuuj wykonywanie zakładając że to czego nie ma jest równe NULL.

Ale PHP posiada jeszcze inne typy błędów, o – bardzo intuicyjnej nazwie – Błąd (Error). W tej puli znajdują się błędy które nie pozwalają na poprawne wykonanie skryptu, na przykład nie poprawna składnia, nie istniejąca klasa, nie istniejąca funkcja, itp.:

<?php
    return unknown_function('?');


Zwróci nam:

PHP Fatal error:  Uncaught Error: Call to undefined function unknown_function() in /home/psychob/Projekty/Blog/php-error-handling-weirdness/05-fatal-error-unknown-function.php:2
Stack trace:
#0 {main}
  thrown in /home/psychob/Projekty/Blog/php-error-handling-weirdness/05-fatal-error-unknown-function.php on line 2

<?php

    interface /* Empty */  {

    }


Zwróci nam:

PHP Parse error:  syntax error, unexpected '{', expecting identifier (T_STRING) in /home/psychob/Projekty/Blog/php-error-handling-weirdness/06-fatal-error-bad-grammar.php on line 3


Co możemy zrobić?

Pierwszą rzeczą która przychodzi na myśl, to po prostu wyłączenie raportowania błędów

error_reporting(0)

error_reporting pozwala na wyłączenie wyświetlania błędów przez PHP. Jest to na pewno przydatna funkcjonalność którą wypada skonfigurować na środowisku produkcyjnym, a jej działanie wygląda tak:

<?php
    /** @noinspection PhpUndefinedVariableInspection */

    error_reporting(0);

    $array = [
        // this array doesn't have any key
    ];

    // this line will emit warning
    var_dump($array['missing-key']);

    // this line will also emit warning
    var_dump($non_existing_var);


Na wyjściu powinniśmy dostać:

/home/psychob/Projekty/Blog/php-error-handling-weirdness/07-error-reporting.php:11:
NULL
/home/psychob/Projekty/Blog/php-error-handling-weirdness/07-error-reporting.php:14:
NULL


Tylko nie jest to idealne rozwiązanie, dlatego że błąd w kodzie nadal jest, my tylko spowodowaliśmy że nie można go zobaczyć. Dlatego idealnym rozwiązaniem byłoby gdybyśmy mogli taki błąd zmienić w wyjątek. I da się to zrobić przy pomocy paru narzędzi które twórcy nam przygotowali, a mówiąc konkretnie set_error_handler i ErrorException.

set_error_handler

set_error_handler jest funkcją która pozwala nam na zastąpienie domyślnego error handlera naszym własnym. Funkcja ta przyjmuje dwa argumenty: funkcje która ma być wywołana w przypadku błędu jak i dla których typów błędu ma być wykonana.

Przykładowa funkcja która zacznie rzucać wyjątki w przypadku wystąpienia błędu wygląda tak:

set_error_handler(function (int $level, string $message, string $file, int $line) {

 if (error_reporting() === 0) {

 return;

 }

 

 throw new \ErrorException($message, 0, $level, $file, $line);

});


Taka implementacja zapewni nam że wszystkie błędy które można przechwycić, rzucą wyjątek. Warto tutaj też zwrócić uwagę na warunek który zwróci nam wartość null z funkcji, jest to obsługa specjalnego operatora który istnieje w PHP: ‘@’ tak zwany operator STFU. O ile nie jest zalecane korzystanie z niego, to nigdy nie wiemy która z naszych zależności będzie z niego korzystać. Co do zwracanej wartości, to jeśli nasz handler zwróci wartość false, to kontrole przejmie domyślny handler (ten co wyświetla błąd na standardowym wyjściu).

Ale co z błędami których przechwycić się nie da? Bo jak to przystało na PHP, istnieją błędy których się nie da przechwycić przy pomocy set_error_handler, dla przykładu:

<?php
    set_error_handler(function (int $level, string $message, string $file, int $line) {
        if (error_reporting() === 0) {
            return;
        }

        throw new ErrorException($message, 0, $level, $file, $line);
    });

    interface foo
    {
        public function bar();
    }

    class baz implements foo
    {
    }


Co można w takim wypadku zrobić?

register_shutdown_function

Należy zaznaczyć tutaj, że tego typu błędów nie da się przechwycić w taki sposób by można było kontynuować normalną egzekucje programu, dlatego że w większości przypadków jest to brak zaimplementowanej metody która jest w interfejsie, abstrakcyjna metoda itp. Nie zmienia to faktu, że możemy zareagować na tego typu błąd i możemy wyświetlić swoją informacje o błędzie.

By to zrobić, należy podpiąć się pod „shutdown function”, czyli funkcje która będzie wykonywana po zakończeniu skryptu, służy do tego funkcja register_shutdown_function. I nie ma tu rozróżnienia czy wykonywanie zakończy się sukcesem czy porażką. W naszym przypadku taka funkcja mogłaby wyglądać tak:

    register_shutdown_function(function () {
        $lastError = error_get_last();
        if ($lastError !== NULL) {
            throw new ErrorException($lastError['message'], 0, $lastError['type'], $lastError['file'],
                $lastError['line']);
        }
    });


Jak można zauważyć z implementacji, sprawdzamy jaki był ostatni błąd i jeśli nie został obsłużony to rzucamy wyjątek. Tutaj pojawia się pytanie: Skoro ten kawałek kodu wykona się już po zakończeniu skryptu, to jak taki wyjątek złapać?

Nie da się, nawet przy pomocy set_exception_handler. By przejąć tego typu wyjątek należy go samemu przekazać do naszego exception handlera, albo obsłużyć go w tej funkcji.

set_exception_handler

set_exception_handler działa tak samo jak set_error_handler, z tym wyjątkiem że ta funkcja jest wykonywana gdy zostanie rzucony wyjątek i nie zostanie on złapany przy pomocy bloku try...catch. Po wykonaniu naszego exception handlera, wykonywanie skryptu się zakończy.

Przykład takiej funkcji:

<?php
    set_error_handler(function (int $level, string $message, string $file, int $line) {
        if (error_reporting() === 0) {
            return;
        }

        throw new ErrorException($message, 0, $level, $file, $line);
    });

    set_exception_handler(function (Throwable $e) {
        var_dump($e-&gt;getMessage());
        var_dump($e-&gt;getTraceAsString());
    });

    var_dump($array); // not existing variable


set_error/exception_handler a register_shutdown_function

Warto wspomnieć o różnym zachowaniu między tymi funkcjami. set_error/exception_handler przy wywołaniu podmienią aktualnego handlera, a starego wrzucą na stos którego można przywrócić przy pomocy funkcji restore_error/exception_handler. Takie zachowanie może się przydać, jeśli chcemy błędy obsługiwać „blokowo”, czyli w części aplikacji będziemy chcieli zamieniać błędy na wyjątki (bo ta część je obsługuje), a w innej chcemy na przykład je ignorować, bo jest to część legacy naszej aplikacji.

register_shutdown_function, rejestruje kolejną funkcje która zostanie uruchomiona po zakończeniu wykonywania skryptu. Czyli jeśli odpalimy ją dwa razy, to nasza funkcja zostanie wykonana dwa razy.

Podsumowanie

PHP posiada dwa konkurujące ze sobą mechanizmy raportowania błędów. Na szczęście jeden jest w odwrocie i – miejmy nadzieje – zostanie wkrótce zastąpiony w całości przez wyjątki.

June 23 2019

08:53

Electronic Entertainment Expo 2019

Electronic Entertainment Expo – czyli w skrócie , jest to impreza branży gier komputerowych, gdzie co roku najwięksi gracze – jak i ci którzy chcieliby urosnąć do takiej rangi – pokazują co mają do zaoferowania entuzjastom. Jakie to gry, oprogramowanie czy sprzęt powstaje by umilić nam nadchodzący czas. Czyli w skrócie jest to grupowa masturbacja branży nad graczami, w nadziei że uda się sprzedać więcej kopii swoich nieoryginalnych gier.

Inaczej było w tym roku, gdzie Sony postanowiło się nie stawić na targach pierwszy raz od ich rozpoczęcia w 1995 roku. Oprócz tego Electronic Arts, zapowiedziało że nie będzie robiło prezentacji na wielkiej scenie, tylko skupi się na swoim przedsięwzięciu o nazwie: EA Play. Jako, że to wydarzenie odbywało się chwilę przed samymi targami, na potrzeby tego tekstu dołączę także jego ocenę.

Kto więc organizował swoje konferencje? Microsoft, Ubisoft, Bethesda, Devolver Digital, Square Enix i Nintendo. Z takim line-upem – według mnie – Microsoft miał bezwartościowe trofeum oznajmiające o wygranej tegorocznego w kieszeni. A pisząc ten tekst po obejrzeniu wszystkich prezentacji, mogę stwierdzić że wygrał je bezkonkurencyjnie.

Zanim jednak przejdę do opisania co mi się podobało a co nie w każdej z wyżej wymienionych konferencji, powiem że głównym motywem przewodnim – znów: dla mnie – było: „Jeszcze nie przeszedłem poprzedniej części tej serii” albo „Muszę zagrać w poprzednią grę tego studia”.

E3 2019 - EA Play

Zacznijmy w kolejności chronologicznej, czyli na pierwszy ogień idzie EA razem z nową grą z uniwersum Gwiezdych Wojen: Star Wars: Fallen Order. Nowa gra od twórców Titanfall 2 (w którą wypadało by zagrać) która, w przeciwieństwie do poprzednich gier ze świata Gwiezdnych Wojen, ma nie mieć mikrotransakcji . Nie wiem dlaczego jest to zaliczane na plus dla tej gry, wiedza że EA nie jest aż tak chciwe jak być potrafi.

Respawn Entertainment pokazało przy Titanfall 2 że potrafi tworzyć interesujące gry dla pojedynczego gracza, dlatego smuci mnie to że ich nowa gra wygląda tak… nudo. Nie było tam niczego nowego, czy innowacyjnego. Sama gra wyglądała tak jakby cała branża chciała wytworzyć wzór na najbardziej schematyczną rozgrywkę, by później umieścić ją jako wzorzec w Sèvres.

Ale smutniejsze było chyba tylko to, że sama prezentacja nie miała do pokazania niczego ciekawego. Apex Legend, FIFA, Madden, Simsy, to są gry które mnie nie interesują, dzięki czemu wyłączyłem tą prezentacje gdy skończono pokazywać Gwiezdne Wojny. Nawet skrót wydarzenia wydał mi się nudny i niewarty mojego czasu.

E3 2019 - Microsoft - Head of Xbox

Następna konferencja była od Microsoftu. To na tej firmie spoczywał obowiązek pokazania jak powinny takie prezentacje wyglądać, jako na jedynym poważnym przedstawicielu producentów konsol. I nie zawiodłem się. Przez cały czas trwania prezentacji pokazywane były gry – modulo pokazania usługi subskrypcyjnej i „zapowiedzi” nowej konsoli.

Zanim jednak przejdę do sedna, muszę wspomnieć, że MS kupił w ostatnim roku dość dużą ilość developerów. Piszę o tym teraz, dlatego że na konferencji okazało się że kupiony został Double Fine – twórcy Psychonauts, którą to grę powinienem przejść. A skoro o tym mowa, to pokazane zostało tam Psychonauts 2.

Konferencje otwarła gra z Obsidian Entertainment (który został kupiony przez MS): Outer Worlds. Zapowiedziana w tamtym roku „odpowiedź na Fallout 76”, przykuła moją uwagę już wtedy, ale nie za sprawą interesującej rozgrywki, czy ciekawie zapowiadającej się fabuły. Interesuje się nią dlatego że Obsidian zrobił najlepszego fallouta w 3D, czyli Fallout: New Vegas. I w sumie jest to mój najlepszy trop, dlatego że na konferencji nie było zajawki z rozgrywką.

Chociaż z trzeciej strony, przy wyszukiwaniu Outer Worlds Gameplay, znajduje filmiki na YouTube, więc to chyba ja powinienem uzupełnić wiedzę.

Z ciekawszych tytułów, czy może z takich które mnie zaintrygowały, to zapowiedziana została gra: 12 Minutes. Z punktu widzenia rozgrywki, to trudno mi ocenić co to będzie. Jeśli miałbym strzelać, to pewnie celowałbym w point & click czy podobne przygodówki. Nie mniej sam zwiastun mnie zaintrygował.

CD-Project RED pokazał że w ich nowej grze będzie grał Keanu Reeves. I w zasadzie tyle mogę stwierdzić. Sam zwiastun Cyberpunka 2077 przypomniał mi że powinienem wreszcie przejść serię Wiedźmin, ale to może w przyszłości.

Z kronikarskiego obowiązku odnotuje nową grę od From Software (twórców takich gier które powinienem przejść jak: Dark Souls 1,2 i 3; Bloodborne): Gdzie są dwie ostatnie księgi pieśni ognia i lodu? Którą ma współtworzyć George R. R. Martin.

Nie mogło zabraknąć szlagierów ze stajni Microsoftu: Gears of War (który teraz ma mieć tryb kooperacyjny dla 3 osób), nowe Halo (gdzie nie wiem co się dzieje, bo nigdy nie interesowałem się tą serią, ale pewnie jak wyjdzie Master Chief Collection na PC to pewnie przejdę) i DLC do Forzy. Najciekawsze z nich wszystkich było owe DLC, dlatego że twórcy postanowili dodać w nim klocki LEGO. Widać że twórcy po dodaniu resoraków z serii Hot-Wheels nie próżnują i skoro nie da się ulepszyć już samej formuły rozgrywki to będą mogli przynajmniej pobawić klockami.

Nie powinienem też zapominać o Projekcie Scarlett, który ma być następcą Xboxa One. Trudno jednak stwierdzić coś konkretnego, dlatego że materiał wyemitowany był raczej zajawką jaka ta konsola nie będzie fajna: 8K, brak ekranów ładowania, 4 razy mocniejsze niż aktualna konsola*.

* – ale my tylko o tym rozmawiamy, więc nie oczekuj niczego.

E3 2019 - Bethesda

Nie wiem dlaczego, Bethesda pojawiła się ze swoimi grami na . Nie miała ona tak dużo materiału by wypełnić prawie półtora godziny i materiały pokazujące jak to oni nie kochają swojej społeczności pokazywały to bardzo dobrze.

O społeczności, czy może bardziej o ludziach którzy byli obecni na tej konferencji, chciałbym napisać dużo. Szczególnie w rozdziale że fanatyczne oddanie studiu deweloperskiemu które ma nas w dupie, nie jest zdrowe. Na prawdę, co jest z tymi ludźmi? Cieszą się że Fallout 76 zacznie choć trochę przypominać funkcjonalną grę?

Ja rozumiem, że widownie na tego typu wydarzeniach są specjalnie dobierane, by nie wydarzyły się rzeczy które mogą skompromitować gospodarza. Ale to co oni tam odprawiali było naprawdę zastanawiające, szczególnie w kontekście tego co Bethesda wysrała w poprzednim roku.

Ale by być fair w stosunku do studia z Bethesdy, pokazali dwie interesujące produkcje – czy może raczej pomysły. Oba od studiów zależnych: Ghostwire: Tokio – robione przez studio które robiło The Evil Within (Kolejna gra którą powinienem przejść) i Deathloop – robione przez Arkane Studio (Dishonored 1 i 2, Prey 2017 [Kolejne gry które…])

Na samej konferencji zabrakło nowego zaś Elder Scrolls i Starfield, więc prócz DOOM Ethernal Bethesda nie miała czego pokazywać.

E3 2019 - Devolver Digital

Devolver Digital, wypuścił w tym roku film który miał… Nie wiem co. Jest dziwny i wydaje mi się że zapowiedzieli tam parę gier. Jeśli ktoś lubi gry od Devlovera (Hotline Miami, Enter the Gungeon, itp.) to całkiem możliwe że coś upoluje tam dla siebie. Każdemu innemu i tak polecam zapoznanie się z tą „konferencją” choćby w jaki dziwny sposób jest prowadzona.

E3 2019 - Ubisoft

Dla mnie Ubisoft na targach zawsze pokazywał przynajmniej jedną interesującą grę, zazwyczaj na końcu prezentacji. W tym roku było nieco inaczej i jedyną interesującą grę pokazali na początku i choć trudno mi przechodzi przez klawiaturę to że Watch Dogs: Legion jest tą interesującą pozycją.

Oprócz tego, że powinienem przejść poprzednie części tej serii, pokazali dłuższą rozgrywkę z samej gry. Obiecali system permadeath (czyli jeśli postać zginie podczas rozgrywki, to zostaje martwa) i możliwość zrekrutowania każdego NPC który znajduje się na mapie.

I tutaj pojawia się mój problem z tym projektem – jego zakres go zabije. Szczególnie że obiecują by każdy z NPCów miał swoja misje (dzięki której go zrekrutujemy) jak i miał nagraną pełną ścieżkę dialogową. Da się coś takiego osiągnąć (proceduralne generowana zawartość nie jest niczym nowym w grach), ale jeśli nie zrobi się tego bardzo dobrze to wyjdzie nam gówno.

Oprócz tego, Ubisoft nie miał dla mnie niczego ciekawego. Dodatki do Rainbow 6, The Divison czy For Honor mnie kompletnie nie interesują.

E3 2019 - Square Enix

Square Enix, jako przedstawiciel japońskich wydawców postanowił zanudzić mnie różnego rodzaju grami Final Fantasy. Remaki, spin offy i innego rodzaju jRPGi powodowały że bardzo szybko ominąłem znaczną część prezentacji.

Dopiero pod koniec zaprezentowali Dying Light 2, którego pierwszą część wypadało by przejść, Outriders – grę polskiego studia People Can Fly (tutaj wypadało by przejść Bulletstorma, czy ichnie Gearsy) którego pre-renderowany zwiastun razem z filmem jak pracuje zespół, spowodował moje braki w koncentracji.

I na koniec Avengers. Po obejrzeniu zwiastuna trudno mi stwierdzić jakiego typu ma być to gra – i pewnie nie pomogło ominięcie tłumaczenie twórców – ale mogę stwierdzić z pewnością że nie wykupili licencji na twarze z MCU. Wydaje się ciekawe, ale bardziej dlatego że w MCU skończyła się pewna epoka razem z Infinity War i Endgame i mam pewien niedosyt.

E3 2019 - Nintendo

Na koniec zostawiłem Nintendo, ale po zobaczeniu połowy konferencji i stwierdzeniu że „to nie jest coś co jest adresowane dla mnie” postanowiłem sobie odpuścić.

Podsumowując, tegoroczna konferencja była słaba. Częściowo dlatego że drugi producent konsol był nieobecny: Sony. Ale reszta firm która wystawiała się na targach też nic ciekawego w większości nie pokazała. Może to dlatego że nie oglądałem tegorocznego na żywo, tylko odtwarzałem wszystko z YouTube i dzięki temu miałem magicznego pomocnika nazwanego: możliwość ominięcia nudnych wstawek. A może dlatego że standardy co do gier mi się powiększyły i byle co mnie już nie usatysfakcjonuje.

Nie wiem, może to tylko mój wrodzony pesymizm zaczernia mi sytuacje i gry które były pokazywane na tym będą warte by w nie zagrać.

 

May 22 2019

psychob
11:53
0246 6a62 500
Reposted fromoll oll
psychob
11:53
0247 e558 500
Reposted fromoll oll
psychob
11:44
0781 6ca1 500
Reposted fromtotal1ty total1ty viaoll oll
psychob
11:33
6913 0ce2
Reposted fromEmilieBronte EmilieBronte viaoll oll
psychob
11:24
1571 0653 500
Reposted fromczajnikq czajnikq vialukan lukan
psychob
11:23
9993 7d05
Reposted fromteijakool teijakool viatomash tomash
psychob
11:22
0203 2bdd 500
Reposted fromzelbekon zelbekon viatomash tomash
psychob
11:22
0229 9a7f 500
Reposted fromfungi fungi viatomash tomash
psychob
11:22
8529 7d90 500
Reposted fromhekate hekate viatomash tomash

February 03 2019

15:26

Taśmy Kaczyńskiego

Otto von Bismark miał powiedzieć ponad sto lat temu, że: „Im ludzie wiedzą mniej o powstawaniu kiełbas i praw tym lepiej w nocy śpią” i coś musi być z tym na rzeczy, jako że przy każdej okazji gdy wyborcy mogą zobaczyć jak ta fabryka działa od środka to mamy skandal, albo jakiś potencjał na niego.

Dzisiaj chciałbym się przyjrzeć najnowszej aferze, czyli tak zwanych: „Taśmach Kaczyńskiego”. Ten tekst będzie moją próbą zrozumienia, o co w niej chodzi – czy są to faktycznie haki na miarę „ośmiorniczek”, czy może Gazeta Wyborcza przy pomocy „Instytutu Danych z Dupy” próbuje podłożyć PiSowi machlojkę zrobioną z niczego.

Na samym początku należy zwrócić uwagę na to co działo się przed opublikowaniem przez Gazetę Wyborczą (jak i portal gazeta.pl) omawianych artykułów, otóż nieprzychylny rządowi dziennikarz Tomasz Lis pisał na twitterze: 29 stycznia 2019 – to będzie jeden z najważniejszych dni w osiemnastoletniej historii PIS. A z całą pewnością najprawdziwszy.. A wtórował jemu Roman Giertych odpowiadający na pytanie: „W skali od 1 do 10, jak grubo będzie?” – napisał – 11.

Oczekiwania napompował też sam PiS, który odwołał swoich ludzi z porannych programów, w oczekiwaniu na to co przyniesie publikacja wyborczej. Czas mijał. Poranny nakład Gazety Wyborczej został dostarczony do sklepów i jak afery nie było, tak jej nie ma. Ale dlaczego?

Zanim odpowiemy sobie na to pytanie, warto zobaczyć co faktycznie jest w tych taśmach i media zwracają uwagę na cztery rzeczy (w kolejności od najmniej ważnej):

  1. #ja cię nie mogę, czyli co Jarosław Kaczyński miał powiedzieć do tłumaczki.

  2. Dlaczego biurowce które ma zbudować spółka Srebrna nie powstaną dopóki rządzi w Warszawie Platforma Obywatelska.

  3. To że Jarosław Kaczyński ugaduje deal na 1,3 miliarda złotych w sprawie zbudowania w/w wieżowców.

  4. To że Jarosław Kaczyński próbuje wyciągnąć ze spółki Srebrna pieniądze by zapłacić swojemu kontrahentowi.

Pierwszym punktem nie będę się zajmował, bo celem internetu jest wyciąganie śmiesznych lub ośmieszających fraz z tego typu publikacji, tylko nie rozumiem dlaczego tym zajmują się media…

Kolejne punkty wymagają pewnego wyjaśnienia, które znajduje się na funpage’u Sławomira Mentzena4 – tłumaczy On tam w jaki sposób Jarosław Kaczyński i spółka Srebrna uwłaszczyli się na majątku państwowym.

Wiemy teraz że Naczelnik chce by w Warszawie powstały dwa wieżowce – o wielkości 190 metrów – którymi by zarządzała spółka Srebrna – miały by się nazywać „bliźniacy” lub K-Tower. Mają one powstać na terenach którymi zarządza spółka Srebrna – tylko zanim powstaną to warszawski ratusz musi wydać pozwolenie na ich budowę.

Tutaj wpadamy do sedna problemu Prezesa: Póki w warszawie rządzi Platforma Obywatelska to te wieżowce nie powstaną. Kaczyński nawet stwierdza że ratusz nielegalnie blokuje budowę tych budynków, tylko nie ma na to dowodów i nie potrafi wymusić prawnie by ratusz wydał taką zgodę. To jest główny powód dla którego wstrzymano ten projekt.

Drugi punkt jest tym, który telewizja rządowa i media przychylne PiSowi mogą przekuć w atak na Platformę. Jeśli w okolicy znajdują się już budynki o podobnej wielkości – jak to zauważyła organizacja Miasto Jest Nasze na swoim facebooku – a ratusz nie chce wydać zgody, to mamy chyba do czynienia z państwem układów – a nie prawa? Co nie?

Prezydent Warszawy – Rafał Trzaskowski, powiedział: Nie wydałbym zgody na budynek mający 190 metrów. Nikt nie mówi, że tam nie może stanąć budynek. Chodziło o to, żeby wybudować taki, żeby zarabiać na nim grube pieniądze. O ile nie da się tej argumentacji obronić, bo wszystkie budynki które są w okolicach Srebrnej raczej są tam by zarabiać – a nie pełnić funkcje drapaczy chmur, to Pan Trzaskowski zwraca uwagę na pewien problem który miałaby opozycja.

Na czym ten problem polega? Otóż załóżmy że Srebrna zbudowała by K-Towers, oznaczało by to zyski na poziomie ~100 milionów złotych rocznie. Załóżmy że połowa z tej kwoty trafiła by do PiSu, dla porównania subwencja partyjna to około 20 milionów złotych rocznie.

Taki strumień gotówki na pewno by umocnił pozycje PiSu – pieniądze znaczą bardzo dużo w polityce. A przy dochodach porównywalnych z tymi z subwencji, mogli by nawet ją zlikwidować – co oznaczało by zmniejszenie możliwości opozycji, jak i każdej partii która by chciała się wybić.

Ale skoro to jest #Wina Tuska, to dlaczego wszyscy dookoła mówią że ta afera może zmieść PiS? Cóż by zbudować duży budynek, potrzebujemy pieniędzy. Potrzebujemy zapłacić architektom, budowlańcom, wykończeniowcom, potrzebujemy w końcu zapłacić za same materiały. Całościowo coś takiego może kosztować nawet miliard trzysta milionów złotych. Skąd tylko wziąć te pieniądze?

Można wziąć kredyt. Tylko nie wydaje mi się że banki ot tak by udzieliły kredytu zwykłemu śmiertelnikowi na miliard trzysta milionów złotych. Nie wydaje mi się by udzieliły go nawet naszemu Naczelnikowi. Potrzebne jest więc zabezpieczenie – i albo tym zabezpieczeniem jest szef banku Pekao: Michał Krupiński (który jest związany ze środowiskiem PiS), albo innym zabezpieczeniem może być intratny kontrakt z państwowym przedsiębiorstwem na następne 10-15 lat.

Oczywiście to tylko domysły, bo istnieje legalniejsze źródło zabezpieczenia – same grunty na których miały by one powstać. Według Gazety Prawnej wartość gruntów nad którymi pieczę sprawia spółka Srebrna wynosi 7,8 miliona złotych. Jeśli wrzucimy to w kalkulator (7,8 miliona / 1300 milionów) * 100 = 0.6 % = 6 ‰. Coś mi się nie wydaje że jakikolwiek bank chciałby żyrować inwestycję mając zabezpieczenie które nie pokrywa nawet jednego procenta kwoty pożyczki. Znów jednak, to tylko moje domysły.

Gdzie jest więc problem? Mamy sytuacje, gdzie zwykły poseł – nie pełniący żadnej funkcji rządowej – potrafi załatwić – w publicznym banku – kredyt dla spółki której (jak wiemy z jego oświadczenia majątkowego) nie reprezentuje.

Szemrane interesy… Ale czy nielegalne? Nie wiem. Wydaje mi się tylko że niektóre organy państwowe powinny się temu przyjrzeć.

Ostatnim klockiem tej układanki jest austriacki biznesmen Gerald Birgfellner, mąż córki kuzyna Kaczyńskiego. Był on odpowiedzialny za przygotowanie inwestycji z wieżami K-Tower. Cały proceder opisuje Galopujący Major.

Koniec końców, okazało się że pan Gerald wykonywał pracę na tak zwaną gębę – czyli bez umowy. Bez umowy z Naczelnikiem. Bez umowy ze spółką Srebrna. I gdy okazało się że inwestycja jest zawieszona, to Austriak nie dostał wynagrodzenia za swoją pracę. Clou tych taśm jest rozmowa między nim a Jarosławem Kaczyńskim o tym jak wyciągnąć ze spółki Srebrna pieniądze – bo ze spółki nie da się tak łatwo wyciągnąć pieniędzy.

W tych taśmach mamy przypadki szemranych interesów, do którym organy państwowe powinny się przyjrzeć, dlaczego więc za tą aferą nie idzie żadne większe oburzenie społeczne?

Jednym z argumentów może być to co powiedział Rafał Otoka-Frąckiewicz w debacie, że był to „materiał który nagle spadł im [wyborczej] na głowę. Czyli fanatyzm Gazety Wyborczej zwyciężył nad dziennikarskim warsztatem który by sugerował zapoznanie się z wszystkimi materiałami by zobaczyć czy coś w nich jest.

Według mnie, najważniejszym kryterium był brak przekazu dla „zwykłego Polaka” – osoby która nie jest zainteresowana polityką, a jedyne co może powiedzieć to że wszyscy politycy kradną.

Spójrzmy na Taśmy Prawdy, które były jedna składową klęski Platformy: Ich przekaz można było podzielić na dwie części:

  1. „Ośmiorniczki” – czyli te skurwysyny wydają tysiące złotych na obiady

  2. Pozwolenie NBP na dodrukowywanie pieniędzy, gdzie konstytucja zabrania dodrukowywania sobie ot tak pieniędzy.

Drugą rzeczą była sama skala kwot – tysiąc złotych łatwiej jest człowiekowi sobie wyobrazić niż miliard trzysta milionów. Więc łatwiej jest człowiekowi być zdenerwowanym gdy politycy są przypisani do mniejszych kwot, niż większych.

I to jest powód dla którego Ja uważam, że cała ta afera ominie PiS, a nawet – przy pomyślnym propagandowym materiale TVP – może nawet ją wzmocnić.

November 04 2018

psychob
16:54
9821 b69b 500
Reposted byvideogameshardkorweySoulPLliveattherainbowkalesorpwgmassivejackbloodrainbow
16:14

deltarune

Parę dni temu twórca gry Undertale wypuścił demo swojego nowego projektu pod tytułem deltarune. I tak samo jak w poprzedniczce, warto te demo przejść bez wiedzy co się w nim konkretnie znajduje.

Deltarune jest kontynuacją – jeśli można użyć tego słowa – gry Undertale. Świadczy o tym – oprócz autora – ten sam styl graficzny, bardzo dobra muzyka jak i bohaterowie. I jak gra się w to demo, to czuć że jest to mniejsze i krótsze Undertale.

Gra opowiada historię Krisa, chłopca albo dziewczyny – gra tego nigdy nie specyfikuje – który mieszka w miasteczku potworów. Kris jedzie ze swoją matką – którą jest Toriel – do szkoły. Po krótkiej serii zdarzeń jest on/ona/ono przeteleportowany do Mrocznego Świata (Dark World) razem ze swoją koleżanką Susie.

W tym momencie gra najbardziej zaczyna przypominać Undertale, gdy jesteśmy dzieckiem które znalazło w nowym nieznanym świecie, spotykamy dziwne stworzenia i od naszych decyzji zależy co się z tym światem stanie. Mamy nawet podobną historię świata, gdzie świat jest podzielony na Rozjaśniaczy (Lightners) i Zaciemniaczy (Darkners) którzy żyli w zgodzie ale jeśli balans między nimi byłby zachwiany to świat czeka zagłada, i to właśnie Ty jesteś jednym z trójki bohaterów która ma przywrócić porządek i balans na świecie.

Rozgrywka została rozbudowana w stosunku do poprzedniczki, dlatego że w grze mamy teraz wielu bohaterów w drużynie, w walce można nimi sterować jak i można łączyć ataki dwóch lub więcej postaci. Poza walką mamy zagadki które w jakimś stopniu wykorzystują wielu członków drużyny, ale jest to raczej otarcie się o potencjał niż wykorzystanie go.

Z technicznych rzeczy nie podoba mi się w jaki sposób jest zaimplementowana obsługa kontrolera, dlatego że o ile sterowanie działa tak jak oczekujemy to przyciski potwierdzenia i anulowania są odwrócone (A i B na kontrolerze XBONEa) – można to oczywiście zmienić ale dlatego per save? Oprócz tego jest jeszcze przycisk do wyboru menu i do specjalnych akcji podczas walki. Tylko nieintuicyjnie te dwie wymienione rzeczy są przypisane pod jeden przycisk.

Trudno oczywiście po demie oceniać całą produkcję, gdzie mamy dostęp tylko do pierwszego rozdziału z nie wiadomo ilu. Ale pierwsze wrażenia demo pozostawiło bardzo dobre. Tutaj jednak pojawia się kropla dziegciu w tej beczce – nie, w tym kuflu miodu.

Autor na twitterze napisał że to nie jest część gotowego produktu, dlatego że finalny produkt jeszcze nie powstał i nie wiadomo kiedy powstanie. Oprócz tego nie będzie w grze wielu zakończeń (chociaż tutaj może się to odnosić do dema), które były jednak jedną z mocniejszych cech Undertale – bo w zależności co zrobiłeś to świat reagował na to.

Koniec końców, mi osobiście deltarune przypadło do gustu i z chęcią zagram w gotowy produkt – nieważne kiedy zostanie wydany. I jeśli czytelniku masz 3 godziny wolnego czasu które są potrzebne na skończenie gry to polecam zagranie w nią. A jeśli Ci się spodoba to jest w demie nawet ukryty boss.

September 23 2018

13:09

Killzone 2

Nie potrafiłem się zebrać na napisanie tego wpisu. Częściowo świadczy to o mnie (jako że nie było tutaj żadnego wpisu od 4 lat), a częściowo o grze o której chce napisać czyli o Killzone 2. Jest to ekskluzywny – dla konsoli PlayStation 3 – first person shooter stworzony przez Guerilla Games. I po przejściu jej całej mogę ją podsumować słowem: meh. Ale od początku:

Gra rozpoczyna się filmikiem w angielskiej wersji z polskimi napisami, co może sugerować że jest spolszczona kinowo, ale jest to kłamstwo, bo jak odpalimy już samą grę to usłyszymy polski dubbing, którego nie można zmienić! Można oczywiście usunąć zapisany stan gry i zmienić język, ale na przykład nie można grać z angielskimi głosami i polskimi napisami.

Nie jest to w interesie gry by oceniać ją przez pryzmat polskiego dubbingu, dlatego że on kłuje w uszy. Pominę standardowy problem polskich dubbingów, gdzie aktor musi dostosować się do angielskiej wersji, bo jak wszyscy wiemy słowa tłumaczą się jeden do jednego. Wypowiadane kwestie bez emocji, albo jakby były wypowiadane w próżni; głosy niepasujące do postaci – tutaj najbardziej winne jest intro które pokazuje angielski dubbing, chociaż z drugiej strony to nigdy nie potrafiłbym sobie wyobrazić polaków w klimacie sci-fi więc to też może dlatego.

Ale tutaj chyba też są winne tłumaczenie i implementacja, bo jak wytłumaczyć kwestię: Gdzie jesteś? / Jestem zajęty – która jest wypowiadana przez jedną i tą samą postać? Albo jak inna postać pyta ze stoickim spokojem czy nie zechciałbym kontynuować gry, podczas gdy wrogowie ciągle do nas strzelają. Albo dlaczego jeden z towarzyszy zwraca się do mnie w liczbie mnogiej mimo że ta gra nie posiada trybu kooperacyjnego?

Nie chce się jednak pastwić nad dubbingiem, bo mi osobiście zawsze gry plusowały tym że posiadały pełną polską wersję językową – nieważne jak złą. Szczególnie że mogę ponarzekać na rozgrywkę:

Gra jest reprezentantem podgatunku gier FPS który ja nazywam military shooter, do którego można dodać słowo brown dlatego że została stworzona w czasie gdy twórcy byli zafascynowani kolorem i odcieniami brązu. Ten konkretny podgatunek wymaga byśmy grali super żołnierzem (najczęściej z limitem dwóch broni) przeciwko wrogo nastawionym żołnierzom z różnym ekwipunkiem. Jako że tego typu gry są zazwyczaj nudne – bo rozgrywka po prostu nie ewoluuje – to należy oddzielić kolejne misje różnymi kinowymi wstawkami.

Tutaj nie jestem jednak uczciwy, bo gra przynajmniej stara się jakoś zróżnicować rozgrywkę: od czasu do czasu walczymy z większym żołnierzem – któremu należy strzelać w plecy – czy radioaktywnym pająkiem. Mamy też walki z bossami, sekcje w której strzelamy do samolotów i sekcje w której chodzimy w pancerzu wspomaganym itp.

Do dyspozycji – przez większość gry – mamy standardowy zestaw broni: pistolet, karabin, shotgun i ewentualnie bazookę. Powinienem chyba napisać że do dyspozycji mamy wielki pistolet, itd, dlatego że z jakiegoś powodu zajmują ¼ ekranu. Tutaj winne może być to że FOV (field of vision) jest bardzo niskie. Może na telewizorze wyglądało by to lepiej, ale na moim zwykłym monitorze zakres widzenia był mały a bronie ogromne.

Warto też wspomnieć że system auto-zapisów zapisywał w dziwnych miejscach. Ale to jest już czepianie się szczegółów. Bo o ile w paru miejscach miejsce zapisu wydawało mi się dziwne, to nigdy mnie to mocno nie irytowało.

Zanim napisze coś o sterowaniu, chciałbym zwrócić uwagę że jest to moja pierwsza konsolowa gra w którą gram. Nigdy nie miałem konsoli, a na jakimkolwiek padzie zacząłem grać niewiele wcześniej. Mając to w głowie:

Nie rozumiem dlaczego strzelanie na padzie jest przypisane do prawego przycisku (RB) zamiast do prawego triggera (RT). Nie było to wygodne, i trudno mi było się przestawić gdy grałem w Red Dead Redemption.

Nie rozumiem też dlaczego mamy specjalną akcje przypisaną do lewego triggera która powoduje że przyklejamy się do najbliższej ściany. Kompletnie nie rozumiem tej mechaniki – może dlatego że nie była mi ona potrzeba w żadnym z FPSów w które grałem. Nie piszę tutaj o tym że z tej mechaniki nie korzystałem, bo w grze w której większość przeciwników ma bronie typu hitscan możliwość przyklejenia się do ściany by po chwili organy wróciły na swoje miejsce jest przydatna. Tylko nie rozumiem dlaczego potrzebujemy specjalnego przycisku na padzie który ogłosi wszem i wobec miłość bohatera do ścian.

Dowiedziałem się też w trakcie grania że pad posiada w sobie żyroskop który gra wcisnęła na siłę do rozgrywki. I wiem że jest to zrobione na siłę, bo możemy z niego skorzystać do odkręcania/zakręcania zaworów i do ustawiania bomb – gdzie zrobimy to maksymalnie raz na misje. Wymaga to podniesienia pada, naciśnięcia przycisków LB i RB i potem przekręcenia pada w odpowiednią stronę, co dla mnie jest irytujące; bo nie po to usadowiłem się wygodnie na fotelu i umieściłem pada w odpowiednim miejscu by później musieć zmieniać pozycje bo gra przypomniała sobie że Sony umieściło żyroskop w padzie.

Kolejną rzeczą w której wykorzystywany jest żyroskop są ekrany ładowania, gdzie widzimy prostą scenę w 3D i w zależności jak odwrócimy pada to scena też lekko się odwróci. A skoro jesteśmy już przy ekranach ładowania to należy wspomnieć że są zbyt długie. Może irytuje mnie to dlatego że na moim laptopie gry w które grałem zawsze ładowały się w parę sekund, a tutaj liczyło się to w minutach.

Ale nie powinienem chyba narzekać że gra sprzed 10 lat na konsoli która ma 14 nie spełnia wymagań z 2018 roku. Dlatego ponarzekam na to na co mogę, czyli na fabułę.

Gra opowiada o konflikcie ISA z Imperium Helghanu, to jestem w stanie stwierdzić na pewno, dlatego że gramy tutaj żołnierzem ISA który ciągle strzela do Helghastów. Motywację jaką mamy do tego by ich nie lubić jest Standardowa Motywacja ze Strzelanek™: Strzelają do nas. Co jeśli się nad tym zastanowić, jest dość słabą motywacją.

Oczywiście sami Helghanie są wzorowani na nazistach, od hełmów, przez świecąco na czerwono oczy po zamiłowanie do wyprasowanych mundurów. Tylko mi trudno przełożyć nienawiść która dotyczy nazistów na rasę której nie znam. Tak, strzelają do mnie, ale należy pamiętać że to ISA atakuję główną planetę Imperium. Trudno oczekiwać że nie będą bronili swojej ziemi przed agresorem.

Ignorując to że gra chce byśmy nienawidzili odmieńców, przejdźmy do bohaterów których – razem z graczem – jest 5. Po przejściu całej gry jedyne co mogę o nich napisać że są super żołnierzami. Nie otrzymali żadnej charakteryzacji, jeden z nich nawet ginie w trakcie – bo jak wiadomo 5 bohaterów to za dużo – ale trudno mi było przejąć się tym gdy jedyne co o nim wiedziałem to to że jest super żołnierzem.

W grze która stawia na rozgrywkę, przydał by się jakiś inny kanał którym gracz dostawał by informacje o świecie i kontekst dlaczego to się wszystko dzieje. W killzonie nie ma niczego takiego, z wszystkich scen jest jedna która sugeruje że nasi przeciwnicy nie należą do najmilszych – chodzi o wcześniej wymienione zamiłowanie do wyprasowanych mundurów – ale jest to tylko jedna scena.

Mamy w grze system znajdziek – emblematy i dane wywiadowcze, ale żadne z nich nie służy rozgrywce ani historii. Przydała by się tutaj jakaś wewnętrzna encyklopedia która by przypomniała dlaczego Helghanie są źli i dlaczego ISA jest taka zajebista. I o ile osiągnięcie za zniszczenie emblematów i zebranie danych nie szkodzi, to taka nagroda istnieje kompletnie poza grą.

Podsumowując nie polecił bym tej gry ze względu na opowiedzianą w niej historię, jeśli chodzi zaś o rozgrywkę, to jest ona funkcjonalna, kompetentnie wykonana. Ja sam przeszedłem tę grę tylko i wyłącznie dlatego że PS3 leżała odłogiem przez miesiąc i wypadało by wreszcie w coś na niej zagrać. Więc jeśli ktoś z przyszłości zastanawia się warto zagrać w Killzone 2, to moja rekomendacja jest taka: tylko jeśli nie masz nic lepszego do roboty.

April 14 2018

psychob
18:08
9234 3064 500
Reposted fromczinok czinok viaresocjalizator resocjalizator
psychob
18:07
6611 bf33 500
Reposted bylolufop856renananodifference

April 12 2018

psychob
18:12
Reposted fromFlau Flau viaoll oll
Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.

Don't be the product, buy the product!

Schweinderl