Xinput i gładzik

Jeżeli nie pracuję akurat na Gnomie, KDE, Xfce, czy innym dużym środowisku graficznym, muszę sobie samemu ustawić różne rzeczy, między innymi touchpad. Zależy mi na dwóch rzeczach: klikaniu przez dotyk oraz „naturalnym przewijaniu”, czyli imitowaniu zachowania dotykowego ekranu.

Od kilku lat w Linuksie mamy libinput, czyli następcę Synaptics. Konfiguruje się go całkiem prosto. Najpierw sprawdzam numery dostępnych urządzeń:

$ xinput --list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                	id=12	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=9	[slave  keyboard (3)]
    ↳ HD WebCam                               	id=10	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=11	[slave  keyboard (3)]
    ↳ Acer WMI hotkeys                        	id=13	[slave  keyboard (3)]

i na tej liście widać, że gładzik dostał id 12. Jest to ważne, gdyż do konfiguracji urządzenia podaje się jego numer. Następnie można sprawdzić, co dokładnie można skonfigurować:

$ xinput list-props 12
Device 'ETPS/2 Elantech Touchpad':
	Device Enabled (147):	1
	Coordinate Transformation Matrix (149):	1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
	libinput Tapping Enabled (284):	1
	libinput Tapping Enabled Default (285):	0
	libinput Tapping Drag Enabled (286):	1
	libinput Tapping Drag Enabled Default (287):	1
	libinput Tapping Drag Lock Enabled (288):	0
	libinput Tapping Drag Lock Enabled Default (289):	0
	libinput Tapping Button Mapping Enabled (290):	1, 0
	libinput Tapping Button Mapping Default (291):	1, 0
	libinput Accel Speed (292):	0.000000
	libinput Accel Speed Default (293):	0.000000
	libinput Natural Scrolling Enabled (294):	1
	libinput Natural Scrolling Enabled Default (295):	0
	libinput Send Events Modes Available (269):	1, 1
	libinput Send Events Mode Enabled (270):	0, 0
	libinput Send Events Mode Enabled Default (271):	0, 0
	libinput Left Handed Enabled (296):	0
	libinput Left Handed Enabled Default (297):	0
	libinput Scroll Methods Available (298):	1, 1, 0
	libinput Scroll Method Enabled (299):	1, 0, 0
	libinput Scroll Method Enabled Default (300):	1, 0, 0
	libinput Disable While Typing Enabled (301):	1
	libinput Disable While Typing Enabled Default (302):	1
	Device Node (272):	"/dev/input/event5"
	Device Product ID (273):	2, 14
	libinput Drag Lock Buttons (303):	
	libinput Horizontal Scroll Enabled (304):	1

Jak widać, całkiem sporo. Jak napisałem, interesują mnie dwie rzeczy: dotyk oraz naturalne przewijanie. Na powyższej liście widać, że są to opcje numer 284 oraz 294. Do roboty:

$ xinput set-prop 12 284 1
$ xinput set-prop 12 294 1

Gotowe. Skoro to takie proste, to gdzie jest haczyk? Ano jest taki, że te numery opcji od czasu do czasu się zmieniają. Po każdej aktualizacji libnput czasem trzeba je przejrzeć i ustawić ponownie.
W każdym razie jest to kolejny krok do odstawienia dużych kobył i wygodnej pracy w jakikolwiek środowisku graficznym.

Bottle.py (1)

Pomyślałem sobie, że napiszę o Bottle i o tym, jak zwyczajnie ułatwia życie. Niewiele programów zostało napisanych z myślą o ułatwianiu życia, ale mamy szczęśliwie kilka wyjątków.

Czym się różni wróbelek? Tym, że ma jedną nóżkę bardziej.

W Pythonie frameworki webowe piszą się same. Ludzie tworzą ich pełno, czasem nawet do najbardziej trywialnych zastosowań, jak na przykład tylko i wyłącznie do wysyłania plików na serwer. Pierwszy raz zainteresowałem się nimi bardziej dzięki prelekcji https://www.youtube.com/watch?v=AYjPIMe0BhA. O niektórych z nich wiedziałem, ale kilka było nowością.

