piątek, kwietnia 11, 2008

Hardware & Software

Czyli po polsku sprzęt i oprogramowanie. Ostatnio, w styczniu 2008, kupiłem laptopa. Mówiąc krótko:
Aristo Prestige 1700, GeForce 8600M GS, 2Gb RAM, Core 2 Duo 7500, 250 Gb HDD, matryca 15 cali glare.
Zadowolony? Jak najbardziej. Korzystałem okazjonalnie z innych laptopów; w tym podoba mi się szczególnie:
- wygodna klawiatura, co w laptopach bywa zmorą
- wytrzymała, niewycierająca się obudowa
- duży dysk twardy
- niezła karta graficzna, choć nie jest to GT to i tak Wiedźmin śmiga.
- bezawaryjna jak do tej pory praca
- porządna (jak na moje wymagania) karta dźwiękowa

Sprzęt nie jest jednak najważniejszy, o wiele więcej potęgi drzemie w oprogramowaniu.
Systemy:
- Fedora 8, podstawowy system
- Windows XP Home Edition, głównie do gier i AutoCada (którego nie używam ja, tylko K., a ona robi to sporadycznie).

Windowsa mam bez graficznych wodotrysków w stylu CrystalXP. Wyłączony jest nawet domyślny motyw XP na rzecz ascetycznego, szarego z Windowsa 2000. Powód? Wszystko to blaknie i wygląda niepoważnie w porównaniu z Compizem (Vista też). W zamierzeniu ma to być system zapasowy, ale dobrze skonfigurowany. Stąd obecność interpretera pythona, cygwina, Visual Studio 2008 (z MSDN'a), Total Commandera, Emacsa, OpenOffice'a, Firefoxa -- wszystko to skonfigurowane, gotowe do użytku i nieużywane. Bo na Linuxie jest o wiele fajniej!

Fedora 8, aktualne wydanie jednej z największych dystrybucji Linuxa, w praktyce to to samo co komercyjny Red Hat (tzn. w mojej praktyce przy moich potrzebach). Korzystam z zaskakująco niewielu programów:
- Emacs - wielofunkcyjny, programowalny edytor. Nadaje się szczególnie dobrze do Haskella, C, C++, Pythona, Prologa, ...
- darcs - system kontroli wersji, bardzo przyjemny
- rdiff-backup - wymagający minimalnej konfiguracji, lecz potężny program do backupów
- xmonad - fenomenalny menadżer okien, bardzo wygodny
- Total Commander - tak, pod wine'm chodzi :-)
- foobar2000 - wolę go od mplayer'a czy xmms'a. Też chodzi pod wine'm.
- Swiftfox, czyli zoptymalizowany pod konkretną architekturę Firefox
- workrave - program ograniczający korzystanie z klawiatury i przypominający o odpoczynkach
- narzędzia wbudowane w Linuxa, o instalację których nie muszę się troszczyć

O xmonad i Emacsie wypada napisać osobne posty - już wkrótce!

Tymczasem wracam do chorowania. Dopadła mnie jakaś grypa...

Spełnialność formuł logicznych

Ogólnie rzecz biorąc problem spełnialności formuł logicznych jest bardzo złożony pod względem obliczeniowym. Przy tym naiwny algorytm który rozwiązuje ten problem jest bardzo prosty. W Prologu można go zapisać tak:

:- op(900,fy,neg).
:- op(1000,yfx,and).
:- op(1010,yfx,or).

sat( X ) :- eval( X, true ),!.

eval( true, true ) :- !.
eval( false, false ).

eval( neg X, true ) :- eval( X, false ).
eval( neg X, false ) :- eval( X, true ), !.
eval( X or Y, true ) :- ( eval( X, true ) ; eval( Y, true ) ), !.
eval( X and Y, true ) :- eval( X, true ), eval( Y, true ), !.

eval( X, false ) :- eval( X, true ), !, fail.
eval( _, false ).


Korzystamy tutaj mocno z wbudowanego w Prolog backtrackingu. Możemy sprawdzać spełnialność formuł w stylu
X or Y and neg (Y and X)

Przykładowa sesja:
?- [sat].
% sat compiled 0.00 sec, 2,936 bytes

Yes
?- sat( neg neg neg X ).

X = false ;;

No
?- sat( neg neg neg X and neg Y).

X = false,
Y = false ;;

No
?- sat( neg neg neg X and neg Y and Z).

X = false,
Y = false,
Z = true ;;

No
?- sat( X and neg X ).

No
?- sat( _ and neg _ ).

Yes
?-
% halt


Jak widać Prolog bywa zręcznym narzędziem do wyrażania pewnych algorytmów.

czwartek, kwietnia 10, 2008

Prolog nie jest taki zły

W poniedziałek stoczyłem prawdziwą batalię, usiłując stworzyć poprawnie działające predykaty wyższego rzędu rekurencyjnie przechodzące po termie aż zajdzie jakiś warunek. Byłoby więc to coś w rodzaju metamorfizmu. Moje wysiłki spełzły jednak na niczym, skończyłem wieczorem z funkcją:

mapRec( Pred, Arg, OutArg ) :-
   % tworzymy nowy predykat pomocniczy
   gensym( partial, UNIQ ),
    Left =.. [ UNIQ, X, Y ],
    PartialMapRec = ( Left :- mapRec( Pred, X, Y ) ),
    asserta( PartialMapRec, Ref ),
    % rozkładamy term wejściowy
    Arg =.. [ Comp, Op | Args ],
    map( UNIQ, Args, Args2 ), % dla termów atomowych mamy podstawę indukcji: map    nic nie robi na pustej liście
    % składamy term ponownie
    Arg2 =.. [ Comp, Op | Args2 ],
    % aplikujemy Pred i zwracamy wynik
    F =.. [ Pred, Arg2, OutArg ],
    F,
    erase( Ref ), % kasujemy predykat pomocniczy
    !.

mapRec( _, Arg, Arg ) :-
    write( final ), write(' '), write( Arg ), nl,
    final( Arg ), !.

Najogólniej rzecz biorąc, nie działała ona tak jak powinna. To znaczy coś tam niby liczyła, ale źle, a co gorsze była okropnie długa (jak widać) i beznadziejna do debugowania. Ponadto wymagała ingerencji w bazę predykatów Prologa, co jest moim zdaniem brzydkie i psuje trochę wydajność. Zakończyłem nieudaną sesję programistyczną mocno zniesmaczony Prologiem, a konkretnie jego odpornością na próby metaprogramowania.

Dzisiaj jednak dokopałem się do paru predykatów, które znacząco uprościły konstrukcję mapRec'a:
mapRec( Pred, Arg, OutArg ) :-
    Arg =.. [ Comp, Op | Args ],
    maplist( mapRec( Pred ), Args, Args2 ),
    Arg2 =.. [ Comp, Op | Args2 ],
    apply( Pred, Arg2, OutArg ),
    !.

mapRec( _, Arg, Arg ) :-
    write( final ), write(' '), write( Arg ), nl,
    final( Arg ), !.

Nie taki Prolog straszny jak go malują :-)

Bazując na poznanej wiedzy napisałem wreszcie simp'a, czyli predykat upraszczający wyrażenia arytmetyczne. Jest to jedno z zadań na pracownię z Programowania w Logice. Wyszedł niedługi i raczej nie ma zbyt wielu błędów :-) Leży tutaj.

Do uruchomienia potrzebny jest interpreter Prologa. Ja używam SWI-Prologa, ale program powinien działać na każdym sensownym interpreterze.

Dla tych którzy nie mieli nigdy doczynienia z Prologiem, oto jak wygląda przykładowa sesja:

?- [simp].
% simp compiled 0.00 sec, 11,264 bytes

Yes
?- simp( x-x, EXP ).

EXP = 0 ;;

No
?- simp( x-x*1*2*3, EXP ).

EXP = x* -5 ;;

No
?- simp( 1*2*(1+1+1)*x-x*1*2*3, EXP ).

EXP = 0 ;;

No
?- simp( x*(y+z*(1+p)-p*(x-z)), EXP ).

EXP = - (p* (x*x))+ (p* (x*z)*2+ (x*y+x*z)) ;;

No
?-
% halt


Choć Prolog bywa wkurzający, to jednak przyjemnie jest nauczyć się czegoś nowego.

poniedziałek, kwietnia 07, 2008

Budzik, revisited

