Category Archives: Personal

Becoming the Maintainer of an Abandoned Open Source Project

Lots of ink will probably be spilled documenting the stories of what people did during the summer of 2020. With COVID-19 spreading throughout the world and many places going into lock-down, it was an uncertain and strange time. Many people took the opportunity to catch up on old TV shows, learn about investing, or create a side hustle. Me? Well, somehow I found myself becoming the maintainer of one of my favorite open source projects.

Part 1: The Big Rewrite

Almost 4 years ago I was gearing up to rewrite a rather huge AngularJS app. I had been a bit disillusioned with Google’s decision to kill off AngularJS (don’t get me started with Angular 2), and I was looking to build an app that wouldn’t be tied to the whims of Google, since they have a tendency to shut things down. After surveying the landscape, a solution involving the open source libraries React, Redux, and Material UI seemed like a good fit. All that was left was finding a good datatable component…

mui-datatables looked clean and worked smoothly. It made my app look beautiful, and I was excited. To add to this, the official github repo seemed to be buzzing with activity. My first feature request got 12 reactions and a bunch of comments. There was clear enthusiasm about this project, and it stood out amongst all of the Material UI based datatables I evaluated. I felt like I’d found the final piece to my puzzle.

For a while everything went smoothly. I was no rush and my work had me juggling several projects, so the rewrite took place in-between other tasks I was doing. It wasn’t until I was a few months in that I realized I needed an ability that mui-datatables didn’t provide. “No worries” I thought, “I’ll just put in another feature request”, but when I checked the repo, I noticed Greg, the library’s creator, was no where to be seen. Instead, someone named Gabriel was now running the show.

At first this was fine, and I was glad to see someone had taken up the mantle and was moving the library forward, but I soon found myself increasingly frustrated. I was so close to having the library that I needed, yet many of my pull requests (PRs) were left to languish and some updates to the library made my life harder. To add to this, Gabriel wanted to rewrite the whole library, deeming its internals fundamentally flawed. He made a pinned issue announcing this big rewrite (“Version 3.0”), and said it would fix the table’s internals and possibility completely change its API. However, after this announcement he continued to work on features for version 2.x, and in updates months after this announcement he would state that he hadn’t started on version 3 and was still thinking about things.

I was concerned. Once again I looked at other datatables, but I was filled with dread when I concluded that mui-datatables was still the best fit for what I was doing. I either had to stick it out and convince Gabriel to take my PRs, or fork the library and be on my way… and well, I forked it. And that actually turned out to be a pretty freeing experience. But there are downsides to forking that cannot be ignored:

  • You don’t get updates from the community – you’re on your own.
  • When you eventually leave your position, you leave the next developer with learning the fork you made. I’ve been in this boat and it’s not a fun boat to be in, especially as the fork gets old and bugs are found.

After the app I had been working on launched, I thought a little more about these 2 points. One of the key reasons for the rewrite (but not the only reason) was to get off of the now archaic AngularJS framework so that future developers could easily jump into the project. But leaving someone with a forked library that was heavily modified seemed to clash with this idea.

I decided to once again check in with mui-datatables to see if there was some way we could reconcile. What I found was 60 PRs, 2 pages of unanswered issues, and someone @-ing Greg and Gabriel, asking if the project was dead. The last release was 3 months old, and it had a number of problems (a malfunctioning resizable column feature, the responsive design was broken, etc etc). After Greg and Gabriel, I was the 3rd biggest contributor to the project, and with all the updates I’d done in my fork, I realized I was probably the most qualified person to take over. To add to this, COVID-19 was spreading around the country and my work had recently closed down. I was at home with nothing to do for the foreseeable future. I needed something to take my mind off things.

I decided to reach out to Greg on Twitter to let him know the situation and ask if I could take over. I’d previously sought him out to ask why he’d left the project so I knew he’d be responsive on Twitter. A week later he handed me the keys. I then went to 2 of my oldest PRs, merged them in, and did a release. I was the new maintainer.

Part 2: mui-datatables 3.0

Gabriel briefly returned to wish me well. He told me his time had become scarce, and he simply didn’t have enough of it to spend on the project. Even though I’d felt a lot of frustration with some of his decisions, we’d been friendly and I appreciated the work he’d done. Had he not taken on the project, it most likely would have died. However, a year had passed since he’d made his announcement about the next version of the library. Was a version 3 still on the table? I’d done a lot of work on my fork and there were a lot of PRs. Maybe there was enough new stuff to justify a big release.

