Podgląd strony do pliku jpg?
Poruszenie w Internecie tematyką wprowadzania cenzury, o której ostatnio pisałem, podsunęło mi pewien pomysł, który mam nadzieję niebawem Wam przedstawię. W między czasie uznałem, że w projekcie przyda mi się funkcjonalność zautomatyzowanego robienia podglądów (thumbnail) stron WWW do obrazków. Miałem przy tym całkiem dużo frajdy i mam nadzieję, że efekty mojej pracy komuś się to przydadzą.
Serwisów które przygotowują podgląd stron jest w sieci niewiele, a takich, które za darmo udostępniają wygodne API, nie mają śmiesznie małych limitów przygotowań podglądów nie znalazłem. Napisałem sobie takie narzędzie sam. Jeśli ktoś chce wykorzystać ten kod – proszę bardzo – proszę tylko o informację gdzie jest on dostępny oraz liczę na darmowy dostęp
Twoja własna mini-przeglądarka
Jak szybko zrobić sobie przeglądarkę z obsługą Flasha, JavaScriptu i tych wszystkich urozmaiceń? Wystarczyło mi kilkanaście minut
Zdecydowałem się na użycie GTK (domyślnego zestawu kontrolek dla m.in. Gnome) oraz Webkit’a – silnika do renderowania wykorzystywanego w takich przeglądarkach jak Safari (Mac OS), Google Chrome (Windows) czy Midori (Linux):
#!/usr/bin/env python
url = 'http://www.nme.pl'
size = [800, 600]
import gtk,webkit
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_default_size(size[0], size[1])
window.connect('destroy', gtk.main_quit)
preview = webkit.WebView()
preview.open(url)
scrolled = gtk.ScrolledWindow()
scrolled.add(preview)
window.add(scrolled)
window.show_all()
gtk.main()
Właściwy podgląd strony
Kod trzeba było trochę rozbudować. Konfiguracja jest w klasie conf. Uruchamiając kod w pierwszym parametrze należy podać adres strony (nie zapominając o nazwie protokołu, np. http://www.nme.pl).
w katalogu w którym znajduje się skrypt trzeba założyć podkatalog thumb, w którym zapisywane będą obrazki jpg.
shot.py:
#!/usr/bin/env python
__author__ = 'mw AT nme.pl'
__version__ = '1.0'
__date__ = 'wto, 25 sie 2009, 09:15:48 CEST'
import pygtk
pygtk.require('2.0')
import gtk,gtk.gdk,gobject
import webkit
import hashlib
import os,sys
class conf:
show_scrollbars = True
show_progress = True
script_timeout_secs = 15
size = [1024, 768]
class Snapshot:
def load_progress_changed(self, view, progress):
print '%d%%' % progress
def load_finished(self, view, frame):
print 'loading finished'
w = gtk.gdk.get_default_root_window()
wp = self.window.get_position()
ws = self.window.get_size()
sz = w.get_size()
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,ws[0],ws[1])
pb = pb.get_from_drawable(w,w.get_colormap(),wp[0],wp[1],0,0,ws[0],ws[1])
if (pb != None):
pb.save('thumbs/'+self.file+'.jpg','jpeg',{'quality':'95'})
gtk.main_quit()
def __init__(self, url=None):
self.url = url
self.file = hashlib.sha512(url).hexdigest()
self.overtime = False
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_default_size(conf.size[0], conf.size[1])
self.window.set_decorated(False)
self.window.connect('destroy', gtk.main_quit)
self.preview = webkit.WebView()
self.preview.open(self.url)
if conf.show_progress:
self.preview.connect('load-progress-changed',self.load_progress_changed)
self.preview.connect('load-finished',self.load_finished)
self.scrolled = gtk.ScrolledWindow()
if conf.show_scrollbars:
self.scrolled.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
self.scrolled.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
else:
self.scrolled.props.hscrollbar_policy = gtk.POLICY_NEVER
self.scrolled.props.vscrollbar_policy = gtk.POLICY_NEVER
self.scrolled.add(self.preview)
self.window.add(self.scrolled)
self.window.show_all()
gobject.timeout_add(conf.script_timeout_secs*1000, self.timeout)
gtk.main()
def timeout(self):
gtk.main_quit()
sys.exit(1)
if len(sys.argv)==2:
Snapshot(url=sys.argv[1])
else:
print >> sys.stderr, "Usage: %s url\n" % sys.argv[0]
sys.exit(1)
Wrapper do generowania właściwego poglądu
Skrypt działa, ale wymaga działania X’ów, coś nam jeszcze wyświetla i zapisuje obrazek w skali 1:1. Da się to zrobić w tle. Potrzebujemy do tego dwóch narzędzi – convert z pakietu imagemagick oraz pakietu xvfb – Virtual Framebuffer ‘fake’ X server. Mając już te narzędzia – całą robotę zrobi za nas skrypt o nazwie snap:
#!/bin/bash
state=0
plik=`python -c "import hashlib; print hashlib.sha512('$1').hexdigest()+'.jpg'"`
[ -e "thumbs/$plik" ] || {
xvfb-run -a --server-args='-screen 0 1024x768x16' python shot.py $1
}
state=$?
[ "$state" -eq "0" ] && {
[ -e "thumbs/$plik" ] && {
convert -scale 310x -quality 75 thumbs/$plik thumbs/$plik
} || {
exit 1
}
} || {
exit 1
}
skryptowi nadajemy prawa do jego uruchamiania:
chmod +x snap
i uruchamiamy:
./snap http://www.nme.pl
w katalogu thumb odnajdujemy gotowego jpg’a (jego nazwa jest hashem sha512 URL’a). Wygląda to tak:
![]()
Powiązane, teksty w języku angielskim:
- Podobne rozwiązanie w oparciu o Qt, warto obejrzeć.
- Przykładowy opis jak można uruchomić serwis do generowania podglądów w oparciu o Django z nawiązaniem do gotowych już rozwiązań.
Instalacja Linux Ubuntu 9.04 na pendrive USB
Temat ten był już poruszany na blogach i serwisach traktujących o Linux Ubuntu nie raz, nie jest to żadna nowość, ale ten wpis będzie mi potrzebny, aby się do niego odwołać niebawem.
Mamy już technologię
umożliwiającą nam pracę na systemie operacyjnym zainstalowanym na własnym nośniku USB. Można go zabrać wszędzie i wystarczy w miarę współczesny komputer z możliwością ładowania systemu po USB. I co najważniejsze – to co zrobimy w systemie, wystartowanym z takiego nośnika USB – w przeciwieństwie do wersji Live startowanych z płyt CD / DVD – pozostanie obecne nawet po restarcie.
Ta właściwość nazywa się persistent storage – czyli trwały dysk. Jeśli zainstalujemy sobie program, umieścimy skrót, zapiszemy dokument – po restarcie, nie ważne czy na tym samym komputerze czy innym – ów zmiana dalej będzie widoczna. To właśnie dzięki temu – warto mieć taki nośnik.
Co więcej – na nośniku możemy mieć też zapisane inne dane, o ile tylko mamy na nim jeszcze jakieś wolne miejsce
Wymagania
Do instalacji systemu Linux Ubuntu na pendrive, wystarczy nam nawet 2 GB nośnik USB sformatowany w systemie FAT (rekomendowane FAT32, jeśli chcemy zapisać na nim plik trwałego dysku większy niż 4 GB).
Będzie nam potrzebny również komputer z systemem Microsoft Windows – albo zainstalowanym klasycznie, albo jako maszyna wirtualna (która musi obsługiwać USB).
Przygotowanie i instalacja
Jeśli powyższe wymagania udało się nam spełnić – zabieramy się do roboty – na dysku twardym (to ważne, bo jeśli wrzucimy to od razu na pendrive’a, to skrypt instalacyjny sobie nie poradzi) swojego komputera tworzymy sobie katalog, do którego ściągamy następujące pliki:
Jeśli chcemy mieć większy trwały dysk niż domyślny – 1 GB – pobieramy jeden z tych: 2 GB, 3 GB, 4 GB lub tworzymy swój własny.
Kiedy już mamy wszystko – uruchamiamy U904p.exe. Jest to archiwum samorozpakowujące się. Po jego rozpakowaniu, wrzucamy plik iso Ubuntu oraz ewentualnie – pobrany i rozpakowany trwały dysk.
Teraz wystarczy tylko sprawdzić literkę dysku, pod którą znajduje się nasz pendrive, bo zostaniemy o to za chwilkę zapytani i uruchomić U904p.bat z katalogu U904p.
To w zasadzie wszystko – po restarcie z włożonym dyskiem USB do komputera, kiedy na ekranie zaczną pojawiać się pierwsze komunikaty, wciskamy kilkukrotnie klawisz F12 – powinno pojawić się menu z pytaniem z którego napędu chcesz wystartować system. Wybieramy nasz dysk USB.
Źródło: http://www.pendrivelinux.com/usb-ubuntu-904-persistent-install-windows/
Moja recenzja e-papierosa
Ostatnimi dniami we wpisie pół żartem pół serio – Unboxing tajemniczego przedmiotu, przedstawiłem sesję zdjęciową z rozpakowania e-papierosa, którego sobie kupiłem. Nadszedł teraz czas, żeby go dokładniej zrecenzować.
Zacznijmy od początku – więc… rzuciłem palenie
Nie, serio… rzuciłem. Byłem na bioprądach czy czymś takim, zapłaciłem 80 zł i odechciało mi się palić. Przez ponad miesiąc nie zapaliłem. Po tygodniu poprawiło się samopoczucie, po trzech tygodniach wrócił lepszy smak i węch.
Niestety, czasami np. po tym jak mocno dałem sobie w kość na rowerze, padając z nóg pojawiała się z nikąd myśl “ile dałbym za jednego macha”
Jak wieczorem trafił się film akcji, w którym przepoceni, zakrwawieni bohaterowie sięgają po papierosa i zaciągają się z taką przyjemnością… Ech
Sniło mi się później palenie całą noc. Niestety – palę od 10 lat i po prostu potrzebuję czasami poczuć coś na oskrzelach.
Po jednej z nocy, gdzie śniło mi się palenie – jakoś przypomniałem sobie jak ktoś kiedyś wspomniał o e-papierosach. Dwa dni spędziłem przeglądając YouTube’a, Allegro, kilku serwisów i fora o e-paleniu. Dowiedziałem się wystarczająco dużo, żeby się skusić.
Zasada działania e-papierosa jest w miarę prosta – pociągając powietrze przez ustnik aktwuje się bateria, czego znakiem jest zapalenia się diody na jej końcu. Bateria uruchamia atomizer, który, jeśli jego końcówka ma styczność z e-liquidem, substancją bazującą na glikolu propylenowego, rozpyla ją, tworząc parę, wyglądem przypominającą dym. Nic się nie spala. Zamiast 4000 substancji trujących, podobno nie przyjmuje się żadnej. O aspektach szkodliwości glikolów można poczytać tutaj. Nikotyna – która może być obecna w e-liquidzie – jest przyjmowana w postaci pary wodnej i trafia do mózgu po 7 sekundach od zaciągnięcia. Można sobie to wytłumaczyć w ten sposób, że jest przez organizm przyjmowana niczym reklamowana “lecznicza nikotyna” z plastrów Nicotine czy innych.
Wybrałem sobie markę, model, poszukałem dystrybutorów – okazało się, że jest w Katowicach człowiek, który to sprzedaje. Pojechałem i kupiłem.
Pierwsze wrażenia
Kupiłem e-papierosa firmy Joye, model 306.
Za pudełko zawierające:
- dwie baterie
- dwa atomizery
- ładowarkę sieciową
- 5 wkładów
- instrukcję obsługi
- gwarancję (3 miesiące)

