Tuesday, August 13, 2013

Making Chainmail

I've decided to make a set of chainmail. Ever since high school, I've known people who had either made or were making a set and I'd always wanted to give it a try. Finally, last weekend, I went and bought the equipment and materials that I would need to get started.

I've read about how to do it extensively and it was just a matter of getting started. Here's what you need to make chainmail:
- Wire. I chose 14 gauge aluminum wire. I plan to also get some copper, brass and maybe colored aluminum wire in the future to add some color and style to the armor.
- Wire cutters. Choose good, strong cutters with a nice grip. You'll be using them a lot to cut the rings and you want something that will last a long time and be comfortable to use.
- Steel Rod. You'll use this to wrap the wire around to make the rings. I bought a 4' long rod, but I might suggest a 3 or 2 foot rod instead as it can be hard to wrap the wire by yourself with that long of a rod. My rod is 3/8" in diameter, but I've read about people using other diameters.
- 2"x4" board. You'll build a contraption with the boards to hold the rod while you're wrapping the wire around it. I had some scraps in my garage that I used to build mine.
- Drill. You'll probably need this to build your contraption and also to help you wrap the wire around the rod.
- Gloves. You'll want at least one glove to protect your hand while wrapping the wire. Don't use gloves that have a rubber grip as it will stick to the wire and could get your finger stuck in the wrapped wire. Believe me that this hurts a lot.

I'm not going to go through all the steps, there are tons of tutorials out there from people with more experience. If you're interested, go check some of them out.

I started with the plan to just make a bracelet for my daughter, but it turned out to be so easy to make a chain that I just kept on going. My first attempt at wrapping the wire didn't go very well, I almost cut my finger off when it got stuck in between the wire and the steel rod when my gloves stuck to the wire and pulled my finger in. Ouch. Also, I had trouble keeping a constant gap, but I didn't have to throw away too much of my first attempt. I made 103 rings in my first attempt. I haven't had a second attempt yet, but I think I'll get to 115-130 or so rings when I do.

Here are shots of my progress. Stay tuned for updates!

My wire wrapping contraption
My first attempt made 103 rings.
My first two sets of five rings.
Connecting those two sets.
My first chain!

Monday, July 22, 2013

Story: Perfect Match

After several months, I finally managed to write a story! This is another Chuck Wendig flash fiction challenge. This one was to get a random plot and write a story from that. I'll keep what my result was until the end. I wouldn't want it to spoil anything.


Mike double checked the form to join FindYourMatch.com. Satisfied that he'd filled out the form without embellishments, he hit the submit button. He sat back and wondered when, or if, he'd get a response when his computer signalled that he had an email.

Expecting a welcome message from the dating site, he leaned forward and opened his inbox. That email was there, but in addition was an email saying he had a message in his FindYourMatch mailbox. A wave of excitement tore through Mike as he went back to his browser and refreshed the page. Sure enough, there was a message from a woman with the simple title of "Interested in meeting". Another wave of excitement, this time mixed with nervousness, hit him. He clicked the link waited eagerly for the page to load.

He was greeted by an image of a woman in a flight suit standing by a fighter jet. The image told him that she was a pretty brunnette of average height that is or was in the military as a pilot. Her message was short and to the point. Her name is Pam, and she read his bio and was interested in a meet up tonight.

He fired off a message back to tell her he was interested in meeting. Before he could even sit back again, he got a reply telling him where to meet her. He looked at his watch and jumped up. He didn't have much time to get ready if he was to make it on time.

When he arrived, he saw someone who looked like Pam talking to the hostess and walked over. "Pam?"

She glanced at her watch and nodded. "Ah, five minutes early, excellent." She looked up at him and smiled. Mike thought she had a beautiful smile. She held her hand out and said, "It's nice to meet you, Michael."

Mike cursed himself for putting his full name on his profile. The only person who called him Michael was his mother. He took her hand and shook it, smiling back at her. "Everyone calls me Mike, actually."

Pam frowned and said, "Well, Mike, it's customary to put your preferred name into your profile." She made a wave of dismissal. "Never mind. Our table is ready, shall we?"

Mike nodded and followed Pam and the hostess to their table. They looked over the menu in awkward silence for a few moments before Mike said, "I just signed up for FindYourMatch today, so I was a little surprised to get your message."

"I have an alert for when a man in my area signs up that meets certain criteria. It is more efficient than sifting through old and out of date profiles," Pam replied.

