Migracja bloga

W związku z powolnym procesem rezygnowania z usług Gitlaba, kod źródłowy tego bloga został przeniesiony. Teraz jest dostępny na serwerze git.mgoral.org.

Published on February 9, 2017 and tagged as .

Singleton w i3

Terminal jest jedną z tych aplikacji, które uruchamiam bardzo często, jednak chcę tak naprawdę mieć tylko jedną jego instancję, do której przeniosę się niezależnie od tego, gdzie się znajduję. Na podobnej zasadzie działają “wysuwane” konsole (inspirowane konsolą Quake’a), np. Guake czy tilda. Jak osiągnąć podobny efekt w i3?

More

Argument Dependent Lookup

Z racji tego, że czas na cokolwiek ostatnio mam jedynie wtedy gdy mój fork jest w trakcie wywoływania funkcji sleep, a wszystkie jego syscalle zdają się przechodzić przeze mnie, a nie przez kernel (dziwne, bo nie przypominam sobie, żebym w celach debugowych wywoływał na nim ptrace), muszę dość mocno ograniczyć zakres i objętość artykułów. Dlatego tym razem postaram się w paru żółnierskich słowach wytłumaczyć czym w C++ jest Argument Dependent Lookup. Nie chcę przy tym powiedzieć, że temat ADL jest prosty (nie jest) i łatwy do zrozumienia i zapamiętania (również nie jest), ale samą ideę można według mnie wytłumaczyć w dość prosty sposób.

More

Structured Bindings

Podczas ostatniego spotkania komitetu standaryzacyjnego w Oulu, do najnowszej wersji standardu zatwierdzono między innymi, tzw. structured bindings, czyli nowy sposób dekomponowania wartości:

auto [x, y, z] = f();

Powyższe jest równoważne następującemu wywołaniu std::tie:

T1 x; T2 y; T3 z;
std::tie(x,y,z) = f();

More

Generacja wersji

Wiele projektów open-source’owych wersjonuje się poprzez ustawienie na stałe w jakimś pliku (config.h, __version__.py, …) numerka, który jest podbijany przy okazji wydania nowej wersji. Nie podoba mi się takie podejście. Przede wszystkim zbędnie zaśmieca historię commitami mającymi niewiele wspólnego z faktycznymi zmianami w logice kodu. Poza tym nie dostarcza wystarczającej informacji o używanej wersji, która jest niezbędna np. przy zgłaszaniu błędów - jest to szczególnie uciążliwe gdy program wydawany jest stosunkowo rzadko.

More
Published on April 12, 2016 and tagged as .

Hugo

Jekyll był jedynie pierwszym krokiem w pięknym świecie generatorów stron statycznych. Kilka dni temu rozpocząłem proces zamiany go na, moim zdaniem, lepszy model: Hugo.

More
Published on March 3, 2016 and tagged as .

Opisuj merge!

Changelog jest ważny. Changelog jest liniowy. Historia gita nie jest liniowa, ale może być dzięki przełącznikow git log --first-parent. Dzięki niemu nie zobaczymy wszystkich malutkich commitów wrzucanych na merge’owanego brancha, a jedynie sam merge commit. Dlatego właśnie ważne jest, żeby opisywać w nim ogół wprowadzanych zmian, a nie zostawiać jedynie standardowe “Merge branch ‘feat’ into ‘master’“. Bardzo to ułatwia późniejsze generowanie changeloga. Przykładowo, mój najnowszy wynalazek pokaże i ładnie sformatuje opis wszystkich zmian wprowadzonych od czasu ostatniego taga: More
Published on December 18, 2015 and tagged as .

Sforkowałem proces

$ man 2 fork

FORK(2)               Linux Programmer's Manual                 FORK(2)

NAME

fork - create a child process

SYNOPSIS

#include <unistd.h>

pid_t fork(void);

DESCRIPTION

fork()  creates  a  new process by  duplicating  the  calling  process.
The new process, referred to as the child, is an exact duplicate of the
calling process, referred to as the parent (...)

RETURN VALUE

On success, the PID of the child process is returned in the parent, and
0 is returned in the child. (...)

NOTES

Under  Linux,  fork()  is implemented using copy-on-write pages, so the
only penalty  that  it incurs is the time and memory required to dupli-
cate  the parent's page tables,  and  to create a unique task structure
for the child.

Sforkowany proces zwrócił PID 201607, poniżej przedstawiam wydruk z ps:

More
Published on December 16, 2015.

Deployment aplikacji internetowych

Zamiast przydługiego wstępu przejdę od razu do meritum. Dzięki webhookom jesteśmy w stanie wykonywać w prosty i przyjemny sposób automatyczny deployment aplikacji internetowych na serwery produkcyjne. Są wprawdzie możliwe inne metody, ale nie zawsze są one możliwe bądź stosowne do zaimplementowania. Tylko webhooki nas zadowolą, a i to nie wszystkie. Przyjrzyjmy się im zatem.

More

Tworzenie list w Pythonie

W Pythonie listy możemy utworzyć na kilka sposobów: używając nawiasów kwadratowych [] lub konstruktora list(). Jeśli z tyłu głowy mamy sposób działania nawiasów kwadratowych, użycie konstruktora może prowadzić do poważnych błędów. Spodziewać by się bowiem można, że poniższe dwa wywołania zwrócą to samo: >>> s = "element_listy" >>> l1 = [s] >>> l2 = list(s) Nic bardziej mylnego… >>> print(l1) ['element_listy'] >>> print(l2) ['e', 'l', 'e', 'm', 'e', 'n', 't', '_', 'l', 'i', 's', 't', 'y'] Warto pamiętać, że list() przyjmuje obiekt, po którym się iteruje, umieszczając w liście jego kolejne elementy. More