czyli w zasadzie dwa kompletne e-papierosy, z jedną ładowarką, zapłaciłem 200 zł. Dostałem od sprzedawcy dodatkowo wydrukowaną na papierze A4 instrukcję oraz wygięty spinacz. Odbierając spinacz usłyszałem, że jest to podstawowe narzędzie do obsługi papierosów

Po zdjęciu wkładu z e-papierosa, atomizer jest wkręcony do baterii. Wkład zawiera mały pojemniczek wypełniony wato-podobną, nasiąkniętą e-liquidem kuleczką
Po włożeniu pojemniczka do wkładu, nakładamy to na atomizer i już możemy palić.
Wystarczy pociągnąć. Nic nie trzeba włączać. Kończymy palić – odkładamy go na bok. Żadnego popiołu, nie da się niczym oparzyć.
Podczas ciągnięcia, zapala się dioda imitująca żar, pojawia się dym, czuć smak. Smak jest inny niż zwykłych papierosów. Marlboro MED (o średniej zawartości nikotyny) smakuje trochę cytrynowo. Jeśli ktoś palił kiedyś fajkę – e-papieros to coś pomiędzy papierosem, a fajką – można się zaciągnąć do płuc, a z drugiej strony, jeśli pociągniemy jeden raz za drugim, tylko do ust, nie do płuc – czuć naprawdę dobry smak… Dobry, ale słabszy niż z analogów (tak e-palacze określają zwykłe papierosy
). Dym – cóż – kiedy zaciągamy się do płuc jest wyraźnie mniejszy. Chyba, że dopiero co nasączyliśmy wkład e-liquidem, ale o tym później. Bateria po naładowaniu wystarcza na 200 pociągnięć. Ładuje się około 1 godziny.
Aby odkręcić baterię od atomizera – wystarczy przycisnąć wkład i odkręcić. Nie zdarzyło mi się, żebym się z tym szarpał. Odkręcona bateria od atomizera z wkładem to sugerowana metoda przenoszenia e-papierosa.
Dodatkowe zakupy

