Archive for category Technology

Minecraft Server is coming back

UPDATE 20120806 0746 hours:  Since some folks have asked, here’s the init script I’m using to control the minecraft server.  It runs on CentOS (royalty-free rebranding of Red Hat Enterprise Linux):

#!/bin/bash
# /etc/init.d/minecraft
# version 0.3.7 2012-03-06 (YYYY-MM-DD)

### BEGIN INIT INFO
# Provides:   minecraft
# Required-Start: $local_fs $remote_fs
# Required-Stop:  $local_fs $remote_fs
# Should-Start:   $network
# Should-Stop:    $network
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description:    Minecraft server
# Description:    Starts the minecraft server
### END INIT INFO

#Settings
SERVICE='minecraft_server.jar'
OPTIONS='nogui'
USERNAME='miner'
WORLD='world'
MCPATH='/opt/minecraft'
BACKUPPATH='/media/archive/minecraft.backup'
CPU_COUNT=1
INVOCATION="java -Xmx1024M -Xms1024M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts -jar $SERVICE $OPTIONS"

ME=`whoami`
as_user() {
  if [ $ME == $USERNAME ] ; then
    bash -c "$1"
  else
    su - $USERNAME -c "$1"
  fi
}

mc_start() {
  if  pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is already running!"
  else
    echo "Starting $SERVICE..."
    cd $MCPATH
    as_user "cd $MCPATH && screen -dmS minecraft $INVOCATION"
    sleep 7
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is now running."
    else
      echo "Error! Could not start $SERVICE!"
    fi
  fi
}

mc_saveoff() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... suspending saves"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-off\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
    sync
    sleep 10
  else
    echo "$SERVICE is not running. Not suspending saves."
  fi
}

mc_saveon() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... re-enabling saves"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-on\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
  else
    echo "$SERVICE is not running. Not resuming saves."
  fi
}

mc_stop() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Stopping $SERVICE"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map...\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
    sleep 10
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'"
    sleep 7
  else
    echo "$SERVICE was not running."
  fi
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Error! $SERVICE could not be stopped."
  else
    echo "$SERVICE is stopped."
  fi
}

mc_update() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running! Will not start update."
  else
    MC_SERVER_URL=http://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar?v=`date | sed "s/[^a-zA-Z0-9]/_/g"`
    as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"
    if [ -f $MCPATH/minecraft_server.jar.update ]
    then
      if `diff $MCPATH/$SERVICE $MCPATH/minecraft_server.jar.update >/dev/null`
      then
        echo "You are already running the latest version of $SERVICE."
      else
        as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/$SERVICE"
        echo "Minecraft successfully updated."
      fi
    else
      echo "Minecraft update could not be downloaded."
    fi
  fi
}

mc_backup() {
   mc_saveoff

   NOW=`date "+%Y-%m-%d_%Hh%M"`
   BACKUP_FILE="$BACKUPPATH/${WORLD}_${NOW}.tar"
   echo "Backing up minecraft world..."
   #as_user "cd $MCPATH && cp -r $WORLD $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`"
   as_user "tar -C \"$MCPATH\" -cf \"$BACKUP_FILE\" $WORLD"

   echo "Backing up $SERVICE"
   as_user "tar -C \"$MCPATH\" -rf \"$BACKUP_FILE\" $SERVICE"
   #as_user "cp \"$MCPATH/$SERVICE\" \"$BACKUPPATH/minecraft_server_${NOW}.jar\""

   mc_saveon

   echo "Compressing backup..."
   as_user "gzip -f \"$BACKUP_FILE\""
   echo "Done."
}

mc_command() {
  command="$1";
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    pre_log_len=`wc -l "$MCPATH/server.log" | awk '{print $1}'`
    echo "$SERVICE is running... executing command"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"$command\"\015'"
    sleep .1 # assumes that the command will run and print to the log file in less than .1 seconds
    # print output
    tail -n $[`wc -l "$MCPATH/server.log" | awk '{print $1}'`-$pre_log_len] "$MCPATH/server.log"
  fi
}

#Start-Stop here
case "$1" in
  start)
    mc_start
    ;;
  stop)
    mc_stop
    ;;
  restart)
    mc_stop
    mc_start
    ;;
  update)
    mc_stop
    mc_backup
    mc_update
    mc_start
    ;;
  backup)
    mc_backup
    ;;
  status)
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is running."
    else
      echo "$SERVICE is not running."
    fi
    ;;
  command)
    if [ $# -gt 1 ]; then
      shift
      mc_command "$*"
    else
      echo "Must specify server command (try 'help'?)"
    fi
    ;;

  *)
  echo "Usage: $0 {start|stop|update|backup|status|restart|command \"server command\"}"
  exit 1
  ;;
