Jak wiadomo Linux znany jest z tego, że można tutaj zautomatyzować niemalże wszystko. Zazwyczaj robimy to za pomocą skryptów Basha, Perla czy innego Pythona. Są jednak przypadki, kiedy nie bardzo mamy dojście do API czy komend aby zautomatyzować jakiś proces. Bo jak zautomatyzować np. ruch myszy w środowisku graficznym czy zasymulować wciskanie klawiszy?
Drugą rzeczą, z której znany jest Linux jest to, że zawsze znajdzie się rozwiązanie ;-) Podobnie w tym przypadku rozwiązaniem naszym problemów jest pakiet xautomation (spaczkowany w większości dystrybucji). Dostarcza on bardzo pomocnej komendy jaką jest xte. Podstawowymi parametrami tej komendy są:
key k Wciśnięcie klawisza k
keydown k Przytrzymanie klawisza k
keyup k Zwolnienie klawisza k
str string Wpisanie ciągu znaków
mouseclick i Wciśniecie lewego klawisza myszy
mousedown i Wciśniecie lewego klawisza myszy
mouseup i Zwolnienie lewego klawisza myszy
mousemove x y Przemieszczenie kursora na pozycję (x,y)
mousermove x y Względne przemieszczenie kursora na pozycję (x,y)
sleep x Odczekanie x sekund
Dzięki zastosowaniu tych komend możemy już zautomatyzować wyklikiwanie pewnych czynności, np. głupiej ankiety internetowej lub pajacyka. Swojego czasu używałem tego do łączenia się z ukrytą siecią Wifi, której Gnomowy Network Manager za nic nie umiał mi zapamiętać. Zamiast wyklikiwać codziennie szereg opcji i po raz setny wpisywać długie wygenerowane hasło klikałem tylko w skrypt, który robił wszystko za mnie.
Przykładowy skrypt powtarzający pewną czynność w nieskończoność może wglądać tak:
#!/bin/bash
while [ 1 ]
do
sleep 1
xte 'mouseclick 1'
# otwórz Chrome w trybie porno
xte 'keydown Control_L' 'keydown Shift_L' 'key n' 'keyup Shift_L' 'keyup Control_L'
sleep 1
# wybierz adres
xte 'str http://...wybierz_polskiego_polityka_roku_2009...'
xte 'key Return'
# czekamy na wczytanie strony
sleep 7
#wybierz kandydata
xte 'mousemove 44 490'
xte 'mouseclick 1'
# głosuj
xte 'mousemove 253 710'
xte 'mouseclick 1'
sleep 1
# zamknij Chrome
xte 'keydown Alt_L' 'key F4' 'keyup Alt_L'
done
Dla ułatwienie sobie życia możemy skorzystać z komendy xmousepos, dzięki której nie będziemy musieli zgadywać pozycji kursora. Wystarczy ustawić kursor w odpowiednie miejsce a następnie uruchomić podaną komendę aby uzyskać pozycję kursora, np:
tomek@Arch:~$ xmousepos
1125 136 1125 110
^^ dwie pozycje, bo każdy kij ma dwa końce
W każdym razie miło wiedzieć, że mamy możliwość zautomatyzowania kolejnej czynności ;-)
I <3 Linux
Przyszedł koniec roku, w pracy zrobiło się troszkę luźniej, a więc to dobry czas na własne projekty :-) Nie, nie startupy. Nie lubię startupów. Startup to dla mnie czasownik mówiący o tym, jak jakiś autor (sam nie przekonany do swojego pomysłu) próbuje na siłę przekonać wszystkich, że funkcjonalność którą stworzył jest im niezbędna do życia :-/ Dlatego o wiele bardziej preferuje aplikacje o charakterze narzędziowym, w którym społeczność tylko zwiększa użyteczność samego narzędzia.
Tak więc z potrzeby posiadania narzędzia narodził się configer.net. Cała idea polega na przechowywaniu tam własnych (czasami godzinami dopieszczanych) plików konfiguracyjnych oraz podglądanie tego co wykombinowali inni. Oczywiście z możliwością dołożenia swoich 5 groszy w postaci komentarza. Dla parówkowych skrytożerców przewidziana jest opcja prywatnego configa, czyli dostęp do niego ma wyłącznie autor, więc nie koniecznie trzeba się zaraz dzielić swoimi wyczynami.
Żeby maksymalnie ułatwić korzystanie z serwisu nie trzeba się nawet rejestrować. Wystarczy że zalogujemy się za pomocą OpenID, Googla, Facebooka lub Yahoo! (przecz z rejestracjami!). Mam nadzieję, że serwis kilku gikom się przyda. Jeżeli nie - trudno - to nie startup, nie musi podbijać serc ;-)
Napisy końcowe: w projekcie udział wzięli - trójkąt, Jaro, Lotos (via pdll.pl) oraz <3 Django.
Zawsze mnie ciekawiło jaki jest ruch na naszym firmowym serwerze ale nie chciałem obciążać maszyny dodatkowym oprogramowaniem, które by to zliczało. Zwłaszcza że każda hostowana przez nas strona jest podpięta pod Google Analytics. Nie znalazłem jednak sposobu aby w panelu statystyk wyświetlić sumę odwiedzin z kilku kont. Na szczęście Analytics podobnie jak większość usług Googla ma swoje API. Wystarczyło więc zaprząc do pracy Pythona oraz bibliotekę gdata.
Użytkownikom ArchLinuksa polecam paczkę python-gdata-svn
yaourt -S python-gdata-svn
Skrypt jest dość prosty i działa w konsoli:
#!/usr/bin/python
import datetime
import sys
import gdata.analytics
import gdata.analytics.service
def main(argv):
GOOGLE_ANALYTICS_LOGIN = 'TWOJE@KONTO'
GOOGLE_ANALYTICS_PASSWORD = 'TAJNE_HASLO'
if len(argv) > 1:
d = argv[1].split('-')
data = datetime.date(int(d[0]), int(d[1]), int(d[2]))
else:
data = datetime.datetime.now()
print "\ndata: %d-%d-%d" % (data.year, data.month, data.day)
print "\nodw\tods\tdomena"
print "--------------------------"
dc = gdata.analytics.service.AnalyticsDataService()
dc.ClientLogin(GOOGLE_ANALYTICS_LOGIN, GOOGLE_ANALYTICS_PASSWORD, account_type='GOOGLE')
a = dc.GetAccountList()
odwiedziny, odslony = [], []
for b in a.entry:
tid = b.id.text.replace('http://www.google.com/analytics/feeds/accounts/','')
query = dc.GetData(
ids=tid,
start_date='%.4d-%.2d-%.2d' % (data.year, data.month, data.day),
end_date='%.4d-%.2d-%.2d' % (data.year, data.month, data.day),
metrics='ga:visitors,ga:pageviews',
dimensions='ga:day'
)
odw = int(query.entry[0].visitors.value)
ods = int(query.entry[0].pageviews.value)
odwiedziny.append(odw)
odslony.append(ods)
print "\033[1;31m%d\t%d\033[0m\t\033[33m%s\033[0m" % (odw, ods, b.title.text)
print "--------------------------"
print "%d\t%d\tRazem" % (sum(odwiedziny),sum(odslony))
if __name__ == "__main__":
sys.exit(main(sys.argv))
Jeżeli wywoła się go bez parametrów wówczas pokaże statystyki dla dnia dzisiejszego. Można też podać mu jako parametr datę, np:
python stats.py 2012-12-21
Przykładowy wynik działania wygląda tak:

