Jarvis Badgley ChiperSoft
  • Link
  • Share
Jul 24 2011
11:04pm

On World of Warcraft, and breaks taken.

Originally posted on reddit in reply to the following:

Have you quit in the past/for good? Why? If you returned, why did you return?

I've taken a break after every expansion release. After BC I stopped playing during the grind to 70 on my first toon. I had been raiding for about 3 months already and I just got sick of my main. The old world still sucked at that point and I didn't feel like leveling another toon, so I lost interest in the game. I don't remember exactly how long that break was, but I know I didn't come back till after 2.1 came out.

For Wrath my BC guild dove straight into the content and we made good progress. We were clearing Naxx, but not flawlessly, thanks to numerous weak links in our 25 man group. When Ulduar landed we made decent progress on 10 man, but again the 25 just kept running into issues and rarely even got to the watchers. Week after week of always doing the same first bosses got very boring, and once again I left to play other games.

I came back when 3.2 came out and we started working on ToC, but I started playing less and less from that point on, as I was now working a fulltime 9-5 job with a 2 hour daily commute. Two months before 3.3 came out I married my girlfriend of 4 years. Being married and working full time ate into my schedule a lot, and I simply couldn't do the late night raiding as much as I used to. This made it harder to get into raids, since I often could only come for one or two nights a week. I stopped playing again for another 3 months, returning when the 4.0.1 patch came back so I could take advantage of the end-of-expansion heavy hitting to finally see all the content I missed out on before.

When Cata came out I left my old guild and joined a new one founded by a friend. Things were running great at first and we were enjoying the 5 man content, but pressure from work left me getting off later and later, and by the time I signed on no-one in the guild would still be on. The difficulty of the new content made it much more difficult to find other players skilled enough to pull it off, so even on weekends we weren't able to get raids together. I stopped playing simply because:

  1. I had nothing to do and no one around to do it with, and you can only level new characters so far.
  2. It became too difficult to dedicate an entire evening to playing the game without interruption.
  3. The new player attitudes that were starting to appear in LFD made pugging into an infuriating experience that often wasn't worth the time.
  4. I gradually shifted into other games, namely Minecraft and Team Fortess 2.

It's probably been 4 months since I last signed into my WoW account, and I have been thinking lately I should get in there and disable auto-renew before my next 6 month period comes up.

I don't blame Blizzard at all, as I don't think any single action they've taken has made the game less fun. There is no way they could have foreseen the player behaviors that would appear as a result of the Random LFD tool. The tool is an ingenious addition to the game and does make the content more accessible, the flaws are in the human element. The other factors are the result of changes in my own life and my own priorities.

I know I will some day play the game again… I'm still regularly reading mmo-champion and keeping up on the latest updates, but my life hasn't changed, and my time will only become more segmented when my wife and I start having kids. I've accepted that I probably wont log into the game again until the next expansion, when new leveling content appears.

  • Link
  • Share
May 27 2011
4:22pm

Star On Code Commenting, Documentation, and Modularization

Don't slip a concrete dildo into someone's box of Fruit Loops. They won't be happy with your Morning Breakfast Surprise. Put the concrete dildo in a clearly labeled box, with instructions. Then when someone encounters a problem, "Hey, something is screwing me here. Maybe it's the concrete dildo?" at least they know to ask.

The Higgs Bozo

  • Link
  • Share
Apr 29 2011
12:53am

Why I prefer Prototype over jQuery

Every so often I get asked why I use the Protaculous combination in favor of the much more popular jQuery. After typing up a lengthy response on Reddit, I figured I'd paste it over here as well.

1) I dislike the coding conventions that jQuery promotes. There's a lot of things done in jQuery itself and in many jQuery plugins that I feel falls into the "just because you can do that doesn't mean you should" category. For example, $ is the jQuery object, and a function for performing selections, and a collection of objects, all at the same time. That's just… wrong.

In Prototype, $() returns an Element, $$() returns a collection. There's no ambiguity in what you're getting.

2) CHAIN EVERYTHING. Who cares if it's ten times harder to read, you've fit a dozen actions on one line!

3) I strongly dislike that everything in jQuery is namespaced on one main object. You've got functions that have absolutely nothing to do with one another living in the same box. Methods for manipulating the styling of DOM elements sit right alongside methods for performing AJAX calls and functions for performing event binding (does every event really need it's own binding method?). Add jQuery UI and you've now got dozens of methods for creating interface elements fighting for the same space. Plugin Authors are encouraged, nay, required to also throw their functions into this one central bucket.