For the next two weeks I poured through the PRs and open issues. It was oddly fun and proved to be an eye opening experience. Some of the stuff people submit is completely nonsensical while other things are highly complex and clearly had a huge amount of work put into them. For example, one person had rewritten the whole library in TypeScript, and while this was a neat idea, it was completely impractical and would have made it almost impossible to merge the other updates in (plus, I’m not completely sold on TypeScript – but that’s another story). On the opposite end, there were some requests that were small with little explanation. Often times they didn’t work at all and/or caused the tests to fail. It was like people submitted their work without checking it.

I tried to be nice. After all, each PR represented someone spending their own free time to better this library. At the very least they deserved someone trying out and reviewing the changes that they made – even if they had to wait a year. And to my delight, people were pretty cool. I either got a positive response thanking me for looking at their PR, or no response at all.

Of the 60, I ended up accepting 23. The vast majority of these were bug fixes and minor updates. The only submission that really fell into the “cool new feature” category was one that added an injectable component feature. During this period I also ported over most of the updates from my fork, which in the end, accounted for all but 5 of the new features/API updates. A thorough review of the code base was also done which cleaned up a hand full of anomalies. For example, most of the deprecation warnings had accidentally been disabled in version 2.14.0, and starting in version 2.13.1, a large 5MB file was accidentally being included in the npm package. No one seemed to have noticed these things though.

I also updated the library from using version 3 of Material UI to version 4. In the year that had passed, most of the Material UI community had moved on to version 4. Not updating the library to correctly work with version 4 had probably hurt adoption. When I had parted ways the previous year, mui-datatables had 15k downloads per week on npm and it’s closest competitor, the feature heavy material-table, had 7k a week. Now the tables had turned. Material-table was crushing it at 80k downloads a week to mui-datatable’s 25k. The version issue most definitely wasn’t the only reason mui-datatable had lost ground, but I have to imagine it was a significant factor in people’s decisions.

In the end, version 3 would be no great revelation, but it would be a step forward and hopefully a step in the right direction.

Part 3: The Rise and Fall of a Maintainer

After it was released a few people chimed in to say thanks and report bugs, but there was no big celebration that the library was back to getting updates. I got the impression that many people using the table had built their apps around it a year ago. It didn’t seem like it was attracting a ton of new users. From github stars, I could tell that on average, 1.35 new people were starring the library a day, which seemed a bit lower than it had been in the past.

To get things going again I decided to start work on two features I felt were essential:

  • A cell rendering method that would significantly boost performance.
  • Draggable columns.

I had a soft spot for draggable columns. It had been discussed with feverish enthusiasm when I was originally looking at the table, and I felt like it would be poetic as the first big feature of the 3.x era. I wanted something that was nice though, I didn’t want something cheap looking. So I got to work and created what I felt was a slick draggable column feature:

click to play or pause

Most people will say they don’t care about small little effects like this – that all they really want is the functionality, but over time I’ve found this to be false. Little touches like this add up, and overall lead to users liking a product more. 

As I prepped a new release, I began to talk about new features with the few of the people still hanging around. Maybe a grouping feature should be next? Editable columns? I was excited. I was going to get this table back on track and soon it would have features that rivaled material-table. But in addition to the lack of activity in the repo, something else bothered me: Surely I couldn’t be the only one who felt datatables for Material UI were lacking? Hell, when I was doing AngularJS there were several great community options. What was going on?

I went digging, and found my answer on the material-ui github repo. In a thread lambasting material-table, several people stated that they weren’t happy with the community options. The co-creator of Material UI, Olivier Tassinari, satiated the criticism by ensuring them that they were hard at work on an official datatable component. It would be ready for preview in September – basically at the end of the summer.

I had been out of the loop, and though it seemed obvious, apparently the community was displeased with both mui-datatables and material-table. The creators of Material UI realized they needed an official solution, so in October of 2019 they’d announced plans to create one. That explained why no other table had come forth, and it made me feel like mui-datatables and material-table were both lame ducks. A good solution was on the way, and there was no point in a community project if an official table was going to be supported. (however, I would later learn that certain parts of this official table were for paid users only – so material-table and mui-datatables would still have a place in the future)

I was a little distraught, but decided to continue work, albeit at a slower pace. Then, after 10 weeks of being at home, I got the call to come back to work. I reintegrated mui-datatables into work my project and showed off some of the new features. My team lead seemed impressed and was thankful we were no longer using a forked project. With work on mui-datatables now restricted to evenings and weekends, my contributions to it slowed even more. Then, one day in late September, I handed in my resignation at work.

