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

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.

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”.

Czytaj dalej »

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ć.

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.

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.