Feed off of my gaming brain

Posted by Jeff Beeman on Sat, 01/26/2008 - 12:35

Yes, you too can be a gaming news zombie! If you're interested in following the various things I find interesting in the world of gaming - including news, indie games, interesting commentary, etc. check out my gaming-specific feeds below. For my overall Del.icio.us and Google Reader feeds, see the sidebar.

EDT791: Choosing a game

Posted by Jeff Beeman on Wed, 01/23/2008 - 16:54

It took me over a week to do so, but I think I've finally chosen a game to play for class. Picking a game was actually more difficult than you might imagine. The requirements are pretty open-ended - the game needs to be something I've never played, and should (hopefully) last me fifty hours or more. The hard part? I have this tendency, due to what I like to call "Gamer ADD," to buy, borrow or rent a game I'm interested in, play it for anywhere from an hour to several or countless hours, and then stop when the next must-play game comes along. The effect of this has ended up being that I've me played a good portion of the games I'm interested in, while having not really played them.

Rogue Galaxy box coverI certainly thought about quite a few games during the process: RPGs such as Rogue Galaxy or Neverwinter Nights 2; MMOs like Hellgate: London or Lord of the Rings Online (LOTRO); or completely non-RPG games such as The Sims 2 or Starcraft. I played a bit of the original Neverwinter Nights several years ago, so it's sequel would have been pretty familiar. I played a demo of Hellgate: London, and reviews have been so mixed that I tossed it off the list quickly. LOTRO was definitely an option... but my countless hours with World of Wacraft (which is why it wasn't an option) spoiled me on MMOs, and would certainly taint my view of the experience. The Sims 2 would probably be really interesting, but it seemed so... obvious; and Starcraft may have been cool, too, but something tells me it could be a bit... scary. So, none of these games would work. Rather, they would work, but none of them felt right, and if I'm going to be given the opportunity to play a game for school, it's got to be perfect.

I decided to make the decision a bit easier on myself. I'd pick a couple of role-playing games that have been on my wish list, and I made sure they came out within the last year. There were two games that had been calling to me for months and, I've got to be honest, they were each at the front of my mind as I went through the exercise of weeding out the other games. But I had to be sure, so I went through the others anyway. I'll preface these two by saying that once I decided they were contenders for my list, I tried to essentially ignore any media coverage about them. They've both been out for months, so I obviously couldn't do so retroactively, but I have a a fairly short term memory, so I was able to approach both games with pretty fresh eyes. I say that to essentially buy myself the ability to be completely wrong about my impressions of the games and have no accountability for it.

The Witch box coverThe Witcher intrigues me to no end. Everything I've heard about it says that it's one of the few mature-rated games that really takes its rating seriously. From the ground up, it's a game built for adults. It's dark, gloomy, curse-filled and violent. The narrative is complex, deep, full of moral ambiguity and tough decisions. It has sex. Gamers I trust recommend it whole-heartedly. As a late-twenties gamer, it's pretty much everything I want in a game, with the veritable cherry on top. As the industry grows, we're starting to see more experimentations and risks with genres and audiences like this. Much in the way the massive size of the film industry allows incredibly niche indie films to find success, the explosive growth of the gaming industry opens up room for games like The Witcher, which is really one of the reasons I'm so interested in the game.

In spite of how badly I wanted (and still want) to play The Witcher, there's a game that ended up calling to me even more: Persona 3 (P3), mostly because of its convenient relevance to the topics of the class. P3 is the latest entry in the Shin Megami Tensei (SMT) series of games, of which I've played (and not yet finished) Digital Devil Saga (DDS). The SMT games all have the same general premise: demons (or "devils") are trying to do something bad, and you're there to try and stop them. The stories are generally fantastic, if occasionally quirky or melodramatic.

Persona 3 box coverYet, however similar the background is, P3 seems to be quite a departure from the DDS-style of presentation. DDS was a hardcore RPG with a story that took itself pretty seriously - occasionally too seriously. P3 seems to embrace the quirky nature of its premise, while also blending role-playing, adventure and simulation genres in a way not really seen yet in the western marketplace. The same "terrible creatures lurk[ing] in the dark" premise exists, along with the fairly standard (yet also innovative in its own way, from what I gather) console-style RPG battle system. Yet, what pulls me to the game, is the emphasis on what happens when you're not battling demons and trying to save the world.