Wait, what?? Oh yeah, probably forgot to mention that during my time off I was kind of stressed about my future. My work had been extremely generous in paying us to stay home and do nothing, but there were rumors about leave without pay in the Fall. With no telework option available and no assurances made about what might happen once the leaves started turning, I had decided it was best to hedge my bets and look for another position.

In a twist of fate my new job would involve working on another AngularJS 1.x project (it never ends!) and possibly porting it to React (though as of now that hasn’t happened – my guess is we’ll still be dealing with AngularJS 1.x apps 10 years from now, though that’s a topic for another time). Now I had even less motivation to continue work on mui-datatables. I didn’t want the project to fall back into disarray, so I felt like the only reasonable thing to do was to find a successor. Thankfully during my time as maintainer another developer, Woo Dohyeong, had joined me in my quest to better the library. He was the obvious choice to take over and with Greg’s blessing, I passed the torch. After Woo made his first release I stepped back.

It was bittersweet. Part of me knew I didn’t have enough time to be a maintainer forever. It’s a job that gobbles up the extra minutes of your day and its mostly thankless. I didn’t talk too much about it above, but there were a few days where I would handle half a dozen questions, and the majority of people wouldn’t say thanks or respond, some people would even be rude. However, reviving the table and improving upon what so many others had built was rewarding. There was a sadness in stepping back, but it was for the best.

Final Thoughts

Well, I didn’t expect this to be so long, but the story (even trimmed down) turned out to be much longer than I thought it would be. I needed a place to write it down though, and if you read it, thank you for reading my story. The summer of 2020 was a crazy time, and even this bloated blog post barely scratches its surface. Hell, I didn’t even write about my bike rides through empty streets or obsession with Hollow Knight (and Animal Crossing, and Cuphead), not that those things are in any way relevant to mui-datatables, but they filled the gaps between development. Anyway, hopefully you found this entertaining or enlightening. Next time you use a piece of open source, be sure to show appreciation to the maintainer, and don’t be afraid to contribute yourself. If you have the time it can be a fun little adventure. Also, don’t get too caught up in the endless cycle of front-end rewrites. There’s a certain madness to it.

Days become Weeks, Weeks become Months

It’s April. I’m now 34. I swear it was just yesterday I was eating lunch in the Commons at UMBC. Now I’m neck deep in adult stuff like figuring out my taxes and changing poopy diapers. People talk about how having 2 kids is more than twice as hard as 1 kid, but I think it’s just that the new kid takes up all the rest of the time that you did have, so you don’t really get time to rest.

patrickgillespie.com

I’ve finally decided to do something meaningful with patrickgillespie.com. I purchased it 8 years ago and have mostly neglected it. I previously had it setup as a “Portal for Patrick Gillespies”, but that was kind of a lame idea.

The other day I realized it would probably be a good place to show off my photography. Every photography youtube channel I watch says you need a portfolio to show off your best work. I have the domain, why not setup a portfolio? Therefore, I’ve recently re-launched the site as Patrick Gillespie Photography.

I wrote the site using AngularJS, Angular Material, and jmpress.js. I want to polish up the code a bit, but when I’m done I’ll put it up on github. This is my first time creating a portfolio, so I’m kind of just having fun with it. I’ll probably continue to add stuff to the site as time goes on.

AOLers Reconnecting

There’s a reasonably active Facebook group on the topic of old school AOL development that someone created a while back. If you were a member of that community it’s worth checking out.

Where is Bob?

You know you’ve reached a strange point in your life when you find yourself reminiscing about stuff you saw on Reddit almost a decade ago. However, sometimes something you read or see online just sticks with you. It resonates. Whether it makes you think, feel, or laugh, it leaves an impression. The “Where is Bob?” blog, which appeared on Reddit back in 2008, was such a thing for me.

Penned by a wickedly funny IT worker, the Where is Bob blog hosted a set of possibly non-fiction stories about a work place run by an obnoxious and often absentee manager named Bob. The submission garnered the praise of the Reddit community and earned just shy of 1,000 upvotes. That may seem like a pittance today, but at the time it was enough to get to the top of /r/funny and enough to get onto Reddit’s front page. It was also enough to capture the interest of a literary agent. I remember this last part because sometime after the subscribing to the blog, all of its posts disappeared and rumors swirled of a book that was to come out.

After what felt like an eternity (~17 months), “Where is Bob?” by Irina P. was self published online. Viral sensations have a very short half life, so it wasn’t surprising that the post announcing this publication netted only 10 upvotes. I was able to catch the announcement, and even though it had good reviews, I was too cheap to shell out the $10 or $15 the author was asking for it. I figured my stack of unread books was already high enough.

