Thursday, April 23, 2009

Ok... let's go

The final beta test phase of the online chess playing site I developed just started and, thanx to some incredible work of word spreading, we've 100+ players that registered for this phase.
The site is www.area64.it and it has been implemented in Python (server side and tools) and haXe with flash 8 code generation for the interface.
It supports playing, analysis rooms, voice chat, 2d or 3d board, custom colors, personal infos with picture uploading and more...

So far the response has been quite good, bugs are not that many and who entered got a very good impression. Also all of the ones I've been talking to agree with me that playing with someone with a certified identity is WAY better than playing an anonymous nickname.
My hope is that the certified identity will help people behave more socially and also will allow me to ban for good who for example can't avoid insulting the opponent.

We'll see...

Sunday, March 01, 2009

Ugly hacks, nice hacks

I'm translating a small python module that supports some chess intelligence generation into C++ because the speed is becoming a problem (when interfacing a digital board I need to do some search to guess what is the move that has been played and this includes looking one or two moves ahead and one move behind - that is moves that could have been played instead of the last move played).
The translation went fine so far with an almost 1-1 lines of code ratio between the two languages (not a surprise, given the problem) but I got a couple of surprises...

The bug

To check if a position cannot be win by either player I had to check whether two remaining bishops on the board were covering the same squares or not (that is if they were both light-square bishops or both dark-squares bishops or if they were covering the whole board).
This is needed because if there are two opposite-square-colors bishops on the board then a checkmate is still possible.
The code looked like this

if bc == 2 and nc == 0:
bp = [i for i, x in enumerate(pz) if x == BISHOP]
if (bp[1] - bp[0]) % 2 == 0:
# Just two bishops both dark squares or both light squares
return "material"
nc and bc are the number of knights and bishops on the board (pawns, rooks and queens are already known to be absent at this point). The board is represented using an array of 120 elements (12x10 representation) but it would be the same using an 8x8 approach... the bug is that just using the index "i" to check odd-even property is not correct, and "i//10 + i" should have been used instead. This shined apparent to me just by reading the code... however this code passed the tests because the test cases were all having the bishops on ranks with an even distance.
Now that I'm writing this post I also realize that there's even another bug at an higher logical level... it doesn't matter how many bishops are there: if they're all covering the same squares the checkmate is trivially impossible. It's not a 100% genuine bug because if the function returns a non-empty string then the position is impossible to win, but the converse is not true and it would be quite hard to fulfill such a contract.

Morale ? If it works is just because you didn't look closely enough.

The hack

In the same code I couldn't resist changing the handling of en-passant from

if x1 == self.epsq:
if np == WHITE+PAWN:
# White en-passant capture
self.board[x1+10] = EMPTY
elif np == BLACK+PAWN:
# Black en-passant capture
self.board[x1-10] = EMPTY
if np == WHITE+PAWN and x1 - x0 == -20:
# White double push
self.epsq = x0 - 10
elif np == BLACK+PAWN and x1 - x0 == 20:
# Black double push
self.epsq = x0 + 10
else:
self.epsq = -1
to

if ((np & PIECE) == PAWN)
{
if (x1 == epsq)
// En-passant capture
board[x1 - (((x1-x0)>>4)*20+10)] = EMPTY;
if (abs(x1-x0) == 20)
// Double push
epsq = x0 + (x1-x0)/2;
else
epsq = -1;
}
The C++ version is much more compact, but in the first part relies on a "trick" that for sure would look quite obscure for who reads the code... what the hell is "(((x1-x0)>>4)*20+10)" ?
The trick is that I know that the move was legal, so if a pawn goes to the en-passant square it must have been an en-passant capture and so the delta (x1 - x0) was either -9, -11, +9 or +11 depending on the color of the player. Then "(x1 - x0)>>4" is just the -1 if delta is negative or 0 otherwise; with "*20+10" and "x1 -" gets to the square where the captured double-pushed pawn was sitting.
Why do I think this trick is nice ? That's a good question...

I'll add a comment as a partial excuse to the poor future reader (which will probably be myself) :-)

Sunday, February 22, 2009

Back to running

