
As part of testing on my new HTML5 JavaScript Game Platform Pixie I decided to make games for all my friends for Christmas. This game is called RSS Quest. Merry Christmas Jeff!

As part of testing on my new HTML5 JavaScript Game Platform Pixie I decided to make games for all my friends for Christmas. This game is called RSS Quest. Merry Christmas Jeff!
Recently I switched to Postgres for my Rails database needs. Everything is good, but when running tests I get pages of NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index ... spewing into my output.
I asked around and got some help from @robtreat2. A quick search lead me to the Postgres docs on the matter.
client_min_messages (string)
Controls which message levels are sent to the client. Valid values areDEBUG5,DEBUG4,DEBUG3,DEBUG2,DEBUG1,LOG,NOTICE,WARNING,ERROR,FATAL, andPANIC. Each level includes all the levels that follow it. The later the level, the fewer messages are sent. The default isNOTICE. Note thatLOGhas a different rank here than inlog_min_messages.
That’s great for straight Postgres, but I don’t want to have some connection.exec jimmied into my test environment. Fortunately the Rails docs were also in that same search result:
:min_messages– An optional client min messages that is used in aSET client_min_messages TO <min_messages>call on the connection.
Using my newfound knowledge I was able to solve the issue by adding this to my database.yml file:
test: ... min_messages: WARNING
Part 8/258 Number#mod
For some bizarre reason, JavaScript does not constrain the result of the % operator to be between 0 and the base. This can make computing the index into an array or “wrapping” a negative number a small pain. This method gives all numbers an improved mod method that will guarantee they end up inside the array.
/**
* A mod method useful for array wrapping. The range of the function is
* constrained to remain in bounds of array indices.
*
* Example:
* (-1).mod(5) === 4
*
* @param {Number} base
* @returns An integer between 0 and (base - 1) if base is positive.
* @type Number
*/
Number.prototype.mod = function(base) {
var result = this % base;
if(result 0) {
result += base;
}
return result;
};
This makes jumping into an index much easier.
// Example usage var result = array[n.mod(array.length)];
Though still not quite as nice as in Ruby where you can do:
result = array[n] # Ruby cares enough to make it happen
I love Ruby…
I’ve taken an interest in limited time game competitions recently and figured I’d better practice up. So as an exercise I tried to make Tetris in 1hr in Pixie. Except for the blocks getting stuck in the walls and that one thing about the lines, it was pretty good for an hour.
I decided that I got pretty close to a “working” game and forked the app to do the 2hr version. I learned that some beveled block graphics really make a difference! As well as actually removing completed lines. There is one bug where sometimes blocks overlap or won’t move into what appears to be empty space, as well as the “choice” of rotation points, but hey, times up.

