21 Oct 2007

NetCat, a przesyłanie plików.

NetCat (nc) jest narzędziem pozwalającym m.in transmitować dowolne dane (nie tylko tekstowe) korzystając z protokołów TCP i UDP, skanować porty zdalnych maszyn, tworzyć proste serwery usług i robić wiele innych fajnych rzeczy. Z racji swojej niewielkiej objętości często jest określany scyzorykiem szwajcarskim ... ale nie o tym miałem pisać, każdy kogo zainteresowały dodatkowe opcje nc niech spojrzy do manuala i do licznych przykładów wykorzystania tego programu dostępnych przez Google.

Ja w tej krótkiej notce chciałbym pokazać, że istnieje alternatywny (dla FTP i SCP) sposób transferu dużych plików przez sieć lokalną (nie polecam przesyłać w taki sposób danych przez internet ponieważ nie ma wznawiania transmisji i dane nie są w żaden sposób szyfrowane przez program nc).

A więc po kolei, dla NetCata nie ma znaczenia skąd przychodzą dane i gdzie są wysyłane dopóki jest to możliwe. Program może działać zarówno jako klient jak i serwer. Pora przejść do praktyki:

Serwer do którego przesyłamy ma ip zewnętrzne

Sytuacja taka ma miejsce gdy maszyna na której uruchomiliśmy NetCata jako serwer (punkt docelowy dla danych, które przesyłamy) jest widoczna przez klienta (drugi komputer)

serwer: (punkt docelowy dla danych):

nc -l -p 6666 | tar xvfp -
Notka:Jeśli nie masz praw administratora systemu to jest wątpliwe by udało Ci się uruchomić nasłuchiwanie na porcie niższym niż 1024.
Notka:W tym przypadku serwerem jest maszyna odbierająca dane.

klient (źródło danych):

tar cfp - /katalog/do/przeslania | nc -w 3 ip_serwera_nc 6666
i właściwie nasze dane sa już przesyłane. Notka:Operacja nie zawsze się powiedzie ponieważ jeśli na komputerze będącym serwerem mamy zablokowane porty (np przez iptables) to zadne dane do naszego serwera nie dotrą, ponieważ zostaną odrzucone przez firewall.

Klient ma zewnętrzne ip

Sytuacja taka ma miejsce, gdy punkt docelowy dla danych jest np za firewallem i nijak nie możemy się z nim skomunikować bezpośrednio, ale sami mamy ip widoczne (np zewnętrzne) z punktu docelowego

serwer (źródło danych)

tar cvfp - . | nc -w 3 -l -p 6666

klient (punkt docelowy dla danych):

nc adres_ip_serwera 6666 | tar xvfp -

Oba komputery znajdują się za NATem

Posiadamy dostęp do trzeciego komputera z ip zewnętrznym

Wydaje się, że jest to sytuacja patowa, ale gdy mamy dostęp do zewnętrznego komputera z Linuxem i ten komputer stoi na w miarę dobrym łączu, możemy obejść tą niedogodność niewielkim kosztem (generując dosyć znaczny ruch z maszyny z ip zewnętrznym)

Konfiguracja maszyny z ip zewnętrznym (nazwijmy ją przesiadkową)

nc -w 3 -l -p 6666 | nc -w 3 -l -p 6667 6668
Notka: Uruchamiamy tutaj podwójny serwer nc, który transmituje nam ruch pomiędzy maszynami, ale to nie wszystko zabawa się zaczyna gdy pomiędzy dwa serwery nc damy polecenie tee dodatkowo duplikujące dane przychodzące z pipe do pliku zewnętrznego (jednym słowem za jednym przesłaniem danych mamy je na dwóch maszynach - przesiadkowej i docelowej). Ale to chyba nie jest tak naprawdę interesujące.

klient (źródło danych):

tar cfp - dane_do_poslania | nc -w 3 ip_serwera 6666

