Programuję już od kilku lat, ale jakoś się złożyło, że nie pisałem jeszcze aplikacji opartych o HTTP. Postanowiłem to zmienić i odejść na trochę od programowania w Rubim(zdaję sobie sprawę, że istnieje RoR, lecz chciałem zacząć od czegoś klasycznego i chyba jednak trochę łatwiejszego, jak PHP. Dlatego też postawiłem sobie serwer Apache(swoją drogą też bardzo przydatne doświadczenie) i zacząłem próbować.
Szybko też znalazł się problem, którego rozwiązanie przez prostą aplikację PHP wydawało się całkiem rozsądne. Mianowicie w domu mam dwa komputery(jeden mój i jeden brata) i tylko jedną drukarkę. W prawdzie mógłbym udostępnić serwer CUPS, ale po pierwsze brat musiałby instalować sterowniki do drukarki(tak przynajmniej mi się wydaje ;p), a ponadto zdarza mu się używać (sic!) Windows, co jeszcze bardziej komplikuje sprawę.
Oczywiście móglibyśmy użyć Samby, ale jesteśmy zbyt leniwi, żeby konfigurować Sambę na obu komputerach tylko po to, żeby od czasu do czasu coś wydrukować. Dlatego stanęło na wysyłaniu plików do druku pocztą. To upierdliwa sprawa, stąd ten skrypt(może się komuś przyda :)):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
<head>
<title>Stronka!</title>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
$uf = $_FILES['upfile'];
if(isset($uf['name']))
{
if('php' == ($wynik = substr($uf['name'],-3,3)))
{
echo '<p>Wybacz, nie odbieram plików PHP</p>';
}
else
{
rename($uf['tmp_name'], 'udload/'.$uf['name']);
}
}
if(isset($_GET['delete']))
{
unlink('udload/'.$_GET['delete']);
echo '<p>Usunięto plik "'.$_GET['delete'].'"!</p>';
}
echo '<p>Cześć! Dzięki tej stronie możesz wysyłać mi dowolne pliki,
ściągać te, które Ci udostępniam, a także wysyłać pliki do drukowania przez
moją drukarkę.</p>';
if(isset($_GET['print']))
{
if('.ps' !== ($wynik = substr($_GET['print'],-3,3)) &&
! isset($_GET['sure']))
{
echo 'Wybrany plik ma rozszerzenie inne niż *.ps. Jeśli jesteś
pewien, że zawiera dane PostScript,
<a href="index.php?print='.$_GET['print'].'&sure=1">kliknij tutaj</a>';
}
else
{
$out = array();
$ret = 0;
exec('lp /srv/http/udload/'.$_GET['print'], $out, $ret);
if($ret == 0)
{
echo '<p>Drukowanie powiodło się.</p>';
}
else
{
echo '<p>Drukowanie nie powiodło się. Zawartość stdout:
<br/>'.$out.'</p>';
}
}
}
$cdir = dir('udload');
if($cdir !== false)
{
$n = 0;
while(false !== ($file = $cdir->read()))
{
if($file != '.' && $file != '..')
{
if($n == 0)
{
echo "<h1>Pliki na serwerze:</h1><p><ol>";
$n = 1;
}
echo '<li><a href="udload/'.$file.'">'.$file.'</a>
<a href="index.php?delete='.$file.'"><sup>[usuń plik]</sup></a>
<a href="index.php?print='.$file.'"><sup>[drukuj plik]</sup></a></li>';
}
}
if($n == 1)
{
echo "</ol></p>";
}
$cdir->close();
echo '<h1>Wyślij plik</h1><p>Możesz wysłać plik o dowolnym
rozszerzeniu, oprócz *php o wielkości nie przekraczjącej 10<sup>6</sup>
bajtów:<br/><form enctype="multipart/form-data" method="post"
action="index.php"><input type="file" name="upfile" value=""/>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000"/><br/>
<input type="submit" name="send"/></form>';
}
?>
</body>
</html>
Jakie wrażenia z zabaw PHP? Zdecydowanie przechodzę do RoRa, zwłaszcza po obejrzeniu filmów, które można zobaczyć na stronie projektu.
Zapewne większość miłośników edytorów tekstów takich jak Vim, czy emacs, a także wyznawcy wyższości CLI nad GUI, przyzna, że klawiatura jest znacznie szybsza, a jeśli się człowiek przyzwyczai, wygodniejsza od myszki. Ciężko jednak wyeliminować z środowiska graficznego użycie myszy. Nic bardziej mylnego, mając odpowiednie narzędzia można bez problemu używać Xów bez myszki, ani jej emulacji. Pomijając kilka dziedzin, w których raczej myszkę ciężko zastąpić(u mnie chyba tylko edytor grafiki, GIMP). W tym artykule przedstawię zarządcę okien sterowanego klawiaturą - awesome.
Już bardzo dawno mysz zadomowiła się w systemach biurkowych. Nic dziwnego, przesuwanie okien "chwytając" je kursorem myszy i wciskanie nim przycisków jest bardzo intuicyjne. Być może gdyby nie wymyślono myszy, komputery nie byłby tak powszechne. Istnieje jednak pewna grupa ludzi myśli w trochę innych kategoriach. Owocem takiego myślenia jest pomysł na zarządzanie oknami bez użycia myszy.
Pierwszą, rzeczą jaka przychodzi na myśl(przynajmniej mi przyszła;)), słysząc o zarządcy okien sterowanym klawiaturą, to "Jak to, do cholery, możliwe?". Rozwiązanie jest bardzo proste. Wystarczy, że rozmieszczeniem i zmianą rozmiarów okien zajmie się program, pozostałe rzeczy można zrobić klawiaturą, nawet w "klasycznych" środowiskach. W praktykce wygląda to mniej więcej tak:

Wbrew pozorom istnieje dość sporo takich programów: ratpoison, Ion, wmii, dwm, awesome. W tym tekście skupię się na tym ostatnim. Myślę, że każdy sobie poradzi z instalacją tego programu(jeśli nie ma go w repo twojej dystrybucji :poszukaj na freshmeat), więc przejdę od razu do rzeczy.
Podobnie jak w przypadku większości programów open source, kluczem do sukcesu jest dobra konfiguracja, którą przeprowadzamy poprzez edycję pliku ~/.awesomerc . Jego struktura jest dość prosta i można bardzo łatwo ją zrozumieć, próbując przy niej majstrować i posiłkować się manem. Jednakże, aby ułatwić Ci sprawę, przedstawię mój plik konfiguracyjny awesome i pokrótce wyjaśnię, o co chodzi. Nie będę się wdawał w zbędne szczegóły, bo o co chodzi, każdy widzi. Chyba jedyny szczegół, jaki wypada nadmienić to występujący klawisz Mod4. Jego definicja jest kwestią konfiguracji X11, w najpopularniejszych u nas klawiaturach Microsoft będzie to logo Windows. Swoją drogą, bardzo fajnie, że znajduje on wreszcie jakieś logiczne zastosowanie. :)
Mój plik konfiguracyjny składa się z trzech sekcji(jest ich więcej, jednakże nie odczułem potrzeby zgłębiania ich zastosowania :)). Pierwszą z nich jest sekcja screen:
screen 0
{
styles
{
normal
{
font = "sans 8"
fg = "#dddddd"
bg = "#444444"
border = "#555555"
}
focus
{
fg = "#000000"
bg = "#535d6c"
border = "#535d6c"
}
urgent
{
fg = "#111111"
bg = "#ff4500"
}
}
tags
{
tag one { }
tag two { }
tag three { }
tag four { }
tag five { }
tag six { }
tag seven { }
tag eight { }
tag nine { }
}
layouts
{
# layout tile { image = "/usr/share/awesome/icons/layouts/tilew.png" }
# layout tileleft { image = "/usr/share/awesome/icons/layouts/tileleftw.png" }
layout tilebottom { image = "/usr/share/awesome/icons/layouts/tilebottomw.png" }
# layout tiletop { image = "/usr/share/awesome/icons/layouts/tiletopw.png" }
# layout max { image = "/usr/share/awesome/icons/layouts/maxw.png" }
# layout spiral { image = "/usr/share/awesome/icons/layouts/spiralw.png" }
# layout dwindle { image = "/usr/share/awesome/icons/layouts/dwindlew.png" }
# layout floating { image = "/usr/share/awesome/icons/layouts/floatingw.png" }
}
statusbar mystatusbar
{
position = "top"
taglist mytaglist
{
mouse
{
button = "1"
command = "tag_view"
}
mouse
{
button = "1"
modkey = {"Mod4"}
command = "client_tag"
}
mouse
{
button = "3"
command = "tag_toggleview"
}
mouse
{
button = "3"
modkey = {"Mod4"}
command = "client_toggletag"
}
mouse
{
button = "4"
command = "tag_viewnext"
}
mouse
{
button = "5"
command = "tag_viewprev"
}
}
layoutinfo mylayoutinfo
{
mouse
{
button = "1"
command = "tag_setlayout"
arg = "+1"
}
mouse
{
button = "4"
command = "tag_setlayout"
arg = "+1"
}
mouse
{
button = "3"
command = "tag_setlayout"
arg = "-1"
}
mouse
{
button = "5"
command = "tag_setlayout"
arg = "-1"
}
}
tasklist mytasklist{}
iconbox logo
{
image = "/usr/share/awesome/icons/awesome16.png"
mouse
{
button = "1"
command = "spawn"
arg = "exec xterm -e man awesome"
}
}
}
Na samym początku mamy podsekcję styles, zostawiłem wartości domyślne. Dalej mamy podsekcję "tags". Zawiera ona listę tagów, czyli po prostu pulpitów.
Dalej, w kolejności jest podsekcja layouts. Opisuje ona sposoby rozmieszczania okien. Jak można zauważyć, owe sposoby definiuje się poprzez utworzenie odpowiedniego obrazka. Można również je przełączać(standardowo Mod4 + spacja), jednakże zakomentowałem wszystkie oprócz jednego, moim zdaniem najwygodniejszego układu, w którym główne okno(względnie okna) znajduje się u góry, a pozostałe, mniejsze są rozmieszczane poniżej. Szczerze powiedziawszy jest to nawet lepsze od tacki systemowej, bo nie zajmuje wiele miejsca, a za to przekazuje więcej informacji.
Dalej mamy sekcję "statusbar", dotyczącą cosia, w innych środowiskach zwanego panelem. Pozostawiłem wartości domyślne, bo w zasadzie nic poza listą tagów, listą layoutów i listą okien, nie jest mi na tyle potrzebne, żeby chciało mi się wystarczająco zagłębić w dokumentacji. :) Nie mam więc zegarka, jest to trochę problematyczne, ale rozwiązałem to uruchamiając na starcie xclocka, tak żeby pokazywał godzinę i datę w prawym-dolnym rogu. Dla mniej zaznajomionych w użyciu tego programu podaję wiersz polecenia dla cyfrowego zegara w formacie "dzień tygodnia, dzień.miesiąc.rok(2 cyfry) godzina:minuty", dla rozdzielczości 1280x1024:
xclock -geometry 170x30+1110+994 -d -twentyfour -strftime "%a,%d.%m.%y %H:%M"
Dalej mamy sekcję rules. Dotyczy ona wyjątkowych właściwości dla niektórych programów. W moim przypadku ogranicza się do wskazania, które okna mają "pływać", czyli nie podlegać layoutowi:
rules
{
rule { name = "Gimp" float = true }
rule { name = "MPlayer" float = true }
rule { name = "Acroread" float = true }
rule { name = "pinentry" float = true }
rule { name = "xclock" float = true }
}
Ostatnią i chyba najważniejszą sekcją, jest sekcja keys, definiująca skróty klawiszowe:
keys
{
key
{
modkey = {"Mod4"}
key = "F1"
command = "spawn"
arg = "exec xfrun4"
}
key
{
modkey = {"Mod4"}
key = "F2"
command = "spawn"
arg = "ls .menu-items | awesome-menu -e \"exec ~/.menu-items/\""
}
key
{
modkey = {"Mod4"}
key = "F3"
command = "spawn"
arg = "mpc toggle"
}
key
{
modkey = {"Mod4"}
key = "F4"
command = "spawn"
arg = "exec xterm -e \"mpc&&sleep 2\""
}
key
{
modkey = {"Mod4"}
key = "F5"
command = "spawn"
arg = "exec ario"
}
key
{
modkey = {"Mod4"}
key = "Return"
command = "spawn"
arg = "exec ~/.menu-items/Terminal"
}
key
{
modkey = {"Mod4"}
key = "space"
command = "tag_setlayout"
arg = "+1"
}
key
{
modkey = {"Mod4", "Shift"}
key = "space"
command = "tag_setlayout"
arg = "-1"
}
key
{
modkey = {"Mod4"}
key = "b"
command = "statusbar_toggle"
}
key
{
modkey = {"Mod4"}
key = "Right"
command = "client_focusnext"
}
key
{
modkey = {"Mod4"}
key = "Left"
command = "client_focusprev"
}
key
{
modkey = {"Mod4", "Shift"}
key = "Right"
command = "client_swapnext"
}
key
{
modkey = {"Mod4", "Shift"}
key = "Left"
command = "client_swapprev"
}
key
{
modkey = {"Mod4"}
key = "p"
command = "tag_setmwfact"
arg = "-0.05"
}
key
{
modkey = {"Mod4"}
key = "o"
command = "tag_setmwfact"
arg = "+0.05"
}
key
{
modkey = {"Mod4", "Control"}
key = "p"
command = "tag_setncol"
arg = "+1"
}
key
{
modkey = {"Mod4", "Control"}
key = "o"
command = "tag_setncol"
arg = "-1"
}
key
{
modkey = {"Mod4"}
key = "z"
command = "tag_viewprev"
}
key
{
modkey = {"Mod4"}
key = "x"
command = "tag_viewnext"
}
key
{
modkey = {"Mod4"}
key = "m"
command = "client_togglemax"
}
key
{
modkey = {"Mod4", "Control"}
key = "Return"
command = "client_zoom"
}
key
{
modkey = {"Mod4", "Control"}
key = "space"
command = "client_togglefloating"
}
key
{
modkey = {"Mod4", "Control"}
key = "c"
command = "client_kill"
}
key
{
modkey = {"Mod4", "Control"}
key = "q"
command = "quit"
}
key
{
modkey = {"Mod4", "Control"}
key = "r"
command = "restart"
}
key
{
modkey = {"Mod4"}
key = "0"
command = "tag_view"
}
keylist
{
modkey = {"Mod4"}
command = "tag_view"
keylist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
arglist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
}
keylist
{
modkey = {"Mod4", "Shift"}
command = "client_tag"
keylist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
arglist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
}
keylist
{
modkey = {"Mod4", "Control"}
command = "client_toggletag"
keylist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
arglist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
}
}
Myślę, że nie trudno zrozumieć zapis. Jedynie komendy mogą być nieco nie jasne, dlatego wyjaśnię kolejne skróty:
To wszystko, taki stan rzeczy mnie w pełni satysfakcjonuje i sprawia, że niechętnie sięgam po gryzonia, w związku z czym programy też obsługuję klawiaturą, co z kolei sprawia, że pracuje się szybciej. W przyszłości być może będę drążył ten temat. :)
Ostatnio sporo eksperymentowałem z różnymi środowiskami - najpierw GNOME, a potem ciut za ciężkie na mój sprzęt(Athlon XP 1700+, 512MB RAM) KDE4, którego jedyną zaletą, moim skromnym zdaniem , jest Amarok. Trochę się poinstalowało śmiecia, więc stwierdziłem, że to dobry moment, żeby spróbować czegoś nowego. Postanowiłem wybrać Zenwalka. Przede wszystkim, że bazuje na slackware i korzysta z niesprawdzonego jeszcze przeze mnie XFCE, ale też hasło "Ever tried zen computing?" nie pozostało bez znaczenia. :)
Na początek instalacja. Tu nie ma się zbytnio nad czym rozpisywać. Instalator jak instalator. Tekstowy, a jednak w ładnej oprawie(framebuffer jak sądzę). Na tym etapie zdziwił mnie fakt iż system ten, podobnie jak poprzednio przeze mnie używany Arch, traktuje wszystkie dyski jako SCSI, co objawia się się nietypowymi nazwami urządzeń(/dev/sdxn i /dev/srn). Dalej jedyną ciekawostką jest ciekawie pomyślana konfiguracja LILO, przypominająca nieco tą z PLD, ale ta jednak jest trochę bardziej rozbudowana.
Potem przyszedł czas na pierwsze bootowanie. Co ciekawe na samym wstępie poczęstował mnie porcją kilku licencji do zaakceptowania(GNU/GPL, Adobe, Intel), a następnie uruchomił alsaconf i całkiem fajny, stworzony w ncurses menedżer użytkowników. Dalej już standard - gdm.
Całkiem ładny wygląd XFCE. Po małym przekonfigurowaniu, bardzo mi odpowiada.
W oczy też się rzuca bardzo dobra szybkość(mniej więcej na równi z Archem). W standardowym zestawie programów niestety nie ma kilku ważnych programów, więc zacząłem od netpkg, menedżera pakietów Zenwalka, a właściwie jego graficznej nakładki. Program wcale przyzwoity, prosty do bólu, nic dodać nic ująć. Szybko wyszukałem seamonkeya(niestety bez polskiej lokalizacji, którą trzeba było doinstalować w klasyczny sposób), następnie mpd, mpc i z braku gmpc, ario, którego wcześniej nie znałem(a szkoda). Mpdscribble niestety musiałem zainstalować ze źródeł, jak również samodzielnie musiałem napisać skrypt startowy dla mpd/mpdscribble, a takze konfigurację. W gruncie rzeczy nic trudnego. Gdy z głośników zaczęła się sączyć muzyka mogłem przejść do konfiguracji. Najpierw XFCE. Wszystko w porządku, tylko szkoda, że nie ma edytora motywów dla GTK. No nic, nauczę się je pisać przynajmniej. :)
Dalej zaskoczył mnie zestaw konfiguratorów zenwalka. Całkiem przyjemnie się ich używa. Szkoda, że kosztem braku /etc/rc.conf. Nie można mieć wszystkiego.
Następnie przyszedł czas na sterowniki NVIDIA. Tu pozytywne zaskoczenie, bo są źródła kernela (Archu jakoś nie mogłem ich znaleźć).
Podsumowując, Zenwalk to bardzo przyjemna, szybka dystrybucja, jak najbardziej pasująca do swojego motta. Większość konfiguracji da się załatwić konfiguratorami(oprócz mpd, cupsa, konfigurowanego przez przeglądarkę; sane, sudo i nvidia). Bardzo duży plus za menedżer pakietów. W jednym zdaniu, jeśli lubisz XFCE, chcesz szybkiego i prostego, a przy okazji całkiem łatwego, systemu to Zenwalk jest zdecydowanie dobrym pomysłem.
Nagrywanie systemów plików złożonych z dużej ilości katalogów przy użyciu growisofs jest nieco kłopotliwe, bo jest dużo pisania, głównie przez ustawianie graft pointów. GNOME baker natomiast nie oferuje mi zbyt wielkiego pola do popisu, jeśli chodzi o konfigurację (jestem ślepy, czy naprawdę nie można wybrać, czy użyć Jolieta czy Rock Ridge?). Dlatego też, powodowany wrodzonym lenistwem, postanowiłem coś z tym zrobić.
Mianowicie napisałem prosty skrypt, który za nas załatwi graft pointy, a nawet sprawdzi, czy należy użyć opcji -Z czy -M. Powodowany wspomnianym lenistwem zmiana opcji odbywa się poprzez edycję skryptu (w przedstawionej wersji instaluje tylko rock-ridge). Składnia natomiast jest prosta. W argumentach wpisujemy nazwy katalogów(można spokojnie używać gwiazdki). Natomiast parametry "-f" i "-d" odpowiednio informują program, czy dane dalej parametry oznaczają pliki, czy katalogi(domyślnie katalogi). Jeśli podamy nazwę katalogu wśród plików, zostanie nagrana jego zawartość. Po wprowadzeniu polecenia program wydrukuje linię poleceń i poprosi o zatwierdzenie. Skrypt wymaga growisofsa i cdrdao, jest napisany dla archa (więc może być konieczność zmiany /dev/sr0 na odpowiednią dla twojego systemu ścieżkę). Kto chce, niech bierze:
#! /bin/bash
if [ -n "$1" ]
then
echo Burner, enter with names of wanted directories to burn on /dev/sr0 with rock-ridge, and with no joliet
else
isempty=`cdrdao disk-info --device /dev/sr0 | grep "CD-R empty" | grep "no"`
if [ "$isempty" == "" ]
then
echo -n "growisofs -Z=/dev/sr0 -R --graft-points " > .burnertmp
else
echo -n "growisofs -M=/dev/sr0 -R --graft-points " > .burnertmp
fi
isfile=0
for x in "$@"
do
case $x in
"-f") isfile=1 ;;
"-d") isfile=0 ;;
*) if [ "$isfile" == 1 ]
then
echo -n "\"`echo $x`\" " >> .burnertmp
else
echo -n "\"`echo $x`\"=\"`echo $x`\" " >> .burnertmp
fi ;;
esac
done
cat .burnertmp
echo
echo "Is that ok? If so press ENTER, CTRL+C to cancel"
read
chmod +x .burnertmp
./.burnertmp
rm .burnertmp
fi
Ostatnio pisałem o odkryciu walorów emacsa. Wczoraj po raz kolejny przyłapałem się na próbie zapisania gry w Fallout Tactics kombinacją C-x C-s. Całe szczęście, że C-x nic nie robi, a C-s zapisuje grę ;p
Ostatnio więcej gram. Możliwe, że między innymi przez ferie. Ostatnio pykałem w Baldur's Gate( ale niestety zaciąłem się puki co ;p). Toteż zmieniłem grę. Wybrałem grę do której nigdy nie parałem szczególną miłością, chociaż znam ją od baaardzo dawna.
Mam na myśli The Settlers 2. Wreszcie doceniłem tę grę. Aż nie chce się wierzyć, jak bardzo mnie to wciągnęło. Gra się odznacza bardzo fajną grafiką, niekiedy bywa bardzo zabawna( zwłaszcza podczas walk ;p). Przede wszystkim jednak czas płynie bardzo szybko. Aż sam byłem zaskoczony, za każdym razem, gdy dostawałem wiadomość, że nie zapisałem gry przez 30 minut :)
Ostatnio było trochę szumu na temat zależności portalu iTVP( choć innych też to dotyczy) od naszej ulubionej firmy i trudności odtwarzania jego zawartości pod innymi systemami niż Windows. Może zmienili to, a mi nic o tym nie wiadomo, ale problemu nie ma, bo wystarczy zainstalować mplayerplug-in. Aż dziwne, że o tym nie słyszałem oO
Ostatnio pod wpływem pewnego filmiku podrzuconego przez znajomego przypomniałem sobie o starych dobrych czasach które spędziłem na świetnej konsoli, jaką był Pegasus.
Z tego co pamiętam pisałem już o kochanych dosówkach. Teraz odświerzyłem sobie jeszcze dawniejsze czasy. Byłem jeszcze baaardzo mały( w końcu początek lat `90 ;)). Co jak co, ale z tego czasu pamiętam Pegasusa, jak grywało się u siebie i znajomych, zwykle w kupie. Pamiętam te godziny spędzone na graniu w Contrę, Mario, czy Kapitana Amerykę( ten tytuł w moim przypadku obrósł legendą, bo spędziliśmy na niej duuuużo czasu :)). Pamiętam jak nikt nie potrafił przejść pierwszego etapu Circus Charlie. Wreszcie pamiętam wymienianie się kartridżami. Dlatego też Google poszły w ruch, wynalazłem sobie stronkę z ROMami, wklepałem "emerge fakenes". Zacząłem ściągać kolejne ROMy, coraz bardziej przypominały mi się dawne czasy. Teraz grając stwierdzam, że współczesne gry nie dorównują tym z Pegasusa, bo jak wyjaśnić to, że w te gry po tylu latach( cholera, niektóre mają już po ~25lat ;)) dalej chce się grać, a współczesne z reguły przejdzie się raz i lecą w kąt. Ale się rozmarzyłem. Chyba zaraz wyciągnę z szafy mojego pegasusa i poszukam jeszcze innych miodnych tytułów, bo napewno jakieś pominąłem :)
Jakiś czas temu czytałem co nieco na temat tego języka, przeczytałem co nieco o nim, o jego cechach i tym podobnych. Skończyło się na tym, gdyż w necie było tragicznie mało materiałów owym języku. Ostatnio pod wpływem wpisu GiMa zainteresowałem się nieco bardziej tym cackiem, ze względu na liczne bajery, które przedstawił GiM, ale do rzeczy.
Na samym początku zauważyłem, że jeśli chodzi o materiały to niewiele się zmieniło. Właściwie żadnych wartościowych kursów( na miarę "C++ bez cholesterolu" na przykład) nie znalazłem. Parę mało interesujących rozdziałów wikibooks( chyba będę musiał im dopomóc jak poszerzę swoją wiedzę nieco;p ), kilka nędznych tutoriali - to wszystko. Na szczęście znalazłem bardzo dobrą metodę nauki dla tego języka. Mam na myśli przejrzenie jego dokumentacji na stornie projektu. Muszę przyznać, że jest dobrze napisana, nie przynudza zanadto - użytkownik, który używał C, C++, czy Javy; z pewnością się tam odnajdzie( jeśli wszystkich liznął to już w ogóle).
Przejrzawszy ową dokumentacji wiedziałem już w zasadzie, jak programować w tym języku. Popisałem sobie trochę, póki co nie używając jeszcze wszystkich rzeczy, których nie było w C++ stwierdzając, że w D pisze się dość znacznie wygodniej niż w innych, których próbowałem. Szczególnie spodobały mi się kontrakty - są na prawdę przydatne.
Myślę, że nie ma tu jednak co się zbytnio rozpisywać - ten język łaczy w sobie nowoczesne udogodnienia takich języków jak Java, czy Python( choć daje jeszcze więcej niż te wymienione) z wygodą i szybkością C++a. Myślę, że trzeba tego po prostu spróbować :)
Czas napisać o najlepszej płycie tego lata, a może i w ogóle( moim zdaniem). Mam na myśli album "Warhead" Polskiej grupy trash-metalowej Al Sirat. Płyta ukazała się jako załącznik do pisma Trash'em All(nr. 3/2007), tak więc mamy arcydzieło za grosze( Bo pisemko kosztuje 30zł i zawiera 2 płyty).
Może jednak zacznijmy od początku, ponieważ Al Sirat jest dość mało znanym zespołem - przez niektórych określanym mianem najbardziej niedocenianego zespołu( ja swoją drogą też tak uważam). Ja natrafiłem na nich przez przypadek, ściągając ich utwory z albumu "Kala"(2004) 3pm.pl. To było coś zupełnie nowego dla mnie. Świetne brzmienie zbliżone do trash metalu. Świetne partie na gitarach. Bardzo dobre teksty i wokal. Ówcześnie dla mnie było to 10/10.
W tym roku wyszedł Warhead. Kupiłem "Trasha" wyciągnąłem płytkę z pudełka i zacząłem słuchać na przenośnym odtwarzaczu( Bo byłem wówczas na wyjeździe) i mnie zatkało - już po pierwszych sekundach pierwszego nagrania("Primal Right"). Po 50 sekundach natomiast doszedł wokal i byłem odcięty od rzeczywistości ;p Cola znacznie poprawił swoje umiejętności - śpiewa dużo wyraźniej, a jednocześnie znacznie fajniej. Również tekst owego utworu był na równie dobrym poziomie, co utwory z Kali. Potem "Pilgrim", "Ask Yourself", "Fall" w nowej aranżacji, "Warhead", "No Harmony", "Oprawca", "Alert!"(również w nowej aranżacji), "Not About You", "Bezego" i tak zleciała prawie godzina. Po prostu jeszcze lepsze niż Kala - najlepsza płyta jakiej w życiu słuchałem.
Co najdziwniejsze, jeszcze mi nie przeszło, mimo słuchania niemalże na okrągło. Tak czy inaczej zdążyłem trochę ochłonąć i będę trochę bardziej obiektywny, niż po pierwszym przesłuchaniu ;p. Do rzeczy. Na płycie jest dziesięć utworów o długościach ~4-5 minut. Większość z nich w podobnym stylu - pełno świetnych solówek, połamany rytm, tekst na bardzo wysokim poziomie. Od tego odbiega tylko "Bezego", który jest świetną balladką. "Podobny styl" nie oznacza jednak, że utwory są jednakowe - nic z tych rzeczy - różnią się od siebie znacznie - łączy je głównie wysoka jakość, dojrzałość techniczna( i to co podałem wcześniej).
Czas wspomnieć o tekstach. Niestety( jak dla mnie) jest tylko jeden utwór po polsku( Co jednak jest zrozumiałe w przypadku polskiego metalu - docenianego głównie za granicą). Pod względem tekstów najbardziej mi się spodobały 3 pierwsze utwory - "Primal Right" - utrzymany w klimacie dominującym w Kali - ostrej krytyki społeczeństwa; "Pilgrim" - coś nowego, poruszającego kwestie wiary; i Ask Yourself -coś dla załamanych ;p.
Niezależnie od tego, jak bardzo przesadzam z tą fascynacją, płyta jest z pewnością warta uwagi. Polecam.