Category Archives: games

Explorations in AI – solving RoboZZle

RoboZZle is a robot programming game. You can play it in your web browser (even without Silverlight), on Android, or iPhone/Pad/Pod. Go and try it, otherwise the rest of this entry won’t make much sense.

After a while of playing the game myself, I started getting interested in creating a program to find puzzle solutions. Having completed Intro to AI by Sebastian Thrun and Peter Norvig in 2011 and never using the techniques since, this seemed like a good opportunity to explore them further. As things go, none of these techniques appear directly applicable and a simple evolutionary search seems best.

Approach

I started by writing a solution runner, the main output of which is determining whether a given RoboZZle program solves a puzzle. Next were a robozzle.com client, utilizing the awesome Python requests library, and finally solver randomly generating programs to be tested by the runner. You can browse the source code of Zlej Rob at github.

Some facts about the solver:

  1. Start with an empty program.
  2. In each generation, each of the surviving programs will have ~100 randomly generated offsprings.
  3. A program is mutated by overriding (or removing) 1 to ~3 instructions of its parent.
  4. Programs are scored: positive points for reaching a square, extra points for collecting stars, and a negative point for each program instruction.
  5. If an offspring achieved higher score than its parent, it’s added to the current program population.
  6. Program population is kept to ~100 programs with highest score.

I decided not to cross-breed programs at all, as it doesn’t feel like it would be helpful.

Surprisingly, keeping a set of all evaluated programs doesn’t eat all the memory (and prevents recalculating the same thing over and over, speeding up execution by an order of magnitude). Yay for sets of tuples!

Results

Zlej Rob has solved over a 1000 puzzles in a couple of weeks of running on my $5/mo DigitalOcean (that’s a referral link – sign up and I’ll get rich) droplet alongside this blog and a couple other things.

Zlej Rob’s good at solving one-way street puzzles with one function, bad at anything involving multiple functions, mediocre at multiple-possibilities puzzles, and passable at random walks.

Zlej Rob discovered the shortest solution for Twins 2 (which I improved by removing a redundant function call). I think that’s pretty impressive. The solution includes a lot of recursive calls, and the replay takes ages – the robot loops and loops, seemingly never getting very far.

Ideas for improvement

  1. Visualisation. Would help identifying why certain things work and others don’t. I’ve almost started writing an Angular app to do that.
  2. Smarter mutations. Mutations should include abstracting random instruction subchains into other functions (this could be very useful for multifunction problems where Zlej Rob usually fails terribly because it can’t connect the dots). It might also be better to insert instructions instead of replacing them.
  3. Program diversity (“similarity penalty”). Surviving population for each generation is around 100 programs (toyed with higher values with no positive results – if anything, having 1000 programs is terribly slow), and they can all easily end up being very similar, getting stuck in local minima.
  4. Higher score programs should have more offsprings. Could speed up certain puzzles but perhaps make less obvious solutions unatainable. Would need to ensure program diversity first.
  5. Hints. For puzzles with an “obvious” order in which squares must be visited (such as binary counting or limit your stack), mandate this order. Currently, Zlej Rob finds random solutions that sweep vast majority of the board in a haphazard manner. Forcing the order in which squares must be visited would be extremely helpful, but likely requires human participation. Perhaps that’d be cheating?

Where do we go from here?

Zlej Rob’s results have surpassed my expectations, especially considering I haven’t spent that much time on it. Getting Zlej Rob into top 10 of RoboZZle players seems possible but would likely require an order of magnitude more effort than I spent so far. Not sure if worth it?

LSG 2010

Intro

I’ve happened to be the organizer of LSG 2010. While I had often been helping to organize various types of events, I’d used to be just a grunt dragging the heavy boards around. LSG 2010 was my first time doing high level organization. Perhaps it’s time to reflect on it a little.

Before LSG

First, I fought hard for getting access to the lsg.go.art.pl domain without success (big no thanks to PSG for that). That greatly hindered my initiative to organize LSG. Actually, I almost gave up. What can you do when you don’t even have the domain that has been used for many years and everyone knows about it? They just redirected lsg.go.art.pl to some PSG site, which didn’t even bother to link LSG 2010 site.

I decided not to give up when Jacek, the owner and manager of Alaska, contacted me and proposed that we could organize it together. He was taking care of accommodation, food, money and non-go side events. I was taking care of everything go-related.