Obecnie w czasach interfejsów napędzanych JavaScriptem coraz widoczniejszy staje się problem składowania danych w HTML-u. Prosty przykład: mamy generowany formularz, który chcemy zweryfikować za pomocą JavaScriptu. Przy generowaniu formularza posiadamy dla każdego pola zmienną mówiącą nam o tym czy to pole jest wymagane czy nie. I tu pojawia się problem, jak oznaczyć np. inputa jako pole wymagane? Struktura formularza nie daje nam miejsca na składowanie takich danych. Można kombinować z wrzuceniem jakiegoś słowa kluczowego do id. np:
id="required"
No ale id musi być niepowtarzalne, więc może klasa...
class="required"
Może, ale w sumie mam już tam kilka innych klas
class="specjalne kontrast required"
A więc czy klasa to na pewno dobre miejsce? Jasne że nie, klasa jest dla styli. No więc jak? Trzeba stworzyć własny atrybut! Niby jasne, ale przecież validator nie uznaje własnych atrybutów...
Otóż uznaje. Trzeba je tylko zadeklarować w definicji dokumentu - DTD (Document Type Definition). Załóżmy że chcemy wzbogacić nasz input w atrybut required. Wystarczy więc taka konstrukcja DTD:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[
<!ATTLIST input required CDATA #IMPLIED>
]>
Ta dekladacja zezwala atrybutowi required posiadać dowolną wartość znakową. Jeżeli chcielibyśmy ograniczyć wartość jedynie do dwóch pozycji wystarczy zastosować coś takiego:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[
<!ATTLIST input required (true|false) #IMPLIED>
]>
Ogólny schemat jest taki:
ATTLIST element atrybut typ opcjnonalnyStatus
No i gotowe. Teraz możemy zaprząc JavaScript do podjęcia odpowiednich działań na podstawie struktury dokumentu. Czyli np. w jQuery:
$('input[required='true']').PrzypilnujInteresu();
Prosto czysto i funkcjonalnie.
Materiał źródłowy:
http://www.alistapart.com/articles/customdtd/
PS. Remember remember the fifth of november...
Google preview to moja ulubiona wtyczka rozszerzenie dla Firefoksa, bez której wyniki wyszukiwania w Googlu po prostu nie wyglądają. Wstawia ona obok każdej pozycji miniaturkę strony, a ponieważ człowiek myśli obrazami więc o wiele szybciej można namierzyć szukaną witrynę. Niestety w przeglądarce Google Chrome (która ostatnio stała się moją podstawową przeglądarką) nic takiego nie istnieje. Istnieje już jednak system rozszerzeń (chociaż ukryty) oraz podstawowa dokumentacja, więc postanowiłem sam zapchać lukę.
Na początek przyda się nam developerska wersja Chroma (nie wiem czy wersja stabilna posiada tą funkcjonalność, jeżeli tak to niech mnie ktoś poprawi). Dla użytkowników ArchLinuksa polecam paczkę z AUR - google-chrome-dev.
yaourt -S google-chrome-dev
Aby uruchomić ukryty jeszcze mechanizm obsługi rozszerzeń należy uruchomić przeglądarkę z parametrem -–enable-extensions.
google-chrome -–enable-extensions
Teraz wystarczy już tylko pobrać przygotowane przeze mnie rozszerzenie i potwierdzić chęć instalacji
Od tej chwili możemy się już cieszyć pięknymi miniaturkami
O ile wszystko dobrze poskładałem to rozszerzenie powinno się samo aktualizować (w razie W). Jeżeli ktoś jest zainteresowany bebechami to dołączam pliki:
Listę zainstalowanych rozszerzeń znajdziecie wstukując do paska adresu chrome://extensions/
Jak każdy djangowic dobrze wie plik settings.py przechowuje wszelkie ustawienia aplikacji począwszy od nazwy strony a na listach middleware'u czy liście zainstalowanych aplikacji skończywszy. Ponieważ zawiera on wszelkie ustawienia, musi być inny dla developera a inny dla serwera produkcyjnego (np. z powodu tego, że developer ma DEBUG=True).
Pierwszą możliwością rozwiązania tego problemu jest ignorowanie pliku settings.py przez repozytorium kodu, tak aby różne zawartości tego pliku nie powodowały konfliktów. Wadą takiego rozwiązania jest potrzeba ręcznego edytowania tego pliku na serwerze kiedy np. dodajemy nową aplikację do INSTALLED_APPS. Moje repozytorium aktualizuje stronę na serwerze po każdym commicie, więc ręczna edycja settings.py jest męcząca.
Drugą możliwością jest stworzenie osobnych ustawień dla serwera i osobnych dla developera. Django umożliwia uruchomienie serwera z podaniem pliku ustawień jako parametr:
python manage.py runserver --settings=settings-developer.py
Wszystko wydaje się być ok. Jeżeli coś zmieniamy to dokonujemy zmiany w settings.py, settings-developer.py i po commitcie wszystko gra. Czasami jednak przy testowaniu różnych rzeczy w pliku developera można zapomnieć o settings.py i po commicie znowu strona jest rozwalona. Poza tym nie każdy developer korzysta z tych samych ustawień. Jeden używa Django Debug Toolbar inny ColorSQLMiddleware więc trzeba by zrobić tyle settings-xxx ilu developerów. A później przy zmianie czegoś globalnego edytować wszystkie...
Ostatecznym rozwiązaniem okazało się przeciążenie pliku settings.py przez ponowną deklarację zmiennych lub rozszerzenie już istniejących wartości. Jak to zrobić?
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
execfile('%s/settings-local.py' % BASE_DIR)
Teraz w pliku settings-local.py możemy ponownie zadeklarować zmienne które mają zostać przeciążone lub rozszerzyć zadeklarowane już w settings.py listy. Np. kiedy jeden z developerów chce użyć Django Debug Toolbar dodaje do settings-local.py taki kod:
MIDDLEWARE_CLASSES += (
'debug_toolbar.middleware.DebugToolbarMiddleware',
)
INSTALLED_APPS += (
'debug_toolbar',
)
DEBUG_TOOLBAR_PANELS = (
'debug_toolbar.panels.sql.SQLDebugPanel',
'debug_toolbar.panels.headers.HeaderDebugPanel',
'debug_toolbar.panels.cache.CacheDebugPanel',
'debug_toolbar.panels.profiler.ProfilerDebugPanel',
'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
'debug_toolbar.panels.templates.TemplatesDebugPanel',
# If you are using the profiler panel you don't need the timer
# 'debug_toolbar.panels.timer.TimerDebugPanel',
)
Plik settings-local.py wywalamy z repozytorium i w ten sposób otrzymujemy elastyczny mechanizm współdzielenia wartości globalnych przy jednoczesnej personalizacji ustawień lokalnych.
Ostatnio wpadł mi w ręce bardzo ciekawy moduł Pythona, który śmiało można określić jako jQuery po stronie serwera. Jeżeli potrzebowaliście kiedyś wyciągnąć jakieś dane z kodu HTML-a i denerwowała was zabawa z parsowaniem kodu za pomocą sgmllib czy innego tego typu wynalazku, to wasze cierpienia właśnie się skończyły.
Na początek pobierzemy zawartość jakieś strony, z której chcemy wyciągnąć dane. Ja posłużę się stroną antyweb.pl, ponieważ jest całkiem przystępnie zakodowana.
from pyquery import PyQuery as pq
import urllib
html = urllib.urlopen("http://antyweb.pl").read()
html = pq(html)
Teraz wystarczy już zadecydować co chcemy wyciągnąć i po prostu to zrobić :-) Np. informacje o autorze
print html("#f li.frt").text()
Wynik:
Witaj, nazywam sie Grzegorz Marczak i jestem autorem tego bloga. Piszę tutaj o serwisach spolecznosciowych, nowych technologiach i nowych trendach w internecie.
Wyciągnięcie wszystkich kategorii
for a in html("li.categories a"):
print a.text
Wynik:
antytydzień Biała flaga
Ciekawe strony
Świat
Miniblog
Mobilnie
Moje przemyślenia
Off topic
polska
Pytamy.pl
Startups
To mnie drażni.
Uncategorized
W trakcie tworzenia
wywiady
Wyszukanie najczęściej komentowanego wpisu ze strony głównej
max_comments = 0
title = ''
for a in html("ul.clnn li.l a"):
try:
# liczba komentarzy
comments = int(a.text.split(" ")[1])
if max_comments < comments:
max_comments = comments
# nazwa wpisu
title = a.values()[1].replace("Komentarze do wpisu ",'')
except:
pass
print "Najwiecej komentarzy: %s" % max_comments
print "Wpis: %s" % title
Wynik:
Najwiecej komentarzy: 32
Wpis: Interia mówi, tak kupujemy ruch (bo inni też tak robią)
To oczywiście tylko mała próbka możliwości. pyquery pozwala również na manipulację stylami (addClass, toggleClass, removeClass, attr, css) czy samą strukturą danych (append, prepend, prependTo, insertAfter, remove, replaceWith itd.). Jeżeli posiadamy moduł WebOb możemy też zaprzęgnąć do pracy Ajax.
Po więcej informacji zapraszam na stronę projektu pyquery.
Poniższy tekst jest tłumaczeniem oficjalnego przewodnika po nowej wersji Xfce 4.6:
Wizualny przewodnik po Xfce 4.6.0
Długo wyczekiwana wersja 4.6.0 środowiska graficznego Xfce wreszcie została wydana. Postaramy się wyszczególnić niektóre z nowych funkcji, które zostały dodane od czasu ostatniego stabilnego wydania.
Ulepszone użytkowanie pulpitu z Xfdesktop
Od czasu kiedy w wersji Xfce 4.4 pojawiły się ikony na pulpicie, ludzie chcieli mieć możliwość jednoczesnego zaznaczania wielu ikon. W Xfce 4.6 Xfdesktop wreszcie posiada tą funkcję: można zaznaczać wiele ikon, przesuwać je, usuwać itp.