Co było ważne dla mnie? Tylko kilka rzeczy:

  • prostota instalacji i minimalna ilość zależności,
  • swoboda kodzenia bez konieczności tworzenia wielu plików i katalogów,
  • musi działać idealnie w Pythonie 3,
  • dokumentacja w archiwum do ściągnięcia, najlepiej w pdf (najczęściej pracuję bez dostępu do internetu).

Bottle spełnia wszystko idealnie: nie ma żadnych zależności i jest po prostu plikiem bottle.py, który trzeba skopiować do katalogu z programem (co bardzo lubię), ewentualnie zainstalować pipem. Dokumentację można ściągnąć jako jeden duży plik pdf.

Do czego to jest?

Jeżeli kiedykolwiek miałe(a)ś stronę na www.republika.pl z dwoma megabajtami na twoje dane w darmowym pakiecie, a menu składało się z apletów javy, możesz pamiętać, że rzeczy wpisywane w pasek adresu przeglądarki rzeczywiście znajdowały się w podanym katalogu na serwerze. HTML działa tak do dzisiaj i nie ma w tym nic złego.

Wyobraźcie sobie jednak, że łącza na stronie nie mają nic wspólnego z plikami na dysku. Co zyskujemy? Ano to, że możemy mieć klasycznie działające podstrony, lub podstrony, które wywołują jakieś funkcje, na przykład sprawdzają ciasteczka, albo włączają subprocesy, albo kasują pliki z dysku, a zaraz potem przekierowują użytkownika na „normalną” stronę z kodem HTML dla przeglądarki. Nie ma tu granic możliwości i za to lubię programowanie.

No to zaczynamy.

Najpierw zajmiemy się przygotowaniem „środowiska programistycznego” i programem Witaj Świecie.

mkdir bottle
cd bottle
wget https://github.com/bottlepy/bottle/raw/master/bottle.py

I skoro instalację mamy za sobą, jedziemy z kodem. Jestem trochę leniwy, więc na początku zajmiemy się przykładowym kodem ze strony głównej Bottle.

from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('Hello {{name}}!', name=name)

run(host='localhost', port=8080)

Bottle składa się z wielu niezależnie od siebie działających funkcji, które zwykle hurtowo importujemy zaraz na początku. Najważniejsze są dla nas właśnie te trzy:

  • route to właśnie podstrony wywołujące funkcje,
  • run to wbudowany miniserwer www,
  • template to szablony stron, czyli html z bardzo prostą obsługą pythonowych zmiennych, warunków, pętli oraz kilku innych rzeczy.

@route(‚/hello/<name>’) to właśnie tego typu podstrona. Oznacza to, że możesz wpisać w pasku przeglądarki twojastrona.pl/hello, żeby skrypt wywołał funkcję i coś zrobił. <name> to parametr fukcji, który trzeba wpisać w pasek adresu, albo zawrzeć w łączu z innego miejsca.

def index(name): to zwykła, pytonowa funkcja.  Można ją nazwać wszystko jedno jak, może pobierać parametry i nie ma co do tego żadnych ograniczeń. W tym przypadku funkcja index wymaga podania parametru, który ustawia sobie pod zmienną name. Jak jej to podać, skoro mamy tylko przeglądarkę? Ano tak: http://localhost:8080/hello/lukasz. 🙂

return template(‚Hello {{name}}!’, name=name)… Tutaj zaczyna się magia. Co zwraca funkcja hello? Jest to szablon strony. ‚Hello {{name}}’ jest po prostu kodem HTML (no, prawie) ze zmienną name ukrytą w nawiasach, żeby można było ją jakoś odróżnić od tagów tabel, czy akapitów.

