Just Finished - Seiken Densetsu 3

Seiken Densetsu 3 (聖剣伝説3) is the third installment in the Mana series. It’s the sequel to Secret of Mana, which is the entry into the series that most North American gamers would be familiar with.

Once again, I played through this game on my phone using the fantastic Snes9x EX. Please support this dev as he provides a fantastic product. For some reason though, most of the screenshots I took came out stretched. This hasn’t happened before, and I’ve been playing a couple other games that this isn’t happening for either, so I’ll chalk this up to bad luck :|

NOTE I ran these screenshots through pngcrush (ls *.png | while read line; do pngcrush -ow -brute $line; done) to get the size down a bit ;)

I’m leaving these images in here as they were part of my “journey”, though hopefully they don’t deter anyone from playing this game, as the game is fantastic.

First off, if you’re a fan of Secret of Mana, the initial “feel” of the game will be familiar, as will the art style and sound.

Read on →

Redmine Plugin Extension and Development is Apparently Still Relevant

For the first five quarters that this book was out in the wild, I was posting publication numbers any time I got a royalty statement from Packt Publishing for Redmine Plugin Extension and Development.

I haven’t been very active in the Redmine community in the past year or so as I’ve been a bit busy with work, contracts and life, but after seeing the last batch of sales figures, it seems people are still interested in this topic.

Ebook Mini Subscription Packtlib Mini Print Book Mini Subscription (3rd Party Mini)
Q4/2015 30 8 18 3
Q3/2015 24 3 15 4
Q2/2015 30 2 18 3
Q1/2015 90 0 25 2
Q4/2014 33 2 31 2
Q3/2014 25 2 24 4
Q2/2014 73 1 33 2
Q1/2014 18 3 18 0

As was made clear with the above info, there is steady demand for this book, so there must be quite a few plugin authors out there looking to get started with the Redmine platform.

I’m going to try to get my knowledgebase and dropbox plugins updated in the next couple of months, but if there is anything Redmine-related people might be interested, please leave your comments below ;)


Just Finished - Shadowrun

I had this game finished around Christmas, but I find my motivation for writing these articles is starting to languish. I’m hoping to get that spark back with the next couple of titles i’ll be tackling, even though Shadownrun was one of my favourite SNES games of all time.

You wake up on a slab in the morgue. You don’t know who you are or how you got there. That’s pretty much all you’ve got to go on when you start this game for the first time.

The intro shows you being gunned down, then a shapeshifter casts a spell on you and takes off. After getting out of the morgue, you run into “Dog”, who appears to be a shamanistic totem.

This was the first 10 minutes of this game, and I remember playing this back in ‘94 and being hooked at this point.

Shadowrun is a cyberpunk action-RPG for the Super Nintendo. You control Jake Armitage, a courier who has something important uploaded to his head computer.

Read on →

Recovering a WiredTiger collection from a corrupt MongoDB installation

Recently at work, we experienced a series of events that could have proven to be catastrophic for one of our datasets. We have a daily process that does daily cleanup, but relies on the presence of control data that is ETL’d in from another process.

The secondary process failed, and as a result, everything was “cleaned” … aka, we purged an entire dataset.

This data happens to be on a 5 node replicaset (primary-secondary-secondary-arbiter-hidden), and the hidden node died over the holidays and I waited too long to recover it, so it was unable to ever catch up to the primary (always stuck in a RECOVERING state).