P3 bases a large amount of its game play on the relationships you establish with other characters in the game. During the daytime hours, you play a student (or group of students? not sure yet...) who has to do all the normal things a kid does in at school - attend class, make and keep friends, study, etc. Ideas like this have been explored before to pretty good effect in games like the very misunderstood Bully, but in this case P3 seems to take the general idea of throwing the player into a school environment one step further. I can't say it much better than is written on the back of the game's box, "Tap into the power of Social Links: as your friendships grow stronger, so will your mastery over Persona." Relationships in the Persona universe become vital to the game play. I can infer from this that if I choose to ignore my friends, I will be worse at the game; and, to flip that around, as I strengthen my relationships with my school mates, I will succeed in the game. The implications of this concept are pretty powerful, when abstracted from the game world that it exists in.

So, I've chosen Persona 3 as the game I'll be spending my time playing, analyzing and critiquing for the next few months of class. Throughout the process, I'll cover a bunch of topics, including whether or not my impressions of the game are realized once I start playing it (an interesting study unto itself). One of the incredible things about the process of picking the game - which is not one I generally spend much time thinking about - is the sheer number of things I now realize I subconsciously consider every time I decide what to play next. A lot of this has to do with my identities as a gamer, as a real-world person (who happens to be a gamer) and as the person I want to become (notice how sports, racing and war games weren't even in my list of considerations). But I'll save that discussion for the next post...

EDT791: Video Games, Literacy and Learning

Posted by Jeff Beeman on Sat, 01/19/2008 - 18:26

This past Wednesday, I started my second semester of the Educational Technology (EDT) master's degree at ASU. Last semester, I realized just how difficult having a demanding job and going to school could be, so I decided to cut back this semester to just one class. That one class is Video Games, Literacy and Learning, and if the first class is any indication, it should be a real blast.

I've had a hard time explaining the course to my wife, friends and colleagues without getting eyes rolled skyward and sarcastic mumbles about how "hard" my homework will be. In spite of that, I do believe the class will be more difficult, and much more work, than they think. Our main assignment for the semester is to play at least 50 hours of a game (or multiple games, if we beat one before 50 hours is up), keeping a weekly journal of writings about our experience as it relates to the material we're learning in our readings and course discussions. These readings will be fun, but based on educational theory, concepts of learning, and won't exactly be "easy." However, if know my enthusiasm for gaming, you'll know right away how exciting this is for me. If you don't, well, continue reading...

I've been playing games for as far back as I can remember. I literally cannot remember a time when we didn't have some sort of gaming system in the house growing up. At some point when I was no older than 5, my dad brought home an Atari 2600. I can't remember every game we had at the time, but I have remarkably clear memories of sitting in the living room on beach towels with my brother - both of us in wet swimsuits and eating Peter Piper Pizza - and playing Pitfall, Missile Command, Pac-Man, or the absolutely terrible game that for some unholy reason we loved at the time: E.T.

Around this time, both my dad and my grandfather were getting into computers, and I was able to get exposed to quite a few cool PC games. On our old XT, I had the good fortune of playing text adventures like Zork, whiz-bang games like Mean 18 and a few fun educational games that I can't remember the titles of now ([something] Castle, sounds familiar...). These games were my initiation into the world of the personal computer. I give large credit to my dad and grandpa's interest in computers, and their encouragement and desire for me to explore them, to my passion and success as a web developer today.

Eventually, we got a Nintendo for Christmas, along with Super Mario Bros., Metroid and Kid Icarus. We played, rented and bought games for it until one summer, when we got a Super Nintendo, for good grades. The Super Nintendo was my introduction to "real" role-playing games, with Final Fantasy II and III (now known as IV and VI, respectively), Chrono Trigger, Secret of Mana and similar games. It was also the home of Super Street Fighter, Super Mario World, and countless other games that truly made me fall in love with gaming. During this time, we also got a 386 PC, which I used to play King's Quest VI, Doom, Tie Fighter, Civilization, SimCity and dozens of other fantastic games.