Dalej jest name=name. Masło maślane, przecież wiadomo. Lewa strona równania to jednak zmienna używana przez szablon strony (który może być osobnym plikiem), a praca zmienną z kodu Pythona, który właśnie robimy. Nie ma jednak żadnego powodu, żeby nie nazywać ich tak samo. Kod Pythona oraz szablony to osobne przestrzenie nazw, więc łatwiej napisać i potem pamiętać jedną nazwę zmiennej.

Tyle na początek. Następnym razem weźmiemy się za przygotowanie ładnego inaczej (nie jestem stylarzem) kodu html, w który opakujemy nasz pythonowy kod.

Stronka z bottle.py

Potrzebowałem małej strony internetowej do włączania i wyłączania programu w Javie. Okazało się, że wyszło z tego nieco więcej, a wszystko dzięki Pythonowi i Bottle.

Strona główna Astecha.

Python dobrze się rymuje z html, to wiemy: Django, Flask, Cherrypy, nawet stare Plone daje radę. Przez lata narobiło się wiele mniejszych skryptów, pozwalających na przesyłanie plików, albo wyświetlanie stron. Bottle.py jest czymś więcej: ma szablony stron, obsługuje ciasteczka, przekierowania, itd… a wszystko to w jednym pliku, który wystarczy skopiować do katalogu z programem. Jako, że nie mam wielkiego doświadczenia z pythonowymi stronami internetowymi, wybrałem na początek to, co najprostsze.

W sieci można znaleźć wiele przykładowych Hello World, ale było to dla mnie za mało. Zapraszam więc na githuba: https://github.com/seem8/astech. W kilku kolejnych wpisach rozłożę programik na części i wyjaśnię jak działa.

MacPi Log 5

Miałem trochę czasu na ustawianie Raspbiana. Najbardziej pasuje mi wersja Lite, do której doinstalowuję potrzebne rzeczy, ale tym razem skusiłem się na pełne iso z pulpitem, które odchudziłem ze zbędnych aplikacji i nieco dostosowałem pod siebie.

Pulpit Pixel

Ekipa Raspberry stworzyła swego czasu zupełnie nowy (tak, jeszcze jeden) Linuksowy pulpit o nazwie Pixel. Jest zrobiony na GTK2, jest bardzo lekki, estetyczny i całkiem miły w obsłudze. Bardzo wiele rzeczy da się wyklikać i w miarę szybko zrobiłem z nim, co chciałem. Jak pisałem wcześniej, będzie tutaj kilka programików graficznych, które chcę mieć zawsze pod ręką.

Przy okazji sprawdzam co jakiś czas temperaturę i wyniki są bardzo zadowalające:

sudo vcgencmd measure_temp
temp=45.1'C

Duża, metalowa obudowa bardzo dobrze radzi sobie z niewielką ilością ciepła, wytwarzanego przez Malinki. Płytka włożona w oryginalną, maleńką obudowę nagrzewa się nieco szybciej.

Backlight

Mam laptop, ten z WindowMakerem, na którym chcę bardzo precyzyjnie ustawiać jasność ekranu. Zabieram go często w trasę, więc zależy mi na baterii, ale oczy będą mi potrzebne jeszcze przez kilka lat. Na klikalnych ustawianiach różnica pomiędzy poziomami jasności jest dosyć duża i dlatego używam małego skryptu:

#!/usr/bin/bash
echo -n "Jest: "
cat /sys/class/backlight/radeon_bl0/brightness
echo -n "Ustaw na: "
read bright
sudo echo "$bright" > /sys/class/backlight/radeon_bl0/brightness
echo " "

Niestety jest on specyficzny dla mojej karty graficznej, ale różnica tkwi wyłącznie w katalogu radeon_bl0, który u Ciebie może być inny. Jest w nim, między innymi, plik brightness zawierający liczbę od 0 do 254 (lub od 1 do 255), który odpowiada za – niespodzianka – jasność ekranu. Skrypt trzeba uruchamiać z sudo, lub jako root, ale terminal mam pod ręką.