klient (punkt docelowy dla danych):

nc ip_serwera 6667 6668 | tar xvfp -
Notka:Ten sposób działa ale dosyć dużym kosztem (podwaja ruch na maszynie przesiadkowej - dobrze by było gdyby miała łącze full duplex), ale można to zrobić lepiej poprzez tzw NAT Traversal ... ale o tym może innym razem.

Proste operacje na stringach w Bashu.

By mieć to zawsze pod ręką i się nie zastanawiać czy na pewno jest dobrze :)
#!/bin/bash
PATH2=/usr/src/linux
FILE=archive.tar.gz
PATHFILE=/home/johny/Desktop/ff.zip
echo '## THE PATH'
echo $PATH2 '=>'  ${PATH2%/*}             # rm last / or get parent
echo '## FILE'
echo ${FILE} '=>' ${FILE%%.*}           # name without extension
echo ${FILE} '=>' ${FILE##*.}           # only last extesion
echo ${FILE} '=>' ${FILE#*.}            # full extension
echo '## PATHFILE'
echo $PATHFILE '=>' ${PATHFILE%/*}
echo ${PATHFILE} '=>' ${PATHFILE##*.}
echo ${PATHFILE} '=>' ${PATHFILE#*.}

Wynik:
## THE PATH
/usr/src/linux => /usr/src
## FILE
archive.tar.gz => archive
archive.tar.gz => gz
archive.tar.gz => tar.gz
## PATHFILE
/home/johny/Desktop/ff.zip => /home/johny/Desktop
/home/johny/Desktop/ff.zip => zip
/home/johny/Desktop/ff.zip => zip

AVR w Gentoo.

Sprawa się wydaje być banalna, ale trzeba zainstalować następujące pakiet: sys-devel/crossdev. Niestety wersję którą ja miałem okazję testować nękały problemy kompilacji glibca, których rozwiązaniem było wydanie następujących komend:
gcc-config -l
gcc-config avr-3.4.6 # tu kompilator do kompilacji skrośnej na AVRy
source /etc/profile
env-update

po tym glibc się już skompilował bez problemu. Opis jak zrobić sobie środowisko do pracy z AVR znajduje się tutaj: http://kosma.jogger.pl/2006/07/04/avr-gcc-pod-gentoo/ (nie to nie żart ;)).

9 Sep 2007

BarCamp, Spodek 2.0

Ostatni czasy w miejscach w których przebywam obrodziło w spotkania IT - w Poznaniu był BarCamp, w Katowicach Spodek 2.0 - oczywiście na obu byłem, więc podzielę się moimi wrażeniami ;).
BarCamp
Było to pierwsze spotkanie w tym mieście, a zarazem pierwsze takie spotkanie na które poszedłem - więc nie bardzo wiedziałem czego się spodziewać, ale byłem bardzo mile zaskoczony zaraz na wejściu bo były nalepki w stylu:
Cześć, jestem .....
no i marker w kolorze turkusowym (przynajmniej mi się taki trafił ;)). Bardzo też mi się podobała mapka dojazdu do Piwnicy21 - przecież nie każdy jest z Poznania. Oprócz tego zadbano o sponsorów, więc były rozlosowane nagrody - jakieś rozmówki hiszpańskie, hostingi itp (nie wiem czy tylko tak z okazji pierwszego BarCampu, czy już to stanie się tradycją). Niestety nie ma róży bez kolców - nagłośnienie było trochę za słabe ale nikt się chyba nie spodziewał, że będzie tak dużo osób, tematyka wykładów nie zbyt mi przypadła do gustu (za dużo marketingu, za mało IT - spodziewałem się, że dowiem się więcej o technologiach niż o cudzych projektach), choć prelegenci z Partype.pl mnie miło rozczarowali bo zwrócili moją uwagę na problem promocji już stworzonego serwisu - co okazuje się nie jest rzeczą prostą, wątek został później podchwycony przez portal Poznania - tuTej.pl. Ciekawą prezentację miał także Wiktor Schmidt z netguru.pl mówił on o "długim ogonie" w AdWords i o doborze słów kluczowych - czyli znów marketing. Jestem zawiedziony trochę dwiema pozostałymi prezentacjami, bo jedna promowała serwis który jeszcze nie ma nawet wersji beta, ba nie zobaczyłem nawet screenu, filmiku jak to będzie wyglądać w akcji, choć sam pomysł wydaje mi się dobry - zobaczymy jak będzie z wykonaniem. Niestety z Bartkiem nie miałem okazji porozmawiać, ale uważam, że bez importu danych z blogów i innych serwisów tego typu projekt raczej nie będzie miał zbyt wielu użytkowników. O LinkLift wolę nie pisać nic - jak Pani Aleksandra była nieźle przygotowana tak Michał w 80% przypadków był na środku niepotrzebny - nie każdy może promować ;) (chyba to była ich pierwsza prezentacja publiczna). Dokładniejsze relacje z imprezy są dostępne tutaj: Blog Shrew, Blog Yankes. Podsumowując BarCamp był nastawiony na integrację (na której nie zostałem) i spotkanie towarzyskie branży, a wykłady po prostu były.
Spodek 2.0
To również pierwsze spotkanie tego typu, ale w regionie Katowic - spotkanie podobało mi się doskwierał mi brak nagłośnienia, ale jeden z organizatorów się już tłumaczy na swoim blogu .... Prezentacje "spodkowe" przypadły mi bardziej do gustu niż te "barcampowe", ale oczywiście nie wszystkie. Ogólnie spotkanie było chyba bardziej nastawione na wykłady niż poznanie się. W każdym razie RondoSztuki jest fajnym miejscem, choć trzeba by było troszkę inaczej rozwiązać sprawę ze stolikami - każdy siedział przy swoim, przeważnie z ludźmi których zna a to nie pomaga w poznawaniu się, fajnie by było jakby na następnym spotkaniu pojawiły się takie nalepki jak były na BarCampie. Mam jeszcze jeden pomysł, że przed spotkaniem jeśli ktoś chce się pochwalić jakimś projektem to po prostu odnośnik do wersji "demo" czy tam "beta" na stronę spodek20.pl i już na samym spotkaniu przygotować urnę (taka do głosowania) do której można wrzucić opinie o tym projekcie - podpisaną, niepodpisaną w zależności komu jak wygodniej <= to może nie wypalić ;). Ok, pora przejść do części merytorycznej, czyli wykładów:
  1. Omówienie projektu SEKAP jako platformy pozwalającej na załatwianie spraw administracyjnych nie przekonało mnie w ogóle do tego projektu - było trochę gadania, stanowczo za mało szczegółów - podczas tej prezencji nasunęło mi się pytanie po co w każdym urzędzie tworzyć serwerownie, czy outsourcing nie byłby tańszy (albo coś źle usłyszałem)?
  2. Prezentacja "Od pomysłu do otwarcia. Proces tworzenia nowych serwisów internetowych na przykładzie INFOMAIL.PL" dla ludzi związanych z branżą zapewne nie była niczym nowym i odkrywczym, ale tym którzy dopiero startują w tej dziedzinie i szukają dobrego pomysłu na pewno podsunęła parę pomocnych wskazówek (biedni ich znajomi ;)), tak słuchając tej prezentacji nie usłyszałem czy w infomailu będzie możliwość subskrybowania newsletterów mailowych przez RSS? Dla mnie rozwiązanie wydaje się być bardzo ciekawe i uważam, że mogło by się przyjąć.
  3. Prezentacja pt "Rewolucja w sieciach socjalnych" pana Sebastiana poruszyła bardzo ciekawy problem przepisywania danych i ich zarządzania w różnych sieciach społecznościowych niestety rozwiązania tej niedogodności dopiero zaczynają powstawać, a były by potrzebne "na już" - ponieważ coraz ciężej nakłonić użytkownika by zarejestrował się w kolejnym portalu do którego potrzebuje dostęp na 10 minut, żeby np przeczytać jakiś news.
  4. Prezencja "Semantic Web. Jak ułatwić sobie życie w dobie aplikacji Web 2.0" była właściwie kontynuacją poprzedniej, jednak tutaj oprócz wspomnienia o formacie RDF, zabrakło pokazania jakiegoś przykładowego pliku i pokazania efektu jego parsowania (jeśli chodzi o przykłady RDFów to np projekt GeneOntology wykorzystuje pliki tego typu do modelowania relacji pomiędzy genami) i wspomnienia o XML i XSLT (to chyba by było na miejscu w tej prezentacji).
Jako, że takie inicjatywy dopiero raczkują to w obu przypadkach było trochę niedociągnięć, ale uważam organizatorzy stanęli na wysokości zadania. Już się nie mogę doczekać kolejnych spotkań.

13 Jun 2007

GNU Screen - najczesciej uzywane opcje

Program screen jest jednym z najprostszych menadżerów okien (wg wikipedii) pozwala dzielić jeden fizyczny terminal pomiędzy parę programów konsolowych, ale jego główną zaletą jest to że po schowaniu (detach) nasze programy działają wciąż tak samo jakbyśmy byli zalogowani w systemie. Program ten ma wiele opcji, ja postanowiłem zapisać sobie tu parę najważniejszych, żeby nie przeglądać obszernego manuala jak coś się zepsuje (np jakiś miś pośle wiadomość przez polecenie wall, to robimy ctrl+shift+l co nam odświeża wszystkie okienka w screenie (redraw)).

Dla tych co się nie orientują by polecenia działały każde trzeba poprzedzić sekwencją klawiszy ^a, czyli ctrla + a. No to jedziemy ...
Wiele programów na jednym screenie:
  • c - tworzenie kolejnego okna
  • A - nazywanie okien
  • <TAB> - przechodzenie pomiędzy podzielonymi oknami
  • n, <spacja> - następne okno
  • p, <backspace> - poprzednie okno
  • " - lista screenów z nazwami

Podział okienek:
  • S - dzielenie
  • :resize - pozwala zmienić proporcje podziału
  • W - przejście do drugiego okna
  • X - niweluje podział

Bezpieczeństwo:
  • :password - pozwala założyć hasło na przywrócenie screena (atach)
  • x - "wygaszenie" terminala, po powrocie trzeba się autentykować - zupełnie tak jakbyśmy się ponownie logowali

Takie tam ;)
  • Jeśli screen został zablokowany posiada zmieniony flow control kombinacją ^a s (ctrl + a s) - nie otrzymuje żadnego zdarzenia reaguje na żadne zdarzenie z klawiatury, należy go odblokować kombinacją ^a q (ctrl + a q) - więcej informacji znajduje się w komentarzach.
  • Monitorowanie zdarzeń: ^a M
  • ^a g - przełączanie visual/audiable bell

Kopiowanie tekstu: Za kopiowanie tekstu jest odpowiedzialna następująca sekwencja: ^a [, ustawienie kursora przy tekście do skopiowania, <spacja>, zaznaczenie tekstu, <spacja> (teraz mamy tekst w buforze ;)), ^a ] - wklejenie tekstu
Screen uruchamiany od razu po połączeniu się ze zdalnym hostem. - Porada bardzo przydatna gdy musimy wykonać jakieś ważne zadania administracyjne kltórych nie powinniśmy przerywać, gdy chcemy by screen uruchomił się od razu z połączeniem do serwera ssh powinniśmy wydać polecenie: ssh uzytkownik@zdalnyhost -t screen -RD.
Screen, polskie znaki - Niektóre konsolowe programy (ekg) nie wspierają utf8, który jest już pewnym standardem jeśli chodzi o lokalizację systemu. Ale na szczęście jest na to rozwiązanie, program screen potrafi zamieniać sekwencje znaków zapisanych w jednym kodowaniu na inne bez jakiejkolwiek dodatkowej ingerencji użytkownika, by móc pisać i oglądać śliczne polskie znaki w utf8 (w ekg) polecam je startować z poniższego skryptu: cat ukg8
#!/bin/bash
##
## Skrypt uruchomieniowy ekg - screen translation ;)
## (c) Michał Górny
## src: http://mgorny.jogger.pl/2006/05/21/ekg2-tips-and-tricks/
export LC_ALL="pl_PL.iso-8859-2"
screen -dmS ekg ekg
export LC_ALL="pl_PL.UTF-8"
sleep 3
screen -r ekg

NIE polecam attachowania screena ze screena, ale jeśli już trzeba to sekcja "Control a Screen within a Screen" dokumentu http://gentoo-wiki.com/TIP_Using_screen jest właśnie temu poświęcona.
Dodatkowe materiały:
http://jakilinux.org/aplikacje/konsola/screen-sztuczki/

11 Jun 2007

The PI at login manager

Weekend, jak zwykle chce coś zrobic z komputerem. Niestety jak często braakuje mi jakieś biblioteki, manuala, helpa czy czegoś w tym rodzaju (a najbardziej połączenia z internetem), podczas zabaw z gdm (Gnome Display Manager) odnalazlem program gdmflexiserver pozwalajacy zalogowac sie jako inny uzytkownik w już uruchomionym środowisku Gnome (cos jak vnc, tylko na tej samej maszynie), niestety nie mialem do niego manuala, wiec wykonałem gdmflexiserver --help, terminal radośnie odpowiedział:
johny@moped ~ $ gdmflexiserver --help
Usage:
  gdmflexiserver [OPTION...] - New gdm login
.
Help Options:
  -?, --help                Show help options
.
Application Options:
  -c, --command=COMMAND     Send the specified protocol command to GDM
  -n, --xnest               Xnest mode
  -l, --no-lock             Do not lock current screen
  -d, --debug               Debugging output
  -a, --authenticate        Authenticate before running --command
  -s, --startnew            Start new flexible session; do not show popup
  --monte-carlo-pi

W ten sposób znalazłem opcję --monte-carlo-pi, nie służy ona bynajmniej logowania sie, jest to żart autora programu. Wspomniana wyżej opcja liczy PI metodą Monte Carlo (kolejnych losowań) - algorytm obliczeń nie jest specjalnie skomplikowany :).

18 Apr 2007

Bootloader na dyskietce

Czym jest bootloader?
Bootloader jest to program uruchamiany przez BIOS. Jego zadaniem jest zainicjowanie ładowania jądra systemu operacyjnego z dysku twardego lub innego nośnika do pamięci RAM.

Bootloader składa się z:
Kodu wykonywalnego bootstrap umieszczonego w pierwszych 466 bajtach (MBR) dysku twardego (kod wykonywalny bootloadera może mieć maksymalnie 446 bajtów), bootloader może podczas ładowania systemu odwoływać się do pliku konfiguracyjnego (grub) lub mieć "na stałe" wpisane dane o systemach operacyjnych dostępnych (lilo)

Instalacja bootloadera na dyskietce sprowadza się:
  1. Sformatowania dyskietki:
    fdformat /dev/fd0
  2. Stworzenia systemu plików:
    mke2fs /dev/fd0
  3. Zamontowanie dyskietki, np w /mnt:
    mount -t ext2 /dev/fd0 /mnt/
  4. Stworzenie katalogu boot w miejscu gdzie zamontowaliśmy naszą dyskietke:
    mkdir /mnt/boot/
  5. Skopiowanie obrazów GRUBa (stage1, stage2 stage1_5 nie jest potrzebne) do katalogu /mnt/boot/grub:
    cp -r /boot/grub/ /mnt/boot/
  6. Odpowiedniej edycji pliku: /mnt/boot/grub/grub.conf
  7. Odmontowania /mnt:
    cd / ; umount /mnt/
  8. Wykonanie tego polecenia:
    grub --batch --device-map=/dev/null <<EOF
     device (fd0) /dev/fd0
     root (fd0)
     setup (fd0)
     quit
     EOF
     

To na tyle ;) I już możemy się cieszyć nowym ślicznym bootloaderem wprost z dyskietki.
Zasoby:

11 Apr 2007

bash wiki startup

Wkońcu coś zaczynam robić ... na dobry początek myślę, że stworze w miarę dobrą *POLSKĄ* dokumentację do Basha bo już mnie irytuje wertowanie tej oryginalnej dokumentacji w lewo i w prawo, przeszukiwanie tych samych książek po 3 razy ... Więcej informacji niebawem, czasochłonność projektu oceniam na 25 dni, a może nawet mniej. Jak skończę, to się pochwalę - póki co:

Dzień 0: Wstęp napisany (jeszcze poprawki), wiki założone ... czyli dwie najprostsze czynności za mną, teraz będzie tylko gorzej.

Dzień 1-4: Wypełnianie wiki ...
Wszyscy chętni do współtworzenia msg me ;) Version alpha: Bash Language Wiki

20 Mar 2007

Pryszłość pod znakiem Adobe?

Jakiś czas temu pisałem o sposobie pisania pisania aplikacji (a później pisał eRiZ choć w trochę innym kontekście), w tamtym artykule próbowałem ukazać pewien pomysł - receptę jak można pisać obecnie programy. Jak się okazuje na przeciw moim pomysłom wyszła firma Adobe (Ci od pdfów) pozwalając developerom pisać programy niemal w dowolnym języku. Jak to zostało zrobione - powstał projekt Apollo -czyli wieloplatformowe środowisko do wyświetlania danych i komunikacji z serwerami przetwarzającymi te dane, obecnie w ofercie Adobe znajduje się SDK dla Windowsa i MacOS, ale przed końcem roku ma być wypuszczona wersja finalna która będzie także działać na maszynach z systemem operacyjnym Linux.

Tymczasem zapraszam Was do obejrzenia filmiku z pierwszych pokazów "nowej technologi", a właściwie chciało by się rzec - do oprogramowania wykorzystującego znane od wielu lat technologie w trochę inny sposób, niestety potężnym minusem owych aplikacji jest to, że trzeba mieć znów coś zainstalowane by działało.

Sytuacja robi się interesująca ponieważ Microsoft z nową warstwą prezentacji w Windows Vista, pozwala także osiągnąć bardzo ciekawe efekty graficzne i daje całkiem pokaźne możliwości programistom ... ale niestety jest tylko na jedną słuszną platformę.

Podsumowując pozostaje nam sobie życzyć, że rozwiązanie Adobe będzie wystarczająco wydajne by móc z niego korzystać na starszych komputerach i równie otwarte jak XML, choć patrząc na dokonania tej firmy z Flashem i formatem pdf śmiem w to szczerze wątpić (choć w końcu pdf to standard ISO i jest już niby otwarty ;) ), oby tylko się nie okazało, że dobry pomysł trafi do śmietnika (ze względu na kiepski marketing lub wykonanie).

16 Feb 2007

Google Picasa and PicasaWeb

Często się zdarza, że musimy pokazać komuś zdjęcia z rodzinnej uroczystości lub innego ważnego wydarzenia. Obecnie w internecie roi się od serwisów pozwalających przechowywać swoje zdjęcia w sieci (photobucket.com, picasaweb.com, flickr.com, fotosik.pl - wszystkie z nich pozwalają na tworzenie tzw albumów), innym typem serwisów są takie pozwalające umieszczać pojedyncze zdjęcia w sieci (imageshack.us, eimg.org itp.). Nie jest łatwo się zdecydować z którego serwisu skorzystać (sam obecnie bym polecił flickr.com lub picasaweb.com, fotosik.pl też nie jest zły). Ale wracając do tematu:

Jakiś czas temu postanowiłem wysłać część swojej galerii na serwery Google (WebPicasa) miałem do wysłania bagatela 120 zdjęć, niestety interfejs na stronie www nie pozwolił mi ich wszystkich zaznaczyć, więc musiałbym skorzystać z pojedynczego dodawania fotek - co mnie nie satysfakcjonowało w ogóle.
Całe szczęście dowiedziałem się, że Picasa ma opcję wysyłania zdjęć wprost z kolekcji do albumów WebPicasy. Tak więc czym prędzej ją zainstalowałem.
# emerge picasa

Po uruchomieniu okazało się, że wersja na Linuxa, nie ma opcji na której mi zależało najbardziej (została ona zaimplementowana dopiero od wersji 2.5) - zacząłem szukać rozwiązania mojego problemu - aż w końcu natrafiłem na grupę dyskusyjną, gdzie było rozwiązanie mojego problemu.

Jak sobie poradzić?

  1. Zainstalować Picasę jak zwykle (wersja 2.2) ...
  2. Posegregować zdjęcia w albumy, dodać tagi itp
  3. Wyłączyć Picasę i "Media Detector"
  4. Zainstalować wine (emerge wine) - choć już powinno być
  5. Ściągnąć najnowszą wersję dla Windows (2.5 - wget http://dl.google.com/picasa/picasaweb-current-setup.exe)
  6. Zainstalować ją korzystając z wine (wine picasaweb-current-setup.exe) i uruchomić ją, a następnie wyłączyć (powinno obyć się bez błędów)
  7. Jako root przenieść starą instalację Picasy do innego folderu
          cd /opt/picasa/wine/drive_c/Program Files
         mv Picasa2 Picasa22
      
  8. Skopiować "świeżo zainstalowaną" Picasę do odpowiedniego katalogu (będąc w /opt/picasa/wine/drive_c/Program Files)
          cp -R home/USERNAME/.wine/drive_c/Program\ Files/Picasa2/ .
      
  9. Uruchomić Picasę jak zwykle ...

Innym sposobem, który powinien zadziałać jest skorzystanie z aplikacji napisanej w Pythonie i dostępnej pod adresem http://code.google.com/p/python-picasaweb/ - ja tego sposobu nie sprawdziłem bo ten pierwszy mi zadziałał - swoją drogą Picasa jest całkiem fajną przeglądarką zdjęć (i jest hack by można wysyłać zdjęcia na flickr.com ;))

1 Jan 2007

New Year has landed (2007)

$ cat old 
dziś jestem zadowolony ponieważ:
mamy 31 grudnia 2006 roku
będziemy dziś pić dobry alkohol
będzie wspaniała impreza
już się nie mogę doczekać
$ cat new
dziś jestem zadowolony ponieważ:
mamy 1 stycznia 2007 roku
wczoraj piliśmy alkohol
alkohol to zło
impreza była przednia
$ diff -u old new 
--- old 2006-12-31 15:11:43.000235273 +0100
+++ new 2007-01-01 17:12:39.843474585 +0100
@@ -1,5 +1,5 @@
 dziś jestem zadowolony ponieważ:
-mamy 31 grudnia 2006 roku
-będziemy dziś pić dobry alkohol
-będzie wspaniała impreza
-już się nie mogę doczekać
+mamy 1 stycznia 2007 roku
+wczoraj piliśmy alkohol
+alkohol to zło
+impreza była przednia

Wszystkim moim czytelnikom życzę samych sukcesów w Nowym Roku ;).