piątek, 8 grudnia 2006

Mała przerwa

Trzeba zdać, no i święta idą ;)
Sporo roboty mam teraz na głowie i jakoś nie mam czasu siedzieć na Kurniku. Pewnie w święta coś się projektem zainteresuję, o ile nie dorwę jakiejś siekaninki typu Space Hack, która była dołączona w zeszłym roku do CD-Action ;) Aktualnie i na najbliższe dwa tygodnie, głównym obiektem mojego zainteresowania będą chore i pokręcone przedmioty pokroju chemii, geografii, tudzież języka polskiego.

wtorek, 5 grudnia 2006

Niezabezpieczony Kurnik

Masowe zakładanie kont
Otóż jak pewnie sporo osób zauważyło, przy zakładaniu nowego konta wystarczy podać proponowany login, wpisać hasło, potwierdzić je, a następnie opcjonalnie wypełnić dodatkowe informacje. Jednak czegoś tutaj brakuje.. Chodzi mi o takie małe pole tekstowe, do którego wpisuje się tekst z obrazka. Stało się to bardzo popularne na wielu serwisach i to nie bez przyczyny. Napisałem wczoraj dosłownie ciągu 10 minut programik, który jest w stanie założyć 15 tysięcy kont w ciągu 12 godzin. Przy takim tempie zakładania nowych kont, jeśli by się ktoś uparł może zaspamować Kurnik. Jak jest to przedstawione na wynikach z 15 czerwca 2006 roku, Kurnik ma 2 miliony użytkowników. Łatwo sobie policzyć, że wystarczą dwa miesiące i jeden użytkownik jest w stanie podwoić liczbę zarejestrowanych kont. To daje do myślenia ;) Dlatego ciekaw jestem jak szybko administracja www.kurnik.pl wprowadzi zabezpieczenie przed botami zakładającymi masowo konta.

poniedziałek, 4 grudnia 2006

Mały zonk ;)

Blokada kont
I się stało :D Po bardzo długim okresie użytkowania konta ti4h5mh zostałem zablokowany. Nie dziwię się. Po tym co ostatnio na nim wyczyniałem to przewinień starczyłoby na zbanowanie kilku loginów :D Oprócz tego zawieszono mi konto nc3 oraz chyba już sławne szachotron. Ale ja się tak szybko nie poddam. Tak jak mówiłem, mam kilka kont i nie miałem na myśli tylko tych trzech wymienionych powyżej. Ciekawe jak szybko władza kurnikowa się zorientuje, które to są ]:->
Cóż, ja jestem cierpliwy i będę zakładał kolejne konta dla Szachotrona. Póki mi się Kurnik nie znudzi, nie dam im spokoju. I to nie tylko w grze w szachy...
Czuję się wyróżniony ze względu na komentarz odnoszący się do blokady konta. "Zastanów się człowieku, co robisz." Jednocześnie chciałbym mieć możliwość odpowiedzenia. Chciałem powiedzieć, że ja bardzo dobrze wiem co robie. Pisanie Szachotrona sprawia mi bardzo dużą przyjemność. Nie uznaję się za bezmózgowca, który próbuje wygrywać w szachy tak jak to zwykli "kompiarze" robią. Umiem grać w szachy. Może nie aż tak dobrze jak widać to po moich statystykach na kontach, ale wygrywam z niejednym przeciwnikiem na Kurniku. Jestem programistą i wykorzystuje swoje umiejętności do własnych celów. Każdy programista grający swoim programem może być też "kompiarzem", ale zapewniam, że praktycznie żaden "kompiarz" nie jest w stanie być programistą, a zwłaszcza takim, który umie napisać program pokroju Szachotrona.

niedziela, 3 grudnia 2006

Oficjalny turniej kurnikowy

Jest nieźle, ale mogło być lepiej
Zająłem trzecie miejsce. W sumie jestem zadowolony. Zawiódł mnie jednak silnik szachowy Zappa. Trafiłem na przeciwnika _admax. Potraktowałem go jak zwykłego śmiertelnika i używałem jednosekundowych ruchów. Partia była wyrównana do samego końca, gdy nagle straciłem skoczka, a oponent promował piona do hetmana. To był natychmiastowy zwrot akcji, który zakończył się moją sromotną klęską. Zdziwiłem się bardzo takim obrotem wydarzeń, ale nie zmieniłem silnika dla potrzeb następnej partii. Pełny nadziei przystąpiłem do gry z adamxxxxl. I tutaj również silnik mnie zawiódł. Wprawdzie nie przegrałem, ale silnik po prostu się poddał :/ Wykonał trzy ruchy takie jak przeciwnik i nastąpił remis. Po tym zdarzeniu się zdenerwowałem i zrezygnowałem z Zappa'y na rzecz sprawdzonej w bojach TogaII. Wygrałem dwie następne partie, po czym trzecia rozgrywała się po mojej myśli, aż popełniłem błąd :) Dokładnie to błąd był po stronie Szachotrona, który jeszcze nie rozpoznaje sytuacji, w której przeciwnik promuje piona, a taka sytuacja właśnie miała miejsce w tej partii. Od tego ruchu polegałem na sobie i spotkanie zakończyło się patem. Ostatnie dwa mecze wygrałem i ogólny bilans wyniósł dziewięć wygranych, jedna porażka oraz dwa remisy.

Podsumowanie
Turniej pokazał, że działający na standardowych ustawieniach silnik Zappa jest kiepski. Natomiast TogaII jak zwykle pokazała swoją klasę i uchroniła mnie przed spadnięciem z podium ;) Dobrze się stało, że nie wygrałem dziewiątej partii, bo przypomniałem sobie o wspomnianej wcześniej wadzie Szachotrona. Najprawdopodobniej jak będę robił jakieś większe poprawki zmodyfikuję i to. Jednak póki co rzadko kiedy zdarza się żeby TogaII pozwoliła przeciwnikowi zdobyć hetmana, dlatego chwilowo pozostawiam to bez zmian.

sobota, 2 grudnia 2006

Zmiany

Kolejne bajerki

Dodałem możliwość definiowania własnych skrótów klawiszowych w pliku konfiguracyjnym. Natomiast sam Szachotron obsługuje teraz wszystkie silniki szachowe zgodne z UCI. Tutaj można znaleźć przykładową listę silników. Dzięki temu ustandaryzowaniu programu nie muszę już tak jak dotychczas robiłem, korzystać z odpowiednio zmodyfikowanej wersji TogaII. Jednak mimo możliwości korzystania z tak dużej ilości oprogramowania, pozostanę przy tym, którego aktualnie używam. Głównym argumentem, który mnie do tego skłania jest fakt, że TogaII ma ELO ~2800 i jeszcze ani razu mi się nie wysypała.
W testach pomiędzy silnikami wyszło mi, że Zappa jest silniejsza od TogaII. Może użyję tego programu na dzisiejszym kurnikowym turnieju. Mam nadzieję, że nie sprawi mi jakichś problemów. Chociaż może bardziej roztropne byłoby użycie jednak tego silnika, którym rozegrałem juz blisko 500 partii ;)
Dodałem również, jak mi się wydaje, bard
o ważną funkcję. Mianowicie blokadę możliwości wykonania ruchu podczas tury przeciwnika ;) Jest to o tyle ważne, że jeśli zostałby wykonany ruch podczas nie swojej tury, Szachotron zinterpretowałby ostatnie wykonane przez siebie posunięcie jako to autorstwa oponenta. Skutek byłby taki, że silnik szachowy by zgłupiał i nie możnaby było przewidzieć późniejszego jego zachowania.

