Friday, 10 August 2012

The perils of instanceof in Javascript

I was having one of those Internet Explorer moments in Javascript, when I wanted to use Array.isArray and I couldn't because it was IE8. So, I thought, I would create my own isArray function and attach it to Array, so that it works cross browser. The issue now was how do I detect if an object in Javascript is an Array.

The instanceOf operator came to mind immediately. After all, don't you do the same thing in C#, compare if an object "is" something? Luckily for me, I checked the Internet and reached the faithful StackOverflow with an answer. The interesting bit was explaining why instanceOf would not work for all cases and that is that objects that cross the frame boundaries have their own version of class.

Let's say that you have two pages and one if having the other in an iframe. Let's call them innovatively testParent and testChild. If you create an array instance in testChild like x=new Array(); or x=[];, then the result of x instanceOf Array will be true in testChild, but false in testParent. That's because the Array in one page is different from Array in the other. And, damn it, it makes sense, too. Imagine you did what I did and added a function to the Array class. Would that class be the same as the Array in the iframe, without the function? What if I decide to add
Array.prototype.indexOf?

So, bottom line: in Javascript, instanceOf will not work in any meaningful way across frame boundaries.

Oh, and just so you do have a good way to check if an object is and array, do this:
var strArray=Object.prototype.toString(new Array());
Array.isArray=function(obj) {
return Object.prototype.toString(obj)==strArray;
}

Tuesday, 7 August 2012

That's the way the world works

I am linking four news items. Do you see the connection?
Standard Chartered accused of over $250bn of illegal transactions to Iran
Kim Dotcom judge rules mansion raid was illegal
Gary McKinnon extradition decision delayed until October
TV Shack founder loses round in extradition battle


So let me break this down for you. A British bank is accused of dealing with Iran, against the American embargo laws, to the sum of 250 billion $. It risks losing its licence to operate in the state of New York.

Kim Dotcom, the mega rich founder of MegaUpload, site used almost exclusively to store and share copyrighted material. There are emails of the employees and his detailing the ways they were sharing links to stuff they knew were copyrighted. The New Zealand government raided their offices, arrested him, prepared him for extradition to the US. He was released on bail and the link above explains how the raid was found to be illegal.

Gary McKinnon, a hacker looking for evidence of the US government suppressing information about UFOs and free energy in their military servers, is fighting against extradition to the US. He did minimal damage, and that according to his accusers (McKinnon denied it), he didn't leak the information, he just snooped. The link above shows he is not being extradited yet as the UK home secretary is busy with the Olympic events. If convicted in the US, he is facing up to 70 years of jail. The problem the US government seems most damaging seems to be the bloated cost of 700000$ to "track and correct" the problems McKinnon allegedly caused. In other words, they want him to pay their security costs.

Richard O'Dwyer has hosted links to copyrighted material (not the materials themselves) on UK servers, where such linking is legal (or may be, the discussion rages on). No matter, he is awaiting extradition to the US, where such practices are apparently illegal. The link above shows he lost the first battle against extradition. If convicted in the US, he is facing up to 10 years of jail.

Now do you see the connection? The smaller you are, the larger the punishment. The deed is irrelevant (especially in Great Britain - not so great now, eh?) as well as any national laws when the US is involved. Frankly, I was expecting something like this from my own government, a ridiculous joke that sways whatever way the other nations say, but not from the UK. Canada almost has the same problem, but there the citizens actually rise up against American influence.

Monday, 6 August 2012

House of Leaves, by Mark Z. Danielewski

It is hard to describe House of Leaves in relation to any other I have read before. It is clearly a masterpiece, a mad foray into personal darkness and schizophrenia, maybe Mark Z. Danielewski's (it is certainly difficult to imagine a non-extraordinary person writing this).

What is it about? At the surface, it involves a guy that works in a tattoo parlor finding some old papers in the apartment of a blind old man and getting obsessed by them. You see, this old man has written an extensive analysis of a house made movie than was released to critical acclaim and that was viewed and analysed by a lot of others. Only the film does not exist, the references are mostly bogus and the people that happen to be real deny any connection with this fictitious film.

Now, the old man, Zampano, has died in a house that was sealed from the outside, with various implements used to cover every open bit from the door and windows. Now Truant, the tattoo guy, is reading the Zampano papers and starts to get similarly affected, being overwhelmed by a subtle horror emanating from the old man's writing.

The film itself is about a guy, Navidson, a famous international photographer, who decides to move with his family to a new house, a gesture of healing and reconnection, as his job often took him away from his wife and two children. This house, though, has a secret. Suddenly, there is a corridor in one of the walls of the house. It is terrifying through his deep black color and the fact that the wall is an exterior wall and no evidence of its space is visible from outside. More than that, the corridor twists randomly and seems to go forever, even changing configuration.

These are not the only dimensions of the book. Indeed, the fact that a terrifying hole in a wall exists in their family home terrifies the wife, who forbids anyone going in there, under the threat of leaving. Navidson, though, an explorer and a man dedicated to committing the world to photo and film, feels the need to explore it. The very house that was supposed to bring the family together, breaks it apart.

Zampano's notes are comprehensive, academic, with references from linguistics, physics, philosophy, psychology and literature. They contain numerous quotes from documents and books written about the film. The notes have a lot of footnotes, that contain not only more details about the analysis, but personal ideas and emotional outbursts.

Now, Truant is not really a scholar, but he transcribes all of Zampano's work and adds his own notes, together with the story of the document and bits of his personal life. He does drugs, goes clubbing and has a lot of sex, all while obsessing over his bosses girlfriend. But it is not enough to switch him from his transcribing work and the dark effects this has on him.

And that's not all, either. At one time a foot note describes Truant going into a random bar and hearing a band singing about something in Zampano's notes. He asks the members of the band and they show him the published version of the House of Leaves, by Zampano, annotated by Johnny Truant. Truant starts seeing more and more horrible versions of his own life, only to switch back to reality and not be sure which is which.

The book itself is written in 3 different colors, emphasizing Truant's and Zampano's notes. The references are often insane, hyperanalysing a single quote or sequence of the film through analogies with psychological complexes, Latin quotes and mathematical analysis of sound when it echoes. The notes often end abruptly and continue with Truant's story that itself ends with no discernible pattern.

However, the story somehow remains cohesive and the feelings of alienation and unspeakable, more: undefinable, horror transpire through the book. The early Truant drug trips go further in defining this weird combination of Lovecraft, Kafka and Philip. K. Dick.

Bottom line: this book is as brilliant as it is insane. I have never read a book like it and I can only bow to the immense effort of constructing it. It is itself like a dark corridor, ever shifting, and totally gigantic. You should read it.

Be forewarned, though, this is ergodic literature. To truly understand it, you need to read it on paper or in PDF form; OCR doesn't really work on this book and various rtf, doc, html versions you might find are probably close to unreadable.

Friday, 3 August 2012

Updating a T-SQL table from rows in the same table

I had to do a very simple Microsoft SQL query in which I wanted to update some of the values in a row from a row in the same table. Actually, the query was already there, but was using two local variables to store the information, then make the update. Something like this:
DECLARE @Var1 INT
DECLARE @Var2 INT
SELECT @Var1=Column1,@Var2=Column2 FROM MyTable WHERE ID=1
UPDATE MyTable SET Column1=@Var1,Column2=@Var2 WHERE ID=2
I really hated that I was using two SQL statements and all that declaring to do a simple update, so I looked up the syntax for the UPDATE statement. It said that if I want to update a table from a source I need to use the FROM keyword, like this:
UPDATE MyTable 
SET Column1=Alias.Column1,Column2=Alias.Column2
FROM MyOtherTable AS Alias
WHERE ID=2
AND Alias.ID=1
As you can see, we use an alias to name another table or query, we use the Alias name for all the conditions for that table and nothing for the conditions on the table we update. Easy, no? I even tested it and it worked. So I tried this:
UPDATE MyTable 
SET Column1=Alias.Column1,Column2=Alias.Column2
FROM MyTable AS Alias
WHERE ID=2
AND Alias.ID=1
I used the same table to update and to alias and it seemed to work. However, the number of updated columns was always 0. Remarkable how difficult it is to find on the net a straight answer about a simple situation like this.

It turns out that even with the alias, MSSql is confusing some things. The solution is to use a query from your table, rather than the name of the table itself. Here is how you do it:
UPDATE MyTable 
SET Column1=Alias.Column1,Column2=Alias.Column2
FROM (SELECT * FROM MyTable) AS Alias
WHERE ID=2
AND Alias.ID=1


SQL 2005 also introduced Common Table Expressions, which can be used to clarify a query. In this case, using a CTE results in the same execution plan and makes the entire query even more convoluted:
WITH Alias(Column1,Column2)
AS (
SELECT Column1, Column2 FROM MyTable
)
UPDATE MyTable
SET Column1=Alias.Column1,Column2=Alias.Column2
FROM Alias
WHERE ID=2
AND Alias.ID=1

Even if the documentation says you can specify a CTE without declaring the column names, I couldn't do it in this situation, I don't know why. I admit I only tried the CTE solution for a minute before discarding it as too verbose.

Thursday, 26 July 2012

YouTube Playlist Autoplay not working

Update: The bug was fixed and today, 28th of July 2012, YouTube's playlist autoplay is working again. I can't help think maybe it was an experiment to see how much of the traffic was playlists. Whether intentional or not, the statistical information this incident created should be very interesting.