Mike nodded. "That makes sense. I didn't know you could do that alert thing."

Their waiter arrived then and asked, "Are you ready to order?"

"Typically, you're supposed to ask for our drink orders first," Pam said. "However, I am ready to order my meal. How about you, Mike?"

Mike nodded and they ordered their meals and drinks. As Pam was ordering, Mike looked her over and decided there was something he really liked about her, but he couldn't quite put his finger on it.

The waiter left and Mike said, "So, are you a pilot? In your profile pic, you are standing next to some sort of fighter."

Pam smiled and Mike thought again that she had a beautiful smile. "Yeah, that one is a ZF-132. It was fun to fly, but probably won't make it to production."

"What does that mean? I've never heard of that model," Mike replied.

"You'll likely never hear of it. It failed several tests regarding safety, operability and performance." Seeing that Mike was still confused, she added, "I'm a test pilot for the USAF."

"Oh, that must be dangerous," Mike said, concern in his voice.

Pam laughed, "It's not as bad as in, say, 1950, but it can be dangerous. Fortunately, we haven't lost a pilot since I joined the 412th a few years ago." She looked down at the table. "The silverware isn't placed correctly. The fork goes on the left and the knife on the right."

Mike noted that his silverware was misplaced and corrected it, too. He looked back up at Pam and said, "I'm glad we could meet up for a date-"

"You're mistaken, Mike, this is just an informal meet up, not a date," Pam interrupted.

Mike was taken aback a little, but continued, "Err, as I was saying, I'm glad we could meet up on such short notice. I'm having a good time."

Their meals came and Mike told Pam about being a college math teacher. Then, Pam told Mike more about being a test pilot. They ordered dessert and another round of drinks. At closing time, the waiter brought them their bills.

Mike reached for both checks and said, "I can cover these."

Pam quickly scooped up her bill and shook her head. "Maybe on the first date, Mike, but it wouldn't be proper for you to pay for my meal at an informal meeting of friends."

"So, you're saying that we're going to have a first date?" Mike asked with a smile on his face.


Have you been able to guess the scenario?  My scenario was:
The story starts when your protagonist joins an online dating site.
Another character is a test pilot who wants everything done by the rules.

Thursday, July 11, 2013


I've been trying to get my kids exposure to baseball by hitting whiffle balls and tennis balls to them at the park. Well, the other day they weren't interested in running around and chasing balls, so they decided to play at the park. I didn't want to do that, so I started hitting the whiffle ball and tennis ball around the open space at the park.

After a while I started to make a game of it. I hit the tennis ball as far as I could, then tried to get the whiffle ball to it in as few hits as possible. It hit me that this goal was the same as golf, so I started making a few rules and came up with Basegolf.

Here's what you need to play:
1 baseball bat
1 whiffle ball per player
1 tennis ball

I'm using an aluminum bat, I don't know how a wooden bat would effect the game since I don't own one. If you try the game out with a wooden bat, let me know how it works out!

The rules are simple and designed for solo or group play.  The game is best played in a large space with some obstacles, but probably not a heavily wooded area.

You start the game in one corner of the area you intend to play in.  Make sure all players know what the out of bounds, or foul territory will be as if they hit a foul ball, it will cost them a stroke.  You may decide, however makes sense to you, who goes first. That person will take the tennis ball and hit it as far or close as they want.  The tennis ball is the "hole" that the players must hit their whiffle balls to.  Players take turns "teeing off" by throwing their whiffle ball into the air and hitting it towards the hole.  Then, the players farthest away from the hole take turns hitting until everyone has "sunk" their whiffle ball.  A whiffle ball counts as getting into the hole when it is within a bat's length of the tennis ball.

Once everyone has finished the hole, the next player will hit the tennis ball from the point it landed for the prior hole.  If the tennis ball is in the middle of the play area, and all players agree (or a judge if you have one), the hitting player may chuck their whiffle ball in any direction and hit the tennis ball from where their whiffle ball lands instead of from the spot of the prior hole.

Putting: You can putt by leaving your whiffle ball on the ground and hitting it with the bat.  I've considered making a rule about how you can't putt unless you're on the "green", but I haven't decided what the definition of the green would be.  If you have an idea, leave it in the comments.

Foul balls: As I mentioned before, the play area has a boundary.  Balls hit outside of this boundary are considered foul and cost the player a stroke.  They will drop the ball at the boundary where the ball left fair territory for their next stroke.  This changes a little for the tennis ball.  Instead of a plain drop, the player must make an underhand throw from the boundary.  This still causes the player a stroke.

