sobota, lipca 26, 2008

libgmail - aby zaoszczędzić klikania

Byłem dzisiaj w górach. Jak zwykle po takiej wyprawie przychodzi czas dzielenia się zdjęciami. Obrobiwszy co potrzeba zostało mi do wysłania 71 MB. Spakować się tego za bardzo nie da, na płytkę pakować nie opłaca się... Zdecydowałem się wysłać to wszystko mailem. Ponieważ jednak przesyłanie kilkuste plików jest mocno niepraktyczne, spakowałem wszystko w kilka archiwów po 15 MB:

> 7z a rudawy.7z -mx=0 -v15mb *.jpg

Świetnie, mam teraz tylko 5 plików do wysłania. Kto jednak kiedyś wysyłał duże pliki przez maila doskonale wie, że wysyłają się one okropnie długo i często nie sposób jest wysłać wszystkiego na raz - trzeba cierpliwie plik po pliku ładować je na konto.
Ale! Od czego są biblioteki? Komenda

> yum search gmail

zdradziła mi, że Fedora oferuje między innymi następujący pakiet:

> python-libgmail.noarch : Library to provide access to Gmail via Python

Zainstalowałem, poszperałem nieco w dokumentacji i teraz pliki radośnie wgrały się na moje konto:

>>> import libgmail
>>> import getpass
>>> import glob
>>> ga = libgmail.GmailAcount(getpass.getpass("Podaj konto"), getpass.getpass("Podaj hasło"))
>>> ga.login()
>>> _7z = glob.glob("*7z")
>>> _7z
['rudawy.7z.003', 'rudawy.7z.001', 'rudawy.7z.004', 'rudawy.7z.005', 'rudawy.7z.002']
>>> map( lambda x: ga.storeFile( x, "rudawy" ), _7z )

I po sprawie :-)

piątek, lipca 18, 2008

Wyrafinowany sposób na wyjątek

Właśnie drogą eksperymentu doszedłem, jak zapętlić GHC... ale tak, by się zorientował i rzucił wyjątkiem :-)

Wystarczy nam taki kod:

> {-# OPTIONS_GHC -XRecursiveDo #-}
>
> module Main where
>
> import Control.Concurrent
> import Control.Monad.Fix
>
> loopChan :: IO (Chan ())
> loopChan = mdo chan <- dupChan chan
> return chan
>
> main = do
> c <- loopChan
> writeChan c ()

Kiedy spróbujemy go załadować do GHCi:

> Prelude> :l loop_channel.hs
> [1 of 1] Compiling LC ( loop_channel.hs, interpreted )
> Ok, modules loaded: LC.
> *LC> :type loopChan
> loopChan :: IO (Chan ())
> *LC> c <- loopChan
> *** Exception: <>

Lub wykonać:
> [Tener@laptener loop_chan]$ ghc --make loop_channel.hs
> [1 of 1] Compiling Main ( loop_channel.hs, loop_channel.o )
> Linking loop_channel ...
> [Tener@laptener loop_chan]$ ./loop_channel
> loop_channel: <>


To przytrafi nam się to samo: dostajemy wyjątek NonTermination. Co stanie się przy próbie uruchomienia tego kodu było dla mnie zagadką, gdy go pisałem - rzucenie tego wyjątku wydaje się być rozsądnym rozwiązaniem.

wtorek, lipca 01, 2008

Założenie o zamkniętości świata

Po angielsku: Closed World Assumption, w skrócie CWA. Jego treść jest prosta: "To, czego nie potrafimy udowodnić, jest fałszywe".

Naukowcy wydają się być bardzo wybiórczy w stosowaniu tego założenia. Wielokrotnie odrzucano przedwcześnie teorie, które później okazywały się prawdziwe. Z drugiej strony wiele jest niepotwierdzonych teorii, które mają wielu zwolenników, choć nie ma do nich zbyt uczciwych przesłanek (patrz tutaj).

Powiedziawszy to, zastanówmy się nad hipotezą:

Hipoteza: Bóg istnieje.

Wielu naukowców ma jasno sprecyzowany pogląd na temat prawdziwości tej hipotezy. Co ciekawe, bardzo często ci z nich, którzy negują jej prawdziwość, pytają się "Jak to możliwe, by jakikolwiek naukowiec wierzył w istnienie Boga?". Ich najczęstszym argumentem za tym, że Bóg nie istnieje jest brak dowodów na jego istnienie. Niejawnie korzystają więc oni z CWA. A należy przecież pamiętać, że jest to tylko założenie - które w prawdziwym świecie nie jest prawdziwe! Czy to dowodzi istnienia Boga? Oczywiście nie. Myślę jednak, że wyjaśniłem moje poglądy na temat "dowodów przez brak dowodów na istnienie".

Osobiście uważam że Bóg istnieje i że jest Jego wolą, by przez cały okres istnienia świata nie powstał żaden trwały dowód na Jego istnienie. (Przez trwały rozumiem tutaj taki dowód, który można powtórzyć w dowolnym momencie wobec dowolnej osoby.)
Dlaczego? Istnienie dowodu trwałego przekreślałoby istotę wiary. Jaki jest sens wiary w coś, co można udowodnić?