Python – Demonologia
Python jest świetnym językiem do całej palety zastosowań. Służy on pomocą zarówno administratorom systemów, osobom które potrzebują napisać prosty parser, a nawet twórcom aplikacji webowych – dzięki takim frameworkom jak Django. W poniższym tekscie chciałbym pokazać jak łatwo jest stworzyć usługę systemową (ang. daemon) w języku Python, która będzie wykonywała dla nas określoną czynność – jako przykład przedstawię fakedns – bardzo prostego daemona DNS, który na dowolne zapytanie o adres IP będzie zwracał zawsze ten sam.
Dlaczego Python? Co z innymi językami?
Nie lepiej mieć aplikację którą można skompilować? Absolwenci kierunków informatycznych jeszcze kilka lat temu dowiadywali się na studiach, że najbardziej zaawansowanym językiem do wszelakich zastosowań jest Java. Mieli praktyczne doświadczenie z tworzenia aplikacji w Javie… i zaczęli pisać. Kod który chciałbym tu przedstawić pisałem dwa lata temu. Zanim się za niego zabrałem, zacząłem od szukania już gotowego rozwiązania za pomocą Google. Znalazłem, nawet kilka. Jedno w Javie. O zgrozo. Ja wiem, że się da. Wiem, że Java jest naprawde zaawansowanym językiem. Gotowa aplikacja wymaga jednak dużego nadkładu. Trzeba przygotować środowisko, przygotować konkretną ilość pamięci… i czekać kiedy aplikacja się wyłoży. Takie mam przynajmniej doświadczenia z aplikacjami w Javie, które pisali programiści zaraz po studiach, pracując w profesjonalnej firmie software’owej.
A inne języki? Natualnie. Jest C. Świetny język, ale czy mamy wystarczająco dużo czasu aby w nim pisać nawet małe aplikacje? .NET ? Wolne żarty. Nie dość, że pod Linuxem jest bardzo grubymi nićmi przyszywany, to i nie mamy pewności, czy Microsoft nie powie pewnego dnia hola, jedynie na ich, komercyjnej platformie. Naddatek potrzebnej mocy obliczeniowej, pamięci, wymaganej przestrzeni dyskowej… i ta świadomość, że nie jest to dopracowane i pewnie nigdy nie będzie – niczym Samba próbująca naśladować również kalekie i dziurawe, Microsoftowe domeny.
A co ze skryptowymi? Mnie na myśl przychodzą trzy alternatywy – Lua, Ruby i skrypt w bashu.
Lua – niesamowicie przejrzysty język. Piekielnie szybki, realizowany przez wręcz mikroskopijną bibliotekę. Na jego niekorzyść trzeba jednak zaliczyć wręcz niemal konieczność liczenia się z faktem, że jeśli rozwiązanie które potrzebujemy stworzyć, będzie wymagało biblioteki – będziemy zmuszeni długo jej szukać lub przygotować samemu jej obsługę za pomocą języka C.
Ruby – chyba najbliższy Pythonowi. Dlaczego nie. Bibliotek jest coraz więcej, jest wydajny. Miałem okazję jakiś czas temu nawet coś napisać w tym języku (a dokładnie – przepisać mały framework z Pythona), ale… jakoś w Pythonie pisze mi się lepiej. Co ważne – Ruby jest głęboko zakorzeniony w Perlu. Programistom mówi się jak powinni pisać kod, jednak zawsze mogą robić w to w stylu Perlowym – pisać szybko i wydajnie, jednak przeczytanie i przeanalizowanie go po jakimś czasie staje się piekłem. Kod w Pythonie jest de facto zawsze taki sam, nie zależnie kto by go pisał – czytanie go jest proste i przyjemne.
No i jeszcze uzupełnie o język skryptowy – Bash. Można w nim naprawdę dużo zrobić. Warto jednak zastanowić się na ile aplikacja będzie zaawansowana i czy zależy nam na wydajności. Podam przykład. Stworzyłem kiedyś skrypt w bashu generujący w oparciu o kilka plików wejściowych reguły dla firewalla, reguły shapera oraz treść dhcpd.conf. Skrypt wewnątrz wywoływał po kilka tysięcy razy awk/sed’a itp. Na maszynie jednoprocesorowej (Pentium 4 1.4 GHz), która pełniła funkcję routera dla sieci 100 Mbit/s, przy mniejszym obciążeniu – skrypt wykonywał się kilka minut. Przy większym – godzinę. Za każdym razem uruchamiając awk, spawnował odrębnego basha. Cóż. Przepisałem rozwiązanie na język Lua. Skrypt niezależnie od obciążenia maszyny wykonywał się w 0.02 sekundy. Jeśli byłby to Python czy Ruby – efekt byłby zapewne zbliżony do Lua.
Tworzenie usługi systemowej dla Linux/Unix
OK, zaczynamy. Usługa systemowa powinna przede wszystkim:
- wiedzieć jak pisać do sysloga
- zrzucić uprawnienia root’a
- odkleić się od stdin i stdout i przejść w tło
Jeśli taka usługa dodatkowo potrzebuje obsługiwać jakiś systemowy port TCP/UDP (o numerze niższym niż 1024) – zanim zrzuci ona prawa roota, powinna otworzyć sobie określonego socketa.
Nie będę tłumaczył poszczególnych fragmentu kodu ponieważ uważam, że jest on wystarczająco przejżysty.
fakedns.py
#!/usr/bin/python -u
# -*- coding: utf-8 -*-
" Fake DNS server: Always answer with the same, defined as conf.destip reply, listen at conf.listen "
class conf:
listen='ADRES_IP_NA_KTÓRYM_APLIKACJA_MA_NASŁUCHIWAĆ'
destip='ADRES_IP_NA_KTÓRY_APLIKACJA_BĘDZIE_KIEROWAĆ'
import os,sys,pwd,grp
import logging,logging.handlers
import socket
log=logging.getLogger('fakedns')
logging.basicConfig()
logging.root.setLevel(level=logging.INFO)
#logging.root.setLevel(level=logging.DEBUG)
hdlr=logging.handlers.SysLogHandler('/dev/log')
log.addHandler(hdlr)
def drop_privileges(uid_name='nobody',gid_name='nogroup'):
starting_uid=os.getuid()
starting_gid=os.getgid()
starting_uid_name=pwd.getpwuid(starting_uid)[0]
log.info('fakedns: drop_privileges: started as %s/%s'%(pwd.getpwuid(starting_uid)[0],grp.getgrgid(starting_gid)[0]))
if os.getuid()!=0:
log.info("fakedns: drop_privileges: already running as '%s'"%starting_uid_name)
return
if starting_uid==0:
# Get the uid/gid from the name
running_uid = pwd.getpwnam(uid_name)[2]
running_gid = grp.getgrnam(gid_name)[2]
# Try setting the new uid/gid
try:
os.setgid(running_gid)
except OSError,e:
log.error('Could not set effective group id: %s'%e)
try:
os.setuid(running_uid)
except OSError,e:
log.error('Could not set effective user id: %s'%e)
# Ensure a very convervative umask
new_umask=077
old_umask=os.umask(new_umask)
log.info('fakedns: drop_privileges: Old umask: %s, new umask: %s'%(oct(old_umask),oct(new_umask)))
final_uid=os.getuid()
final_gid=os.getgid()
log.info('fakedns: drop_privileges: running as %s/%s'%(pwd.getpwuid(final_uid)[0],grp.getgrgid(final_gid)[0]))
def become_daemon(home='.',stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
log.info('fakedns: deamonize')
# perform first fork
try:
if os.fork()>0:
sys.exit(0)
except OSError,e:
log.info("fakedns: 1st fork failed: %s"%e.strerror)
sys.exit(1)
os.setsid()
os.chdir(home)
os.umask(0)
# second fork
try:
if os.fork()>0:
sys.exit(0)
except OSError,e:
log.info("fakedns: 2nd fork failed: %s"%e.strerror)
sys.exit(1)
i=open(stdin,'r')
o=open(stdout,'a+')
e=open(stderr,'a+',0)
os.dup2(i.fileno(),sys.stdin.fileno())
os.dup2(o.fileno(),sys.stdout.fileno())
os.dup2(e.fileno(),sys.stderr.fileno())
class DNSQuery:
def __init__(self, data):
self.data=data
self.dominio=''
tipo = (ord(data[2]) >> 3) & 15 # Opcode bits
if tipo == 0: # Standard query
ini=12
lon=ord(data[ini])
while lon != 0:
self.dominio+=data[ini+1:ini+lon+1]+'.'
ini+=lon+1
lon=ord(data[ini])
def respuesta(self, ip):
packet=''
if self.dominio:
packet+=self.data[:2] + "\x81\x80"
# Questions and Answers Counts
packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'
# Original Domain Name Question
packet+=self.data[12:]
# Pointer to domain name
packet+='\xc0\x0c'
# Response type, ttl and resource data length -> 4 bytes
packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'
# 4bytes of IP
packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.')))
return packet
if __name__ == '__main__':
udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
udps.bind((conf.listen,53))
except socket.error, (val,e):
log.info("fakedns: %s"%e)
sys.exit(1)
log.info('fakedns: dom.query. 60 IN A %s' % conf.destip)
drop_privileges()
become_daemon()
try:
while 1:
data, addr = udps.recvfrom(1024)
#log.info(addr)
p=DNSQuery(data)
udps.sendto(p.respuesta(conf.destip), addr)
#log.info('%s -> %s' % (p.dominio, conf.destip))
log.info('fakedns: %s -> %s'%(p.dominio,addr[0]))
except KeyboardInterrupt:
log.info('fakedns: done.' % (p.dominio, conf.destip))
udps.close()
except:
log.info('fakedns: crashed serving %s (%s)'%(addr, data))
Klikanie we Flasha w Ubuntu 9.10
Nowe Ubuntu umożliwia nam skorzystanie z najnowszej wersji Flasha. Będziemy mieli okazje zapoznać się z takimi nowymi ficzerami jak migotanie obrazu uniemożliwiające oglądanie YouTube na pełnym ekranie czy niemożność kliknięcia w jakiś element wewnątrz Flasha (np. podczas ustawiania zakresu dat w Google Analytics). Adobe’a, firmę za Flasha odpowiedzialną oraz za to jak pracuje on pod Linuxem, pozostawiam Waszej ocenie – mnie skończył się na dzisiaj jad
Rozwiązanie drugiego z wyżej wymienionych problemów jest bardzo proste i znalazłem je tutaj. Ten wpis jest jedynie tłumaczeniem.
Gotowy?
* Naciśnij Alt+F2 i Enter
* gksudo gedit /usr/lib/nspluginwrapper/i386/linux/npviewer
* Dodaj następującą linię przed ostatnią linią tekstu
* export GDK_NATIVE_WINDOWS=1
* Zapisz.
* Zrestartuj aplikacje używające Flasha
Zawartość pliku ostatecznie powinna wyglądać tak:

Windows Vista? Zmniejszyć partycję i postawić Ubuntu
Ten tekst pisałem miesiąc temu, ale nie miałem od tamtego czasu sposobności aby go opublikować. Plan był prosty. Na świeżo wypakowanym notebooku Della była zainstalowana Vista Home Premium – na jednej partycji, zajmującej cały dysk. Zaplanowałem zmniejszenie partycji do minimum, a następnie pozostawienie jej na później (w dalszym zamyśle – na nigdy), na reszcie dysku instalując Linux Ubuntu. Po kilku pierwszych czynnościach, próbach wykonania czegokolwiek, lekko sfrustrowany, zacząłem pisać tekst, który bardzo szybko przybrał na sile i urósł do rozmiarów tego wpisu
Myślę, że produkt Microsoft Windows 7 zrecenzuję pod kątem wykonania podobnych czynności niebawem, ponieważ Microsoft dał mi prawo do darmowego upgrejdu Visty
Microsoft Windows Vista Home Premium
Świeży, preinstalowany system przez Della, zajmuje 30 GB. Windows XP z grami, pakietami Office i wieloma innymi aplikacjami zbieranymi przez lata, z tego co pamiętam, na partycji 25 GB miał jeszcze trochę miejsca. Ubuntu do swobodnej pracy, pomieści się na 10 GB i będzie miał jeszcze zapas. Ba, można go uruchomić nawet z 1 GB pendrive’a z persistent storage (tzw. trwały dysk – zapisywane dane pozostają obecne nawet po restarcie).
Pierwsze kliknięcia
Wybierając Komputer / Zarządzaj (zatwierdzając monit UAC), a tam Menadżer dysków – mamy możliwość zmniejszenia rozmiaru partycji. Tutaj zaskoczenie, minimalnym rozmiarem partycji systemowej (przy zajętości dysku 30 GB) okazuje się 150 GB. Cóż. Wybrałem ów minimalny rozmiar, zatwierdziłem zmiany, komputer przez chwilę się wytężał, aby ostatecznie pojawił się komunikat Odmowa dostępu. Ponowna próba dała ten sam rezultat.
Dalsze kliknięcia
Postanowiłem walczyć dalej. Znalazłem darmowe oprogramowanie do zmiany rozmiaru partycji – EASEUS Partition Master Home Edition – łudząco przypominający program Partition Magic czy GParted. Niestety. Tutaj również poległem. Jak się okazało, ów oprogramowanie w wersji darmowej jest dostępne jedynie na wersję 32-bitową systemu. Za 64-bitową należy już zapłacić. To że 64-bitowy system nie jest w stanie poradzić sobie z aplikacją 32-bitową uważam również za porażkę architektów tego bądź co bądź – komercyjnego systemu.
Zdalne wsparcie administracyjne w oparciu o RealVNC również nie jest możliwe o ile UAC jest włączony – kiedy tylko pojawia się monit UAC o autoryzację wykonania danej operacji, RealVNC jest rozłączane. Po ponownym połączeniu nie ma możliwości pracy na tym oknie poprzez RealVNC. Jest to oczywiście niesamowity sukces separacji, jak dla systemu, który był tworzony na bazie środowiska graficznego.
Ostatecznie zdecydowałem się na wykorzystaniu Ubuntu Live CD i GParted’a. Jaki będzie efekt dowiem się za 7 minut. Aktualizacja: Po ponownym restarcie Visty, pojawiło się Narzędzie do naprawy systemu podczas uruchamiania pokazujące komunkat „Trwa próba naprawienia…” – próba trwała godzinę – przez ten czas nie było nam dane dowiedzieć się czy proces ten coś robi, czy się zawiesił. Zadnych szczegółów. Nic. A jednak! Vista odniosła sukces i wstała! Przypominają mi się tutaj narzekania użytkowników Gnome’a pod Linuxem, że jest mało opcji itp. Z tego co pamiętam, a Gnome używam na codzień – jeśli w jakiejś aplikacji trwa dłużej wykonywana czynność – zawsze istnieje możliwość zobaczenia szczegółów. Panowie z Visty powinni spróbować zgapić to tak samo jak ten widget zegarka
Coś mnie tchnęło i spróbowałem zainstalować jeszcze VirtualBox‘a. Oczywiście pojawiło się kilka monitów UAC, tak jakby jeden nie wystarczał… Ostatecznie sam instalator zdecydował, że dalej nie zabrnie, mimo kolejnych autoryzacji i zażyczył sobie za pośrednictwem kolejnego monitu, uruchomienie instalatora na prawach administratora. W takim momencie wystarczy nacisnąć Naprawa instalacji i zrobione. Postęp jest. Kiedyś było dalej, dalej, dalej. Teraz trzeba coś przeczytać i klikać w większej ilości
miejsc.
Wrażenia okiem użytkownika Ubuntu
Opiszę jeszcze swoje wrażenia, jako człowieka pracującego na codzień na Linux Ubuntu. Szczerze współczuje użytkownikom Visty. Kilka na pozór łatwych czynności naprawdę mnie zmęczyły (fakt, były też zaawansowane, czyli takie które… właśnie ni stąd ni z owąd, pojawił się kolejny ekran autoryzacji UAC. Java się chce aktualizować… kontynuuj… czyli takie które mogą zainstalować wirusa w sterownikach urządzenia). Swoją drogą, takie wtrącenia są wkurzające, prawda?
Pod Linuxem Ubuntu wykorzystuje się sudo. Ma ono bardzo prostą właściwość włączoną domyślnie – jeśli trzeba wykonać jakąś czynność na uprawnieniach administratora – monit pojawia się raz. Jeśli w określonej ilości czasu miałaby nastąpić ponownie sytuacja z potrzebą uruchomienia danej czynności na administratorze, jest ona uruchamiana. Dopiero jeśli ten czas się skończy, użytkownik musi się ponownie zautoryzować. Na dodatek nie jakimś głupim kliknięciem, tylko podając hasło do swojego konta.
W tzw międzyczasie dowiedziałem się jeszcze, że Vista nie ma profili sprzętowych, czyli próba uruchomienia systemu za pomocą środowiska zwirtualizowanego na tym samym, fizycznym dysku twardym jest poważnym proszeniem się o kłopoty.
Jako, że moje dotychczasowe doświadczenia z Vistą opierały się o wsparcie telefoniczne dla jej użytkowników, głównie w kwestiach uruchomienia sieci (a w zasadzie ewentualnego aktywowania ustawień DHCP), miałem okazję doświadczyć już problemów ze stosem IPv6 w tym systemie. Wygląda na to, że we wczesnych, nie aktualizowanych Vistach, jeśli użytkownik ma aktywowane IPv6 na interfejsie, nie uzyska adresu IPv4 od serwera DHCP. Takich przypadków miałem już kilka, co dość mizernie świadczy o tym systemie operacyjnym. Stos IP jest jest podwaliną na której można budować bezpieczny system. Jeśli ów stos kuleje, bezpieczeństwo systemu nie jest już tak istotne.
Podsumowanie
Nie wiem jak Wy oceniacie ten system, ale dla mnie, kierunek rozwoju platformy Microsoftu jest lotem koszącym. Nie wiem czego można się spodziewać po Windows 7, ale z tego co widziałem, wiem, że czeka mnie więcej telefonów od zagubionych dusz, które nie potrafią doklikać się do ustawień połączeń sieciowych. Złożoność systemu powinna rosnąć, ale nie w ten sposób. Przejście powinno być płynne. Bez rewolucji. Skoro architekci Windowsów tyle natchnienia czerpią z graficznych środowisk Linuxowych, to powinni zainteresować się tym, czy złożoność interfejsu oraz ilość „pokręteł” jest dla użytkowników problemem czy błogosławieństwem. Historii na ten temat nie trudno znaleźć. Przykładowa – sam Linus Torvalds, który stworzył pierwszego kernela Linuxowego, nie raz miał okazję się już przesiadać między Gnome, KDE i spowrotem
Wyłączenie użytkownikowi MOTD na Ubuntu
Tematyka niniejszego wpisu jest, można powiedzieć wręcz banalna, ale myślę, że to trick warty poznania lub przypomnienia. Nie dotyczy tylko i wyłącznie dystrybucji Ubuntu, ale w zasadzie wszystkich Linuxów.
Jeśli logujesz się po ssh na inny komputer, wyświetlana jest zawartość Message Of The Day (/etc/motd). Jeśli nie chcesz tego widzieć, w swoim katalogu domowym wystarczy utworzyć plik o nazwie .hushlogin, wersja copy & paste:
cd touch .hushlogin
(polecenie cd bez parametrów to kolejny trick – sprawia, że zostajemy przeniesieni do naszego katalogu domowego)
Efekt
Zilustrowałem poniżej:
nme@desktop ~ $ ssh laptop Linux laptop 2.6.31-14-generic-pae #48-Ubuntu SMP Fri Oct 16 15:22:42 UTC 2009 i686 To access official Ubuntu documentation, please visit: http://help.ubuntu.com/ System information as of Fri Nov 6 20:56:41 CET 2009 System load: 0.16 Memory usage: 18% Processes: 155 Usage of /: 7.1% of 35.51GB Swap usage: 0% Users logged in: 1 Graph this data and manage this system at https://landscape.canonical.com/ Last login: Fri Nov 6 20:55:19 2009 from desktop.local nme@laptop ~ $ touch .hushlogin nme@laptop ~ $ logout Connection to laptop closed. nme@desktop ~ $ ssh laptop nme@laptop ~ $
Proste, aczkolwiek przydatne
Dwa komputery z Linuxem – jedna klawiatura i mysz
Czy kiedykolwiek zdarzyło Ci się pracować na dwóch komputerach – np. notebooku i komputerze stacjonarnym, albo dwóch stacjonarnych jednocześnie? Frustrujące uczucie, kiedy mylą się myszki, prawda? Jeśli oba komputery pracują pod Linuxem – jest na to sposób!

Ostatnio coraz częsciej pracuje na większej ilości komputerów jednocześnie. Zwykle jest to komputer stacjonarny i notebook, ale bywają też bardziej rozbudowane konfiguracje. W takich sytuacjach aż chce się mieć możliwość aby wyjechać myszką „za” ekran i „wjechać” na drugi, najechać na aplikację i coś wpisać za pomocą klawiatury, tej, z której korzystałem do pracy na pierwszej stacji roboczej. Da się to zrobić - rozwiązaniem tego problemu jest mała aplikacja o nazwie x2x.
Aplikacja x2x świetnie współpracuje z ssh. Mamy dzięki temu szyfrowane połączenie między oboma stacjami roboczymi i nie musimy się obawiać, że ktoś podsłucha co wpisujemy.
Aby korzystać z x2x, musimy go najpierw zainstalować. Robimy to na komputerze do którego chcemy się podłączyć, czyli – jeśli standardowo pracujemy na komputerze stacjonarnym, a chcemy mieć możliwość „wyjechania myszką” na notebooka, x2x musimy zainstalować na notebooku.
sudo aptitude install x2x
Kiedy mamy już zainstalowaną aplikację, możemy ją wykorzystać.
x2x w Ubuntu 9.04 i wcześniejszych
Jeśli notebook stoi po lewej stronie, jak na obrazku załączonym powyżej, musimy podać parametr -west. Mamy do dyspozycji również -north, -south i -east.
ssh -X notebook "x2x -west -to :0.0"
W tym momencie możemy już pracować na obu komputerach, korzystając z klawiatury i myszy z pierwszego z nich.
x2x w Ubuntu 9.10 Karmic Koala
Nowe X’y, nowy gdm – sprawy się nieco skomplikowały. Problem zaczął doskwierać również innym i został rozwiązany przez Roberta Jennigsa i Davida Boersma’ę. Aby cieszyć się z x2x w Karmic, możemy skorzystać z poniższego skryptu.
Musimy ustawić w nim następujące parametry:
- USER – nazwa użytkownika na którego logujemy się na zdalnej maszynie
- HOST – adres IP komputera lub jego nazwa w DNS lub /etc/hosts
- HOSTNAME – nazwa zdalnego komputera (taka sama jak zawartość /etc/hostname)
- SIDE – z której strony naszego podstawowego ekranu myszka może wyjechać
#!/bin/bash # # x2x Karmic problem solution based upon: # https://bugs.launchpad.net/ubuntu/+source/x2x/+bug/471726 # Many thanks to Robert Jennings and David Boersma! # Setup: USER=user # remote host username HOST=ip # remote host IP or name HOSTNAME=nazwa_hosta # remote /etc/hostname SIDE=west # north / south / west / east COMPRESSION="-C" # comment out for LAN # No need to change anything below: MERGE="xauth merge /var/run/gdm/auth-for-$USER*/database" LIST="xauth list" REMOVE="xauth remove $HOSTNAME/unix:0" X2X="x2x -$SIDE -to :0.0" #ssh -X $COMPRESSION $USER@$HOST "$MERGE; $LIST; $X2X; $REMOVE" #ssh -X $COMPRESSION $USER@$HOST "$LIST" ssh -X $COMPRESSION $USER@$HOST "$MERGE; $X2X; $REMOVE"
Ja już się uzależniłem, Wam również polecam!
Cisza na blogu
Kolega ostatnio zapytał, dlaczego na blogu zapanowała taka grobowa cisza.
Fakt, przez prawie półtorej miesiąca nic tu nie zamieściłem. Czynników które ten fakt spowodowały było kilka, m.in nowy rok akademicki który dla mnie wiąże się z nieco bardziej wytężoną pracą (korzystając z okazji pozdrawiam moich studentów i studentki
) czy wrednym przeziębieniem które męczyło mnie ponad dwa tygodnie.
Głównym czynnikiem który spowodował zastój na blogu była jednak zmiana pracy. Poznaje teraz nowe środowisko, zarówno pod względem społecznym jak i systemowym
Nie mam w zasadzie powodów do narzekań – jest dobrze, choć niestety blog trochę ucierpiał, bo zmalała zarówno liczba subskrybentów jak również ilość dziennych odwiedzin.
Mam jednak nadzieję, jako, że wspomniane wcześniej środowisko systemowe jest nieco odmienne, że będę miał niebawem więcej ciekawych zagadnień o których będę mógł napisać. Na tą chwilę więcej czytam niż piszę, ale sytuacja niebawem się odmieni. Dlatego dziewięciu wiernych słuchaczy nie powinno być zawiedzonych
Jedno jest pewne – nie zamierzam tego bloga zarzucić.
Przespałem, jeśli o wpisy chodzi, kilka ważnych wydarzeń – takich m.in jak wyjście nowego Ubuntu 9.10 Karmic czy betę VirtualBox 3.1.0, ale myślę, że wszystko jest do odrobienia
Tych którzy wcześniej ten blog subskrybowali, a teraz przestali, jeśli będą mieli okazję ten tekst przeczytać – zachęcam do zastosowania prostej zasady – nigdy nie kasujcie subskrypcji ze swoich czytników feedów. Jeśli na jakimś blogu jest zastój, lub wpisy pojawiają się rzadziej – warto skatalogować je jako „Martwe” czy „Rzadkie”, bo kto wie, może niechący umkną Wam rzeczy o których chcielibyście wiedzieć, a dzięki takiemu zabiegowi od razu będziecie widzieli nową aktywność.
Na koniec tego krótkiego wpisu mała dygresja – Media zapowiadają, że za dwa tygodnie nastąpi szczyt zachorowań na grypę. Pocieszające jest to, że na nową, AH1N1 choruje w kraju w przybliżeniu 600 osób. Dla kraju liczącego sobie 38 mln obywateli, ta liczba brzmi jak szansa na wygranie w Lotto… czego w przeciwieństwie do grypy, Wam życzę!