Pomysły
Tak sobie myślałem nad jakimiś dodatkowymi bajerkami i wpadłem na pomysł zrobienia skrótu klawiszowego, po naciśnięciu którego Szachotron wysyłałby w oknie rozmowy, na przykład "cześć", albo "dzięki za grę ;)", tudzież "zagrajmy rewanż". Takie małe udogodnienie, żeby nie trzeba było pisać w kółko ciągle tych samych formułek.
Oprócz tego małego, nazwijmy to gadżetu, myślałem nad wprowadzeniem pomysłu, który był zrealizowany w poprzedniej wersji Szachotrona. Mówię tutaj o niewielkim panelu sterowania umiejscowionym nie w oknie mojego programu, a w oknie ze stołem gry. Dokladnie chodzi mi o miejsce zaznaczone za screenie:
Free Image Hosting at www.ImageShack.us

Analizując budowę okna ze stołem gry dowiedziałem się sporo o działaniu tej aplikacji. Między innymi jakie komunikaty okienkowe są wysyłane przy odpowiednich zdarzeniach i temu podobne rzeczy. W miejscu oznaczonym czerwonym prostokątem, ku mojemu zdziwieniu znajduje się dodatkowe okno. Tyle, że jest niebieskie i ma styl popup, więc go nie widać. W bardzo łatwy sposób udało mi się je wykorzystać i stowrzyć kolejne okno-dziecko, w którym mogę umieśić co tylko mi się podoba. Od przycisków przez pola richedit do kontrolek ActiveX i możliwość wyświetlania grafiki przy pomocy DirectX ;) Przy okazji okdkryłem, że jeśli da się odpowiedni styl temu nowemu oknu to zdejmując fokus z okna ze stołem nick nie bedzie się robić szary. Czyli teoretycznie kolejny bonus od Szachotrona: podczas partii można rozmawiać przez komunikator i wcale nie być posądzanym, że się gra programem ;)
Po dzisiejszym turnieju pomyślę nad wprowadzeniem tych udogodnień. Tymczasem biorę się dalej za robotę.

piątek, 1 grudnia 2006

Szachotron 3

Wersja alpha
Właśnie skończyłem pierwsze poważniejsze testy. Rozegrałem 48 partii, podczas których wykryłem kilka pomniejszych bugów. Nawet nie nazwałbym ich błędami, lecz niedopatrzeniami, a poprawienie ich było tylko zabiegiem kosmetycznym ;) Chciałem zamieścić jakiegoś screena samego programu, ale tak naprawdę to on jest niczym wiecej jak gołym oknem z konsolą i jednym przyciskiem. Dlatego postanowiłem, że pokaże screena z "akcji":

Free Image Hosting at www.ImageShack.us
Klasyczna wygrana ;) W takim tempie jak gra się Szachotronem, to ranking 1700 można osiągnąć w pół dnia. Sam mam jeszcze kilka kont na Kurniku, które nie mają już statusu "nowy" i nie są też "pomarańczowe" :P Używam ich i gram na nich Szachotronem, i jak dotąd nikt nie oskarżył mnie o granie programem. Dzieje się tak, gdyż Szachotronem można się ruszać tak jak się chce, czyli można wykonać ruch w ciągu ułamka sekundy, jak i również troszkę się "pozastanawiać", co daje genialne efekty. Umiejętne posługiwanie się moim programem gwarantuje, iż mimo, że tak naprawdę myśli za nas komputer, oponent po drugiej stronie nie zorientuje się, że gra z maszyną.

Jutro jest sobota. Na Kurniku oznacza to tyle, że o 20:15 odbędzie się oficjalny turniej: 11 partii po 3 minuty. Będzie to znakomity sprawdzian dla nowej wersji Szachotrona. Przygotowałem na tą okazję kilka specjalnych opcji. W sumie mam teraz taką gamę ruchów:
  1. Szukanie mata w 6 ruchach
  2. Szukanie mata w 3 ruchach
  3. 3 sekundy na ruch
  4. 1 sekunda na ruch
  5. Ruch natychmiastowy