In the years since “Where is Bob?” was released, my pile has only grown larger, yet one day around 2 years ago I found myself in need of a laugh and thought about the old “Where is Bob?” stories. I decided to look the book up, and to my dismay, found that it and its corresponding blog were gone from the Internet.

I spent several evenings trying to track down the book: Maybe someone had uploaded a PDF, maybe it was still for sale, maybe someone had archived some of the public blog entries… but it was to no avail.

I’m never one to easily back down from a challenge though, so using some clues I found in various corners of the net, I deduced the author’s current contact information and sent her a message. I told her I that I had really enjoyed her stories and I offered, if possible, buy the book directly from her. In response she sent me this message:

Hi Pat,

Yes, indeed, it was I who wrote “Where is Bob.” How cool that you found me, despite my best efforts to stay hidden! “Where is Bob” was a really fun way to express my frustration with certain aspects of IT, which is the field that I used to work in. I even had a literary agent take interest in it, but she had a difficult time selling it to publishers because it was too short to be a novel and didn’t really fit into any other category. So I put it up as an ebook through Lulu Press, because there were a bunch of people who thought the idea was cool and were willing to pay to read the whole thing.

That was a long time ago. I have since switched careers. I currently work as a high school science teacher, and when I began that job, I decided to decrease my Internet presence as much as possible, because I wanted my non-school life to remain hidden and private from my students. I didn’t want them googling and finding that book. It also wasn’t really making any money (not after the initial surge of sales), so I didn’t think there was any interest in it. If I ever write anything again (which is improbable, albeit not impossible), I will publish it as pseudonymously as humanly possible, but if you want, I can add you to the small group of people who will be notified.

Anyway, thanks for the note, it was a pleasure.

All the best,
Irina

There was no mention of selling the book, and I didn’t want to push the issue too much. I understood her point too. I remember being in college and having friends giggle with glee about finding their professor on an online dating site. A saucy book of old IT stories from a previous career might not mix well with science class.

At the time I decided that was that and moved on. A few days ago I again thought of the book and once again I tried finding it, only to come up empty handed. This experience has underscored something that I’ve often thought about that seems to be against conventional wisdom: Stuff does disappear from the internet. As much as we think things will last forever once they hit the web, that’s only the case if the information has a caretaker that wants it around. If it doesn’t have such a caretaker, it’ll eventually either disappear or sink into the deep web.

Happy New Year!

Baltimore City Fireworks, New Years Day 2016

I know I’m a day late, but I was tired yesterday. I took this photo just after midnight from the HarborView building in Baltimore, Maryland.

I honestly hadn’t thought much about resolutions until yesterday. I watched a video that recommended making huge goals and then asked viewers the question: “How do you eat an elephant?” The answer was “one bite at a time”. It seems a little silly, but I like that way of thinking about things. Huge tasks are very achievable, you just have to break them down into small pieces and go after them one at a time.

I’m not going to publish my goals here, since science shows that telling people your goals makes you less likely to achieve them, but I’ve decided to set some big goals for myself. I hope whatever goals you’ve set for yourself come to fruition and that you have a great new year!

The Long Vacation

It’s been a year since I’ve updated this blog. What the hell have I been doing in that time?

Well… my daughter was born, I sold my house, bought a new house, took lots of photos, reentered and won the contest I talked about in my previous post, became much better at photoshop, reviewed a book for Packt Pub, grew a beard, shaved it, and started learning how to use video editing software.

This site has remained on my mind though. In the background of my other activities I think about what I could be doing with it. I’ve been at a stalemate about where to go with it though. When working on it started to feel like work, I drifted away.

In my absence this site has somehow seen it’s best year yet. Traffic is up more than 50% from last year… though truth be told, a big part of that increase in traffic is due to the run away success of my old Snake app. Why that app took off late last year I have no idea. It sat around collecting dust for the longest time, and then slowly started amassing a following. It’s even made an appearance in a CS lab in Ireland. One of my friends suggested that I start making more games, but I don’t want to be chasing traffic.

For the longest time I’ve had this mentality that this site needs to have a focus around “programming”, but that’s not what this site is. It’s a creative outlet. Some of the blogs I wrote in 2012 and 2013 were pretty dry and written with the mentality of this being a “programming blog”. But it’s not. I’m a programmer, and I blog, but this blog is its best when its organic musings about stuff I find interesting and not stuff I think a potential audience might want to read.

So no more book reviews, product reviews, or overly technical posts. This blog will become just a blog. I may write about something new I’ve done, or I may write about my favorite ice cream flavor. And maybe I’ll start to write more, or maybe you’ll see this as the latest entry in 2017. The goal though, will be for this not to feel like work.