From there, the rest isn't entirely worth relating in detail, as it's really just more of the same, albeit on different systems and with different games. I can't emphasize enough, though, the importance of the fact that throughout our childhood our parents never tried to prevent our gaming - in fact they frequently encouraged it. When I was broke in college, my mom threw me a bone for Christmas and bought me a PlayStation 2 with Final Fantasy X and Grand Theft Auto III. Both my mom and dad put up with literally hours upon hours of my brother and his friends obnoxiously playing Goldeneye 007, calling each other names and arguing over whether the "computer was cheating." It probably seems like no big deal, but as a grownup who now witnesses, on a daily basis, other grownups look down their noses at gamers as though their entertainment is somehow less valid than theirs, I now realize how lucky I was to have parents who were so open to gaming as a hobby.

This post is just the first of many for EDT791. We'll be exploring topics such as Games as complex systems: Domains of meaning and practice; Fish tanks and sandboxes: Entering the game; Identity and learning in games: Motivation and commitment; Complex and specialist language learning through games; Playing and learning: Failure, practice and mastery; and much, much more. So, if you're interested in following my work in the course, I'll be tagging all everything for it as EDT791 and Gaming, so you can follow along with the posts on those pages, or just by following the feed for my front-page posts.

Just got rolling with a VPS on Linode (Part 2)

Posted by Jeff Beeman on Wed, 01/16/2008 - 23:48

Now that I had a demonstrably working and functional web server going on my Linode (see Just got rolling with a VPS on Linode (Part 1)), it was time to get the rest of my toolkit on the box, setup users and secure the server a bit.

Installing Subversion and migrating repositories

Well, installing Subversion couldn't be any simpler:

apt-get install subversion

Login to old server and dump current repositories:

svnadmin dump /path/to/repository > repository.dump

Copy dump file to new server, and on new server:

svnadmin create /path/to/repository
svnadmin load /path/to/repository

Adding users and groups

I decided I didn't want to be logged in as root all the time, especially since I'll most likely be bringing some other folks in to work on the server in the future. So, I setup the admin group, created myself a new user and put myself in both the admin and staff groups.

addgroup admin
adduser jrbeeman
usermod -G staff,admin jrbeeman

Next, I wanted to make sure admins could sudo to root, so that they could install programs and do other root-y things. The sudoers file, as far as I can tell, can only be edited with the command visudo:


...and added the line:

%admin ALL=(ALL) ALL

Setting up the firewall

This was probably the least-traveled territory in the whole VPS setup for me. Thankfully, there is an awesome resource in the website IP Tables Rocks, with a full rundown of how to lock down unneeded ports. It emphasizes locking down everything, and then only opening up those services you want open. I essentially followed the tutorial, but proceeded to lock down every port except those that I knew I would need for web services and working with the server (22, 80, 443, etc.)


By this point, I've started working on getting the Gamers With Jobs development site migrated over, and I'm working on nailing down any performance issues. As I said in part 1, the main reason for going to a VPS was the sheer size and load on the GWJ site and how shared hosting was really hosing the speed. Most of the tweaks from here on out are related to the GWJ site.

Tweak MySQL settings

Since the Gamers With Jobs site is very database intensive, getting MySQL to perform optimally given the site's load is important. I'm still tweaking these settings here and there, but here's what I'm at so far. I'm attempting to go for large enough buffers and caches to keep things snappy, but without bloating out the caches to the point that things slow down.

# * Fine Tuning
key_buffer = 256M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
#max_connections = 100
table_cache = 256
thread_concurrency = 4
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
# * Query Cache Configuration
query_cache_limit = 1M
query_cache_size = 16M
# Turn on slow query logging to help track down performance killers
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 5
# Some further table-type tweaks
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

Bringing over the GWJ site required quite a bit of scripting of INSERT and DELETE statements that fudged with table lengths, so I also optimized all the tables with free data space:

-- Get the table names...
-- ...and run the following for each
OPTIMIZE TABLE table_name;

Tweak Apache settings

The YSlow utility from Yahoo is a great way to track down potential end-user performance issues, so I ran it against the GWJ dev site and tweaked quite a few things to improve the rating and speed reported there.

First, I needed to enable a few Apache modules:

a2enmod deflate
a2enmod expires
a2enmod cache

