Z pamiętnika hipochondryka

W sobotę wieczorem wysiadając z samochodu zobaczyłem wszystkie gwiazdy (i nie tylko
dlatego, że było późno). W nocy się nie wyspałem, bo nawet przewracanie się na
drugi bok sprawiało ból. Ba, nawet leżenie bez ruchu bolało… Rano więc byłem
nie tylko obolały, ale i marudny. Żona kolejny raz przypomniała, że powinienem
znowu wybrać się do lekarza. Ale okazała też litość i nie kazała mi jechać do
Szałszy (co wiązałoby się z wsiadaniem i wysiadaniem z samochodu… ała).
Jednak zgodnie z ostatnimi zaleceniami lekarza postanowiłem się jednak ruszać
– poszedłem na pieszy, czterogodzinny spacer, do pobliskiego lasu. Nawet
jakieś grzybki znalazłem i wróciłem nieco mniej obolały.

Po wizycie u doktora A (Panie, teraz każdy tak ma!) i u pani doktór
B (To początki zmian zwyrodnieniowych – będzie panu to dokuczać już
do końca życia
) miałem wątpliwości, że jakiś lekarz jeszcze będzie mi mógł
skutecznie pomóc, chyba że przepisując mocniejsze środki przeciwbólowe,
a uśmierzanie bólu do nie wiadomo kiedy nie byłoby rozwiązaniem mnie w pełni
satysfakcjonującym. Jednak od ostatniej wizyty, mimo stosowania się do
zaleceń, było ze mną coraz gorzej. No i żona nalegała. Dziś więc wybrałem się
do przychodni i trawiłem do pani doktór C. Właściwie to ją mam wpisaną jako
swojego lekarza rodzinnego, ale jakoś nie udawało mi się do niej trafić (ale
też bardzo się nie starałem).

Pani doktór stwierdziła, że zmiany zwyrodnieniowe to nie są, bo ja młody
i zdjęcie nic nie wykazało. Uznała, że to zapalenie nerwu kulszowego
i przepisała lek przeciwzapalny/przeciwbólowy (zapewniając, że to będzie mnie
leczyć, nie tylko uśmierzać ból), coś osłonowego dla żołądka, jakiś lek
rozkurczający i witaminę B1. Dodatkowo, wypisała skierowanie do poradni
rehabilitacyjnej, ale rehabilitacji mam się poddać dopiero jak mi trochę
przejdzie. Teraz raczej mam unikać zbytniej aktywności (czyli jednak darować
sobie pływanie i rowerkowanie). Chciała też dać L4, ale jej wytłumaczyłem,
że po pierwsze, nie mogę sobie teraz na to pozwolić, a po drugie sam sobie
jestem pracodawcą i papierek mi niespecjalnie potrzebny.

Zapisałem się do poradni rehabilitacyjnej (na razie konsultacja
u tamtejszego lekarza) i poszedłem do apteki. Tam pani od razu stwierdziła, że
taka normalna B1 mi nic nie pomoże, powinno to być B1 forte, ale na
recepcie nie jest to napisane, ale i tak mi sprzeda i sprzedała. Resztę
recepty też. Od razu łyknąłem prawie cały komplet… i już jakby trochę
lepiej. Mogę wstać z krzesła i od razu mnie nie skręca całkiem z bólu.
Wyglądam podobno też już mniej smętnie. :-)

Podobno to może potrwać miesiąc zanim będą konkretne efekty kuracji…
zobaczymy. Jak się nie uda, to podobno mogę jeszcze dostać skierowanie do
neurologa.

Zapis do nieistniejącego pliku

Dziś zagadał do mnie kumpel na jabberze z ciekawym pytaniem:

<Maho> wiesz może jak dobrać się do pliku którego znam inode

<Maho> ale plik już nie ma nazwy?

Chodziło o to, żeby zapisać coś do pliku, otwartego przez jakiś proces, ale
już skasowanego z systemu plików. Alternatywą było zapisanie coś do rurki
(pipe) między dwoma procesami.