Xfce 4.6 wprowadza całkiem nowe menu pulpitu, które pozwala zarówno na manipulowanie plikami tak samo jak menu kontekstowe Thunara, jak również na otwieranie aplikacji, zakończenie sesji czy dostęp do dokumentacji.

Panel
Wiele znanych od dawna błędów zostało naprawionych w panelu Xfce4, zwłaszcza wsparcie dla wielu monitorów. Nowe wydanie przynosi też wiele ulepszeń panelowych wtyczek.

Wtyczka zegara została całkowicie przepisana, aby zużywać jak najmniej zasobów systemowych oraz pozbycia się kilku błędów wyświetlania. Wprowadzony został również nowy tryb zegara dla geeków: zegar binarny! Nowa wtyczka obszaru powiadomień pozwala na ukrywanie wybranych ikon, aby zachować porządek i przejrzystość.
Nowy mikser dźwięku
Mikser Xfce4 został przepisany od zera aby używał Gstreamer-a. Umożliwia to łatwiejsze wsparcie dla wielu systemów dźwięku, interfejs użytkownika jest bardziej dopracowany oraz można zarządzać kilkoma różnymi kartami dźwiękowymi. Dodatkowo wtyczka panelu pozwana na szybką zmianę poziomu dźwięku przy użyciu rolki myszy.

Udoskonalony menadżer sesji
Xfce 4.6 posiada udoskonalony menadżer sesji: sesje powinny startować szybciej a okno dialogowe ustawień sesji zostało przerobione aby umożliwić łatwiejsze zarządzanie uruchamianymi aplikacjami. Dodatkowo menadżer sesji automatycznie zrestartuje sesyjne aplikacje, które się „wysypały”, tak aby w przypadku wystąpienia błędu nie pozostawić użytkownika bez pulpitu, paneli czy menadżera okien.

Nowy menadżer sesji zawiera również długo wyczekiwane funkcje: wsparcie dla uśpienia i hibernacji „out of the box”. Dialog zamykania sesji posiada teraz dwa dodatkowe przyciski umożliwiające uśpienie i hibernację komputera.

Menadżer okien
Jak zwykle Xfwm4 dojrzał nieco podczas tego cyklu dystrybucyjnego: wiele błędów zostało poprawionych, dodano wsparcie dla wielu monitorów oraz ogólne osiągi zostały poprawione.
W nawiązaniu do kilku innych nowych funkcji, Xfwm4 potrafi teraz wykryć okna, które nie odpowiadają i zaoferować zabicie ich.

Pojawiło się również nowe menu, które pozawala na szybkie przesuwanie i zmianę rozmiaru okien, przemieszczenia ich na wierzch czy pod spód względem innych okien oraz przełączenie ich w tryb pełnoekranowy.

Zaimplementowana została nowa funkcja wypełniania: powiększa ona wybrane okno tak, aby zajmowało jak największą przestrzeń lecz bez przysłaniania sąsiednich okien.

Kompozytor został zoptymalizowany tak, aby zredukować miganie okien podczas zmiany ich rozmiaru.

Rozszerzono również niektóre opcje: np. można wyłączyć miganie okien gdy te otrzymują jakieś zdarzenie.

Menadżer plików
Naprawiono wiele błędów oraz poprawiono osiągi Thunar-a. Można teraz używać przycisków „naprzód” i „wstecz” na myszce (o ile są włączone) aby nawigować. Dołączono też nową wtyczkę, która pozwala na ustawienie tapety pulpitu z menu kontekstowego obrazka.

Thunar korzysta teraz ze słownika specyfikacji użytkowników – XDG. Pozwala to na wskazanie i oznaczenie folderów użytkownika tj. muzyka, dokumenty, wideo, szablony itd.

Thunar potrafi teraz wyświetlać półprzezroczyste ikony dla dysków i woluminów, które nie są zamontowane, więc można je teraz łatwo odróżnić od pozostałych.

Thunar obsługuje teraz szyfrowane urządzenia!

Nowe okno konfiguracji
Xfce 4.6 wprowadza nowe okno konfiguracji interfejsu – Xfce Settings Manager – które umożliwia konfigurację środowiska graficznego dużo łatwiej niż poprzednio. Nowe okno konfiguracji dostępne jest poprzez pojedyncze kliknięcie na ikonkę ustawień i zaprojektowane zostało jako bardziej jednolite, pozwalające szybciej oraz bardziej intuicyjnie konfigurować środowisko.

Ustawienia dostępności

Okno ustawień dostępności pozwala na konfigurację opcji związanych z klawiaturą i myszą tj. modyfikacja zachowania klawiszy funkcyjnych, czas powtarzania klawiszy, minimalny czas przytrzymania klawiszy, odstęp pomiędzy kolejnymi powtórzeniami czy emulacja myszy.

Ustawienia wyglądu
Okno ustawień wyglądu pozwala na dobór styli elementów sterujących, wyglądu ikon i czcionek, pasków narzędzi oraz wyglądu menu.

Okno ustawień wyświetlania pozwala na dobór rozdzielczości ekranu, częstotliwości odświeżania oraz rotacji każdego podłączonego ekranu.
Ustawienia klawiatury

Ustawienia klawiatury pozwalają na dorób opcji związanych z powtarzalnością klawiszy, skrótami klawiaturowymi oraz układem klawiatury.

Konfiguracja skrótów klawiszowych odbywa się teraz o wiele łatwiej a wszelkie konflikty skrótów są natychmiast wykrywane.
Ustawienia myszy

Okno ustawień myszy pozwala na konfigurację myszy podłączonej do komputera: kolejność klawiszy, akcelerację, prędkość podwójnego kliknięcia, wygląd kursora itp.
Ustawienia pulpitu

Okno ustawień pulpitu jest obecnie znacznie bardziej ujednolicone. Pozwala ono na konfigurację dla każdego ekranu: tapety, jasności, menu pulpitu, wyświetlanych ikon itp.
Nowy wyszukiwacz aplikacji
Xfce 4.6 posiada również całkiem nowy wyszukiwacz aplikacji odznaczający się przejrzystym interfejsem. Posiada również ulepszenie wyszukiwania aplikacji przy użyciu klawiatury oraz na bieżąco monitoruje zainstalowane aplikacje, dzięki czemu potrafi „w locie” uaktualnić listę aplikacji. Pozwala również na łatwiejsze tworzenie aktywatorów w panelu poprzez przeciągnięcie ikony aplikacji do okna kreatora aktywatorów.

Linki
Zasługi
Kronikarskim obowiązkiem melduję pojawienie się nowej wersji mojego ulubionego edytora Geany.
Ważniejsze zmiany:
Pełną listę zmian znajdziecie w Release Notes (nie mam pomysłu jak to przetłumaczyć :-P)
Zachęcam również do zaglądnięcia w sekcję Extras na stronie projektu, gdzie znajdziecie między innymi snippety PHP, HTML oraz Pythona. Jest tam również mój ulubiony schemat ciemnych kolorów…

...czy inne ciekawe wynalazki typu edytor schematów kolorowania składni on-line.
Aktualnie w polskim prawie nie ma przepisu zabraniającego nagrywania audycji radiowych. Oznacza to, że całkowicie legalnie możemy wejść w posiadanie sporych zbiorów muzyki. Nie każde radio jednak gra to czego chcielibyśmy słuchać. I tu pojawia się Last.fm – radio, które zna nasz gust i gra to co lubimy. Tylko jak teraz dobrać się do tej muzyki?
Odpowiedzią jest program TheLastRipper. Małe ale skuteczne narzędzie, pożerające adresy typu lastfm://. Wystarczy wskazać mu katalog, do jakiego ma rippować muzykę oraz stację.

Rezultatem działania TheLastRippera będą utwory znajdujące się w ładnie nazwanych katalogach (wg. schematu wykonawca > album > utwór) oraz pobrane okładki albumów w trzech rozmiarach.