Oprócz tego oczywiście mam w zanadrzu możliwość nieskończonego czasu myślenia nad ruchem. Mogę je przerwać, tak samo jak każdy inny ruch, przez polecenie "stop". Takie zaplecze ruchów zapewnia bardzo wygodną rozgrywkę. Dodam jeszcze jedną bardzo ciekawą opcję: możliwość wykonania "głupiego" ruchu, czyli takiego, który bedzie miał za zadanie imitować nierozwagę, błąd gracza.

Historia programu

Początki
Jakiś czas temu, nudząc się na którejś z lekcji polskiego, wpadłem na pomysł. Był nim program, który umożliwiałby granie w szachy na kurnik.pl. Niby nic wielkiego. Ot co, programik miał analizować to, co się dzieje na szachownicy i przekazywać informacje o położeniu bierek do programu szachowego, po czym czekać na jego odpowiedź i wykonać za gracza ruch.
Niewątpliwie zaświtanie tej myśli w mojej głowie było spowodowane tym, że w pierwszej klasie liceum grałem z kolegami w szachy. A to na przerwie się jakąś partyjkę strzeliło, a to na jakiejś wyjątkowo nudnej lekcji ktoś wyjął z plecaka szachownicę. Natomiast obowiążkowo na lekcjach wychowawczych organizowaliśmy coś na kształt turniejów. Pasja do tej gry przeniosła się częściowo na serwis internetowy www.kurnik.pl. Polubiłem to miejsce. Spędzało się tam bardzo przyjemnie wolny czas przy ulubionej, nie pochodzącej z komputerowego świata, grze.
Jak każdy, kto choć raz odiwedził Kurnik, wie, że wszystkim kontom przypisany jest ranking. Jest to taki drugi identyfikator człowieka zaraz po jego loginie. Ranking odzwierciedla umiejętności w danej grze. I tak, mając 1700 punktów rankingowych uchodzi się za kogoś, kto z szachami ma trochę do czynienia, a posiadając powyżej dwóch tysięcy, za wybitnego gracza. Oczywiście kto zdrowy na umyśle, dąży do uzyskania jak największej liczby koło swojego nicku. Tak też było ze mną.
Kurnik stwarza tą niepowtarzalną sposbność, która pozwala na to, co nie oszukujmy się, człowiek lubi robić: oszukiwać by osiągnąć korzyść dla siebie. Mówię tutaj oczywiście o wykorzystaniu podczas rozgrywania pratii kurnikowej programu szachowego ;) Nie jestem pierwszym, który na to wpadł. Napewno było wielu przede mną, a i po mnie też będzie pewnie jeszcze więcej osób. Jednak to, że interesuję się programowaniem spowodowało, że zamiast próbować oszukiwać w sposób jaki to robią tak zwani "kompiarze", chciałem wykorzystać swoje umiejętności. Zagadałem do kolegi - Mariusa - i przedstawiłem mu smój pomysł. Pomyśleliśmy trochę jakby można było wykonać taki program. W szczegóły techniczne nie będę się wdawał, bo i po co niepotrzebnie przynudzać, ale w skrócie powiem, że program miał działać prawie jak człowiek - mieliśmy mu zaprogramować oczy. Polegało to na sprawieniu, żeby program "widział" co się dzieje na kurnikowej szachownicy oraz tej drugiej, w jakimś programie szachowym.
Projekt został obgadany, ale wykonania w najbliższym czasie się nie doczekał. Jednak pewnego dnia przypomniałem sobie o nim.

