Aplikacja na pełnym ekranie której nie da się przywrócić

Taki problem miałem na Ubuntu Mate przy aplikacji Spotify. Z jakiegoś powodu aplikacja po obudzeniu laptopa postanowiła być odpalona na pełnym ekranie.

Funkcje otwarcia na pełnym ekranie posiada samo spotify (aktywować można ją w prawym dolnym rogu), ale nie było to to. Po pierwsze, dlatego że widok okna się nie zmienił (wyglądało ono tak samo jak na zdjęciu wyżej), a po drugie nie dało się tego wyłączyć przy pomocy przycisku ESC.

Dlaczego coś takiego się działo? Błąd w systemie, środowisku graficznym czy możne nawet samym spotify (sprawdzając w sieci nie byłem odosobniony z takim błędem). Z perspektywy czasu usunięcie skrótu klawiszowego – który zmieniał tryb okna – pomogło i takie błędy się mi nie pojawiają. Nie wiem jednak dlaczego ten skrót był aktywowany. Na pewno nie naciskałem go świadomie.

Ale jak to można wyłączyć oprócz restartu komputera czy ubicia samej aplikacji? Z pomocą przychodzi terminalowy program: wmctrl. Najpierw musimy pobrać tytuł okna (jeśli go znamy to można ten krok pominąć):

wmctrl -l

U mnie wynik działania tego programu wyglądał tak:

psychob@rgb-lighthouse#192.168.0.24!13:41:40
$ ~ wmctrl -l
0x01200003 -1 rgb-lighthouse Górny panel
0x01200017 -1 rgb-lighthouse Dolny panel
0x01600006 -1 rgb-lighthouse x-caja-desktop
0x04600003  0 rgb-lighthouse Mozilla Firefox
0x0500000b  0 rgb-lighthouse Urządzenia Bluetooth
0x05400007  1 rgb-lighthouse psychob@rgb-lighthouse: ~
0x07600001  5 rgb-lighthouse P.O.D. - Roots in Stereo
0x08200059  0            N/A KeePass
0x04600191  0 rgb-lighthouse Monitoring server-side ECS application with Prometheus and Grafana (see post) : gamedev - Mozilla Firefox
0x0460030c  3 rgb-lighthouse Mozilla Firefox
0x03800007  5 rgb-lighthouse Terminal
0x04800008  4 rgb-lighthouse Skróty klawiszowe

U mnie spotify aktualnie nazywa się: P.O.D. - Roots in Stereo. By zmienić tryb wyświetlania okna należy wykonać następujące polecenie, przy czym nie musimy wpisywać całej nazwy, na przykład:

wmctrl -r "P.O.D" -b toggle,fullscreen

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ę:

Czytaj dalej »

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

Walka z Ubuntu

Słowo ‚Walka’, dobrze opisuje to co trzeba robić by sprawić by ten system i aplikacje do niego dołączone były, może nie dostosowane (o czym ja marzę), ale sprawnie działały.

Na co dzień, normalnie korzystam z aplikacji Open Source. Jest to związane z moim przyzwyczajeniem do nich, z tym że nie stać mnie na kupno „wychwalanej pod niebiosa” komercyjnej alternatywy i na końcu dlatego że aplikacje typu Open Source są często lepsze niż ich zamknięte alternatywy (np: Kadu jest o niebiosa lepsze niż Gadu Gadu, choćby ze względu na to że nie ma reklam).

Problemem jednak z przejściem z wersji Windowsowych na wersje Linuksową jest historia i ewolucja tych systemów. Przykładem może być to że w Serwerze X – czyli w graficznym interfejsie użytkownika – domyślną akcją przypisaną pod środkowy przycisk myszy jest: wklejanie tekstu znalezionego w schowku. Wygodne co nie? Szczególnie gdy pisze się tekst na bloga i nie wie się, że za każdym razem gdy przewija się tekst w górę czy to w dół – dodaje nam się cokolwiek mieliśmy w schowku.

Zresztą o Firefoxie na Ubuntu można by napisać więcej. Np, podczas instalacji miałem opcje by zaimportować moje dokumenty/opcje itp do Ubuntu. Jako, że mi mój katalog Moje Dokumenty nie jest potrzebny w dwóch kopiach, postanowiłem zaimportować tylko ustawienia Firefoxa. I po instalacji się okazało że nic się nie zaimportowało. Well done Canonical.

Chciałem mieć moje ustawienia jednak zaimportowane więc postanowiłem skorzystać z wynalazku Mozilli, który nazywa się: Firefox Sync. Z lekką obawą zastanawiałem się czy uda mi się wysłać na serwery Mozilli cały mój katalog z profilem firefoxa który zajmuje grubo ponad pół gigabajta. Jednak udało się Mozilli zmieścić to wszystko w zaledwie dwóch megabajtach – brawo.

Gdy jednak zacząłem synchronizować mój profil linuksowy z zapisanym profilem windowsowym, okazało się że nie wszystkie dane się zsynchronizowały. Brakowało wszystkich ustawień dodatków – naprawdę jeśli synchronizujemy dodatki, to wypada zsynchronizować też ich opcje – jak i nie wiem dlaczego niektóre z opcji które sobie ustawiłem na Windowsie nie dotarły one na Linuksa, albo zostały nadpisane przez domyślnie ustawienia. Ja się pytam dlaczego? Jeśli już w Firefoxie jest coś takiego jak about:config, to chyba należy zsynchronizować wszystkie jego wartości, bo chyba Ja tak je ustawiłem. Po co mi synchronizacja, która nie synchronizuje ustawień przeglądarki pomiędzy systemami operacyjnymi?

Zostawmy jednak Firefoxa, przejdźmy do samego interfejsu systemu. Można go podsumować dwoma wyrazami: Unity ssie. Można też dodać że bardzo. Nie jest to kompletna porażka jak lolmetro na Windowsie 8, ale nie jest to coś z czego bym chciał korzystać na co dzień.

Co mi tutaj nie pasuje? Po pierwsze pasek menu aplikacji który wzorem idiotycznego UI MacOsa został przeniesiony na stałe na górę ekranu. Prócz paska menu został tam przeniesiony także pasek tytułowy, jednak by nie marnować miejsca został on przeniesiony w to samo miejsce gdzie jest teraz pasek menu aplikacji. I możecie mi zaufać nie jest to wygodne rozwiązanie.

Unity pasek menu

Bardzo ciekawie to wygląda gdy mamy więcej okien na pulpicie, bo wtedy pasek menu/pasek tytułu jest tylko dla tego które jest aktualnie aktywne. Ciekawie więc wygląda to w GIMPie, w którym jeśli aktywne jest jedno z jego miliarda okien – i nie jest to okno główne – to na górze pojawi nam się tylko tytuł tego małego okna.

To wymuszanie by aplikacje miały pasek menu/pasek z tytułem na samej górze ekranu jest o tyle dziwne, że np: programy pisane w Javie, czy przy pomocy biblioteki Qt (które same sobie rysują interfejs) i tak będą miały pasek menu w normalnym miejscu.

Innym problemem z Unity jest konfiguracja – jeśli myślisz że znajdziesz konfiguracje unity w Ubuntowskim panelu sterowania, to jesteś w błędzie. By dostać się do opcji środowiska Unity, należy wpisać ccsm. Dopiero wtedy dostaniemy możliwość trochę lepszego dostosowania interfejsu do siebie.

Znajdują się tam tak zaawansowane opcje jak np: Zmiana skrótów klawiszowych, dodanie nowych wirtualnych pulpitów itp.

Pisząc o Linuksie nie można nie wspomnieć linii poleceń, która jest tutaj o niebo lepsza niż ta z Windowsa. Wszystko co można zrobić w interfejsie graficznym, przez różnego rodzaje aplikacje graficzne, można też zrobić przez linie poleceń. Najczęściej też można zrobić to szybciej niż wyklikując sobie drogę.

I mówiąc szczerze, jeśli ktoś chce wykorzystywać potęgę Linuksa, będzie musiał zaprzyjaźnić się z tym narzędziem. Bo wiele czynności będzie można wtedy wykonać szybciej. Dla przykładu jak szybko na Linuksie, używając „Centrum Oprogramowania Ubuntu”, można zainstalować serwer apache+php+mysql. W linii poleceń można wklepać jedną linijkę:

sudo apt-get install apache2 php5 libapache2-mod-php5 mysql-server libapache2-mod-auth-mysql php5-mysql

Co jest IMO wygodniejsze niż znajdywanie wszystkiego po kolei w Centrum Oprogramowania i klikania Instaluj. Jednym z minusów takiego rozwiązania jest jednak to, że należy znać nazwę poprawnego pakietu i dany pakiet musi istnieć w repozytorium. Dla przykładu najnowszej Javy tam nie znajdziecie – ale dobrze że są inne sposoby.

Repozytoria z oprogramowaniem to jest jedna z tych rzeczy których użytkownik Windowsów może zazdrościć użytkownikom Linuksów. Dlaczego? Bo dostają gratis: aktualizacje wbudowane w system, zależności między aplikacjami – czyli jeśli aplikacja A, potrzebuje aplikacji B to podczas instalacji aplikacji A zostaną one zainstalowane obie. Coś podobnego ma – chyba – wprowadzić Windows Store który będzie wybudowany w Windows 8.

Z tym całym systemem pojawia się pewna niedogodność, co się stanie jeśli zainstalujemy nowy program nie poprzez system pakietów, ale np: poprzez rozpakowanie archiwum, na przykład w repozytoriach Ubuntu nie ma aktualnej wersji Netbeansa (w repozytorium jest 7.0.1, a najnowsza to 7.2). By zainstalować jego najnowszą wersje, trzeba ściągnąć go ze strony projektu. Powoduje to, że wszystkie potrzebne zależności (w tym przykładzie Netbeans potrzebuje mieć Javę) musimy MY zainstalować.

Ale też można założyć taką sytuacje: instalujemy pakiet A, który jako swoje zależności instaluje pakiet B. Gdy teraz zainstalujemy nie poprzez mechanizm pakietów nowy program, który potrzebuje do działania pakiet B, to dopóki pakiet A jest zainstalowany – nowy program będzie działać. Jeśli jednak usuniemy pakiet A, to program do zarządzania pakietami sprawdzi że żaden inny program nie potrzebuje już pakietu B i usunie go.

Nie jest to oczywiście błąd samego Linuksa, tylko autora programu który źle rozprowadza swoją aplikację. Taka sytuacja też nie powinna się zdarzyć jeśli wszystko będziemy instalować z repozytoriów.

Kolejnym plusem systemu jest też możliwość korzystania z wielu pulpitów. Jest to chyba jedna z bardziej rozpoznawalnych funkcjonalności Linuksa. Możliwość trzymania wszystkich aplikacji nie na jednym pulpicie tylko na kilku. IMO bardzo wygodne rozwiązanie. Bo nie trzeba szukać gdzie mamy jakąś aplikację, tylko wiemy że dla Firefoxa jest przeznaczony środkowy pulpit.

Minusem jest tutaj podstawowa konfiguracja Unity, dzięki której przy pomocy ALT+TAB można przełączać się tylko do programów na aktualnym pulpicie. Nie wiem też czy jest (może ta opcja jest ukryta), czy można wymusić by dana aplikacja zawsze była uruchamiana na konkretnym pulpicie? Ja niestety takiej opcji nie znalazłem. A wydaje mi się że GNOME coś takiego miał.

To tyle jeśli chodzi o walkę, następny wpis najprawdopodobniej będzie mówił coś o konfiguracji Ubuntu.

Walka z Ubuntu – instalacja i konfiguracja

Jak się pewnie niektórzy domyślają, nadchodzą mroczne czasy dla właścicieli PCtów. Jednym z sygnałów, jest nowa wersja systemu operacyjnego Windows o numerze 8. Można by się spytać, dlaczego jest to zwiastun zarazy? Jest nimi parę rzeczy, po pierwsze nowy interfejs który ma w przyszłych wersjach zastąpić standardowy pulpit, Metro. Po drugie, jest nim integracja z chmurą (microsoftową) – pomyślcie, by skorzystać ze swojego peceta, musicie zalogować się do chmury. Ale o tym będzie w niedalekiej przyszłości, kiedy to najnowsze dziecko Microsoftu pojawi się w repozytorium MSDN AA politechniki.

Co ma to do Ubuntu? Ma to jedną zasadniczą część wspólną. Gdy już nie będzie odwrotu, gdy już starsze Windowsy nie będą obsługiwane (bo sterowniki itp). Warto będzie mieć drogę ucieczki w inny system operacyjny. Bo o ile w opowieściach, wędrówka w nieznaną może być interesująca, to jeśli chodzi o komputery – to może nie być już takie fascynujące.

Jako swoją dystrybucje, którą będę teraz męczyć, wybrałem Ubuntu, którego mottem jest: „Linux for human beings„, czyli Linuks dla ludzi. Wybrałem tą dystrybucje dlatego, że jest polecana nowicjuszom (ja mam jakieś doświadczenie z Linuksem, ale nie takie by np: zainstalować Gentoo z linii poleceń), posiada ona wsparcie dużej firmy (a nie jest tworzona w garażu przez pasjonatów) i w sieci jest dużo materiałów How To. Więc jest to idealna dystrybucja dla ludzi którzy chcą poznać linuksa.
Czytaj dalej »