Trzy rozmiary okładek mogą przeszkadzać. Np. mój QuodLibet przy odtwarzaniu utworu wybiera akurat najmniejszą okładkę co nie wygląda najlepiej. Ale łatwo można temu zaradzić. Wystarczy w katalogu z muzyką utworzyć skrypt zawierający:
find ./ -type f \( -name "SmallCover.jpg" -o -name "MediumCover.jpg" \) -delete
który usunie małe i średnie okładki z wszystkich podkatalogów.
Użytkownicy Archa aby pobrać pogram mogą skorzystać z aktualnego PKGBUILDa, który zamieszczam poniżej, ponieważ ten obecnie znajdujący się w AUR jest przestarzały.
PKGBUILD for version 1.1.1
pkgname=thelastripper
pkgver=1.1.1
pkgrel=1
pkgdesc="A Last.FM Ripper"
arch=('i686')
url="http://thelastripper.com/"
license=('GPL')
depends=('gnome-desktop-sharp' 'gnome-icon-theme')
makedepends=('pkgconfig')
source=("http://thelastripper.googlecode.com/files/$pkgname-$pkgver.tar.gz")
md5sums=('9a8653cc0cf450077b599cb8988ba8a3')
build() {
export RSVG_SHARP_20_CFLAGS="/usr/share/rsvg2-sharp/2.0/rsvg2-api.xml"
export RSVG_SHARP_20_LIBS="/usr/lib/mono/rsvg2-sharp-2.0/rsvg2-sharp.dll"
cd $startdir/src/$pkgname-$pkgver
# Bypass GMCS and fakeroot bug
mkdir -p $startdir/src/$pkgname/.wabi
export MONO_SHARED_DIR="$startdir/src/$pkgname/"
./configure --prefix=/usr
make || return 1
make DESTDIR=$startdir/pkg install
}
W ostatni czwartek zdarzyło mi się wynająć w ovh.pl prywatny serwer RPS I. Miał on służyć testom nowego startupa. Docelowa grupa testerów (około 80 osób), Celeron 1,2 GHz, 512 RAM, Łącze 100 Mbps bez limitu transferu, dysk 10 GB i 50 zł miesięcznie. Dobry serwer do testów można by rzec. Można by… ale:
Prywatne RPSy to rozwiązanie „ekologiczne” i tanie. Aby takim było żadna z maszyn nie posiada fizycznego dysku. Dane przechowywane są na wielkiej, wspólnej macierzy dyskowej dostępnej przez sieć za pomocą NFSa lub iSCSI.
Z grubsza powinno to działać tak:

Ale działa niestety tak:

Mały dowód:
$ time ls /sbin/
real 0m41.424s
user 0m0.008s
sys 0m0.004s
dla porównania mój laptop
$ time ls /sbin/
real 0m0.071s
user 0m0.000s
sys0 m0.003s
Dysk praktycznie nie istnieje a serwer staje się przez to zupełnie nieużyteczny. Nie żeby był to odosobniony przypadek. Wystarczy poczytać ten wątek na forum aby się o tym przekonać.
Na RPSa zdecydowałem się, bo słyszałem, że problemy z dyskami już ustały. Otóż nic podobnego! Od następnego miesiąca przesiadam się na serwer dedykowany z własnym dyskiem. Pewnie skończy się na Kimsufi w opcji L. Chyba, że polecacie coś lepszego w podobnej cenie.
Podsumowując:
Ostatnio rozglądałem się za tutorialem do budowy prostego gadżetu w Pythonie, który siedział by sobie na przezroczystym tle na moim pulpicie. Gadżety Screenlets czy gDesklets działają różnie, zazwyczaj niestabilnie albo, któryś (akurat przydatny) całkowicie się nie odpala. Poza tym potrzebowałem coś maksymalnie prostego a nie całej platformy dla gadżetów.
Wpadłem więc dziś na pomysł wykorzystania Tildy jako ładnego kontenera. W zasadzie to do pełni szczęścia potrzebne były dwie paczki: tilda i python-feedparser. Znajdziecie je w każdej dystrybucji. Dla archowców:
# pacman -S tilda python-feedparser
Tildę najlepiej skonfigurować następująco:
W sekcji Command w polu Custom Command umieszczamy adres skryptu, ale o tym za chwilę.
Teraz czas na Pythona. Wystarczy sworzyć malutki skrypt o takiej treści:
#! /usr/bin/env python
import feedparser
import time
import os, sys
# nieskonczona petla
while 1:
# pobierz RSS
feed = feedparser.parse("http://jogger.pl/rss/")
# wyczysc ekran
sys.stdout.write(os.popen('clear').read())
# dla kazdego wpisu
for note in feed['entries']:
# wypisz tytul
print "- %s" % note['title']
print "\nhttp://jogger.pl/"
# odczekaj 60 sekund
time.sleep(60)
Skrypt wystarczy zapisać np. jako jogger.py i wpisać ścieżkę do niego w polu Custom Command. W moim przypadku jest to:
python /home/tomek/go/python/jogger.py
I to by było na tyle. Po ponownym uruchomieniu Tildy powinniśmy mieć ładny przegląd wydarzeń na joggerze odświeżany co 60 sekund. Gdy coś nas zainteresuje wystarczy przytrzymać ctrl i kliknąć link do joggera.

Oczywiście może to być dowolny kanał RSS/Atom czy coś zupełnie innego np. statystyki obciążenia naszego serwera. Żadnych tam Googlowych gadżetów z tysiącem funkcji. Prosto łatwo i przyjemnie.
Już dawno miałem o nim napisać notkę jednak zawsze gdzieś mi to uciekało. Ale nie tym razem.
Język dot służy do opisywania schematów za pomocą tekstu. Pewnie brzmi to niewyraźnie, dlatego od razu przejdźmy do konkretów. Aby skorzystać z dobrodziejstw języka dot instalujemy pakiet graphviz.
# pacman -S graphviz
Następnie otwieramy nasz ulubiony edytor tekstu i zaczynamy pisać:
digraph linux {
Linux -> Debian;
Linux -> "Red Hat";
Debian -> Ubuntu;
Debian -> Knoppix;
Ubuntu -> Kubuntu;
Ubuntu -> Edubuntu;
Ubuntu -> Xubuntu;
"Red Hat" -> Mandrake;
"Red Hat" -> Fedora;
Mandrake -> Mandriva;
}
Tak przygotowany plik zapisujemy jako test.dot A teraz najlepsza część, czyli budujemy schemat
$ dot -Tpng test.dot -o test.png
TIP: Pliki możemy eksportować również do innych formatów
W efekcie powinniśmy otrzymać plik test.png, który wygląda tak:

Narysowanie czegoś takiego w Inkscape pewnie zajęło by Wam kilka minut więcej. Najlepszą według mnie zaletą języka dot jest to, składa on się ze zwykłego tekstu, dzięki czemu w łatwy sposób możemy generować te pliki przez różne mechanizmy. Np. jeżeli mamy bazę danych firmy gdzie jakaś tabela obrazuje zależności pomiędzy przełożonymi a podwładnymi wówczas możemy szybko napisać skrypt w PHP czy Pythonie, który z pomocą tej tabeli wygeneruje nam plik dot a następnie utworzy z niego ładny schemat.
Na tym jednak nie koniec. Język dot to prawdziwe bogactwo kształtów grotów i kolorów. Za pomocą kombinacji różnych tych elementów możemy dokładnie zamodelować to co chcemy.

Więcej przykładów znajdziecie w galerii.
Od dawna chciałem już zrobić coś związanego z kamerą. W tym semestrze nadarzyła się okazja i zaproponowaliśmy prowadzącemu własny temat projektu z przedmiotu o nazwie „struktury systemów informatycznych”. Naszym zamierzeniem było stworzenie programu, który działałby podobnie jak gesty wykonywane myszą w Firefoksie tyle, że rolę myszki odegrać miała kamera. Założenia wstępne: platforma – Linux, język – Python.
Najwięcej problemów sprawiła nam sama kamera, a dokładniej to zbieranie i przetwarzanie jej obrazu.
Na początku zabraliśmy się za testowanie reacTIVision, które w zasadzie jest oprogramowaniem dla ekranów wielodotykowych. ReacTIVision ma swoją bibliotekę 89 symboli, które potrafi rozpoznać określając ich numer id, pozycję x-y, kąt nachylenia a nawet przyśpieszenie.
Działo to całkiem sprawnie. Jeżeli wykonaliśmy szybszy ruch markerem, a dokładniej przyśpieszenie markera przekroczyło pewną granicę, wówczas rozpoczynał się rysować gest. Wadą jednak tego rozwiązania były markery. Jeżeli nie miało się markera to program był bezużyteczny. Trzeba było więc go zastąpić czymś co ma każdy, np. ręką :-)
Do łapania obrazu z kamery tym razem wykorzystaliśmy moduł Pythona pyvideograb. Znaleźliśmy nawet bardzo przydatny skrypt, który wykrywał punkty ruchu w obrazie poprzez porównywanie dwóch sąsiednich klatek. Co prawda autorzy zaznaczyli, że działa tylko pod Windowsem z uwagi na moduł do przychwytywania obrazu z kamery, ale ten łatwo można było podmienić.
Teraz wystarczyło wrzucić wszystko do Pygame’a i już pierwsze efekty były widoczne.