Pierwsza wersja
Po dość dłuższym czasie, który upłynął od obgadania projektu z Mariusem, zaczałem pomysł wprowadzać w życie. Oczywiście odrazu pojawiły się pytania i problemy do rozwiązania mimo, że wcześniej myślałem, że będzie to tak banalne jak wynikało to z rozmów z Mariusem. Jednak dylemat polegał na tym, jak odczytywać szachownicę? Jakiego programu szachowego użyć? I wiele pomniejszych. Pytawszy co chwilę google o poradę, w ciągu kilku dni skodziłem pierwszą jako-tako działającą wersję. Zasada działania programu, wtedy jeszcze niemającego nazwy, była trywialna. Korzystałem wówczas z aplikacji szachowej Bringer. Szachotron 1 porównywał stan szachownicy w Bringerze z tą na Kurniku, próbkując odpowiednie piksele wyświetlane na ekranie. Jeśli zaszła jakaś zmiana, wykonywany był automatycznie ruch.
W zasadzie to nie można było tego release'a nazwać czymś w pełni działającym ;) Prawdę mówiąc skuteczność programu wynosiła 1:1 - tyle ile razy wygrywał, tylko samo razy się sypał :D

Druga wersja
Tak jakoś się bawiłem pierwszą kompletnie niedopracowaną wersją, która miała wiecej dziur niż jej samej było i doszedłem do wniosku, że tak nie może być. W końcu, aby coś dobrze działało, musi mieć solidne fundamenty. Z takim przyświecającym mi mottem, poszedłem po poradę. Jak zwykle dobra wyrocznia google udzieliła mi konkretnych odpowiedzi. Dowiedziałem się co to jest UCI [ Universal Chess Interface ], jaka jest specyfikacja protkołu UCI oraz tego, że w internecie są dzisiątki darmowych, ogólnodostępnych silników szachowych. Myslę sobie, nic tylko brać, używać i wygrywać na Kurniku ;)
No tak, ale co mi po samym silniku szachowym, który tak wogóle komunikuje się ze światem zewnętrznym przy pomocy stdin/stdout [ standardowe wejście/ wyjście, czyli konsola - dla niewiedzących co to jest ;) ]? Kolejne pytanie, kolejna odpowiedź google: piping. OK, postudiowałem troszkę dokumentacji, pobawiłem się jakimiś przykładowymi kodami i wziąłem się za właściwe pisanie.
Zajęło mi to kilka wieczorów. Efekt był porażający :) W porównaniu z poprzednią wersją, ta aktualna, która została opatrzona numerkiem 2, była niesamowita i niezawodna.
Zrezygnowałem z opcji autoplay, a poruszanie bierkami na kurniku było sterowane przez gracza: wciskało się odpowiedni skrót klawiszowy, na przykład alt+X, a Szachotron pobierał informacje o stanie szachownicy na Kurniku, przesyłał wykonany przez oponenta ruch do silnika szachowego i czekał na jego odpowiedź, po czym ruszał odpowiednią bierką. Rozegrałem w ten sposób kilkadziesiąt partii i było naprawdę fajnie ;) Oczywiście było tak do czasu wykrycia pewnego buga..
Dokładnie to zanim znalazłem gdzie tkwił bład, zdrowo się namęczyłem. Otóż normlanie sobie grając w pewnym momencie, kompletnie losowo, Szachotron źle interpretował informację o ruchu z silnika szachowego. Jak się pózniej okazało, winny tego był parser odpowiedzialny za filtrowanie outputa silnika.
Jako, że wersja 2 bazowała na starym kodzie poprzedniej wersji, była bardzo zawiła i była bardzo mało elastyczna. Przez ograniczenia jakie stawiała mi tamta struktura kodu, nie zdołałem poprawić buga w parserze. W sumie ten błąd nie występował aż tak często i praktycznie dało sie bezproblemowo grać. W związku z tym postanowiłem, że pozostawie projekt w takim stadium rozwoju jakim był.
Jednak pewnego dnia po jakiejś dluższej przerwie w graniu na kurnik.pl, gdy przeglądałem jakąś plytkę z backupami, natknąłem się na archiwum nazwane "szachotron 2". Nagle naszła mnie ochota, aby zreaktywować projekt. Takim sposobem zacząłem pisać Szachotron 3.