Podczas próby zorientowania się (i napisania) własnego programu rozpoznawania mowy pojawia się pewien zasadniczy problem jeżeli chcemy tego dokonać dla naszego ojczystego języka. Otóż nie ma ogólnodostępnego słownika analogicznego do angielskiego słownika BEEP (dośc powszechnie używanego przynajmniej w przykładach). Po (naprawdę) długich godzinach spędzonych w Internecie okazało się że jest prototyp takiego słownika, który jest rozwijany. Niestety, przeciętny śmiertelnik nie ma dostępu do tego słownika. Zajmuje się nim głównie pracownik naukowy przy Politechnice Poznańskiej - pan Grocholewski.
W Internecie Można znaleźć jeden z jego artykułów (po polsku nawet) odnośnie rozpoznawania mowy i słownika CORPORA. jest to jednak niejako tylko pewien wstęp teoretyczny. Udało mi się uzyskać dostęp do jeszcze dwóch artykułów tego samego autora. Poniżej chciałam napisać, co udało mi się z nich dowedzieć.
Baza danych słów dla polskich difonów
Język Polski jest jednym z nielicznych języków, który nie może się poszczycić posiadaniem takiej bazy. W chwili obecnej rozwijają się jednak dwa projekty:
CORPORA
COPERNICUS - Baza ta zawiera 10 cyfr, 100 liczb, 40 krótkich dialogów zawierających kilka tematycznie powiązanych zdań oraz około 35 dodatkowych zdań. Sygnał mowy jest zdigitalizowany (cyfrowy) z częstotliwością próbkowania 20 kHz i 16 bitową rozdzielczością.
W dalszej części będziemy rozważać jedynie CORPORę.
Projekt CORPORy:
materiał mowy został tak dobrany aby znajdowały się tam polskie litery, cyfry i 200 pierwszych imion wypowiedzianych w izolacji oraz aby zawrzeć minimum 900 najczęściej występujących polskich difonów.
Warunki nagrywania:
Nagrania zostały dokonane w wielu miejscach w Polsce przy tych samych warunkach środowiskowych (mam na myśli komputer i sprzęt). Sygnał został nagrany z częstotliwością próbkowania 16 kHz i 13 bitową rozdzielczością. Sygnał został znormalizowany i tylko 12 starszych bitów brano pod uwagę. Aby zminimalizować ilość błędów proces nagrywania był kontrolowany przez specjalne oprogramowanie TIMREC (jego zadaniem było np podpowiadanie że osoba za cicho mówi). Oprócz tego przedsięwzięcie było nadzorowane przez wykwalifikowanego fonetyka. Łącznie CORPORA zawiera prawie 180.000 polskich difonów.
Segmentacja i etykietowanie:
Zostało zadecydowane aby segmentacja i etykietowane nastąpiły według automatycznej fonetycznej transkrypcji, gdyż ręczny proces jest bardzo żmudny i długotrwały (choć prawdopodobnie bardziej skuteczny). Osobno było etykietowanie dla kobiet, osobno dla mężczyzn. Użyto do tego techniki dynamicznego programowania (program ten nazywał się LABELER ).
Akustyczna analiza sygnału była dokonywana co 5 ms i użyto w tym celu 15 ms okna Hamminga. Każda ramka reprezentowała 100-punktowy rejestr spektrogramu bazujący na 240-punktowym WFTA(Winograd Fourier Transform Algoithm).
Takie badanie uzyskało dość dobre wyniki.
PODSUMOWANIE:
Automatyczne przypisy stworzono na podstawie wybranych nagrań mężczyzn i kobiet a następnie ręcznie przedstawione przez profesjonalnego akustyka. Największym problemem było to, że inaczej fonetycznie brzmi słowo w całości a inaczej podzielone na sylaby. W takich wypadkach etykietowano część słowa niezależnie jak byłaby ona słyszana w całości słowa. Drugim problemem było to, że w przypadku gdy występowały pewne złożenia głosek (Spółgłoski zwarte) spółgłoska z tego złożenia była umieszczana w losowym momencie ciszy.
Aby korzystać z HTK w miarę prosty sposób, warto zastosować ATK - czyli API dla HTK.
Jest to niejako opakowaniem do poszczególnych podstawowych źródeł HTK: gramatyki(AHTK), n-gramów(AGram), słowników(ADict) i modeli akustycznych(AHmms). Moduły ARMan i AResource zapewniają zarządzanie.
Natomiast moduły APacket, ABuffer, ATree i AComponent zapewniają podstawowe typy do tworzenia komponentów i łączeniu ich w całość.
Pakiety to część informacji. Są używane do przenoszenia różnych informacji pomiędzy asynchronicznymi komponentami W szczególności pakiety są używane do przenoszenia sygnałów I/O od użytkownika (mowa, kliknięcia myszką, itp). W tych przypadkach każdy pakiet uzyskuje specjalną czasową pieczęć, która określa czas w którym "działa". Typ danych jaki możemy przesyłać za pomocą pakietów obejmuje: łańcuchy tekstowe, próbki dźwiękowe, zakodowane cechy wektorów, etykiety i tagi znaczeń.
Bufor - jest pakietem kolejek fifo. Dostarcza kanał na przesyłanie pakietów między komponentami. Bufor może mieć ustalony lub nielimitowany rozmiar. Komponenty chcące uzyskać dostęp do bufora mogą testować czy operacja na buforze zostanie zblokowana zanim zatwierdzi operację.
Komponent jest elementem procesu. Każdy komponent jest wykonywany z jego własnym indywidualnym wątkiem. Komponenty mają interfejs komend który może być użyty do update'u parametrów kontrolnych podczas operacji i skutkiem tego zmodyfikować czas trwania zachowania komponentu.
ASource, ACode i ARec dostarczają trzy rdzenie komponentów potrzebnych do zbudowania "rozpoznawacza mowy". ATK dostarcza prosty interfejs do syntezatora FLite przez ASyn i prosty ALog do rejestracji danych.
Budowanie aplikacji ATK zazwyczaj wiąże się z tworzeniem potrzebnych źródeł i komponentów łączących je razem i zapewniający aplikacji kodowy poziom do kontroli komponentów i procesów I/O pakietów. Tak jak w HTK ATK moduły mogą być konfigurowne przez ustawianie zmiennych w pliku konfiguracyjnym.
Dla aplikacji wymiany mowy jest dostarczony moduł zwany AIO, który wymaga połączenia i zaimplementowania synchronicznego pomiędzy wejściem a wyjściem mowy do zezwolenia do niezapisywania niepotrzebnych odgłosów.
Gdy działa już przykład czas najwyższy stworzyć coś własnego. Bazując na książce udostępnionej na głównej stronie o htk chciałabym opisać kolejne kroki. Zwłaszcza, że w języku polskim trudno cokolwiek znaleźć na ten temat. Przykład który tu opisuję to głosowy interfejs do wybierania numeru.
Aby cokolwiek zrobić najpierw trzeba przygotować dane. Będą nam one potrzebne do nauczenia programu oraz do testowania.
1. Gramatyka.
W celu opisania gramatyki należy się posłużyć notacją BNF:
$digit = ONE | TWO | THREE | FOUR | FIVE | SIX | SEVEN | EIGHT | NINE | OH | ZERO;
$name = [ JOOP ] JANSEN | [ JULIAN ] ODELL | [ DAVE ] OLLASON | [ PHIL ] WOODLAND |[ STEVE ] YOUNG;
( SENT-START ( DIAL <$digit> | (PHONE|CALL) $name) SENT-END )
Gdzie | oznacza alternatywy (OR), nawiasy [] - opcjonalne przedmioty, () - jeden lub więcej powtórzeń.
Aby jednak nasz system rozumiał wyraźnie nasz słowa należy się posłużyć notacją SLF. Jednak dla wygody użytkownika została stworzona specjalny mechanizm, który tłumaczy z BNF na SLF. W tym celu należy napisać HParse gram wdnet.
2. Słownik.
Na początek należy stworzyć posortowaną listę słów/zdań potrzebnych do systemu. Przykładowe poniższe ponumerowane zdania pochodzą z bazy TIMIT: S0001 ONE VALIDATED ACTS OF SCHOOL DISTRICTS
S0002 TWO OTHER CASES ALSO WERE UNDER ADVISEMENT
S0003 BOTH FIGURES WOULD GO HIGHER IN LATER YEARS
Te zdania mogłyby już zostać przez nas użyty do listy treningowej (wlist od word list), ale wpierw jeszcze trzeba pozamieniać spacje na nowe linie. W tym celu można użyć funkcji prompts2wlist z katalogu HTKTutorial.
Sam słownik może być zbudowany za pomocą standardowego źródła HDMan. W tym przykładzie będzie użyty angielski słownik wymowy BEEP. Zostanie on zaadoptowany bez żadnych modyfikacji poza tym, że krótkie pauzy (sp od short-pause) zostaną dodane po każdej wymowie oraz wszelkie akcenty zostaną usunięte. Jeśli słownik będzie zawierał ciszę to wtedy zostanie połączone sp z sil (od silent) i będzie pojedynczy znak sil. Te zmiany mogą być dokonane przy wykorzystaniu HDMan oraz wykorzystaniu ewentualnych skryptów edytujących zawierających często następujące trzy linijki:
AS sp
RS cmu
MP sil sil sp.
(cmu oznacza poziom akcentu).
Następująca komenda utworzy nam słownik nazwany dict przez wyszukiwanie wymowy ze słownika beep i names wszystkich wyrazów znajdujących się w wlist: HDMan -m -w wlist -n monophones1 -l dlog dict beep names
-l dlog to różne statystyki tworzenia słownika. W szczególności pokazuje cy nie brakuje jakiś słów. W przykładzie nasze zestawy treningowe nazywają się monophones1. Zwyczajowy format wejścia każdego słownika wygląda następująco: WORD [outsym] p1 p2 p3 ....
które oznacza, że słowo WORD jest wymawiana jako sekwencja p1 p2 p3... . Nazwa w nawiasach [] (outsym w naszym przypadku) oznacza string, który znajdzie się na wyjściu w przypadku rozpoznaniu tego słowa. Gdy wyrazu nie będzie wewnątrz [] wtedy nic nie będzie na wyjściu. Jeśli nawias zostanie pominięty to string na wyjściu będzie jak słowo. Oto kilka przykładów:
A ah sp
A ax sp
A ey sp
CALL k ao l sp
DIAL d ay ax l sp
EIGHT ey t sp
PHONE f ow n sp
SENT-END [] sil
SENT-START [] sil
SEVEN s eh v n sp
TO t ax sp
TO t uw sp
ZERO z ia r ow sp
Ostatnio było o zainstalowaniu samego htk. Teraz napiszę jak uruchomić przykład podany na stronie. Bo nawet to robi się jakoś inaczej niż zwykłe uruchomienie demo :).
zanim jednak zabierzemy się za uruchamianie przykładu należy ściagnąć sobie (najlepiej najnowszą) wersję Perla na Windowsy. (pobrać można np. stąd www.perl.org).
Teraz możemy juz postępować zgodnie ze schematem, który jest przedstawiony na głównej stronie htk. Czyli otwieramy linię komend (uruchom->cmd). A potem po kolei wpisujemy (warto pamiętać że strzałkami możemy wpisać poprzednią komendę:
cd HTKDemo
mkdir hmms
cd hmms
mkdir tmp
mkdir hmm.0mkdir hmm.1mkdir hmm.2mkdir hmm.3cd..mkdir proto
mkdir acc
mkdir test
perl runDemo.pl configs\monPlainM1S1.dcf
Program powinien się wykonać a na końcu powinny wyjść wyniki:
SENT: %Correct=0.00 [H=0, S=3, N=3] WORD: %Corr=63.91, Acc=59.40 [H=85,
D=35, S=13, I=6, N=133]
transkrypcja. każdy socjolog wie, jak ciężkie zadanie to jest. a i co poniektórzy studenci i zapaleńcy ile czasu trzeba poświęcić, aby zapisać to co ktoś po prostu mówił. Stąd moje zainteresowanie rozpoznawaniem mowy (i zapisywaniem).
System rozpoznawania mowy to ogólnie sumowanie pojedynczych sygnałów zakodowanych w postaci sekwencji jednej lub wielu symboli. Główne problemy to: 1. nie zawsze jedna głoska oddaje jeden symbol (i nie zawsze ten sam) (nieznana granica słowa także) 2. Są różne sposoby zrealizowania mowy ze względu na różnorodność mówcy, środowiska, nastroju, itp.
Są dwie podstawowe biblioteki wspomagające oprogramowanie tego typu: htk i shpinx. Na razie zaczęłam od htk.
Na początek należy wszystko ściągnąć z oficjalnej strony: http://htk.eng.cam.ac.uk/. Wszystko to znaczy paczkę źródłową, przykłady i książkę (a przynajmniej ja tak zrobiłam). HTK jest biblioteką wieloplatformową. Aby uruchomic ją na Linuxie potrzebny jest jednak program Cygwin. Na platformie Windows potrzebny jest Microsoft Visual oraz perl.
Gdy mamy zainstalowanego Visuala możemy się posłużyć tym mini tutorialem do zainstalowania samego htk: 1. w wierszu poleceń należy dodaż ścieżkę Visual Studio, robi się to tak: PATH C:\Program Files\Microsoft Visual Studio 9.0\VC\bin %PATH% (procenty sprawiają, że na koniec się dopisuje ścieżka, w razie czego wpisz help PATH do cmd) (lepiej jednak dodac te zmienna w Mój komputer->właściwości->zaawansowane->zmienne środowiskowe) 2. sprawdź czy ścieżka została dodana -> wpisz PATH, jeżeli jest no to ok. 3. Wróć następnie do folderu gdzie masz HTK (o nazwie HTK 3-4.1) przejdź do folderu htk i stwórz tam folder o nazwie bin.win32 wpisując: mkdir bin.win32 4. uruchom możliwość cmd z Visuala poleceniem: vcvars32 5. wejdź do folderu HTKLib (cd HTKLib) i wpisz: nmake /f htk_htklib_nt.mkf all (powinien się wykonać makefile) 6. przechodzimy katalog wyżej (cd ..) i wchodzimy do folderu . Wpisujemy: nmake /f htk_htktools_nt.mkf all. Analogicznie robimy dla folderów: hlmlib, hlmtools W przypadku pojawienia się Link: error spróbujcie uruchomić samego link (w folderze \bin) jeśli wyskakuje komunikat, ze brak mu dlla to znajdźcie go i dodajcie tę ścieżkę także, u mnie to było: C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE
I się nie przejmujcie że przy niektórych bibliotekach makefile się nie wykona (pojawią się tylko 2 linijki). Na koniec w pliku bin.win32 powinny być pliki exe.
Po angielsku tak zgrabnie sie to nazywa: Principles of graphic design. Co to w ogóle jest ten graphic design? W różnych źródłach są inne definicje. Ale ważny jest trzon - jest to sposób wizualnej komunikacji z użytkownikiem. Przydatne zarówno przy web design jak i wszelkiego innego rodzaju projektowaniu wyglądu czegoś :) O tym chciałabym dziś kilka słów powiedzieć.
a) celowe. Z tym chyba każdy się zgodzi. Zanim coś się zrobi lepiej zazwyczaj to jednek przemyśleć - w ostateczności okazuje się, że wtedy mniej pracy (i nerwów byc może) będzie nas to kosztowało. Projekt może być bardzo pomocny przy odpowiadaniu na pytanie: "jak". Za jego pomocą można pokazać nawigację strony, jak przesyłać informację i inne. Ponadto wiąże koncepcje, pomysły, funkcje dla specjalnych grup (np. wiekowych).
b) informacyjne. Może udzielać odpowiedzi na pewne pytania informacyjne (np. za pomocą wykresów)
c) wykorzystuje wizualny język posługując się np.:
litery "puste" i pełne w środku (tzw. negative/positive)
spadające i wznoszące się (tzw. falling/rising) gdy litera jest wyżej lub niżej niż poprzednia
stabile i niestabilne (stable/unstable) w zalezności czy litera stoi prosto czy jest przekrzywiona.
przód i tył (front/back). Gdzie back oznacza w lustrze a front "normalnie"
grube i cienkie (thick/thin) czyli jakby bold i bez
małe i duże (small/large)
równe i nierówne (smooth/rough), gdzie nierówne to takie jak często można spotkać na ścianach budynku - z różnymi ozdobnikami grafiti.
matowe i przezroczyste (opaque/transparent), typ transparent to np. znakoi wodne na dokumentach
wchodzące i wychodzące(coming/going) - gdy widać tylko część litery.
d) no i oczywiście jest procesem, który na podstawie pewnych infromacji wgłębia się coraz bardziej w szczegóły.
To tyle tak pokrótce odnośnie części pierwszej. Część druga będzie o teorii koloru.
Nie ma to jak odkryć koła na nowo. Satysfakcji mnóstwo, radość nie do opisania - aż do momentu zauważenia, że wynalazek wcale rewolucyjny nie jest. Ot, na przykład
Bez części technicznej nie istaniałaby strona tak jak nie istnieje samochód, ktróy nie jeździ (no dobra, istnieją, ale to są albo wraki samochodów albo zabytki - ani jedne ani drugie nie spełniają swojego głównego przeznaczenia.
Na naszych stronach Web za część techniczną uważa się: - otrzymywanie strony natychmiastowo (względnie szybko) - właściwości zgodne ze standardami stron Web - linki - połączenia stron - dostępność.
1. Aby szybko strony się wyświetlały należy jak najbardziej zmniejszyć ich rozmiar. A oto kilka rad jak tego dokonać: - zoptymalizuj kod strony. - Używaj kilkukrotnie tego samego obrazka. Będzie się ściągał tylko raz a potem będzie w cachu przeglądarki. - Używaj występujące style arkuszy. One także będą ściągały się tylko raz. - tak samo w przypadku skryptów. - optymalizuj obrazki. Używaj formatów jpg oraz gif - zredukuj fizyczną wielkość obrazków. To także może znacznie zmniejszyć wielkość strony
Dla użytkownika także dużo przyjemniej się czeka gdy zanim załaduje się strona pokazuje się jakaś animowana ikonka z napisem że strona zaraz się otworzy. Im zabawniejsza, ciekawsza ikonka tym lepiej (lecz nalezy pamiętać, by rozmiar nie był zbyt duży. lepiej bowiem bez ikonki poczekać 30 sekund krócej niż razem z nią 5 minuty dłużej). Warto także czasem zminimalizować ilość interakcji z użytkownikiem, aby strona nie ładowała(a raczej przeładowywała) się zbyt często. Należy jednocześnie jednak pamiętać o kontakcie z użytkownikiem: przekazaniu informacji o tym np, dlaczego wyszukiwarka nic nie znalazła i co uzytkownik ma teraz zrobić.
2. Standardy - po prostu staraj się używać to, do czego użytkownicy Internetu są przyzwyczajeni. Staraj się być niestandardowy, ale tak żeby to robić lepiej (i bez przesady).
3. Mamy różnego rodzaju linki: -external (prowadzą do innych stron www) -internal (wewnątrz jednej strony) -download (do ściągania plików) -interakcji z użytkownikiem -inline (inaczej kotwice)
Ważnym jest, aby opisywać co w tych linkach użytkownik znajdzie. Dobrym akcentem jest też umieszczanie w nawiasie rozmiaru (ikonki) pliku do ściągnięcia.
Pozazdrościłem innym blogom, stronom, ładnego efektu chowania większej części przerażającego tekstu (zwłaszcza jak zobaczyłem mój ostatni wpis). W googlowo-bloggerowej pomocy są nawet odpowiednie wpisy, ale...
No właśnie. Odnoszę się do tych dwóch helpów: >klik< i >klik<. Niestety żaden z nich mi nie pomógł, nie wiem czy to przez bajzel w moim szablonie, czy przez jakieś moje gapiostwo, udało mi się jednak znaleźć kogoś, kto napisał własne rozwiązanie w javascripcie. O tyle zgrabne, że wymaga tak naprawdę wklejenia kodu tylko w jednym miejscu, jest to jedna mała zgrabna funkcja. Oto źródło.
Gdy już znamy cel naszej strony, znamy swoich przyszłych czytelników, ogólny zarys treści i w jaki sposób będziemy umieszczać tekst czas pójść krok do przodu - organizacja przyszłej treści. Przyjrzyjmy się zatem następującym pojęciom: nawigacja, organizacja, personalność i ograniczenia naszej strony. Więcej...
1. organizacja strony. Gdy wchodzimy na stronę na pierwszy rzut oka powinniśmy wiedzieć jaka jest tematyka strony (Np. obrazki zwierząt będą nam mówiły, że jesteśmy na stronie im poświęconej). Na dobrej stronie powinna także znaleźć informacja gdzie coś znaleźć. Do tego celu służą listy alfabetyczne, kategorie, itp. W przypadku kategorii ważne jest aby umieszczać te kategorie. Jak mamy tylko dwie rzeczy do jakiejść kategorii zróbmy osobną - nieoszczędzajmy :) inaczej odbiorca wejdzie. Stwierdzi nie ma i opuści naszą stronę. Praktycznie njabardziej sprawdza się tworzenia kategorii od ogółu do szczegółu. Zapobiega to tworzeniu miliony małych kategorii umieszczonych w jednej liście. Należy zadbać aby kategorie były tak podzielone aby ktoś znalazł czego szuka, aby mógł w jakiś sposób przeglądać strony (nie jest zdecydowany co chce). Przy projektowaniu organizacji, gdy mamy już jakąś koncepcję warto rozrysować ją na kartce. Pozwoli ona nam lepiej wytłumaczyć innym o co chodzi a tekże samemu zweryfikowac schemat (powstanie tzw drzewo). Eksperci podają, że organizacja nie powinna być głębsza niż 7 stopni wgłąb, ale oczywiście istnieją sytuację gdy jest to uzasadnione by było ich więcej. Gdy jakiś projekt już powstanie warto przetestowac tą witryną na najlepiej kilku uzytkownikach.
2. Nawigacja treścią. Jeżeli mamy już organizację to już dużo. Ale za mało. Jeszcze użytkownik musi poznać organizację nasej strony. Do tego właśnie słuzy nawigacja. Przykładami są: menu (najróżniejsze rodzaje), wyszukiwarki, indeksy, tabele treści, mapy, odnośniki, kotwice, strzałki, linki. Elementy te dodatkowo mogą być globalne (widoczne na każdej stronie) i lokalne. Dobra nawigacja powinna mówić, gdzie użytkownik jest, jak się tu dostał oraz gdzie może iść dalej. Warto by nie zmieniać tej nawigacji zbytnio. Bo wtedy człowiek może się pogubić jeszcze bardziej. (wyobrażacie sobie drogę gdzie jest raz znak do Krakowa, a raz do Warszawy?). Przydatne są tez stałe buttony typu: homepage, menu. Gdy dobrze dobierzemy elementy nawigacji, wtedy niepotrzeba ich zbyt wiele, co doprowadzałuby do niepotrzebnego zamętu. Na niewielu stronach praktykowany jest dobry zwyczaj, aby w menu podkreślny było miejsce gdzie jesteś w strukturze strony. Wręcz niezbędy są też tak zwane breadcrumb(nie wiem jak na polski to tłumaczyć) - powiedzmy okruszki :) A chodzi o pokazanie użytkownikowi gdzie jest. Np.: home->recenzje->gry->World of Warcraft. Nie zajmuje wiele miejsca a jest bardzo użyteczne. Dobrym zwyczajem jest także umieszczanie ikonek przy tekstach (w podkategoriach). Łatwiej mózg ludzki przypomni sobie stronę na której był po obrazku niż po treści (przynajmniej w niektórych przypadkach :P).
3. Personalizacja. Polega głównie na nadaniu klimatu, głównego przekazu. Rzadko kiedy jedna rzecz "opowie" o naszej stronie, ale kombinacja kilku obrazków, tła (muzyki), styl czcionki może już powiedzieć to co chcemy. Pamiętaj jednak o "złotym środku" Arystotelesa. Gdy na stronie będzie mnóstwo obrazków (np. mrugających w dodatku!) i gadżetów, wycinków, kolorowych czcionek kaażdy będzie uciekał z takiej strony. Jak zawsze: zachowaj umiar. Najczęściej parę-kilka obrazków spokojnie wystarczy.
4. Ograniczenia. Pierwszym ważnym ograniczeniem jest technika. Należy pamiętac, że użytkowniczy mają różne systemy operacyjne, przeglądarki, różny sposób dostępu do Internetu, sprzęt, itp. Wiadomo: nie sprawdzi się wsyzstkiego, ale należy tak utworzyć stronę aby możliwie wyglądała jak najlepiej u wszystkich użytkowników. Różna jest także rozdzielczośc monitora. Ale nie przerażaj się - na początek wystarczy, ze wiesz o tym. Wtedy łatwiej jest temu zaradzić :) Kolejny ważny szczegół dotyczy Cię, gdy tworzysz stronę ogólnoświatową. Musisz pamiętać, że symbole w wielu krajach są odczytywany w zupełnie inny sposób. Np. o ile dla "wszystkich" kolor czarny to kolor żałobny to okazuje się że np w Wschodniej Azji takim kolorem jest biały.
5. Zaplanuj postęp. Nie chodzi mi w tym momencie o typowe marketingowe hasła. Mam na myśli tak naprawdę jedynie to, aby pamiętać, zaplanować częste aktualizacje. Zarówno treści jak i strony technicznej. Strona, która sie nie rozwija jest nudna. Im częściej coś się zmienia, tym większe prawdopodobieństwo że kogoś zainteresuje to co piszemy. A przede wszytskim zaciekawi i będzie wracał zobaczyć co sie zmieniło.
Tyle na dzisiaj. Skończyliśmy rozdział wstępu :) to znaczy wszystkiego po trochu i to co najważniejsze. Ale jak mówią: "Diabeł tkwi w szczegółach", które myślę odkryję w kolejnych notkach :)
"Ilość kościelnych rozwodów rośnie lawinowo" - zagrzmiał w ostatnim tygodniu Newsweek. Nie jest to być może wiadomość, która wybiła się na pierwsze strony codzienników, ale sam artykuł skłania do zastanowienia się.
Teza postawiona przez dziennikarzy jest prosta: Kościół wreszcie idzie wiernym na rękę i legalizuje to, co i tak działo się powszechnie już zawsze. Tezę tę ma potwierdzać fakt, że pod jeden paragraf kanonu 1095 (uchwalony w 1983) można podciągnąć niemal każdego: "niezdolni do zawarcia małżeństwa są ci, którzy z przyczyn natury psychicznej nie są zdolni podjąć istotnych obowiązków małżeńskich". Dziennikarz Newsweeka następnie przytacza doświadczenia wdowy, której eks-mąż powymyślał brednie i zdobył upragniony kwitek. Nie, żeby wdowa była przeciwna rozwodowi - i tak żyli od paru lat osobno, po prostu przeszkadzało jej to, że mąż o niej nakłamał. Ot, do rozwodu kościelnego podstaw nie było...
Dostojnicy kościelni oczywiście jakiemukolwiek "pójściu na rękę wiernym" przeczą (i gdy piszę o zakonnikach, to niestety mam na myśli wywiad z jednym z nich - przyznaję bez bicia), jednak dalej czytam, że nie można skazywać dwójki ludzi na piekło życia codziennego przez jeden błąd w młodości. No to jak to: teraz możemy się pobierać i eksperymentować, bo zawsze można się cofnąć? A co się stało z przysięgą wierności na całe życie?
Rozsądnym wyjściem z sytuacji byłoby podniesienie granicy wieku, w którym można przystąpić do sakramentu małżeństwa, ale Kościół nie uczyni tego, żeby nie narażać młodzieży na problemy na tle seksualnym. Niby logiczne, ale czy w tej sytuacji podniesienie poprzeczki o 3 lub 5 lat naprawdę coś zmieni? Ludzka chuć nie budzi się nagle w dniu dostania dowodu.
Wracając do rozwodów: ich liczba może też wzrastać z powodu rosnącej świadomości ludzi. To dobrze, bo małżeństwa w których jedna strona bezsensownie cierpi, można teraz przerwać i nie narażać się na wieczne potępienie. Z drugiej strony to źle, bo paragraf jest wykorzystywany nie tylko przez krzywdzone żony, ale również przez młodych, których nowa wybranka kategorycznie zażąda ślubu kościelnego. Dlaczego do takich rzeczy dochodzi? Przecież każdą sprawą zajmuje się sąd, każda jest dokładnie badana. Otóż okazuje się, że nie każda. Jest mi o tyle łatwo w to uwierzyć nie tylko ze względu na przykład w Newsweeku, ale ze względu na fakt, że w sądach zasiadają księża. Nie uwierzę, że wszyscy oni znają się doskonale na prawie kanonicznym i na ludziach. Byle klecha może krzyczeć z ambony, czy uczyć religii, wątpię, żeby w owych sądach było inaczej.
Poza tym, ludzie, którzy przychodzą po rozwód kościelny zazwyczaj i tak nie żyją już razem, zapewne są po rozwodzie cywilnym. Cóż z tego, że ksiądz odmówi udzielenia rozwodu? Mało jest takich, którzy by się tym naprawdę przejmowali. Człowiek wierzący w sakramentalność związku i tak będzie go ratował za wszelką cenę - bez nakazów księży. Dla wierzącego rozwód to ostateczna ostateczność, tragedia i w ogóle wielki sajgon. Ci rzadko kiedy będą chcieli rozwodu kościelnego bez dobrego powodu.
Jakie jest rozwiązanie tej sytuacji? Czy dalsze ustępstwa są dobrą drogą? Pozwólmy ludziom się mylić? Jan Paweł II ostrzegał przed nadmiernym przyzwoleniem na rozwody, ale kto go teraz pamięta. Może zamiast pozwalać ludziom wybierać drugi raz, nie pozwalać im się mylić? Utrudnienie zawiernia związków małżeńskich przez jakieś testy, czy może przez psychoanalizę zakochanych? Brzmi absurdalnie, ale jak inaczej mieć pewność, że dana dwójka to dobrana para?
W tym momencie dochodzi jeszcze aspekt wiary. Miłość obojga przypieczętowana sakramentem i jeszcze skropiona miłością Boga - oto największa siła. Z punktu widzenia Kościoła nic dziwnego, że małżeństwa giną - brakuje Boga w rodzinie. Wydaje mi się jednak, że istnieje też bardziej przyziemne wytłumaczenie tego zjawiska. Otóż niewierzący zdają sobie sprawę, że ślub kościelny to szopka dla babć i reszty rodziny. Wszystko potem można odkręcić. Kiedy zatem pojawiają się problemy, albo nowe zauroczenie, tak naprawdę nic nie stoi na przeszkodzie, żeby powiedzieć: "Sorry, najwyraźniej byłeś/łaś moją pomyłką".
Natomiast wierzący uważa, że nie ma innej drogi. Problemy się przezwycięża, zauroczenie jest niczym, bo w naszym związku płonie ogień miłości - pięknie, ale jest jeszcze druga droga: "kurde, miałem szansę żyć inaczej a muszę siedzieć tu z tą/tym starą/ym..."
A zatem, czy niewierzący mają lepiej? Co by się nie ziało mogą sobie wystartować kolejny raz, nigdy nie skażą się na "piekło życia codziennego". Tracą rzeczywistą możliwość spędzenia z kimś całego życia, ale czy potrzebują tego? Wydaje się że tak: w końcu prawie wszystkie religie "promowały" monogamizm. Czy to sprawka jednego Boga, który stał za tym wszystkim? Możliwe, ale racjonalista powie raczaj: każde społeczeństwo wykształciło związki monogamiczne jako najkorzystniejsze.
Nie odważę się podsumować wszystkich wypocin powyżej. Być może jakiś mój pogląd i tak się ukształtował i bezczelnie wyziera z tekstu, ale nie sformułuję go wprost. Z racji wieku nie mogę mieć praktycznego pojęcia na temat małżeństwa, chamstwem byłoby więc moje próby rad, czy potępienia czegoś. Co do jednego jestem tylko pewien: nie podoba mi się przyzwalająca strona Kościoła. Może to nie było zamierzone działanie, ale w takim razie coś - i to duże coś - z pewnością działa źle.
Znamy już podstawy dobierania kolorów, jak pisać, ale to jeszcze za mało, żeby strona fajnie wyglądała. Czas na jedną z ważniejszych działów web designu usability na polski często tumaczone jako funkcjonalnosć strony, czyli jak sprawić aby Internauci sprawnie poruszali się po naszej stronie. Na temat samego Web usability znajdziecie sporo informacji w Internecie (choć być może sama też kiedyś napiszę jakąś notkę na ten temat). Eksperci w tej dziedzinie zwracają uwagę np. na niepotrzebne ramki, wycinanie niepotrzebnego tekstu oraz unikanie nielinearnego tekstu. Ważne jest jednak także inne podejście - od strony ogólnej estetyki, tzw. wizualizacji (ciekawe czemu kojarzy mi sie to z przedmiotem na studiach: Metody i symulacja systemów :P). O tym chcę pisać tę notkę (i pewnie jeszcze parę kolejnych). Web design to głównie zadbanie o trzy obszary: - budowa techniczna strony - struktura strony - wizualizacja (jak strona wygląda)
Wiemy, że chcemy stworzyć stronę. Tylko... od czego by tu zacząć? W sumie odpowiedź jest prosta - od planowania :) Pomyśl co, jak i komu chciałbyś przekazać treść zawartą na stronie. Zadecyduj o celu strony. Przy wyborze treści na stronie warto zwrócić uwagę na fakt, że treść to nie tylko słowa, ale też grafika, muzyka, klimat, interakcje, organizacja strony. Bardzo ważne są te elemnty, gdyż tylko one mogą pomóc, aby nie dochodziło do ewentualnych pomyłek (ile razy zdażyło Wam się źle zrozumieć drugą osobę podczas rozmawiania na chat'cie, gg, czy innym komunikatorze tylko dlatego że nie widziałeś niewerbalnych treści??) w rozumieniu tekstu. W ten sposób odpowiemy sobie na pytanie jak umieścić zawartośc strony (content). Dalej jak zastanawiamy się nad tym kto jest odbircą naczej witryny warto doprecyzować sobie te pytania pytając o wiek, zaznajomienie z Internetem, (może płeć?), wykształcenie, jak dobrze znają to o czym piszemy, co chcieliby się dowiedzieć. Można także spróbować wczuć się w rolę odbiorcy i zastanowić się czego od tej strony by oczekiwał. W ten sposób łatwiej nam będzie zastanowić się nad dobraniem takiej treści która zadowoli Internautę i sprawi, że będzie korzystał z Twojej strony. To "wczucie się" często jest przedstawiane w postaci scenariuszy. Tworzy się kilka osób (należących do ludzi, którzy naszym zdaniem powinni mieć powód wejścia na naszą stronę), następnie podaje się ich fikcyjne dane i oczekiwania, powód wejścia na stronę i idealne wyjście. I na koniec zastanawiamy się nad treścią. Pomoże nam to w następnym kroku - czyli co będzie znajdowało się na stronie. Ważne jest aby nie była to strona o wszystkim dla wszystkich - bo jest to niemożliwe. Im węższa dziedzina i zakres tym lepiej dostosowany do użytkownika. Przy treści dobrze jest pamiętać, że użytkownicy często mają pewne skojarzenia, które można wykorzystać, np.: kolor zielony - dobrze, czerwony - źle, linki są podkreśone i niebieskie. Dobrym pomysłem jest także wprowadzać sondy, testy, formularze odnośnie naszej strony dla użytkowników. W końcu oni najlepiej wiedzą czego naszej stronie brakuje.
Teoria kolorów to zbiór zasad używanych do stworzenia harmonicznej kombinacji kolorów (czyli żeby wszystko pasowało). Do jej wizualizacji wykorzystuje się koło kolorów wynalezione przez... Izaaka Newtona(to dopiero był geniusz).
Klasyczne schematy: - jeden kolor (monochromatic) - pewien wycinek koła (analogous), który daje nam przyległe kolory. Jeden (środkowy) jest używany jako główny kolor - reszta służy wzbogaceniu. - dwa kolory(complementary) - komplementarnie, czyli znajdujące się naprzeciw siebie - trzy kolory - trójkąt wpisany w koło - cztery - kwadrat wpisany w koło.
Takie schematy wyróżnia się przy zastosowaniu teorii koła. W przypadku trójkąta i kwadratu wskazanym jest pewien zakres koloru (prawie jak w analogous tylko dużo mniejsze)
Pewna uwaga: koło kolorów nie bierze pod uwage odcieni. To znaczy wg tej teorii jasny zielony z fioletowym pasuje tak jak ciemny zielony z fioletem.
No cóż, wakacje się skończyły. Czas zabierać się do pracy. Teraz przyszło mi na dokształcanie się w kwestii typografii. Wcześniej nawet nie do końca wiedziałam co to jest (co i dziwne nie jest, bo definicja w Wikipedii porażająca tez nie jest), ale powoli.
Typografia to ogólnie sposób zapisu informacji w taki sposób by był jak najlepiej czytelny. Głównym celem tej dziedziny nauki jest, aby czytelnik na pierwszy rzut oka wręcz wiedział czy ten tekst opłaca mu się czytać czy nie. A jeśli tak to maksymalnie uprzyjemnić mu tę sprawę. Stąd powstały pewne sprawdzone wytyczne jak to robić, aby dobrze się czytało.
Mówi się, że podczas optymalizacji typografii to optymalizacji: usability (funkcjonalność, użyteczność), accessibility(dostępność) i readability(czytelność). Poniżej przedstawię pokrótce najważniejsze z nich.
1. Measure (miara) - czyli ilość znaków w jednej linii. Okazuje się że dla tekstu pisanego jednokolumnowo powinno być 40-80 znaków (razem ze spacjami) w jednej linii. 65 to idealnie.
2. leading - odstęp między kolejnymi wierszami, fachowo: interlinia. Czasem wraz z rozmiarem czcionki nazywana wysokością linii. Dobra reguła to 2-5 pt więcej niż ma czcionka którą piszemy. Przykładowo dla 12 pt dobre będzie 15 lub 16 pt(wysokości).
3. hanging quotes/punctuation - tłumacząc na polski "wiszące cudzysłowia/wypunktowania". A chodzi po prostu o to, żeby wszelkie znaki interpunkcyjne (także wypunktowania) były poza główną kolumną (niejako wystawały poza kolumnę).
4. Widows and Orphans. Widows (nie mylić z Windows!!) to słowo lub linia na końcu lub początku paragrafu. Orphans jest tym samym tylko, że na końcu kolumny. A chodzi o to, aby nie było pojedynczego wyrazu w ostatniej linijce paragrafu (widow) ani pojedynczej linii gdy rozpoczynamy nową kolumnę.
5. Clean rags - to zakończenia kolejnych wierszy w przypadku, gdy tekst nie jest justowany. Ważna rzecz polega na tym, aby pilnować żeby zbytnio nie różniły się między sobą kolejne linijki w paragrafie pod względem długości, bo takie coś wygląda dziwnie:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eleifend mauris vel nibh interdum molestie. Nulla facilisi. Pellentesque commodo elit imperdiet erat luctus at porttitor lacus luctus. Sed mi massa, gravida vitae faucibus ac, lacinia ac nunc. Curabitur sagittis varius lacinia. Phasellus iaculis justo non velit vulputate id fermentum neque ultricies.
6. Emphasis (nacisk) - to niepotrzebne podkreślanie wyrazów. Polega to na tym, że w trakcie tekstu zwykłego (jaki ja teraz próbuję stworzyć) umieścimy jakieś WAŻNE SŁOWO w ten właśnie sposób (a niektórzy jeszcze podkreślenie dodają). Wystarczy użyć jeden stopień wyżej podkreślenie a nie wszystko co się da. Na tej stronie możecie znaleźć dokładny opis hierarchii podkreślania słowa: http://www.markboulton.co.uk/
7. rozmiar czcionki - raczej logiczna sprawa. Warto jednak wziąć jeszcze pod uwagę dla kogo ta strona jest kierowana (np. dla osób starszych lepsza byłaby nieco większa czcionka). Zazwyczaj lepiej żeby litery były troszkę za duże niż za małe (patrząc na tendencje dzisiejszego Internetu).
8. traktowanie tekstu jako UI - co to znaczy? To np linki w kolorze niebieskim, zróżnicowanie kolorów na stronie (z rozwagą!!), itp.
9. Warto zwrócić uwagę na np. wyrównanie do siatki, przejrzeć nagłówki, które zostały juz sprawdzone przez społeczność Internetu (Headlines for typography) Dla zainteresowanych polecam odnośniki na wikipedii (po wpisaniu "typografia") oraz stronę anglojęzyczną webtypography.net
A tak na marginesie. Wiecie skąd tekst Lorem ipsum...? Jest to zwyczajowy tekst używany w Internecie jako okreslenie: "Tu jest jakiś tekst". Jeżeli chcecie wiedzieć historię czy w ogóle coś więcej (tekstu) to odsyłam do Googla :)
Miałem ostatnio okazję obejrzeć znowu Kompanię Braci - genialny serial, gratka dla takiego amatora Drugiej Wojny Światowej jak ja. Gdy przypominałem sobie losy kompanii E, odżyły też wspomnienia o źródłach moich fascynacji: liczne książki z biblioteki ojca oraz... Medal of Honor :-). W tytuł grałem ten dość długo, łącznie z multiplayerem i pamiętam, że niestety gra ta jak na dzisiejsze czasy mocno ustępuje innym pozycjom pod względem grafiki czy chociażby samej grywalności. Już w roku wydania recenzent w CD-Action (zauroczony MoHem) narzekał na przytłaczające skrypciarstwo i nierówny poziom trudności. Zatem nie ma do czego wracać.
Ale po Medal of Honor serca graczy zaczęła podbijać seria Call of Duty. W jedynkę grałem - zaczęło się świetnie, od zrzutu spadochronowego nad Normandią. Pamiętam dobrze pierwszy etap, sprawiał wrażenie otwartego. Gracz spadał w pobliżu gospodarstwa, obok była polana, wokół, wśród grzmiących dział przeciwlotniczych, lądowali koledzy - "świat" był otwarty. Potem niestety temp spadło, a misje strony radzieckiej - nuda. (no, może poza pierwszą: jeden karabin przypadał na dwóch żołnierzy, drugi czekał aż padnie pierwszy. Zgadnijcie czy gracz był na początku uzbrojony, hehe).
Mój duch pragnął wtopić się całkiem w klimat serialu, przeżyć pierwsze dni inwazji i strzelać do Niemców. MoH:Pacific Assault który przeszedłem parę lat temu zraził mnie do tej serii, a była to ostatnia odsłona jaka wyszła na peceta. Zajrzałem więc do wikipedii, aby dowiedzieć się nieco więcej na temat CoD4, o którym wcześniej hucznie było na forach. Zawiedziony już samym podtytułem "modern warfare", skoczyłem pod trójkę - której nie wydano na blaszaki. Zatem padło na CoD2.
A prawdę mówiąc, najpierw dowiedziałem się, że można tanio dostać toto w MediaMarkcie (thx Pejo), a potem przeprowadziłem powyższą rozkminę :P
CoD2 powitał mnie tym, czym zawiódł mnie w pierwszej części: kampanią radziecką polegającą głównie na bieganiu po zrujnowanym mieście (tu: Stalingrad). Rozgrywka jest nadal taka sama jak w klasycznym FPSie, nie ma tu wielkiej filozofii - chociaż są różnice, mam wrażenie że wynikające z konsolowych korzeni tytułu. Po pierwsze nie można zapisać gry w dowolnym momencie. Po drugie nie ma paska zdrowia. Gdy dostajemy kulkę ekran zachodzi czerwonym kolorem. Jeśli nadal będziemy pod celnym ostrzałem, to koniec - wczytuje się ostatni chceckpoint.
Czy na pewno koniec? Prawdę mówiąc, nie było to takie uciążliwe. Są one dość często ustawione, nie pamiętam, żebym był zmuszany do przechodzenia jeszcze raz dłuższego fragmentu.
Co poza tym ciekawego? Koniec z one-man army, najwyżej dwie pukawki naraz (+granaty, również dymne)., chociaż najczęściej biegałem tylko z MP40. Granat dymny to bardzo przyjemna zabawka i mocno wpływa na rozgrywkę. Dym jest niewiarygodnie obfity i gęsty, nie wpływa też na nasze zdrowie; nic tylko wrzucić taki granat pod gniazdo MG42 po czym wbiec w szare kłęby plując przed siebie ciągłym ogniem =).
Szok od eksplozji - no cóż, to już było i nie robiło takiego wrażenia jak za pierwszym razem.
Po wyparci Niemiaszków ze Stalingradu wskakujemy w skórę Brytola. Ku mojemu rozczarowaniu (mimo wszystko najbardziej mnie zawsze fascynował front zachodni) niestety jesteśmy w gorącej Afryce. Może to nie powód samego umiejscowienia, w końcu MoH:AA zaczynał się od misjii w Afryce, które były świetne, ale... czegoś po prostu brakowało. Pruło się do kolejnych Szwabów i nie było w tym żadnego dreszczyku emocji. Pejo się ekscytował, że walka cały czas toczy się razem z całym oddziałem, że jest zerwana konwencja jednoosobowej armii. Prawdę mówiąc, nie zauważyłem tego. Jasne, są koledzy wozacko przeskakujący murki, czasem rzucą granat dymny, ale ich obecność zauważa się dopiero wtedy, gdy wróg atakuje z kilku stron. Odrzucają granaty i utrzymują wroga na odległość. Ale takie etapy były dwa czy trzy, reszta - to szarża naprzód na kolejne umocnione pozycje wroga, gdzie koledzy zostają z tyłu i są prawie niezauważalni.
Wracając do Afryki - czekają nas tam etapy zmechanizowane, pokierujemy lekkim pojazdem opancerzonym, a potem również czołgiem w jednej z licznych pancernych potyczek. To miła odskocznia od rutyny. Potem wreszcie rozpoczyna się kampania amerykańska, desantem na Pointe du Hoc. Utrzymanie przyczółka to było wyzwanie, parokrotnie wczytywałem checkpointy, było naprawdę gorąco. Zaraz potem było zdobywanie i obrona wzgórza 400. To właśnie te dwa etapy najbardziej zapamiętałem z całej gry, one najbardziej błyszczały.
Muzyka jest w sumie podobna do tej z Kompanii Broci - wzniosła, powolna, ale nie pasuje tutaj. W serialu, gdzie poznawaliśmy myśli żołnierzy, ich rozterki, wątpliwości i problemy, faktycznie kreowany był patetyczny klimat. W grze - no co z tego, że każdy z kumpli ma swoje nazwisko. Nie o to chodzi, nie tego zresztą chyba od FPSa się oczekuje. Oczywiście, wzniosłe tony gdy przybywa wsparcie "w ostatniej chwili" pasują jak najbardziej. Ale można by nieco bardziej zróżnicować muzykę, bo większość misji nie była tak heroiczna jak sugerowałaby to muzyka.
Grafika - na początku trochę raziła, spodziewałem się czegoś więcej po tytule wydanym w 2005 (zwłaszcza mając w pamięci Prey'a). Plansze były czasem w dziwny sposóbzbyt sterylne i puste. Przeszkadzały wszechobecne ograniczenia. Jednak generalnie nie było źle, chociaż czasami miałem wrażenie, że znowu gram w MoH:AA.
Podsumowując - rozgrywka nieco repetatywna, grafika znośna, muzyka nie na miejscu, a do tego kilka etapów, które naprawdę podnoszą adrenalinę. Poza tym gra bardzo krótka - przebiegłem ją w kilka wieczorów. Trochę się zawiodłem, zwłaszcza za cenę 37 złotych. Liczyłem na coś na poziomie Prey'a: zwiodła mnie "sławna" seria, znany developer i zachęcająca cena.
Trudno tego nie skomentować, trudno zostać obojętnym. Albo kręcą Cię te klimaty, albo - bardzo łagodnie mówiąc - irytują. Nie wyobrażam sobie po prostu, żeby ktoś pozostał bierny na obłoki dymu i smród palonej gumy, lub - zależnie od punktu widzenia rzecz jasna - błyszczący wóz mknący z rykiem przez miasto. Ja niestety reaguję negatywnie, bo o ile nie mam nic przeciwko szybkim pojazdom, to "robienie dymu" jest dla mnie niepojętą rozrywką. Naprawdę nie ma czegokolwiek innego równie "fajnego" i równocześnie mniej szkodliwego dla społeczeństwa?
Czy przemawia przeze mnie zazdrość? Raczej nie, nie życzę nikomu nic złego, nie marzę też o driftowaniu po parkingach - chociaż przyznam autka pierwsza klasa :-). Ale jeśli chcecie szpanować wozem i "klasą", można to robić z dala od innych ludzi, których nie podniecają Wasze zainteresowania!
Bo, niestety, zlot kilkunastu błyszczących pojazdów nie kwalifikuje się jako "wydarzenie w mieście". Nie uciszy to malkontentów mówiących, że "nic się nie dzieje", a raczej doda im powodów do narzekań. No i trudno uwierzyć w "normalnych ludzi" w wideoklipie pokazującym pojazdy, które są marzeniem ściętej głowy dla przeciętnego zjadacza chleba, nie wspominając już o wdzięczących się kobitkach. Żadna silnie wybijająca się subkultura nie może się zadeklarować jako "normalni ludzie" - właśnie dlatego, że się wybija.
Więc Panowie - gratuluję pomysłu, róbcie dalej co Was kręci, rapujcie, palcie gumy i tańczcie z laskami na parkingach. Ale zachowajcie trochę szacunku (i litości) dla innych. Ot, żyj i daj żyć innym.
Skuszony niską ceną gier z serii "Kolekcja Klasyki" (taniość potęgował jeszcze fakt wyprzedaży w Kolporterze), a coraz bardziej zbliżającą się wizją dużej ilości wolnego czasu, kupiłem grę Prey. Ostatecznym impulsem, który popchnął mnie do kasy, były zamieszczone na odwrocie opakowania. W zwłaszcza dziewiątka w CD-Action, piśmie, które czytywałem była dla mnie wystarczająco dobrą referencją. Same przechwałki wydawcy (najlepsza gra akcji 2006 roku, nowe standardy, doskonała muzyka) przyjmowałem z dużo większą rezerwą. Raz, że rok 2006 dawno minął, dwa, że trudno oczekiwać czegoś rewolucyjnego po FPSie w którym jeden człowiek odpiera inwazję Obcych.
Zaznaczę przy tym, że ostatni raz z kosmitami zmierzyłem się kierując poczynaniami Duke Nukem'a. Chyba nie muszę mówić, że było to dość dawno temu. Potem gier takich unikałem, bo w grach szukam rozrywki, a nie horroru czy thrillera - po prostu nie moje klimaty.
Gra rozpoczyna się powoli, w lokalnym barze, gdzie poznajemy poglądy głównego bohatera, jego dziewczynę (którą potem będziemy przez większość gry ratować) oraz dziadka-mędrca. Całą tą indiańsko-rodzinną sielankę przerywa inwazja kosmitów, potem chwila zwiedzania statku od środka wśród innych porwanych i już można tłuc obcych pierwszą zdobytą spluwą.
Wnętrze statku jest początkowo tylko organiczne - jest to coś, co zawsze odpychało mnie od grania Zergami. Oczywiście techniki nie zabraknie, i to na bardzo wysokim poziomie. O potędze Obcych stanowi możliwość otwierania portali w dowolnych miejscach i o dowolnych rozmiarach. Dlatego nie można ani na chwilę osłabić czujności - po każdym kroku zewsząd mogą otworzyć się żółte portale z których wyskoczą "ci źli". To właśnie portale są jednym z największych atutów gry. Recenzenci rozchwytywali się tym, jak płynnie można przejść z jednej lokacji do drugiej, że przez portal można zaglądać co jest po drugiej stronie. Nie zrobiło na mnie to dużego wrażenia, ponieważ grałem już w Portals (the cake is a lie!), jednak ten mechanizm ma inne zalety. Nie ma bezsensownych tabunów wrogów przebywających w danym pomieszczeniu spokojnie czekających na gracza. Zamiast tego grze towarzyszy ciągła atmosfera zasadzki.
Wracając jednak do "organiczności" kosmitów - gra w moim pojmowaniu jest obrzydliwa i im dalej tym gorzej, bo są i mutanty, i dziwne pulsujące żyły, żyjące kolce w podłogach, mnóstwo plechy itede itepe. Okropności czyhają już na początku - jesteśmy świadkami okrutnych mordów jakich dopuszczają się Obcy względem więźniów. Mimo to przy grze utrzymał mnie jej klimat. Chciałem się dowiedzieć, czy Tommy'emu uda się uratować Jen, chciałem się dowiedzieć dlaczego tak naprawdę Ziemia została zaatakowana. Klimatyczne smaczki - typu Ziemia widoczna przez wizjery Kosmitów, albo ziemskie audycje radiowe w których można usłyszeć podenerwowanych słuchaczy opowiadających o dziwnych światłach na niebie - świetna sprawa. No i główny bohater, który ma jasno określony cel, jest targany emocjami i dość często rzuca komentarzami. Wszystko to sprawiło, że po pewnym czasie przyzwyczaiłem się do broni, która od czasu do czasu ciekawsko na mnie spoglądała :-) .
Gra jest szczególna pod jeszcze jednym względem. Idąc w ślady za trendem niestresowania zbytnio graczy przed monitorem, w grze nie da się zginąć. Za każdym razem gdy Tommy miałby ponieść śmierć jesteśmy przenoszeni do świata duchowego, gdzie trzeba ustrzelić z łuku kilka latających dookoła duchów - po czym wracamy do akcji. Rozwiązanie świetne, bo eliminuje niemalże całkowicie frustrację spowodowaną "kolejną śmiercią", sprawia też że nie ma w grze elementów nie do przejścia, a jednak czułem się odpowiednio zmotywowany (no, przez większość czasu przynajmniej) do walki o życie do ostatniego naboju.
Zakończenie gry jest fajne. Spokojnie nic, nie zdradzę, ale chcę zaznaczyć, że przy tak sztampowym pomyśle napędzającym fabułę, ostatnia potyczka nie jest po prostu zwykłą planszą z finalnym bossem - przynajmniej w moim odczuciu. Może i się nie znam, w końcu nie grałem w wiele gier tego typu, ale jak dla mnie zakończenie było zaskakujące. No i warto przeczekać napisy końcowe - potem jest jeszcze mała niespodzianka.
Do półki z Kolekcją Klasyki popchnął mnie mój nienajnowszy komputer, ale grafika stała na przyzwoitym poziomie (no dobra, ludzkie głowy były jakieś takie niekształtne... ale to Indianie byli, może tak miało być :P ). Muzyka bardzo dobrze budowała nastrój, zwłaszcza w wyreżyserowanych momentach, ale nie tylko. To ten typ soundtracku, którego się nie pamięta, ale który potęguje każdą przeżywaną emocję.
Czuję, że chciałbym napisać jeszcze więcej, ale boję się że zacznę się powtarzać. Zatem podsumowując: świetna gra. Cieszę się, że zagrałem w Prey'a.
No i po egzaminach. Sesja za nami. I muszę przyznać - ta sesja choć wyczerpująca jak każda inna dla mnie była jakaś trochę bardziej szczęśliwa (poza jakimiś wyjątkami). No tak. Tylko są niby wakacje. Ale to nie oznacza koniec zmartwień. No bo w tym roku trzeba jakoś praktyki sobie załatwić. Uch... a łatwe to to nie jest. Zwłaszcza w Szczecinie. Miejmy nadzieję, że coś się uda załatwić.
widać światełko w tunelu... jeszcze tylko 2 egzaminy. Zastanawia mnie, że zawsze w sesji najintensywniej zaczynam się zajmować takimi detalami jak planowanie sesji RPG :D
Dobra wiadomość jest taka, że szablon, jaki ostatnio tu umieściłem, nie uległ zmianie, rzeczywiście wystarczyło go rozbudować. Oczywiście wyniknęły problemy: gniazda faktycznie można traktować jak pliki przy pomocy funkcji read() i write(), ale szybko okazuje się, że nie zawsze wszystko działa jak należy. Moją bolączką był głównie problem z powtórnym odczytaniem, w sieci można też znaleźć informacje, że czasami zczytywana jest niepełna ilość znaków. Dlatego zdecydowałem się na zastąpienie read() przez recv().
Kolejnym problemem okazało się wykrycie końca pliku. Serwer wysyłając plik czytał kolejne jego porcje, ładował do bufora, następnie wysyłał (zapisywał do gniazda) zawartość bufora. Gdy plik się skończył (ilość odczytanych znaków <= 0), wychodził z pętli i czekał na kolejną komendę. Gdy klient pobierał plik, w momencie gdy gniazdo okazywało się puste, read blokował proces oczekując na zapełnienie gniazda. Teoretycznie można wysłać konkretny łańcuch znaków, który byłby identyfikowany jako koniec transmisji, ale nie można zagwarantować, że taki łańcuch nie pojawi się w przesyłanym pliku. Innym rozwiązaniem jest zastosowanie recv z parametrem MSG_DONTWAIT, jednak w rzadkich przypadkach może to spowodować niepełny odbiór danych, a tego byśmy nie chcieli. Rozwiązaniem tych problemów jest przyjęcie następującej konwencji: przesyłanie wielkości pakietu na samym początku. Z żalem przyznaję, że zanim na to wpadłem, zdążył mi to zasugerować ktoś inny... w każdym razie, w dalszym razie posłużyłem się tak zdefiniowanymi funkcjami:
int pobierz(int src, char*bufor)
{
int dlugosc, x;
recv(src, &dlugosc, sizeof(int), MSG_WAITALL);
if (dlugosc ==0)
return-1;
x = recv(src, bufor, dlugosc, MSG_WAITALL);
return dlugosc;
};
void wyslij(int des, char*bufor, int len)
{
write(des, &len, sizeof(len));
write(des, bufor, len);
};
W samym programie posługiwałem się następującą konwencją. Przy wysyłaniu:
x = pobierz(skad, bufor);
if (x mniejszy od 0) { /* koniec transmisji */ }
W ten sposób serwer i klient już hulają :) Poniżej załączam fragmenty kodów obu aplikacji odpowiedzialne za przesłanie listy plików dostępnych na serwerze.
Ksiądz Twardowski napisał kiedyś w swoim wierszu: "spieszmy się kochać ludzi, tak szybko odchodzą". Z czasem stało się to zdanie bardzo często używane. Ostatnio jednak miałam okazję się przekonać, że kochać ludzi to za mało. Brakuje jeszcze, żeby tę miłość okazywać, tak żeby wiedzieli że są dla nas kimś ważnym. Bo potem można tego żałować bardziej, dużo bardziej niż jakby tej osoby się nie kochało wcale. Sprafrazowałabym słowa księdza Twardowskiego: "spieszmy się okazywać ludziom naszą miłość, tak szybko odchodzą".
Sesja zbliża się wielkimi krokami, trza zabrać się do pracy :) Oczywiście to co najnudniejsze automatycznie spada na sam koniec listy rzeczy do zrobienia i tym sposobem zabrałem się za pisanie zadanka z sieci. Zaopatrzywszy się w odpowiednie zaplecze teoretyczne, włączyłem muzykę...
int main(int argc, char**argv) { char bufor[BUF_SIZE]; int gniazdo, one =1, i; struct hostnet *ServerInfo; struct sockaddr_in NrIP;
memset(&NrIP, 0, sizeof(NrIP)); // wypełniam zerami NrIP NrIP.sin_family = AF_INET; // dziedzina adresów: IPv4 NrIP.sin_addr.s_addr = htonl(INADDR_ANY); /* może korzystać z każdego numeru IP jaki znajdzie dla danego komputera. W praktyce oznacza to, że gdy są dwa interfejsy (np. sieć lokalna z kabelka i wifi(internet) to obsługiwane będą połączenia od obu tych interfejsów */ NrIP.sin_port = htons(SERVER_PORT); //nr portu gniazdo = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); /* SOCK_STREAM - dane przesyłane strumieniowo IPPRO_TCP - z wykorzystaniem protokolu TCP */ if (gniazdo <0) fatal("Blad utworzenia gniazda\n");
setsockopt(gniazdo, SOL_SOCKET, SO_REUSEADDR, (char*) &one, sizeof(one)); /*SOL_SOCKET - operacja ma być wykonana na poziomie gniazda (a nie na przez oprogramowanie IPv4 lub TCP) SO_REUSEADDR - pozwalamy na wiele równoczesnych połączeń serwera. Ustawiamy tą wartość (one). Ostatni parametr mówi jak duża jest zmienna one */
//zmienna one nie jest już dalej potrzebna. one = bind(gniazdo, (struct sockaddr *) &NrIP, sizeof(NrIP)); if (one <0) fatal("Blad przyporzadkowania adresu IP do gniazda\n");
// maksymalna ilość żądań połączenia one = listen(gniazdo, QUEUE_SIZE); if (one <0) fatal("Error: listen()\n");
//-------------------------------------------------------------- // gniazdo gotowe do pracy //-------------------------------------------------------------- while (1) { one = accept(gniazdo, 0, 0); /* argumenty 2 i 3 mogą określać strukturę sockaddr, która zostałaby wypełniona danymi nt połącznia - niepotrzebne nam to. */ if (one <0) fatal("Error: accept()\n"); read(one, bufor, BUF_SIZE); // odczytanie nazwy przychodzącego pliku i =-1; if (!strcmp(bufor,"LIST")) i =0; if (!strcmp(bufor "GET")) i =1; if (!strcmp(bufor "CLOSE")) i =2;
Jest to szkielet, który jest jeszcze mniej funkcjonalny, niż jego odpowiednik w książce Tanenbauma, ale delikatnie ukształtowany pod kształt tego, co chcę osiągnąć - przynajmniej tak myślę. No i przesadnie wręcz obkomentowany.
EDIT: Wiele więcej problemów niż z samym powyższym kodem, miałem z jego czytelnym zamieszczeniem - dlatego zresztą notka jest tak krótka i skąpa. Posłużyłem się w końcu tym sposobem , ale nie jest do końca skuteczny - między liniami kodu powstały trzyakapitowe przerwy... Wynik wybitnie nie jest zadowalający.
EDIT2: Znalazłem wreszcie świetne narzędzie: www.blogtrog.com. Wada? Nie obsługuje kodu w C/C++... trudno. Grunt, że jest czytelnie i nie trzeba nic ręcznie poprawiać. Victory!
Trzeba je podejmować szybko. Odkładanie momentu podjęcia ostatecznej decyzji, to tylko niepotrzebne zwlekanie w czasie. Tak naprawdę już w pierwszym momencie wiemy, jaki wybór jest bliższy naszemu sercu - chyba, że z góry wiadomo, że stanie się coś, co mocno wpłynie na wybór, tylko nie wiadomo jeszcze jak.
Zwlekanie z decyzją, to tylko podtrzymywanie niepewności. A brak informacji, na których można się oprzeć, to bardzo nieprzyjemna sprawa. Skoro nie ma informacji, tworzy się założenia, a te z kolei łączą się silnie z niedokładnościami. I tak na nietrafionych założeniach tworzy się osądy, a osądy tworzą światopogląd. A ludzie ze skrzywionym światopoglądem podejmują decyzje krzywdzące innych (niezależnie od tego czy podejmą je szybko czy nie ;) ). Powstają nieporozumienia, problemy i takie tam.
Oczywiście nie znaczy to, że decydować się trzeba szybko, zawsze w ułamku sekundy. Czas do namysłu to atut, którym nie można pogardzić. Piętnuję tylko sam akt zwlekania z decyzją. Zastanawiać się dłużej niż dzień to zazwyczaj już strata czasu. Sprawia to tylko, że po podjęciu decyzji częściej i dłużej będziemy rozpamiętywać inne opcje.
Długi czas do namysłu sprawia też iluzję wolności wyboru. Często może się okazać, że zwlekając na ostatnią chwilę, gdy już wreszcie podjęliśmy decyzję, okaże się ona niemożliwa - jest już po prostu za późno.
No cóż. Właśnie zostałam współtwórca tego bloga. Zadziwiające uczucie. Jakby zyskać jakąś władzę. No i obrazki. Widzieć swoje zdjęcie w Internecie to tez dziwne uczucie. Zwłaszcza jak pierwszy raz. Ciekawe co tu jeszcze kiedyś będzie :)
Z przerażeniem nieco zakładam tego bloga, szczerze się przyznaję. Mam nadzieję, że nie będzie to kolejne nudne miejsce w sieci, a co konkretnie się tu znajdzie - tego jeszcze nie wiem. Na pewno w najbliższej przyszłości chcę wgrać kilka prostych motywów, na które wpadłem brzdąkając na giatrce, a Tabita odgraża się jakie to zdjęcia tu zamieści... aż się boję!