With this change in focus I’ve also decided to change the coupling of patorjk.com and patorjk.com/blog. patorjk.com now gets its own page which focuses on the various things on this domain. This will make this blog feel less like a center piece for this site and more like just another section.

So what does the future hold for patorjk.com? Will there be another long vacation before I do another update? I’m not totally sure. The site is always on my mind though.

Adventures in Photography

It’s been a little quiet around here, but I haven’t forgotten about this place.

Around the start of October I started getting into photography. I had received a Nikon 5300 DSLR camera for Christmas last year, but it spent most of the year collecting dust. However, when the Autumn leaves started falling, I realized it was the perfect time to finally learn how to use the thing.

The Contest

Near the end of October I came across a newspaper article that detailed an amateur photography contest that Kinder Farm Park was holding. The park is run by the county and is 288 acres of forested areas, playgrounds, fields, and farm buildings. Upon finishing the article two thoughts were left running through my mind: I hadn’t realized large scale county parks were a thing, and there were only 3 days left until the competition was over – I needed to find this place and take some pictures.

I ended up making it to the park the day before the competition ended and ran around taking photos like a crazy person. Since it was a Thursday evening, I only had about an hour before it got too dark. I liked two of my photos enough to submit them, and to my delight, two weeks after the contest ended I got an email saying I had scored 2nd place in the People category for this pic:

Before I toot my own horn too much, there were only 9 entries in this category, so it’s not that big of a victory. The other 3 categories had 3 times as many entries, and last year there were a lot more entries, so I’m not sure what happened this year. I guess I got kind of lucky. However, I was still pretty thrilled. I even got interviewed by a local paper, which was kind of cool.

November-December

I’ve spent the past two months basically learning the in’s and out’s of photography (at the time of the contest I was taking all of my photos in auto mode). I resurrected my Flickr page, and was surprised to see that it was still a pretty cool place. Before coming back to Flickr, I briefly tried out Google+, and it was certainly very nice, but Google+ still seems like a ghost town. My belief is that it tried to be too many things (that’s a whole other topic though).

Anyway, I’m certainly not going to change this place into a photography site, but I think changing gears and learning about something new will help me bring more to the table when I finally do come back with some new content. This site is not going to go dormant though. I’ve also spent part of this past year as a technical reviewer for a new Packt Publishing book, so I’ve got an entry coming out about that, and there are a few other small things I’ve been working on, so I’ve got stuff in the pipe line for this site.

Photo Map

And lastly, after the Kinder Farm Park contest ended they released a gallery of all of the submissions. Since each pic listed the location where it was shot, I thought it might be fun to place them into a Google Maps map. If you’re bored you can check them out below.

Site Note: Some of these placements are guesses or approximations.

Analyzing My Facebook Activity Log

Have you ever wondered what your Facebook likes say about you? And if there are any people whose posts you seem to favor? I was curious, so I decided to dig around and see if I could find some stats for likes. I couldn’t, so I decided to turn to the Facebook API. Unfortunately its like information seemed limited for privacy reasons*. Next I tried to get the information from the export feature Facebook offers. Sadly it didn’t have this data either. However, the activity log page chronicled my like history and was just what I was looking for.

I loaded as much information from this page as I could (for some reason it breaks for me around March 2012), and saved it off to a file. I then wrote a quick script to process the data and plugged my activity log into it. The results that were spit out stated that over the past two years I’d liked 1,088 posts and that of my 133 friends, half of my likes were going to just 5 of them (~4%).

Even more interesting, these 5 people were all family members. I’m not sure if that’s just a side effect of me interacting with my family more than my friends, if my family just posts a lot, or if I’m just ignoring my friends. Whatever the case, I didn’t realize I had such a bias with my likes. Though then again, if my Activity Log wasn’t broken for the pre-2012 time period, I wonder if the results would have been different. I had my first child in 2012, and I like most pics with him in it, so that could have been skewing the results. Also, come to think of it, my dog died last year and I went back and liked a lot of pictures of him in it, so that could be skewing things too.

Though peculiar, I’m only one data point, so an analysis of my data doesn’t really say anything about anyone else. If you’re curious about your own liking biases, I’ve put the script online as a gist.

Other Analysis

I’m not the first person to want to analyze their data. Wolfram Alpha has an online app that does an in-depth analysis of a person’s Facebook data. And while it delivers a treasure trove of neat information (example: my friends fall into 5 different groups of connected users), it fails to say much about likes.