esac

exit 0

[[Category:Server]]

And then this is the crontab entry to run the backup every 30 minutes:

0,30 * * * * mount /media/archive && /etc/init.d/minecraft backup; umount /media/archive

UPDATE 20120703 1110 hours:  The server is open for business at IP 67.53.8.172.  I will register a DNS entry shortly.  Currently we have only Bjorn and myself whitelisted.  Post a comment to this page to add your name and tell me who you are.  ATM, only IRL friends are welcome here.

Read the rest of this entry »

38 Comments

Priorities

Since I have no money to spend on camera gear, I’ve been reading the fora and reviews online of different lenses I’m thinking of getting at some point and I’ve come up with a set of priorities based on what I’m currently using and the kind of shots I like to take:

Priority

EF 50mm f/1.8 II         $125.00
EF-S 55-250mm f/4-5.6 IS II     $299.00
EF 85mm f/1.8 USM        $419.99
EF-S 60mm f/2.8 Macro USM    $469.99
EF-S 10-22mm f/2.5-4.5 USM    $859.99
EF 28mm f/2.8 USM        $509.99
EF 100mm f/2 USM        $499.99

Read the rest of this entry »

Leave a comment

Sysadmin Day Celebration

On Friday, July 27, I will be celebrating System Administrator Appreciation Day (and potentially getting a job, depending).  My default place to celebrate is Old German Beer Hall.  But there are some others.  As I am fond of polls, here’s one:

3 Comments

How do I know what primes to buy?

I’m a big advocate of prime lenses in place of zooms.  But if you’re not sure which focal lengths you use the most, here’s a way to find out:  Extract the EXIF data from your images, find the FocalLength entry, and count the number of occurrences of each focal length:
Read the rest of this entry »

8 Comments

Canon Standard Lens Lineups

I’ve put together a few packages of Canon EF lens lineups for standard photography:

Read the rest of this entry »

1 Comment

Gift Ideas ;)

If anyone is thinking of spending a few thousand dollars on a gift for me (XD), this page has the lenses that will fit my camera body.  Any lens on that page would be a welcome addition to my gear except the following:

  • EF 8-15mm f/4L Fisheye USM
  • EF-S 18-55mm f/3.5-5.6 IS II (came with my camera body)
  • EF-S 18-135mm f/3.5-5.6 IS STM
  • EF 15mm f/2.8 Fisheye
  • EF 40mm f/2.8 STM
  • Any of the TS-E lenses.

Leave a comment

Ruby is rolling on Rails

So I’ve decided to learn Ruby on Rails.  I’ve so far gotten a new generic template up and running on my server.  Don’t bother trying to hit this URL from your browser – it won’t work outside my LAN.

Ruby on Rails landing page

Ruby on Rails landing page

Leave a comment

Head to head compare of Canon EF-S 18-55mm f/3.5-5.6 IS II and Canon FDn 50mm f/1.4

Canon EOS Rebel T3, same settings on both, 50mm focal length.  EF-S 18-55mm f/3.5-5.6 IS II is listed first.

Read the rest of this entry »

Leave a comment

Embracing the Dark Side

For years, I’ve resisted the move to the Microsoft way, it being driven entirely by warped corporate logic rather than technical excellence and innovation.  But it seems now that in the enterprise, Linux and Perl are now completely irrelevant.  One recruiter I met with had never even heard of them.  So I’ve decided to learn C#, ASP.NET and Microsoft Sharepoint, as well as how to develop apps for Android.  I still need a job and if learning .NET and Sharepoint is the only way to stay in IT, then I guess I have to.

I’ve seen tons of hype that the Cloud will generate 15 thousand IT jobs but does anyone actually know how to learn the skills employers want in whatever it is cloud people do?

Leave a comment

Learning in spare time

As things move to the cloud, I find it’s becoming more difficult to learn essential IT skills on your own.  I used to be able to learn some basic system admin skills, software development skills, etc. on a home PC or maybe a home LAN setup with Linux, cheap-to-free tools, evaluation versions, etc.  Nowadays, I’m finding it difficult to learn how to do stuff they’re asking for in job descriptions like “Large multiglobal enterprise support” and “Netscaler” and “IBM Websphere” and VMWare and Windows Server.  Seriously – I can’t afford to buy a Windows Server license just to learn Windows server!  Nor can I buy a large enterprise (complete with private cloud and SAN and other current IT stuff) to learn how to work in one.  How do I get those skills?

Leave a comment