
No wreszcie!

Jak sobie pościelesz to mnie zawołaj
Wiem, że to tłumaczenie automatyczne, ale i tak mnie to bawi.
To fragment niezamówionej oferty handlowej, którą otrzymałem.
W PHP nie raz zachodzi potrzeba przechowywania w obiekcie tablicy obiektów określonego typu, np. w kolekcjach, managerach strategii, itp. Jeśli lista obiektów jest przekazywana w konstruktorze to warto sprawdzić czy są właściwego typu. Przykładowy konstruktor może wyglądać tak:
/** * @param Item[] $items * @throws InvalidArgumentException */ public function __construct(array $items) { foreach ($items as $item) { if (!$item instanceof Item) { throw new InvalidArgumentException('Collection accepts only instances of Item'); } } $this->items = $items; }
Ten sam efekt można osiągnąć prościej dzięki zastosowaniu operatora … (trzy kropki):
public function __construct(Item ...$items) { $this->items = $items; }
HBO ma moją uwagę. „Mroczne materie” Pullmana to, w mojej ocenie, jedna z najlepszych serii dla młodego czytelnika, zdecydowanie lepsza od chociażby „Harry’ego Pottera”. Zwiastun wygląda dobrze, oby gotowy serial mu przynajmniej dorównał. Tak wybitna literatura zasługuje na dobrą ekranizację.
Karina w ramach wolontariatu dla Mikropsów zgłasza się do robienia pokazów slajdów ukazujących metamorfozy podopiecznych fundacji. Opracowuje koncepcję, a trywialne zadanie jej zrealizowania zleca podwykonawcy w mojej osobie
Linuks nie słynie z programów do edycji filmów, ale do wykonania prostego pokazu zdjęć z muzyką nie trzeba wielkich kombajnów pokroju Adobe Premiere.
Ta wieloplatformowa aplikacja pozwala przygotować pokaz slajdów bardzo szybko i bardzo łatwo. Tak naprawdę wystarczy tylko wybrać zdjęcia i muzykę, reszta robi się sama. Film taki jak poniżej można przygotować w 30 minut, łącznie z czasem generowania pliku:
Mikropsy 2018 from karniak on Vimeo.
Na powyższym filmie widać jednak niektóre ograniczenia programu:
To już nie jest prosty kreator, a pełnoprawna aplikacja do montażu wideo. Nie ma wad 4K Slideshow Makera, bo każdy slajd można wyklikać dokładnie wedle pragnienia, ale niestety wymaga to czasu. Pokazany poniżej film składałem jakieś trzy godziny, choć trochę czasu zajęła mi nauka programu.
Mikropsy 2019 1080p from karniak on Vimeo.
Do wad programu dodam jeszcze niezbyt wydajne działanie samego edytora nawet na relatywnie mocnym sprzęcie (Ryzen 1700, 16 GB RAM, SSD NVMe).
Jednolinijkowiec na dziś:
grep -Z -r -L --include \*.php -P "strict_types=1" src/ | xargs -0 -l sed -i 's/<?php/<?php\n\ndeclare(strict_types=1);/g'
To polecenie wyszuka wszystkie pliki z rozszerzeniem php, które nie zawierają ciągu strict_types=1
, a następnie doda declare(strict_types=1);
zaraz po otwierającym znaczniku <?php
. Żeby tylko wyszukać pliki, które nie mają strict_types=1
można użyć:
grep -r -L --include \*.php -P "strict_types=1" src/
Taki automat może się przydać przy modernizacji starszej aplikacji, warto jednak mieć dobre testy, bo taka trywialna zmiana może skutecznie ją wyłożyć.
Dzisiaj zacznę odwrotnie niż zwykle czyli od prezentacji gotowego rozwiązania:
INSERT INTO user_counters (user_id, counter_type, counter_value, updated_at) VALUES (:user_id1, :counter_type1, :counter_value1, :updated_at1), (:user_id2, :counter_type2, :counter_value2, :updated_at2), # ... (:user_idN, :counter_typeN, :counter_valueN, :updated_atN) ON DUPLICATE KEY UPDATE counter_value = counter_value + VALUES(counter_value), updated_at = VALUES(updated_at);
To tak zwany UPSERT czyli zapytanie, które wstawia rekord(y) do bazy, a jeśli taki już istnieje (tzn. istnieje już taki klucz główny lub unikalny) to go zaktualizuje (wartość w kolumnie counter_value
zostanie powiększona o nową wartość, a w kolumnie updated_at
zastąpiona). To zapytanie jest jednak trochę lepsze od tych, które zazwyczaj podaje się jako przykład UPSERTA, ponieważ pozwala zapisać wiele (dziesięć, sto, tysiąc) wierszy za jednym zamachem. Sprawia to użyta w części UPDATE
funkcja VALUES()
, która pobiera wartości ze wskazanej kolumny w części INSERT
.
Po co się w ogóle tak babrać w SQL-u jak zwierzę skoro Doctrine mógłby to zrobić za nas? Akurat tego nie zrobi. Przy użyciu Doctrine należałoby:
SELECT
).INSERT
i jeden UPDATE
).Jak widać zarówno po stronie aplikacji (PHP) jak i bazy to wyraźnie więcej pracy, która i tak pewnie poszłaby na marne, bo przy kilku pracujących jednocześnie instancjach aplikacji jest spora szansa na wyjątek UniqueConstraintViolationException, który zamknie managera encji.
UPSERT z wieloma wartościami rozwiązuje problem wydajności i problem naruszania ograniczeń, ale tworzy klikna innych:
INSERT … ON DUPLICATE KEY UPDATE
nie jest częścią standardu SQL, to rozszerzenie dostępne w MySQL. W PostgrSQL jest podobny mechanizm, ale jego działanie jest nieco inne, więc może opiszę je przy innej okazji.
To uptime serwera, na którym stoi m.in. anime.com.pl i eduNagrody.pl.
Nie sądziłem, że powstanie druga część.
Z drugiej strony pierwsza część była znośna, na pewno lepsza niż można było sądzić po zwiastunie.
Książka „Co nas nie zabije” Lagercrantza była niezła, choć słabsza niż trylogia Larssona. Jej ekranizacja – „Dziewczyna w sieci pająka” – jest niestety słaba.