Whiffs, Strikes and Biffs: If you don't know, a whiff is when a player misses hitting the ball when they throw it up to hit it.  This is a strike.  When you get three strikes, it costs you a stroke.  A Biff is when you hit the ball and it goes less than 10 feet.  This is a strike and you must try to hit the ball from where you started.

Finishing the game: The game is done when the players want it to be done.  The players can agree beforehand on a number of holes, or you could play the standard 9 or 18 holes like in golf.

Scoring: Count the number of strokes it takes each player to sink their whiffle ball in the hole.  At the end of the game, the player with the fewest strokes wins.

Par: I consider Par an optional rule as it can be hard for a group to agree on what the par should be on a particular hole.  It would be easier if you have a judge, I guess.

Strategies: I've considered a few strategies as I was playing by myself.  One, hit the tennis ball as close to foul territory as you can without being foul.  This has risk, but could be good if an opponent hits foul trying to get to the hole.  Two, utilize obstacles to make getting to the hole harder.  Also risky, but if you're confident in your skills, might be worth it.  Three, bunting or "pitching" can be a good tactic when you're too close to swing away and too far to putt.  Leave any other strategies that you come up with in the comments!

I've played Basegolf a few times by myself, but I think it would be fun with a partner or group.  One warning, I've already broken one whiffle ball in half with my aluminum bat, so that's something you've got to watch out for.  Try out the game and let me know if you enjoy it!

Wednesday, July 10, 2013

Geekonablog News

I can't believe that I haven't posted since April 23rd.  It doesn't seem like it was that long ago, but I guess that I've let things go around here for a while.

Well, let me tell you what's been going on in my life.  In April, I started on a new team at work, which I mentioned in my last post.  We're creating a new web page configuration app for the new web platform that Best Buy (me included) has been working on for over a year.  You may have noticed changes to Best Buy's product pages, I had a hand in that work and now I'm on the team that is going to allow more pages to go to the new cloud-based platform by having a tool to configure those pages that isn't based on the old platform.  I know that this description is a little hand-wavey, but I'm not sure how much I should be sharing.  I figure that just mentioning I'm doing this work is safe enough.

Since April, my family and I have gone on two vacations.  The first one was with my family and...my family.  Meaning the family that I started with my wife and the family I was born into (mom, dad, brother, sister and her family).  We stayed at a cabin that my sister found online.  It was awesome!  Fishing every day, hanging out, playing games, relaxing.

The second vacation was camping at the Hayward, WI KOA.  We stayed there three days and two nights with some friends.  I've stayed at that KOA and the Hixton, WI, and I would recommend either of them for anyone looking for a good time.  They have plenty of activities and they are reasonably priced.  We stayed in a small cabin (basically four walls and beds).  When the kids grow up a little, we'll probably try it with a tent.

Other than that, it's summer, so some more fishing, swimming, working in the yard, etc.  Busy, busy.  I have missed writing here and writing stories.  I've been wanting to get back to some of my serial stories (Uroth, Candy Land, maybe even Thaw Deal).  I've also wanted to do more Chuck Wendig challenges, but haven't had any weekend time to do those.  Look for something (hopefully) soon.

In the non-fiction realm, I think I might write a post about Pair Programming.  I used to be against the concept, but my new team does it and I think that I can see the benefits, but more on that when I write that post.

Tuesday, April 23, 2013

Using FreeMarker Templates in a Grails App

I've started in a new team at my job.  We're creating an admin system that is going to take the functionality of several disparate systems and put them all under one UI.  Since we're writing a whole new app from scratch that will interface with existing systems, we had our choice of technologies (within reason) and frameworks.  We ended up choosing Grails because we figured it would be easy to integrate with our other systems and provide us with easy to create RESTful services.

One of our requirements was to use FreeMarker to generate the HTML of our UI.  This is a  requirement because we're using FreeMarker in other areas and we've created a development tool that uses FreeMarker in addition to other front end technologies (JS, SASS).

The problem is that Grails wants to use GSPs (Grails Server Pages), which are like JSPs (and, in fact, compile down to JSPs).  Grails has the ability to incorporate third-party plugins into your project, and there's a FreeMarker plugin for Grails.  Unfortunately, the plugin was made for Grails 1.2 and we're trying to use Grails 2.2.1.  I tried for two days to try to get the FreeMarker plugin to work, but it just didn't seem to do anything.  It was a frustrating situation.