Program wykrywał ruch i potrafił określić współrzędne punktu ruchu, co w przypadku poruszającej się większej powierzchni oznaczało jej środek.
Po naciśnięciu spacji możemy już wykonywać gest.

Następny etap to sieć neuronowa a dokładniej sieć Hopfielda. Dzięki niej jesteśmy w stanie rozpoznać, czy wykonany gest zgadza się z jednym z 4 wzorców. Jeżeli tak, wykonywane jest przypisane do niego polecenie.
W konsoli wygląda to tak:
W tej chwili program ma wprowadzone 4 wzorce (plik: patterns.txt)

Przypisane do nich działania można łatwo edytować (interfejs.py)
Jeżeli ktoś miał by ochotę się tym pobawić lub zrobić z tym coś więcej to proszę bardzo.
Projekt – 4.5, radość ze zrealizowanego pomysłu – bezcenna ;-)
Współautorzy:
– Marek Knaga
– Jarosław Miazga
UPDATE: ponieważ strona projektu pyvideograb od jakiegoś czasu jest martwa zamieszczam spakowany moduł pyvideograb.tar.gz
Odkąd zagościł u mnie dżin używam tylko jego. Jest szybki i ma wszystko czego mi trzeba. No może prawie wszystko. Brakowało mi tylko snippetów czyli po polsku wstawek. To ostatnia rzecz jakiej brakowało mi do szybkiej i efektywnej pracy. Bo co klepać linie kodu, kiedy można klepnąć tabulator :-)
Co jakiś czas sprawdzałem czy pojawiła się już odpowiednia wtyczka zapewniająca taką funkcjonalność, ale póki co nadal jest to tylko pozycja na liście życzeń. Dopiero wczoraj znalazłem w dokumentacji, że większość jest już zrobiona !
W katalogu w którym zainstalował się Geany znajdziecie plik snippets.conf. U mnie pełna ścieżka to:
/usr/share/geany/snippets.conf
Teraz wystarczy skopiować go do naszego katalogu domowego:
$ cp /usr/share/geany/snippets.conf ~/.geany/
I już możemy dodawać do niego dowolne wstawki. W bloku [Special] możemy zadeklarować słowa kluczowe, których będziemy używać przy tworzeniu naszych wstawek. Np. żeby nie powtarzać często ładnego otwarcia bloku kodu {} deklarujemy to raz:
klamry=\n{\n\t\n}\n
a następnie możemy używać tego słowa kluczowego przy deklaracji naszych wstawek:
[PHP]
for=for ($i = 0; $i < %cursor%; $i++)%klamry%
Na początek zadeklarowałem sobie kilka wstawek z HTML-a. Jeżeli ktoś chce to niech się częstuje:
wget http://citizen.ovh.org/stuff/snippets.conf -O ~/.geany/snippets.conf
Efekt działania
Niedawno Google wypuściło bardzo fajną rzecz. Usługa nazywa się Google Sites i jest częścią aplikacji przeznaczonych dla własnej domeny (Google Apps for Your Domain). Nie będę tutaj opisywał całości funkcjonalności, bo pewnie do wieczora bym nie skończył. Trzeba zobaczyć to na własne oczy i samemu poklikać.
Na początek filmik
Teraz należy udać się na kilka przykładowych stron: Company intranet, Team project, Employee profile, Classroom.
Myślę, że jest to świetna usługa dla wszelkiego rodzaju projektów. Szkoda że Google Code nie ma takiej funkcjonalności. Z minusów jakie zauważyłem to niewątpliwym jest brak możliwości komentowania przez odwiedzających. Taką możliwość mają tylko osoby kolaborujące. Mam nadzieję, że wkrótce jakoś to naprawią bo wpływa to w znacznym stopniu na feedback ze strony użytkowników.
Kolejna cześć sagi „zaktualizowałem jądro i sieciówka się posypała”. Próba skompilowania mojego ostatniego wydania sterowników kończy się błędem
scripts/Makefile.build:46: *** CFLAGS was changed in „src/Makefile”. Fix it to use EXTRA_CFLAGS. Stop.
Natomiast próba zbudowania paczki z AUR kończy się dla odmiany innym ;-)
atl2_main.c:1451: error: implicit declaration of function ‘SET_MODULE_OWNER’
Sterowniki z AUR naprawić jednak łatwo. Wystarczy wyedytować plik atl2_main.c i posłać linię 1451 w krzaki
...
netdev = alloc_etherdev(sizeof(struct atl2_adapter));
if(!netdev) goto err_alloc_etherdev;//SET_MODULE_OWNER(netdev);
SET_NETDEV_DEV(netdev, &pdev->dev);pci_set_drvdata(pdev, netdev);
adapter = netdev_priv(netdev);
...
Wersja dla leniwych: atl2-2.0.3.tar
Po rozpakowaniu wchodzimy do katalogu i czarujemy
# make
# cp atl2.ko /lib/modules/2.6.24-ARCH/kernel/drivers/net/
# modprobe atl2
i powinno działać
Pacnet jest próbą kategoryzacji pakietów z repozytoriów Arch Linuksa zgodnie z kategoriami używanymi przez Gentoo Portage. Na chwilę obecną znajduje się tutaj 4138 pakietów z repozytoriów core, extra i community.
Jeżeli zauważycie, że jakiś pakiet znajduje się w niewłaściwej kategorii, nie czujcie się skrępowani żeby ją zmienić. Pakiety mogą być niewłaściwie przypisane do kategorii, ze względu na rozbieżności w nazewnictwie pomiędzy obiema dystrybucjami.
Liczę na to, że z Waszą pomocą doprowadzimy szybko to repozytorium do porządku i co najważniejsze – przydatności.
Ostatnio wiele serwisów donosiło o nowym wydaniu (v1.0) programu do obsługi kamer – wxCam. Żaden nie wspomniał jednak że w nowej wersji dodano bardzo interesującą funkcję – nagrywanie przy wykryciu ruchu. Ale po kolei.
W repozytorium Archa paczki nie ma, nie ma też nic w AUR. Trzeba radzić sobie samemu. Główne wymagania to:
Revel kompilujemy standardowo:
# ./configure
# make
# make install
CImg kompilujemy tak:
cd examples
make olinux
w wyniku tego katalog wyżej powstanie nam pliczek CImg.h, który należy skopiować do katalogu ze źródłami wxCam.
wxCam kompilujemy standardowo:
# ./configure
# make
# make install
Gotowe. Teraz polecenie wxcam powinno odpalić nam program.
Klikamy Capture > Show movement detection areas i zaznaczamy interesujący nas obszar
Następnie klikamy Capture > Movement detection i możemy już rozpocząć nagrywanie. W przypadku braku ruchu nagrywanie powinno się automatycznie zatrzymać.
Przykład:
Możliwe jest też zaznaczenie kilku obszarów
Chociaż wxCam nie ma żadnego API do którego można by podpiąć jakiś „alarm” to jednak łatwo to zrobić. Wystarczy tylko napisać skrypt monitorujący wielkość pliku do którego nagrywany jest obraz. Jeżeli plik zacznie się zwiększać oznaczać to będzie, że wykryto ruch i można wykonać jakieś działanie.
Dodatkowo wxCam oferuje kilka filtrów obrazu np.:
i kilka innych
W związku z ostatnimi zmianami loga Archa postanowiłem dopracować mój laptopowy system i dogonić Ubuntu w estetyce startu systemu. W tym celu zainstalowałem wynalazek o nazwie Splashy który ładnie maskuje kilobajty tekstu generowanego przy starcie przykrywając je ładnym obrazkiem. W tym miejscu opisałbym instalację, ale dobrzy ludzi już to zrobili więc tylko zlinkuję
Uwaga! Przy instalacji podmienianych jest kilka plików konfiguracyjnych w /etc/ np. rc.conf zostaje zastąpiony nowym a stary zapisywany jest jako rc.conf.pacsave więc nie zapomnijcie przywrócić starych plików przed ponownym uruchomieniem.
Po instalacji możemy zabrać się za zmianę motywu. Ja używam takiego
# splashy_config -i archer-black-splashy.tar.gz
Ponieważ zmiana motywu jest zmianą w konfiguracji musimy przebudować jądro
# mkinitcpio -p kernel26
Teraz wystarczy jeszcze zadbać o menadżer logowania. W moim przypadku jest to taki motyw dla Slima. Kopiujemy zawartość archiwum do /usr/share/slim/themes/, edytujemy plik /etc/slim.conf i zmieniamy current_theme
current_theme archer-black
I tapetka
Całość prezentuje się tak:
(wiem trochę słabo widać, ale lepiej się nie udało)
Na koniec żeby nie było za słodko, mały błąd. Po instalacji Splashy w górnym menu pojawiły mi się dziwnie skupiska małych kreseczek
Temat jest znany i prawdopodobnie jest to bug. Jednak w moim przypadku nie jest on zbyt uciążliwy.
Ostatnio zaczynam mieć dość webowych aplikacji. Oglądanie wszystkiego w przeglądarce nie zawsze jest wygodne, no i nie zawsze szybkie zważywszy na ilość rozszerzeń jakie wcieliłem do Firefox-a. Czasami też wyłączam okno przeglądarki zapominając, że w któreś z zakładek siedzi coś co np. odtwarza muzykę z Jamendo. Do webaplikacji Googla używam już od jakiegoś czasu Prisma. Działa to lepiej ale nadal nie jest to /to coś/ czego szukam. Jeżeli mogę staram się używać aplikacji natywnych np. Gmail via Thunderbird (przez IMAP) czy Google Calendar via Lightning (rozszerzenie do Trunderbird-a). Aplikacje webowe mają jednak bardzo dobrą cechę – są mobilne. Nie mając naszych ulubionych aplikacji pod ręką i tak zawsze się do nich dostaniemy choćby przez tfu IE tfu.
Dzisiaj trochę bawiłem się PyGTK wynikiem czego wykombinowałem mały skrypt. Sam się zdziwiłem jak można łatwo ubierać strony w jakieś natywne GUI. Poniższy skrypt jest zwykłym oknem przeglądarki opartej na gtkmozembed tyle, że potrafi schować się do ikonki w zasobniku systemowym dzięki czemu świetnie sprawuje się już jako odtwarzacz moich ulubionych utworów z Jamendo.
Przy pierwszym uruchomieniu należy się zalogować w serwisie (nowej wersji serwisu), a przy następnych od razu ładowany będzie ichniejszy player.
Skrypt: jtip.py
Odpalamy standardowo jak na pythona przystało:
$ python jtip.py
Oczywiście skrypt łatwo wykorzystać do obsługi innej strony.
BTW: Kiedy ktoś zrobi wtyczkę do QuodLibet obsługującą Jamendo ?
BTW2: Jak spowodować aby klikanie na krzyżyk chowało aplikację do ikonki w zasobniku? W moich próbach okno niby udało mi się ukryć nie wyłączając aplikacji, ale dźwięk się urywał a po kliknięciu na ikonkę w zasobniku przywracało się gołe okno.
Jakiś czas temu pojawił się u mnie router WiFi, a ponieważ chciałem uchronić moje łączę przed wiszącą na nim połową osiedla musiałem transmisję poddać szyfrowaniu.
Router D-link 524, całkiem fajny

