Rockbox, scrobbling i obsługa libre.fm pod Linuksem.

Wygląda, że mój odtwarzacz dorobił się finalnej postaci. To, co najważniejsze, czyli odtwarzanie muzyki działało od samego początku. Ostatnio dorobił się dodatkowej karty flash, a teraz obsługi scrobblingu. O ile samo włączenie scrobblingu, które już wcześniej planowałem zrobić, jest trywialne i aż dziwne, że wcześniej tego nie zrobiłem, o tyle spięcie z libre.fm trywialne nie jest (trudne też nie, ale). Do rzeczy.

Włączenie obsługi scrobblingu w Rockboksie jest proste i sprowadza się do zaznaczenia jednej opcji. Konkrentnie należy zmienić Settings -> Playback Settings -> Last.fm Log na Yes. Tworzony i automatycznie uzupełniany jest plik .scrobbler.log, w standardowym formacie. Nie wiem, czemu wcześniej tego nie zrobiłem w sumie. Pewnie rzuciłem okiem na dalsze wymagane czynności i odpuściłem.

Gorzej z obsługą libre.fm, bo sam plik to nie wszystko (a w zasadzie prawie nic). Początkowo chciałem korzystać z QTscrobblera – klikalne, wolne, niby libre.fm obsługuje. Pierwszy zgrzyt – nie ma tego w repo Debiana, nie ma pakietu .deb do pobrania. Kompilacja i budowa paczki to wprawdzie moment (ave checkinstall!) plus konieczność doinstalowania paru pakietów koniecznych do kompilacji, ale niestety nie widzę nigdzie opcji wyboru libre.fm, a dokumentacja w tym zakresie jest na poziomie non-existent, mimo, że sama aplikacja jest oznaczona jako wspierająca libre.fm na ich wiki. Być może należy dodać wpisy w hosts. Być może ustawić proxy. Zawsze można w źródle zmienić… No ale jakby nie o to chodzi – to miało być łatwe i klikalne, a robi się rzeźba. A wyniki wyszukiwania nie pomagają.

Podczas poszukiwań wielokrotnie natykałem się na opis, jak w prosty sposób (skrypt w bashu plus dwa skrypty w pythonie) aktualizować dane na libre.fm z wiersza poleceń. Metoda prymitywna, ale wyglądająca na prostą i skuteczną, więc stwierdziłem, że dam jej szansę. Jedyne na co warto zwrócić uwagę, to aktualizacja strefy czasowej. OTOH nie mam pewności, dla której strefy czasowej Rockbox dodaje timestampy przy poprawnie ustawionym czasie na odtwarzaczu i komputerze, ale nawet jeśli będzie przesunięcie o te 2 godziny, ale dzień się będzie zgadzał, a taka dokładność w zupełności mi wystarczy.

Instrukcja step-by-step:

  1. Pobierz skrypt bashowy (drugą wersję) z forum i zapisz do pliku
  2. Dostosuj strefę czasową
  3. Utwórz katalog librefm w katalogu użytkownika (mkdir ~/librefm)
  4. Pobierz skrypty import.py oraz gobble.py z tej strony
  5. Uruchom skrypt bashowy (sh nazwa_pod_jaka_zapisany). W katalogu musi być plik .scrobbler.log
  6. Opcjonalnie możesz wykasować pozycje, których nie chcesz wysyłać (np. podcasty czy audiobooki)
  7. Uruchom skrypt w Pythonie (chmod 700 import.py && ./import.py login_do_librefm ~/librefm/rockbox.log)
  8. Podaj hasło do swojego konta na libre.fm
  9. Enjoy your stats

Jeśli ktoś spiął QTscrobblera z libre.fm, to chętnie dowiem się, jak to dokładnie zrobić.

Poza tym, ciągle rozglądam się za wygodnym sposobem słuchania muzyki, ze wsparciem (natywnym) dla libre.fm i – najlepiej – jednoczesnym wsparciem dla Jamendo. Jest Pyjama, ale po pierwsze nie jest to player ogólnego przeznaczenia, tylko – skądinąd wygodny – program do Jamendo. Po drugie, demon szybkości to to nie jest. Nie wiem, czy kwestia Pythona z testinga, czy czego, ale obecnie potrafi zmulić i to do granicy reponsywności (OTOH odtwarzanie działa w tym czasie płynnie, więc nie krytyk). A kiedyś było dobrze… Po trzecie, Pyjama jest słabo rozwijana.