Other, less public tools**, have been developed to comb through this like data though. Dr. Jennifer Golbeck gave a Ted Talk last Fall on what your likes say about you and how they’re used by companies. In it she mentions how researchers were able to correlate IQ with people who liked the Facebook page “Curly Fries”. She also mentions how many other attributes such as sexuality and religion can be predicted to a high certainly based on what you like.

It’s probably a no-brainer big companies like Facebook and Google are mining this info for ad purposes. I couldn’t find information on Facebook’s analysis, but Google actually provides a page where you can see what they think of you. However, it’s pretty simple, and I’d be surprised if that was all they had.

Conclusion

I’ve only done a simple analysis of my own data, so there’s a lot more to say for this subject. However, it was kind of eye opening to see where most of my likes were going. Additionally, I think it’d be interesting if there was an app you could use to analyze your own data to see what it said about you. Golbeck joked about starting a company that would sell reports about potential employees to HR people – but, I think it’d be useful if people could generate those kind of reports about themselves. It could help you learn things about your subconscious behaviors or possibly better control your online image.

* Before posting this, I revisited the Facebook API, and I think the data I gleaned from the activity log could also have been retrieved through a bunch of FQL queries. If I were to write a proper app, I’d probably try and use FQL, however, writing a script to parse the activity long was pretty quick and painless.
** I could only find studies, I couldn’t find any source code.

Sea Change

wwwA little over a year ago a coworker pitched a snunkworks-type project to myself and another team member. Separately the three of us worked on PHP/MySQL and Java/Oracle projects, but he wanted the new project to use the MEAN stack (MongoDB, Express.js, AngularJS and Node.js) since JavaScript was something we all had in common.

My interest was piqued, but I was a bit skeptical. I felt the stack was a little too trendy, and for whatever reason, I singled out AngularJS as something I wasn’t so sure about. I felt it was too new – something that was hot at the moment, but might not be hot in 6 month’s time.

At my insistence, we spent a couple weeks comparing Angular and Backbone.js, a framework which had a more established reputation. By the end of our comparisons though, I had done a 180 and was completely sold on Angular. For the remainder of the development I focused mostly on the Angular side of things and loved it.

At the same time I also enjoyed Node. However, its async nature was kind of a pain in the ass and its biggest benefit was really just keeping a common language across the whole project. For Mongo, I had mixed feelings. The flexibility was kind of cool, but relational databases, with their transactions and joins, are a lot easier to work with. Mongo and Node were neat, but they both had weaknesses you had to be careful about. Angular, however, really felt like something that would be a good fit for any type of web project – large or small, complex or simple, etc etc.

GSe3vyI__The experience left an impression on me, and a few weeks ago I decided to accept a job offer at a new company as an AngularJS developer. It was kind of hard to leave my old job, as I really enjoyed it, but I felt it was time to venture out into new waters.

It’s neat to think that 5 years ago I was programming test equipment in Tcl/Java, and now I’m a front-end Angular guy. I guess that’s just the nature of software development though, you’re always continuing to evolve. Also, like always, work wont get mentioned in this blog again unless its related to a major life change, so in my next post I’ll be back to talking about some random tech topic or updates to this site.

Speaking of which, updates to this site have been kind of sparse lately, and I’m sorry about that (especially if you’ve submitted as keyboard layout because I’m way behind in reviewing those). The job switch ate up a lot of time, and a planned vacation to Chile also ate up a lot of time, but now that those two events are over with, I hope to get back to more regular updates.

Also, in case you’re interested, the images in this post come from RedditGetsDrawn, a very cool place where artists draw pictures of submitted photos.

2012 Comes to a Close

I’ve had a lot of false starts with writing posts lately. Writers blocks seems to have gotten the best of me, but I figured I’d do a post to reflect on the past 12 months.

The hand of a fellow runner
Photo By fejsez

This year I turned 30, which makes me feel a little strange. I’m no longer the young guy. Up until 2 years ago I was always the youngest guy on the team I worked on at work, now I’m the oldest guy (though in fairness, the team I’m currently on is only 3 people).

I also became a dad this year (2012-12-09), which is pretty cool. I wont bore you with any mushy revelations or talk about how it’s changed me – I honestly still feel like the same person. However, it is amazing to look over at the little guy and know that he’s got half my DNA. It’s also fun to wonder what kind of person he’ll be. Hopefully I can steer him in the right direction and help him become the best person that he can be.

PHP

I learned a lot about web development this year. Both on my own, by experimenting with new HTML5 APIs and browser tools, and at work. To speak in general terms, at work I’m a developer on two web applications – one based in Java Spring and one based in PHP. Working with the two side by side, I’ve slowly grown to hate Java web development – it’s slow for iterating changes, lends itself to gigantic class hierarchies, and seems to make trivial tasks harder than they should be. Even though it has its flaws, PHP is actually pretty fun to develop in. It also has great documentation and it seems like there is a blog post or forum question on anything you’d possibly want to do with it.