Today I opened a YouTube page, loaded one of my music playlists and started listening to the music in the background. After the first song played, the next started, only with the Autoplay button off, so when it ended, the entire playlist play stopped.

No, this is not you, it's not from your computer settings, Flash updates or anything like that, it is a YouTube issue that keeps turning off the autoplay feature. I don't know if it is an attempt to force people to look at the pages with ads on them or simply an accident - my guess is that it is a bug - but this annoying behaviour started today. The funny thing is that if you press the "Next video" button, the Autoplay button gets back to on, another argument for this being a bug.

I've found a Google topic about this problem, you can find it here, also a Yahoo Answers question, that you can find here.

I don't have a solution for this, but I will update this post if I find it.

Wednesday, 18 July 2012

The Stranger, by Albert Camus

I started reading The Stranger on a recommendation. A guy told me the main character was a bit like me. Having read the book there is only one question I want to ask: How did Albert Camus know about me in 1942?

Joke aside, this a rather short book detailing a bit of the life of a Frenchman that doesn't feel much, is a rational person and doesn't believe in God. Therefore everybody around him thought him a stranger, hence the title of the book. Camus has a way of writing this in the first person, but in a way that seems both introvert and totally outside. The character describes everything he sees in neutral terms, proving he is both very observant and completely indifferent. When other people talk, he quotes them, when he describes himself talking, the character is summarising to the minimum, with no quotes, giving the impression he is a stranger to himself, hence the title of the book.

In the end, it felt like the last part of the movie The Mist. The same irrational fear of the different, coming from a shapeless mass of mindless drones, blindly destroying everything. In my view, the character manages to maintain his decency by rejecting the smallest gesture of resistance. But what do I know?

Would I recommend the book? It certainly teaches the reader something. It describes a way of thinking and of being that is different from most people. It explores several philosophical schools of thought, but you wouldn't know about it unless you read Wikipedia :). It is short enough to not bother anyone, though. Why wouldn't you read it?

Saturday, 14 July 2012

My first game on chess.com

I have seen there is a marked difference between me, a casual chess player that has become interested in the theory of chess, and other people of my level that do not try to understand the theory. I usually beat them with the help of some of the information that lingers in my head. At the same time, there is an even greater difference between me and people that actively play chess online, not only when a colleague becomes interested in playing. They crush me immediately.

It seems to me that in order to grasp the chess theory I must also back it up with practice. So I have decided (after quite a while of fearing it would either become addictive or that I would suck terribly) I've made the first step and played a game there. And I won! Woo hoo! Unfortunately I played horribly and only luck can be attributed to my victory. As always, I've analysed the PGN and here it is. You will understand the shame of my victory (yes, it can happen) when you get to the end. Enjoy!

[Event "Siderite vs Mar09 2012.07.14"]
[Site "Chess.com"]
[Date "2012.07.14"]
[Round "1"]
[White "Siderite"]
[Black "Mar09"]
[Result "1-0"]
[BlackElo "2400"]
[ECO "C41"]
[Opening "Philidor"]
[Variation "Hanham, Steiner Variation"]
[WhiteElo "2400"]
[TimeControl "0+300"]
[Termination "normal"]
[PlyCount "77"]
[WhiteType "human"]
[BlackType "human"]