My incredible foresight (… laziness … ) resulted in us having a backup of the data ready to be extracted from the out of sync hidden node. All we had to do was start up mongod … right?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2016-01-29T21:06:05.180-0500 I CONTROL  ***** SERVER RESTARTED *****
2016-01-29T21:06:05.241-0500 I CONTROL  [initandlisten] MongoDB starting : pid=1745 port=27021 dbpath=/data 64-bit host=xxx
2016-01-29T21:06:05.241-0500 I CONTROL  [initandlisten] db version v3.0.8
2016-01-29T21:06:05.241-0500 I CONTROL  [initandlisten] git version: 83d8cc25e00e42856924d84e220fbe4a839e605d
2016-01-29T21:06:05.241-0500 I CONTROL  [initandlisten] build info: Linux build3.ny.cbi.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49
2016-01-29T21:06:05.241-0500 I CONTROL  [initandlisten] allocator: tcmalloc
...
2016-01-29T21:06:05.315-0500 W -        [initandlisten] Detected unclean shutdown - /data/mongod.lock is not empty.
2016-01-29T21:06:05.315-0500 W STORAGE  [initandlisten] Recovering data from the last clean checkpoint.
2016-01-29T21:06:05.324-0500 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=13G,session_max=20000,eviction=(threads_max=4),statistics=(fast),log=(enabled=true,archive=true
,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2016-01-29T21:06:05.725-0500 E STORAGE  [initandlisten] WiredTiger (0) [1454119565:724960][1745:0x7f2ac9534bc0], file:WiredTiger.wt, cursor.next: read checksum error for 4096B block at offset 6
799360: block header checksum of 1769173605 doesn't match expected checksum of 4176084783
2016-01-29T21:06:05.725-0500 E STORAGE  [initandlisten] WiredTiger (0) [1454119565:725067][1745:0x7f2ac9534bc0], file:WiredTiger.wt, cursor.next: WiredTiger.wt: encountered an illegal file form
at or internal value
2016-01-29T21:06:05.725-0500 E STORAGE  [initandlisten] WiredTiger (-31804) [1454119565:725088][1745:0x7f2ac9534bc0], file:WiredTiger.wt, cursor.next: the process must exit and restart: WT_PANI
C: WiredTiger library panic
2016-01-29T21:06:05.725-0500 I -        [initandlisten] Fatal Assertion 28558

Aw crap. I could not for the life of me get the node back up and running. Since this was a replica-set member, I thought maybe if I just copied the failing file from the (working) primary it would just work. Apparently that’s not the way MongoDB or WiredTiger works :P. Back to the drawing board.

Read on →

Identifying failing system.js functions in MongoDb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
laptop(mongod-3.2.1) test> db.loadServerScripts()
2016-02-10T15:18:42.322-0500 E QUERY    [thread1] SyntaxError: unterminated string literal :
DB.prototype.loadServerScripts/<@src/mongo/shell/db.js:1158:9
DBQuery.prototype.forEach@src/mongo/shell/query.js:477:1
DB.prototype.loadServerScripts@src/mongo/shell/db.js:1157:5
@(shell):1:1

2016-02-10T15:18:42.323-0500 E QUERY    [thread1] Error: SyntaxError: unterminated string literal :
DB.prototype.loadServerScripts/<@src/mongo/shell/db.js:1158:9
DBQuery.prototype.forEach@src/mongo/shell/query.js:477:1
DB.prototype.loadServerScripts@src/mongo/shell/db.js:1157:5
@(shell):1:1
 :
DB.prototype.loadServerScripts/<@src/mongo/shell/db.js:1158:9
DBQuery.prototype.forEach@src/mongo/shell/query.js:477:1
DB.prototype.loadServerScripts@src/mongo/shell/db.js:1157:5
@(shell):1:15:17:56

Occasionally we’ll run into these scenarios where we need to load the system.js functions into the global context, but for whatever reason one (or more) scripts are borked.

I created on that essentially looks like the following to illustrate this point.

1
2
3
var thisFunctionShouldFail = function() {
    return "Fail
}

When you try to execute a db.loadServerScripts() call, the entire process will fail as there is a malformed script.

This is a major pain in the ass when you have large background processes that rely heavily on internal system scripts.

In order to address this, we wrote a small script that you can run against any database to validate the internal scripts:

1
2
3
4
5
6
7
8
9
10
11
var testSystemJs = function() {
    var coll = db.system.js;
    coll.find({}, {_id: 1}).forEach(function(doc) {
       try {
           var func = coll.findOne({_id: doc._id});
           eval(func.value);
       } catch (ex) {
           print("LOAD_ERROR: " + doc._id);
       }
    });
}

Now if you run the above, it will give you a bit more context into the failures you may have ;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
laptop(mongod-3.2.1) test> testSystemJs()
2016-02-10T15:52:13.086-0500 E QUERY    [thread1] SyntaxError: unterminated string literal :
testSystemJs/<@(shell):1:190
DBQuery.prototype.forEach@src/mongo/shell/query.js:477:1
testSystemJs@(shell):1:66
@(shell):1:1

LOAD_ERROR: thisFunctionShouldFail
2016-02-10T15:52:13.088-0500 E QUERY    [thread1] SyntaxError: unterminated string literal :
testSystemJs/<@(shell):1:190
DBQuery.prototype.forEach@src/mongo/shell/query.js:477:1
testSystemJs@(shell):1:66
@(shell):1:1

LOAD_ERROR: thisFunctionShouldAlsoFail

I’m testing this on a mongo 3.2.1 system, but this method should be applicable to older releases as well.


Just Finished - Final Fantasy V

I’ve been waiting write this review for a very long time. I love the Final Fantasy series, and although I got the original back in ‘90, I didn’t really fall in love with the series until I played IV for the SNES. Then I played VI. Then I was REALLY hooked.

Since I didn’t grow up in Japan, FF IV and VI were numbered II and III when I first got my hands on them. This means that I didn’t know there was a Final Fantasy V; at least not until much later.

The game starts off with the king of Tycoon heading off to check on the wind crystal, only to watch it shatter. The hero Bartz (Butz when I played the fan translation :P) sees a meteorite fall from the sky and heads off to investigate. Bartz and his Chocobo go to check it out, and find an old man who’s suffering from amnesia.

The king’s daughter, Lenna, heads out to find her father and runs into Bartz and Galuf. They team up and the adventure begins.

Once at the wind shrine, they find that the crystal has shattered and within each shard is the power of a job class.

This introduces you to the job ability system. If you’ve ever had a chance to play Final Fantasy III, you’ve see this system in action, but in FFV, it’s done to perfection :)