Then, in /etc/apache2/httpd.conf, I added the following lines to the stanza of the GWJ virtual host definition:

# Gzip html, css, js, etc.
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript application/json
# Set expires headers on html, css, js, etc.

ExpiresActive On
ExpiresByType text/html "access plus 1 seconds"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"

# Set ETags
FileETag MTime Size

Install memcached

In order to squeeze a bit more performance out of the server, I decided to install memcached and the related Drupal module, which allows you to configure Drupal to store certain cache data in memory. I essentially followed the instructions in Robert Douglass's article on Lullabot, but with a couple of modifications.

First, libevent1-1.3b and memcached-1.2.1-1 can be installed via apt-get on Ubuntu gutsy, all with:

apt-get install memcached

Then, I enabled the Apache module:

a2enmod mem_cache

Install eaccelerator

Not much to write here, aside from noting that I followed the great article on 2Bits to get going.

Done... sorta

Seeing how I started writing this article a couple of weeks ago and am just getting around to publishing it, I think I'll call it "finished," for now. I hope that someone out there finds this useful!

Useful TextMate Snippets for Drupal

Posted by Jeff Beeman on Wed, 01/16/2008 - 01:38

I took a few minutes this evening to whip up some TextMate snippets that I think will be useful for Drupal development. They're nothing fancy, and certainly not as ambitious as Steven Witten's kitchen sink approach, but I think it'll simplify one of the most repetitive tasks I usually find myself in when writing a new module.

These snippets all use TextMate's built-in tab stop handling, which allows you to quickly insert the snippet and then just tab through all the relevant places where you'd need to change something. Give it a try - especially with the .module file snippet.

Initial setup

  1. Open up TextMate
  2. Go to the Bundle Editor (Bundles -> Bundle Editor -> Show Bundle Editor, or ctrl+option+cmd+b)
  3. Add a new bundle and call it "Drupal"
  4. From here out, each snippet can be added by choosing "New Snippet"

The .info file

I called this one "Module info file" and gave it the tab trigger drupmod_info. I haven't figured out how to get this one to actually render via a tab trigger, but it's easy enough to just navigate to the Drupal bundle and choose the snippet.

; \$Id\$
name = "${1:Example module}"
description = "${2:Example module description}"
dependencies = $0

The .module file

This snippet uses TextMate's variable mirroring to let you quickly rename all the hooks in the snippet with the first tab stop. I used the hooks below because most of my modules implement these hooks. Just follow the pattern for naming, etc. to add your preferred hooks.

I called this one "Module general hooks" and assigned it the tab trigger drupmod_m.

// \$Id\$