I thought many people would never find out without access to the official site, but I underestimated two factors: word of mouth and Benerit. The first doesn’t need much explanation. The second one – Benerit – was responsible for even more. He not only answered questions from people about why there’s no LSG site and redirected them to the new one, but also sent an email to everyone who has ever attended LSG. Combined, this led to almost everyone knowing, though some people found out too late.

Jacek handled registration. Artur would be taking care of the “other board games” part of LSG. Myszcz promised to help with tournament organizing in return for free accommodation and food. Kamyk helped organize the playing material. Two weeks before the start, Hajin wrote she’d come as a teacher. I got lucky.

LSG itself

I came to Alaska on Saturday, two days before the start. Kamyk wasn’t too sure how much material was coming from there, but in the end it ended up really well (we weren’t missing anything). It turned out that Myszcz wasn’t all that experienced with tournament organizing, which led to Kamyszyn joining our organizing team. I couldn’t be happier about that – having Kamyszyn organize the tournaments meant that I wouldn’t have to worry at all.

As for teaching, aside from miss Hajin [3p], who was the main teacher, we got plenty of volunteers. Among them were Jun Tarumi [5d] with unforgettable lecture about fully cut keimas, Leszek Sołdan [5d] the Polish champion, and myszcz [1d] the Chinese opening expert. I only had one lecture, and as fisz was ready to help me, we played an “open” game – playing on the magnetic board and immediately explaining what we were thinking about. I think it was quite a success.

I scheduled 4 rounds of simultaneous games, which is quite a lot considering the whole event lasted practically only 11 days. I think that was a good decision, as everyone wanted to play against Hajin. The first simul was Hajin, Jun, fisz and me playing together against everyone else. It was a lot of fun (and we won most our games!). The other three rounds of simuls were individual, with each of us getting 6-8 opponents. I found out I got very weak in simultaneous games.

Tournaments were a bit painful in the beginning, but we managed to improve the process quite a lot – instead of running to the shop whenever anything needed to be printed, we simply used a projector to display the pairings and other information. I say simply, but it took 6 hours of hard work to get everything needed for the projector to be set up the way I needed. After that, Kamyszyn and Myszcz were handling tournaments themselves – I didn’t even have to be there. There was no one shouting “RUNDA” but nevertheless, most people got to play their games. No one was forced to play in the tournaments – participation was completely voluntary.

After the initial confusion, which was really tiring for me personally, my workload suddenly became much lighter. Aside from creating the daily schedule and making sure that our whole organizing team was on the same page, I didn’t have much concrete work to do. Except for solving emergencies, answering complaints, and responding to the same question 100 times a day (I swear it was the same 5 people asking all the questions, repeatedly).

I didn’t micro-manage and did let people help me, which worked out pretty well (because the people helping were awesome). Aside from volunteer teachers mentioned above, we had even volunteer organizers. Ela organized shooting tournament and drew the board for LSG 2010 signatures. Fisz organized volleyball and ping-pong tournaments. Kotasia made the torus tourney. I’m sure there’s many events I forgot. :)

Aftermath

There were no major disasters. Worst thing that’s happened is that I left two boards with two ING clocks (cough, good riddance, cough) outside overnight. They were pretty much gone after it had been raining throughout the whole night.
Beers and other small stuff were getting lost, but we never found out who did it. People have started locking down their houses.

All the people who brought playing material left after one week. Jacek, Kamyk and volunteers are making sure the material doesn’t get lost after LSG. Some of it might stay at Alaska.

Thanks

I was told that I should thank PSG. Organizing Polish summer go school is Polish Go Association’s job. That PSG failed to do so and a Czech guy living in the Netherlands had to help is surprising. Well, I’d like PSG to thank me first for doing their job. Whatever. Thanks to PSG for paying for Hajin’s stay and for most generously allowing their playing material to travel to Przystanek Alaska.

Big thanks goes to Jacek, Mariola, and Alaska team for organizing accommodation and meals, to Hajin for coming (and to Korean Baduk Association for paying her flight) and teaching, to Joon, Leszek, myszcz and fisz for helping with teaching; to kamyszyn, myszcz, Artur, Ela and kotasia for tournaments; to Janusz Kraszek for a box of prizes, to Kamyk and other people for making sure we have the playing material and to everyone else who helped make LSG a success!

Summary?

It’s easy to organize something when you have the right people to help you.
I think everyone had fun at LSG, that’s what matters the most in the end.