Pierwsze co mi przyszło do głowy, to echo "cokolwiek" >>
/proc/${pid}/fd/${fd}
, ale kumpel stwierdził, że to nie zadziała, bo
w /proc są symlinki (o tym dalej).

No to trzeba było wymyślić coś innego. Skoro jakiś proces może zapisywać do
tego pliku, no najlepiej byłoby zmusić ten proces do zapisania tego co chcemy.
Ale jak się podpiąć pod działający proces? Prosto: gdb.

No to przygotujmy sobie środowisko testowe, dwa skrypty:

  • skrypt1.sh:
    #!/bin/sh
    
    while : ; do
            echo PUK
            sleep 1
    done | ./skrypt2.sh
    
  • skrypt2.sh:
    #!/bin/sh
    
    cat
    

Drugiego skryptu mogłoby nie być — wystarczył by sam ‚cat’, ale niech
będzie, że to dwa skrypty się ze sobą komunikują. Po uruchomieniu,
skrypt1.sh uruchamia skrypt2.sh i wysyła do niego
PUK co sekundę. skrypt2.sh po prostu wypluwa to „PUK” na
standardowe wyjście.

No więc próbujemy, w jednym terminalu uruchamiamy skrypt1.sh:

$ ./skrypt1.sh
PUK
PUK
PUK
PUK
PUK

Teraz spróbujmy zlokalizować tę rurkę między skryptami:

$ /usr/sbin/lsof -c skrypt1.sh | grep pipe
skrypt1.s 11108 jacek    1w  FIFO    0,5          40246 pipe
skrypt1.s 11108 jacek   14w  FIFO    0,5          40246 pipe

Są dwie, mniejsza z tym skąd, spróbujemy się podpiąć pod tę drugą. Znamy
identyfikator procesu (pid=10980) oraz numer deskryptora pliku (fd=14). To
powinno wystarczyć. No to podpinamy się pod proces:

$ gdb --pid=11108
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pld-linux".
Attaching to process 11108
Reading symbols from /bin/ksh...(no debugging symbols found)...done.
Using host libthread_db library "/lib/libthread_db.so.1".
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2

warning: Lowest section in system-supplied DSO at 0xffffe000 is .hash at ffffe0b4
(no debugging symbols found)
0xffffe405 in __kernel_vsyscall ()
(gdb)

No to się podpięliśmy… Skrypt został zatrzymany i przestał wyświetlać
PUK. Teraz tylko należy wywołać funkcję write(). Ale jak?
Wydaje się, że nie ma żadnego polecenia do uruchamiania funkcji systemowych,
czy bibliotecznych… Ale jest print, który pozwala wyświetlić
wartość wyrażenia w C… a wyrażeniem może być wywołanie funkcji…
spróbujmy:

(gdb) print write(14, "BU!\n", 4)
$1 = 4

…czyli jakby zadziałało i zapisało 4 znaki. No to co jest na terminalu ze
skryptami? Oczywiście wysłane właśnie BU!. Można jeszcze sobie coś tak
popisać, a potem wznowić wykonywanie skryptu:

(gdb) quit
The program is running.  Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/ksh, process 11108

A teraz, wróćmy do wspomnianego echo "cokolwiek" >>
/proc/${pid}/fd/${fd}
… Przed napisaniem tego wpisu jeszcze sprawdziłem jaki do da efekt. I:

$ echo "cokolwiek" > /proc/11108/fd/14

Dało na terminalu ze skryptami:

PUK
PUK
cokolwiek
PUK
PUK

A więc /proc/.../fd/... działa wystarczająco dobrze! Jednak
sztuczka z gdb i tak mi się spodobała, więc ją tu opisałem. Ma
swój potencjał, bo oprócz pisania do pliku pozwala na różne inne rzeczy.
Oczywiście, krzywdę sobie w ten sposób też można zrobić. :-)

Dziecko zostało z tatusiem…

Ledwo co żona poszła na pociąg, to już córka zaczęła kombinować:

– Dzisiaj nie pójdziemy na popołudniowy spacerek, bo pogoda jest brzydka, a ja w przedszkolu byłam na spacerku.