I still prefer the front-end though, and I’m still not sure I want to rely on PHP every time I do something on the back-end. One of my goals for next year is to take a serious look at Node.js, Python, and Ruby, and to do a for-fun project in each. I’ve actually started this already, but got a little side tracked when the baby showed up.

Internet Archive Fund Raiser

The Internet Archive is doing a donation drive with a 3-to-1 match. The archive was of great help to this site a few years ago when I underwent the one-two punch of my hard drive crashing and then my old web host deleting my site. Thanks to their Way Back Machine, I was able to recover a lot of files (in fact, it’s the reason the VB sections to this site are still up). I threw a couple of bucks their way out of appreciation, and I figured I’d pass on the link to anyone else who was interested in helping them out. They’re almost at their goal of raising 150k.

Cracking MaGuS’s Fate Zero Encryption

I’m getting ready to upgrade my computer, and while going through some old files I stumbled across Fate Zero, the last version released of infamous Fate-X application. The tool was popular way back in the late 90’s since it added a lot extra functionality to AOL – some of which AOL was ok with, and some of which it wasn’t very fond of. It was created by two mysterious individuals known as MaGuS and FunGii. After Da Chronic (known for AOHell), MaGuS was probably the most widely known AOL hacker. Even though Fate-X 2.5 and 3.0 had a much bigger impact, Fate Zero was the most extensive in regards to features.

To maintain its status at the top of the heap, Fate Zero had to protect its external data, and this meant encrypting it so that other developers couldn’t snatch it up for their own progs. The prog scene of that time, however, is now long dead. Seeing these files today, I got curious. MaGuS was only 16 when he wrote Fate Zero. When I was 16, I knew almost nothing about encryption. It wasn’t until I was in college that I got a good exposure to the field of cryptography. Even though MaGuS seemed like a pretty smart guy, at that point in time he probably also didn’t know much about encryption. This made me think that the files might be easy to crack. It seemed like a fun way to spend a few hours, so I decided to see if I could decode them.