Bonus: Photos!

You made it! Either you’ve read through (doubtful) or you scrolled down here or you got the magical link… anyway, here goes!
I’m not quite sure if there’s a public list of all photo galleries from LSG 2010, so I’ll create one here:

As for my gallery, it’s nothing amazing, but it’s still pretty decent by my standards. The pics I like the most are: 1, 5, 10, 12, 32, 33, 35, 58, 61, and 64.

If you know about any gallery missing, please do leave a comment!

Double elimination tournaments

Let me start by saying that I really like the concept of a double elimination tournament. So I might be biased in my analysis.

Second, this post deals specifically with potential use of double elimination tournaments in settings of EGC/LSG side event.

What is wrong with the current approach

Current approach has two separate parts — qualification and finals. Qualification consists of several groups playing round robin system (8 groups of 6 people). First two of each group get to the finals, which is a simple single elimination (16 players in our study case). The total number of rounds is 5 + 4.

There are several related problems which stem from this concept. First, not all games are important. Some people leave halfway during the eliminations or just decide to resign the remaining games, as they have no chance of advancing to the finals anymore. This can influence who advances to the finals and has a negative impact on the tournament atmosphere. Second, the final only determines the winner reliably. Plus it just sucks that by blundering once, you get eliminated.

Why double elimination

Double elimination eliminates the unnecessary games. Every game matters. If someone decides not to participate anymore, his opponent gets a free win, but it doesn’t harm anyone but the one who quit.

You are free to lose any single game and can still win the tournament.

Double elimination is also much more accurate in determining the second to fourth places, which are available without any extra playoffs, with single playoff necessary to determine fifth and sixth place.

So where’s the catch?

Perhaps the biggest disadvantage is that double elimination of (up to) 64 players takes 12 rounds. That is considerably more than 9, and so the necessary extra time needs to be reserved. The reward is elimination of redundant games and much fairer results.

Another disadvantage might be that quarter of the participants only get to play two games. On the other hand, they can go to the beach and have fun instead of having to play.

Conclusion

Double elimination is particularly suitable for faster tournaments, where you can finish a round in under half an hour (and the whole 64-player tournament under 6 hours). The slightly asynchronous nature of double elimination allows for certain brackets to develop faster. On the other hand, there can appear bottlenecks when someone doesn’t show up. This can be taken care of by giving a default win to bottlenecker’s opponent, hence speeding up the tournament even more.

I would like to try double elimination for 9×9, 13×13, and blitz tournaments at LSG 2010. I’m all ears for your opinions on this idea.

By the way, have you already registered for LSG 2010?

How I won the 23rd TwixT championship

Who is this post for? Who is going to read it? Who is going to enjoy it? Anyways…

First, a bit of history…

I learned to play TwixT in 2004. You can have a look at my rating graph. As you can see, after the initial jump, my progress was slow — TwixT never was the main thing in my life.

There are three types of tournaments on littlegolem: rated tournaments, monthly cups, and championship league. The league is by far the most prestigious. You can read more about littlegolem tournaments.

My first championship was third division of the third league — twixt.ch.4.3.3, the games look a little funny now. In the next championship I won 5.2.2 with one loss and proceeded to the first league. I finished fifth in 6.1.1, scoring 4 wins out of 8 games.

I had similar results in 7th and 8th championships, in 9.1.1 I even finished fourth. 10.1.1 was the first appearance of the amazing polish brothers, who finished second and third, but it was a small disaster for me — I only won two games and got demoted to second league. After that I continued jumping up and down between first and second league: 10.1.1 down, 11.2.2 up, 12.1.1 down (though I won against Klaus in a very short game), 13.2.1 up, 14.1.1 down, 15.2.2 up.

I got lucky I didn’t get demoted in 16.1.1 … 17.1.1 and 18.1.1 fifth places again. In 18th I had a very interesting game against Axel. I had a bad start, but managed to exploit his weaknesses to create a draw — but I blundered at 44 and let him connect with 45. In 19.1.1 I had my usual fifth place, but 20.1.1 saw me underperform and fall to 21.2.1. As a warm up, I finished fourth in 22.1.1.

History over, back to the present

The start of 23.1.1 looked like I’d finish in my usual fifth place. I lost against David pretty quickly, and I had a surprisingly easy game against Steven. Meanwhile, I was losing three other games — against spd_iv, Klaus and crclum. Against Klaus, I had a bad game from the start, but Klaus blundered with 39.t19 (s20 or u19 would have done the trick), giving me an undeserved victory.