* Implementation of hook_perm
function ${1:example}_perm() {
return array(
'${2:example permission}',

* Implementation of hook_menu
function ${1:example}_menu($may_cache) {
$items = array();

if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/${1:example}',
'title' => t('${3:Example}'),
'callback' => 'drupal_get_form',
'callback arguments' => array('${1:example}_admin_form'),
'access' => user_access('administer site configuration'),

return $items;

* Menu callback - Admin settings form.
function ${1:example}_admin_form() {
$form = array();
return system_settings_form($form);

* Implementation of hook_form_alter
function ${1:example}_form_alter($form_id, &$form) {
switch ($form_id) {
// Alter node edit form
case $form['type']['#value'] .'_node_form':

* Implementation of hook_nodeapi
function ${1:example}_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'delete':

case 'insert':

case 'load':

case 'submit':

case 'update':

case 'view':

The .install file

This one is pretty similar to the .module file, but I tried to make sure it handled some common uninstall tasks I usually forget to tackle until I absolutely have to.

I called this one "Module install hooks" and assigned it the tab trigger drupmod_i.

// \$Id\$

* Implementation of hook_install
function ${1:example}_install() {
switch ($GLOBALS['db_type']) {
case 'mysqli':
case 'mysql':
db_query("CREATE TABLE IF NOT EXISTS {${1:example}} (
id int unsigned NOT NULL auto_increment,
field varchar(128) NOT NULL default ''
) /*!40100 DEFAULT CHARACTER SET utf8 */;");

* Implementation of hook_uninstall
function ${1:example}_uninstall() {
db_query("DROP TABLE {${1:example}}");
$variables = db_query("SELECT name FROM {variable} WHERE name LIKE '${1:example}%%'");
while ($variable = db_fetch_object($variables)) {

Just got rolling with a VPS on Linode (Part 1)

Posted by Jeff Beeman on Sat, 12/29/2007 - 10:36

Note: A large part of this is taken from Victor Kane's article on Awebfactory about setting up Drupal on a fresh Linode, but I've documented some other things here and did some things a little differently than he did, so I figured it'd be worth writing up a post on the process. I've kept the details thin here in places where Victor's notes are more than satisfactory, but I've made sure to note where that happens.

Update: Be sure to check out part 2 of this article, as well.

I've spent the last several months of my off-work hours plugging away at helping the folks over at Gamers With Jobs get rolling with an upgraded version of Drupal, and in the process we decided to move from a shared hosting environment to a place where we've got a lot more control over performance and site configuration. In the meantime, Victor Kane's article on getting Drupal up and running on a Linode came across my RSS reader and provided the kick in the pants I needed to really investigate it. I looked at several VPS options, but in the end Linode seemed to be the best. They offered a seven day money back guarantee, which honestly isn't much, but it was long enough for me to feel comfortable giving it a shot without being out sixty bucks, so I decided to try it out.

Signing up for a Linode account

In spite of all my enterprise-level work at ASU, Gamers With Jobs is one of the most heavily trafficked sites I've ever worked on, so I wanted to choose a hosting option with plenty of RAM and enough monthly transfer to handle the load. I decided to go for a Linode 1080, completed the registration process and had a virtual machine ready to work on within, literally, minutes.

The very slick Linode dashboard reported back to me that the machine was ready to go, so I booted it up and began what I expected to be a fairly painful process - installing the operating system. Here's where I have to make a confession... I've never done this stuff before. That doesn't mean I'm a complete newbie when it comes to working with Linux - I spend pretty much the bulk of every day immersed in the terminal - but I've never run a system at this level before. I was completely confident I'd be able to do everything I needed to, but I was bracing myself for hours of learning. I even asked a couple of good friends if they'd be willing to help out in a bind (they agreed without hesitation, which is why they're such good friends, I guess).

Installing Ubuntu 7.10

With this in mind, I embarked on my journey to install Ubuntu. I had done quite a bit of research on which distribution I should use for the server, and Ubuntu seemed like the best balance between ease of use and functionality. At this point, I was staring at the Linode dashboard, which I figured was deceiving me with how simple it made the next step look. It told me to click over to the distro wizard and choose which package to proceed with. I clicked, saw Ubuntu 7.10 as an option and with guarded excitement, clicked to proceed.

So, as I was saying before, the Linode dashboard is really slick and has an auto-updating "job queue" view that lets you follow some of the server processes you wouldn't normally be able to track remotely, such as disk creation, reboots, OS installs, etc. Well, what to my wondering eyes should I see but this view updating itself rather quickly, telling me that it's creating a disk image and has the OS installation pending. Within about 10 minutes, the dashboard had updated to tell me the everything was ready to go (there are a couple of brief, well explained steps in here where you set your root password, etc.). I couldn't believe it was really this easy, but I clicked over to the "Remote Access" tab of the dashboard, grabbed my IP address and shelled in effortlessly.

Initial Configuration

At this point, I'm essentially following Victor's steps for a while, so if anything is unclear, jump over there for details.

Set the hostname

/bin/hostname jeffbeeman.com
echo jeffbeeman.com > /etc/hostname

Reboot via the Linode dashboard...

uname -a
# jeffbeeman.com

Configuring package management

Setup package management by modifying /etc/apt/sources.list. Essentially I've added the gutsy universe and multiverse repositories and enabled the security updates for those repositories. Here's my current sources.list:

deb http://archive.ubuntu.com/ubuntu/ gutsy main restricted
deb-src http://archive.ubuntu.com/ubuntu/ gutsy main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## universe WILL NOT receive any review or updates from the Ubuntu security
## team.
# deb http://archive.ubuntu.com/ubuntu/ gutsy universe
# deb-src http://archive.ubuntu.com/ubuntu/ gutsy universe

deb http://security.ubuntu.com/ubuntu gutsy-security main restricted
deb-src http://security.ubuntu.com/ubuntu gutsy-security main restricted

## Added by [email protected] on 12/26/2007
## Universe / Multiverse
deb http://archive.ubuntu.com/ubuntu gutsy universe multiverse
deb-src http://archive.ubuntu.com/ubuntu gutsy universe multiverse

## Universe / Multiverse updates
deb http://archive.ubuntu.com/ubuntu gutsy-security universe multiverse
deb-src http://archive.ubuntu.com/ubuntu gutsy-security universe multiverse
deb http://archive.ubuntu.com/ubuntu gutsy-updates universe multiverse
deb-src http://archive.ubuntu.com/ubuntu gutsy-updates universe multiverse

Run an update / upgrade

apt-get update
apt-get upgrade

Installing Apache, MySQL and PHP

# Install mysql
apt-get install mysql-server

# Install Apache
apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert

# Install PHP
apt-get install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

# Restart Apache
apache2ctl restart

Making sure Apache and PHP work

For this, I simply setup a basic phpinfo() file, just to make sure Apache, PHP and all necessary libraries are ready to go. Since Apache is setup to host files out of /var/www by default, I just threw it in there.

echo "" > /var/www/info.php

Then, I opened up a browser and visited (where is the real IP address). I saw the PHP info stuff, and knew I was ready to rock.

Setting up the first virtual host

My trial run was to setup a fresh Drupal install using the jeffbeeman.com domain name, so I opened up /etc/apache2/httpd.conf (which was empty) and added my first virtual host:

NameVirtualHost *:80

ServerName www.jeffbeeman.com
ServerAlias jeffbeeman.com
DocumentRoot /usr/local/www/jeffbeeman.com

Options All
AllowOverride All
Order allow,deny
Allow from all

...and make the folder for the site to live:

mkdir /usr/local/www
mkdir /usr/local/www/jeffbeeman.com

Enabling mod_rewrite

I hadn't seen Ubuntu's (Debian's?) way of setting up Apache 2 before, but it's really quite slick. Enabling new mods, assuming they're installed, is a snap. Here's how I enabled mod_rewrite:

a2enmod rewrite

Installing sendmail

Since I want PHP to be able to send email, this is a necessity.

apt-get install sendmail

Updating PHP settings

Next, I opened up /etc/php5/apache2/php.ini and updated the sendmail path and upload max file size to my preferred default.

sendmail_path = /usr/sbin/sendmail -i -t
upload_max_filesize = 8M

Finally, I did one last Apache restart to ensure everything was set.

apache2crl restart

Creating and granting privileges to the Drupal database

mysql -u root -p


Download and install Drupal 5.5

# Download
cd /tmp
wget http://ftp.drupal.org/files/projects/drupal-5.5.tar.gz
tar xzf drupal-5.5.tar.gz
cd drupal-5.5

# Copy to the virtual host directory
cp -R * /usr/local/www/jeffbeeman.com/
cp .htaccess /usr/local/www/jeffbeeman.com/

# Update settings.php permissions to allow installer to access it
cd /usr/local/www/jeffbeeman.com/sites/default/
chmod 666 settings.php

Install Drupal

Since I haven't touched a web browser since I made sure my info.php file worked, I need to tweak my hosts file a bit so that I can view jeffbeeman.com as hosted on my new site. Since I don't yet want to go through the trouble of actually changing the IP that the domain name is looking at, I'll just update my hosts file to point at the right IP. In OS X, that file is /etc/hosts. I opened it up and added: jeffbeeman.com

Now, any time I go to jeffbeeman.com, I'll see the Linode hosted site. Just for reference, www.jeffbeeman.com still goes to the old server, so I still have access to the live site.

Now that that's taken care of, I can open up a browser to http://jeffbeeman.com and install Drupal. After the install, I changed permissions on settings.php back to read-only and created and set permissions on the files folder.

cd /usr/local/www/jeffbeeman.com
chmod 644 sites/default/settings.php
mkdir files
chmod 777 files

Total work time to get to this point: 1.5 hours

I'll I can say is, "Damn." That was far faster than I expected the process to go.

Read part 2 of this article

Signup Scheduler and Status modules

Posted by Jeff Beeman on Sat, 12/29/2007 - 10:04

Over the past couple of weeks I've put a ton of time into a couple of modules that extend the functionality provided by the fantastic Signup module. Both of these modules come as a result of requirements defined by a project I've got going at work. We're creating a course catalog and the Signup module was our pick for how users "register" for courses. The base module is pretty solid, but we needed some additional functionality to meet the requirements of the registration system.

Signup Scheduler provides users with the ability to administer a node's signups (either by being the node creator or by being a global signup administrator) to set open and close dates for signups on the node. Signups are then opened and closed based on the defined schedule via cron.

While the scheduler module is pretty slick, I'm really excited about the Signup Status module - mostly because it solves several problems for our registration system. The goal of the module is to add the concept of "status" to a user's signup to a node, with status meaning any number of things. User's could be marked as "complete," allowing the node creator (in this case, course instructor) to mark a user as having completed a course. Other states could be "incomplete," "no-show," etc. By default, the module provides two states, "Approved" (the default state) and "Wait Listed," and any number of other states can be added by site administrators that users can then assign to signed-up users.

This functionality essentially provides two major requirements for us - arbitrary status assignment and wait listing. I've still got a bit more work to do on the wait listing functionality to make it really work without confusing the node creator, but essentially the idea is that the "wait listed" state, and any other states an administrator creates, could be marked as modifying the signup total. This will allow node creators to specify, for example, that a course has 10 wait list seats available.

The Signup Scheduler module provides some other notable functionality, as well. Node creators can now print a roster of attendees and signup other users for the node. It also provides what I hope will be a solid API for other modules to tie into, including a couple of hooks that allow other modules to act upon the status change for a user. I'm hoping to spend some time helping getting the base Signup module itself to a state where it has some nice integration points in it like this, too. For example, right now it's not possible to tie into the event of a user's signup being cancelled, or the event of signing-up a user (at least as far as I can tell).

There will be some more fun stuff along these lines over the coming days and weeks, so stay tuned!


Organic Groups - Select Audience by Group Type

Posted by Jeff Beeman on Mon, 12/10/2007 - 19:25

Last week I posted up a new Drupal module that attempts to improve the usability of the Organic Groups module when it's used with multiple group types and large numbers of groups. The module modifies the node edit form's audience selector, provided by the Organic Groups module, such that the groups are selectable by content type. This is useful on sites with a very large number of groups and many different group types. For example, a site like the one this was written for, with Districts, Schools and Interest Groups (all of which are content types defined as organic groups) will have have a node edit form with an individual selector for each group type.

Check it out, if you're an Organic Groups user, and let me know what you think.


New theme

Posted by Jeff Beeman on Sat, 12/08/2007 - 22:28

I was getting tired of my old theme's design and didn't feel like updating it. It's not so much a matter of not wanting to do it as not having the time or ability to design a theme from the ground up. I really like writing the code behind a theme - I've done that many times in the last couple of years - but I just don't have the graphic design skills to come up with something top-notch, like the Deco theme, which I'm using now.

The Deco theme was designed by Klaas Van Waesberghe for the Google Summer of Code 2007. I think it's absolutely fantastic, and I hope it continues to see progress.

Now that I'm back in school, I've been stewing over some ideas for an SOC project for 2008... but more on that later. In the meantime, enjoy the new look!

Journalistic integrity in enthusiast gaming coverage

Posted by Jeff Beeman on Sat, 12/08/2007 - 18:40

In the wake of Jeff Gerstmann's controversial firing from Gamespot, the larger issue of journalistic integrity in the enthusiast gaming press has come to the forefront. I don't have much to say on the issue, aside from echoing N'Gai Croal's we haven't the faintest non-fatal suggestion for how to close up Pandora's box now that it is wide open. If you're not familiar with the story, it started after Gerstmann was suspiciously fired after a negative review of Eidos's Kane & Lynch, which had been heavily advertised on Gamespot in the days leading up to the review. A full rundown can be found at 1Up.

I'm really just writing this post as a way to gather a collection of what I think are some of the most important or interesting links surrounding the issue. Check them out if your interested; but, Croal's article is definitely recommended reading, regardless of your interest in this specific situation.

Subscribe to Home