O ile otwarte sterowniki bcm43xx dobrze radziły sobie z transmisją otwartą to jednak o szyfrowaniu można było pomarzyć. Musiałem więc poszukać czegoś innego i tutaj z pomocą przyszedł NDISwrapper Ogólnie rzecz ujmując potrafi on emulować sterowniki kart sieciowych napisane dla Windowsa tak, aby działał pod Linuksem.
Instalacja NDISwrapper-a jest dość prosta. Na początek musimy się pozbyć dotychczasowego sterownika bcm43xx jeżeli go używamy. Można zrobić to usuwając pakiet lub dodając go do czarnej listy modułów, tak aby nie był ładowany przy starcie systemu. W Archu czarna lista znajduje się w pliku /etc/rc.conf i dodanie do listy wyglądało by np. tak:
MOD_BLACKLIST=(asus_acpii bcm43xx)
Następnie instalujemy NDISwrapper-a. Każda szanująca się dystrybucja powinna mieć odpowiednie paczki w swoim repozytorium. Zazwyczaj są to dwie paczki: ndiswrapper i ndiswrapper-utils. W Archu wygląda to tak:
# pacman -S ndiswrapper ndiswrapper-utils
Po instalacji sięgamy po płytkę ze sterownikami do naszej karty sieciowej i ładujemy odpowiedni plik do NDISwrapper-a.
# ndiswrapper -i bcmwl5.inf
# ndiswrapper -l
# modprobe ndiswrapper
# ndiswrapper -m
Jeżeli jednak nie mamy sterowników możemy je pobrać z sieci. Trzeba tylko dokładnie wiedzieć jaki numerek ma nasza karta sieciowa. Dowiedzieć można się tego wydając takie magiczne zaklęcie:
# lspci -n | egrep '14e4:43(06|07|11|12|18|19|21|24|25|28)'
Następnie mając numerek karty możemy pobrać odpowiedni plik. Dokładna listę które numerki pasują do których strowników znajdziecie w helpie Ubuntu
Jak już pisałem ostatnio po aktualizacji jądra do wersji 2.6.23 całkowicie wysypała mi się karta sieciowa Attansic L2. Kompilacja sterowników zatrzymywała się na błędzie informującym o nieznanej funkcji eth_copy_and_sum. Z pomocą przyszedł jednak rlblaster i chociaż trafił na notkę pewnie przypadkiem i zupełnie nie miał pojęcia o języku polskim to jednak podpowiedział jak rozwiązać błąd. Wyżej wymieniona funkcja została pewnie usunięta z nowej wersji jądra, dlatego musimy napisać ją sami. A wygląda to mniej więcej tak:
Około linii 243 w pliku at_main.c dopisujemy taką oto funkcję:
void eth_copy_and_sum(struct sk_buff *dest, unsigned char *src, int length, int base)
{
memcpy(dest->data, src, length);
}
Dzięki temu zabiegowi błąd z nieznaną funkcją zostaje zażegnany. Pozostaje co prawda problem z dwiema innymi funkcjami ale jak przeczytałem na jednym z blogów wystarczy zakomentować wnętrze tych funkcji pozostawiając tylko komendę return.
Tak załatany sterownik zaczął działać, ale szybko zauważyłem, że zamiast przepustowości rzędu 2000 kbps wyciąga około 50 kbps. Wróciłem więc do kodu sterownika i zacząłem grzebać dalej. Okazało się, że w nowym jądrze zmianie uległa też nazwa innej funkcji. Rozwiązaniem było zastąpienie odwołań do:
vlgrp->vlan_devices[vid]
na:
vlgrp->vlan_devices_arrays[vid]
zamiast komentować ciała funkcji które zawierają te linie.
Teraz sieciówka działa już pełną parą.
Wersja dla leniwych: atl2.tar
Po rozpakowaniu wchodzimy do /src/ i wydajemy komendy
# make && make install
A później ładujemy sterownik
# modprobe atl2
Zaczęło się od tego, że wtrąciłem mały offtopic w temacie o uploaderze dla Picasa Web, kiedy tu znienacka zjawił się Marek Wiewórski z gotowym rozwiązaniem
Ale od początku. Do skryptu potrzebna będzie nam biblioteka flickyou Wystarczy że pobierzemy ją z na dysk, rozpakujemy, wejdziemy do katalogu i wpiszemy:
# python setup.py install
Flickyou do działania potrzebuje też innego modułu pythona — simplejson. Jeżeli więc go jeszcze nie posiadamy to:
# emerge -av dev-python/simplejson
Aby połączyć się z API serwisu Flickr należy zdobyć dwa klucze – key i secret, czego możemy dokonać na tej stronie
Kiedy mamy już klucze tworzymy w katalogu domowym plik .flikr.cfg o następującej strukturze:
[Auth]
api_key: KLUCZ_KEY
secret_key: KLUCZ_SECRET
Oczywiście zamiast KLUCZ_KEY i KLUCZ_SECRET wstawiamy odpowiednie numerki.
Teraz zabierzmy się za skrypt właściwy Nadajmy mu prawa do wykonania:
# chmod +x flickr.py
I przenieśmy do /usr/bin/ aby był widziany jako polecenie
# mv flickr.py /usr/bin/flickr
Od tej chwili mamy prawie działający skrypt. Prawie bo czeka nas jeszcze pierwsze uruchomienie. A wygląda to najprościej jak można.
$ flickr jakis_plik.png
Teraz jeżeli wszystko zrobiliśmy dobrze pozostaje nam potwierdzenie autentyczności programu posługującego się naszym kluczem API. Powinna otworzyć nam się przeglądarka tekstowa a naszym zadaniem jest zalogowanie się do serwisu Flickr i kliknięcie na link zezwalający naszemu skryptowi na korzystanie z API. Dokładniej wygląda to tak, że po zalogowaniu klikamy w jeden redirect a na następnej stronie znajdziemy już na środku link zezwalający. Po całej operacji można już zamknąć przeglądarkę i gotowe! Nasz skrypt powinien już działać jak należy.
Jak widać skrypt do razu podaje nam linki do miniaturki oraz pełnego rozmiaru. Po prostu idealne do zastosowania blogowego lub gdy chcemy szybko komuś pokazać jakiś screen.
Jako że przeniosłem się na gibkie Xfce wypadałoby skorzystać z jego zalet. Sprawa jest banalnie prosta. Odpalamy Thunara i klikamy Edycja > Konfiguruj akcje… Tutaj znajdziemy małe okienko gdzie dodamy upload grafiki na Flickr. Klikamy w plusik i wpisujemy co następuje:
nazwa: Flickr
Opis: Upload grafiki na Flickr
Polecenie: flickr.py %F > /tmp/flickr && geany /tmp/flickr
Ikonka: Ściągamy z http://yourkee.com/icon/flickr.png