– Ale mama kazała mi ciebie zabrać na spacerek! –
odpowiedziałem, w rzeczywistości raczej uważając spacerek jako standardowy
punkt dnia niż rozkaz z góry.

– No to możemy ją oszukać. Powiemy, że byliśmy.

Fajnie jest, gdy praca bawi :-)

Ostatnio miałem problemy z cieszeniem się pracą. Właściwie kombinowałem
tylko co by robić, żeby nic nie robić i jak dotrwać do weekendu. W końcu jednak
klient (czyli szef) sprowadził cztery serwery (dwa Sun Fire i dwa jakieś
Supermicro) dla swoich klientów i miałem na tym postawić nasz system. Właściwie
to miały być dwie instalacje – dla każdego klienta dwa serwery z których
jeden miał zastępować drugi w razie awarii. Czyli miałem zrobić dwa klastry HA
(High Availability).

Prawdę mówiąc nie miałem większego pojęcia na ten temat, więc się trochę
bałem, czy w ogóle się uda. Na początku więc po prostu postawiłem cztery
identyczne serwery. Potem szef zepsuł jedną maszynę Sun Fire i mogłem spokojnie
się skoncentrować na budowie jednego klastra :-). Warto zaznaczyć,
że wszystkie te maszyny stoją w Amsterdamie, a ja mam do nich dostęp tylko
przez sieć: SSH (także do konsoli szeregowych) oraz interfejs WWW do zdalnego
wyłącznika zasilania.

Nasz system oparty jest na Xenie, na listach Xena przeczytałem, że do zapewnienia
redundancji dobrze mieć DRBD (dla dla
replikacji dysków), albo iSCSI lub inne rozwiązanie SAN (jeśli przestrzeń
dyskowa miałaby być współdzielona). Wyszło mi na to, że dla nas lepsze będzie
DRBD. Zacząłem czytać o DRBD. Dowiedziałem się, że DRBD dobrze byłoby używać
wraz z Heartbeatem. To się zabrałem za
szykowanie pakiecików…

Po kilku przeróbkach PLDowych pakietów, po kilku kompilacjach kernela,
Heartbeata i DRBD, w końcu udało mi się coś uruchomić. Najpierw niespecjalnie
to działało, a ja kompletnie nie wiedziałem co sie na moich serwerach dzieje.
Ale po trochu to rozpracowywałem. W końcu usługi się uruchamiały tam gdzie
trzeba, a jak maszynę wyłączyłem, to przeskakiwały na drugą. Super.
:-)

… ale to wszystko w konfiguracji Heartbeat w wersji pierwszej, która
już podobno nie jest zalecana. No to włączyłem wersję drugą (crm
yes
w /etc/ha.d/ha.cf) i zabawa zaczęła się od początku:
wszystko przestało działać, przestałem rozumieć co się dzieje i dalej trzeba
było pakiet heartbeat poprawiać. Ale i to opanowałem i muszę przyznać, że
sprawiło mi to niezłą frajdę. :-)

Ciekawe co jeszcze mogę w tym klastrze poprawić… bo inne rzeczy co
czekają w kolejce, niestety, nie są już takie fascynujące… No cóż, kiedyś
nuda musi wrócić.

No i ciekawe jak te klastry będą się zachowywać w warunkach produkcyjnych…

No to ja też…

… zrobiłem sobie Nerd Test 2.0:


NerdTests.com says I'm a Cool High Nerd.  What are you?  Click here!

Najbardziej zaskoczyło mnie pytanie When I say TOS or TNG, what comes to mind?
Huh? powinno być ostatnią odpowiedzią na liście, bo tak zareagowałem
na to co mam do wyboru. Po przeczytaniu pytania, w głowie od razu mi się ułożyło:
Type of Service (pole nagłówka IP) i The New Generation (jako
taki ufaniacz nazw programów). ;-)

Weselicho