Za pierwszym razem nie udało się kupić wszystkiego. Nabyłem jeszcze e-liquid Marlboro LOW, bodajże 30 ml – 40 zł oraz ładowarkę USB za 25 zł. Można jeszcze kupić ładowarkę samochodową, ale ładowarka sieciowa ma wejście na 12V więc prawdopodobnie wystarczy jedynie przejściowka, aby używać jej w samochodzie.
Jeśli o e-liquidy chodzi – mamy różne smaki oraz różną zawartość nikotyny: ZERO – brak, LOW – minimalna, MED – średnia, HIGH – wysoka. Póki co dotarły do mnie odrobine sprzeczne informacje odnośnie zawartości nikotyny i smaku. Na Allegro można kupić dowolny smak, wraz z Tabacco oraz Marlboro jako ZERO czyli bez nikotyny. Mój sprzedawca twierdzi, że te dwa smaki zaczynają się od LOW, a ZERO są np. cytryna czy truskawka. Muszę się w tym temacie dodatkowo rozeznać.
Nie kupiłem jeszcze żadnego etui. Myślę jednak nad czymś bardziej nietypowym, bo do standardowego etui nie zmieści się pojemniczek z e-liquidem. Moje papierosy trzymam jeszcze w oryginalnym opakowaniu. Aby nie męczyć się z ich wyciąganiem (do tego spinacz był równie przydatny co do procesu napełniania wkładu), moja przyjaciółka podsunęła mi pomysł, aby zastosować wstążkę (wstążki się bierze od kobiet, nie pytajcie mnie skąd one je biorą, ja jestem techniczny):

Wrażenia i różnice
Rewelacja
Można sobie pociągnąć w samochodzie, biurze. “Dym” nie ma zapachu. W samochodzie sprawdza się naprawdę super. Można palić w czasie jazdy, kiedy trzeba wykonać manewr – rzucam go na fotel, między nogi. Ktoś mi powiedział, że wyrabiam sobie zły nawyk, ale cóż
Wyrabiam też inne – przykładowo – e-papieros jest trochę cięższy od zwykłego papierosa dzięki baterii, dlatego inaczej go trzymam – za okolice diody. Teraz stwierdzam, że jeśli papieros byłby dłuższy – nie byłoby źle… A większość e-papierosów jest dłuższa. W samochodzie przykładowo – nie musiałbym do popielniczki wkładać chusteczki, żeby mieć pewność, że nie będzie mi wpadał do środka.