Ideałem byłoby coś, co potrafi scrobble’ować i radia internetowe, i dobrze obsługującego zwykłe albumy z dysku, i Jamendo. W sumie kolejność Jamendo -> radia -> albumy z dysku, bo jakoś nie jestem fanem trzymania wybranej kolekcji (co innego odtwarzacz).

Patos kapu kap.

Niedawno miała miejsca akcja Stop-Cenzurze (dead link). O co chodziło, można doczytać na stronie. Akcja miała wiele pochodnych, przykładowo do pobrania był bardzo ciekawy skypt (ciekawszy niż czarny banner, choć IMO trochę mniej mówiący – banner wyłączający u góry nieco za mały), zasłaniający niektóre wyrazy czarnymi prostokątami (wyłączane po kliknięciu banneru).

Ponieważ akcję popieram, to i tu znalazł się banner (co prawda pojawił się później, bo wtedy dowiedziałem się o akcji, ale był). Można nawet mówić o jakimś sukcesie – chyba pierwszy raz doszło do zauważenia zwykłych ludzi i ich zastrzeżeń do prac rządu i procesu stanowienia prawa, co więcej, była nawet jakaś reakcja i zainteresowanie ze strony rządu. Pożyjemy, zobaczymy.

Natomiast nie o tym chciałem pisać, a o przemówieniu na zakończenie akcji. Jak pisałem, banner zamieściłem, ale nawet nie zgłaszałem strony, bo po co? Kto wejdzie, ten zobaczy banner i tyle. Natomiast chcę się odnieść – po raz kolejny – do fragmentu wspomnianego przemówienia:

Niektórzy z Was mogli się przecież przy tym narazić na mniejsze wpływy u reklamodawców i oburzenie społeczności dla której jesteście. To właśnie można nazwać poświęceniem dla sprawy.

Już samo słowo przemówienie w tytule sugeruje, że od patosu będzie kapać, ale tego się nie spodziewałem. Normalnie zamieszczający od ust sobie odebrali, głodowali miesiąc, wygnano ich z miast i pokasowano im konta na serwisach. Społeczność była oburzona, jad pod ich adresem wprost lał się strumieniami w wielu wpisach poświęconych tej sprawie. Oraz tradycyjnych mediach (szczególnie niektóre dzienniki). Poświęcenie, jakby ręce dali sobie uciąć w ramach protestu. No i maile, nie zapominajmy gorzkich mailach z wyrzutami. Treść takiego maila można zobaczyć poniżej. Bzzzt, wróć. Można by było zobaczyć, jakbym jakiegoś dostał.

Get real, całe przyłączenie się do akcji to było tylko wklejenie kawałka kodu w szablon, żeby się odwiedzającym banner wyświetlił. Po prostu i tylko tyle. Jak napisałem w komentarzu, dla mnie taki tekst na koniec akcji jest żałosny. W stylu wy, wielcy bohaterowie, w ramach głodówki nie zjedliście dziś ani jednego ciastka, dziękujemy za poświęcenie! Choć stańcie do apelu byłoby mocniejsze…

I zastanamiam się, gdzie byli i co robili wszyscy ci obrońcy wypowiedzi, kiedy MG kasowano konto (podążanie za odnośnikami wskazane; miałem nie wracać do tego, ale tak się kojarzy, że nie mogę się powstrzymać).

 

Jak bezpiecznie korzystać z uszkodzonej pamięci RAM bez BadRAM.

BadRAM był fajny, ale jest nieutrzymywany. Ostatnią działająca u mnie wersja była do kernela 2.6.25.x, późniejsze, choć istniały (np. dla 2.6.29; dead link), to nie udało się ich – wbrew wcześniejszej radości – zmusić do poprawnego działania – nadal pojawiały się błędy np. na liczeniu sum kontrolnych.

Winny w tej maszynie jest ewidentnie RAM, co zostało już dawno stwierdzone, ale maszyna na tyle niekrytyczna, że inwestować się nie opłaca (poza tym, szkoda środowiska), a ze starszym (tj. 2.6.25.x) kernelem spokojnie i poprawnie działa. Poza tym, przecież to Linux, więc da się poprawić. I jaki uroczy temat do notek jest. 😉 Z okazji świątecznej wizyty w domu, postanowiłem jednak zerknąć, czy nie pojawiły się patche BadRAM do jakichś nowszych kerneli (serii 2.6.3x, znaczy).