Thanks to a wonderful sunny day I was able to defeat my laziness to go out for a nice run. It was long I wasn't running outdoor and I've also been skipping quite a few times the treadmill downstairs where I was supposed to run half an hour at least three times a week (ok ... quite a bit more than a few times...).
So I've been a coward and took it easy by not running the usual one-hour path but stopping instead short of that to turn back toward home. Everything was fine except a bit of ankle pain on the left foot near the end of the run.

Surprisingly enough I met only three other runners and a guy on a bicycle... I would have expected to meet much more than that given the nice sunny Sunday (I think my record is meeting about 20 or so people down that path).

Thursday, February 19, 2009

Apparently sometimes nothing is better than something

Phew!

The turney is over and I'm getting back to my normal routine. On 13-14-15 February we organized the first International Chess Tournament of Vigevano, with 120 players from all over the world including 8 GMs.
The turney itself was ok, except for the usual delay at the first round everything went smoothly and as an arbiter I had to tell something just in a few occasions...

From a software point of view instead most worked ok, including a few patches I made in the few minutes I found. Unfortunately the first round - because of the delay - started when I wasn't ready yet so I had to start the DGT boards when the games were already started, so I decided to just show on the big screens the positions and not the moves; for the other rounds instead the play zone screens were showing both the positions, moves and clocks.
We also found one of the DGT clocks to be defective (it wasn't sensing the clock button that players are required to press at every move) so the 5th board was shown without players remaining time.

A the tournament I was also asked if what was visible on the screens could have been published also on the web. I wasn't expecting this and hacking it at the moment has been a bad decision for a few reasons
  • What was shown on the big screens was indeed an HTML page but I tested it only on FireFox and actually I even used a few images for figurine notation that were rescaled exactly so they could look right at the resolution/magnification I was using on the big screens. I didn't try it at all with any other browser or any other resolution.
    Of course it turns out that a self-refreshing HTML page is absolutely terrible on IE because of flashing and because it loses the scroll position (ok... IE - no matter if 5 6 or 7 - is a total crap as a browser for a jillion reasons, but still a lot of internet users for some strange reason stick to it, so anthing published on the internet - unfortunately - should be made to work also with that thing). Also someone using XP was still unable to see the small PNG i used for the figurine notation and was instead seeing just black squares (!).

  • I simply added an "os.system('pscp postion.html ....');" line to put the updated file on a web server, but I was directly replacing the file being served by apache. The file was rather "big" (35k) so the upload was not instantaneous and what happened is that who was observing the game from the internet could get an incomplete HTML file. An even bigger problem was that the if file was not even complete to the "http-equiv refresh" line then the partial - totally blank - file would stuck on the browser of the observer forever.
    I fixed this only the second day by uploading with pscp to another location and then calling a cgi script to move the file to the correct position.

  • The program I wrote was for showing the first 4 games in the playing area, not for publishing it on the internet, so a few "features" like figurines instead of letters were indeed "anti-features" for who was observing from a PC (with letters you could copy-n-paste in a chess program). Also the game shown was not complete for layout reasons and there was no provision for downloading the PGN of the game. Moreover it wasn't possible to go back and forth on the moves or to see just one board instead of all five of them.
All these things were nonsense for showing in the playing zone (in the room there was no reload problem ... the local file was correctly written and moved in place; and there's no mouse for who is looking at the screen so no interactive feature makes any sense at all) but made the experience for who was accessing that from the internet quite less than optimal.
What I realized only later after reading some comments was that it would have been better not showing anything at all on the internet...

So apparently sometimes nothing is better than something...

Now I'm working on a better flash-based interface for publishing the games online and hopefully I should be able to provide a better experience for viewers of the Bergamo tournament next month.

Sunday, February 08, 2009

Learning LISP

I'm halfway reading Practical Common Lisp and I'm now beginning to understand a few points about LISP that were not that clear. First of all what are those famous macros and why they're so powerful. I always had the gut feeling that C++ template machinery was not good, it is a different language with a lot of limitations and even doing things like loops or ifs is not impossible but very very hard; not only template debugging is difficult but even reports about syntax errors are so bad that they look like a joke.
LISP macros can do the same as C++ templates (and more), however the language is LISP itself (if, loops, opening files... you can do whatever you need to do "compile time").
I am experimenting with a macro "defentity" that given for example


(defentity simple-point point
(coords point))

(defentity circle line
(center point)
(radius float))


defines two classes, the classes "simple-point" and "circle". The center of a circle entity is a reference to a point entity and this generates a dipendence. When I change the coordinates of a point I want that all the geometry of dependent entities (for example circles that are referencing that point as center) to be invalidated.

I'm still working on it but I already got something working. The defined classes are regular CLOS classes with added "dirty" fields for invalidated geometry, cached results and accessors that do the required recursive "touching" of dependent entities on write operations. Changing referred entities, destruction and link removal is implemented (so when destroying a point all entities depending on it will be notified and given the possibility to remove the link instead of being also destroyed).

Making the same using templates with C++ would be IMO just impossible. Making the same with python would be easy (we did) but keeping much of the logic at runtime. Moving it at compile time with python would be possible but IMO a lot harder (and without much gain indeed).
With C++ a reasonable solution would be using a code generator (written e.g. in PERL) that generates the C++ code needed.

I'm trying the LISP way and so far looks promising...

Python dropped the clear distinction of compile-time and run-time as class and function definition are indeed executable statements; LISP moved further by dropping also the parse-time separation because thanks to macros even the parsing of the source is more or less an executable statement.

Amazing this thing is still working

I haven't touched this blog in three years but still this thing is apparently working ok. Quite long time ago i decided to give up with my internet presence because spare time is so scarce and I had to choose what to drop and what to keep. I decided for keeping piano playing, exercising, learning, chess playing and of course coding and a minimum quantity of the so-called "real life" as it's mandated by current society.

A lot of things changed in last three years and I really don't want to bother to list them all (who would care anyway ? :-) ).

Simply I'll try to get back at this blog because ... oh well ... just because.

Sunday, January 22, 2006

something new

I have been thinking for quite a while about where to invest some time studying new stuff (new for me, at least). The reason is that in my opinion a programmer cannot afford to stop learning new things, because our world is changing too quickly. Of course I'm not saying that one should run after every single buzzword, but keeping the habit of learning is IMO very important in general, and vital for a programmer.
I was just about to buy an iMac with dual intel core, for both experimenting programming for a true multiprocessor and for looking at OSX; I stopped mainly for a quite stupid reason... apparently there's no way to get the video output of my Windows XP into the iMac screen, so my choices were either to find space for the iMac in addition to what's already on my desk (impossible) or to work on XP just using VNC (that's no life). Oh... and 1700 euros were sort of a stopper too :-)
So I went for a cheaper solution... I'll invest time on linux, and I mean on linux as my only desktop system at home. I installed a Debian distribution and so far I'm quite happy with it; I got my NVidia card working with hw acceleration under X, a nice desktop (KDE), all peripherals working (including the video capture) and even win32 quasi-emulation (I compiled a win32 app I'm working on using bcc55/wine!). CVS/SVN and dvd playing, r/w access to my XP partition, firefox, thunderbird, VLC... everything is ok or almost ok. I had to pay basically nothing (just the work of freeing my very old 16gb HD with win98, and the risk of seeing what happens when XP boots from a secondary IDE HD). Now I've just to look for a replacement of the few applications I use (e.g. chess software, ms works). I'll need of course to use XP every now and then, and the solution is now changing the boot device in the bios.
One keyboard, one screen, two worlds.

Tuesday, January 10, 2006

i want email back

The situation is getting absurd. I had been reported about this problem at work a couple of times but there the email traffic is huge, and some mistake every now and then may be should be expected. But my email traffic is ridiculous, and yet last night I got once again two private email bounced because of antispam and for reasons that make no sense.
Why does the world allow to idiots like (just for example) hotmail sys admins to throw away legitimate mail ? Why are idiots like them destroying the usefulness of the email service and no one is doing anything to try to save it ?
This makes me think that to make real progress IT is going to need to abandon the barbarian state that currently it lives in, to enter a social state. A condition where if you do a mistake you pay.
If a plumber even *unintentionally* does a mess with your bath tub and you get your carpet wet you can sue him to get a refund; but if an idiot but self-declared IT expert destroys your email *intentionally* the only thing you can do is moving to another provider so *may be* you'll be able from there to get your email through.
Freedom is something different.

Sunday, January 01, 2006

new year, new color; but why ?

Here we go. I decided to start 2006 with a brand new color for my homepage. I also added a specific section with my piano recordings (including a fake one!).

I always had a problem in finishing the musical pieces I start to study; for long I thought the reason was me losing interest once I saw that I could do it. However there is a very big difference between starting something and actually finishing it; but it's hard to push back the stupid question "why doing it" that keeps popping out all the time. "Why" is a question that has no answer; wasting time asking "why" is stupid as to any answer you can add another "ok, but why ?" in an endless sequence that takes nowhere. The key intelligent question is "How ?". That question doesn't rise an infinite chain of stupid questions because at a certain point you just do it.
How to do 3d graphics ? How to do video compression ? How to do text compression ? How to solve a quintic ? Those are meaningful questions.

So why I keep asking myself stupid questions ? :-)

Monday, December 26, 2005

ahhhhh... so I was right!

I always had this strange gut feeling that pure drawinism wasn't going to be an acceptable explanation for our world. I agree that in theory it could work, but I was never able to believe that the results we observe in nature could be justified from a numeric point of view only by natural selection. With this I mean that in my opinion natural selection simply couldn't have enough strength to make the human body (just for example) such an impressive machine.
Recently when my mother had a thrombosis problem I discovered things about how our blood works that I didn't know. Just the explanation of how our body reacts to an injury trying to prevent the losing of too much blood is impressive. Just that little bit is incredibly sophisticated and requires a very precise equilibrium... too much of a value and your blood is going to coagulate when there's no injury, and you die; a value too low and your body will not be able to stop losing blood from a little cut and you also die. Thinking that such a perfection comes by mere natural section doesn't seem to me reasonable.
Yesterday I stumbled in a page that explained that exactly the machinery required to coagulate our blood when needed is a part that is hardly justifiable by natural selection. It's a chain reaction of activations of proteins where no mistake and no misregulation is allowed, and so it's hard to justify how such a system could have been evolving one step after another because in that system you can't change just one variable, you have to change several at the same time to keep the balance. In other words the idea that the system has been reached by casual mutations that produced a sequence of organisms every one better than the previous one simply doesn't work; the intermediate ones would have been not better, and so they've no reason to survive. I don't know if I like the position of Intelligent Design (even if admittedly would make things a lot easier to explain; especially if you don't make the big jump of assuming the existence of a god but just that of someone - necessarily non-human, but not necessarily super-human - that is directing or has been directing the evolution) but I'm happy to see that at least to someone else the pure theory of evolution doesn't seem plausible.
Another doubt I always had since I was a kid is about glacial periods, I wonder if indeed even that area is seriously under discussion.

Tuesday, December 20, 2005

where is the common sense ?

Today I downloaded a program that allows you to design reports with data extracted from an SQL database. About 600MBytes. Then the received file was indeed just self-extracting itself in a setup directory of roughly another 600MBytes. Then from this second directory you can install the program that it takes around 600 MBytes.
Oh... and just after downloading the file (only minutes later) you may want to download the service pack 1... about 140Mb.
I'm the only one that finds this just outrageous ?
Why downloading a program that then unzips in a bunch of files that then can be used for setup? Is this passage really needed ? Why asking your users to download a big outdated program from the site and then asking them to download another big chunk of corrections ? wouldn't be better to have just the version patched on the first download ? And the size itself of the program is IMO an offense to the art of programming.

Bah.

Sunday, October 23, 2005

dad's back to the hospital

Sometimes life sucks. My dad has been following the diet almost perfectly and indeed the diabet last year looked under much better control. But apparently he had another serious problem and now he's back to the hospital with blood pockets attached to his body. Be nice and do your part, and you'll be run over by a truck anyway.
There must be a reason if they said that the most important thing is being healthy.

Monday, October 10, 2005

i know who i won't vote for

I'm not really into politics; but the last day I almost involuntarily listened to Romano Prodi talking on TV. First of all it was, or it was supposed to be, a popular protest against the financing law and the electoral law but was indeed just a showcase for red flags and an electoral spot for Prodi; almost nothing was said in the specific about the two issues that were supposed to be the reason for the protest.
What it was really shocking for me was however that only one message was clear... they hate Berlusconi and every single thing the current government made: the situation is dramatic and is getting worse every single minute and it's all a fault of the current government. Nothing, literally nothing, was proposed as an alternative. They never said what they would have done if being in charge... Prodi just stopped to the much easier position of "they did it wrong". Is such a pathetic non-program enough to win ? I hope not... I think not.

But this is Italy...

Monday, October 03, 2005

i hate mondays

... or, actually, I think Mondays hate me

my idea was to start the week with a positive mindset but even from the very moment I woke up I knew everything wasn't going to be perfect. It was raining like hell, and it was also damn cold in my house. Ok... it happens. While having breakfast the TV forecast said the bad weather will last until next weekend. Yay! My sneezing made me realize I'm not going to be 100% operative. My original plan was to subscribe to the swimming pool this week, but it would mean just waste a week... so I decided to postpone the subscription.
Then, with still some residual positive mindset, I went down to the box to pick up the car. I was just a bit late, as usual, not something I like but I think that counting how late I stay at work no one will even think about. Flat tire. Double Yay!. It wasn't even the same tire that gave me problems in the past... So I replaced the tire with the emergency one (getting dirty has as one can get) and drove to the tire shop. There I told them what happened and also about the other tire that slowly deflates continuously (it was used to take around 8/10 days to get to the point of being visibly deflated). That, and the current situations of the tires, made me decide to change them all. 220 euros. Triple yay!
I got to work one hour and half late on my usual late schedule, and it wasn't a really wonderful workday (but not that bad either). When coming home I burnt the topping for my pasta (and I burnt it after removing it from the fire just because I left it in the pan and took care of the cat that decided it was a nice moment to go to its bathroom - hint, if you've a persian long hair cat then try to avoid feeding it with food that implies almost liquid feces). Yay... overcooked pasta with just olive oil as topping.
When driving back to work I was kind of in a hurry... and I saw a flash on my rear mirror. It was raining as hell, of course, so *may be* it was just a lightning at distance... but I wouldn't be surprised to discover I got yesterday the first autovelox ticket in my life: I've heard it's becoming more and more common to use those devices in town and not only on extratown streets. I'm really looking forward in the mailbox for the ticket.

I hate mondays, and I'm going to spend on mondays roughly 1/7 of my life...

Sunday, September 18, 2005

music time

I decided to refresh a bit the who-am-I section in my homepage and even added a first recording from my piano to it. The recording is supposed to be Chopin waltz op 64/2, and excluding a few evident absences it should have almost all notes in it and the extra ones shouldn't be that many.
Once the notes are ok I'll try to work on the playing :-))

the world is not so bad

When coming back from my vacation I lost my wallet on the train; I'm not sure if it fell in the crowded aisle of the train or if I indeed forgot it on the seat (I'd say the former, but being me I can't exclude the latter). Anyway I had everything in it, my credit card, a couple of cash cards, my driving license, ID, other cards and a somewhat big amount of cash (about 400 euros).

When, at home, I realized I didn't have it I immediately blocked the cards as I thought that someone stolen it in that aisle... well... it turned out that someone that didn't even leave enough information to be reached gave it to the police at the central station in Milan and so the very next day I was able to get back all my stuff, including all the cash!

Also given that it took me more than an hour to get it back from the police I suppose that even for just giving it to them that person had to spend some time providing explanations for the official record. Add to this that the train I was in was also half an hour late on the schedule and that the evening was approaching (the train arrived in the central station after 8pm; as you probably understand the central station in Milan is really not the best place to stay in the evening) and you'll probably agree that I've certainly to say a *big* thankyou to who gave me back my stuff.

This world is not so bad after all...

Saturday, August 27, 2005

vacation time!

I'll be leaving tomorrow morning for my yearly week vacation at the chess tourney of Imperia. Last year I prepared a lot for the tourney and (with some luck) won my division; it was also the first time I won a tourney. This year I did basically nothing... so it's gonna to be a quite terrible performance :-D
I actually don't care much... it's more just sleeping a bit more, going around in a nice place near the sea and getting very good even is somewhat excessive food for a week. I also decided I won't go running every morning this year; I'll just chill out a bit more.

I finally finished Chopin waltz op 64/2 and I just started looking at nocturne op 9/1. It actually looks much harder than I thought by hearing the piece: the dreamy out of time part for the right hand is accompanied by left hand broken chords I can barely take; I've no idea if with exercise I'll be able to get them easy enough to forget about them and have them playing themselves... we'll see.
Also I didn't notice hearing the piece the acciaccatura with a two octave and half interval. I actually wonder what that really means; for what I know I'd say that such a thing is impossible to play for a human being...

Monday, August 22, 2005

you lose!

Whoops... in the second competition on TopCoder I slipped badly and fell on my back. I only "solved" the two easy problems but the first solution had a off-by-one error ('<' instead of '<=') and in the second I was way too slow.
Actually it was shocking to see how many failed the first problem and not by off-by-one errors like I did but with true broken logic (missing cases) or doing redundant illogical tests (that didn't harm, however... melius abundare quam deficere has never been my view in programming, but apparently it pays off).
It was anyway fun... I want more of those :-). There's also an italian that performed extremely well (about the time taken to complete the "easy" tests... even if it's one of the many cases of pointless checks).
On the second problem I was lucky to have it actually correct. I implemented a working solution, but slowly and an horrible one compared to a few cooler ones I saw. Do this kind of sloppy reasoning in a more complex problem and the 2-secs limit on running time will look like as unsormountable barrier.

It's a pity the online competitions happen at those strange times, but this is what we pay for not living all in the same place. Many italians I know wouldn't be able to compete just because of that problem and the schedule is a problem for me too even if I work close to where I live.

I hope Pisky (the only surviving italian in TCO05) can make it further... he won also $75. From now he'll have a thougher path, including the need to put an alarm at 2.30am to compete (!).

The kind of round that we faced however is exactly what I wouldn't like about real programming. Easy problems and you've to code them in a hurry; and even if the solution is ugly from all points of views, if it works then it's ok. Exactly favoring "do it badly but do it now"; what I think is an horrible philosophy.

There was also an interesting hard problem... i wasn't able to complete it on time and it was probably even more complex than I thought as only 11 of about 650 partecipants were able to provide a working solution.

Monday, August 15, 2005

fight!

Recently a friend of mines introduced me to the world of pure programming competitions on TopCoder. I'm not really the fight-at-all-costs type, but I've to say that I like the idea. I tend most often to see the battle (in chess, or in karate, or now in programming) as a fight against imperfection more than as fight against someone else, but I regretfully discovered that looking at standings to see where I ended up is an important part.
May be indeed that in addition to a fight against imperfection there is a component that is the fight against all others, a fight for distinction (but never a fight against someone specific; even in chess I don't see my opponent as an enemy, and this is probably one of the reasons for which I'm not that good).
Anyway I found myself much weaker than I would have expected ... I need to get better at coding (deep inside I know I'm #1 hehehe).
There are parts of TopCoder that I don't like but still it looks to me a wonderful system and a pretty cool way to exercise. It's not like real coding, of course, but I think it's good. A lot of the emphasis is on the speed, but write incorrect code and you are simply out, as you should deserve.
Also it's funny the challenge part where you are allowed to kick out opponents by proving their solution is incorrect (I don't think this happens often, the submitted code will go through a more serious test anyway so there's just no point in submitting a wrong solution - unless you happen to have a fake account and kick it out from a real account to gain points).
I don't like there's no premium for readability and hence the top solutions are sometimes snippets that would get your ass fired being me the one in charge of quality control, but it would be difficult to place an objective measure for readability (readability depends on the reader, probably it's just that I'm too dumb to understand those programs).
Oh... I would have loved to be surprised on another aspect, but it didn't happen. As one could probably guess there is almost no girl even there. It's because of the fight or because of programming ?

Wednesday, August 10, 2005

better than real ?

Recently we got a tapis roulant (treadmill) for my mother as the doc told her she should walk at least 3Km per day and she doesn't like the idea of going around like a drone for no reason (except at home I mean).
Of course I ended up giving it a try and I've the impression that running on it is harder than running on the street. I did a 10Km run at 10Km/h and I was really almost dead when finishing (no kidding I was counting the last minutes one by one and telling myself "you can do it.... c'mon! don't give up!").
Actually I'm used to run quite longer at about that speed so this puzzles me... I've no idea if it's the missing of the fresh air flowing in the front of you or if it's being *forced* to keep a constant speed. Anyway I like not having to worry about bad streets any I felt my shoulder and back ok even if I noticed my left knee "feeling" the run a bit at the end anyway.
What was also shocking was the price we paid for it. In the company I work for I think that we wouldn't be able to get such a thing out on the market for five times the price we paid to have it delivered to hour house. Ok the huge numbers they produce in China, ok for the really low labor cost over there... but still there is something that looks wrong to me in that price.