Tutaj małe objaśnienie samego polecenia. Symbol %F wstawia nam ścieżki do wszystkich plików, które zaznaczymy w Thunarze. Jednak, jeżeli nie odpalimy całego polecenia w terminalu, to nie będziemy mieli podglądu na wyświetlane linki do miniaturki i pełnej grafiki, co nam się nie podoba ;-) Przekierujemy więc wyjście całego polecania do pliku /tmp/flickr a następnie, po zakończeniu uploadu otwieramy go naszym ulubionym edytorem. W moim przypadku jest to Geany ale równie dobrze możecie zrobić to Geditem czy czymkolwiek innym.
Teraz przechodzimy do zakładki Warunki pokazywania i zaznaczamy tam Pliki graficzne

Integracja zakończona! Teraz w Thunarze po kliknięciu prawym przyciskiem myszy na jakiś plik graficzny w menu kontekstowym powinniśmy widzieć opcję Flickr. Możemy też zaznaczyć w ten sposób kilka plików graficznych i wrzucić je jednocześnie.
Mirage czyli przeglądarka grafiki, o której wspomniałem ostatnio ma podobnie jak Thunar możliwość definiowania własnych czynności. Wystarczy kliknąć Modyfikuj > Własne czynności > Konfiguruj. Na tej samej zasadzie możemy więc dorobić tutaj upload na Flickr. Mamy możliwość, a nawet musimy przypisać każdej nowej akcji odpowiedni skrót klawiszowy. Ot taka dbałość o wygodę użytkownika ;-). Ja sobie przypisałem Ctrl+Shift+F
To by było na tyle. Miłego użytkowania i podziękujcie Markowi
PS. O konsolowym uploaderze do Picasa Web pisałem wcześniej
Dwa dni temu postanowiłem zrealizować wreszcie mój pierwotny pomysł na linuksa czyli Gentoo+Xfce4. Pokrótce więc opowiem jak to przebiegło.
Żeby usunąć Gnoma najpierw należy pozbyć flagi gnome z wszelkiego oprogramowania jakie jej używa. W moim przypadku wystarczyło z make.conf wywalić globalną flagę gnome.
# vim /etc/make.conf
Należy się też upewnić czy flaga gnome nie występuje przypadkiem w pliku package.use
# vim /etc/portage/package.use
Robimy tak dlatego, aby po usunięciu oprogramowania, wywołanie revdep-rebuild nie przywróciło nam wszystkiego, o co prosić będą programy posiadające ową flagę. Po usunięciu flagi musimy przekompilować world.
# emerge -avuDN world
Teraz zabieramy się za właściwe usuwanie. Potrzebny będzie nam tutaj programik eix służący do szybkiego przeszukiwania pakietów. Jeżeli jeszcze go nie mamy to
# emerge -av eix
A następnie tworzymy bazę informacji o pakietach
# update-eix
Sprawdzamy teraz jakie pakiety mają zostać usunięte
# eix -C -I gnome | grep "\[I\]" | awk '{print $2}' |xargs emerge -pC
No i wreszcie usuwamy Gnoma
# eix -C -I gnome | grep "\[I\]" | awk '{print $2}' | xargs emerge -C
Po wszystkim sprawdzamy czy nie uszkodziliśmy jakiś zależności
# revdep-rebuild
Więcej: gentoo-wiki
Teraz instalujemy główne środowisko Xfce4
# emerge -av xfce4
Oraz kilka dodatków
# emerge -av xfce4-extras
Więcej: gentoo-wiki
Jako że moim założeniem była maksymalna szybkość, lekkość i zwiewność to pozbyłem się również GDM-a i zamieniłem go na lekkiego SLiMa No bo po co mi np. możliwość zdalnego logowania i inne bajery skoro i tak ich nie używam.
# emerge -av slim
Dodamy też klika motywów
# emerge slim-themes
Plik konfiguracyjny znajdziemy tutaj
# vim /etc/slim.conf
Sprawdźmy w nim czy nasza sesja xfce znajduje się na liście sesji
sessions xfce4,icewm,wmaker,blackbox
Jest, czyli wszystko gra. Domyślnie będziemy logowani do xfce a w razie potrzeby możemy zmienić sesję naciskając F1 podczas logowania.
Listę dostępnych motywów znajdziemy tutaj:
# ls /usr/share/slim/themes/
Jeżeli chcemy zmienić motyw wystarczy w pliku konfiguracyjnym Slima podać właściwą nazwę katalogu z motywem w linijce:
current_theme rainbow
Można też wypisać kilka po przecinku, wtedy za każdym razem włączy się losowy. Sam motyw jest bardzo prosty do zrobienia samemu, bo składa się zaledwie z trzech plików (grafika tła, grafika „formularza” logowania i prosty plik konfiguracyjny).
Po instalacji każemy systemowi ładować SLiMa zamiast GDMa
# vim /etc/rc.conf
Zmieniamy linijkę
DISPLAYMANAGER="gdm"
na
DISPLAYMANAGER="slim"
oraz linijkę
XSESSION="gnome"
na
XSESSION="startxfce4"
Więcej: gentoo-wiki
No i gotowe! Po restarcie powinniśmy zobaczyć coś takiego
A później gładko i szybko zalogować się do Xfce.
Jako że środowisko jest bardzo lekkie i szybkie, oraz zrobiliśmy już pierwszy krok w postaci zamiany GDMa na Slima to czas pójść za ciosem.
Oczywiście integruje się z Thunarem dzięki czemu naciskając prawym na katalog mamy w menu pakuj/rozpakuj.

