Why Star Wars fans are so excited about Grand Admiral Thrawn’s return

Thrawn_novelStar Wars Celebration Europe ended today, and for many Star Wars fans, the most exciting news by far was the return of Grand Admiral Thrawn. For the casual fan, this reasons for this excitement might not be obvious.

Thrawn (full name: Mitth’raw’nuruodo) is one of the most beloved characters from Star Wars Legends. He’s a cool, calculating, non-human genius who cares more about order and stability in the galaxy than personal power. He’s not your typical Star Wars villain. Not only that, his debut was in the novel that effectively kicked off the Expanded Universe, Heir to the Empire, one of the more popular books in Star Wars Legends.

Thrawn is going to be in Rebels Season 3 and in a new book by Timothy Zahn. This is awesome for the obvious reasons that we get both television and novel content, but there’s more to it than that. First, we are finally seeing Disney’s canon take on a significant character from Legends. It means something to fans to know that there are real opportunities to see characters who we love show up again. Secondly, Timothy Zahn is writing in the new canon! That alone is great, and the fact that he is crafting a Thrawn story makes it that much better. The fact that Zahn was involved with the planning of Thrawn’s appearance in Rebels shows that the Lucasfilm Story Group is serious about getting this right.Rebels_Season3_poster

For me personally, it was absolutely fantastic to sit next to my two oldest daughters and see the excitement on their faces when Thrawn was revealed in the Rebels Season 3 trailer! We’ve been reading the Legends books together for a couple of years now, and we’ve also been watching Rebels, so the two coming together is perfect.



Japanese Transformers Victory Catalog

While sorting through some things in my closet this week I came across an old Japanese Transformers catalog, the kind that was packed inside the toy box, to encourage kids to buy more toys! I believe this is from the Transformers: Victory toy line. I bought the Goryu toy while in Japan, probably in 1989, and this came in the box. As a kid I had no idea before going to Japan that these Japan-specific toys even existed, but I was thrilled to find them! As an adult I am still pretty pleased to have this catalog!

MonoGame and shared projects

When targeting multiple platforms with Xamarin, a common approach is to use a Visual Studio shared project for the code or assets that are common. In the case of a MonoGame project, this means moving the .mgcb file to a shared project. However, a shared project doesn’t support a Build Action of “MonoGameContentReference”. A simple fix to this is to open the .projitems file from the shared project in a text editor, and change the ItemGroup entry for the .mgcb file from “None” to “MonoGameContentReference”. A disadvantage to this approach is that the Visual Studio IDE will no longer show the .mgcb file, but the build should work.

Bits from The Force Awakens Novelization

The_Force_Awakens_novelizationI finally finished reading the novelization of The Force Awakens (a couple of other books distracted me), and there were several interesting things near the end.

Han and Leia are married
When Han sees Leia: “Husband and wife stood regarding each other…” The film doesn’t specify if Han and Leia were still married by the time of The Force Awakens. Actually just going by the movie it isn’t clear if they were ever married. Glad to see that point cleared up. Although I’m still frustrated by their relationship overall; they did so much better in Legends… oh well.

Han hasn’t seen Kylo Ren’s face in 10 years
“For the first time Han saw the face of his son as a grown man…” Kylo Ren is around 29-30 years old during the events of The Force Awakens, so we can assume that Han hasn’t seen Kylo’s face for around 10 years. That’s longer than I expected.

Kylo is weakened
After Kylo murders his father, he falls to his knees and “found himself weakened”. I find it interesting that the act that Kylo hoped would make him stronger actually had the opposite effect.

Kylo knows who Rey is
After Rey calls the lightsaber to herself, Ren murmurs “It is you.” Kylo Ren believes that Rey is someone in particular, not just a surprisingly strong Force user.


Proliferation of Dependencies

Ten years ago or so, I wrote lots of relatively small Windows applications. It was important to me to minimize dependencies on external libraries besides those available in Windows. I wanted to ship a single exe that anyone could drop on Windows 2000 or later and run it without installing anything else. To that end I wrote my code in C against the Win32 API directly. No MFC, no .NET, or anything else. If I could restrict my calls to functions in kernel32, user32, gdi32, and advapi32, all the better.

This weekend I’ve been working on a web application. While reflecting on my Win32 days, it struck me just how many dependencies I’ve taken to deliver this web application. Of course there’s the baseline trio of HTML, CSS, and JavaScript, but then I’m also leveraging Node.js, Express, Jade, Passport, Socket.io, MongoDB, jQuery, and Knockout, plus a bunch of other small npm packages. Wow, what a change from my old “minimize dependencies” philosophy!

C-3PO’s Red Arm

Marvel’s C-3PO #1 (aka C-3PO: The Phantom Limb) finally was released this month, after a long wait! The comic book was originally supposed to be part of the “Journey to Star Wars: The Force Awakens” publishing program leading up to the release of The Force Awakens, but that didn’t happen. I ordered my copy in October, and had nearly forgotten about it!

It was a good story, providing a satisfying explanation for why C-3PO would actually choose to keep a non-matching limb. I found the story a little slow going at first, but the themes of droid sentience and free will were intriguing. Honestly, my favorite part was the inclusion of the “spice spiders,” bringing an element of Legends into the Disney canon.


Digest authentication with Express 4

While adding digest authentication to a Node.js / Express 4 site, I ran into an issue. I was using Passport middleware for authentication, along with the passport-http strategy. Authentication worked fine with an Express router for my root path, but when I added authentication to a sub path (e.g. /api/cats) every request failed with an HTTP 400.

After some debugging, I found that digest.js from passport-http checks that the request URL matches the URI that was supplied with the authentication credentials. This is a problem because a mounted route handler sets req.url to a path relative to the mounted path, so in the example above req.url is ‘/’ while creds.url is ‘/api/cats/’, and the string comparison fails.

It turns out I’m not the first to encounter this, and there’s already a pull request for a fix, but it hasn’t been merged yet. In the meantime, I didn’t want to modify the passport-http code, so I made a change in my code to work around the issue. I added a custom middleware function that was called immediately before calling passport.authenticate that updates req.url using the same approach as in the pull request fix. Of course a side effect of this is that now req.url is no longer relative to the mounted path, but that isn’t an issue for my code.

// Middleware to ensure req.url works with digest auth
function (req, res, next) {
    req.url = (req.baseUrl ? req.baseUrl : "") + req.url;