poniedziałek, 16 listopada 2009

CORPORA - polski słownik rozpoznawania mowy

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:

  1. CORPORA
  2. 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.

piątek, 6 listopada 2009

ATK - API dla HTK - wstęp

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ść.

Więcej...


niedziela, 1 listopada 2009

htk - tutorial. Część 1

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.

Więcej...


sobota, 31 października 2009

htk - demo

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).

Więcej...



niedziela, 25 października 2009

rozpoznawanie mowy

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).

Więcej...


czwartek, 22 października 2009

Zasady graficznego projektowania, cz. 1

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ć.

Więcej...

sobota, 17 października 2009

Google był pierwszy

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

piątek, 16 października 2009

Web usability od strony wizualizacji. Część techniczna.


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ść.

Więcej...


środa, 14 października 2009

Show/hide

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...

Więcej...

Web usability od strony wizualizacji. Przygotowanie treści


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...


Ślubuję Ci miłość, chyba że...

"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ę.

Więcej...

wtorek, 13 października 2009

Web usability od strony wizualizacji. Planowanie.

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.

poniedziałek, 12 października 2009

teoria kolorów

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.

Typografia w Internecie

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 :)

czwartek, 13 sierpnia 2009

Wakacje, wakacje

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ób zbyt 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.

sobota, 11 lipca 2009

"Kultura" Szczecina?

Tony Jazzu, "Robimy Dym":


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.

piątek, 10 lipca 2009

Prey

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.

sobota, 4 lipca 2009

... i po sesji

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ć.

wtorek, 23 czerwca 2009

Sesja, sesja

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

sobota, 6 czerwca 2009

Serwer cd

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:

wyslij(gdzie, co, jak_duze);
wyslij(gdzie, cokolwiek, 0);

Przy pobieraniu:

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.

Klient.c:
do { printf("Wybierz polecenie:\n1 - LIST\n2 - GET\n3 - CLOSE\n"); fflush(stdin); scanf("%d", &wybor); } while ((wybor < 1) || (wybor > 3)); write(gniazdo, &wybor, sizeof(int)); // wyslanie komunikatu switch (wybor) { case 1: // LIST - odbieram liste plikow while(1) { memset(bufor, '\0', BUF_SIZE); odczytano = pobierz(gniazdo, bufor); if (odczytano <= 0) break; write(1, bufor, odczytano); printf("\n"); } break; . . . }


Serwer.c:

while(1) { printf("Waiting for command\n"); memset(bufor, '\0', BUF_SIZE); read(one, &i, 4); // odczytanie komendy switch (i) { case 1: printf("Odebralem LIST\n"); list(one); break; . . . } . . . } int list(int gdzie) { struct dirent *pozycja; DIR *katalog; struct stat info; int prawa, i; katalog = opendir("."); if (katalog == NULL) return 1; while ((pozycja = readdir(katalog)) != NULL) { if (stat(pozycja->d_name, &info) == 0) { if (S_ISDIR(info.st_mode)) continue; wyslij(gdzie, pozycja->d_name, strlen(pozycja->d_name)); } } wyslij(gdzie, "Koniec transmisji", 0); return 0; }

czwartek, 4 czerwca 2009

Smutna refleksja

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ą".

czwartek, 28 maja 2009

Serwer

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ę...




... i przepisałem kawałek kodu z książki ;)

#include <sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<netdb.h>
#include
<stdio.h>
// printfy
#include <stdlib.h>
// exit()
#include <string.h>
//zawiera definicje memset()

#define SERVER_PORT 4095
#define BUF_SIZE 4096
#define QUEUE_SIZE 10

fatal(
char *x)
{
printf(
"%s", x);
exit(
1);
}

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;

switch (i)
{
case 0:
printf(
"Odebralem LIST\n");
break;
case 1:
printf(
"Odebralem GET\n");
break;
case 2:
printf(
"Odebralem CLOSE\n");
break;
default:
printf(
"Zly format polecenia\n");
break;
};
close(one);
// rozlaczenie
}

}


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!

środa, 27 maja 2009

Decyzje

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.

Podsumowując: najgorsze jest niezdecydowanie.

wtorek, 26 maja 2009

Hello World 2!!

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 :)

poniedziałek, 25 maja 2009

Hello world

Witamy na naszym blogu

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ę!

MarPan