1. e4 {+0.11/16 10} e5 {-0.09/16 10} 2. Nf3 {+0.13/15 10} d6 {-0.31/15 10}
3. h3 {+0.15/15 10} Be7 {-0.15/15 10} 4. d4 {+0.16/16 10 Didn't know
anything about the Philidor defence that Black employed, except that it is
rather passive. So I decide to attack.} Nd7 {-0.26/15 10} 5. dxe5 {+0.26/16
10} Nxe5 {-0.24/16 10} 6. Nxe5 {+0.23/17 10} dxe5 {-0.23/17 10} 7. Qxd8+
{+0.23/17 10} Bxd8 {-0.15/17 10} 8. Bc4 {+0.04/17 10 computer thinks that
defending the pawn with the knight would have been better. As such, Black
has equality.} Ne7 {-0.23/16 10} 9. O-O {+0.27/16 10} O-O {-0.26/17 10} 10.
Nd2 {+0.20/18 10} Kh8 {-0.38/16 10 Analysis says this is a bad move and
gives White 0.2 because the pawn at f7 is defended only by the rook, but
Black intends to move it forward anyway.} 11. Nf3 {+0.35/16 10} f6
{-0.30/16 10} 12. Bd2 {+0.27/17 10 at this moment I am lost: I have no
strategy, no obvious attack and so I decide to improve my position a little
bit.} a6 {-0.28/15 10} 13. Bb4 {+0.24/17 10} b5 {-0.88/17 10 I thought
about the computer suggested move at the time: Bc4-d5, but dismissed it
because I felt it did not do anything.} 14. Bb3 {+0.46/17 10} a5 {-0.48/18
10 I almost always fall for pawn pushes. I tend to dismiss their
importance, you see, until it is too late.} 15. Bc5 {+0.48/19 10} a4
{-0.57/18 10} 16. Bd5 {+0.71/17 10 Bd5 is no longer as effective as it
would have been.} Ra6 {-0.54/17 10} 17. a3 {+0.54/19 10 The only move to
save my poor light bishop from getting trapped after c6.} c6 {-0.86/19 10}
18. Ba2 {+0.88/19 10} h6 {-1.97/17 10 You see what I should have done here?
Ra1-d1 would have threatened the bishop on d8, the only defender of the
pinned knight on e7.} 19. c4 {+0.59/17 10 Instead I tried to exchange a
weak pawn with a strong one, breaking the menacing pawn chain c6, b5, a4}
(19. Rad1 Kh7 20. Rxd8 Rxd8 21. Bxe7 Rd7) 19. .. Re8 {-0.72/18 10} 20. Rad1
{+0.43/18 10} Ng6 {-5.97/17 10 too late for Rd1, but do you see the winning
move for White here?} 21. g3 {+0.33/17 10 instead I get spooked by the
knight and try to block it and leaving my h3 pawn undefended.} (21. cxb5
cxb5 22. Bf7 {nice pin, one might think, but look closer: the rook at e8
has nowhere to go, the bishop on d8 is defended by the rook alone and the
knight on g6 is also under attack. This gives White a staggering 6 point
advantage.} Rg8 23. Bxg8 Ba5 24. Bf7 Nf4 25. Be8 {b5: completely
undefendable} Ne6 26. Be3 b4 27. Bb5 Ra8 28. Bc6 Ra6 29. Rc1 bxa3 30. bxa3
Nf4 31. Bxf4 exf4 32. Rfd1 Be6 33. Bxa4 Ra8 34. Bc6 Ra7) 21. .. Bb6
{-2.12/18 10 at this moment I still had the trap for the rook on e8, but it
was invisible to me.} 22. Bxb6 {+0.22/17 10} (22. cxb5 Bxc5 {this is the
best move in the situation} (22. .. cxb5 23. Bxb6 Bxh3 24. Rfe1 Rxb6 25.
Bf7 Reb8 26. Bxg6 {White has more than 2 points advantage here.}) 23. bxa6)
22. .. Rxb6 {-0.17/18 10} 23. Kh2 {-0.05/18 10 Yay, I saved the pawn!, I
thought at the moment... by doing so I have missed every opportunity and
reached equality with Black.} c5 {-0.38/17 10} 24. Rd5 {-0.15/17 10} Bb7
{+0.14/18 10} 25. Rxc5 {-0.17/19 10} Bxe4 {-0.07/18 10} 26. Nd2 {+0.09/19
10} Bd3 {-0.11/18 10} 27. Re1 {-0.04/17 10 the computer advises to take the
soon to be open c file. I miss that, too. Little did I know what incredible
edge it would give me at the end. Goooo, luck!} b4 {0.00/16 10} 28. Re3
{-0.07/16 10} Bc2 {+0.13/16 10 again, I decided to play aggressively. If I
could exchange the rooks, I would have a powerful passed pawn.} 29. Rb5
{-0.41/18 10} Rd6 {+0.45/19 10} 30. Ne4 {-1.51/16 10} Bxe4 {+1.64/17 10}
31. Rxe4 {-1.55/19 10} b3 {+1.62/17 10} 32. Bb1 {-2.36/16 10 my light
bishop is trapped. All one has to do is move the rook on d1.} Rd2 {+0.83/19
10 fortunately Black misses it.} 33. c5 {-2.11/17 10 and I ignore that f2
is undefended and, more, it would place me in check.} Rxf2+ {+2.10/19 10}
34. Kg1 {-2.13/20 10} Rxb2 {+2.19/20 10} 35. Re1 {-2.24/19 10 the situation
is dire. Black has 2 pawns ahead and if he sees that I attacked his knight
with the bishop while defending it with the rook, I am a goner.} Ne7
{+2.36/18 10} 36. Rb4 {-2.40/18 10} Nc6 {+1.73/15 10} 37. Rxa4 {-2.18/16
10} Nd4 {0.00/18 10 He saw the knight being attacked, but didn't notice the
pawn on e5 is pinned. It is not all lost for Black, since after a few
exchanges we reach equality. But check out the next moves!} 38. Rxd4
{+0.03/19 10} exd4 {-M1/69 10} (38. .. Rxb1 39. Rxb1 exd4 40. Rxb3
{complete equality and probably a loss for me, as I don't know much about
endgames.}) 39. Rxe8# {Yup. Mate. Neither of us has seen it. When I took
the rook I thought he resigned, as the game ended so suddenly. But no, it
was an accidental mate. How embarrassing.} 1-0