Geany to w zasadzie hit sezonu. Zainstalowałem dżina na krótko przed usunięciem Gnoma i uruchamiał się o wiele szybciej niż Gedit Praktycznie to uruchamia się natychmiast po kliknięciu na ikonkę. Przy czym ma wszystko czego potrzebuję: kolorowanie wielu składni kodu, podpowiadanie poleceń i zwijanie kodu. Nie wysypuje mi się też na zastępowaniu wyrazów w przeciwieństwie do gPHPEdita
Programy którym pozostałem wierny:
No i oczywiście: Firefox, Mplayer, OpenOffice, Gimp, Inkscape oraz kilka innych.
Więcej: Xfce-wiki
Sam się zastanawiam dlaczego wcześniej tego nie zrobiłem, teraz wszystko działa ile fabryka dała. Xfce jest bardzo elastyczne i szybko przystosowałem je do przyzwyczajeń jakie wyniosłem z Gnoma. Po prostu pięknie!
Niedawno jeszcze użerałem się z F-spotem który jak na złość nie potrafił przejść autoryzacji Picasa. W dodatku biblioteka libgphoto2 z której korzysta F-spot gryzła się z gnomowym automount’erem sprzętu przez co pingwin nie wykrywał mi aparatu. Zmuszony więc byłem odesłać F-spota na /dev/drzewo i poszukać alternatywy.
Z pomocą przyszedł Marcin Sochacki (Wanted) ze swoim bardzo wygodnym w użyciu skryptem opartym o Pythonowe API dla Googla
Skrypt wystarczy zapisać na dysku, następnie wyedytować plik i wpisać swój login oraz hasło
username = 'UZYTKOWNIK'
password = 'HASLO'
Teraz nadajemy skryptowi prawa do wykonywania
$ chmod +x picasa_upload.py
I dla wygody przerzucamy go rootem do /usr/bin aby stał się poleceniem:
# mv picasa_upload.py /usr/bin/picasa
Gotowe. Do dyspozycji mamy teraz polecenie picasa którego składania jest bardzo prosta. Jeżeli chcemy np. wrzucić na Picasa zdjęcia znajdujące w katalogu abc wystarczy że wejdziemy do niego i wklepiemy:
$ cd abc/
$ picasa Zdjecia-z-pikniku *.jpg
Skrypt założy nowy album o nazwie Zdjecia-z-pikniku i wrzuci do niego wszystkie pliki o rozszerzeniu .jpg które znajdują się w katalogu. Pice of cake!
Jako, że wczoraj zotałem napadnięty i zarzucono mi nie bycie dość pr0 więc dzisiaj nadrabiam straty ;)
Kilka razy już chciałem nagrać jakiś filmik z ekranu i wrzucić go na Google Video, ale za każdym razem wynik był marny – za duża kompresja i za mała rozdzielczość. Dotyczy to również klasycznych nagrań z kamery, które chcilibyśmy pokazać w nieco większej rozdzielczości.
Do tego celu potrzebne będą nam 3 rzeczy:
Nagrywany filmik. Produktem wyjściowym jest film.avi.
Przy pomocy magicznego zaklęcia konwertujemy film do postaci flashowej.
ffmpeg -i film.avi film.flv
Jeżeli chcemy skompresować do danego wymiaru to:
ffmpeg -i film.avi -s 320x240 -ar 44100 -r 12 film.flv
Podpinamy plik film.flv pod nasz flashowy odtwarzacz:
<object type="application/x-shockwave-flash" data="FlowPlayer.swf" width="924" height="690" id="FlowPlayer">
<param name=„allowScriptAccess” value=„sameDomain” />
<param name=„movie” value=„FlowPlayer.swf” />
<param name=„quality” value=„high” />
<param name=„scale” value=„noScale” />
<param name=„wmode” value=„transparent” />
<param name=„allowNetworking” value=„all” />
<param name=„flashvars” value=„config={
autoPlay: false,
loop: false,
initialScale: ‘scale’,
showLoopButton: false,
showPlayListButtons: false,
playList: [
{ url: ‘http://karbownicki.com/files/baner.jpg’ },
{ url: ‘film.flv’ },
{ url: ‘http://karbownicki.com/files/baner.jpg’ } ]
}” />
</object>
FlowPlayer obsługuję playlisty, więc możemy przed i po właściwym filmiku wstawić jakiś obrazek czy inny filmik. W ten sposób można np. założyć własną telewizję internetową i utrzymywać się z reklam wstawianych przed właściwymi filmikami ;)
Gotowe. Zobacz przykład
Wczoraj moim oczom ukazała się dobra nowina. Gajim po włączeniu i połączeniu się z kontem googlowym ładnie wyświetlił transporty i równie ładnie się do nich zalogował. Tym samy dziwny problem, znikających od jakiegoś czasu transporów, o którym pisałem w poprzedniej notce odszedł w zapomnienie.
Dodatkowo Googlowcy zwiększyli powierzchnię kont webowych albumów Picasa z 250 MB do 1GB. Wprowadzona została też wyszukiwarka zdjęć przeszukująca tagi wszystkich udostępnionych albumów Picasa w obrębie serwisu.
Co prawda w porównaniu z Flickr’em Google pozostaje w tyle i nadal brakuje tak oczywistych funkcji jak ostatnio dodane do albumu komentarze, ale… Małymi kroczkami, byle do przodu.
Kilka tygodni temu pomyślałem sobie, że do kontaktów biznesowych potrzebna mi będzie jakaś własna domena. Korzystając więc z okazji, że w domu mieli karnawałową promocję, rozbiłem mBankową świnkę skarbonkę i wydałem okrągłe 24,28 PLN. Całość operacji, łącznie z oznaczeniem domeny jako zapłacona, zamknęła się w 10 minutach.
Podpięcie joggera pod domenę również nie sprawiło żadnych kłopotów. Oddelegowałem rekord A pod odpowiedniego (217.110.127.251) IP’ka i rano (6h później) wszystko już ładnie działało.
karbownicki.com A 3600 217.110.127.251
Jakieś dwa tygodnie później postanowiłem zabrać się z usługę Google Apps for Your Domain czyli podpięcie usług Googla pod własną domenę. Jako, że korzystam z wieli G-usług taka możliwość wydała mi się bardzo przydatna. Rejestracja nie jest trudna, chociaż nie ma (jeszcze) wersji polskiej. Po wypełnieniu formularza zostajemy poinformowani, jakie wpisy musimy dodać do DNS’a obsługującego naszą domenę. Jednym z nich jest wygenerowany dla nas specjalny adres, który ustawieni udowodni Googlowi, że to rzeczywiście my jesteśmy właścicielami tej domeny. Ustawiamy go jako jako rekord typu CNAME odsyłający do google.com
Po weryfikacji własności domeny zakładamy sobie użytkownika (w wersji FREE możemy ich założyć nawet 100) z prawami admina i logujemy się na niego. Po zalogowaniu mamy do dyspozycji taki oto panel
Początkowo nie usługi nie mają jednak adresów typu coś.naszadomena.com tylko takie brzydkie googlowe. Wystarczy jednak wejść do każdej z usług, kliknąć Change URL i wybrać odpowiadający nam adres. Zostaniemy wówczas poproszeni o dodanie do DNS’a odpowiedniego rekordu CNAME odwołującego się do ghs.google.com. W przypadku wysyłania i odbierania poczty musimy dodać rekord MX odwołujący się do 10 ASPMX.L.GOOGLE.COM
karbownicki.com MX 3600 10 ASPMX.L.GOOGLE.COM
Moje problemy pojawiły się dopiero przy uruchomienia jabbera pod własną domeną. Niby wszystko działało, ale mogłem pogadać jedynie z googlowymi kontaktami. Po dłuższym czasie googlowania i przeglądania różnych zakamarków pomocy trafiłem na rozwiązanie. Magicznymi zaklęciami okazały się brakujące rekordy SRV
_jabber._tcp.karbownicki.com SRV 3600 5 0 5269 xmpp-server.l.google.com
_xmpp-server._tcp.karbownicki.com SRV 3600 5 0 5269 xmpp-server.l.google.com
_xmpp-client._tcp.karbownicki.com SRV 3600 20 0 5222 talk.l.google.com
Hura, działa. No prawie.. A właściwie nie bardzo. Tzn. sam jabber działa świetnie, łączy się z innymi serwerami itd. Nie mogę jednak dodać transportów. Po rejestracji w transporcie nie dodaje się one do listy, no ale nic, zawsze można dodać ręcznie. Po rozłączeniu i ponownym połączeniu również działa. No prawie.. A właściwie nie bardzo. Transport jest bo jest, ale już sam nas nie zaloguje do innej sieci. Trzeba go popychać ręcznie. Najdziwniejsze jest jednak to, że po wyłączeniu komunikatora i ponownym uruchomieniu po transportach już nie ma śladu (sprawdzone na Gajim-ie i Psi). A najlepsze jest to, po wywaleniu transportów na starym googlowym koncie i próbie ponownego dodania dzieje się to samo, chociaż wszystko działało do tej pory dobrze.
Ktoś ma jakiś pomysł ?
Na początku byłem święcie przekonany, że zastanę możliwość podpięcia dotychczasowych usług pod moją domenę. Niestety byłem w błędzie. Nowo założony użytkownik dostaje „nowe” usługi. Nie ma nawet możliwości importowania wiadomości ze starego konta gmailowego, bo jak wiadomo ta opcja jest dopiero w fazie testów i dostępna jest dla losowo wybranych użytkowników. Np. na starym gmailu mam opcję pobierania wiadomości z innych kont, ale pod domeną już nie :) Jedyne więc co mi pozostaje to włączyć forwardowanie i czekać na możliwość importu. Kolejna ciekawostka jest taka, że pojemność konta pocztowego jest stała i wynosi 2GB. Nie zwiększa się codziennie o kilka MB jak to ma miejsce w przypadku zwyczajnych skrzynek gmaila.
Ilość usług dostępnych w domenie jest mocno okrojona. Dokładniej to jest to tylko:
Przy czym np. strona startowa też jest mocno okrojona. Co prawda mamy do dyspozycji prosty edytorek to stworzenia i pokolorowania strony głównej…
...ale np ilość gadżetów do wstawienia z listy:
to 5-6 elementów w każdej kategorii z czego jedyne używalne to kalendarz, podgląd poczty i lista TODO.
Skromność usług wynagrodzić może nam jednak wstawienie własnego logo ;)
Google Apps for Your Domain – no cóż, nie ma rzeczy idealnych. Trzeba się po prostu cieszyć, że jest za darmo i podstawową funkcjonalność oferuje.