Nie pojawiły się, ale zamiast tego, trafiłem na pierwszej stronie wyników na sposób radzenia sobie z uszkodzoną pamięcią pod Ubuntu, który w ogóle z BadRAM nie korzysta. Chwilę później trafiłem na ten wpis (dead link). Okazuje się, że za pomocą parametrów, które można przekazać kernelowi, w szczególności mem=XX oraz memmap=X$YY, można wyłączyć obszary pamięci z użytkowania, co przekłada się w praktyce, na możliwość bezpiecznego korzystania z uszkodzonej i dotychczas powodującej błędy pamięci. Więcej o parametrach w kernelowym Documentation/kernel-parameters.txt, ale na potrzeby tego zagadnienia wystarczą te dwa.

Pierwszy parametr (mem=) ogranicza wykorzystaną pamięć. Jeśli uszkodzenie jest w okolicy 312 MB (memtest+ prawdę powie), to mem=310M co prawda obniży dostępną pamięć do 310 MB, za to system będzie działał bez problemów. Tyle tylko, że stracimy 200 MB pamięci. Trochę sporo, zwłaszcza, jeśli całość do dyspozycji to tylko 512 MB.

Drugi (memmap=) jest ciekawszy, bo rezerwuje X pamięci od adresu YY. Przykładowo memmap=10M$305M oznaczy pamięć od  305 MB do 315 MB jako wykorzystaną. Czyli stracimy raptem 10 MB, a zyskamy niezawodny system. Tyle teorii. W praktyce na dystrybucyjnym 2.6.26 z Lenny’ego, mem=300M działało poprawnie (najprościej sprawdzić przez free -m), natomiast memmap=10M$305M był radośnie olewany – nadal pokazywało dostępną całą pamięć.

Przyczyny tego stanu rzeczy nie udało mi się ustalić (podejrzewam limit 4GB zamiast 1GB, błąd w kernelu lub korzystanie z initrd – jeśli ktoś zna odpowiedź, to proszę o info), natomiast skompilowanie własnego 2.6.32.2 na podstawie konfiga od 2.6.25.x (z którego spatchowanego BadRAM korzystałem do tej pory) rozwiązało problem – memmap=2M$311M, czyli wyłączenie tylko 2 MB spowodowało, że system działa poprawnie.

Ponieważ najłatwiej zaobserwować błędy było dotychczas na sumach kontrolnych, to testowanie wykonałem prostym skryptem (brzydki bash napędzany perlem – pewnie dałoby się prosto przespisać na gołego basha, ale kto tam ma czas…; skrypt na końcu wpisu). Stosunkowo duży plik (większy, niż dostępna pamięć RAM, mój tworzony przez dd if=/dev/urandom of=random.dat bs=1MB count=1024), z losową zawartością (tworzony raz, bo czasochłonne), liczenie sum kontrolnych. Jeśli błąd pojawi się w buforze dyskowym, to przy braku wielkiego pecha suma kontrolna będzie się różnić przed i po skopiowaniu. Zapuszczone w pętli, z logowaniem do pliku – nawet przy uszkodzonej pamięci nie wystarczy 1 przebieg – błąd nie pojawia się za każdym razem. Natomiast choćby jeden błąd oznacza, że coś jest nie tak jak być powinno.

Podstawą jest jednak free -m. Jeśli on nie widzi mniej pamięci, to można nie zaczynać nawet ze skryptem.

Jeśli po dłuższym teście brak błędów (pojedynczy błąd oznacza, że nie jest dobrze), to wystarczy dopisać linię do konfigu gruba, by przy każdej aktualizacji kernela dodawał do parametrów określony argument:

#kopt=root=/dev/hda2 ro memmap=2M$311M

Dzięki temu możemy korzystać z dowolnej (najnowszej!) wersji jądra, bez upierdliwego patchowania (cóż, patche badram były dość kijowe, włączenie z tym, że zdarzało im się mieć literówki uniemożliwiające kompilację).

Na koniec wspomniany skrypcik:

#!/usr/bin/perl
$src="/random.dat";
$dst="/tmp/memtest_tmp.dat";
$log="memtest_copy.log";
if (-f $dst){
   system (" rm $dst ");
}
system (" date >> $log ");
while (1){
  system (" cp $src $dst ");
  $res = `md5sum $dst`;
  $res2 = `sha1sum $dst`;
  $res_ = `md5sum $src`;
  $res2_ = `sha1sum $src`;
  $check = "ERROR";
   if (($res == $res_) && ($res2 == $res2_)){
     $check="OK";
   }
system (" echo \"$check $res $res_ $res2 $res2_ \" >> $log ");
system ("rm $dst");
}

Podsumowując: żegnaj BadRAM!