This means several things:

  1. Plugins have to fight with jQuery itself for name-spacing.
  2. There's no natural organization of commands within the library.
  3. There's no context to what a function does. Take the .size() function for example. If you didn't know that function returns the total number of elements found by Sizzle, would that be your first guess? How about .each() — $.each() performs a completely different function from $().each().

Granted, Prototype is somewhat guilty of this itself, you do get a lot of different functions attached to the Element prototype, but it's done via mix-ins adding functions from individual name-spaces, and it only adds functions that are directly relevant to the element. Event functions are on the Event object, DOM functions are on the Element object, Array functions are on the Array object, Collection functions are on the Enumerable object. Everything is in its proper place. This also makes the reference docs MUCH easier to navigate.

4) Scriptaculous' Effects.js makes jQuery's animation toolkit look like child's magic set. For example, this is an animation set from the main slider on the homepage for the company I work for:

new Effect.Parallel([
    new Effect.Move(previousBackdrop, { sync: true, x:w, mode: 'absolute' }),
    new Effect.Move(nextBackdrop, { sync: true, x:0, mode: 'absolute' }),
    new Effect.Fade(previousTabHilight, {sync:true}),
    new Effect.Appear(nextTabHilight, {sync:true}),
    new Effect.Morph(previousTab, {style:'normal'}),
    new Effect.Morph(nextTab, {style:'selected'})
], { 
    duration: 0.8,
    transition: Effect.Transitions.easeOutQuad,
    beforeStart: function () {Accordion.animating = true;},
    afterFinish: function () {
        previousBackdrop.hide();
        previousTab.className = '';
        nextTab.className = 'selected';
        Accordion.animating = false;
    }
});

That's six animations performed in unison over 0.8 seconds using a custom transition and performing actions before the animation starts and after it completes. I can save that Effect.Parallel object and rerun it over and over again if I wanted to by calling one line of code.

Here's a rough example of what the jquery code would look like to do this:

Accordion.animating = true;
$(previousBackdrop).animate({left:w}, 0.8, "easeOutQuad", function() {this.hide();Accordiun.animating = false;});
$(nextBackdrop).animate({left:0}, 0.8, "easeOutQuad");
$(previousTabHighlight).fadeOut(0.8, "easeOutQuad");
$(nextTabHighlight).fadeIn(0.8, "easeOutQuad", function() {this.className = 'selected';});
$(previousTab).switchClass('selected','normal', 0.8);
$(nextTab).switchClass('normal','selected', 0.8);

Yes, it's less code, but there's some key differences here.

  1. There is nothing binding all of these animations to a central key-frame timer, so there's no guarantee that all these animations will occur in sync.
  2. There's nothing allowing me to perform an action when all animations have completed, so I just have to hope that the first one I call completes the same time the others do.
  3. The easeOutQuad transition and the .switchClass() methods are part of jQuery.UI, but you'd never know that looking at the code. Hell, you wouldn't even know that switchClass is an animation.
  4. I had to duplicate a LOT of values here.

5) jQuery's primary purpose is DOM manipulation. Over the years it has branched out into providing other services, but at its core jQuery is still just a selector engine and DOM manipulator.

Prototype, on the other hand, is intended to be an extension to Javascript. Its entire purpose is to add helper functions to the base object types to make writing code easier in general. In short: there's a lot of things Prototype can do that jQuery can't, and very little jQuery can do that Prototype doesn't support (only thing I can think of at the moment is the Deferred object, which I'm not a fan of because it further promotes endless chaining).

  • Link
  • Share
Aug 20 2010
11:52am

Star PinScroll - Easy document content marking on the scrollbar

About a month or two ago MSNBC rolled out a new feature on their website, which you can see demonstrated here. Important sections of the website get little tags that float over the document pointing at the scrollbar, indicating where on the page the section is at. Clicking the tag scrolls you directly to that section.

It's a really neat idea, and I dug through their JS source to see how they did it, but everything on their site is obfuscated (plus, they use jQuery).  So, I brainstormed it for a bit to figure out how they were doing it, and implemented my own method as a Prototype library.  I then went further and made it as dynamic as I could, addressing some bugs with their implementation.  Introducing PinScroll.js, a quick and easy method of adding content pointers to tall documents.

Demo Page
GitHub Project Page

  • Link
  • Share
Jun 14 2010
12:52pm

Reddit SuperHide Safari Extension

I'm getting the hang of this extension thing.  Second release, a port of mine and another developer's GreaseMonkey scripts:  Reddit SuperHide.

It does two things: First, it moves all hide buttons to a standard location between the vote arrows and the thumbnail, rotating it to take up little space.  This position is uniform for all entries on the page, unlike the normal position which moves around depending on how long the title is and how many comments the thread has.

The second function adds a Hide All button to the top of the page to quickly hide all items at once.