Redmine Knowledgebase 3.2.0 Released

I haven’t been very actively involved with this plugin or the Redmine community as a whole lately, but it would seem there is a very active user-base still logging bugs and enhancing this project.

You can grab a copy of the release on GitHub.

I’m pushing out version 3.2.0 of the plugin thanks to the efforts of some very dedicated community members, who I’d like to highlight below:

Thanks to Frederico Camara:

  • updating acts_as_rated to work with Redmine 3.2.x

Thanks to Eduard Kuleshov:

  • getting this plugin supported in Redmine 3.0.x

Thanks to Axel Kämpfe:

  • getting this plugin supported in Redmine 3.1.x and 3.2.x

HUGE thanks to Rob Spearman for basically taking over the project and pushing it forward:

New Configuaration options

  • Show articles without tabs
  • Show attachments before article content
  • Show thumbnails for articles in lists
  • Show breadcrumbs for articles in lists

New permissions

  • Article history will only show up if have view permission
  • optional permission for users to manage just their own articles. (#306)

Layout

  • Sort Tags on the index page
  • Added authored view so users can find articles by author easily
Read on →

What's Up - May/June 2016

It’s been a while since I posted the Seiken Densetsu 3 review, so I figured as it might be a while before I get around to posting more content, I’ll just throw up a quick update.

Gaming

I’m currently working my way through three games. After finishing the Shadowrun play-through for SNES, I got some good feedback about the Genesis version. I decided to give that a go, and I’ve currently made it to the last boss, but am having no luck beating him.

I’m pretty sure I’m going to have to save up some nuyen and grind it out with some better runners in order to be able to beat Thon. This is a bit of a pain in the ass, and is the reason I ended up abandoning Terranigma previously.

I really enjoyed that game, but since I’ve got very limited time decided to move on to the next challenge.

By challenge, I meant CHALLENGE. I decided to give The 7th Saga another shot, and have now officially made it MUCH further than I ever have before.

Read on →

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 →