Po tygodniu e-palenia
Nie wróciłem do zwykłych papierosów i nie zamierzam. Nie odczuwam potrzeby palenia więcej, ale coraz bardziej mam ochotę zakupić kilka dodatkowych e-liquidów i z nimi poeksperymentować. Odwiedzę kilka stoisk, m.in w M1 i Silesii, może pojadę do Bytomia bo znalazłem jednego handlarza tanich e-liquidów na Allegro. Zobaczymy. Myślę, że jeszcze coś o e-paleniu napiszę.
Z tego co czytałem w Internecie – bardzo dużo osób doradza e-papierosa DSE 901 – kosztuje około 130 zł – jest trochę dłuższy – przez inną budowę atomizera, ale ponoć dzięki temu świetnie się dymi. Zastanawiam się czy nie uzupełnić swojego zestawu o coś takiego… Póki co – skoncentruję się jednak na e-liquidach
Koniec anonimowości w Internecie?
Przez wszelkie możliwe media tydzień temu przetoczyła się dyskusja na temat anonimowości w Internecie oraz jaka to ona jest zła. Wszystko zaczęło się od… kobiety
a dokładnie – kapitana żeńskiej reprezentacji polski w siatkówce – Doroty Świeniewicz.
Pani kapitan oświadczyła, że kończy karierę ponieważ nie może znieść wyzwisk pod jej imieniem na portalach Internetowych – wolne żarty! Kariera zawodowa pani kapitan jest jednoznacznie związana z popularnością i rozpoznawalnością. Powinna liczyć się z tym, że nie każdy będzie jej ślepo oddany. Wina Internautów? Bzdura. Z własnego doświadczenia wiem, że nawet administrator sieci dla tysiąca użytkowników też musi radzić sobie z tym, że mimo własnej woli słyszy negatywne opinie na temat swojej pracy, ale co ma zrobić – musi z tym żyć.
Każdy z nas jest istotą w jakimś stopniu egocentryczną – oraz, jakby na to nie patrzeć – społeczną. Zwracamy uwagę na to jak jesteśmy postrzegani przez innych. Są udokumentowane przykłady, że wystarczy odpowiednio połechtać człowieka, aby odwrócić mu świat do góry nogami. Jeśli faktycznie dla pani kapitan nie było racjonalnego powodu dla którego zrezygnowała z dalszej kariery – pewnie miała po prostu gorsze dni (może trwało to dłużej) i nie radziła sobie z własną psychiką. Cóż. Na pewno nie byli temu winni Internauci.
Jeden redaktor postanowił skorzystać z okazji i się wypromować
Redaktor Jacek Żakowski w radiu TOK FM przygotował na temat cenzurowania portali Internetowych audycje. Zaprosił gościa do studia, drugiego trzymał na telefonie, wydrukował sobie znaleziony wcześniej jakiś prostacki cytat który przeszedł moderacje i próbował z tego zrobić aferę. Panowie zaproszeni do audycji byli zresztą nastawieni na odpieranie tego rodzaju ataków o czym świadczyło ich przygotowanie. Szkoda, bo mogli rozmawiać o tym, w jaki sposób można coś z tym robić.
Pan redaktor Żakowski z drugiej strony, przygotowany nie był wogóle. Powinien zastanowić się, zapytać jakiegoś specjalistę wcześniej – jakie są trendy na tego rodzaju portalach, jakie serwisy powstają wokół – ktoś powinien powiedzieć mu np. o Wykopie i o tym jak tam użytkownicy sami mogą oceniać komentarze, które swoją drogą są na wiele wyższym poziomie niż takich Onetach, Money.pl czy im podobnych.
Reakcja po audycji była bolesna. Media się poruszyły – od blogów, na których informacja zwykle pojawia się najpierw, po portale – wszędzie były te bzdury. Większości się to nie spodobało, ale nikt tej marnej dyskusji nie wyśmiał. Ktoś nawet stworzył serwis z opisem zasad według których powinien żyć komentujący Internauta – Internet bez ch@mstwa – ludzie, na Boga – szanujmy się. Czy przeszkadzają Wam komentarze na Onecie? Ktoś z Was je czyta? Ja nie. Często jednak czytam te na Wykopie. Są dłuższe
ale zwykle z klasą. Jeśli jednak nie są z klasą to wiem, że zostałem ostrzeżony i nie ma co ich rozwijać, bo trafia się na weteranów komentowania z Onetu – przykładowo tych:
Co się później działo – telewizja i wypytywanie o zdanie ludzi z ekipy rządzącej. Telewizja jak to telewizja – za punkt honoru miała to, żeby pokazać, że jest w stanie coś zdziałać… i zdziałała. Pech chciał, że na tą chwilę w ekipie dominują ludzie nie potrafiący podjąć najprostszej… nawet błędnej decyzji. Ktoś tam odważniejszy z góry, z MSWiA wpadł na pomysł aby zmusić portale do dokładniejszej cenzury. Rewelacja. Już miałem nadzieję, że powiedzą, że zapłacą im za to – jeśli tak by było to sam bym otworzył portal
Niestety – jak można byłoby się spodziewać – pomysł upadł.
Względy technologiczne
Czytając wpisy na blogach traktujące o pomysłach walczenia z anonimowością, brakowało mi wpisu, w którym ktoś zrobiłby zestawienie – gdzie jesteśmy, dokąd zmierzamy, jakie mamy teraz możliwości technologiczne, aby uchronić swoje oczy przed komentarzami na niskim poziomie. Spróbuję zatem coś takiego popełnić.
Wspominano o moderacji, panowie z portali podczas rozmowy w audycji TOK FM mówili, że takowa istnieje. Paweł Opydo, pracujący w Interii, na swoim blogu wspomniał nawet, podczas dyskusji, że wszystkie większe portale prowadzą premoderację. Jak jednak ona działa mieliśmy się okazję przekonać w audycji. Nie trzeba mieć bujnej wyobraźni, żeby zdać sobie sprawę z kosztów realnej pracy takich systemów – trzeba mieć aplikację wieloużytkownikową, logowania/wylogowania operatorów cenzurujących, możliwość bardzo szybkiej premoderacji w czasie rzeczywistym. Taki system dużo kosztuje, biorąc pod uwagę przede wszystkim pensje dla cenzorów. Jak dla mnie – odpada.
Wspomniałem już o systemie oceny komentarzy – pracuje to z powodzeniem w takich serwisach jak Linuxnews (strzelam, dawno tam nie byłem, ponieważ mają tam moderację artykułów, nie moderując RSS’ów – o jedno 404 za daleko i przestałem ich subskrybować), lub Wykop. System o dziwo – sprawdza się świetnie i nic nie kosztuje. Żaden większy portal chyba tego nie ma, a szkoda. Gdyby któryś portal zdecydował się na wprowadzenie takiego systemu – niech przy okazji pomyślą nad poprawą sposobów wyświetlania komentarzy, bo to co do tej pory widziałem jest baardzo słabe.
Co dalej – prosta sprawa – osoba która odwiedza portal, trafia na dużą ilość reklam, żartuje! – chodziło oczywiście o treści
Komentarze pod tekstem nie są dość przyjemne. Wpływ innych czytelników w treść jest minimalna. To aspekt psychologiczny – użytkownik może czuć się wyobcowany. Może się poczuć tak jakby sam był w galerii handlowej. Wszystko wokół jest dla niego – on jest panem. Więc robi co mu przyjdzie do głowy i nawet nie zastanawia się jak zostanie to odebrane przez innych. Ani aktywność “ochrony” nie rzuca się w oczy, ani inni użytkownicy. Słowem – brakuje możliwości raportowania nadużyć innych. “Surfowanie” w przeglądarce umożliwia zarządzającym danym serwisem Internetowym całkiem precyzyjne śledzenie czynności danego użytkownika – to nie jest technologia rakietowa – sesje zaimplementować potrafi przeciętny programista, a większość nowoczesnych frameworków oferuje to w standardzie. Jeśli więc na dany portal trafi rozjuszony niedowartościowany człowiek i pozostawi podczas jednej sesji kilka komentarzy – można oprogramować dany serwis tak, że jeśli któryś z nich zostanie zaraportowany – wszystkie z danej sesji zostaną ukryte.
Odchodząc od konkretnych serwisów – co mogą robić operatorzy. Niby wiele, ale tak naprawdę to nic poza logowaniem. Często jednak takie logi są niewiele warte. Do momentu, kiedy Internet nie zrezygnuje z IPv4, operatorzy nie zaczną poważnie traktować bezpieczeństwa sieci WIFI w ich urządzeniach które dają swoim klientom – żadnemu Internaucie nie będzie można udowodnić, że to tak naprawdę on robił dane rzeczy na konkretnych serwisach. IPv6 – jest już coraz bliżej, ale niestety strasznie daleko. Póki co mamy domowe routery, podsieci lokalne i maskarady – nic z tego nie sprzyja “zakończeniu anonimowości w Internecie”
No i na koniec - aplikacje filtrujące treści na komputerach osobistych. Witamy w Chinach? Nie, w Polsce to nie przejdzie, ponieważ oprogramowanie musiałoby działać na każdym systemie operacyjnym, byłoby zbyt drogie jego utrzymanie, a wątpliwe jest bardzo, żeby ktoś mógł zmusić obywateli do wprowadzenie do domu konia trojańskiego rodem ze świata Orwella. Jest u nas demokracja na szczęście i ja wybieram pracę na systemie Linux Ubuntu. Nikt mnie nie zmusi do systemu Microsoft Windows. Jeśli by próbował – są w naszej wspaniałej Unii różnego rodzaju trybunały
Unboxing tajemniczego przedmiotu
Gorączka ostatnio nastała na dokumentowanie czynności rozpakowywania różnego rodzaju sprzętów
Jako, że kupiłem całkiem ciekawy gadżet – nie obędzie się bez kilku zdjęć






