Plugin: Sexy Comments v1.4 Released!

[[innerindex]]

Introduction

This has been a long time coming and I am happy to announce the release of Sexy Comments v1.4! With this version comes a lot of changes…so be sure to read the installation section! Along with simple optimizations and general restructure, the following features are now available:

Feature List

  • Ajax comment preview (new feature)
  • Author post highlighting
  • Avatars
    • Either display/hide avatars
    • Select your avatar service of choice (Gravatar and MyBlogLog options are available)
    • Specify maximum avatar dimension (Gravatar Only)
    • Customize default/trackback avatars
  • Comment Reply-To (new feature)
  • Comment Themes (new feature)
  • CSS overriding
  • “Number of Comments” message customization
  • jQuery inclusion toggling

Installation & Upgrading

  1. Download Sexy Comments v1.4 from the WordPress plugin directory
  2. Unzip that little sucker
  3. Place sexy-comments folder in your wp-content/plugins directory (it should look like this: wp-content/plugins/sexy-comments/
  4. Log in to your WordPress plugin admin page and activate the plugin.
  5. In the plugin admin page, click the SexyComments sub-menu.
  6. Customize the settings until you have something that works for you.
  7. Locate your theme’s template file that displays comments (typically comments.php). Remove the comment output loop and replace with:
    < ?php sexycomments::show($comments); ?>
    
  8. If you plan to use the Ajax features or the Reply-To features, you will need to do two things.
    1. Enable jQuery and jQuery Form Extension via the Plugin > SexyComments administration page.
    2. Locate the template file that contains the comment submission form (typically comments.php near the bottom) and replace that chunk of code with:
      < ?php sexycomments::form(); ?>
      

    NOTE: Be sure not to touch the section that generates the form for adding comments! This plugin does not re-create the comment creation form.

  9. Lastly, consider disabling the plugin CSS and taking the example CSS provided and customize it to suit your theme’s color scheme.
  10. You should be all set, now! w00t w00t! Go make a MyBlogLog or Gravatar account if you don’t already have one and upload an avatar. Gravatar tends to be pretty flakey so I’d suggest using MyBlogLog.

FAQs

  • Q: What is this “comment loop” you speak of?

    A: Ah, yes. That thing. Well, its anatomy looks similar to this (there will be some variation from theme to theme):

    < ?php if ($comments) : ?>
    	<!-- some HTML is typically here -->
    
    	< ?php foreach ($comments as $comment) : ?>
            <!-- the output HTML of each individual comment -->
    
    	< ?php endforeach; /* end for each comment */ ?>
    	<!--...more HTML -->
     < ?php else : // this is displayed if there are no comments so far ?>
    	< ?php if ('open' == $post->comment_status) : ?>
    		<!-- typically a blank area or a place with a comment -->
    	 < ?php else : // comments are closed ?>
    		<!-- closed comments section -->
    	< ?php endif; ?>
    < ?php endif; ?>
    
    
  • Q: Ok…so I just upgraded to a new version and there is nothing in the SexyComments admin page…WTF?

    A: Yeah. Sorry about that. In this version, the directory structure has changed drastically and Sexy Comments should no longer live in wp-content/plugins/sexycomments.php OR wp-content/plugins/sexycomments/sexycomments.php, but instead it should be in wp-content/plugins/sexy-comments/. Make sure that the plugin is in the correct location of your plugins directory.

  • Q: What happened to sexycomments_print($comments)? I used to use that to get my comments to display…will it still work?

    A: Along with a directory structure overhaul, this version had a large code overhaul as well. The old function (sexycomments_print) is deprecated but will still work for the time being. I greatly urge you to move over to the new function call sexycomments::show($comments) as that is the new *impoved* function.

WordPress Plugin: Sexy Comments

Unhappy with my theme’s comment display, I recently re-coded a sexier comment display as a plugin so others can sexify their comments as well.

Download the plugin.

Features

  • Forum-thread-like comment layout: User information to the left, comment to the right.
  • Author post highlighting
  • Altered Trackback/Pingback Display Formating
  • Avatars
    • Either display/hide avatars
    • Select your avatar service of choice (Gravatar is the only option until I find more avatar services)
    • Specify maximum avatar dimension
    • Customize default/trackback avatars
  • “Number of Comments” Message Customization
  • CSS Overriding

Installation

  1. Download and unzip the sexycomments.zip
  2. Place sexycomments folder in your wp-content/plugins directory
  3. Log in to your WordPress admin panel and activate the plugin, then visit the SexyComments submenu of the plugins tab.
  4. Customize the settings until you have something that works for you.
  5. Locate the template file(s) in your theme that loops over and displays comments. Remove that comment output loop and replace with:
    < ?php sexycomments_print($comments); ?>  
    

    NOTE: Be sure not to touch the section that generates the form for adding comments! This plugin does not re-create the comment creation form.

  6. Lastly, consider disabling the plugin CSS and taking the example CSS provided and customize it to suit your theme’s color scheme.
  7. You should be all set, now! w00t w00t! Go make a Gravatar account if you don’t already have one and upload an avatar.

Remote JavaScripting Example – Part I

[[innerindex]]At Plymouth State we work in a multi-server environment and often wish to display dynamic content from one server in an Ajax-like fashion on another server’s website. My co-worker, Zach Tirrell, and I have drummed up a solution that works to keep our layout and logic separate, while still serving our end users in a smooth, seamless, non-iFramed manner.

I’ll walk through the creation of a simple search ‘widget’ that relies on dynamic data to populate a drop-down box.

The Tools

- PHP
- JavaScript
- XTemplate
- RemoteJSOutput: a simple script by Matthew Batchelder (me) and Zach Tirrell

Step 1: create your template

This widget is fairly simple and thus has a simple template. The template syntax is simply XTemplate syntax.

I’ll name it widget.tpl and store it in a templates directory.

<!-- BEGIN: main -->
<div id="sweet_borkweb_widget" style="background:#eee;border:1px solid #ccc;text-align:center;">
  <div style="color:#000;">A Couple JavaScript Posts at BorkWeb</div>
  <select id="borkweb_posts">
    <option value=""></option>
  <!-- BEGIN: post -->
    <option value="{post.url}">{post.title}</option>
  <!-- END: post -->
  </select>
</div>
<!-- END: main -->

Step 2: simple template output

First we’ll just spit out the template. Lets create a PHP file to do this. We’ll call it widget.php

< ?php
include('includes/xtemplate.php');
$xtpl = new XTemplate('templates/widget.tpl');

$xtpl->parse('main');
$xtpl->out('main');
?>

Check out your widget so far. Its plain. Lets change that.

Step 3: add dynamic content

We want the drop down list to hold BorkWeb articles. We’ll add that in now.

Note: this is where you would normally pull from a database, an RSS feed, or some other source. For simplicty, we’ll be using a simple PHP array. Whoop-de-doo. Here it is:

< ?php
include('includes/xtemplate.php');
$xtpl = new XTemplate('templates/widget.tpl');

//get list of articles
$articles=array(
  array('title'=>'Ajax, More Than A Buzz Word','url'=>'http://borkweb.com/story/ajax-more-than-a-buzz-word'),
  array('title'=>'Ajax; Templating; and the Separation of Layout and Logic','url'=>'http://borkweb.com/story/ajax-templating-and-the-separation-of-layout-and-logic'),
  array('title'=>'Deleting the Internet','url'=>'http://borkweb.com/story/deleting-the-internet'),
  array('title'=>'Node Manipulation in the DOM','url'=>'http://borkweb.com/story/node-manipulation-in-the-dom'),
  array('title'=>'Prototype Cheat Sheets','url'=>'http://borkweb.com/story/prototype-cheat-sheets'),
  array('title'=>'Script.aculo.us Is My New Best Friend','url'=>'http://borkweb.com/story/scriptaculous-is-my-new-best-friend'),
  array('title'=>'The Case For JSON: What Is It and Why Use It?','url'=>'http://borkweb.com/story/the-case-for-json-what-is-it-and-why-use-it')
);

//loop over articles and place in template
foreach($articles as $article)
{
  $xtpl->assign('post',$article);
  $xtpl->parse('main.post');
}//end foreach

$xtpl->parse('main');
$xtpl->out('main');
?>

Check out your widget now. It has been populated with some data! w00t! Now to make it work, we return to our beloved widget.tpl template file.

Step 4: make the template work

We’re going to add in some javascript. Lets make the dropdown list redirect the user to the selected article when the drop-down box changes.

I’m going to add this on our select box:

 onchange="if(document.getElementById('borkweb_posts').value!='') document.location=document.getElementById('borkweb_posts').value;"

The template should now look like this:

<!-- BEGIN: main -->
<div id="sweet_borkweb_widget" style="background:#eee;border:1px solid #ccc;text-align:center;">
  <div style="color:#000;">A Couple JavaScript Posts at BorkWeb</div>
  <select id="borkweb_posts" onchange="if(document.getElementById('borkweb_posts').value!='') document.location=document.getElementById('borkweb_posts').value;">
    <option value=""></option>
  <!-- BEGIN: post -->
    <option value="{post.url}">{post.title}</option>
  <!-- END: post -->
  </select>
</div>
<!-- END: main -->

Step 5: prepare script for remoting

Now that our lovely widget is functioning, lets prepare it for inclusion in other locations. This is simple using RemoteJSOutput (a simple script written by Zach Tirrell and myself).

We’ll include that PHP class and use it as follows:

< ?php
include('includes/RemoteJSOutput.class.php');
$remoteOutput=new RemoteJSOutput();

//start output buffering via 
$remoteOutput->start();

include('includes/xtemplate.php');
$xtpl = new XTemplate('templates/widget.tpl');

//get list of articles
$articles=array(
  array('title'=>'Ajax, More Than A Buzz Word','url'=>'http://borkweb.com/story/ajax-more-than-a-buzz-word'),
  array('title'=>'Ajax; Templating; and the Separation of Layout and Logic','url'=>'http://borkweb.com/story/ajax-templating-and-the-separation-of-layout-and-logic'),
  array('title'=>'Deleting the Internet','url'=>'http://borkweb.com/story/deleting-the-internet'),
  array('title'=>'Node Manipulation in the DOM','url'=>'http://borkweb.com/story/node-manipulation-in-the-dom'),
  array('title'=>'Prototype Cheat Sheets','url'=>'http://borkweb.com/story/prototype-cheat-sheets'),
  array('title'=>'Script.aculo.us Is My New Best Friend','url'=>'http://borkweb.com/story/scriptaculous-is-my-new-best-friend'),
  array('title'=>'The Case For JSON: What Is It and Why Use It?','url'=>'http://borkweb.com/story/the-case-for-json-what-is-it-and-why-use-it')
);

//loop over articles and place in template
foreach($articles as $article)
{
  $xtpl->assign('post',$article);
  $xtpl->parse('main.post');
}//end foreach

$xtpl->parse('main');
$xtpl->out('main');

//spit out script encased in JS
$remoteOutput->puke();
?>

Now check out your widget. Ugly, huh? Well, don’t worry, thats the way its supposed to look for now.

Step 6: place your widget somewhere

Now that we have that beautiful chunk of code in operation, place it on a webpage somewhere.

Put this:

<script type="text/javascript" src="http://url.to/your/widget.php"></script>

on any page you wish to test your widget!

Optional Step 7: create a wrapper

If, like me, you aren’t a fan of including RemoteJSOutput.class.php all over hell’s half acre, you can create a wrapper. This not only allows you to minimize the code you have to repeatedly place everywhere, but it also keeps your widget.php script functional on its own!

Here’s an example wrapper I’ll call get_script.php which will display wrapper_widget.php (step 3′s PHP file, renamed):

< ?php
include('includes/RemoteJSOutput.class.php');
$remoteOutput=new RemoteJSOutput();

//start output buffering via 
$remoteOutput->start();

//create a list of allowable widgets/scripts/yadda yadda
$allow=array('wrapper_widget');

//does the passed variable exist in the allowable widgets?
if(in_array($_GET['script'],$allow))
{
  //include the wrapper
  include($_GET['script'].'.php');
}//end if

//spit out script encased in JS
$remoteOutput->puke();
?>

So rather than using the script tag that Step 6 suggests, we’d use:

<script type="text/javascript" src="http://url.to/your/get_script.php?script=wrapper_widget"></script>

Conclusion

This method is simplistic and is simply touching on the topic of widgetization. I will be following up with dynamic user interactions in Part II, and finally discuss an open-standard widget library with xml definitions. Stay tuned :)

Download

Oh, and here’s the code used in this tutorial all zipped up.

Finally. A Cool Looking Human Clone.

After the success of cloning Dolly The Sheep, I am pleased to announce that scientists have finally perfected the Human clone. Check out the perfection as my clones check my tomato-mushroom-and-basil quiche, fetch me a cup of water, put bread in the breadbox, and place utensils in the dishwasher…all while I snapped their photo. All I can say is that my wife is one happy woman. Here are my clones:

Cloning

Writing Your Server-Side Ajax Handler

[[innerindex]]In my recent post on ‘Ajax; Templating; and the Separation of Layout and Logic,’ I refer to an Ajax Handler that sits server side to handle Ajax calls. Some elaboration is in order.

As I have stated in the past, I’m a huge fan of Prototype AND I choose PHP as my language of choice…so my examples will be using both, but the idea is portable.

Set up your Functions

Before you create a handler, you need a set of functions that the handler can reference. Here’s an example:

< ?php
function world($params='')
{
  return 'Goodbye Cruel World.';
}//end world

function sweetWorldAction($params='')
{
  //we expect params to be an array or a string similar to a parameter string from a GET..i.e. "bork=asdf&cheese=yes please"
  //parse out the variables
  if(!is_array($params))
  {
    parse_str($params,$params);
  }//end if

  //do your logic here
}//end sweetWorldAction
?>

Now that we have the functions all set, we’ll set up a handler that receives Ajax calls and calls the appropriate functions.

The Eval Method – A Dynamic Handler

This method is one that I toyed around with for a while and I’ll admit that its pretty simple and clean but there are some drawbacks. We’re going to make a few assumptions: All requests will be GET (this is to keep things simple for this example) and we will keep the complexity of .htaccess sweetness out of these examples and assume that each call will be passing a function variable that specifies the function we are calling. I’ll get to those in a second…but first I’ll show you the handler code in this Eval Method:

< ?php
//if the user leaves the page or closes the browser prematurely, this will help prevent half completed statements
ignore_user_abort();

include('functions.php');

//list out your Ajax accessible functions
$valid_functions = array('world','sweetWorldAction');

if($_GET['function'] && in_array($_GET['function'],$valid_functions))
{
  //get the get parameters
  $params = $_GET;  
  //unset the function index from the params because we just don't need it there
  unset($params['function']);

  //build your parameter string:
  $param_string='';
  foreach($params as $key=>$param)
  {
    $param_string.=(($param_string)?'&':'').$key.'='.$param;
  }//end foreach

  //make your function call
  eval($_GET['function']."('$param_string');");
}//end if

?>

The Variable Variable Method – A Dynamic Handler

This method (compliments of PHPDeveloper) is simpler than the Eval Method and just as dynamic.

< ?php
//if the user leaves the page or closes the browser prematurely, this will help prevent half completed statements
ignore_user_abort();

include('functions.php');

//list out your Ajax accessible functions
$valid_functions = array('world','sweetWorldAction');

if($_GET['function'] && in_array($_GET['function'],$valid_functions))
{
  //get the get parameters
  $params = $_GET;  
  //unset the function index from the params because we just don't need it there
  unset($params['function']);
  //make your function call
  $_GET['function']($params);
}//end if

?>

The Switch Method – A Basic Handler

This method handles each call individually. The reason for using switch rather than if-elses is simply because your application will most likely possess a large number of Ajax-ified functions and those if-elses would be ghastly to read and decrease performance…the Switch statement is much cleaner.

< ?php
//if the user leaves the page or closes the browser prematurely, this will help prevent half completed statements
ignore_user_abort();

include('functions.php');

if($_GET['function'])
{
  switch $_GET['function']
  {
    case 'world':
      echo world();
      exit;
    break;
    case 'sweetWorldAction':
      echo sweetWorldAction();
      exit;
    break;
  }//end switch
}//end if

?>

Make a Choice

Which are you going to use? While the Eval and Variable Variable Methods contain very small amounts of code in the handlers, the logic has simply been shifted to the functions themselves. Increased Ajax-geared logic within the functions themselves reduces portability. However, in the Switch Method, logic is organized in a fairly easy to follow manner while making use of very generic functions that can be used in multiple fashions. Obviously, the Switch Method is my preferred choice :)

In Closing

Handler scripts make the Ajax magic happen and the separation of handler logic from your application logic is just as important for robust development and debugging as the need for separation of layout and logic. Play around with the above methods and see which works for you. If you have a method all your own, I’d be interested to hear it!

Ajax; Templating; and the Separation of Layout and Logic

[[innerindex]]

The Background

I have often mentioned my process of expanding my proficiency of Ajax. Through my journey I have made a number of wrong turns and hit my share of stumbling blocks. All of that has been a learning experience and I’m learning still. I began fiddling with XMLHttpRequest as many do – blissfully ignorant of the many frameworks that exist to make Ajax super easy. My code was bloated with some neat…’features’ (pronounced: bugs).

Then I discovered the Simple Ajax Toolkit (SAJAX), which was simpler than doing raw XMLHttpRequest but really not all that simple. My latest step into the world of Ajax, and the toolkit that holds my love (currently) is Prototype…and I like my Prototype served with a side of Script.aculo.us. *drool* UPDATE: I now use jQuery for all my Ajax and DOM manipulation goodness.

While Ajax is the cause for the article, the heavy focus is on templating. For the past few years I have been using XTemplate as my templating library (I’m a PHP buff) and have been happily separating my logic from my layout…unitl I ran smack dab into the power of Javascript. My PHP still kept its separation from HTML as is the purpose of XTemplate, but it was my HTML that became littered with little nuggets of Javascript all over the place. No matter the method to my Ajax madness, this was my problem.

What Exactly Is Templating And Why Do It?

Templating is definately not new and its use has been debated back and forth for quite some time. But like I stated above, the goal of templating is to keep logic separate from layout which is a good thing for a couple of reasons:

  1. Less clutter. Face it, HTML and whatever server-side scripting language you choose to use are two different beasts. Mixing them together is visually unappealing making code hard to read…and hard to read code is hard to debug.
  2. Coders can develop code. Designers can develop layout. With templating, you are able to achieve this separation and avoid the need for a developer to butcher a designer’s layout to make it function with an application. Each can design/code on their own then combine their efforts with ease.
  3. With separation such as this, applications are more easily skinned and/or receptive to complete UI overhauls.
  4. Did I mention less clutter?

Let me give you an example of what I mean with a simple Goodbye Cruel World application:

Here’s the PHP script: goodbye.php

< ?php
include('xtemplates.php');

$tpl=new XTemplate('goodbye.tpl');
$tpl->assign('CHEEZEWHIZ','Bork, bork, bork!');

$tpl->parse('main');
$tpl->out('main');
?>

Here’s the Template: goodbye.tpl

<!-- BEGIN: main -->
  <div style="font-size:18px;font-weight:bold;">Goodbye Cruel World! {CHEEZEWHIZ}</div>
<!-- END: main -->

Here’s the output:

Goodbye Cruel World! Bork, bork, bork!

Obviously that is an extremely simplistic example. With XTemplates I can get pretty complex and include files, loop over and parse out some complex block structures, assign arrays into template variables, etc. If you want to see a more complex example of a template, check it out here.

Templating Seems Sexy, How Does It Work In An Ajax-ified Environment?

I thought you’d never ask. For this, I have created a diagram to detail how I combine Ajax, PHP, and Templating all in one.


ajax_with_templating.gif

It all works like this:

  1. A User makes a request to view a page
  2. The server-side script calls a series of application functions that generate blocks of templates
    1. Each section that can be updated/rendered by Ajax calls are separated into their own templates, which enables them to be called on initial page load and separate Ajax-triggered calls from the client.
  3. The complete template blocks are sent to the user as a rendered page.
  4. As the user interacts with the interface, two specific things can occur:
    1. An Ajax.Updater (see Script.aculo.us) is triggered, which makes an Ajax callout. The callout is sent to the Ajax Handler (which is a PHP script) which handles the call and invokes the appropriate application functions. Those functions initialize template blocks and output HTML. The HTML output by the server is received by the client and inserted into the User Interface.
    2. An Ajax.Request (see Script.aculo.us) is triggered, which makes an Ajax callout. The callout is sent to the Ajax Handler (which is a PHP script) which handles the call and invokes the appropriate application functions. No templates are initialized or output to the client…instead, the client manipulates the DOM on its own to give proper feedback to the user.
  5. Rinse and repeat as needed.

If we keep all HTML within templates and use modularized functions to initialize and render those templates, we achieve extreme layout/code reuse.

Sounds Cool…So What’s The Problem?

Well, a server-side scripting language coupled with a templating engine is all well and good. But if as we throw Ajax into the mix, suddenly we are working with a lot of Javascript in addition to the a server-side language and HTML. Through my journey in Ajax development my templates – which were havens away from code – were overrun with Javascript code! Eegad.

Now, don’t worry. I place my Javascript in separate Javascript files and include them where appropriate with ye olde <script> tag, which I have done from the beginning. No, the issue has been handling user events; onClick, onMouseOver, onMouseOut, etc. Ajax functions primarily based on user interaction, so onClicks and whatnot are core. My templates soon began to look like this:

<!-- BEGIN: stuff -->
<div>
  <div>[<a href="javascript:void(0);" onClick="Element.show('add_item');">Add</a>]</div>
  <div id="add_item" style="display:none;">
    <form id="add_item_form" onSubmit="Ajax.Request('ajax.php?'+Form.serialize('add_item_form'),{method: 'post'});return false;">
      Name: <input type="text" name="name"/> <input type="submit" value="save"/> <input type="reset" value="cancel" onClick="Element.hide('add_item');"/>
    </form>
  </div>
</div>
<!-- END: stuff -->

As you can see, the once separate layout was laden with code.

The Solution

In a fully layout separate from logic in an Ajax environment, you need to make use of Javascript event handlers. My personal choice is Behaviour which my friend, Zach, posted about yesterday.

Behaviour (coupled with Prototype) gives you easy-to-follow separation of javascript and HTML. Hugely cool. Hugely useful. Here’s an example:

The HTML:

<ul id="example">
  <li>
    <a href="/someurl">Click me to delete me</a>
  </li>
</ul>

The Javascript:

var myrules = {
  '#example li' : function(el){
    el.onclick = function(){
      Element.removeChild(this);
    }
  }
};

Behaviour.register(myrules);

That example creates a bulleted list (as is readily obvious in the HTML code). What nifty is the Behaviour Javascript logic. myrules says that any <li> tag with a parent id of #example will have an onclick that causes the li tag to be removed.

And of course, besides Behaviour there is a slew of other solutions that when combined together make for a sweet, modularized, separated solution. Here’s what I use for my PHP/Ajax applications:

Here are some standards I stick to:

  • Keep CSS (.css) styles separate from the Template files
  • Keep JavaScript (.js) files separate from Template files
  • Keep HTML in the Template, don’t spatter it around the PHP scripts
  • Modularize as much as possible
  • Heavy Code reuse

The Drawbacks

Obviously in a Templated/Event Handled environment there are some drawbacks and I’d be stupid not to mention them. Here goes:

  • There is some overhead when using a templating engine. With XTemplate, the layout engine is a PHP class that loads the template and parses through it as dictated by the application functions
  • True separation – separating out your Javascript into .js files, your CSS into .css files, your server-side scripts into various files (the initial script, a functions script, and your ajax handler(s)), and your layout into template files – generates a lot of files to deal with. The larger your application, the more you will need to micro-manage the organization of these files, which in and of itself can be a daunting task.
  • Ummm…I can’t think of any more just yet. I’m sure more will come when I’ve lived in this environment a lot longer.

Summary

Layout and Logic separation is a beautiful thing; keeping one language from another has some true value in readability. To do it half-way gains you nothing. True separation has been a blessing in my development and debugging. If you haven’t at least tried it, check it out, it may be what you were looking for (even if you didn’t know it).

Oh and a definate Kudos to Zach Tirrell for starting me down the road of templating and Gmail/Google Maps/Casey Bisson for driving me to check out Ajax.

MasterWish Enters the Web 2.0 World

MasterWish has been my labor of love for the past 6 months. The site – create by Zachary Tirrell, Jon Emmons, and myself – was opened to the public (in beta mode) in the middle of September.

Over the past month, we’ve been pretty excited about the whole Web 2.0 craze. The initial release was fairly solid but it lacked a few key elements to make it a 2.0 application. The three of us have wanted to bring MasterWish fully into the Web 2.0 world, so with a great deal of planning and even more coding, I am comfortable to say that MasterWish is now a fairly solid Web 2.0 application.

MasterWish has:

  • Folksonomy Features (tagging)
  • Easy item adds via a Favelet
  • Ajax for quick and easy assignments of items to lists, buddies to groups, buddies to your buddy list, copying items from other people, etc.
  • Buddies/Contacts
  • Group-Level access to Categorized Wish Lists
  • Fine-grained access control on your user information (so you can distribute information to people on a case by case basis). Here are some things you can distribute to other users:
    • Real Name
    • Address
    • E-mail
    • Many clothing sizes (shirt, bra, inseam, ring, head, etc)
    • Color Preference
    • etc.

Currently we are working on a very sweet feature to allow for collaborative lists. This will make wedding registries a LOT easier and my office at Plymouth State (which currently uses MasterWish for book orders) will be able to create an office wishlist and allow multiple users to contribute.

Christmas is coming around the corner, so if you haven’t checked it out for your wishlist needs, you should do so. You definately won’t regret it…and your family will thank you for it!

MMORPGs and Perception of Value

I made a post a little while back that on MMORPG Cheating and received a very interesting and convincing argument from Gaming Freedom that I thought warranted another post. Basically, the previous post was to emphasize how MMORPGs should be taken a little bit more serious when it comes to its future and how they will function as a major recreation tool the world over. I feel this is becoming more of a reality. (see my post on World of Warcract and the future of MMORPGs).

In my previous post on MMORPG Cheating, Gaming Freedom disagrees with my analogy of Racing and fines/rules due to in-game actions. Gaming Freedom makes some good points an writes:

[...]
You’ll never see laws like [those appearing in China] in the states because virtual items don’t cost anything to produce. Yeah, YOU had to work really hard to get that uber sword of usefullness, but that doesn’t mean it has a value. It’s a 1 on a server somewhere. Anyone, with sufficient rights, could choose to give that sword to you. Cars are not the same way. When you damage one there is no easy way to fix it, and the destruction has real costs involved.

Another reason your debunking of the car analogy fails is that you’re ignoring WHERE the fines and suspensions come from. They do not come from state or federal or even county law. They come from the organization which complies with the county, state, and federal laws and THEY are held accountable first. They can then pass off blame if they want, but at the end of the day it is the racetrack, or gaming company, who is ultimately responsible for what happens in it’s private club.

Society will draw the line, I predict, at value. So long as MMORPG’s are housed on servers, and so long as “items” are nothing more than database entries, they will not have any value. No value, no crime. You’ll see legislation around harrassment long before you see it around theft.

The argument has some good points but I don’t fully agree and believe a few points are slightly over-generalized. Its all about:

Perception of Value:
While I agree that the argument can (and is often made) that items in a game have no value…that they are simply entries in a database owned by the company that has ‘invented’ said item. This argument is flawed in that value is all about perception. An object or idea has value because someone believes it has value. I could own a facial tissue that was used by Britney Spears at a concert and cherish it (assuming I like Britney Spears) and consider it extremely valuable. Collectors of oddities such as this may agree with me. Now, what if I had bought that tissue on e-bay for $327.41 and I kept it in a glass case…if I woke up one morning and found it missing, would I not be able to file a police report and if the perpetrator was caught, bring them to court?

Perhaps a used tissue is not a great analogy. What about a Pet Rock? How about a diamond? What sets a diamond apart from a pet rock? Why is one more valuable than the other? Even if the diamond is un-shaped and un-cut, doesn’t it still have more value than the Pet Rock? The only reason a diamond has more value is because society thinks it should have more value. The argument can be made that diamonds are more rare than a Pet Rock made from a random stone…but the importance of rarity is once again based on society’s perception. Society deems that rarity holds more value.

Here are a few other arguments that can be made in regards to the value of a real-world item holding more weight than an in-game item:

  • A real-life sword has more value than an in-game sword because real world resources were used to create it!
    • Not entirely true. In-game items have gone through a lengthy design/modification process regards to how it looks (art), how it functions (rules), etc. A number of hours have been put into the production of the in-game sword by the company that has produced it.
  • But but but wait! In the above statement you say that the company has produced it…so its the property of the company and is valuable to them and them alone.
    • This is also a bad argument. When you purchase a piece of software…Windows XP, Age of Empires III, Photoshop, etc; the software that you install on your system, its cd, its manuals, etc are all property of the company that produces it. Read the End User License Agreement. You are leasing the product. Yeah, you spent $150 purchasing it but that copy is not yours. However, if someone stole your copy of Windows XP, you can call the authorities and if the perpetrator is found, there will be penalties.
  • Pfft…but an in-game sword is just 1′s and 0′s.
    • So is a piece of software. Software is just 1′s and 0′s.
  • Right right right…but the difference between the in-game sword and a real-world sword is that real-world money was paid.
    • Hrm. Fact. But think about it. In MMORPGs, real-world money is paid monthly to play the game. In the game your $15/month is spent playing and attempting to acquire items you view as valuable in-game.
  • You pay $15/month in game to play the game, not $15/month to buy an item.
    • Another good point. But in all actuality you are paying $15/month for time in game. It takes a great deal of time to attain the appropriate level required to find an ‘valuable’ item and even more time in the act of actually finding the item…which could take days, weeks, months, etc.
  • But now you are saying that the item has value merely because of time…you can’t put a price tag on time.
    • Thats just silly. Businesses/offices the world over fire people for theft of time constantly. Projects are designed and given value based solely on time. Time is a valuable and saying otherwise is just silly…especially when you are paying for that time.

I’m sure there are more arguments and I urge people to post them. In-game items have value because a society believes they have value. That society is the MMO gaming comunity and it is growing. As it grows, we will find that that society will have a larger voice than it does now. What will that voice say when those voices are coming from people of power? Heck, we have a national do not call list because enough people hated receiving telemarketing calls…But when it was the ‘people of power’ received those telemarketing calls and finally got pissed off that donotcall.gov was created along with a threat of fines. What happens when a Congressman plays WoW and get pissed that his Vestaments of Prophecy are deleted by someone who maliciously signed in to his account? What happens when the President’s level 60 Warrior in Lineage II is attacked by an unbeatable-bot and has all his hard-earned weapons stolen?

I do agree with Gaming Freedom in that we will see legislation about harrassment in the US long before legislation on theft. Will it go past that? Hard to tell…Its society’s call. And that all depends on the MMORPG movement.

World of Warcrack and the future of MMOGs

[[innerindex]]WoW Dude I began gaming in the early 90′s. Looking back at what gaming was then compared to what it is today causes me to do a double take. Things have changed so much so fast. Of particular note is the Online Gaming industry. What started out as geek-only text-based fantasy games has morphed into a globe encompassing communication/entertainment mega-games….Massively Multiplayer Online Games (MMOGs). Before I explain my awe when it comes to these games, I’ll start out with a short definition and a little history.

What are MMOGs?

Massively Multiplayer Online Games (a.k.a. MMOG, MMO, MMORPG) are pay-to-play games where a player interacts with an evolving game-world and hundreds (to thousands) of other players at the same time. Within these games, players typically wander around killing monsters, collecting/crafting items, creating organizations, and often times Player Killing (hunting down other players and killing them for experience, loot, or simply just for fun). In addition to the above…MMOGs tend to be highly addictive! I, myself, have been prone to spurts of MMOG addiction :)

A Brief History

I suppose the best way to fully understand these MMOGs is to see where they come from. Back in the ancient days of 1977, the first MUD (Multi-User Dungeon) was born. These geek-only games of sweetness gained popularity due to their ability to connect like-minded fantasy buffs to interact with eachother in a text-based reality, however, the popularity remain primarily in the geek community due primarily to the fact that most MUDs contained no graphics beyond ASCII art. While cool to some, many people found them fairly boring…I mean sheesh. read?!. (I was one of those geeks that played MUDs… EotL to be exact)

It wasn’t until 1997 when Ultima Online launched that MMOGs began to really take off. Ultima Online reached 100,000 users fairly quickly which spurred a whole industry of MMOGs with a variety of gaming engines, rules, and monthly price ranges. Some of the most popular: Asheron’s Call (AC), Dark Age of Camelot (DAoC), EverQuest (EQ), Ultima Online (UO), and the fairly new World of Warcraft (WoW).

Why Are MMOGs So Popular?

Oooo Doggy. Good question. MMOGs aren’t just games for geeks anymore. As the games become more advanced and appealing to the eye, more and more people are buying the games and paying the monthly fees. All types of people! Geeks, teachers, athletes, construction workers, housewives, etc!

  • Its a Role-Playing Game.

    MMOGs allow us to be an object of our own fantasy and participate in a world with very loose rules that allow us expose us to experiences when we want to experience them. In WoW I have the freedom to create a character that walks around being a bastard to people: swearing at them; stealing their items; player killing defenseless characters (griefing). While at the same time I could make a second character that is the perfect angel. Always willing to help those in need; an active contributing member of a guild; a good party member. I could make a third character with a whole different personality. Thats the beauty of it, you can play how you want with minimal fear of Real Life retaliation. You are simply a character on a screen, nothing more. When you get tired, you simply log off the game and you are back to your real life. A co-worker of mine directed me to this essay that explains this mode of thought:

    If you don’t understand the gravitational pull of an MMORPG (Massively Multiplayer Online Role Playing Game), I’m going to enlighten you with just a dozen words: you get to pick what you look like and what your talents are.

    That’s the real beauty of it. The first thing you do in the MMORPG World of Warcraft is design your own body and decide what your strengths will be. You pick your race. What could be more seductive than that, the ability to turn in all of the cards you were dealt at birth and draw new ones from a face-up deck? If you have friends who’ve gotten sucked into the WoW black hole and you don’t understand why they never talk to you any more, this is it. I remember being a chubby teenager with bad skin and astigmatism and pants that didn’t fit quite right. What would I have given to be reborn as a strapping warrior with rippling pecs and armor of hammered silver?

    On that kid’s screen now is a dozen noble warriors of exotic races, brandishing elaborate weapons and charging a gigantic demon across a fire-scarred mountaintop. The dwarf next to him is controlled by an accountant planted at his own computer in Cleveland, two babies sleeping in the next room and his pregnant wife on the sofa. The robed priest in the back casting healing spells is actually a 250-lb. ex-gangster, playing from the computer lab of a maximum security prison in Pennsylvania. The elf on his left, sprinting and drawing his mighty magical bow, is the digital body of a wheelchair-bound 12 year-old girl in Miami.

  • For some its the social aspect of the game. For example:

    I get my kicks from MMOGs for this very reason. Most MMOGs have some ability to create in-game organizations (in WoW they are called Guilds) and from these organizations grows in-game politics. Bylaws are often created; characters vie for rank; hierarchies are established; there are inter-guild events and disputes. It may seem silly at first glance because its “all a game,” but more often than not these organizations are taken very seriously by their members – despite the fact that they may have a guild name like “Vicious Chickens of Bristol” – and many Real Life friendships can be won and lost. So whats the draw? The ability to socialize with people from around the world and organize under one purpose. People are simply drawn to structure and conflict. I am. I love it :)

  • Yet another reason for MMOG popularity is the story.

    MMOGs typically have a wonderfully rich background story that explains the hows and whys of the virtual world. World of Warcraft (yes, I’m using WoW as the example again because I love it so :) ) has a very wonderful story line that allows its characters to participate in quests that unfold the WoW story to that user. The quests can be anything from a short delivery quest where you take one item from point A to point B, or it can be a whole chain of quests that build up an epic plot, OR it can be a comedic side story that gives an amusing reward. In WoW there are hundreds of quests and every few months many more are added/tweaked. The world is constantly evolving giving those that thrive on storylines plenty of story to keep them active for months and months on end!

What MMOGs Have Become

MMOGs have become an addiction and a communication powerhouse.
I’m a World of Warcraft addict. I play a Human Priest (named Heuric) and help run a guild called the Crimson Eagles. The scary thing is, is the fact that I get so excited even talking about the game (whether verbally or typing). It has become a very real part of my social life. And before you can ask the question, I’ll answer it: No, it is not my only social life…I spend maybe 5-15 hours a week in the game. Seem like a lot to you? Well, I’m considered an almost non-active member in my guild. There are people I know that spend almost all their time at home playing these games…sometimes more than 40 hours a week!

You see…weekends allow for game play times of 10+ hours straight! I have been known to do this and have also been known to forget to eat because of it. Yeah. I often suffer from the “five more minutes….I just need to kill 3 more” syndrome. Well sometimes I don’t miss just one meal…I sometimes may miss 2 and on a couple of rare occasions I have missed 3. Remember when I said that I am considered pretty inactive? Scary huh? Thank god I have a wife that keeps me in line :) (I only miss meals when I’m home alone)

Its an MMOG addiction. And I’m not alone. There are over 3 Million people in the world that own and play World of Warcraft…and thats just one game!

Ten years ago when I wanted to talk to one of my friends, I’d call them up on the phone. 7 years ago I’d e-mail them. 4 years ago I’d instant message them. Now…I log in to WoW. There they all are, running around PKing in Alterac Valley; questing in Searing Gorge; trading in Iron Forge; raiding in UBRS; or grinding in the Western Plaguelands. (all locations in WoW). Despite the fact that they are all doing their own thing, I can type or pop on a headset microphone and and talk to them. We plan get togethers, discuss work, news, politics, religion, etc…right there in game.

MMOGs have become a source of income (and I’m not talking companies)
WTF!?!?! Yeah. People can play for money. While generally frowned upon by both the companies that produce the games and by the average player, the buying and selling of accounts, items, and in-game currency has become a very profitable business. Here’s an article at TechAngel that talks of a man that makes ~$1,800 a month! In this article at 1up.com they explain how game profiteers are establishing Gaming Sweatshops in China, India, Mexico, etc where people are forced to play outrageous hours farming in-game currency for measely wages ($0.59/hour).

This is bad on multiple levels…first and foremost, the workers work long hours for very little money and are placed in situations where if the quit their jobs they’d lose their homes too. Its also bad for in-game economy. (yes, these virtual worlds have their own economy) These gold farmers jack up the prices of items causing many under-handed players to resort to purchasing money on E-bay and various game currency reseller sites…just to purchase a rare item in game! Its amazing to what lengths someone will go simply for the satisfaction of attaining certain items and a certain in-game status.

Where are MMOGs going?

They aren’t leaving any times soon, thats for darn sure. I can speculate that they will continue to grow in popularity and be taken more seriously. Even now we are seeing how serious some are taking these ‘games.’ MSNBC has an article where one man killed another because an in-game sword was stolen…Its a sad story that shows just how real some people believe these to be:

Qui went to the police to report the “theft” but was told the weapon was not real property protected by law.

“Zhu promised to hand over the cash but an angry Qui lost patience and attacked Zhu at his home, stabbing him in the left chest with great force and killing him,” the court was told.

More and more online gamers were seeking justice through the courts over stolen weapons and credits, the newspaper said at the time the case went to trial.

“The armor and swords in games should be deemed as private property as players have to spend money and time for them,” Wang Zongyu, an associate law professor at Beijing’s Renmin University of China, was quoted as saying.

As these incidents occur (and mark my words…more will come) what laws will be birthed because of them? Southeast Asia tends to be on the bleeding edge of gaming/tech culture and obsession. It is here that many of the ‘firsts’ occur (such as the murder mentioned above). Because of these incidents they are attempting to prevent them with some interesting laws:

What laws will carry over world wide? Will there be Real Life implications for what we do in game? Only time will tell…and I will be watching the clock with curiosity and a wary mind.

UPDATE (9/7/2005):
It seems that Slashdot has a post going on how WoW is now the 800-pound gorilla in the room…the big question from the New York Times:

WoW is now the 800-pound gorilla in the room. I think it also applies to the single-player games. If some kid is paying $15 a month on top of the initial $50 investment and is devoting so many hours a week to it, are they really going to go out and buy the next Need for Speed or whatever? There is a real fear that this game, with its incredible time investment, will really cut into game-buying across the industry.’ What is the Slashdot opinion on World of Warcraft’s impact on the gaming industry?

Don’t Use the Internet

Oh man. Friday I bought the domain name DontUseTheInternet.com. The purpose of the site will be to blog all kinds of complaints as to why we should boycott the internet…on the internet. Anyhow, that same day I purchased the domain, some dude up in Canada was looking at that domain name too. He saw that I had purchased it and decided to send me the following e-mail:

Hi, Matt.
I’m D____ F_______, from ________ Canada, … and I love using the internet, and often look for interesting domains.

Wow, I couldn’t believe it as I had a brainwave to suddenly check out your domain name, just to see if someone bought such a unique domain name such as yours of …

www.DontUseTheInternet.com

And guess what, I see that just yesturday, you bought it, too … wow, what coincidence.

I doubt if I would have ever bought the name, myself, but who knows, and if I would have, I would have been so dissappointed that I missed buying it by one day.

Anyway, I suppose I am curious just as to why you would actually buy a domain such as this?

Is it just for unique novel purposes (such as to what I would have used it for), or is it that you actually do not believe in using the net, if I may ask?

Ok, well pleased to have made your aqquaintance, and if you don’t reply, well I will just have to return to your site, sometime and check it out to see what you will put up on it (as at present you only have the “parent dir” on it).

bye for now, D_____

To which I replied:

Hi, D_____

I don’t believe in using the internet. Everytime someone uses it, God kills a puppy.

-Matt