Having read a lot of Grails documentation over the last few days, I found that you could configure Grails similarly to how you configure a Spring application.  You put that configuration in the resources.groovy file.

import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver

// Place your Spring DSL code here
beans = {
 freemarkerConfig(FreeMarkerConfigurer) {
  templateLoaderPath = "/"
 viewResolver(FreeMarkerViewResolver) {
  cache = "false"
  prefix = "bin/freemarker"
  suffix = ".ftl"
  exposeSpringMacroHelpers = "true"

Spring configuration is, of course, XML and this is a Grails closure.  That part wasn't hard to convert.  You can find an example of how to configure FreeMarker in a Spring app looks like, here.  The only other thing we had to do was to put the line below into our BuildConfig.groovy file.

dependencies {
 runtime "org.freemarker:freemarker:latest.release"

Now, the only thing we had to figure out was where to put the FreeMarker templates.  At first, we had them in our views folder where the GSPs went, but we were getting 404s when we ran the app.  After some debugging (thanks Roy for helping debug!) we figured out that the template loader was looking for the templates in the web-app folder.  That was easy enough to fix, we copied our templates from the views folder over to the web-app folder.  After that, everything worked just fine!

So, to recap, we added a typical Spring configuration to the resources.groovy file, added the FreeMarker jar as a runtime dependency in the BuildConfig.groovy file and put our templates into the web-app folder (in the folder configured in the prefix of the viewResolver).

The solution was frustratingly simple after we figured it out.  I wrote this post because I researched and experimented on whether this was possible or not for over two days without any success.  Hopefully this helps anyone else who is trying to use FreeMarker in their Grails app.

If you're like me, though, you want to see more.  Here's an example of a generic Controller:

class ApplicationController {

    static defaultAction = "show"

    GrailsApplication grailsApplication

    def show() {
        [model: [version: getAppVersion()]]

    private getAppVersion() {
        def metadata = grailsApplication.metadata
        return metadata['app.version']

It has one public method, show.  We want that when you navigate to /app-name/application or /app-name/application/show that it displays the version of the app.  I created a template, /web-app/application/show.ftl.  Now, the template contents are:

hello world<br>

When I navigate to /app-name/application/show, I get:

Which is as expected.  Pretty slick.  We're still at the beginning, but this should allow us to borrow front -end devs from other teams since they'll already understand the view technology and we'll be using the same tools that their teams use.

Friday, April 12, 2013

Story: The Necromancer's Apprentice

This story is another Chuck Wendig Flash Fiction challenge.  It's a fun one, I hope you enjoy it!


Max sat amongst the dead, whistling to himself.  He counted them one more time to make sure he had collected the twelve bodies his master had asked for.  He nodded with satisfaction when he saw that he'd gotten enough.

Max reflected how happy he was with his current role as a Necromancer's apprentice.  He'd tried other occupations, of course, but none of them gave him the job satisfaction that this one did.

He laughed as he thought about his tenure as an apprentice in the Thieves' Guild.  When the authorities brought down the whole guild, the rest of the thieves had pegged him as a mole, but he had just accidentally led the authorities back to the hideout after stealing the mayor's "Key to the City".  Who knew that the key didn't actually unlock any doors?

Then there was the time that he tried to join the Druidic Order.  The look on those Druid's faces was priceless when he walked into a society meeting wearing the chain mail he'd found on a dead bugbear.  He still found their dislike of metal armor silly.

Max walked over to the cabinet that held the spell components that his master would use to raise the corpses.  He pulled out a little of this and a bottle of that and placed them on the ceremonial table in the middle of the room.  Next, he grabbed the large cauldron and placed it on the table.

Laying out the spell components reminded him of his tenure as a cleric's apprentice in the Church of Slinne, the Goddess of Life.  He was still making payments to pay for the repairs caused by the fire he accidentally started with the ceremonial torches.

Now, though, he'd definitely found his niche.  He'd been with his master for almost a year now.  It was Max's longest term of employment by at least three months.

His reverie was interrupted by the sound of something gnawing on bone.  Max looked over at the bodies and saw one of his master's pet rats chewing on the femur of one of the more decomposed bodies.  He ran over and shooed the creature away, shaking his head.  He didn't know why his master kept those creatures around.

They did remind him of the time he apprenticed for a Ranger in the Hundart Forest.  The Ranger's companion, a very large wolverine named Scrappy, had never liked him.  His apprenticeship ended abruptly when he accidentally lit the creature's tail on fire.  It was also how he got the scars on his thigh.  Wolverine claws could do a lot of damage.  Good thing his former master had had a healing spell prepared at the time.

He heard his current master coming down the stone stairway and quickly finished organizing the table the way he knew his master liked.

"Good evening, Max," his master, Alacast, said as he approached the table.  "Is everything ready?"

"Oh, yes sir," Max excitedly answered.  "We've got twelve corpses of varying levels of decay all ready to be risen."

Alacast spent a moment looking over the dead.  "No trouble in the cemetery?"

That question reminded Max of how he'd met Alacast.  The Necromancer had sent his previous apprentice to the graveyard where Max had been working as a gravedigger's apprentice.  He'd interrupted the apprentice as he was robbing a grave.  Max had offered to help him dig up the body, but the apprentice had refused.  As Max leaned against the gravestone to watch the apprentice work, the stone shifted and fell into the grave, crushing the apprentice.  Alacast's magic had alerted him to his apprentice's demise and he'd hurried to the cemetery.  When he arrived a few minutes later and saw what had happened, he offered Max the apprenticeship.  Gravedigger work hadn't been for him, so he accepted.

Back in the present, Max answered, "No, sir.  The gravedigger was passed out drunk again."

His master nodded and returned to the table and began the chant that would raise the corpses into undead.  Max stood behind his master watching intently as he chanted.  Max knew that this spell would take some time, so he leaned back against the wall.

What Max hadn't realized was that it wasn't the wall right behind him, but rather a lit brazier.  The brazier fell over, knocking down the one next to it and so on until the dozen braziers around the room had all fallen over.  Max cursed himself when he saw that several of the corpses had caught fire.

Alacast stopped chanting and glanced over his shoulder at Max.  Sheepishly, Max said, "Sorry, master."

The Necromancer turned and knocked over the cauldron on the table in front of him, spilling the contents onto the remainder of the bodies that hadn't been burning but were now being eaten away by the acidic contents of the cauldron.

The two of them glanced at each other and broke out laughing.  Alacast, between chortles, said, "This is why we work well together, Max.  Birds of a feather are we.  At least they were already dead."

Max smiled and nodded.  He said, "I'll get the mess cleaned up, master, and fetch you a dozen new bodies."

Monday, April 1, 2013

Table Top Day

Along with millions of other gaming enthusiasts, I celebrated International Table Top Day recently.  I love playing games of all types and I've been playing board games since I was little.  When TableTop began on Geek & Sundry, I loved it.  I already liked Wil Wheaton a lot, but having him play some of my favorite games with other geeky celebrities was awesome.

I'll be the first to admit that I don't play board games as much as I'd like, but I think that's part of the point to International Table Top Day.  The point is to take time out of our busy lives to celebrate games and to get together with our friends to play our favorite games or to try new games with new people.

My wife and I decided to stop by The Source Comics and Games for Table Top Day because I'd heard that John Kovalic was planning on being there.  We went there and played a new game that we ended up liking enough to buy.  It's called "Hirelings: The Ascent".  It's kind of the reverse idea of the typical "dungeon delving" game.  You play as one of the hirelings of the heroes that delved into the dungeon and you're trying to escape after the party has all died.  You have the heroes' equipment and you use it to evade the monsters and get out of the dungeon before the dragon's fireball catches up to you.  It was pretty fun and we got to play with the game's creator.  I think we'll try it out with our five year old pretty soon.

The highlight, of course, of Table Top Day to me was meeting John Kovalic.  I've been following him on Twitter pretty much since I joined it and on Facebook for quite some time.  I love his art, Munchkin and Dork Tower.  Meeting him was awesome and he was so nice.  We chatted a bit about the game he was playing, about Apples to Apples and Munchkin.  He told my wife and I about a Disney version of Apples to Apples that we're going to try to find to play with our kids.  Plus, I got to get my picture taken with him AND he signed our copy of Munchkin and Apples to Apples!

Table Top (the show) has increased my already great love of games.  It's made me aware of games that I didn't know about before or made me interested in games that I wouldn't have thought I'd be interested in.  Table Top Day has done the same thing for me with a special interactive component.  I went to a great store that I don't go to often enough and bought a game that I tried there.  It was a great Table Top Day and I'm looking forward to the next one!

Inside Apples to Apples

The cover of my newly signed Munchkin box!