My game against spd_iv wasn’t that bad in the beginning, but then something went wrong, though I’m not sure what. I think spd_iv could have just played 21.h7 for an easier win. But actually, his variation would have led to a win too, if it wasn’t for his unnecessary 25.d7 which I responded with the best TwixT move I’ve ever played. I think that made me deserve the win.

I have no idea what happened in my game against crclum. I was losing from the very beginning, and it was just getting worse all the time, but I still have no idea why. In the end, he just resigned in a won position (23.q7 24.r5 25.t5 26.v5 27.r4 28.t6 29.n6 leads to a win as does 23.q7 24.r5 25.v5 26.t5 27.t4 as does 23.r6 24.q4 25.p7 (spd_iv pointed out the last variation)). So, I was extremely lucky.

On early resigning

As for crclum’s resignation, I didn’t have the guts to ask him about it or point out that he could’ve won. While I admire early resigning and often myself try to resign lost games as soon as possible (it’s good manners and it shows confidence in one’s judgement), it’s better not to overdo it and resign won games!

King’s Baduk Center

Lately I’ve been spending my time at King’s Baduk Center. I study go (it is called baduk in Korean).

When I manage, I get up at 6:30 and go running (this is becoming increasingly difficult with temperatures getting lower and lower). Then I go to my computer, hang around on KGS, chat with Europeans who are staying up late, postprocess my pictures, and generally have fun.

At 8:00 we have breakfast. It usually includes toasts, meat, eggs and jam, which is pretty good. Recently we had a week in which we only got rice for breakfast. Half of Westerners just couldn’t manage and decided to skip breakfast alltogether. After breakfast we have a little more free time and at 9:00 we start studying.

Morning is devoted to solving problems. I’ve taken a few problems from our collections and put them here for your enjoyment:

You can click those 1’s to see the problems. No solutions are provided because life is tough (we also have no solutions, but our teachers sometimes look at our books and draw stars next to problems with wrong solution, needless to say, our books are full of stars).

Lately we have tests at 10. It starts with a joseki test (we learn one chapter from “21st Century New Openings” every day) after which there’s “speed test”, mostly not too hard tsumego in large quantities. Like 72 problems in half an hour. When you mess up badly, you have to run. Also, after few days/weeks, we get the same speed test again, which is pretty evil, as it shows how little we learn.

At noon there’s lunch (rice, why are you asking?), and at 1pm we start our league games. I’ve uploaded a few league games that I’ve recorded. Please note that these were played with the time limits of 30 minutes main time plus 3 times 30 seconds byoyomi (which is pretty tough, in my opinion).

Right after I came to KBC, I lost the biggest group I’ve ever lost in what had been a comfortable game until move 87 in which I forgot to protect my corner. One of my next games against Mateusz was a rather interesting fight of influence against territory, but instead of an easy kill (move 110 push down from two stones), I let Mati live and died myself. Then a funny game against Tunga, which I won by an accident.

Here’s a game against Pierre that we played right after he came to KBC:

(you can use arrow keys on your keyboard to move around the game)

I had a bad start, which changed to amazing game after his 32, which gave me plenty of points in return for nothing. The game proceeded well until I got to byoyomi (move 83), where it quickly went downhill as I lost my cutting stones, but Pierre unexpectedly decided to die with his huge corner, which suddenly ended the game.

About a week later I played against Him, and after his overplay at move 56, I managed to keep an edge in the fight and ultimately killed his group. In a game against Ben I forgot to create territory but got a lucky win after he overplayed and died. The I gotbeaten by Seolki in a 3-handicap.

I had a promising game against Him after he forgot to secure his corner, but I died because of utter lack of global insight at one point (move 83, also at 63 we both missed a simple geta :-|). You can see the game here:

You can also see Seolki’s one man show — I started a fight which was bad in the first place and then played it wrong. Tungalag Tunga is direct descendant of Genghis Khan and so she tries to kill everything (but fails). Oooops, Pierre forgot to connect his stones (but he would have lost anyway).

Next is a typical Mateusz game, which went very good for me until I started a completely unreasonable fight when I didn’t need it. Luckily, Mateusz blundered few times and let me win. Several failed attacks cost me the next game against Him. Some of the higher handicaps can also get pretty rough (though I usually win those).