Part 7/256
Shuffling is important, especially in card games.
/**
* Returns a new array with the elements all shuffled up.
*
* @returns A new array that is randomly shuffled.
* @type Array
*/
Array.prototype.shuffle = function() {
var shuffledArray = [];
this.each(function(element) {
shuffledArray.splice(rand(shuffledArray.length + 1), 0, element);
});
return shuffledArray;
};
Notice how building on the previous components of rand and each makes this method much easier to write. You’ll find that when you surround yourself with great APIs things constantly become easier and easier, whereas when you are surrounded with terrible APIs things become harder and harder.
In Contrasaurus we wanted some cooler fonts to add some extra ambiance to the game. I knew that adding a custom font from Google Font API was easy for classic HTML elements, but would it be easy for HTML5 Canvas elements? 5 minutes later I knew the answer… Yes!
// In the tag // In your js code context.font = "bold 1.2em 'Inconsolata'";
Welcome to the nether realm of JavaScript extensions… things that should exist and sometimes kind of do, but with a different name and an inconsiderate API.
Part 6 of 256 Useful JavaScript Extensions Array#each.
/**
* Call the given iterator once for each element in the array,
* passing in the element as the first argument, the index of
* the element as the second argument, and this array as the
* third argument.
*
* @param {Function} iterator Function to be called once for
* each element in the array.
* @param {Object} [context] Optional context parameter to be
* used as `this` when calling the iterator function.
*
* @returns `this` to enable method chaining.
*/
Array.prototype.each = function(iterator, context) {
if(this.forEach) {
this.forEach(iterator, context);
} else {
var len = this.length;
for(var i = 0; i < len; i++) {
iterator.call(context, this[i], i, this);
}
}
return this;
};
You’ll notice that this method makes use of the possibly existing Array#forEach method if it exists. In fact it is almost an alias of it, but since forEach always returns undefined like a jerk, we need to wrap it and return the object for chaining like a good citizen. Also, who wants to always be writing forEach, why not just each? Yeah… I like this.
// Example:
var people = [{name: "David"}, {name: "Joe"}, {name: "Gandalf"}];
// Greet each person by name
people.each(function(person) {
alert("Hi " + person.name + "!");
});
Part 5/256
For loops… I hate them so much. Fortunately, a well established functional iteration convention is the Number#times method.
/**
* Calls iterator the specified number of times, passing in a number of the
* current iteration as a parameter. The number will be 0 on first call, 1 on
* second call, etc.
*
* @param {Function} iterator The iterator takes a single parameter, the number
* of the current iteration.
* @param {Object} [context] The optional context parameter specifies an object
* to treat as this in the iterator block.
*
* @returns The number of times the iterator was called.
*/
Number.prototype.times = function(iterator, context) {
for(var i = 0; i < this; i++) {
iterator.call(context, i);
}
return i;
}
This hides the inner workings of the iteration from the calling code so there’s no need to keep track of an external dummy iterator variable if you don’t want to.
var n = 3;
// Greets you three times, with respect
n.times(function() {
alert("O HAI!");
});
// logs: 0, 1, 2
n.times(function(i) {
console.log(i);
});
JavaScript Arrays are missing some very common, very useful functions. One of those is the remove method. We want to be able to say “Hey you, array, remove this object from yourself! Now!!” But our poor JS array’s don’t know how. They can barely remove elements from specific indices, let alone a specified object. Well no longer! Now they’ll do what we say.
/**
* Remove the first occurance of the given object from the array if it is
* present.
*
* @param {Object} object The object to remove from the array if present.
* @returns The removed object if present otherwise undefined.
*/
Array.prototype.remove = function(object) {
var index = this.indexOf(object);
if(index >= 0) {
return this.splice(index, 1)[0];
} else {
return undefined;
}
};
By building off of the Array‘s built in methods we can keep this code very short. We find the first occurrence of the specified object using indexOf, then we remove and return it using splice. If it wasn’t found we return undefined instead.
// An illustrative test suite
test("Array#remove", function() {
ok([1,2,3].remove(2) === 2, "[1,2,3].remove(2) === 2");
ok([1,3].remove(2) === undefined, "[1,3].remove(2) === undefined");
ok([1,3].remove(3) === 3, "[1,3].remove(3) === 3");
var array = [1,2,3];
array.remove(2);
ok(array.length === 2, "array = [1,2,3]; array.remove(2); array.length === 2");
array.remove(3);
ok(array.length === 1, "array = [1,3]; array.remove(3); array.length === 1");
});
John Resig has another take on Array#remove, remove by index. You may want to take a look at that as well, though for me it feels more natural to remove by specified object rather than by specified index.
Part 3 of 256.
/**
* Randomly select an element from the array. The array remains unmodified.
*
* @returns A random element from an array, or undefined if the array is empty.
*/
Array.prototype.rand = function() {
return this[rand(this.length)];
};
Building on the last installment of a global rand method, we can easily extend Array to provide simple random element selection.
// Example: ["rock", "paper", "scissors"].rand()
Selecting options from a loot table, or random AI actions is now wonderfully easy. With all these extensions the theme is the same, start with the best interface for the programmer and extend what you must to make it happen.