Wczoraj żony kolega z pracy się ożenił (łączymy się z nim w bólu
;-)). Ślub był kościelny. Pełna ceremonia ze mszą, więc ja się do
kościoła nie pchałem, zostałem w samochodzie. Zajrzałem do środka (przez
otwarte drzwi) dopiero, gdy żona dała mi znać, że zaczyna się istotna część…

Tak smutnej uroczystości dawno nie widziałem. Porównywalny był chyba tylko
pogrzeb babci. Nawet państwo młodzi składali sobie przysięgę tak, jakby się
rzeczywiście skazywali na jakieś wielkie nieszczęście do końca życia. Tylko
chór ładnie śpiewał… ale też tego śpiewu nie można było nazwać radosnym. Im
bardziej się temu przyglądam, tym mniej ten Kościół rozumiem. Powaga powagą,
ale to przecież powinna być radosna uroczystość! To już ślub mojej mamy
w Urzędzie Stanu Cywilnego był weselszy. Ale i nasz ślub, kościelny, nie był
taki drętwy.

Ja i tak miałem łagodniejszą wersję, Ika w kościele spędziła ponad godzinę.

Potem pojechaliśmy na wesele. Tu nastrój był zgoła odmienny. Szczególnie
w naszym końcu weselnego stołu. Ja z Iką siedzieliśmy, z niewyjaśnionego
powodu, na jednym z końców stołu, przy nas jej (i pana młodego) koledzy
z pracy. Chyba dla przyzwoitości posadzono obok nas jeszcze księdza. Chyba nie
wiele pomogło, bo nasza grupka dobrze się bawiła i co chwilę wybuchała gromkim
śmiechem jeszcze zanim napełniono pierwsze kieliszki, a uświęcone towarzystwo
niespecjalnie nas krępowało.

Zabawa rozkręciła się właściwie od samego początku. Jednoosobowa orkiestra
dawała radę – facet grał całkiem przyzwoicie, a i potrafił towarzystwo
rozbawić. Były tańce, hulanki, swawole… Fajnie było sobie poskakać, popatrzyć
na tańczące atrakcyjne dziewczyny, powydzierać się trochę, pożartować,
poprzytulać itd. itp…

Dotrwaliśmy do drugiej w nocy, bo, oczywiście, dzisiaj rano Ika wybierała
się na konie. No i rano trzeba było dziecko od dziadków odebrać. Inni bawili
się do szóstej. Na odespanie imprezy musimy jeszcze poczekać.

Poranne zamotanie

Wyszedłem, jak co sobotę, po bułeczki. Wracam do domu, a tu czeka coś
w miseczce… Pierwsza myśl: kto będzie jadł chińską zupkę o poranku?.
Jednak to nie była zupka… spod talerzyka wystawał sznureczek z żółta
etykietką… Kochana żonka zaparzyła mi herbatki. :-) Tylko coś
jej się pomyliło i zamiast w filiżance (swoją drogą, niewiele mniejszej od tej
miski) zrobiła to w miseczce na zupę. Podobno wcześniej już dziecko jej
zwróciło uwagę, że coś jest nie tak. :-)

Basenowo

Zalecenia lekarza to poważna sprawa, więc staram się tak dwa razy
w tygodniu być na basenie. Niestety, basen na Warszawskiej zamknięty (przerwa
techniczna do 9 września) i musiałem się przestawić na ten na Sikorniku.

W sobotę po błądzeniu wokół osiedla udało mi się tam trafić i nawet
wykąpać. Dzisiaj, gdy dziewczyny poszły do szkoły muzycznej, postanowiłem
znowu się tam udać. Dojechałem, chcę płacić, a pani w kasie mówi mi, że raczej
nie teraz, bo od 17:30 do 18:30 pływalnia jest zarezerwowana. Okazało się, że
jak zaczął się rok szkolny, to wszystko jest inaczej, a zresztą,
wszędzie jest to napisane. A wszystko takim tonem, że powinienem się
chyba wstydzić, że nie wiedziałem… Zresztą, już poprzednim razem, z jakiegoś
powodu kobieta przy kasie mi podpadła. Na Warszawskiej było jakoś przyjaźniej.

Rzeczywiście były karteczki o rezerwacji, ale nie przypominam sobie, żebym
je tam widział w sobotę. Informacje o godzinach otwarcia w roku szkolnym
czytałem i, że przed 15:00 nie ma czego tam szukać wiedziałem. Najgorsze, że
takie niespodzianki są w czasie, gdy drugi basen jest zamknięty, a przecież
oba prowadzi ten sam gospodarz
– mogli by to wziąć pod uwagę.

Drugi raz dzisiaj się nie wybieram, bo, po pierwsze, nie chce mi się
jeździć tam i z powrotem, a po drugie, boję się, że w takich okolicznościach,
to będzie tam po prostu tłoczno.

Wycieczka

Rano, jak co niedzielę, byliśmy w Szałszy na konikach. Ja, ze względu na swój
kręgosłup, jazdę sobie odpuściłem… ale ruszać się trzeba (chociażby ze
względu na ten mój kręgosłup), więc po obiedzie wybrałem się na rowerek.

Nie czując się najlepiej nie wiedziałem jak daleko dojadę. W końcu cały
czas bolało – już nie tylko krzyż ale i lewe biodro, czy chwilami cała
noga aż do stopy. Najbardziej, gdy próbowałem się obrócić, aby obejrzeć się za
siebie, albo gdy na jakimś wyboju nie podniosłem się z siodełka. Jednak, po
jakiś dziesięciu kilometrach ciągłego pedałowania, przeszło. Mogłem się
obracać, wykrzywiać, jeździć po wertepach i nic nie bolało.
:-)

Niestety, nie ma za dobrze… wystarczyło na parę minut zejść z roweru
(żeby pojeść sobie jeżyn?) i mój kręgosłup znowu o sobie przypominał,
przynajmniej na kilka następnych kilometrów.

Dobra dosyć marudzenia. W sumie dzisiaj przejechałem trochę ponad 30km,
dojechałem do Rachowic,
a z nieprzewidywanych atrakcji zobaczyłem pomnik Juliusza Rogera.
Zaskoczył też mnie Kozłów, nie dość, że większy niż myślałem, to układ ulic
ma taki, że ciężko się nie zgubić. Mam nadzieję, że uda mi się na podobne
wycieczki jeździć częściej.

Oszukany przez bankomat

Zaczęło nam się robić pusto w portfelach, więc poszedłem do bankomatu po
gotówkę. Normalnie wkładam kartę, wklepuję PIN, wybieram wypłatę 500zł,
pokwitowanie sobie darowałem… Wyciągnąłem kartę, wziąłem pieniądze,
szybko sprawdziłem, czy się zgadza: z wierzchu dwie pięćdziesiątki, dalej setki.
W sumie 6 banknotów. OK.

Przyszedł czas oddać pieniądze żonie (tradycyjnie sobie chciałem te 50zł
zostawić). I żona protestuje, że mało. Jak to mało? A tak to… ostatnie dwa
banknoty w pliku to nie były setki, ale pięćdziesiątki. Bankomat dał mi
o 100zł za mało. :-(

Poleciałem do bankomatu zobaczyć, czy jest tam podany jakiś numer do
zgłaszania reklamacji. Nie było. Ale to bankomat naszego banku (PEKAO), więc
zaraz po powrocie do domu zadzwoniłem na infolinię. Szybko zostałem spławiony:
wszelkie reklamacje finansowe należy osobiście składać w oddziale
banku
. Dla mnie wydawało się oczywiste, że jak tylko bankomat zaczyna źle
działać, to bank będzie chciał o tym wiedzieć. Ale widać się myliłem… widać
liczą na to, że ludziom nie będzie się chciało reklamować i może nawet na tym
zarobią…

No cóż, jutro wybiorę się do banku i tam pomarudzę. Dzisiaj jeszcze tylko
opisałem zdarzenie i moje uczucia do banku w formularzu reklamacji
w interfejsie internetowym – zapewne to nic nie da, ale mi trochę
ulżyło. ;-)