I had a very interesting game against Pierre today:

The start was better for him, then he ataried 68 without hesitation (“my teacher told me not to think about that”), and we made an interesting exchange. In my opinion, it would have been about even had he killed the corner. I made a bad trade while escaping with my group (move 97) but more than made up for it when I surprised Pierre with easy life of my supposedly dead corner.

The last game is perhaps more interesting than any of the ones before, as it contains commentary by KBC teacher, Kim sabomnim.

(it might be more comfortable to view the game with fullsize interface on eidogo.com)

If you look at the commentary carefully, you will be rewarded. There is one standard situation which happens very often and is played wrong by any European between 5kyu and 7dan (players worse than 5kyu don’t know the trick, and those better than 7dan know that the trick in fact isn’t that good).

After the games and commentary there’s dinner (yay, rice!), and after that a lecture with Seolki or free time, which we invariably spend at the computers (except when we go drinking).

I’m being kicked out of here so I don’t even have the time to read it after myself. I hope at least short fragments make sense. If not, just enjoy the tesuji problems and games (although those don’t make sense either :))!

PS: It is pure coincidence that of the four games displayed here, two are against Pierre and I won both, and the other two are against Him and I lost both. In fact, I lose to Pierre quite often, and I certainly beat Him more often than never. 8-)

PPS: Brought to you by EidoGo. EidoGo rocks. Takes a minute to set up and works like a charm.

Korea, here I come

My blog is dead. Long live my blog!

My plans have changed. I am going to Korea for three months to study go. Then I’m going back to Amsterdam, almost moneyless, to begin the new life.

You can have a look at amazing amounts of new photos.

The EGC was mostly eneventful. After a promising first week, second week was a small disaster.

I am in Amsterdam now. I love Amsterdam.

Tomorrow, I’m flying to Korea. I was urged (by several people!) to put some info from Korea here — I will try not to disappoint you.

Good night.

Go challenge

When asked by someone about my chance of beating you in go, you said it’s “basically zero”. And as if that wasn’t insulting enough, when asked about the exact number, you said “probably 1 in 40” (for the curious reader — no, this is not Lee Changho we’re talking about, he’s not even a professional).

I’m not sure whether it was before or after, but the same person who asked you also asked me the same question, and I said 1 in 5. After rethinking it, I admit it might have been a bit on the optimistic side (not nearly as much as you though), but I’m not going to change it for following calculations.

Now that we have some numbers, we can find a fair middle value… x/5 = 40/x gives us x=14.142135624, so each of us is getting 2.828427125 times better deal than they wanted. And because I like you, I’ll make it 14. Sounds fair, doesn’t it?

You choose the time settings (I’m open to various possibilities, thought I probably wouldn’t like any of the extremes).
You choose the size of bets (when you win, you get 1, when I win, I get 14 — that’s fixed). Again, I’m open to various proposals, but it shouldn’t be ridiculously low (at least 2€ per unit) and it shouldn’t be ridiculously high (my budget for this experiment shouldn’t exceed 2k€).
I’d like to play at least a dozen games (possibly many more, basically as many as you want, as long as I’m within my budget :))

Also, I can assure you that since then, I haven’t studied go for more than 2 hours a week and I do not plan on increasing that.

There are several ways out for you (sorted by lameness):

  • pretending you haven’t read this post (lameness factor 100%)
  • saying you were joking (come on, there were people around and everyone saw you were being serious, lameness 95%)
  • trying to bargain a better course (look, I’m not a businessman and I’m not going to bargain, if you win just one third of what you claim you can win, you’ll be fine; lameness 90%)
  • coming up with an excuse (lameness ranging from 80% to 110% depending on the excuse)
    • not enough money (first, you are going to win big, so this is not an issue, second, if by some chance you lost, I can wait and you pay with inflation corrected interest)
    • not enough time (come on, as we all know, you are too smart to be able to get a job, so you have plenty of free time)
    • any other lame excuse
  • admitting that you were wrong AND that you are an arrogant asshole ;) (lameness factor 50%)
  • accepting the challenge (lameness factor 0%)

With love, always yours,
tasuki

PS: Feel free to respond here.

KGS bureaucracy

I have to deal with unreasonable KGS users all day long. They argue about totally insane things ad infinitum. I try to be patient and understanding, as far as it’s possible. I am even trying to be nice to people who complain about escapers.