Interestingly (or not interestingly, depending on how you feel about it), the biggest source of external data for Fate Zero was AOL ASCII Art (ASCII Art done in 10pt Arial). This was typically used for scrolling into chat rooms. Fate Zero had over 500 files dedicated to this. You can see an example piece of art and its corresponding file encoding, below.

                         .--··´¯¯¯¨˜`·-.,
            .---··· ´¨¨¨                      `·.
       .·´                                        ',
    ,'                                               ',
   ¦             /|        |        /                  |
    ',     (     \\:\  |   /|      /''\     .|          |
      '·.  \|\ \.,'.|::\|\/ |¸,.-·´¨¨`·/.·´  |           |
         ` ·-\\|'/|¨`,     `|˜¨|¨˜`·„¸      |   |´¯`,    |
           ,'/||', \:'| ,     |_\::':/      |    |,  ,'     |
         ,'//|  ',¯¯·',                    |    | ¯        |
        ,'/  |  | ` ·.  --·´               |     |           |
        |´  |   |   _ ` ·.__ .·´        |      |/_        |
        |   |   |¨¯  ¯¯///,··\     ,.--·|      |  ',¯¨¨˜˜``'
        |.·´|   |--,··´¯//\ \ \    //   Aeka  _¸'·-By KioNe

File data for the above picture:

MDR恔…f”…f”…f”…f”…f”…f¡’ý)õý¦¡“rn~f”…f”…f”“sŽ¡ý”î
…f”…f”…f”…f”…f”…fÁ,“Sk…f”…f,f”…f”…f”…f”…f”…f”…f”…f”…f”…f”…mo恔…rˆ”…f”…f”…f”…f”…f”…f”…f”…f”…f”…f”…f”…fˆ rP”…쁔…f”…f”…f£áf”…f”…”…f”…f”…f”…f”…f”…f”…Ân~f”Œr”…fœ…f”…¢½®Áfð…f£áf”…f£Œm½”…f”“”…f”…f”áSk…f”…m¢…f½ðÁf½¢‘mðŸ€½ðÁuðr¡ú
Åý¢ú”áf”…f”…f”áSk…f”…f”Åf¡Á¢Ý›”Â
Ô‘f”…fÁðýîÝý¦øf”…fð…fðõÁ …f”áSk…f”…f”…f›”ÂÝ›‘f½®ŒÂ …f”…ÂÀП€ˆ®”f”…fð…f”ár”‘m”…fðrP”…f”…f Œuð…fˆ õ›‘f”…f”…f”…f”…f”…”…fÝ”f”…f”…Ân~f”…f”‘m”…”áfÁ”t”’s)…f”…f”…f”…fð…f”…”…f”…f”…Ân~f”…f”áú”áf”áf”ÄfÁ”tÀÓ…t)…f”…f”áf”…fð”¥”…f”…f݁o恔…f”…”…”…Â
$…f$”u ý½”…f”‘tŽ¡”…f”áf›‘õ
ýÞÁÔŒSk…f”…fð“ýð…fð’s,ú£”¢Ð…¢”…f£…fµÊ±Â”…¥›s£í…‘Ê㳫n~

So right away it’s clear he’s not using a simple substitution cipher, yet due to the repeated use of white space in the source data, a pattern does seem to emerge in the encoded data. I compared the file sizes and found MaGuS’ encoded *.mdr files to be 5 bytes larger than their decoded counter parts. I chalked this up to the “MDR” that prefixed all the files, and the ending carriage return and line feed that seemed to end all of the files.

That meant there was probably one-for-one character encoding going on. After trying a few things out, I realized every 4th character seemed to use the same encoding. My guess was that he was combining 4 simple substitution ciphers, and using a different cipher depending on the index of the character. I created a quick script that read in an input/output combination and then tried to use that information to decode an encrypted file. To my delight, the script (mostly) worked! This was great, however, without knowing the full map of each cipher, I would only be able to get partial results.

I looked further and found each cipher was simply doing a character offset, meaning each cipher was a Caesar Cipher. The offsets were 70, 97, 116 and 101, respectively. If you look up the corresponding ASCII code for those numbers, you get the word “Fate”. I tried out this new decoding strategy and was able to successfully decode a directory of MaGuS’ files. I had broken the code! MaGuS was using what is known as the Vigenere Cipher, and for that particular directory, “Fate” was the pass-phrase.

In another interesting twist, I noticed certain types of files used different Vigenere keywords. For his *.mdf data files, the keyword “12151981” was used. My guess was that this was his birthday, since this date would have made him 16 when the prog was released and he mentions that he was 16 in the app’s about section. In this same about section he also mentions that he’s Asian and what high school he went to. This narrows down who he is to almost a T.

This got me thinking: “I wonder if I can track down who MaGuS was?” With the aid of some crafty googling, email addresses taken from webpages mentioned inside of Fate (if you dig through the machine code, you’ll find a dozen or so URLs), Rapportive (which can be used to look up social profiles based on email addresses), the internet archive, and leads taken from Fate Zero itself, I was able to pin point an individual who fit all of the criteria and was friends with people who got shout outs in Fate. I plugged their name and the “12-15-1981” birthday into dobsearch.com, and only one result came back, and it was from the state and city MaGuS said he lived in. I was stunned, I had found MaGuS.

I feel like it’d be wrong to out him, but at the same time I know it’d be a cop-out to not say anything. So I’ll just say that according to his LinkedIn and Facebook, he works for a consulting firm in the Washington DC area and is specializing in web related work. The rumors of him working for a security firm or of being this guy are false. He also seems to be somewhat of world traveler, and has a side hobby of being a photographer.

Part of me wondered for a second if I should contact him. He was a big inspiration to me back in the day, and Fate-X and its ilk are what led me to learn how to program. However, after talking with my wife, we thought that’d be too creepy. He made some cool progs a long, long time ago, no need to freak him out with some elaborate story that involves breaking some encryption he wrote over a decade ago.

Anyway, after I’d finished my little side quest, and I realized I still had 500+ decrypted AOL ASCII Art files, many of which haven’t seen the light of day in over a decade. Since some of that stuff is kind of cool, I decided to create a gallery for it. If you have a few moments check it out. Also, feel feel to grab and host any art there that you like, just be sure to leave in any artist signatures. It’s kind of strange to think that era is so far away, but also kind of neat to find remnants of it every so often.

2013.04.28 Update: A bit more has happened since I made the original post. MaGuS actually emailed me to congratulate me on the finding and to confirm his identity (though I’ll continue to respect his anonymity). He also mentioned that at the time he wrote Fate he had no training or knowledge of programming, and that he came up with his own encryption method as he went along. I don’t fault him for this, as Fate is still really impressive and I think most of us were in the same boat back then. He seems like a pretty cool guy, and I was glad to hear he enjoyed the post.

2016.03.10 Update: To reconnect with fellow former AOL developers: