MP3 192kbit/s z Muzodajni

Niedawno zapisałem się do plusowej Muzodajni. Strona nie wygląda zachęcająco i wyraźnie brakuje tam moich ulubionych wykonawców, ale muzyki mają sporo i 5zł miesięcznie za 25 utworów (plus cyrograf na co najmniej 8 miesięcy) to całkiem niezła stawka. Dzisiaj np. ściągnąłem sobie całą najnowszą płytę Kasi Kowalskiej i wykorzystałem na to tylko część z tych pięciu złotych. Za CD kupione w sklepie musiałbym zapłacić dużo więcej, a ostatecznie i tak zripowałbym do OGG i MP3 i słuchał przez komputer i telefon.

No więc jest fajnie, można za grosze sobie ściągać legalną muzykę. Jest nawet parę formatów (w opcji, z której korzystam, bez DRM) do wyboru: MP3 128kbit, WMA 128kbit, WMA 256kbit i MP4 128kbit. Można nawet ściągnąć piosenkę we wszystkich formatach, a i tak płaci się raz.

Problem polega na tym, że mnie WMA nie interesuje, a do 128kbit wolałbym się nie ograniczać, jeśli nie muszę. Napisałem więc sobie taki skrypcik wma2mp3:

#!/bin/sh -xe

input="$1"
output="$2"

if [ -z "$output" ] ; then
	output="${input%.wma}.mp3"
fi

tmpfile="$output.tmp"
ffmpeg -i "$input" -acodec libmp3lame -ab 192k -f mp3 "$tmpfile"
if [ -e "$output" ] ; then
	id3cp "$output" "$tmpfile" || :
fi
mv "$output" "$output.bak"
mv "$tmpfile" "$output"

Skrypt uruchamia się podając nazwę pliku WMA jako argument. Plik ten zostanie przetworzony na MP3 192kbit, mam nadzieję, że z minimalną utratą jakości. Dodatkowo, jeśli już istnieje odpowiedni plik MP3, to tagi ID3 z niego zostaną skopiowane do pliku nowo utworzonego. W ten sposób, jeśli z Muzodajni ściągnę WMA 256 i MP3 128, to z pierwszego biorę muzykę, z drugiego tagi (nie chciało mi się kombinować jak dane o artyście i tytułach wyciągnąć z WMA – łącze mam na tyle szybkie, że mogę sobie ściągać podwójnie).

Jak naprawiłem sobie wczoraj laptopa

Wczoraj przed wyjściem na spacer zauważyłem, że laptop coś za bardzo szumi
wiatrakami, ale że wychodziłem, to to zignorowałem. Po powrocie próbowałem pracować,
ale strasznie się mulił, a wentylatory wyją. No to zabijam Firefoksa (nie raz
się tak zamulił, po odwiedzeniu jakiejś flashowej strony). Dalej muli. Na topie
na pierwszym miejscu xfce4-battery-plugin. Pewnie się zawiesił.
Restartuję panel – bez zmian. Wyłączam XFCE. Dalej wyje i muli… No to
wyłączam komputer i włączam ponownie.

Po uruchomieniu cisza i system szybko działa. No to super, problemu nie
ma. Pracuję dalej, ale po chwili, po uruchomieniu Xów i Firefoksa znów zawył
i zamulił. Wybijam co się da i load spada, ale sam top potrafi 15% CPU zużyć.
Najwyraźniej komp nie ma mocy. Sprawdzam temperaturę, tam gdzie mogę,
wiec tylko w /proc/acpi/thermal_zone/THM/temperature. 45
stopni, a więc praktycznie zimno. A wentylator wyje. Rozglądam się dalej po
ACPI i w /proc/acpi/processor/CPU0/throttling mam: T6:
75%
. No tak, działa na 25% mocy i to przy zegarze przestawionym z 1.8GHz
na 1.2GHz.

Wygląda na to, że włączyły się wszelkie zabezpieczenia przed przegrzaniem.
Ale dlaczego, skoro komputer zimny, z tyłu dmucha też zimnym powietrzem.
W sofcie nic ostatnio nie ruszałem, więc to raczej problem sprzętowy. Nie
spodobało mi się – nie najlepszy czas na umieranie laptopa, jeśli
dopiero co władowaliśmy w niego 300zł na nową matrycę.

Jedyne na co mogłem liczyć to to, że płyta główna i procesor, łącznie
z czujnikami temperatury, są sprawne, tylko gdzieś ciepło nie jest odpowiednio
odprowadzane. Zadzwoniłem do żonki z pytaniem, czy nie może przypadkiem skądś
sprężonego powietrza załatwić. Obiecała spróbować. I przywiozła puszkę.

Czas na chwilę prawdy… otworzyłem obudowę, przedmuchałem zawartość, ze
szczególnym uwzględnieniem żeberek radiatora przy wentylatorka. Skręciłem,
uruchomiłem i cisza. Piętnaście minut później dalej cisza i wszystko działa
sprawnie. Odpaliłem burnP6, wentylatory się uruchomiły,
/proc/acpi/thermal_zone/THM/temperature sięgnęło 79, ale komputer
dalej działał pełną mocą. Wyłączyłem cpuburna i wszystko wróciło do normy,
wentylatory ucichły. A więc usterka usunięta. Ufff… :-)

Kalendarzowo

Ja mam pamięć dobrą, ale krótką – jak to mój tata mówi. Potrafię
zapomnieć o wszystkim, jak mi się w porę nie przypomni. Pół biedy jak zapomnę,
że właśnie posłodziłem herbatę i wrzucę kolejne trzy łyżeczki (serio, zdarza
mi się), gorzej jak się np. z kimś umówię, a potem nawalę.

Dlatego zawsze ciągnęło mnie trochę do elektronicznych przypominaczy.
Jednak zwykle i tak nie znajdowałem dla siebie nic odpowiedniego. Nie może to
być coś, do czego miałbym ciągle zaglądać (dlatego odpadają papierowe
terminarze), najfajniej by było, jakby nie trzeba było nawet tam nic wpisywać
(ale tego to już się raczej nie przeskoczy)… Dobrze, żeby wpisać można było
wszystko, i przypominać o ważnych sprawach mogłoby to mi zawsze i wszędzie (no
chyba, że śpię – budzić mnie nie może)…

Próbowałem paru kalendarzy komputerowych. Kombajnów typu Evolution nawet
nie tykałem – do poczty mam mutta, a nie kalendarz! W ogóle chciałem
uniknąć GUI – uruchomienie Xów nie powinno być wymagane dla
przypomnienia o ważnej sprawie. Z drugiej strony… jak już te Xy mam odpalone
(zwykle mam), to fajnie jakby przypomnienie było w jakimś okienku… Konsolowe
programiki tego typu miały jeszcze jeden feler – jakiś własny format
danych niekompatybilny z niczym. Właściwie obsługa czegoś takiego niewiele się
różniła od obsługi crontaba – do sensownego używania trzebai by sobie to
nieźle oskryptować. A ja przecież chciałem coś, co by mi samo
przypominało, a nie wymagało programowania…

Oczywiście praktycznie wszystkie rozwiązania oparte o komputer miały pewną
wadę: mogły mi o czymś przypomnieć tylko wtedy, gdy akurat byłbym przy
komputerze. Czasem nawet wymagały, żeby je specjalnie uruchomił. Dlatego
doceniłem aplikację kalendarza w telefonie. Wtedy to był jakiś pierwszy
Sony-Ericsson. To była pierwsza przypominajka, którą w miarę regularnie
używałem. Jakieś wizyty u dentysty itp. tam wpisywałem. Potem, w dużo
prostszym Samsungu X200 też. Już wtedy uznałem, że fajnie byłoby komórkowy
terminarz synchronizować z komputerowym, ale szybko się przekonałem, że raczej
nic mi z tego nie wyjdzie. Po pierwsze wciąż brakowało mi odpowiedniego
kalendarza w komputerze, a po drugie wymiana jakichkolwiek danych między tym
Samsungiem a Linuksem była praktycznie niemożliwa (odniosłem umiarkowany
sukces jedynie w przypadku książki adresowej).

Używając sobie po trochy komórkowego kalendarza wciąż kombinowałem
z kalendarzami w komputerze. Gdy usłyszałem, że Google Calendar potrafi wysyłać
SMSy, to postanowiłem to wypróbować. Nie bardzo mi się podobało, że swoje
plany, czy wręcz rozkład dnia, miałbym publikować w sieci, ale coś za coś.
Wyglądało na to, że w tej aplikacji Google mógłbym łatwo wprowadzać swoje
terminy, a przypomnienia przychodziłyby mi na komórkę. Przy okazji dostałbym
parę łebdwazerowatych bajerów, jak publikacja kalendarzy, czy rozsyłanie
terminów do znajomych. Przez jakiś czas się tym bawiłem, powpisywałem różne
terminy… czasem dziwne rzeczy z tego wychodziły (aplikacja nie działała
idealnie). A najgorsze było to, że Google potrafiło mi wysyłać SMSy w środku
nocy, co było dość nieprzyjemne, gdy zapomniałem wyłączyć telefon… No
i aplikacja webowa, to nie to, co tygryski lubią najbardziej.

Jakiś czas później trafiłem na ogłoszenie o nowym wydaniu Sunbirda.
Pomyślałem sobie, że to może wreszcie będzie jakaś użyteczna aplikacja
kalendarzowa pod Linuksa. Trudno, że GUI. Przynajmniej używa jakiś otwartych
standardów… i nawet jest wtyczka do Google Calendar. Zainstalowałem sobie
więc tego słonecznego ptaszka i zasubskrybowałem swój googlowy kalendarz.
Rzeczywiście dało się tego używać. Żeby nie publikować wszystkich swoich spraw
w Google zrobiłem sobie dodatkowy lokalny kalendarz. Potem
z lokalnego zrobiłem sieciowy (opublikowany przez WebDAV na moim
serwerku), bo przecież nie z jednego komputera korzystam. Pobawiłem się
trochę… i jakoś nie zacząłem regularnie z tego korzystać. Jak coś było na
tyle ważne, że potrzebowałem przypomnienia, to i tak wpisywałem w komórkę. Dla
innych spraw nie chciało mi się kalendarza odpalać.

W końcu kupiłem sobie nową komórkę. Już wybierałem pod kątem obsługi jakiś
standardów wymiany informacji. Zakładałem, że taką nowoczesną komórkę,
obsługującą standardy łatwo ze swoim Sunbirdem zsynchronizuje. Rzeczywistość
okazała się niestety nie taka piękna. Do sychronizacji takich urządzeń pod
Linuksem jest właściwie tylko OpenSync (inne aplikacje zwykle korzystają z tej
biblioteki), a ja nieźle musiałem się nagimnastykować, żeby tym jakiekolwiek
dane między komputerem a telefonem wymienić. A przy synchronizacji kalendarza
znikały z terminów informacje o przypomnieniu, czyli to, co dla mnie
najważniejsze. Zgłosiłem swoje problemy na odpowiednią listę mailową i nic.
Nie wygląda, żeby w tej kwestii miało się coś zmienić.

Nie poddałem się jednak. Skoro telefon ma funkcje synchronizacji, to musi
się dać to wykorzystać. Jest funkcja synchronizacji online, może to się nada?
Najpierw sprawdziłem Google Calendar, przecież taka aplikacja, takiej poważnej
firmy musi mieć taką funkcjonalność… gdzie tam. Wygląda na to, że Google
SyncML zignorowało. No to
rozejrzałem się za jakimiś publicznymi serwerami SyncML. Spośród paru
kandydatów najbardziej przekonało mnie ScheduleWorld. Po poprzednich
doświadczeniach miałem spore wątpliwości czy to zadziała, ale spróbowałem…
i zadziałało.

Teraz na komputerze mam Sunbirda, w nim swój sieciowy kalendarz
i wtyczkę (rozszerzenie) ScheduleWorld. Jak dodam na komputerze termin i wcisnę
sync, to po uruchomieniu synchronizacji w telefonie i tam się ten
kontakt pojawi. Tak samo w drugą stronę – kontakt dodany w telefonie
pojawi się na komputerze. Zachowane są przy tym informacje o przypomnieniach.
Był jeden problem – zdarzenie wpisane w komputerze na całą dobę
w telefonie było widoczne jak dwudniowe (od 00:00 jednego dnia, do 00:00
drugiego dnia). Okazało się jednak, że wystarczy zaznaczyć jedną opcję
w ScheduleWorld i problem zostaje rozwiązany. Jest tam też sporo innych
przełączników, umożliwiających ominięcie potencjalnych problemów z innymi
urządzeniami.

Do pełni szczęścia brakowało mi jeszcze jednej funkcji – jakieś
minimum funkcjonalności bez potrzeby odpalania Xów. No to napisałem sobie
Pythonowy skrypt, przy użyciu biblioteki icalendar, który wyciąga dzisiejsze
i jutrzejsze terminy z mojego kalendarza (niech żyją otwarte formaty plików!).
Lista ta jest wyświetlana przy logowaniu. Wydaje mi się to rozsądnym sposobem
przypominania mi o rzeczach, dla których alarm z telefonu byłby przesadą.

No to wydaje mi się, że już mam użyteczny zestaw, z którego będę w stanie
regularnie korzystać. Jedyna słabość, to publiczny serwer, który pośredniczy
w synchronizacji z komórką… no cóż, czasem można poświęcić odrobinę
prywatności dla wygody. I chyba nie mam zbyt dużych powodów, żeby
ScheduleWorld nie ufać.

Teraz pytanie: czy rzeczywiście będę z tego wszystkiego korzystał, czy
dalej tylko raz na ruski rok coś sobie w komórkę wklepię?

Ta gierka

Od jakiegoś czasu co nasze dziecko (przypominam: pięcioletnie) przychodzi
do domu, to od razu się pyta Tato, mogę pograć w tą gierkę?. Ostatnio
grzecznie się przy tym bawi (bez płaczu i wzywaniu rodziców, że coś poszło nie
tak), a i jest przy tym chwila spokoju dla rodziców, więc pozwalamy jej grać.
Szczególnie, że gierka jest raczej ambitna…

No właśnie… kiedyś, co Krysia zobaczyła jak tata w coś gra, to zaraz
chciała grać w to samo… a potem był płacz, bo nie umie. Ostatnio
przypomniałem sobie Simutrans, dziecku
się spodobały domki i samochodziki i obawiałem się, że znowu będzie ryk. Więc
przez jakiś czas nie pozwalałem jej grać, najwyżej pozwalałem patrzeć mi przez
ramie jak gram (i przegrywam)… W końcu jednak dałem się jej przekonać.
Pokazałem jej jak się buduje drogi, przystanki, ustala rozkład jazdy.
Pozwoliłem klikać z obawą oczekując momentu, gdy zbankrutuje. O dziwo porażkę
przyjęła dobrze i po prostu następnym razem zaczynała od nowa.

Co jakiś czas jej pomagałem. Często dziwiłem się co tam wyprawia, ale
ostatnio zaczynają mnie zaskakiwać efekty. Raz stwierdziła puściłam 40
ciężarówek
. Najpierw myślę po cholerę tyle… a niech się cieszy, że
jeżdżą, i tak zaraz zbankrutuje
. Potem a czy ona umie do 40
policzyć?
. Chyba umiała, bo ciężarówek była cała ulica i kolejne
wyjeżdżały. Prawdę mówiąc nie sądziłem, że w ogóle opanuje kopiowanie
pojazdów (raz jej to pokazałem)… Jednak kompletny opad szczęki zaliczyłem,
gdy zobaczyłem ile pieniędzy na tym zarabia. Wcisnąłem na chwilę fast
forward
i już miała prawię milion na koncie… Dzisiaj po piętnastu
minutach gry stwierdziła miałam już pieniądze na czerwono, to wcisnęłam
przyspieszenie
… i miała 200.000 na czarno. Znaczy się, zupełnie
bez mojej pomocy zrobiła w grze dochodowy interes. A przecież ile razy mnie
się to nie udało. A ja umiem liczyć, umiem czytać, znam angielski… Gra jest
pełna różnych szczegółów, w których trzeba się przynajmniej minimalnie
orientować (np. skąd dojeżdżają pracownicy do fabryk i kto jest dostawcą
surowców), a niespełna sześcioletnia Krysia sobie w tym radzi. Zrozumiała i
opanowała też zapisywanie (pod nazwą „krysia1”, „krysia2”) i odczytywanie
stanu gry… No, wciąż nie mieści mi się to w głowie! :-)

Mam nadzieję, że córka nie dorwie się do hasła roota…
;-)

Koniec z przeskakującym Firefoksem! :-)

Od paru miesięcy męczył mnie problem Firefoksa przeskakującego na aktywny
desktop XFCE4, gdy poprosi się go o otworzenie jakiegoś URLa z innej
aplikacji, albo gdy po prostu załaduje się jakaś strona. Bardzo nieprzyjemne,
gdy w tym czasie próbuje się korzystać z innego aplikacji na innym
ekranie. Problem się pojawiał (kilka razy, bo na różnych maszynach) po
jakimś upgradzie XFCE albo Firefoksa i nie potrafiłem się go pozbyć.
Próbowałem wszelkich opcji w about:config
Firefoksa, wszystkich przełączników w konfiguracji XFCE… i nic. Googlałem za
tym wielokrotnie, bez skutku, ale trudno mi było uwierzyć, że nikt inny nie
zauważył takiego zachowania, albo że nikomu innemu to nie przeszkadza…

Dzisiaj, po kolejnym takim przeskoku nie wytrzymałem i zajrzałem do źródeł
XFWM. Wyszło na to, że zachowanie to zależy od parametru
activate_action, XFWM przełącza desktop na aktywne okno, gdy
parametr ten jest równy ACTIVATE_ACTION_BRING. Potem wyczytałem,
że parametr ten jest pobierany z opcji konfiguracyjnej pod nazwą
Xfwm/ActivateAction.

Najpierw uruchomiłem GUI konfiguracyjne XFCE, żeby jeszcze raz zobaczyć,
czy nie ma tam tej opcji. Nie znalazłem. Zajrzałem więc do swojej konfiguracji
(~/.config/xfce4/mcs_settings/xfwm4.xml) i takiej opcji tam nie
było, ale miejsce wyglądało na właściwe. Dopisałem więc:

<option name="Xfwm/ActivateAction" type="string"
value="none"/>

… i zadziałało. :-) Wreszcie! Po wielu miesiącach męczarni!

Potem zajrzałem na Google, tym razem szukając tego konkretnego parametru.
Okazało się, że nie ja jeden miałem ten problem, a rozwiązanie w sieci jest
podane, wiele razy. Widać, jeszcze nie do końca umiem z Google korzystać…
:-(

No i nie rozumiem czemu tak wyjątkowo upierdliwe zachowanie jest
kontrolowane jakąś ukrytą opcją, której normalnie nie można kilkoma
kliknięciami wyłączyć…

Update: Kurde, znowu przeskoczył. :-( Chyba jednak na tym komputerze mam zbyt stare XFCE… Jak ja to testowałem?

Update 2: Właściwym plikiem dla wspomnianej opcji jest: ~/.config/xfce4/mcs_settings/wmtweaks.xml. Po zmianie należy całe środowisko zrestartować. Wygląda na to, że teraz naprawdę działa.

Awaria…

Z pracowym komputerem miałem problemy już od dawna. Jak tylko przyniosłem
go do biura, to przestał działać zasilacz (który dzień wcześniej, w domu
działał bez zarzutu). Wymieniłem na nowy.

Z nowym zasilaczem niby działał, ale jak się coś podłączyło (czy to kabel
sieciowy, czy pendrive) to potrafił się momentalnie zawiesić na twardo.
Do zawieszenia systemu wystarczyło czasami przełączyć się z Xów na konsolę
(czasem z tego powodu system wieszał mi się parę razy jednego dnia, a czasem
przez parę tygodni nie było problemów). Myślałem, że dalej coś z zasilaniem,
ale wymiana zasilacza na jeszcze inny nie powiodła się (w ogóle się nie
uruchamiał). Właściwie to już nawet nie wiem, który zasilacz mam
zamontowany…

Samo przełączanie na konsole sprawiało problemy tylko czasami… ale był
też inny problem. Gdy korzystałem z konsoli (framebuffer), to czasem aplikacja
rysująca coś w Xach potrafiła mi tą konsolę skaszanić, tak, że nie dało
się zrobić nic poza przejściem do Xów. Problemy takie sprawiały tylko niektóre
aplikacje, a właściwie ich elementy: migający kursor w xtermie kaszanił,
animacja Flash w Firefoksie nie, ale już animowany gif w tym samym firefoksie
też kaszanił. Freeciv nie kaszanił, OuterSpace kaszanił. Nauczyłem się więc
przełączać na firefoksa z bezpieczną zakładką (teraz to się chyba tab nazywa)
przed przejściem na konsolę…

Uznałem, że dość tego. Przynajmniej z tymi graficznymi problemami trzeba
skończyć. Postanowiłem zmienić kartę graficzną, z tego podejrzanego Matroxa
(ale to podobno dobre karty…) na Radeona, który gdzieś mi sie w domu
walał… Wyciągam starą kartę, wkładam nową, uruchamiam komputer… i
ciemność, widzę ciemność. Otrzymywałem albo czarny ekran, albo jakieś No
signal
wygenerowane przez monitor.

No cóż… ten Radeon mógł być zepsuty… spróbowałem ze kartą na płycie
głównej… Ciemność. No to wsadziłem znowu Matroksa… to samo. A przy tym
słychać i widać, że poza brakiem obrazu, komputer startuje normalnie. Myślę
sobie: zepsułem monitor 😦 Podłączyłem zapasowy (CRT, nie nadający się
za bardzo do codziennej pracy)… Dalej ciemność. Na wszystkich trzech
kartach. Już zacząłem się obawiać, że zepsułem drugi monitor…

Jednak oba monitory były sprawne – podłączone do routera pokazywały
co trzeba. A więc płyta główna, która już mi od dawna wydawała się
podejrzana… Poleciałem więc do sklepu i kupiłem nową płytę z procesorem (pod
stary procesor już nic odpowiedniego nie mieli, ale przynajmniej pamięci nie
musiałem wymieniać). Na razie działa. A do grafiki używam zintegrowanego
Intela 865G. Zabawy z Radeonem sobie odpuszczam (przynajmniej na razie).

AMD (dawinej ATI) upubliczniło specyfikację i… cisza?

Podczas porannej prasówki natrafiłem na link w 7thguard do informacji o udostępnieniu
przez AMD specyfikacji do chipsetów graficznych
. Developerzy Xorg dostali pierwszą część dokumentacji
dwunastego września, lada chwila ma wyjść (a może wyszedł?) nowy,
open-source’owy sterownik do R500/R600… a w sieci praktycznie cisza.

Dziwne trochę. Były petycje, nie petycje, wieczne narzekania na brak
dobrych sterowników i specyfikacji, szum przy każdej wzmiance o ewentualnym
ujawnieniu specyfikacji itd. itp. A jak coś konkretnego się stało, to cisza.
Dziwne. Albo ja czegoś nie widzę…

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ć. :-)

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…

Giercowanie – 4X

Parę miesięcy temu kumpel mnie namawiał na grę w Longturn – sieciową rozgrywkę Freeciv z długimi turami.
Wcześniej unikałem gier, żeby się znowu nie wyłączać na całe
godziny/dni/tygodnie, ale skoro to miała być jedna kolejka dziennie… to
czemu by nie? Zapisałem się do LT6 i zacząłem grać. I sam Longturn
rzeczywiście nie odcinał mnie za bardzo od świata żywych, gorzej
z pomocniczymi grami z botami, gdy sobie przypominałem jak się w to
gra… Ale w końcu sobie przypomniałem dość i tylko parę razy dziennie
zaglądałem do gry. (Żona twierdzi, że siedzę prze tym cały czas, ale jej się
tylko wydaje ;-)).

Parę miesięcy grałem w LT6, miałem w grze fajnych sojuszników.
Przegraliśmy, ale i tak jestem z rozgrywki bardzo zadowolony. W trakcie LT6
zapisałem się też na LT7… które przegrałem dość szybko. Aktualnie trwa LT8.
Na LT9, czy LTClassic3 się nie zapisuję… bo znalazłem inną zabawkę.
:-)

Ta inna zabawka to Outer Space.
Znalazłem, jak większość gier, na Linux
Game Tome
. Tak jak Longturn jest to długotrwała gra turowa, jednak
w przeciwieństwie do Freeciv, Outer Space został do takiego grania stworzony
(w LT reguły Freeciva zostały niby dostosowane, ale dalej widać, że gra
została stworzona do szybszych rozgrywek). Poza tym Outer Space też wygląda na
zupełnie inną grę: podbój wektorowej galaktyki, a nie świata
podzielonego na pola. Jednak i Freeciv (klon słynnej Civilization) i
Outer Space (czerpiący raczej z Master of Orion) to gry 4x: eXplore, eXpand, eXploit
and eXterminate
i podczas gry czuje się to podobieństwo.

Możliwe, że Outer Space to gra jak wiele innych typu podbij
galaktykę
, zaczynając od Master of Orion. Sam jednak grałem tylko w MoO
i to tak dawno, że pamiętam tylko, że bardzo mi się podobało i były w tym
jakieś gwiazdy… Tydzień temu zacząłem grę w galaktyce Garis i chyba mnie
wciągnęło. Właściwie to mi mało i założyłem sobie też konto w Inera, galaktyce
która właśnie startuje. Jeszcze zanim Garis wystartowała zapisałem się do
15-dniowej Argo, ale tamtejsi gracze szybko mi uzmysłowili, że to nie ma sensu
(startując tak późno byłbym daleko w tyle). A do Inera może jeszcze ktoś
znajomy się skusi?

No i na koniec przyznaje się bez bicia, że przez to granie zaniedbuję
trochę swoje projekty: CJC, PyXMPP, jggtrans i trochę PLD… ale cóż, jak nie
grałem, to zaniedbywałem tak samo – np. oglądając gołe panienki
w sieci… to chyba rozwijające gierki lepsze… ;-)