Więcej szczegółów oraz moja wstępna recenzja pojawi się w następnym wpisie.
Ubuntu 9.10 coraz bliżej…
Właśnie skończyłem lekturę wpisu Dlaczego Ubuntu tak NIE wygląda? na jednym z blogów Adriana Nowaka, z czołówki moich ulubionych bloggerów. Tym razem wyjątkowo muszę przyznać, że się z nim nie zgadzam
Nie zgadzam się do tego stopnia, że nie chciałem zostawiać pod jego artykułem komentarza, bo byłby negatywnie nacechowany, nazbyt rozwlekły i trochę nie na temat, a jako, że trochę ostatnio zapuściłem główny blog, przyda się coś nowego.
Wygląd systemu operacyjnego
Czy to takie ważne? Obecność jakiegoś ładnego zegarka albo widoczków w małej ramce (screen po lewej) jest taka istotna? Żeby pochwalić się, Compiz chyba wystarczy (screen po prawej).


Pamiętam czasy, kiedy pracowałem na Debianie z KDE 3.5. Nie było to znowu tak dawno temu. Byłem bardzo zadowolony. Pulpit wyglądał schludnie, mogłem pracować wydajnie nie będąc rozpraszany żadnymi animowanymi zegarkami i innymi widgetami na pulpicie.
Wtedy pojawiło się nowe KDE… Opcji było kilka – m.in. iść wraz z nurtem – a nurt był niezwykle rwący, bo programiści postawili całe środowisko KDE do góry nogami. Można było też ustawić na sztywno piny tak, aby KDE się nam nie aktualizowało… Też mi to jakoś nie specjalnie pasowało…
Jako, że o Ubuntu mówiło się coraz głośniej – zdecydowałem się na wykorzystanie duetu Ubuntu z domyślnym środowiskiem Gnome. Temat graficzny od Ubuntu odpowiada mi wystarczająco, żebym nie potrzebował przy nim cokolwiek robić.

