<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>virhilo.jogger.pl</title><link>http://blog.virhilo.net/</link><description>Wpisy z dziennika internetowego Jogger, wspomaganego przez Jabbera</description><lastBuildDate>Mon, 08 Mar 2010 14:44:16 +0100</lastBuildDate><generator>JoggerPL</generator><item><title>Słowa kluczowe</title><link>http://blog.virhilo.net/2009/10/27/slowa-kluczowe/</link><description>&lt;p&gt;Przeglądałem sobie przed chwila słowa kluczowe jakie sprowadzają internautów na tego bloga i postanowiłem się podzielić tymi &quot;najwybitniejszymi&quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;klawisz end&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;archlinux gsm&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;co robi klawisz end&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;home,pgup,end&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jak wcisnąć end na laptopie&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jak załadować plik na rapidshare&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jaka wielkość katalogu konsola&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;który klawisz to end&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;page down end&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;page down klawisz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;page up ktory to klawisz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;page up page down end home do czego służy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;po daje sprawdzanie pingow&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wyszukiwarki najszybsze&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;najszybsza pętla&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prawda ze ciekawe?;)&lt;/p&gt;
&lt;p&gt;A użytkowników mających problemy z klawiaturą odsyłam do bardzo fajnego &lt;a href=&quot;http://pl.wikipedia.org/wiki/Klawiatura_komputerowa#Uk.C5.82ad&quot;&gt;opisu wszystkich klawiszy w wikipedi&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Tue, 27 Oct 2009 19:21:21 +0100</pubDate><guid>http://blog.virhilo.net/2009/10/27/slowa-kluczowe/</guid><category>Ciekawostki</category><category>Jogger</category><category>Ogólne</category><category>google</category><category>analytics</category><category>slowa kluczowe</category></item><item><title>Nowe repozytorium pakietów dla Archlinuxa.</title><link>http://blog.virhilo.net/2009/08/14/nowe-repozytorium-pakietow-dla-archlinuxa/</link><description>&lt;p&gt;Do niedawna(jeszcze przed wakacjami wiec może niezupełnie niedawna) zajmowałem się oficjalnym polskim repozytorium pakietów dla Archlinuxa, jednak wycofałem się z projektu, na początku lipca razem z &lt;a href=&quot;http://sirmacik.net/&quot;&gt;sirmacikiem&lt;/a&gt; założyliśmy własne, prywatne repozytorium pakietów dla tej dystrybucji, hosting otrzymaliśmy dzięki uprzejmości &lt;a href=&quot;http://spof.pl/&quot;&gt;Zynzel'a&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pomyślałem ze pewnie znajdzie się kilka osób chcących skorzystać z naszych paczek, aby to zrobić wystarczy dodać do pliku &lt;i&gt;/etc/pacman.conf linijki:&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;[archrepo]
Server = http://archrepo.net/i686/&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;PS. wiem, wiem... dawno nic nie pisałem;) po prostu nie mam takiego nadmiaru czasu jak kiedyś&lt;/p&gt;
</description><pubDate>Fri, 14 Aug 2009 10:59:00 +0200</pubDate><guid>http://blog.virhilo.net/2009/08/14/nowe-repozytorium-pakietow-dla-archlinuxa/</guid><category>Arch Linux</category><category>Linux</category><category>Repo</category><category>Techblog</category><category>archrepo</category><category>archlinux</category><category>repozytorium</category><category>paczki</category><category>pakiety</category><category>arch</category></item><item><title>Wyświetlanie cytatów z serwisu bash.org.pl w konsoli</title><link>http://blog.virhilo.net/2009/03/29/wyswietlanie-cytatow-z-serwisu-bash-org-pl-w-konsoli/</link><description>&lt;p&gt;Ostatnio na IRC, nie pamiętam na jakim kanale, ktoś wkleił linka z &lt;a href=&quot;http://bash.org.pl&quot;&gt;bash'a&lt;/a&gt;, a inna osoba stwierdziła że nie może przeczytać cytatu z powodu braku X'ow. Oczywiście są tekstowe przeglądarki, ale na bash'u jest tyle reklam ze czasami cytat ginie w ich gąszczu, poza tym czasem nawet jak mamy X'y, możemy po prostu nie chcieć uruchamiać przeglądarki.&lt;/p&gt;
&lt;p&gt;Napisałem więc prosty skrypt w pythonie do odczytywania cytatów z bash'a pod konsolą. Skrypt oprócz wyświetlania cytatu z konkretnego odnośnika może wyświetlać ostatnie, bądź najlepsze cytaty, ich ilość została ograniczona do jednej strony, żeby nie obciążać serwisu, poza tym czytanie większej ilości cytatów pod konsolą nie było by zbyt wygodne.&lt;/p&gt;
&lt;p&gt;Aby dowiedzieć się jak korzystać ze skryptu wpisujemy:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;python bashreader.py -h&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Na koniec najważniejsze - &lt;a href=&quot;http://virhilo.unix.net.pl/bashreader.py&quot;&gt;źródła skryptu&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Sun, 29 Mar 2009 11:50:42 +0200</pubDate><guid>http://blog.virhilo.net/2009/03/29/wyswietlanie-cytatow-z-serwisu-bash-org-pl-w-konsoli/</guid><category>Python</category><category>Techblog</category><category>bash</category><category>bash.org.pl</category><category>cytaty</category><category>konsola</category></item><item><title>Poprawne działanie klawiszy Home, End, Page-Up i Page-Down w Linuksie.</title><link>http://blog.virhilo.net/2009/03/12/poprawne-dzialanie-klawiszy-home-end-page-up-i-page-down-w-l/</link><description>&lt;p&gt;Niektóre dystrybucje Linuksa(na przykład Debian) nie mają domyślnie wyłączoną bądź niepoprawnie skonfigurowaną obsługę klawiszy &lt;i&gt;Home&lt;/i&gt;, &lt;i&gt;End&lt;/i&gt;, &lt;i&gt;Page-Up&lt;/i&gt; i &lt;i&gt;Page-Down&lt;/i&gt; i po ich wciśnięciu pojawiają się tylko jakieś dziwne znaczki(zwykle '&lt;i&gt;~&lt;/i&gt;').&lt;/p&gt;
&lt;p&gt;Można to w bardzo prosty sposób naprawić, plikiem odpowiedzialnym za te ustawienia jest &lt;i&gt;/etc/inputrc&lt;/i&gt;, klawisze do akcji przypisujemy w tym pliku w postaci: &lt;strong&gt;&quot;kod znaku&quot;: akcja&lt;/strong&gt;. Aby dowiedzie się jakie kody znaków przypisane są do interesujących nas klawiszy wpisujemy polecenie: &lt;strong&gt;od -c&lt;/strong&gt;, po czym wciskamy interesujące nas klawisze, a następnie &lt;i&gt;ctrl+c&lt;/i&gt; aby zakończyć pobieranie kodów. W przypadku naciśnięcia po kolei klawiszy: &lt;i&gt;Home&lt;/i&gt;, &lt;i&gt;End&lt;/i&gt;, &lt;i&gt;Page-Up&lt;/i&gt; i &lt;i&gt;Page-Down&lt;/i&gt;, na moim laptopie wynik polecenia wygląda następująco:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;[virhilo@hpek ~]$ od -c
^[[7~^[[8~^[[5~^[[6~^C
[virhilo@hpek ~]$&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Gdy już znamy kody naszych znaków otwieramy do edycji plik &lt;i&gt;/etc/inputrc&lt;/i&gt; i szukamy w nim linijki zaczynającej zawierającej interesujący nas kod znaku, jeśli taką znajdziemy po prostu ją dkomentowujemy usuwając '#' z początku linii. Jeśli jednak nie uda nam się odnaleźć odpowiednich linijek musimy dopisać je sami zgodnie z podaną przeze mnie powyżej składnią. Oto lista najbardziej interesujących akcji:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;beginning-of-line&lt;/strong&gt; - przesuwa kursor na początek linii, czyli robi to co powinien robić klawisz &lt;i&gt;Home&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;end-of-line&lt;/strong&gt; - przesuwa kursor na koniec linii(klawisz &lt;i&gt;End&lt;/i&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;beginning-of-history&lt;/strong&gt; - przechodzi na początek historii ostatnio wpisywanych poleceń, zwykle robi to klawisz &lt;i&gt;Page-Up&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;end-of-history&lt;/strong&gt; - przechodzi na koniec listy ostatnio wykonywanych poleceń(klawisz &lt;i&gt;Page-Down&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;delete-char&lt;/strong&gt; - klawisz &lt;i&gt;Delete&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jak już zapiszemy zmiany w naszym pliku wystarczy się prze logować i można cieszyć się poprawnie działającymi klawiszami.&lt;/p&gt;
&lt;p&gt;Listę pozostałych akcji można znaleźć wpisując &lt;strong&gt;man /etc/inputrc&lt;/strong&gt;. Przykładowy zapis dla klawisza &lt;i&gt;Home&lt;/i&gt; wygląda następująco:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;&quot;\e[1~&quot;: beginning-of-line&lt;/code&gt;
&lt;/pre&gt;</description><pubDate>Thu, 12 Mar 2009 15:30:35 +0100</pubDate><guid>http://blog.virhilo.net/2009/03/12/poprawne-dzialanie-klawiszy-home-end-page-up-i-page-down-w-l/</guid><category>Linux</category><category>Techblog</category><category>/etc/inputrc</category><category>inputrc</category><category>home</category><category>end</category><category>page up</category><category>page down</category><category>debian</category></item><item><title>Python: najszybsze wyszukiwanie elementu jednej listy(krotki) w drugiej.</title><link>http://blog.virhilo.net/2009/03/02/python-najszybsze-wyszukiwanie-elementu-jednej-listy-krotki/</link><description>&lt;p&gt;Ostatnio w jednym skrypcie musiałem sprawdzać czy co najmniej jeden z elementów krotki znajduje się na liście, lista była dość spora więc zainteresowało mnie jaki jest najszybszy sposób na zrobienie tego.&lt;/p&gt;
&lt;p&gt;Podobno najszybszym sposobem na to są set'y, więc postanowiłem sprawdzić o ile szybszy jest ten sposób od przeglądania listy pętlą &lt;i&gt;for&lt;/i&gt; i sprawdzania za pomocą &lt;i&gt;in&lt;/i&gt; czy dany element z listy znajduje się w naszej krotce(lub odwrotnie). Napisałem więc prosty skrypt, tworzący trzystu elementową listę losowych ciągów znaków, a następnie porównałem użyciu modułu timeit czas wyszukiwania za pomocą podanego przeze mnie powyżej sposobu z czasem wyszukiwania przy użyciu metody &lt;i&gt;intersection&lt;/i&gt;, sprawdziłem też czy najpierw opłaci się przeszukiwać większą listę a potem mniejszą, czy na odwrót, żeby wyniki były bardziej wiarygodne pomiary były dokonywane dla 10 różnych list po czym obliczona została średnia, wyniki znajdują się poniżej:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pętla for(iterujemy po dłuższej, krotka-krotka): &lt;strong&gt;89.661784&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pętla for(iterujemy po krótszej, krotka-krotka): &lt;strong&gt;34.044677&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pętla for(iterujemy po krótszym, krotka-lista): &lt;strong&gt;32.959450&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Set'y (krotka-krotka): &lt;strong&gt;0.688639&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Set'y (krotka-lista): &lt;strong&gt;0.708086&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Przydałoby się chyba małe wyjaśnienie mojego zapisu. Pisząc iterujemy po większym miałem na myśli że większy że obiekt zawierający więcej wartości jest iterowany w pętli for natomiast obecność aktualnego elementu w mniejszym sprawdzamy przy pomocy &lt;i&gt;in&lt;/i&gt;. Ten zapis z myślnikiem występujący po przecinku oznacza: czym_jest_krótsza_lista-czym_jest_dłuższa_lista.&lt;/p&gt;
&lt;p&gt;Jak widać korzystanie z set'ów jest najszybszą formą wyszukiwania w takim przypadku, jeśli mimo wszystko chcemy używać pętli for a jedna z naszych list jest dłuższa od drugiej powinniśmy najpierw iterować po tej dłuższej liście. Zaskoczyło mnie to ze są różnice w szybkości w przypadku set'u tworzonego z listy i set'u tworzonego z krotki, wydawało mi, że takie sety są identyczne. Ok, a co w sytuacji gdy będziemy przeszukiwać nasze listy tylko raz? czy czas potrzebny na tworzenie z niej set'a, nie będzie na tyle duży ze używanie set'ów w takiej sytuacji przestanie być opłacalne? Oto wyniki:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tworzenie set'u z krotki: &lt;strong&gt;23.792158&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tworzenie set'u z listy: &lt;strong&gt;23.832875&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jak widać nawet jak do czasu potrzebnego na wyszukanie dodalibyśmy czas tworzenia set'u, nadal jest to najszybsza metoda. Mam nadzieje ze komuś przydadzą się moje testy, jak by ktoś chciał po testować u siebie udostępniam &lt;a href=&quot;http://virhilo.unix.net.pl/for_vs_set.py&quot;&gt;swój skrypt.&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Mon, 02 Mar 2009 22:41:32 +0100</pubDate><guid>http://blog.virhilo.net/2009/03/02/python-najszybsze-wyszukiwanie-elementu-jednej-listy-krotki/</guid><category>Python</category><category>Techblog</category><category>set</category><category>for</category><category>wyszukiwanie</category><category>timeit</category></item><item><title>Debian Lenny już stable</title><link>http://blog.virhilo.net/2009/02/15/debian-lenny-juz-stable/</link><description>&lt;p&gt;Planowane wydanie Debiana Lenny miało się odbyć wczoraj, lecz obrazy iso są dostępne do pobrania dopiero od dzisiaj od godziny 08:46. Znajdowały się one jednak na serwerze zgodnie z zapowiedzią, gdyż ich data ostatniej modyfikacji na serwerze to 14.02.09 i coś kolo godziny 17.&lt;/p&gt;
&lt;p&gt;Jeśli ktoś jest zainteresowany szczegółami dotyczącymi wydania odsyłam do &lt;a href=&quot;http://www.debian.org/News/2009/20090214&quot;&gt;oficjalnego newsa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Obrazy można oczywiście pobrać z &lt;a href=&quot;http://cdimage.debian.org/cdimage/release/5.0.0/i386/iso-dvd/&quot;&gt;oficjalnych serwerów Debiana&lt;/a&gt;, lub za pomocą &lt;a href=&quot;http://debian.org/CD/torrent-cd/&quot;&gt;BitTorrent'a&lt;/a&gt;, pozostaje tylko dopowiedzieć &quot;wreszcie&quot; ;)&lt;br&gt;
miłego używania:)&lt;/p&gt;
</description><pubDate>Sun, 15 Feb 2009 10:50:28 +0100</pubDate><guid>http://blog.virhilo.net/2009/02/15/debian-lenny-juz-stable/</guid><category>Linux</category><category>Debian</category><category>Lenny</category><category>Stable</category></item><item><title>Dziwne zachowanie Vima przy wklejaniu tekstu środkowym przyciskiem myszki</title><link>http://blog.virhilo.net/2008/11/18/dziwne-zachowanie-vima-przy-wklejaniu-tekstu-srodkowym-przyc/</link><description>&lt;p&gt;Po którejś z niedawnych aktualizacji Vim zaczął się bardzo dziwnie zachowywać, kiedy próbowałem coś wkleić używając środkowego przycisku myszki, najczęściej zamiast tekstu, który chciałem wkleić pojawiała się ostatnia zawartość rejestrów a Vim przechodził do trybu edycji. Wklejać przy pomocy myszki dawało się tylko w momencie gdy przytrzymywałem klawisz shift. Winowajcą okazał się być fragment:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;if has('mouse')
    set mouse=a
endif&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;z pliku &lt;i&gt;.vimrc&lt;/i&gt;, a problem ten można rozwiązać na dwa sposoby, albo zakomentować ten zapis stawiając &lt;strong&gt;&quot;&lt;/strong&gt; przed podanymi powyżej linijkami, albo zmieniając &lt;strong&gt;set mouse=a&lt;/strong&gt; na &lt;strong&gt;set mouse-=a&lt;/strong&gt;. Jeśli uruchamiamy Vima poleceniem Vi, to powinniśmy dokonać analogicznej zmiany w pliku &lt;i&gt;.virc&lt;/i&gt;, lub utworzyć alias poleceniem: &lt;strong&gt;alias vi=vim&lt;/strong&gt;.&lt;/p&gt;
</description><pubDate>Tue, 18 Nov 2008 00:01:13 +0100</pubDate><guid>http://blog.virhilo.net/2008/11/18/dziwne-zachowanie-vima-przy-wklejaniu-tekstu-srodkowym-przyc/</guid><category>Arch Linux</category><category>Linux</category><category>Techblog</category><category>vi</category><category>vim</category><category>wklejanie</category><category>środkowy przycisk myszki</category></item><item><title>Sprawdzanie odpowiedzi serwerów HTTP w Pythonie.</title><link>http://blog.virhilo.net/2008/09/19/sprawdzanie-odpowiedzi-serwerow-http-w-pythonie/</link><description>&lt;p&gt;Oto &lt;a href=&quot;http://virhilo.unix.net.pl/httpchecker.py&quot;&gt;prosta klasa&lt;/a&gt; napisana w Pythonie do sprawdzania odpowiedzi serwerów HTTP:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;#-*- coding: utf-8

__author__ = 'Łukasz Fidosz'
__copyright__ = 'Copyright (c) 2008 Łukasz Fidosz'
__date__ = '20.09.2008'
__license__ = 'GPL'
__version__ = '0.1.1'

from httplib import HTTPConnection
import socket
from subprocess import Popen, PIPE, STDOUT

class HTTPChecker:

        def __init__(self, urllist):
                self.hosts=urllist
        
        def ping(self, host):
                rstatus='   '
                adress=host.split(':')[0]
                p=Popen('ping -q -c3 '+adress, shell=True, stderr=STDOUT, stdout=PIPE, close_fds=True)
                output=p.stdout.read()
                if output.find('unknown host') != -1:
                        return rstatus,'Unknown host'
                else:
                        lost_packets=int(output.split(' ')[-9][:-1])
                        if lost_packets &amp;gt; 35:
                                return rstatus,'Connection problems'
                        else:
                                return rstatus,'No HTTP server'

        def check_host(self, host, method='HEAD'):
                header={'User-agent' : 'Mozilla/5.0'}   
                connection=HTTPConnection(host)
                try:
                        connection.request(method, '/', {}, header)
                except socket.error:
                        return self.ping(host)
                else:
                        response=connection.getresponse()
                        if response.status==501:
                                self=check_host(host, 'GET')
                        return response.status,response.reason

        def run(self):
                for host in self.hosts:
                        result=self.check_host(host)
                        message=host.ljust(30, '.')+': '+str(result[0])
                        if result[0]==200:
                                message+=' \033[1;32m'
                        else:
                                message+=' \033[1;31m'
                        message+=result[1]+'\033[0;m'
                        print message&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Postaram się omówić w miarę dokładnie cały kod. Zacznijmy od metody &lt;strong&gt;check_host&lt;/strong&gt;, gdyż to ona wykonuje całe zadanie, czyli pobiera od podanego w argumencie &lt;i&gt;host&lt;/i&gt; serwera HTTP nagłówki HTTP i zwraca je.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;header={'User-agent' : 'Mozilla/5.0'}&lt;/strong&gt; ustala nagłówki jakie będą wysyłane przy połączeniu, w naszym przypadku jest to nazwa przeglądarki jaką udawał będzie nasz skrypt, ponieważ niektóre serwisy wysyłają nagłówek &lt;i&gt;403 Forbidden&lt;/i&gt; gdy przy połączeniu nie otrzymają nazwy przeglądarki(robi tak na przykład serwis &lt;a href=&quot;http://distrowatch.com/&quot;&gt;Distrowatch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;connection=HTTPConnection(host)&lt;/strong&gt; nawiązuje połączenie z danym serwerem, i przypisuje uchwyt do niego do zmiennej connection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;connection.request('HEAD', '/', {}, header)&lt;/strong&gt; próbuje wysłać do serwera żądanie nagłówka HTTP, jak widzimy przekazujemy przy tym żądaniu wcześniej spreparowany nagłówek, jeśli operacja ta się nie powiedzie wywołujemy metodę ping, która sprawdza czy w ogóle taki host istnieje oraz czy jesteśmy połączeni z internetem i zwracamy wynik jej działania. Metodę ping omówimy za chwile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;response=connection.getresponse()&lt;/strong&gt; przypisuje zmiennej response obiekt zawierający odpowiedź serwera&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;return response.status,response.reason&lt;/strong&gt; zwraca jako wynik działania metody krotkę zawierającą kod odpowiedzi serwera oraz jego opis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Metoda &lt;strong&gt;run wywołuje funkcję&lt;/strong&gt; check_host dla każdej nazwy hosta lub adresu IP podanych do klasy w metodzie &lt;i&gt;__init__&lt;/i&gt;, po czym drukuje odpowiednio sformatowany wynik. Omówmy jej kod:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;result=self.check_host(host)&lt;/strong&gt; przypisuje to zmiennej result krotkę zwróconą przez metodę &lt;strong&gt;check_host&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;message=host.ljust(30, '.')+': '+str(result[0])&lt;/strong&gt; przypisuje do zmiennej message wartość zmiennej host dopełnioną, tak dla czytelności z prawej strony kropkami do 30 znaków, po czym dodaje do tak przygotowanego stringa kod odpowiedzi HTTP&lt;/li&gt;
&lt;li&gt;Następnie sprawdzamy czy opis odpowiedzi HTTP to &lt;i&gt;OK&lt;/i&gt;, jeśli tak jest zmieniamy jego kolor na zielony instrukcją &lt;strong&gt;message+=' \033[1;32m'&lt;/strong&gt;, jeśli odpowiedź jest inna dajemy jej kolor czerwony poprzez dopisanie do zmiennej &lt;strong&gt;message&lt;/strong&gt; wartości &lt;i&gt;' \033[1;31m'&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;message+=result[1]+'\033[0;m'&lt;/strong&gt; przypisuje do zmiennej &lt;strong&gt;message&lt;/strong&gt; wspomniany już opis odpowiedzi HTTP, po czym przywraca domyślny kolor napisów&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Została nam jeszcze metoda ping, jej zadanie zostało już w skrócie opisane, przejdźmy więc do jej omawiania.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rstatus=' '&lt;/strong&gt; ustala co będzie zwracane przez metodę &lt;strong&gt;ping&lt;/strong&gt; jako kod odpowiedzi, jako że nie mamy tu do czynienia z kodami HTTP a chodzi nam jedynie o zwrócenie opisu, dajemy tutaj ze względów estetycznych 3 spacje(bo tyle cyfr mają kody odpowiedzi HTTP)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;p=Popen('ping -q -c3 '+host, shell=True, stderr=STDOUT, stdout=PIPE, close_fds=True)&lt;/strong&gt; wykonuje polecenie systemowe ping po czym przypisuje uchwyt do niego do zmiennej &lt;strong&gt;p&lt;/strong&gt;. Popen z takimi parametrami jest metodą zastępującą nam metodę &lt;i&gt;popem4&lt;/i&gt; z modułu &lt;i&gt;os&lt;/i&gt;, której używanie jest już niezalecane, funkcjonalność metody &lt;i&gt;popem4&lt;/i&gt; uzyskujemy sprawiając ze wyjście błędów jest przekazywane na standardowe wyjście wywoływanego polecenia(&lt;strong&gt;stderr=STDOUT&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;output=p.stdout.read()&lt;/strong&gt; przypisujemy tutaj do zmiennej &lt;strong&gt;output&lt;/strong&gt; wszystko co zwróciło polecenie systemowe &lt;i&gt;ping&lt;/i&gt;, robimy to wywołując metodę &lt;strong&gt;read()&lt;/strong&gt; na &lt;strong&gt;p.stdout&lt;/strong&gt;, który jest obiektem pliko podobnym&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;if output.find('unknown host') != -1:&lt;/strong&gt; sprawdza czy ping nie zwrócił przypadkiem wyrażenia &lt;i&gt;unknown host&lt;/i&gt;, jeśli tak kończymy wywołanie funkcji zwracając jako opis błędu string &lt;i&gt;Unknown host&lt;/i&gt;. W przeciwnym przypadku za pomocą instrukcji &lt;strong&gt;lost_packets=int(output.split(' ')[-9][:-1])&lt;/strong&gt; dzielimy nasz string w miejscu spacji zawierający wyjście na oddzielne elementy, po czym z tak otrzymanej listy wypieramy dziewiąty od końca element, on zawiera informacje o procencie utraconych pakietów, wyrażenie &lt;strong&gt;[:-1]&lt;/strong&gt; usuwa znak &lt;i&gt;%&lt;/i&gt;, który nie jest nam potrzebny. Sprawdzamy teraz czy ilość utraconych pakietów nie jest przypadkiem większa niż 35%(wysłaliśmy 3 pakiety i pozwalamy się ewentualnie jednemu zagubić) zwracamy jako opis błędu komunikat &lt;i&gt;Connection problems&lt;/i&gt;, jeśli jednak host daje się fingować oznacza to ze serwer HTTP nie jest na nim uruchomiony, o czym również informujemy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://virhilo.unix.net.pl/httpchecker.py&quot;&gt;Źródła skryptu&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Przykład użycia&lt;/h3&gt;
&lt;pre&gt;
&lt;code&gt;from httpchecker import *
check=HTTPChecker(('www.google.pl', 'www.archlinux.org', 'distrowatch.com'))
check.run()&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Co daje nam na przykład taki wynik:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;www.google.pl.................: 200 OK
www.archlinux.org.............: 200 OK
distrowatch.com...............: 200 OK&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;Warto przeczytać:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.python.org/dev/library/httplib.html&quot;&gt;Dokumentacja modułu HTTPLib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.python.org/dev/library/subprocess.html&quot;&gt;Dokumentacja modułu subprocess&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 19 Sep 2008 20:48:31 +0200</pubDate><guid>http://blog.virhilo.net/2008/09/19/sprawdzanie-odpowiedzi-serwerow-http-w-pythonie/</guid><category>Python</category><category>Techblog</category><category>httplib</category><category>http</category><category>nagłówki</category><category>test</category><category>ping</category></item><item><title>Odczytywanie haseł w operze</title><link>http://blog.virhilo.net/2008/09/10/otczytywanie-hasel-w-operze/</link><description>&lt;p&gt;Czasem zdarza się ze jakieś hasło wyleci nam z głowy, ale pewnie mamy je zapamiętane w przeglądarce, więc nie jest to problemem, dopóki nie potrzebujemy go wpisać w innym miejscu na danej stronie(np. podczas zmiany hasła), bądź w innej przeglądarce. O ile w przypadku Firefoxa jest to proste, gdyż ten posiada funkcje podglądu zapamiętanych przez niego haseł, to w przypadku Opery sprawa się nieco komplikuje, gdyż ta takiej funkcji domyślnie nie posiada. Po krótkich poszukiwaniach znalazłem rozwiązanie mojego problemu.&lt;/p&gt;
&lt;p&gt;Są to przyciski: &lt;a href=&quot;opera:/button/Go%20to%20page,%20&amp;quot;javascript:(function(){var%20s,F,j,f,i;%20s=%27%27;%20F=document.forms;%20for(j=0;%20j%3CF.length;%20++j){f=F[j];%20for(i=0;%20i%3Cf.length;%20++i){if(f[i].type%20&amp;amp;&amp;amp;%20f[i].type.toLowerCase()==%27password%27)s+=f[i].value+%27%5cn%27;}}if(s)alert(%27Passwords%20in%20forms%20on%20this%20page:%5cn%5cn%27+s);else%20alert(%27There%20are%20no%20passwords%20in%20forms%20on%20this%20page.%27);})();&amp;quot;,1,,&amp;quot;Wand&amp;quot;&quot;&gt;pierwszy&lt;/a&gt;, lub &lt;a href=&quot;opera:/button/Wand%20&amp;amp;%20Go%20to%20page,%20&amp;quot;javascript:(function(){var%20s,F,j,f,i;%20s=%27%27;%20F=document.forms;%20for(j=0;%20j%3CF.length;%20++j){f=F[j];%20for(i=0;%20i%3Cf.length;%20++i){if(f[i].type%20&amp;amp;&amp;amp;%20f[i].type.toLowerCase()==%27password%27)s+=f[i].value+%27%5cn%27;}}if(s)alert(%27Passwords%20in%20forms%20on%20this%20page:%5cn%5cn%27+s);else%20alert(%27There%20are%20no%20passwords%20in%20forms%20on%20this%20page.%27);})();&amp;quot;,1,,&amp;quot;Wand&amp;quot;&quot;&gt;drugi&lt;/a&gt;, obydwa pochodzą z &lt;a href=&quot;http://operawiki.info/PowerButtons#retrievewand&quot;&gt;Opera Browser Wiki&lt;/a&gt;. Wystarczy ze dodamy sobie jeden z nich do dowolnego z pasków, po czym w przypadku pierwszego z nich musimy najpierw kazać operze uzupełnić hasło, następnie zatrzymać ładowanie strony, kiedy hasło będzie już wpisane i kliknąć na ten przycisk, pojawi nam się okienko z naszym hasłem. W przypadku drugiego przycisku wystarczy ze na niego klikniemy, od razu pojawi nam się okienko z hasłem, a gdy je zamkniemy opera uzupełni hasło i zaloguje nas na daną stronę.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</description><pubDate>Wed, 10 Sep 2008 13:15:33 +0200</pubDate><guid>http://blog.virhilo.net/2008/09/10/otczytywanie-hasel-w-operze/</guid><category>Ogólne</category><category>Techblog</category><category>opera</category><category>hasło</category><category>odzyskiwanie</category><category>odczytywanie</category><category>wiki</category><category>przeglądarki</category></item><item><title>Firefox i... Onet, Interia, WP?</title><link>http://blog.virhilo.net/2008/09/09/firefox-i-onet-interia-wp/</link><description>&lt;p&gt;Domyślnie polska wersja Firefoxa po kliknięciu na link mailto pokazuje takie oto okienko:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://virhilo.unix.net.pl/img/firefox_mailto.png&quot; alt=&quot;Firefox mailto&quot;&gt;&lt;/p&gt;
&lt;p&gt;Zastanawia mnie jedno skoro Firefox pyta się i każe mi jeszcze czekać, jak chce coś świadomie zainstalować, to dlaczego domyślnie wciska mi razem ze spolszczeniem pocztę z Onetu czy WP? Co najciekawsze nigdzie w konfiguracji nie można tego wyłączyć(chyba ze mi nie udało się tego znaleźć).&lt;/p&gt;
&lt;p&gt;Jako ze nie odwiedzam i nie lubię żadnego z tych portali postanowiłem pozbyć się ich z tamtego okienka, okazało się ze winowajcą jest tutaj plik: &lt;i&gt;/usr/lib/firefox-3.0.1/chrome/pl.jar&lt;/i&gt; z polskiego pakietu lokalizacyjnego Firefoxa, stworzyłem po chwili &lt;a href=&quot;http://virhilo.unix.net.pl/pl.jar&quot;&gt;wersje tego pliku bez wpisów dotyczących poczty na wymienionych portalach&lt;/a&gt; i zastąpiłem nią oryginalny plik, okazało się ze to za mało, bo Firefox trzyma jeszcze informacje o tym w pliku: &lt;i&gt;~/.mozilla/firefox/xxqyo6cz.default/mimeTypes.rdf&lt;/i&gt; (gdzie xxqyo6cz to nazwa profilu). Usunięcie tego pliku(bądź usunięcie wpisów dotyczących poczty na Onecie Interii i WP) i zawartości folderu &lt;i&gt;~/.mozilla/firefox/xxqyo6cz.default/Cache/&lt;/i&gt; zadziałało-mamy teraz ładne okienko wyboru programu do otwierania odnośników mailto:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://virhilo.unix.net.pl/img/firefox_mailto_clear.png&quot; alt=&quot;Czyste okienko mailto w Firefoxie&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; w aktualnej wersji firefoxa(3.0.3) można już zmienić to z poziomu przeglądarki przez &lt;i&gt;preferencje-&amp;gt;aplikacje-&amp;gt;mailto&lt;/i&gt;, jak &lt;a href=&quot;http://blog.jiobel.com/&quot;&gt;Jiobel&lt;/a&gt; napisal w komentarzu. Czyżby bug w poprzedniej wersji?&lt;/p&gt;
</description><pubDate>Tue, 09 Sep 2008 14:09:42 +0200</pubDate><guid>http://blog.virhilo.net/2008/09/09/firefox-i-onet-interia-wp/</guid><category>Linux</category><category>Ogólne</category><category>firefox</category><category>poczta</category><category>mailto</category><category>onet</category><category>interia</category><category>wp</category></item><item><title>Netris</title><link>http://blog.virhilo.net/2008/09/09/netris/</link><description>&lt;p&gt;Wczoraj, po długiej przerwie znowu zagrałem w tą grę, a więc czym jest netris? Netris jest grą prawie identyczną jak te ze znany nam wszystkim tetris, z jedną różnicą-jest przeznaczona dla dwóch graczy(przez sieć). Zasady są proste który gracz pierwszy zapełni swoją plansze przegrywa. Jeśli któryś gracz zapełni więcej niż jeden wiersz jednocześnie, wtedy taka ilośc wierszy zostanie dostawionych na dole planszy jego przeciwnika.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://virhilo.unix.net.pl/img/netris.png&quot; alt=&quot;Netris screenshot&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Instalacja&lt;/h3&gt;
&lt;p&gt;Aby zainstalować netrisa w Arch Linuxie wydajemy polecenie:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;pacman -S netris&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;W innych dystrybucjach postępujemy analogicznie, jeśli jednak nie było by pakietu netris w naszej dystrybucji, bądź nie mamy uprawnień do instalowania pakietów(chcemy uruchomić grę na shellu) możemy wtedy skompilować grę &lt;a href=&quot;http://www.netris.org/&quot;&gt;ze źródeł&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Uruchomienie&lt;/h3&gt;
&lt;p&gt;Aby rozpocząć grę jeden z graczy musi zostać hostem i oczekiwać na połączenie drugiego gracza, robimy to wpisując:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;netris -w&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Możemy dodać jeszcze parametr &lt;strong&gt;-p&lt;/strong&gt; który zmieni domyślny(9284) port na jakim gra będzie oczekiwała na połączenie, drugi gracz musi wtedy oczywiście podać ten sam port&lt;/p&gt;
&lt;p&gt;Pierwszy gracz oczekuje teraz aż do niego dołączymy, wydajemy więc polecenie:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;netris -c adres_ip_pierwszego_gracza&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;Sterowanie&lt;/h3&gt;
&lt;p&gt;Domyślne klawisze sterujące w netrisie mogą wydać się nieco dziwne, ale łatwo się przyzwyczaić, a jak komuś się to nie uda, gra pozwala zmianę klawiszy na takie jakie nam odpowiadają. Standardowo wygląda to tak:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;j&lt;/strong&gt; - w lewo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;k&lt;/strong&gt; - obrócenie klocka&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;l&lt;/strong&gt; - w prawo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;spacja&lt;/strong&gt; - opuszczenie klocka&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;m&lt;/strong&gt; - przyspieszenie opadania klocka&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;s&lt;/strong&gt; - włączenie/wyłączenie wyświetlania planszy przeciwnika&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;p&lt;/strong&gt; - pauza&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;f&lt;/strong&gt; - przyspieszenie gry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;^l(ctrl+l)&lt;/strong&gt; - przerysowanie ekranu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n&lt;/strong&gt; - nowa gra&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Więcej informacji&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;netris -h&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pl.wikipedia.org/wiki/Netris&quot;&gt;Netris na Wikipedii&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 09 Sep 2008 11:36:33 +0200</pubDate><guid>http://blog.virhilo.net/2008/09/09/netris/</guid><category>Gry</category><category>Linux</category><category>Techblog</category><category>netris</category><category>tetris</category><category>sieć</category></item><item><title>Wypisywanie rozmiarów katalogów pod konsolą</title><link>http://blog.virhilo.net/2008/09/04/wypisywanie-rozmiarow-katalogow-pod-konsola/</link><description>&lt;p&gt;Czasem zdarza się ze zastanawiamy się co zajmuje tyle miejsca w danym katalogu, najlepszym sposobem na sprawdzenie tego jest wpisanie po prostu &lt;strong&gt;ls -lh&lt;/strong&gt;, co wypisze nam wszystkie pliki w danym katalogu i poda ich rozmiary w przystępnej formie(kilobajty, megabajty etc.), jednak problem pojawi się kiedy mamy w tym katalogu jakieś podkatalogi, otrzymamy wtedy tylko rozmiar każdego z tych katalogów bez ich zawartości(zwykle będą to 4KB), a przecież nie o to nam chodziło. Przedstawię więc kilka sposobów jak otrzymać rozmiary wszystkiego w danym katalogu, bez wyjątku:)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;du -h --max-depth=1&lt;/strong&gt;, lub poprostu &lt;strong&gt;du -sh *&lt;/strong&gt; oto najprostsze i zarazem najlepsze rozwiązanie tego problemu, wielkie dzięki dla &lt;i&gt;skolima&lt;/i&gt; za wspomnienie mi o tym, poniższe rowiązania są wiec bardziej ciekawostką.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;du -sh $(ls -A)&lt;/strong&gt; najpierw za pomocą ls wypisujemy listę plików z danego katalogu, parametr &lt;strong&gt;-A&lt;/strong&gt; sprawia że wypisywane są też pliki których nazwa zaczyna się od &lt;strong&gt;.&lt;/strong&gt; czyli pliki ukryte(z wyjątkiem &lt;strong&gt;.&lt;/strong&gt; i &lt;strong&gt;..&lt;/strong&gt;), kiedy już mamy listę plików przekazujemy ją do polecenia &lt;strong&gt;du&lt;/strong&gt;, które zwróci rozmiar każdego z tych plików, a więc również podkatalogów(jak wiemy w linux'ie wszystko jest plikiem), parametr -s sprawia będziemy otrzymywali łączny rozmiar każdego katalogu, bez rozdrabniania się na katalogi, co uczyni wszystko czytelniejszym, natomiast &lt;strong&gt;-h&lt;/strong&gt; sprawia ze rozmiary będą wypisywane w przystępnych dla ludzi jednostkach(czyli jak wcześniej: kilobajtach, megabajtach, gigabajtach itd.). Sposób ten nie jest jednak pozbawiony wad, gdyż jeśli mamy w naszym katalogu pliki ze spacjami w nazwach zamiast wyświetlać ich rozmiary będzie zgłaszał błędy. Poniżej przedstawię więc lepsze rozwiązanie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shopt -s dotglob; for x in *; do du -sh &quot;$x&quot;; done&lt;/strong&gt; oto rozwiązanie lepsze od powyższego, bo mamy pewność ze na pewno uwzględni wszystkie pliki i nie pominie tych ze spacjami czy innymi dziwnymi znakami w nazwach. Jest w prawdzie sporo dłuższe, ale czemu nie zrobić aliasu bądź nie zapisać do do pliku i wrzucić do &lt;i&gt;/usr/bin&lt;/i&gt;. Już omawiam co się tam dzieje: &lt;strong&gt;shopt -s dotglob&lt;/strong&gt; zmienia ustawienia aktualnej powłoki sprawiając że przy listowaniu wszystkich plików za pomocą gwiazdki będą także pokazywane pliki ukryte. Dalej mamy pętle która wykonuje dla każdego pliku w danym katalogu znane nam już polecenie &lt;strong&gt;du -sh&lt;/strong&gt;, a przed dziwnymi znakami w nazwach zabezpieczyliśmy się ujmując zmienną &lt;strong&gt;$x&lt;/strong&gt; zawierającą nazwy kolejnych plików w &lt;strong&gt;&quot;&quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tylko katalogi:)&lt;/h3&gt;
&lt;p&gt;Czasem zwykłe pliki nas nie interesują i chcemy wylistować tylko rozmiary katalogów, oto jak to zrobic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;du -h --max-depth=1 */&lt;/strong&gt; zmiana w tym poleceniu to zastąpienie &lt;strong&gt;*&lt;/strong&gt; przez &lt;strong&gt;*/&lt;/strong&gt;, co zamiast wszystkich plików w danym katalogu wybiera tylko katalogi się w nim znajdujące.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shopt -s dotglob; for x in */; do du -sh &quot;$x&quot;; done&lt;/strong&gt; róznica między wersją dla wszystkich plików, a tą jest taka sama jak w powyższym przypadku.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;find -maxdepth 1 -type d -exec du -sh '{}' ';'&lt;/strong&gt; to rozwiązanie trwa ponad 2 krotnie dłużej niż sposób z wykorzystaniem pętli(pętla: 1m 3.916s, find: 2m 31.236s). Tak w skrócie omówię to polecenie: &lt;strong&gt;-maxdepth 1&lt;/strong&gt; sprawia że find nie będzie zagłębiał się w podkatalogi, &lt;strong&gt;-type d&lt;/strong&gt; wybiera tylko pliki które są katalogami, &lt;strong&gt;-exec&lt;/strong&gt; wykonuje jakieś polecenie dla każdego z plików, w naszym przypadku, znane nam już &lt;strong&gt;du -sh&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Na zakończenie jeszcze skrypcik autorstwa &lt;a href=&quot;http://deetah.net/&quot;&gt;DeeTah&lt;/a&gt;, który wyświetla pliki jak &lt;i&gt;ls&lt;/i&gt;, ale podaje poprawne rozmiary katalogów:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;for PLICZEK in *; do 
ROZMIAR=$( ls -dlh &quot;$PLICZEK&quot; | awk '{ print $5 }' )
FAKTYCZNY_ROZMIAR=$(du --si --summarize &quot;$PLICZEK&quot; | awk '{print $1 }' )
ls -dlh &quot;$PLICZEK&quot; | sed &quot;s@$ROZMIAR@$FAKTYCZNY_ROZMIAR@g&quot;
done&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;Dodatkowe informacje:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;man find&lt;/li&gt;
&lt;li&gt;man bash&lt;/li&gt;
&lt;li&gt;man du&lt;/li&gt;
&lt;li&gt;man ls&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 04 Sep 2008 17:39:33 +0200</pubDate><guid>http://blog.virhilo.net/2008/09/04/wypisywanie-rozmiarow-katalogow-pod-konsola/</guid><category>Bash</category><category>Linux</category><category>rozmiar</category><category>katalog</category><category>plik</category><category>du</category><category>ls</category><category>find</category><category>miejsce</category></item><item><title>Spolszczanie polskiego repozytorium Arch Linux'a.</title><link>http://blog.virhilo.net/2008/09/02/spolszczanie-polskiego-repozytorium-arch-linux-a/</link><description>&lt;p&gt;Jestem administratorem &lt;a href=&quot;http://repo.arch-linux.pl/&quot;&gt;oficjalnego polskiego repozytorium Arch Linuxa&lt;/a&gt;, dzisiaj po przeczytaniu na forum sugestii &lt;a href=&quot;http://3ed.jogger.pl/&quot;&gt;3ED'a&lt;/a&gt; postanowiłem uczynić repo nieco bardziej polskim. Oto paczki które mają to uczynić:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;man-pages-pl&lt;/strong&gt; - polskie manuale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sms-pl&lt;/strong&gt; - program do wysyłania SMS'ów do polskich sieci GSM z pod konsoli&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;firefox-i18n-pl&lt;/strong&gt; - spolszczenie do firefox'a, paczka w przeciwieństwie do paczki &lt;i&gt;firefox-i18n&lt;/i&gt; z repozytorium &lt;i&gt;extra&lt;/i&gt; zawiera &lt;strong&gt;tylko&lt;/strong&gt; polską wersję językową&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;firefox-spell-pl&lt;/strong&gt; - polski słownik do firefox'a&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vim-spell-pl&lt;/strong&gt; - polski słownik do vim'a&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jeśli macie jeszcze jakieś propozycje paczek, proszę o zgłaszanie ich na &lt;a href=&quot;http://repo.arch-linux.pl/bug/&quot;&gt;flyspray'u&lt;/a&gt;. Pełna lista paczek znajduje się na &lt;a href=&quot;http://repo.arch-linux.pl/&quot;&gt;stronie repozytorium&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Tue, 02 Sep 2008 19:13:58 +0200</pubDate><guid>http://blog.virhilo.net/2008/09/02/spolszczanie-polskiego-repozytorium-arch-linux-a/</guid><category>Arch Linux</category><category>Repo</category><category>repozytorium</category><category>paczki</category><category>spolszczenie</category><category>słownik</category><category>polska</category><category>repo</category></item><item><title>Upload plików na Rapidshare w PHP.</title><link>http://blog.virhilo.net/2008/08/30/upload-plikow-na-rapidshare-w-php/</link><description>&lt;p&gt;Oto prosta klasa PHP mojego autorstwa do uploadu plików na Rapidshare i usuwania ich z stamtąd.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;&amp;lt;?php
/*
        Rapid.php Copyright by Łukasz Fidosz
        You may not use this script for commercial purposes.
        Wykorzystywanie tego skryptu w celach komercyjnych zabronione.
*/
class Rapid{

public $download_link='';
public $delete_link='';

public function __construct($url=null){
  if($url!=null){
    $this-&amp;gt;upload($url);
  }
}

protected function get_page_content($url){
        $read = curl_init($url);
        curl_setopt($read, CURLOPT_HEADER, FALSE);
        curl_setopt($read, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($read, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072612 GranParadiso/3.0.1');
        $page=curl_exec($read);
        curl_close($read);
        return $page;
}

protected function is_valid_rapid_url($url){
        if(!empty($url)){
                $url_regex='/^http\:\/\/(www\.)?rapidshare\.(com|de)';
                $url_regex.='\/files\/[0-9]{9}\/[a-z0-9\-_=\?\.]+$/i';
                if(preg_match($url_regex, $url)){
                        return TRUE;
                }
                else{
                        return FALSE;
                }
        }
        else{
                return FALSE;
        }
}
        
public function upload($file){
        if(file_exists($file)){
                if(filesize($file)&amp;gt;0){
                        $url=&quot;http://rapidshare.com/&quot;;
                        $page=$this-&amp;gt;get_page_content($url);

                        preg_match('/action=\&quot;(.*?)\&quot; enctype/is', $page, $form);

                        $postFields['filecontent']='@'.$file;
                        $read=curl_init($form[1]);
                        curl_setopt($read, CURLOPT_POSTFIELDS, $postFields);
                        curl_setopt($read, CURLOPT_RETURNTRANSFER, TRUE);
                        $page=curl_exec($read);

                        preg_match('/&amp;lt;div class=\&quot;downloadlink\&quot;&amp;gt;(.*?)&amp;lt;\/div&amp;gt;.*&amp;lt;div class=\&quot;loeschlink\&quot;&amp;gt;(.*?)&amp;lt;\/div&amp;gt;/is', $page, $links);
                        $this-&amp;gt;download_link=$links[1];
                        $this-&amp;gt;delete_link=$links[2];

                        return $this-&amp;gt;download_link;
                }
                else{
                        throw new exception('Plik jest pusty!');
                }
        }
        else{
                throw new exception('Plik nie istnieje!');
        }
}

public function delete($url=null){
        if($url==null){
                $url=$this-&amp;gt;delete_link;
        }
        if($this-&amp;gt;is_valid_rapid_url($url)){
                $page=$this-&amp;gt;get_page_content($url);
                if(preg_match('/window.location.href=\'(.*?)\'\&quot; value=\&quot;Delete this file now\&quot; \/&amp;gt;/is', $page, $delete)){
                        $read=curl_init($delete[1]);
                        curl_setopt($read, CURLOPT_RETURNTRANSFER, TRUE);
                        curl_exec($read);
                        curl_close($read);
                }
                else{
                        throw new exception('Pliku nie ma w serwisie Rapidshare!');
                }
        }
        else{
                throw new exception('Nieprawidłowy URL!');
        }
}

}
?&amp;gt;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Postaram się go w skrócie omówić. Zmienne &lt;strong&gt;$download_link&lt;/strong&gt; i &lt;strong&gt;$upload_link&lt;/strong&gt; będą przechowywały odpowiednio link do dodanego pliku i link do usunięcia go. Następnie mamy konstruktor, sprawdzamy w nim czy domyślna wartość argumentu jest różna od domyślnej wartości &lt;i&gt;null&lt;/i&gt;, czyli jej braku, wykonujemy wtedy funkcje &lt;strong&gt;upload()&lt;/strong&gt;, dzięki temu możemy tworząc nowy obiekt klasy &lt;i&gt;Rapid&lt;/i&gt; od razu załadować plik, jak i również utworzyć obiekt nie wykonując żadnych działań poza tym.&lt;/p&gt;
&lt;p&gt;Funkcja &lt;strong&gt;get_page_content($url)&lt;/strong&gt; pobiera zawartość strony WWW i zwraca ją w postaci stringa, działa ona(zresztą jak cały ten skrypt) w oparciu o &lt;a href=&quot;http://pl.php.net/curl&quot;&gt;cURL'a&lt;/a&gt;, więc jak by moje opisy komuś nie wystarczyły polecam przeczytać &lt;a href=&quot;http://tech.bigu.pl/podstawy-curla-w-php/&quot;&gt;wprowadzenie do tej biblioteki&lt;/a&gt;. Ok, teraz po kolei:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;curl_init($url)&lt;/strong&gt; tworzy nową sesje cURL'a nawiązując połączenie ze stroną podaną do funkcji jako w zmiennej &lt;strong&gt;$url&lt;/strong&gt; po czym przypisuje uchwyt to tej sesji do zmiennej &lt;strong&gt;$read&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;curl_setopt()&lt;/strong&gt; zmienia ustawienia danej sesji curl, zmienna zawierająca uchwyt do sesji(w naszym przypadku &lt;strong&gt;$read&lt;/strong&gt;) przekazywana jest jako pierwszy parametr, drugi parametr to stała określająca jaką opcję chcemy zmienić, trzeci parametr to wartość tej opcji, więc w naszym przypadku:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CURLOPT_HEADER&lt;/strong&gt; z wartością &lt;i&gt;FALSE&lt;/i&gt; sprawia że nagłówki strony nie będą pobierane&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CURLOPT_RETURNTRANSFER&lt;/strong&gt; z wartością &lt;i&gt;TRUE&lt;/i&gt; sprawia ze wynik działania cURL'a nie będzie wyświetlany na standardowe wyjście(ekran przeglądarki) tylko przekazywany jest do zmiennej&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CURLOPT_USERAGENT&lt;/strong&gt; ustawia identyfikacje przeglądarki pod jaką serwer www będzie widział nasz skrypt, czyli w tym przypadku identyfikacje skopiowana z mojego firefoxa: &lt;i&gt;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072612 GranParadiso/3.0.1&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;curl_exec($read)&lt;/strong&gt; wykonuje sesje cURL'a podana w zmiennej &lt;strong&gt;$read&lt;/strong&gt; po czym zwraca treść pobranej w ten sposób strony, przypisujemy ją do zmiennej &lt;strong&gt;$page&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;zamykamy sesje cURL'a funkcją: &lt;strong&gt;curl_close($read)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;i na koniec zwracamy naszą stronę za pomocą: &lt;strong&gt;return $page&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Następnie mamy funkcję &lt;strong&gt;is_valid_rapid_url($url)&lt;/strong&gt;, która służy nam do sprawdzenia czy podany w zmiennej &lt;strong&gt;$url&lt;/strong&gt; link jest prawidłowy. Najpierw sprawdzamy czy przypadkiem nie jest pusty, następnie za pomocą wyrażenia regularnego sprawdzamy czy link ma taką formę jaką mają URL'e w serwisie Rapidshare, czego dokonujemy funkcją &lt;strong&gt;preg_match()&lt;/strong&gt;, jeśli wszystko jest dobrze funkcja zwróci &lt;i&gt;TRUE&lt;/i&gt;, w przeciwnym przypadku &lt;i&gt;FALSE&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Zostały nam dwie główne funkcje, jako pierwszą omówimy &lt;strong&gt;upload($file)&lt;/strong&gt; ładującą plik na serwer Rapidshare i zwracającą link do niego, przyjmuje ona jako argument nazwę pliku do załadowania. Sprawdzamy najpierw za pomocą funkcji &lt;strong&gt;file_exists($file)&lt;/strong&gt; czy ten plik istnieje, jeśli nie zwracamy wyjątek: &lt;strong&gt;throw new exception('Pliku nie ma w serwisie Rapidshare!')&lt;/strong&gt;. Sprawdzamy jeszcze funkcją &lt;strong&gt;filesize($file)&lt;/strong&gt; czy plik przypadkiem nie ma zerowej wielkości, uploadowanie pustego pliku nie ma przecież sensu więc w tym przypadku również zwracamy wyjątek. Następnie korzystamy ze znanej nam już funkcji &lt;strong&gt;get_page_content&lt;/strong&gt;, w celu pobrania zawartości strony głównej serwisu Rapidshare i przypisujemy ją do zmiennej &lt;strong&gt;$page&lt;/strong&gt;. Do załadowania pliku potrzebujemy linku znajdującego się w kodzie formularza na pobranej przez nas przed chwilą stronie głównej. Robimy to za pomocą funkcji &lt;strong&gt;preg_match()&lt;/strong&gt;, jak widzimy może ona nie tylko sprawdzać czy wyrażenie zostało odnalezione, jako pierwszy argument podajemy wyrażenie regularne, jako drugi zmienną która będzie przeszukiwana, a jako trzeci zmienną w której w postaci tablicy będą przechowywane kolejne dopasowania do wyrażenia. Zmienna &lt;strong&gt;$postFields&lt;/strong&gt; jest tablicą asocjacyjną przechowującą nazwy pul w formularzu na stronie i wartości jakie zostaną do nich przekazane, w naszym przypadku jest to pole o nazwie &lt;i&gt;filecontent&lt;/i&gt;, gdyż właśnie taką nazwę ma to pole na serwisie Rapidshare, a jako wartość przypisujemy mu nazwę naszego pliku(zmienną &lt;strong&gt;$file&lt;/strong&gt;), przekazaną jako argument do tej funkcji. Mamy już wszystkie dane, inicjujemy więc nową sesje cURL, jako link do strony podajemy tym razem link do skryptu uploadującego pliki na Rapidshare, który przed chwilą wyciągnęliśmy za pomocą wyrażenia regularnego i przypisaliśmy do zmiennej &lt;strong&gt;$form&lt;/strong&gt;, która przechowuje tablicę zawierającą pod indeksem 0 cale dopasowane wyrażenie, a pod każdym kolejnym poszczególne interesujące nas części, jako ze w naszym przypadku taka część jest tylko jedna dowołujemy się do pierwszego indeksu tej tablicy. Uchwyt do naszej sesji przypisujemy do zmiennej &lt;strong&gt;$read&lt;/strong&gt;. Przechodzimy zmiany ustawień tej sesji, robiąc to tak jak poprzednio, mamy tu tylko jedna dodatkowa opcje: &lt;strong&gt;CURLOPT_POSTFIELDS&lt;/strong&gt; zawiera ona informacje jakie powinny zostać przesłane do formularza, przekazujemy je w zmiennej &lt;strong&gt;$postFields&lt;/strong&gt; którą przed chwilą opisałem, tym razem także wyłączamy wyświetlanie pliku na standardowe wyjście. Gotowe, pobieramy teraz stronę zapisując ją do zmiennej &lt;strong&gt;$page&lt;/strong&gt; i wyciągamy z niej za pomocą wyrażenia regularnego odnośnik do pliku i ten służący do jego usunięcia, następnie zapisujemy je do zmiennych public &lt;strong&gt;$download_link&lt;/strong&gt; i &lt;strong&gt;$delete_link&lt;/strong&gt;. Jako wynik działania funkcji zwracamy URL do załadowanego już pliku(czyli zmienną &lt;strong&gt;$download_link&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Czas na ostatnią funkcję w naszej klasie: &lt;strong&gt;delete($url=null)&lt;/strong&gt;. Sprawdzamy najpierw czy argument funkcji, czyli zmienna &lt;strong&gt;$url&lt;/strong&gt; nie ma wartości &lt;i&gt;null&lt;/i&gt;, jeśli tak jest to została ona wywołana bez argumentu(ewentualnie ktoś podał wartość &lt;i&gt;null&lt;/i&gt; dla niego), w takim przypadku zmiennej &lt;strong&gt;$url&lt;/strong&gt; przypisujemy wartość zmiennej &lt;strong&gt;$delete_link&lt;/strong&gt;, czyli usuniemy ostatnio załadowany plik. Następnie za pomocą funkcji &lt;strong&gt;is_valid_rapid_url($url)&lt;/strong&gt; sprawdzamy czy nasz URL jest prawidłowy, jeśli tak pobieramy jego zawartość funkcją &lt;strong&gt;get_page_content($url)&lt;/strong&gt; i przypisujemy do zmiennej &lt;strong&gt;$page&lt;/strong&gt;, w przeciwnym wypadku zwracamy odpowiedni wyjątek. Wyrażeniem regularnym wyciągamy z tej zmiennej URL usuwający plik, sprawdzamy jednocześnie czy plik nie został już usunięty, bądź link jest fikcyjny, w takim wypadku zwracamy wyjątek. Została już tylko formalność-odwiedzenie naszego linka, czyli tym samym usunięcie pliku.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://virhilo.unix.net.pl/rapid.php.txt&quot;&gt;Źródła skryptu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tak na zakończenie małe podziękowania dla &lt;a href=&quot;http://www.mieczkowski.org/&quot;&gt;Atara&lt;/a&gt;, który zawsze służy mi drobnymi radami odnośnie PHP.&lt;/p&gt;
</description><pubDate>Sat, 30 Aug 2008 20:29:44 +0200</pubDate><guid>http://blog.virhilo.net/2008/08/30/upload-plikow-na-rapidshare-w-php/</guid><category>PHP</category><category>Techblog</category><category>rapidshare</category><category>upload</category><category>curl</category><category>url</category><category>klasa</category></item><item><title>Licencje zabraniające komercyjnego wykorzystania.</title><link>http://blog.virhilo.net/2008/08/29/licencje-zabraniajace-komercyjnego-wykorzystania/</link><description>&lt;p&gt;Postanowiłem opublikować tutaj kilka swoich skryptów, jednak w niektórych przypadkach nie chciałem żeby ktoś mógł czerpać z nich korzyści finansowe, postanowiłem więc opublikować je na licencji zabraniającej komercyjnego użycia i tu pojawił się drobny problem-jaką licencje wybrać?.&lt;/p&gt;
&lt;p&gt;Pierwsza (i właściwie jako jedyna) do głowy przyszła mi licencja &lt;a href=&quot;http://pl.wikipedia.org/wiki/Creative_Commons&quot;&gt;Creative Commons&lt;/a&gt;, tylko nie byłem do końca pewny czy jest to odpowiednia licencja dla oprogramowania, gdyż nie spotkałem się do tej pory z oprogramowaniem licencjonowanym w ten sposób, była jedynie muzyka, filmy, zdjęcia, artykuły. Poza tym dział poświęcony oprogramowaniu na &lt;a href=&quot;http://creativecommons.org/software&quot;&gt;stronie Creative Commons&lt;/a&gt; chyba mówi swoje, gdyż polecane są tam licencje GPL i LGPL. Zapytałem jeszcze (kilkakrotnie nawet) o to na kanale &lt;i&gt;#cc&lt;/i&gt; sieci &lt;i&gt;freenode&lt;/i&gt;, jednak nie otrzymałem żadnej odpowiedzi.&lt;/p&gt;
&lt;p&gt;Postanowiłem więc rozejrzeć się za innymi licencjami, znalazłem więc &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_free_software_licences&quot;&gt;porównanie wolnych licencji&lt;/a&gt; i zacząłem się przyglądać po kolei, jedyną licencją pasującą do moich kryteriów była &lt;a href=&quot;http://pl.wikipedia.org/wiki/Common_Public_License&quot;&gt;Common Public License&lt;/a&gt;, jednak tutaj też nie mam całkowitej pewności ze całkowicie zabrania ona komercyjnego wykorzystania objętego nią oprogramowania, jest wspomniane jedynie o modyfikacjach. Przejrzałem więc zarówno &lt;a href=&quot;http://www-106.ibm.com/developerworks/library/os-cplfaq.html&quot;&gt;FAQ&lt;/a&gt; jak i &lt;a href=&quot;http://www.eclipse.org/legal/cpl-v10.html&quot;&gt;pełną treść licencji&lt;/a&gt; i nadal pewności nie mam. Może ktoś wie lepiej albo zna inną-lepszą licencje nadającą się do takich celów?&lt;/p&gt;
</description><pubDate>Fri, 29 Aug 2008 17:10:49 +0200</pubDate><guid>http://blog.virhilo.net/2008/08/29/licencje-zabraniajace-komercyjnego-wykorzystania/</guid><category>Ogólne</category><category>licencja</category><category>CPL</category><category>Creative Commons</category><category>Common Public License</category><category>GPL</category><category>LGPL</category></item><item><title>Wypisywanie nazw NetBIOS komputerów w sieci LAN.</title><link>http://blog.virhilo.net/2008/08/28/wypisywanie-nazw-netbios-komputerow-w-sieci-lan/</link><description>&lt;p&gt;Zainspirowany pytaniem &lt;i&gt;dziq&lt;/i&gt; z kanału #archlinux.pl o to czym można przejrzeć przyporządkowane poszczególnym adresom IP nazwy NetBIOS, napisałem taki oto krótki &lt;a href=&quot;http://virhilo.unix.net.pl/netbios_names&quot;&gt;skrypt&lt;/a&gt; w bash'u pobierający te dane przy pomocy &lt;i&gt;nmap'a:&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;1  #!/bin/bash
2  # netbios_names.sh copyright by Łukasz Fidosz 
3  # distributed under GNU General Public License version 3
4  if [ $UID -ne 0 ]; then
5    echo &quot;---&quot;
6    echo &quot;Błąd: skrypt musi zostać uruchomiony z konta root'a!&quot;
7    echo &quot;---&quot;
8    exit
9  fi
10 mkdir -p /tmp/hostnames
11 cd /tmp/hostnames
12 nmap -A $(nmap -sP 192.168.1.0/24 \
      | awk '/Host.*\ be up/ {print $2}') &amp;gt; hosty
13 csplit -s -k -f host hosty '/^Interesting ports on/' {*}
14 for i in /tmp/hostnames/host0*
15 do
16   if [ -n &quot;$(grep 'NetBIOS name' $i)&quot; ];
17     then
18       ip=$(awk '/Interesting ports on/ {print $4}' $i)
19       name=$(awk '/NetBIOS name:/ {print $5}' $i | tr -d ,)
20       echo &quot;$ip $name&quot;
22   fi
23 done
23 rm -rf ../hostnames&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Już tłumacze co robi główne polecenie-czyli 12-ta linijka. Linijka ta składa się z dwóch grup poleceń pierwsze &quot;wewnętrzne&quot;-znajdujące się wewnątrz &lt;strong&gt;$()&lt;/strong&gt; które zwraca w wyniku dane dla drugiego polecenia-&quot;zewnętrznego&quot;, dzieje się to właśnie dzięki znakom &lt;strong&gt;$()&lt;/strong&gt;. Zacznijmy więc od tego co jest wewnątrz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nmap -sP 192.168.1.1/24&lt;/strong&gt; Skanuje po kolei pingiem wszystkie komputery z podanej grupy adresów, w naszym przypadku jest to adres 192.168.1.0 z maską podsieci /24 zostaną więc sprawdzone wszystkie komputery o adresach IP z zakresu 192.168.1.0-192.168.1.255, wartość tą powinniśmy zmienić jeśli nasza sieć lokalna ma inny zakres adresów. Polecenie to zwróci informacje o tym które komputery z sieci są włączone które nie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;awk '{print $2}'&lt;/strong&gt; Zostawia tylko linijki zawierające adresy IP hostów które są aktualnie włączone, po czym zwraca wartość drugiego pola(domyślnym separatorem pul w awk jest spacja), czyli sam adres IP bez zbędnego tekstu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;String zwrócony przez poprzednie polecenie, zawierający listę adresów IP jest przekazywany następnie do polecenia &quot;zewnętrznego&quot;, czyli: &lt;strong&gt;nmap -A&lt;/strong&gt; nmap uruchomiony w ten sposób skanuje kolejno komputery których adresy IP jako argument, starając się wykryć jak najwięcej danych o systemie operacyjnym i nasłuchujących aplikacjach działających na danym komputerze, właśnie te dane zawierają nazwę NetBIOS, więc za pomocą &lt;strong&gt;&amp;gt;&lt;/strong&gt; przekierowujemy całe wyjście programy do pliku &lt;i&gt;hosty&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Wypadało by w jakiś przejrzysty sposób wyświetlić tylko te informacje które nas interesują. Najpierw na pomocą csplit'a dzielimy plik na mniejsze według wzorca, czyli każdy fragment pliku zaczynający się od &quot;Interesting ports on&quot; (tak właśnie zaczyna sie nmap'a dotyczący każdego komputera) znajdzie się w osobnym pliku, nie znalazłem lepszego sposobu aby oddzielić komputery nie których nazwy NetBIOS nie wykryto(odrzucamy porostu pliki, które nie zawierają słów &quot;NetBIOS name:&quot;).&lt;/p&gt;
&lt;p&gt;W dalszej części skryptu poruszamy się w pętli przez wszystkie utworzone przed chwilą pliki i jeśli któryś zawiera słowa &quot;NetBIOS name:&quot; (co sprawdzamy instrukcją warunkową z linijki 16), jeśli tak to poleceniami z linijek 18 i 19 zapisujemy adres IP znajdujący się w danym pliku do zmiennej IP a nazwę NetBIOS do zmiennej name po czym wypisujemy je w obok siebie.&lt;/p&gt;
&lt;p&gt;Aby uruchomić skrypt jako root wpisujemy: &lt;strong&gt;./netbios_names&lt;/strong&gt; (gdzie netbios_names.sh jest nazwą pod jaką zapisaliśmy skrypt, wcześniej musimy nadać mu prawa uruchamiania co robimy przez polecenie: chmod +x netbios_names).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; Wykonywanie skryptu może potrwać naprawdę długo jeśli dużo komputerów w naszej sieci jest włączonych, każdy z nich jest dość dokładnie skanowany przez &lt;i&gt;nmap'a&lt;/i&gt; wiec warto uzbroić się w cierpliwość;)&lt;/p&gt;
&lt;p&gt;Oto przykład uruchomienia skryptu:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;[root@hpek virhilo]# ~virhilo/skrypty/bash/netbios_names
192.168.1.100: MARK                                         
192.168.1.101: AGA&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://virhilo.unix.net.pl/netbios_names&quot;&gt;Źródła skryptu&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Więcej informacji&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;man nmap&lt;/li&gt;
&lt;li&gt;man grep&lt;/li&gt;
&lt;li&gt;man awk&lt;/li&gt;
&lt;li&gt;man csplit&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 28 Aug 2008 17:38:26 +0200</pubDate><guid>http://blog.virhilo.net/2008/08/28/wypisywanie-nazw-netbios-komputerow-w-sieci-lan/</guid><category>Arch Linux</category><category>Bash</category><category>Linux</category><category>nmap</category><category>netbios</category><category>lan</category><category>nazwy hostów</category><category>csplit</category></item><item><title>Dzielenie plików w Linux'ie</title><link>http://blog.virhilo.net/2008/08/25/dzielenie-plikow-w-linuksie/</link><description>&lt;p&gt;Czasem zdarza ze nasz plik jest za duży żeby go zapisać w całości na pojedynczy nośnik, lub przekracza limit nałożony przez serwer na którym chcemy go umieścić, jednym z rozwiązań w takiej sytuacji jest podzielenie pliku na części. Przedstawię w tym artykule kilka sposobów jak zrobić to w Linuksie.&lt;/p&gt;
&lt;h3&gt;1. Split&lt;/h3&gt;
&lt;p&gt;Program &lt;i&gt;split&lt;/i&gt; jest częścią pakietu &lt;i&gt;coreutils&lt;/i&gt; powinien więc znajdować się domyślnie w każdej dystrybucji. Załóżmy ze mamy plik &lt;i&gt;pliczek.iso&lt;/i&gt; i ma on rozmiar 200MB,a chcemy go podzielić na części po 35MB, wydajemy więc polecenie:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;split -b 35M -d pliczek.iso pliczek.iso.&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Już tłumacze co robią poszczególne parametry.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-b&lt;/strong&gt; rozmiar każdej części w bajtach(gdzie litera po numerze oznacza odpowiednio: M - megabajty, K - kilobajty, a G - gigabajty)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-d&lt;/strong&gt; sprawia ze końcówka nazwy każdej części będzie numerem, a nie jak domyślnie litera(co jest moim zdaniem nieczytelne), ilość cyfr z ilu składa się numer określa parametr &lt;strong&gt;-a&lt;/strong&gt;(domyślną wartością jest 2).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pliczek.iso&lt;/strong&gt; nazwa naszego pliku&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pliczek.iso.&lt;/strong&gt; nazwa każdej części, w naszym przypadku nazwa pliku, kropkę na końcu dodałem ze względu estetycznego, dzięki temu dodany przez program numer każdej części nie będzie zlewał nam się z rozszerzeniem. Jeśli nie podamy tego parametru każdy plik będzie miał nazwę 'x' połączoną z numerkiem części, czyli na przykład: 'x05'.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Po wydaniu tego plecenia nasz katalog wygląda następująco:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;[virhilo@hpek dzielenie]$ ls -lh
total 401M
-rw-r--r-- 1 virhilo virhilo 200M 2008-08-25 11:50 pliczek.iso
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:04 pliczek.iso.00
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:04 pliczek.iso.01
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:04 pliczek.iso.02
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:04 pliczek.iso.03
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:04 pliczek.iso.04
-rw-r--r-- 1 virhilo virhilo  25M 2008-08-25 12:04 pliczek.iso.05&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Jak widzimy plik został poprawnie podzielony:)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;Łączenie pliku pociętego splitem&lt;/h4&gt;
&lt;p&gt;Ok. Mamy już nasz plik w częściach, jednak w tej formie jest on raczej mało użyteczny, połączmy go w całość(użyjemy do tego celu polecenia &lt;i&gt;cat&lt;/i&gt;):&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;cat pliczek.iso.0* &amp;gt; polaczony.iso&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Pierwszym parametrem są nazwy naszych części, w naszym przypadku powtarzająca się część nazwy zakończona gwiazdka, gdyż wypisywanie wszystkich części po kolei, szczególnie w przypadku większej ich ilości nie ma sensu.&lt;/p&gt;
&lt;p&gt;Następnie występuje znak przekierowania standardowego wyjścia, gdyż to na nie &lt;i&gt;cat&lt;/i&gt; domyślnie wyświetla zawartość połączonego pliku.&lt;/p&gt;
&lt;p&gt;Ostatnim parametrem jest nazwa pliku wynikowego, w naszym przypadku &lt;i&gt;polaczony.iso&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Gotowe:) mamy już połączony plik, dla pewności porównajmy sumy kontrolne:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;[virhilo@hpek dzielenie]$ md5sum polaczony.iso pliczek.iso
b8b7bbc9c242f6e31977f6232629680e  polaczony.iso
b8b7bbc9c242f6e31977f6232629680e  pliczek.iso&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;jak widzimy są identyczne, więc wszystko przebiegło prawidłowo.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Co jednak zrobić gdy potrzebujemy połączyć podzielony plik pod systemem Windows, nie wiem jak wyglądało by tam łączenie tak podzielonego pliku, tak więc przedstawię alternatywne metody&lt;/p&gt;
&lt;h3&gt;2. 7-zip&lt;/h3&gt;
&lt;p&gt;7-zip jest otwartym programem kompresującym oferującym stopień kompresji wyższy o około 30-50% od archiwów zip, więcej informacji można znaleźć na &lt;a href=&quot;http://www.7-zip.org/&quot;&gt;stronie programu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Zaczynamy od zainstalowania 7-zip'a, w przypadku Archlinux'a instalujemy pakiet &lt;i&gt;p7zip&lt;/i&gt; wydając polecenie:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;pacman -Sy p7zip&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;natomiast w przypadku Windowsa pobieramy &lt;a href=&quot;http://www.7-zip.org/download.html&quot;&gt;odpowiedni plik instalacyjny&lt;/a&gt; ze strony programu. Dalej omawiał będę całą operacje tylko pod Linuksem, pod Windowsem mamy do dyspozycji tryb okienkowy, więc nie powinno być problemów.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Plik kompresujemy i dzielimy na części wydając polecenie:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;7z -v 35m a pliczek.7z pliczek.iso&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Parametry:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-v&lt;/strong&gt; oznacza rozmiar każdej części, litera na końcu oznacza jednostkę(odpowiednio b, k, m, g)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;a&lt;/strong&gt; oznacza dodanie plików do archiwum, czyli w naszym przypadku utworzenie nowego archiwum&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pliczek.7z&lt;/strong&gt; to nazwa archiwum&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pliczek.iso&lt;/strong&gt; to nazwa naszego pliku&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Możemy również dodać prametr: &lt;strong&gt;-mx=0&lt;/strong&gt;, cyfra oznacza stopień kompresji, czyli w tym przypadku jej brak.&lt;/p&gt;
&lt;p&gt;Po wydaniu tego polecenia mamy w naszym katalogu pliki:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;[virhilo@hpek dzielenie]$ ls -lh
total 404M
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:54 pliczek.7z.001
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:51 pliczek.7z.002
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:52 pliczek.7z.003
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:52 pliczek.7z.004
-rw-r--r-- 1 virhilo virhilo  35M 2008-08-25 12:53 pliczek.7z.005
-rw-r--r-- 1 virhilo virhilo  28M 2008-08-25 12:54 pliczek.7z.006&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Tak przygotowane archiwum dekompresujemy i łączymy poleceniem:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;7z x pliczek.7z.001&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Gdzie: &lt;strong&gt;x&lt;/strong&gt; to polecenie rozpakowania archiwum, a &lt;strong&gt;pliczek.7z.001&lt;/strong&gt; to nazwa pierwszej części naszego archiwum. I gotowe;)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Więcej informacji:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sourceforge.net/forum/forum.php?forum_id=45797&quot;&gt;Forum 7-zip'a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;man 7z&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
</description><pubDate>Mon, 25 Aug 2008 15:05:31 +0200</pubDate><guid>http://blog.virhilo.net/2008/08/25/dzielenie-plikow-w-linuksie/</guid><category>Arch Linux</category><category>Linux</category><category>Techblog</category><category>dzielenie</category><category>split</category><category>cięcie</category><category>7zip</category><category>7-zip</category><category>archlinux</category><category>cat</category><category>linuks</category></item><item><title>Jogger-reaktywacja</title><link>http://blog.virhilo.net/2008/08/22/jogger-reaktywacja/</link><description>&lt;p&gt;Jako że sporą część dzisiejszego dnia spędziłem na czytaniu blogów przypomniałem sobie o własnym Joggerze i postanowiłem go reaktywować. Tak więc witam ponownie:) Mam nadzieje ze to co będzie się tu pojawiało okaże się dla kogoś przydatne albo interesujące. Nie zaglądałem tu prawie rok więc wszystkie istniejące wpisy pousuwałem żeby nie robić bałaganu, zresztą nie było w tam nic ciekawego.&lt;/p&gt;
</description><pubDate>Fri, 22 Aug 2008 23:51:42 +0200</pubDate><guid>http://blog.virhilo.net/2008/08/22/jogger-reaktywacja/</guid><category>Jogger</category><category>blog</category><category>reaktywacja</category></item></channel></rss>