Kiedyś pisałem budziki w C (tu, tu), albo z wykorzystaniem wtyczek do foobar'a. Ten czas już minął! Nigdy więcej niskopoziomowego C do takich zadań.
W międzyczasie miałem program napisany w Pythonie, ale gdzieś mi się zapodział. Nie potrzebuję go już więcej bo oto jest - Budzik 3000! Innowacyjne rozwiązanie, nie wymaga żadnej konfiguracji i jest w pełni kompatybilne z czymkolwiek posiadającym konsolę, program sleep i mplayer (np. mój Linux).
sleep 7h 30m && mplayer ~/budzik/*.mp3

Szybkie, dokładne i wygodne. Zostawić w konsoli i iść spać...

Minus jeden, czyli co aktualnie porabiam

Studiuję aktualnie w -1, zwanym też ii, II, albo Instytutem Informatyki Uniwersytetu Wrocławskiego. Fajnie nie?

Ano fajnie, bo wydział należy do tych wybitnie fajnych. Ficzery:
- za wyjątkiem 8 obowiązkowych przedmiotów (po 2 przez pierwsze 4 semestry) program studiów jest układany samodzielnie przez studenta. Chcę się zapisać na przedmiot XYZ? Robię to. Chcę się z niego wypisać? Przez pierwsze dwa tygodnie semestru można to robić bez konsekwencji.
- wysoki poziom. Serio, nie żartuję - jest się tu czego nauczyć i daje to ogromną satysfakcję. Później także dobry start na rynku pracy, ale to już szczegół :-) Kilku absolwentów pracuje nawet dla Google czy M$, inni założyli jakiś portal społecznościowy
- atmosfera, nie tylko dzięki klimatyzacji w budynku. Wśród studentów panuje spora różnorodność osobowości i zawsze znajdzie się ktoś, z kim można porozmawiać.
- mniej ważne, ale jednak: fajny, nowy budynek położony dogodnie przy Moście Grunwaldzkim.

Szczęśliwie zaliczyłem pierwszy rok i jestem aktualnie na 4-tym semestrze. Nie mam nawet tak u nas popularnej poprawki z Programowania :-) Choć być może uda mi się coś wymyślić z JFiZo (Języki Formalne i ZŁOżoność Obliczeniowa), którego rokrocznie zdaje jakieś 30% osób. To raczej mało, szczególnie że wiele z tych, którym się udaje, robi ten przedmiot nie po raz pierwszy. AiSD (Algorytmy i Struktury Danych) też są obiecujące w tym względzie.

Przedmioty na których najlepiej się bawiłem? Będzie jakoś tak:
1. Programowanie (Haskell rządzi!)
2. Programowanie funkcjonalne (niefajny był tam OCaml, ale poznałem podstawy tego paradygmatu)
3. Przetważanie Języka Naturalnego (Natural Language Processing, NLP) (program do pisanie wierszy)
4. Kurs C (grupa zaawansowana: graficzna gra w Sudoku, gra 3D, kalkulator+wykresy 3D, znajdowanie trasy przejazdu komunikacją miejską we Wrocławiu)

Na razie to tyle, stay tuned.

Podpalmy żyrafę na nowo!

Czyli reaktywacja bloga :-)

Nosiłem się z tym zamiarem od jakiegoś czasu, z kilku powodów:
- w moim życiu dzieje się sporo rzeczy a pamięć mam krótką;
- fajnie podzielić się tym, co właśnie się odkryło, dowiedziało itp.
- lubię pisać, a ostatnio nie miałem do tego wielu okazji
- były inne powody, ale aktualnie ich nie pamiętam :-)

Plan na najbliższe kilka postów:
1. Opisać co aktualnie robię
2. Najnowsze zmiany w sprzęcie - kupno laptopa
3. Moja konfiguracja tegoż sprzętu
4. Coś o xmonad
5. Coś o workrave
6. Wpis o zespole/projekcie Ayreon

Co potem? Ha! Któż to może wiedzieć?

Na razie nie zmieniam wyglądu bloga, zaktualizowałem tylko linki. Szczególnie polecam xkcd!

Edit: eksperymentalnie włączam reklamy. Gdyby komuś przeszkadzały, to są odpowiednie wtyczki do Firefoxa...