Z tuningu wyglądu który stosuje przy konfiguracji swojego konta:
- skróty klawiszowe pulpitu, programów i gnome-terminala
- wrzucenie ikon kilku aplikacji na górną belkę
- dodanie monitora systemu dla wszystkich zasobów na górną belkę
- ustawienia Compiza
Szczytową funkcjonalnością której używam jest zoomowanie obrazu za pomocą Compiza (Win+Scroll Up/Dn myszką lub Win+[1,2,3]) oraz malowanie ogniem (Win+Shift+lewy klawisz myszy
).
Uważam, że nie potrzebujemy do szczęścia widgetów ani menu w stylu Mac’a.
Na co panowie z Ubuntu powinni położyć nacisk?
Na swoje korzenie. Mój kolega, który stara się szerokim łukiem obchodzić wszystkie dystrybucje inne niż Slackware
bardzo słusznie wytknął Ubuntu jego największą wadę – Ubuntu jest forkiem _GNU_ Debiana. Działając w oparciu o GNU, Debian zawsze był wolny od oprogramowania zamkniętego. Wszystkie pakiety, których licencja nie stanowi o ich otwartości trafiają do zagrody non-free i nie są domyślnie instalowane w systemie. Póki co – z tą polityką się zgadzam.
Kiedy oprogramowanie tak kluczowe jak Java czy OpenSSL ma zamkniętą licencję, a GNU Debian unika takiego oprogramowania to co się dzieje? Developerzy mają dwa wyjścia – albo uznają, że użytkownicy i tak zainstalują to oprogramowanie, albo poszukają otwartych alternatyw. Takie alternatywy są… naturalnie… problem w tym, że nie są tak stabilne, jak się tego od nich oczekuje…
A tym czasem maintainerzy paczek Debiana…
Debian może poszczycić się ogromną ilością paczek. Praktycznie każde oprogramowanie na licencji GPL można znaleźć w gotowej do instalacji paczce .deb. Aby przygotować taką paczkę, osoba, która się nią zajmuje, tzw. maintainer musi ustalić jak ma być kompilowana i z jakimi bibliotekami linkowana. Jeśli zlinkuje z oprogramowaniem non-free, zacznie się na grupie dyskusyjnej dyskusja. Zaczną się naciski, zacznie się wymienianie oprogramowania zgodnego z GNU… Więc maintainer przygotuje paczkę zgodną z GNU.
Większość paczek da się przygotować tak, aby były w pełni funkcjonalne… Niestety, pomimo otwarcia Javy, wiele paczek jest nadal linkowanych z gcj – co sprawia, że np. programistyczne IDE dla Javy, Eclipse, nie da się uruchomić z domyślnej paczki… Trzeba sobie Eclipse’a pobrać ze strony projektu.
Podobnie jeśli chodzi o SSL – zamiast standardowego OpenSSL’a, w paczkach Debiana które wymagają tej funkcjonalności – wykorzystuje się GnuTLS. Jeśli ktoś chciałby w Ubuntu uruchomić OpenLDAP’a bazując o domyślną paczkę (na bazie tej z Debiana), powinien zdawać sobie sprawę, jak wiele złego mówi się o potencjalnych dziurach w GnuTLS. Z moich własnych doświadczeń – obsługa SSL wymaga wyłączenia sprawdzania poprawności certyfikatów… Dlatego – w Debian/Ubuntu OpenLDAP’a należy sobie przekompilować ręcznie, linkując z OpenSSL’em, jeśli myśli się poważnie o bezpieczeństwie.
Takich kwiatków jest więcej. Miałem okazję nawet jakiś czas temu rozmawiać na kanale IRCowym z developerami Ubuntu, ale dostałem tą odpowiedź której się spodziewałem – brak odpowiedniej ilości rąk do pracy. Gdyby nacisk był kładziony nie na wygląd, a na poprawę takich właśnie problemów – byłoby znacznie lepiej, a i może rąk by starczyło. Bo przecież zarówno Gnome jak i Compiz są rozwijane przez społeczeństwo, a nie maintainerów Ubuntu.
Podsumowując
Czy ekipa Ubuntu zdąży dopiąć wszystko na ostatni guzik w 9.10? Nie zdąży i jestem tego pewien. Niektóre rzeczy nie będą ze sobą tak grać, jak będziemy tego oczekiwać. Już kilka razy zdarzało mi się żałować bo za wcześnie przeszedłem na “stabilną” nową wersję…
Cóż – przez pierwsze pół roku nowe Ubuntu będzie czymś w stylu bleeding edge + unstable z Debiana i na to się radzę wszystkim przygotować
) Dlatego moja rada – nie śpieszmy się z aktualizacją oraz czytajmy known issues w opisie nowego release’u.
Miejmy nadzieję, że po wydaniu Ubuntu 9.10, Mark Shuttleworth pozwoli swoim ludziom oderwać ręce od myślenia nad nowym wyglądem, tak aby mieli możliwość szybkiego naprawienia niedoróbek
Nawiązując jeszcze do KDE… Najnowsze coraz bardziej zaczyna mi się podobać. Jest mniej krzykliwe i wydaje się mieć wszystko na miejscu:

Screen, jak wszystkie inne w tym wpisie – zapożyczone skądś z odchłani Internetu… mam nadzieję, że żaden nie przedstawia Windowsa
Powiadomienie SMS na OVH
Ten wpis jest zwieńczeniem trzech poprzednich i opisuje w jaki sposób umieścić skrypty na koncie shellowym. Jako, że już wspomniałem, że na chwilę obecną korzystam z usług OVH, uważam, że warto opisać, jak takie powiadomienia u nich uruchomić.
Potrzebne są dane do konta w Gmailu z aktywowanym kalendarzem. Jeśli chodzi o pliki – wystarczy biblioteka kliencka Google oraz przygotowana przeze mnie paczka. Oba pliki umieszczamy na koncie w katalogu domowym, logujemy się za pomocą ssh, po czym wydajemy następujące komendy:
tar jxvf sms-notify.tar.bz2 mkdir -p lib/api cd lib/api tar zxvf ~/gdata-2.0.1.tar.gz cd .. ln -s api/gdata-2.0.1/src/atom ln -s api/gdata-2.0.1/src/gdata cd ~
następnie edytujemy plik z ustawieniami ustawiając konto i hasło dla aplikacji:
nano lib/conf.py
Kiedy już to zrobimy – możemy sprawdzić czy działa pojedyncze powiadomienie:
./lib/sms.py @ovh testowe powiadomienie
SMS powinien przyjść na komórkę po czasie 1 minuty. Jeśli wszystko pójdzie dobrze, możemy wysłać na to konto pocztowe maila, a następnie wymusić pojedyncze sprawdzenie:
./lib/pop2sms.py
Następnie możemy sprawdzić te same operacje z poziomu skryptów CGI; w celu wysłania SMSa – odwiedzamy:
http://www.twoja-domena.pl/cgi-bin/sms.py?q=@gdzieś treść powiadomienia
a kiedy wyślemy sobie na konto maila, możemy sprawdzić czy doszedł, a następnie przekierować do komórki odwiedzając:
http://www.twoja-domena.pl/cgi-bin/pop.py
Jeśli wszystko działa, pozostaje nam tylko zalogowanie do interfejsu zarządzającego OVH i ustawienie crona… Niestety jednak, na ich serwerach sytuacja jest dość nietypowa, ponieważ najczęstszym wywołaniem nie jest wywołanie co minutę, ale co godzinę. Obniża to niestety odrobinę responsywność naszego automatu. W niektórych sytuacjach może to być akurat plus, ale jakby na to nie patrzeć – niestety – wymuszony ograniczeniami… Jeśli ktoś potrzebuje częstszych powiadomień – musi niestety umieścić skrypty w miarę możliwości na innych serwerach (lub ustawić / poprosić kogoś, kto ma konto gdzieś indziej, aby uruchomił u siebie skrypt wykonujący HTTP GET do naszego skryptu pop.py).
Decydując się na wykorzystanie OVH, warto pomyśleć o zmianie nazw plików w katalogu cgi-bin na bardziej losowe, np. sms.py -> sms-d9pVExhQg.py – dzięki temu zabiegowi możemy uniknąć ślepych prób uruchamiania skryptów z katalogu cgi-bin. Dla własnego użytku można dodatkowo ustawić sobie odpowiedni wpis w .htaccess za pomocą mod_rewrite, który będzie łatwiejszy do zapamiętania i wygodniejszy w użyciu.
Oskryptowanie Gmaila
Google nie udostępniło do Gmaila tak wygodnego API jak dla Google Calendar, którego przykład zastosowania umieściłem w poprzednim wpisie. Zastanawiając się jednak chwilę – mamy przecież dostęp do protokołu POP, więc jakieś API się znajdzie
Kontynuując myśl z poprzedniego tekstu – jeśli mam już gotowy skrypt który potrafi wysłać powiadomienie SMS o konkretnej treści, można zrobić skrypt, który jako SMS wyśle np. temat z maila. Et voila:
Wymagania: Python 2.4+, skrypt z sms.py z poprzedniego wpisu.
#!/usr/bin/env python
__author__ = 'mw AT nme.pl'
__version__ = '1.2'
__date__ = 'pią lip 31 13:17:45 CEST 2009'
class setup:
class google:
login = 'KONTO@GOOGLE'
password = 'HASŁO'
import poplib
import email
import email.Header
import sms
class Mailbox:
def __init__(self):
self.server = poplib.POP3_SSL('pop.gmail.com', 995)
self.server.user(setup.google.login)
self.server.pass_(setup.google.password)
self.server.set_debuglevel(0)
# fetch
count = self.server.stat()[0]
print count
if count:
for i in range(1,count+1):
(header, msg, octets) = self.server.retr (i)
mail = email.message_from_string('\n'.join(msg))
subject = email.Header.decode_header(mail['Subject'])[0]
if subject[1]:
subject = subject[0].decode(subject[1],'ignore')
else:
subject = subject[0]
#print subject
sms.parse(subject.split())
self.server.dele (i)
# commit
self.server.quit()
mbox = Mailbox()
Bramka SMS od Google
Oficjalnie Google takiej usługi przynajmniej w Polsce nie udostępnia. Można to jednak osiągnąć w sposób pośredni, który chciałbym dzisiaj przedstawić. Jest bardzo prawdopodobne, że już niebawem, stosowanie takich rozwiązań będzie zbędne, bo ceny usług transmisji danych tanieją, a telefony swoją funkcjonalnością przypominają coraz bardziej PDA.
Spośród aplikacji Google, powiadomienia SMS na tą chwilę możemy otrzymywać jedynie Google Calendar. Dzięki bardzo dobrej polityce tej firmy, do większości ich aplikacji dostępne jest API, które sprawia, że ich integracja ze swoimi rozwiązaniami jest znacznie prostsza. Calendar API jest świetnie udokumentowane, wystarczyła chwila i narzędzie do wysyłania SMS’ów było gotowe.
Do pełni szczęścia potrzebne jest konto w Google, a na nim Gmail i kalendarz. Posiadając własną domenę oraz uruchomione Google Apps, można założyć sobie dedykowane konto np. powiadomienia@domena.pl co jest znacznie elastyczniejszym rozwiązaniem.
Wymagania: Python 2.4+, Python Client Library
#!/usr/bin/python
__author__ = 'mw AT nme.pl'
__version__ = '1.1'
__date__ = 'pią lip 31 10:42:26 CEST 2009'
class setup:
class google:
login = 'KONTO@GOOGLE'
password = 'HASŁO'
retries = 3
from elementtree import ElementTree
import gdata.calendar.service
import gdata.service
import atom.service
import gdata.calendar
import atom
import getopt
import sys
import string
import time
class CalendarNotify:
def __init__(self):
self.cal_client = gdata.calendar.service.CalendarService()
self.cal_client.email = setup.google.login
self.cal_client.password = setup.google.password
self.cal_client.source = 'api'
self.cal_client.ProgrammaticLogin()
def reminder(self,event,minutes):
for a_when in event.when:
if len(a_when.reminder) > 0:
a_when.reminder[0].minutes = minutes
else:
a_when.reminder.append(gdata.calendar.Reminder(minutes=minutes))
self.cal_client.UpdateEvent(event.GetEditLink().href, event)
def event(self,title,where=None):
try:
# add event
event = gdata.calendar.CalendarEventEntry()
event.title = atom.Title(text=title)
#event.content = atom.Content(text=content)
if where:
event.where.append(gdata.calendar.Where(value_string=where))
start_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.time() + 180))
end_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.time() + 180 + 60))
event.when.append(gdata.calendar.When(start_time=start_time, end_time=end_time))
new_event = self.cal_client.InsertEvent(event, '/calendar/feeds/default/private/full')
# add reminder
self.reminder(new_event,1)
except:
return False
return True
def parse(args):
where = None
if len(args):
if args[0][0] == '@':
where = args.pop(0)
count = 0
while count < setup.retries:
if cal.event(' '.join(args),where):
break
count += 1
try:
cal = CalendarNotify()
except:
print >>sys.stderr, 'Unable to login to Google Calendar!'
exit(1)
if __name__ == '__main__':
args = sys.argv
name = args.pop(0)
if not len(args):
print >>sys.stderr, 'Usage: %s [@where] message\n' % name
exit(1)
parse(args)
Uruchamiając skrypt można podać opcjonalny parametr @lokalizacja, a następnie podajemy treść powiadomienia – przykładowa komenda:
./sms.py @firma awaria bazy danych
Mbank Mobile: E-mail jako SMS
Zdecydowałem się na skorzystanie z oferty wirtualnego operatora komórkowego Mbank Mobile, którego najnowsza oferta okazała się być prawie dokładnie taką, jakiej potrzebowałem.
Brakowało mi w ich ofercie informacji – czy (lub w jaki sposób) można wysłać sobie samemu na komórkę, smsy z Internetu. Każdy kto ma styczność z administracją serwerami lub aplikacjami, może potrzebować tego rodzaju powiadomień o problemach lub zdarzeniach.
Jak się okazało po włożeniu karty do telefonu – Mbank Mobile jest wirtualnym operatorem Plusa, zatem wysyłanie maili na 48xxxxxxxxx@text.plusgsm.pl działa normalnie.
Zanim jednak włożyłem kartę do telefonu… przygotowałem sobie rozwiązanie które:
- wykorzystuje powiadomienia SMS w aplikacji Google Calendar z poziomu skryptu
- uruchomiłem własny mail2sms uzupełniając rozwiązanie o funkcjonalność obsługi dedykowanego konta w usłudze Google Apps
- ostatecznie uruchomiłem na swoim koncie w OVH całą usługę
Dla własnych potrzeb zdecydowałem się ostatecznie na rozwiązanie oparte o Google – mam nadzieję, że komuś również się przyda