I got used to KGS users being unreasonable, but I at least expected a bit reasonable behaviour from admins.

tasuki: if I say pretty please, will you move “Photography” room to social? (yes, I know I own way too many rooms, but there’s no photography-related room on KGS and I think it’s a pity)
anonymousadmin: ok, what other accounts do you have?
anonymousadmin: … gotta put you through the hoops
anonymousadmin: yikes… tasuki owns several rooms!
anonymousadmin: how did you get allowed so many??

Haha, good one (you know, admins like to tease each other a little bit). After some more discussion, I check the room and it’s still in “New rooms”. Well, turns out this wasn’t a joke after all.

To explain what’s going on: there are various arbitrary rules on KGS. My theory about these rules is that whoever invented them thought “our admins are pretty dumb so I have to create very concrete rules for the admins to be able to follow them and not to have to apply their common sense”. Unfortunately, the inventor probably wasn’t much mistaken.

One such rule is that for a room to be moved from “New” category to any other, it must have a description and the owner must not own any other rooms. Nice rule. Except that you can circumvent it by finding someone who has no room yet to create this one for you. Or you can simply stop being owner of your other rooms and only own this one.

In my humble opinion, these rules are being misused. For example, this particular rule was obviously designed to prevent certain individuals from creating many meaningless rooms. It was not created to prevent someone from creating a perfectly valid and useful room about something many people are actually interested in. But “we have to follow the rules”. Oh btw, the admin in question also owns several rooms. So sue me.

PS: Take this as an invitation to join the “Photography” room, under Social. :-)

LSG 2008

“What took you so long?”

Yes, I’ve returned from LSG a week ago. But I spent all my time either at work or creating the photogallery (I made over 800 pictures but my memory card got full so I had to delete the bad ones, I returned with over 650 pictures and the gallery is 187, so — as you can see — it was a lot of work).

LSG was great (you can see mroe photogalleries), and I really regret having to wait almost 350 days for the next one again. Last year when I came home from LSG I just sat there for several days doing nothing and waiting for the next LSG. Luckily, this year work takes care of that, it’s really good to have something concrete to do.

Sorry for a boring post, hopefully it was at least short enough. :-) (and hey — it included links to photos… by the way, my favourite pictures from my own gallery are 4, 32, 94, 100, 109, 149, 152, 176, 178 and 181)

EPGC Kraków 2008

As I was planning my journey to Krakow and there was only one reasonable train to take, I worked overtime during the week so that I could leave work earlier on Friday. Well, the train was delayed, so I wouldn’t be able to catch the following train, which meant there was basically no way to get to Krakow. After giving up for a few hours, I realised that I really really wanted to go there and decided to take a night train. So I left home at 9pm again and headed for the train. The journey was quite ok except two things: 1) I had to change trains at 3am and 2) my camera got stolen.

Krakow is a beautiful city and I had several hours to walk through the center (kind of sucks I didn’t have the camera, as at 6:30am the lighting was just perfect). I especially enjoyed the Wawel castle, which provides a nice view of the city and is in itself rather spectacular.

The tournament (European Pair Go Championship) was well organized, and there were free cookies and water (even for visitors such as myself!). By the way, pair go tournaments have an interesting feature that half of the participants are girls. ^^

I spent the day relaxing, playing and taking photos (a friend lent me her camera because she was playing and couldn’t take photos anyway). We spent the evening at juggler’s place, which was a lot of fun… juggler has table football at home, so we spent a lot of time playing that (and the rest of the people played go, of course).

Once again I got very lucky by going somewhere where I really wanted to go after a big obstacle appeared, and once again I’m really glad it went this way. I had a great time, I met lots of people whom I haven’t seen for far too long (spirit (been a while), kotasia (cute new hair), hitech (I finally started reading GEB), gertzu (thanks!), agusia (babusia~~), elusia, michal, iskierka, juggler (thx for saturday evening), vertigo (yeah, ruby, we know), sheena, yapi, shaa (hope the leg is getting better), fajnymis, kamyszyn (ban ’em all), comboy, sosna (no more photos, I promise), nil, cichacz (dupa!), kabu (xD), grabol and everyone else whose name I forgot to write in here) and I met some other people in person for the very first time (Lothus, and… um, actually, isn’t Lothus enough? ;-))

Edit:
Some photo galleries:
My photo gallery
Official photo page, with links to other galleries