Dodatkowo, wieczorami lubię ograniczyć ilość niebieskiego na ekranie. Jestem przyzwyczajony do Redshift na moim głównym komputerze roboczym, więc używam małego „zamiennika” na laptopie:

xgamma -bgamma 0.8

Jadąc pociągiem, czy autobusem po 19:00, a jesienią i zimą znacznie wcześniej, daje duży komfort pracy.

MacPi Log 4

No i działa. 🙂 Na razie jest skromnie: dwie Malinki (w wersji drugiej i trzeciej), switch, zasilacze i terabajtowy dysk. Do obudowy jeszcze trochę by weszło, ale trzeba by było listwę zasilającą wymienić. Po kolei. Najpierw przygotowałem obudowę i rozplanowałem położenie wszystkich rzeczy:

Nie ma tu wielkiej filozofii. Długość i „sprężystość” kabli nie bardzo pozwalały na inny układ, a mam w planach dokupienie co najmniej jeszcze jednego Raspi Zero W, który gdzieś się musi zmieścić.

Podłączyłem na próbę sprzęt i okazało się, że bez problemu zmieści się w obudowie. Trzeba było jednak odrobinę dostosować ją do moich potrzeb.

Przede wszystkim zadbałem o izolację pomiędzy obudową a twardym dyskiem oraz switchem. Nie, żeby była w tym wypadku bardzo konieczna, ale nie zaszkodzi. Pomaga na chłodzenie i ewentualne wibracje.

Po przegrzebaniu piwnicy oraz domowych półek ustalił się plan montażu komputerków: wybrałem piętrowe łóżko.

Pierwsze przymiarki do ustawienia sprzętu, jeszcze nic nie jest przymocowane na stałe.

No i tak lepiej. 🙂 Do montażu wykorzystano: dwa kawałki drewnianej mozaiki, pocięty, metalowy wieszak, koraliki oraz patyczki do baloników. Całość jest przyklejona do obudowy, ale założona w taki sposób, że komputerki można w każdej chwili wyjąć. RaspberryPi 3, jako odrobinę cieplejszy, znalazł się na górze.

Robimy mały bałagan. Jak widać kable są wszędzie, ale wymyślę jeszcze sposób, żeby je rozplątać.

Jeszcze tylko małe zabezpieczenie przed pająkami. Nie macie pojęcia ile tych małych cwaniaków potrafi się chować w cieplutkiej i suchej obudowie.

A tak wygląda nowy Macintosh Performa 6320 na półce. Jeden z najgorszych Maców w ogóle doczekał się wreszcie wnętrza na miarę tej ślicznej obudowy. Do czego teraz służy? Malina 2 ma sambę i podłączony dysk, z czego bardzo intensywnie korzystam. Nie trzymam już żadnych filmów, ani muzyki na innych komputerach. Malina 3 ma pulpit, na który dostaję się przez vnc. Zainstalowałem tam kilka drobiazgów, ale docelowo będzie mieć na biurku własny monitor i wyświetlać tam, między innymi. kanały RSS z różnych blogów, lub innych źródeł, które lubię czytać. Fajnie mieć te informacje pod ręką i mieć pierwszego komenta. 😛

Oczywiście to jeszcze nie koniec. Oprócz wybielenia obudowy zostało kilka spraw:

  • wymiana przedłużacza na taki, by zmieścił jeszcze jeden zasilacz,
  • potrzebny będzie jeszcze jeden twardy dysk,
  • chciałbym jeszcze Raspberry Zero W.

Najważniejsza różnica w porównaniu z moją poprzednią konfiguracją polega na tym, że sprzęt nie jest włączony przez cały czas. W związku z tym VPS od OVH zyskał nieco na wartości. Być może model Zero będzie włączony 24/7 i będzie obsługiwał irssi oraz kilka innych drobiazgów. Chciałbym, w miarę możliwości, mieć jak najwięcej prywatnych rzeczy u siebie w mieszkaniu, a nie we francuskiej serwerowni. 🙂 Jeszcze się zobaczy. c.d.n…