Read on →

October Anime Update

I finally got around to adding an Anime section to this blog where I can track my Plex library.

Since this is the first post, I figure I’ll just list of what I’ve worked my way through in the past six months or so and what’s currently on deck.

Finished

These are the series that I’ve recently completed.

  • Fullmetal Alchemist: Brotherhood
  • Darker than Black (Season 1)
  • Sword Art Online (Season 1)
  • Attack on Titan
  • Deadman Wonderland

On Deck

What I’m either currently watching, or planning on hitting up soon.

  • Serial Experiments Lain
  • Legend of Korra (I liked Avatar, so figured … why not :P)
  • Death Note
  • Big O

Future

Based on what I’m currently interested in, I’ll probably dip my toes in periodically to see if I should pay closer attention to these series soon.

  • Elfen Lied
  • Ergo Proxy
  • Technolyze
  • Log Horizon
  • Accel World

Just Finished - Lufia 2

This review has been a long time coming; a VERY long time coming. I heard about Lufia 2: Rise of the Sinistrals when I was still in high school, and have been meaning to play it ever since.

Back then, I was just starting to get into JRPGs (though I probably just thought they were RPGs at the time) and was completely infatuated with anything that Square or Enix could crank out (except for Earthbound, which is still one of my all-time faves).

In the decade(s) since my teens, I’ve picked up Lufia 2 a good dozen times, but have never really given it a fair shake. This time around though, since I’m doing this “Just Finished” series, I thought I’d finally sit down and do a full playthrough.

For anyone that has not played this game: PLAY IT! Lufia 2 is now in the top 10 of my favourite 16-bit JRPGs of all time. Hopefully after reading my synopsis here, anyone that was on the fence will also take the plunge (you’ll thank me later!).

Read on →

Fifth Royalty Statement: This time for profit!

I’ve been meaning to write this post for a long time, as I officially got the royalty statement at the end of June, but I’ve been a bit busy with life, contracts and the occasional 16-bit era JRPG …

As of this quarter, Redmine Plugin Extension and Development is officially earning me money!

Technically, the last statement was in the black, however since the terms laid out by Packt Publishing only pays out royalties greater than £75, those earnings were rolled into this quarter.

I’ve updated the table below with the numbers from the current quarter, but I’d really like to thank everyone who’s bought a copy of this book for supporting the Redmine project, and the vibrant plugin development community as well.

Ebook Mini Subscription Packtlib Mini Print Book Mini Subscription (3rd Party Mini)
Q1/2014 18 3 18 0
Q2/2014 73 1 33 2
Q3/2014 25 2 24 4
Q4/2014 33 2 31 2
Q1/2015 90 0 25 2

If you’re just venturing onto this blog after having bought the book, please feel free to leave a comment on any of the posts, or just shoot me a message :)


Just Finished - Final Fantasy II

I’m excited to finally be able to review this game, as it’s the direct sequel to the game that got me into RPGs way back in 1990-91.

When I say Final Fantasy II, I literally mean the second game in the franchise; not the SNES translation of Final Fantasy IV ;)

I actually played a bit of this game in the late 90’s using the Demiforce translation patch (back in the good ol' NESticle days :D), but didn’t make it very far.

For the actual play-through, I decided to go with the Dawn of Souls version for GBA, as this includes updated graphics, an “official” translation and an updated soundtrack.

Read on →