﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel>
    <title>Lasse Soelberg</title>
    <description>A blog about my endeavours in Computer Science</description>
    <link>http://blog.soelsoft.dk/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://blog.soelsoft.dk/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Lasse Soelberg</dc:creator>
    <dc:title>Lasse Soelberg</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <item>
      <title>Brushes Aliases for SyntaxHighlighter Extension</title>
      <description>&lt;p&gt;I have added a new feature to the SyntaxHighlighter extension for BlogEngine.NET. And that is to see which aliases can be used for each brush. It will only show the aliases for the brushes that are selected in the Brushes section.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.soelsoft.dk/image.axd?picture=aliases.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="aliases" src="http://blog.soelsoft.dk/image.axd?picture=aliases_thumb.jpg" border="0" alt="aliases" width="244" height="124" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The aliases are retrieved from the actual brush JavaScript files . So if a new brush gets installed and selected, the aliases for it will show up in the list.&lt;/p&gt;
&lt;h1&gt;Download the Extension&lt;/h1&gt;
&lt;p&gt;I have added the extension to CodePlex, so the latest version can always be found there.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sh2forbe.codeplex.com/" target="_blank"&gt;SyntaxHighlighter 2.0 For BlogEngine.NET&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.soelsoft.dk/post/2009/05/21/Brushes-Aliases-for-SyntaxHighlighter-Extension.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2009/05/21/Brushes-Aliases-for-SyntaxHighlighter-Extension.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=708f1450-2692-46f3-8fbb-08e88f114d84</guid>
      <pubDate>Thu, 21 May 2009 21:36:00 +0200</pubDate>
      <category>BlogEngine</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=708f1450-2692-46f3-8fbb-08e88f114d84</pingback:target>
      <slash:comments>66</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=708f1450-2692-46f3-8fbb-08e88f114d84</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2009/05/21/Brushes-Aliases-for-SyntaxHighlighter-Extension.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=708f1450-2692-46f3-8fbb-08e88f114d84</wfw:commentRss>
    </item>
    <item>
      <title>SyntaxHighlighter for BlogEngine.NET Extension</title>
      <description>&lt;p&gt;&lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" target="_blank"&gt;Alex Gorbatchev&lt;/a&gt; has made a fantastic piece of software called SyntaxHighlighter, that uses JavaScript to present formatted code posted on a blog. As an example here is a little code snippet formatted as C#&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;// Returns the sum
public int Add(int a, int b)
{
    return a + b;
}&lt;/pre&gt;
&lt;p&gt;And here it is unformatted&lt;/p&gt;
&lt;p&gt;// Returns the sum &lt;br /&gt;public int Add(int a, int b) &lt;br /&gt;{ &lt;br /&gt;return a + b; &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;To make the code use SyntaxHighlighter, it is put inside &amp;lt;pre&amp;gt; tags, where the brush to use is set. The example code including the tags looks like this:&lt;/p&gt;
&lt;p&gt;&amp;lt;pre class="brush: csharp;"&amp;gt;// Returns the sum&lt;br /&gt;public int Add(int a, int b)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return a + b;&lt;br /&gt;}&amp;lt;/pre&amp;gt;&lt;/p&gt;
&lt;p&gt;Before this functionality can be used however, one has to add some JavaScript and Css stuff to the headers of post pages. And in my search for how to add this to my blog, i stumbled upon &lt;a href="http://www.dscoduc.com/post/2008/05/SyntaxHighlighter-Extension-for-BlogEngineNET.aspx" target="_blank"&gt;this blog post&lt;/a&gt; by Chris Blankenship. He had made an extension to BlogEngine that automatically adds the necessary stuff. Very cool I think!&lt;/p&gt;
&lt;p&gt;However, the extension is created for SyntaxHighlighter 1.5 and the one I have installed is version 2.0. And there are some differences. So I set out to modify the extension a little so it would support the new version of SyntaxHighlighter. Those small modifications soon turned out to be big ones, since i wanted dynamic recognition of available brushes. Version 2.0 also comes with styles that can be applied, and I wanted and easy way to change the style. So in the end the extension has gone through a complete rewrite and have got a custom made admin page added as well.&lt;/p&gt;
&lt;h1&gt;Extension Features&lt;/h1&gt;
&lt;p&gt;This is the list of features for the extension:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically imports SyntaxHighlighter JavaScript and Css files. &lt;/li&gt;
&lt;li&gt;The path to SyntaxHighlighters styles and scripts folders can be changed from the admin page. &lt;/li&gt;
&lt;li&gt;The brushes to load is configurable. &lt;/li&gt;
&lt;li&gt;If brushes gets uploaded or deleted, the list of brushes can be updated through the admin page. &lt;/li&gt;
&lt;li&gt;The style used can be set. &lt;/li&gt;
&lt;li&gt;The list of styles can be updated if more styles are added. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h1&gt;Installation&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Download the extension from &lt;a title="CodePlex" href="http://sh2forbe.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Unzip and upload the folders to the root of your blog.&lt;/li&gt;
&lt;li&gt;Open your blog and log in as Admin.&lt;/li&gt;
&lt;li&gt;Go to the Extension tab in the Administration part of the blog.&lt;/li&gt;
&lt;li&gt;Click on the edit link for the SyntaxHighlighter extension.&lt;/li&gt;
&lt;li&gt;Change whatever needs to be changed and save.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Configuration&lt;/h1&gt;
&lt;p&gt;There are three parts in the admin page: Folders, Brushes and Styles.&lt;/p&gt;
&lt;h3&gt;Folders&lt;/h3&gt;
&lt;p&gt;This is where the path to the styles and scripts folders are stored. The path is relative to the root of the blog.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.soelsoft.dk/image.axd?picture=folders.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="folders" src="http://blog.soelsoft.dk/image.axd?picture=folders_thumb.jpg" border="0" alt="folders" width="311" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Brushes&lt;/h3&gt;
&lt;p&gt;Select the brushes that should be loaded. If the installed brushes are changed, a click on the Update Brush List button will load the brushes a new from the scripts folder and it will reset all brushes to the selected state. This setting will only be shown if the scripts folder exists.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.soelsoft.dk/image.axd?picture=brushes.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="brushes" src="http://blog.soelsoft.dk/image.axd?picture=brushes_thumb.jpg" border="0" alt="brushes" width="311" height="263" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Styles&lt;/h3&gt;
&lt;p&gt;This is where the style is chosen. And just as with the brushes, there is a button to update the list if new brushes are added. This setting is only available if the styles folder exists.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.soelsoft.dk/image.axd?picture=styles.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="styles" src="http://blog.soelsoft.dk/image.axd?picture=styles_thumb.jpg" border="0" alt="styles" width="277" height="119" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.soelsoft.dk/post/2009/05/20/SyntaxHighlighter-for-BlogEngineNET-Extension.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2009/05/20/SyntaxHighlighter-for-BlogEngineNET-Extension.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=04d09893-a9f0-4ea2-966a-26319c7bd8b8</guid>
      <pubDate>Wed, 20 May 2009 00:16:00 +0200</pubDate>
      <category>BlogEngine</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=04d09893-a9f0-4ea2-966a-26319c7bd8b8</pingback:target>
      <slash:comments>813</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=04d09893-a9f0-4ea2-966a-26319c7bd8b8</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2009/05/20/SyntaxHighlighter-for-BlogEngineNET-Extension.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=04d09893-a9f0-4ea2-966a-26319c7bd8b8</wfw:commentRss>
    </item>
    <item>
      <title>Script for SVN Backup</title>
      <description>&lt;p&gt;This script is used to control the backup procedure for backing up my SVN repositories. A post detailing the software needed for this script to run can be seen &lt;a href="http://blog.soelsoft.dk/post/2009/05/17/SVN-Repository-Backup.aspx"&gt;here&lt;/a&gt;. This script is originally made by &lt;a href="http://blog.damontimm.com/" target="_blank"&gt;Damon Timm&lt;/a&gt; and can be found &lt;a href="http://blog.damontimm.com/bash-script-incremental-encrypted-backups-duplicity-amazon-s3/" target="_blank"&gt;here&lt;/a&gt;. I will not detail how to use it, since Damon has done a good job at it, so take a look at his site.&lt;/p&gt;  &lt;p&gt;I have made some small modifications to the script. Most important is the possibility to use European buckets with S3.&lt;/p&gt;  &lt;p&gt;Edit 23. June 2009: The number of log files in the log file directory started to annoy me, since every file is put in the same directory and the script is run once a day. I have now changed the script to save the log files in subfolders based on year and month.&lt;/p&gt;  &lt;h1&gt;The Script&lt;/h1&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre class="brush: plain;"&gt;#!/bin/bash
# 
# Copyright (c) 2008-2009 Damon Timm.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.
#
# ---------------------------------------------------------------------
#
# Version 3 - Jan 31 2009
# Incremental Encrypted Backups with Duplicity and Amazon S3
#
# This bash script was designed to automate and simplify the remote backup
# process using duplicity and Amazon S3.  Hopefully, after the script is 
# configured, you can easily backup, restore, verify and clean without
# having to remember lots of different command options.
#
# Furthermore, you can even automate the process of saving your script 
# and the gpg key for your backups in a single password-protected file -- 
# this way, you know you have everything you need for a restore, 
# in case your machine goes down.
#
# You can run the script from cron with no command-line options 
# (all options set in the script itself); however, you can also run it 
# outside of the cron with some variables for more control.
#
# --full: forces a full backup (instead of waiting specified number of days
# --verify: verifies the backup (no cleanup is run)
# --restore: restores the backup to the directory specified in the script
# --backup-this-script: let's you backup the script and secret key to the
#                       current working directory.
#
# See more info about the script online at:
# blog.damontimm.com/bash-script-incremental-encrypted-backups-duplicity-amazon-s3/
 
# TO DO:
#   - allow command line restore options (specific files, etc)
#   - allow command line cleanup options (# of days [30D] or full backups [2])
#   - allow restore to specific path from the command line
 
# Modified 2009 by Lasse Soelberg
# http://blog.soelsoft.dk/
#
# Changelog:
# - Added support for buckets located in Europe
# - Added the code necessary to load the passphrase from ~/.gnupg/.gpg-passphrase
# - Deletes the restore directory if it already exists, since Duplicity won't
#   restore into an existing directory
# - Changed the log file folder structure so the log file is saved in /year/month/ folder
#   instead of all logs being saved in the same folder.
#

# AMAZON S3 INFORMATION
export AWS_ACCESS_KEY_ID=&amp;quot;&amp;lt;FOOBAR&amp;gt;&amp;quot;
export AWS_SECRET_ACCESS_KEY=&amp;quot;&amp;lt;FOOBAR&amp;gt;&amp;quot;
 
# GPG PASSPHRASE &amp;amp; GPG KEY (Automatic/Cron Usage)
# If you aren't running this from a cron, comment this line out
# and duplicity should prompt you for your password.
# I put my GPG passphrase in a text file at
# ~/.gnupg/.gpg-passphrase and chmod it 0600.
exec&amp;lt;~/.gnupg/.gpg-passphrase
read LINE
export PASSPHRASE=${LINE}
GPG_KEY=&amp;quot;&amp;lt;FOOBAR&amp;gt;&amp;quot;
 
# The ROOT of your backup (where you want the backup to start);
# This can be / or somwhere else -- I use /home/ because all the 
# directories start with /home/ that I want to backup.
ROOT=&amp;quot;/home/&amp;quot;
 
# BACKUP DESTINATION INFORMATION
# In my case, I use Amazon S3 use this - so I made up a unique
# bucket name (you don't have to have one created, it will do it
# for you.  If you don't want to use Amazon S3, you can backup 
# to a file or any of duplicity's supported outputs.
#
# NOTE: You do need to keep the &amp;quot;s3+http://&amp;lt;your location&amp;gt;/&amp;quot; format;
# even though duplicity supports &amp;quot;s3://&amp;lt;your location&amp;gt;/&amp;quot; this script
# needs to read the former.
#DEST=&amp;quot;file:///home/damon/new-backup-test/&amp;quot;
DEST=&amp;quot;s3+http://backup-bucket/backup-folder/&amp;quot;

# BUCKET LOCATION
# Keep this line uncommented, if the bucket is placed in Europe.
# Comment out the line if the bucket is placed in the US.
BUCKET_LOCATION=&amp;quot;EU&amp;quot;

# RESTORE FOLDER
# Being ready to restore is important to me, so I have this script
# setup to easily be able to restore a backup by adding the 
# &amp;quot;--restore&amp;quot; flag.  Indicate where you want the fili to restore to
# here so you're ready to go.
RESTORE=&amp;quot;/home/damon/restore-backup-01&amp;quot;
 
# INCLUDE LIST OF DIRECTORIES
# Here is a list of directories to include; if you want to include 
# everything that is in root, you could leave this list empty, I think.
#INCLIST=( &amp;quot;/home/*/Documents&amp;quot; \ 
#    	  &amp;quot;/home/*/Projects&amp;quot; \
#	      &amp;quot;/home/*/logs&amp;quot; \
#	      &amp;quot;/home/www/mysql-backups&amp;quot; \
#        ) 
 
INCLIST=( &amp;quot;/home/damon/Documents/Scripts/&amp;quot; ) # small dir for testing
 
# EXCLUDE LIST OF DIRECTORIES
# Even though I am being specific about what I want to include, 
# there is still a lot of stuff I don't need.           
EXCLIST=( &amp;quot;/home/*/Trash&amp;quot; \
	      &amp;quot;/home/*/Projects/Completed&amp;quot; \
	      &amp;quot;/**.DS_Store&amp;quot; &amp;quot;/**Icon?&amp;quot; &amp;quot;/**.AppleDouble&amp;quot; \ 
          ) 
 
# FULL BACKUP &amp;amp; REMOVE OLDER THAN SETTINGS
# Because duplicity will continue to add to each backup as you go,
# it will eventually create a very large set of files.  Also, incremental 
# backups leave room for problems in the chain, so doing a &amp;quot;full&amp;quot;
# backup every so often isn't not a bad idea.
#
# I set the default to do a full backup every 14 days and to remove all
# all files over 31 days old.  This should leave me at least two full
# backups available at any time, as well as a month's worth of incremental
# data.
 
FULL_IF_OLDER_THAN=&amp;quot;14D&amp;quot;
CLEAN_UP_TYPE=&amp;quot;remove-older-than&amp;quot;
CLEAN_UP_VARIABLE=&amp;quot;31D&amp;quot;
 
# If you would rather keep a certain (n) number of full backups (rather 
# than removing the files based on their age), uncomment the following
# two lines and select the number of full backups you want to keep.
# CLEAN_UP_TYPE=&amp;quot;remove-all-but-n-full&amp;quot;
# CLEAN_UP_VARIABLE=&amp;quot;5&amp;quot;
 
# LOGFILE INFORMATION DIRECTORY
# Provide directory for logfile, ownership of logfile, and verbosity level.
# I run this script as root, but save the log files under my user name -- 
# just makes it easier for me to read them and delete them as needed. 
 
# LOGDIR=&amp;quot;/dev/null&amp;quot;
LOGDIR=&amp;quot;/home/damon/logs/test2/&amp;quot;
LOG_FILE=&amp;quot;duplicity-`date +%Y-%m-%d-%M`.txt&amp;quot;
LOG_FILE_OWNER=&amp;quot;damon:damon&amp;quot;
VERBOSITY=&amp;quot;-v3&amp;quot;
LOG_FILE_YEAR=`date +%Y`
LOG_FILE_MONTH=`date +%m`
 
##############################################################
# Script Happens Below This Line - Shouldn't Require Editing # 
##############################################################
LOGFILE=&amp;quot;${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/${LOG_FILE}&amp;quot;
DUPLICITY=&amp;quot;$(which duplicity)&amp;quot;
S3CMD=&amp;quot;$(which s3cmd)&amp;quot;

if [ ${BUCKET_LOCATION} = &amp;quot;EU&amp;quot; ]; then
  EUROPEAN=&amp;quot;--s3-use-new-style --s3-european-buckets&amp;quot;
else
  EUROPEAN=&amp;quot;&amp;quot;
  BUCKET_LOCATION=&amp;quot;US&amp;quot;
fi
 
NO_S3CMD=&amp;quot;WARNING: s3cmd is not installed, remote file \
size information unavailable.&amp;quot;
NO_S3CMD_CFG=&amp;quot;WARNING: s3cmd is not configured, run 's3cmd --configure' \
in order to retrieve remote file size information.&amp;quot;
 
if [ ! -x &amp;quot;$DUPLICITY&amp;quot; ]; then
  echo &amp;quot;ERROR: duplicity not installed, that's gotta happen first!&amp;quot; &amp;gt;&amp;amp;2
  exit 1
elif  [ `echo ${DEST} | cut -c 1,2` = &amp;quot;s3&amp;quot; ]; then
  if [ ! -x &amp;quot;$S3CMD&amp;quot; ]; then
    echo $NO_S3CMD; S3CMD_AVAIL=FALSE
  elif [ ! -f &amp;quot;${HOME}/.s3cfg&amp;quot; ]; then
    echo $NO_S3CMD_CFG; S3CMD_AVAIL=FALSE
  else
    S3CMD_AVAIL=TRUE
  fi
fi
 
# Creating the base log directory, if non existing 
if [ ! -d ${LOGDIR} ]; then
  echo &amp;quot;Attempting to create log directory ${LOGDIR} ...&amp;quot;
  if ! mkdir -p ${LOGDIR}; then
    echo &amp;quot;Log directory ${LOGDIR} could not be created by this user: ${USER}&amp;quot;
    echo &amp;quot;Aborting...&amp;quot;
    exit 1
  else
    chown ${LOG_FILE_OWNER} ${LOGDIR}
    echo &amp;quot;Directory ${LOGDIR} successfully created.&amp;quot;
  fi
elif [ ! -w ${LOGDIR} ]; then
  echo &amp;quot;Log directory ${LOGDIR} is not writeable by this user: ${USER}&amp;quot;
  echo &amp;quot;Aborting...&amp;quot;
  exit 1
fi
 
# Creating the year log directory, if non existing 
if [ ! -d ${LOGDIR}${LOG_FILE_YEAR}/ ]; then
  echo &amp;quot;Attempting to create log directory ${LOGDIR}${LOG_FILE_YEAR}/ ...&amp;quot;
  if ! mkdir -p ${LOGDIR}${LOG_FILE_YEAR}/; then
    echo &amp;quot;Log directory ${LOGDIR}${LOG_FILE_YEAR}/ could not be created by this user: ${USER}&amp;quot;
    echo &amp;quot;Aborting...&amp;quot;
    exit 1
  else
    chown ${LOG_FILE_OWNER} ${LOGDIR}${LOG_FILE_YEAR}/
    echo &amp;quot;Directory ${LOGDIR}${LOG_FILE_YEAR}/ successfully created.&amp;quot;
  fi
elif [ ! -w ${LOGDIR}${LOG_FILE_YEAR}/ ]; then
  echo &amp;quot;Log directory ${LOGDIR}${LOG_FILE_YEAR}/ is not writeable by this user: ${USER}&amp;quot;
  echo &amp;quot;Aborting...&amp;quot;
  exit 1
fi
 
# Creating the month log directory, if non existing 
if [ ! -d ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/ ]; then
  echo &amp;quot;Attempting to create log directory ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/ ...&amp;quot;
  if ! mkdir -p ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/; then
    echo &amp;quot;Log directory ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/ could not be created by this user: ${USER}&amp;quot;
    echo &amp;quot;Aborting...&amp;quot;
    exit 1
  else
    chown ${LOG_FILE_OWNER} ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/
    echo &amp;quot;Directory ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/ successfully created.&amp;quot;
  fi
elif [ ! -w ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/ ]; then
  echo &amp;quot;Log directory ${LOGDIR}${LOG_FILE_YEAR}/${LOG_FILE_MONTH}/ is not writeable by this user: ${USER}&amp;quot;
  echo &amp;quot;Aborting...&amp;quot;
  exit 1
fi
 
get_source_file_size() 
{
  echo &amp;quot;---------[ Source File Size Information ]---------&amp;quot; &amp;gt;&amp;gt; ${LOGFILE}
 
  for exclude in ${EXCLIST[@]}; do
    DUEXCLIST=&amp;quot;${DUEXCLIST}${exclude}\n&amp;quot;
  done
 
  for include in ${INCLIST[@]}
    do
      echo -e $DUEXCLIST | \
      du -hs --exclude-from=&amp;quot;-&amp;quot; ${include} | \
      awk '{ print $2&amp;quot;\t&amp;quot;$1 }' \
      &amp;gt;&amp;gt; ${LOGFILE}
  done
  echo &amp;gt;&amp;gt; ${LOGFILE}
}
 
get_remote_file_size() 
{
  echo &amp;quot;------[ Destination File Size Information ]------&amp;quot; &amp;gt;&amp;gt; ${LOGFILE}
  if [ `echo ${DEST} | cut -c 1,2` = &amp;quot;fi&amp;quot; ]; then
    TMPDEST=`echo ${DEST} | cut -c 6-` 
    SIZE=`du -hs ${TMPDEST} | awk '{print $1}'`	
  elif [ `echo ${DEST} | cut -c 1,2` = &amp;quot;s3&amp;quot; ] &amp;amp;&amp;amp; [ -x &amp;quot;$S3CMD&amp;quot; ]; then
      TMPDEST=$(echo ${DEST} | cut -c 11-)
      SIZE=`s3cmd du -H s3://${TMPDEST} --bucket-location=${BUCKET_LOCATION} | awk '{print $1}'`
  fi
  echo &amp;quot;Current Remote Backup File Size: ${SIZE}&amp;quot; &amp;gt;&amp;gt; ${LOGFILE}
}
 
include_exclude()
{
  for include in ${INCLIST[@]}
    do
      TMP=&amp;quot; --include=&amp;quot;$include
      INCLUDE=$INCLUDE$TMP
  done
  for exclude in ${EXCLIST[@]}
      do
      TMP=&amp;quot; --exclude &amp;quot;$exclude
      EXCLUDE=$EXCLUDE$TMP
    done  
    EXCLUDEROOT=&amp;quot;--exclude=**&amp;quot;
}
 
duplicity_cleanup() 
{
  echo &amp;quot;-----------[ Duplicity Cleanup ]-----------&amp;quot; &amp;gt;&amp;gt; ${LOGFILE}
  ${DUPLICITY} ${CLEAN_UP_TYPE} ${CLEAN_UP_VARIABLE} --force \
           ${EUROPEAN} \
	    --encrypt-key=${GPG_KEY} \
	    --sign-key=${GPG_KEY} \
	    ${DEST} &amp;gt;&amp;gt; ${LOGFILE}
  echo &amp;gt;&amp;gt; ${LOGFILE}    
}
 
duplicity_backup()
{
  ${DUPLICITY} ${OPTION} ${FULL_IF_OLDER_THAN} \
   ${VERBOSITY} \
   ${EXCLUDE} \
   ${INCLUDE} \
   ${EXCLUDEROOT} \
   --encrypt-key=${GPG_KEY} \
   --sign-key=${GPG_KEY} \
   ${EUROPEAN} \
   ${ROOT} ${DEST} \
   &amp;gt;&amp;gt; ${LOGFILE}
 
 
}
 
get_file_sizes() 
{
  get_source_file_size
  get_remote_file_size
 
  sed -i '/-------------------------------------------------/d' ${LOGFILE}
  chown ${LOG_FILE_OWNER} ${LOGFILE}
}
 
backup_this_script()
{
  if [ `echo ${0} | cut -c 1` = &amp;quot;.&amp;quot; ]; then
    SCRIPTFILE=$(echo ${0} | cut -c 2-)
    SCRIPTPATH=$(pwd)${SCRIPTFILE}
  else
    SCRIPTPATH=$(which ${0})
  fi
  TMPDIR=DT-S3-Backup-`date +%Y-%m-%d`
  TMPFILENAME=${TMPDIR}.tar.gpg
 
  echo &amp;quot;You are backing up: &amp;quot;
  echo &amp;quot;      1. ${SCRIPTPATH}&amp;quot;
  echo &amp;quot;      2. GPG Secret Key: $GPG_KEY&amp;quot;
  echo &amp;quot;Backup will be saved: `pwd`/${TMPFILENAME}&amp;quot;
  echo
  echo &amp;quot;&amp;gt;&amp;gt; Are you sure you want to do that ('yes' to continue)?&amp;quot;
  read ANSWER
  if [ &amp;quot;$ANSWER&amp;quot; != &amp;quot;yes&amp;quot; ]; then
    echo &amp;quot;You said &amp;lt;&amp;lt; ${ANSWER} &amp;gt;&amp;gt; so I am exiting now.&amp;quot;
    exit 1
  fi
 
  mkdir -p ${TMPDIR} 
  cp $SCRIPTPATH ${TMPDIR}/ 
  gpg -a --export-secret-keys ${GPG_KEY} &amp;gt; ${TMPDIR}/s3-secret.key.txt
  echo
  echo &amp;quot;Encrypting tarball, choose a password you'll remember...&amp;quot;
  tar c ${TMPDIR} | gpg -aco ${TMPFILENAME}
  rm -Rf ${TMPDIR}
  echo 
  echo &amp;quot;&amp;gt;&amp;gt; To restore files, run the following (remember your password!)&amp;quot;
  echo &amp;quot;gpg -d ${TMPFILENAME} | tar x&amp;quot;
}
 
if [ &amp;quot;$1&amp;quot; = &amp;quot;--backup-this-script&amp;quot; ]; then
  backup_this_script
  exit
elif [ &amp;quot;$1&amp;quot; = &amp;quot;--full&amp;quot; ]; then
  OPTION=&amp;quot;full&amp;quot;
  FULL_IF_OLDER_THAN= 
  include_exclude
  duplicity_backup
  duplicity_cleanup
  get_file_sizes
 
elif [ &amp;quot;$1&amp;quot; = &amp;quot;--verify&amp;quot; ]; then
  OLDROOT=${ROOT}
  ROOT=${DEST}
  DEST=${OLDROOT}
  OPTION=&amp;quot;verify&amp;quot;
  FULL_IF_OLDER_THAN=
 
  echo &amp;quot;-------[ Verifying Source &amp;amp; Destination ]-------&amp;quot; &amp;gt;&amp;gt; ${LOGFILE}
  include_exclude
  duplicity_backup
  echo &amp;gt;&amp;gt; ${LOGFILE}
  get_file_sizes  
 
elif [ &amp;quot;$1&amp;quot; = &amp;quot;--restore&amp;quot; ]; then
  ROOT=$DEST
  DEST=$RESTORE
  FULL_IF_OLDER_THAN=
  OPTION=
 
  if [ -d ${DEST} ]; then
     rm -r -f ${DEST}
  fi

  if [ &amp;quot;$2&amp;quot; != &amp;quot;yes&amp;quot; ]; then
    echo &amp;quot;&amp;gt;&amp;gt; You will restore to ${DEST}&amp;quot;
    echo &amp;quot;&amp;gt;&amp;gt; You can override this question by executing '--verify yes' next time&amp;quot;
    echo &amp;quot;Are you sure you want to do that ('yes' to continue)?&amp;quot;
    read ANSWER
    if [ &amp;quot;$ANSWER&amp;quot; != &amp;quot;yes&amp;quot; ]; then
      echo &amp;quot;You said &amp;lt;&amp;lt; ${ANSWER} &amp;gt;&amp;gt; so I am exiting now.&amp;quot;
      exit 1
    fi
    echo &amp;quot;Restoring now ...&amp;quot;
  fi
  duplicity_backup
 
elif [ &amp;quot;$1&amp;quot; = &amp;quot;--test&amp;quot; ]; then
  echo &amp;quot;This was a non-duplicity scripting test: check logfile for file sizes.&amp;quot;
  get_file_sizes
else
  OPTION=&amp;quot;--full-if-older-than&amp;quot;
 
  include_exclude
  duplicity_backup
  duplicity_cleanup
  get_file_sizes
 
fi
 
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset PASSPHRASE&lt;/pre&gt;</description>
      <link>http://blog.soelsoft.dk/post/2009/05/19/Script-for-SVN-Backup.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2009/05/19/Script-for-SVN-Backup.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=31c4b4bf-70e4-4a0d-b0f9-5f841b64e2d5</guid>
      <pubDate>Tue, 19 May 2009 22:12:00 +0200</pubDate>
      <category>Backup</category>
      <category>NSLU2</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=31c4b4bf-70e4-4a0d-b0f9-5f841b64e2d5</pingback:target>
      <slash:comments>52</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=31c4b4bf-70e4-4a0d-b0f9-5f841b64e2d5</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2009/05/19/Script-for-SVN-Backup.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=31c4b4bf-70e4-4a0d-b0f9-5f841b64e2d5</wfw:commentRss>
    </item>
    <item>
      <title>SVN Repository Backup</title>
      <description>&lt;p&gt;This is how I solved my first backup task. An overview of my backup project is found &lt;a href="http://blog.soelsoft.dk/post/2009/05/16/My-Backup-Project.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The task is to make incremental backup&amp;rsquo;s of my subversion repository and store the backup on Amazon S3. I found a blog post by &lt;a href="http://blog.damontimm.com/how-to-automated-secure-encrypted-incremental-backups-amazon-s3-duplicity-os-x-or-ubuntu/" target="_blank"&gt;Damon Timm&lt;/a&gt; describing how to do incremental backups to S3 using a piece of software called &lt;a href="http://duplicity.nongnu.org/" target="_blank"&gt;Duplicity&lt;/a&gt;. Damon&amp;rsquo;s is based on OS X or Ubuntu, so it is quite similar to my install, since my server runs &lt;a href="http://www.debian.org/" target="_blank"&gt;Debian&lt;/a&gt;. There are a few differences however, such as no sudo command and i had to generate the gpg key on another machine.&lt;/p&gt;
&lt;h1&gt;Installation of the software&lt;/h1&gt;
&lt;p&gt;First thing first. Log in as root and issue an apt-get update:&lt;/p&gt;
&lt;pre class="brush:plain"&gt;su root
apt-get update&lt;/pre&gt;
&lt;p&gt;Time to install Duplicity. The latest version at time I installed the software was 0.5.16. Check Duplicity&amp;rsquo;s &lt;a href="http://mirrors.zerg.biz/nongnu/duplicity/" target="_blank"&gt;download&lt;/a&gt; page to see if there has been a new version made available:&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;apt-get build-dep duplicity
aptitude install python-boto ncftp
wget http://savannah.nongnu.org/download/duplicity/duplicity-0.5.16.tar.gz
tar xvzf duplicity-0.5.16.tar.gz
cd duplicity-0.5.16/
python setup.py install&lt;/pre&gt;
&lt;p&gt;We also need a piece of software called s3cmd, so that is installed next&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;apt-get install s3cmd&lt;/pre&gt;
&lt;h1&gt;Encryption&lt;/h1&gt;
&lt;p&gt;As mentioned earlier i couldn&amp;rsquo;t get the server to generate a new key for me. It just kept hanging with a message that it needed more entropy. To overcome this problem i generated the key on a different machine, exported it, imported it to the server and changed the trust, so I could use it.&lt;/p&gt;
&lt;h3&gt;Generate and export the key&lt;/h3&gt;
&lt;p&gt;I booted &lt;a href="http://www.ubuntu.com/getubuntu/download" target="_blank"&gt;Ubuntu 9.04&lt;/a&gt; from a Live CD and once logged in I generated the key with the default choices:&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;gpg --gen-key&lt;/pre&gt;
&lt;p&gt;To export the key run the following command, substituting NAME with the name from the key and FILE with the file to save the key in.&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;gpg -a --export-secret-keys NAME &amp;gt; FILE&lt;/pre&gt;
&lt;h3&gt;Import the key&lt;/h3&gt;
&lt;p&gt;After copying the key to the server, it is loaded with the following command,&amp;nbsp; substituting&amp;nbsp; FILE as described above.&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;gpg --allow-secret-key-import --import FILE&lt;/pre&gt;
&lt;p&gt;Next is to change the trust level on the key, otherwise Duplicity will complain and quit, rendering encrypted use of Duplicity useless. Substitute NAME with the name from the key.&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;gpg --edit-key NAME&lt;/pre&gt;
&lt;p&gt;This will put you in a console. Type &amp;ldquo;trust&amp;rdquo; and choose 5, I trust ultimately. After the trust have been set, you leave the console again by typing &amp;ldquo;quit&amp;rdquo;.&lt;/p&gt;
&lt;h3&gt;Passphrase&lt;/h3&gt;
&lt;p&gt;The last thing to consider is the passphrase used for the key. I have my key stored in a file that has been chmod&amp;rsquo;ed to 0600.&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;nano ~/.gnupg/.gpg-passphrase&lt;/pre&gt;
&lt;p&gt;Enter the passphrase and press Ctrl^O to save and then Ctrl^X to exit. Finally the rights on the file has to be modified.&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;chmod 0600 ~/.gnupg/.gpg-passphrase&lt;/pre&gt;
&lt;h1&gt;The Script&lt;/h1&gt;
&lt;p&gt;Now that all the software bits have been set up, it is time to make a script that can take care of the backup procedure. And that script is described &lt;a title="here" href="http://blog.soelsoft.dk/post/2009/05/19/Script-for-SVN-Backup.aspx"&gt;here&lt;/a&gt;&amp;nbsp;.&lt;/p&gt;</description>
      <link>http://blog.soelsoft.dk/post/2009/05/17/SVN-Repository-Backup.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2009/05/17/SVN-Repository-Backup.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=100a8101-86b1-4250-9335-4e3c613d4741</guid>
      <pubDate>Sun, 17 May 2009 11:44:00 +0200</pubDate>
      <category>Backup</category>
      <category>NSLU2</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=100a8101-86b1-4250-9335-4e3c613d4741</pingback:target>
      <slash:comments>25</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=100a8101-86b1-4250-9335-4e3c613d4741</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2009/05/17/SVN-Repository-Backup.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=100a8101-86b1-4250-9335-4e3c613d4741</wfw:commentRss>
    </item>
    <item>
      <title>My Backup Project</title>
      <description>&lt;p&gt;With the increasing amount of data that i have stored in various places, it has become quite clear that i need to have backup of important things. And it should not just be backup on other disks at my home, it should be an online backup somewhere in the cloud.&lt;/p&gt;
&lt;p&gt;After doing some research into what options are available i have settled on using &lt;a href="http://aws.amazon.com/s3/" target="_blank"&gt;&lt;span style="color: #5c80b1;"&gt;Amazon&amp;rsquo;s S3&lt;/span&gt;&lt;/a&gt; for storing the backups. There are no limits on the amount of data to store and you only pay for what you use. And it is not too expensive either.&lt;/p&gt;
&lt;h1&gt;Backup Requirements&lt;/h1&gt;
&lt;p&gt;Before I define what i would like to have backup of, i will start by making some requirements that the backup procedure should adhere to.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic. &lt;/strong&gt;The backup procedure must be completely automated. If it aren't automatic, i will probably forget a step or two along the way and finally end up not doing any backup at all. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controlled by my server.&lt;/strong&gt; The backup procedures must be controlled by my &lt;a href="http://blog.soelsoft.dk/post/2009/05/14/My-Home-Server.aspx" target="_blank"&gt;&lt;span style="color: #5c80b1;"&gt;server&lt;/span&gt;&lt;/a&gt;, since it is the only machine i have that is always turned on. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Online backup.&lt;/strong&gt; The backup&amp;rsquo;s must be stored online, since a backup on other disks in house is void if the house burns down. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Free!&lt;/strong&gt; The backup procedures has to be based on free and/or open source software. It is enough to be paying for the use of S3. &lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Backup Tasks&lt;/h1&gt;
&lt;p&gt;So far i have identified 6 different backup tasks that i would like to address. The tasks are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a title="SVN repository backup" href="http://blog.soelsoft.dk/post/2009/05/17/SVN-Repository-Backup.aspx"&gt;SVN repository backup&lt;/a&gt;.&lt;/strong&gt; This should be straightforward. Do incremental backup of the folder containing all my repositories. Should be run once a day. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Picture backup. &lt;/strong&gt;This is the big one. Currently i have more than 20 GB worth of pictures. I won&amp;rsquo;t be doing incremental backup with the pictures, since i don&amp;rsquo;t think the content of a picture will change. Even though there is a lot of data, i will prefer to have this one be a mirror of my pictures folder. The backup procedure should be run once a week. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux web domain file backup.&lt;/strong&gt; Incremental backup of various files on my Linux domain. Primarily my phpbb installations. Should be per app backup, for example separate backup of each of my phpbb installations. This procedure should be run once a week. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux web domain DB backup.&lt;/strong&gt; Incremental backup of the MySQL database belonging to my Linux domain. Per app backup just as for the files. Should be run once a week. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows web domain file backup.&lt;/strong&gt; Incremental backup of various files on my Windows domain. Backups should be per sub domain and/or app. This procedure should be run once a week. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows web domain DB backup.&lt;/strong&gt; Incremental backup of the SQL Server databases belonging to the windows domain. Backups should be per database and/or application. Should be run once a week. &lt;/li&gt;
&lt;/ol&gt;</description>
      <link>http://blog.soelsoft.dk/post/2009/05/16/My-Backup-Project.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2009/05/16/My-Backup-Project.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=744172af-eb76-47d4-8481-8b61a86d0f5e</guid>
      <pubDate>Sat, 16 May 2009 15:00:00 +0200</pubDate>
      <category>Backup</category>
      <category>NSLU2</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=744172af-eb76-47d4-8481-8b61a86d0f5e</pingback:target>
      <slash:comments>132</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=744172af-eb76-47d4-8481-8b61a86d0f5e</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2009/05/16/My-Backup-Project.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=744172af-eb76-47d4-8481-8b61a86d0f5e</wfw:commentRss>
    </item>
    <item>
      <title>My Home Server</title>
      <description>&lt;p&gt;As like many other Computer Science persons, i have my own server running at home. I use it primarily as an svn server and to do backup of various things. Being a student, one of the demands I had for server was that it was cheap to run, such that my electrical bill wouldn&amp;rsquo;t be too insane. After some researching into the matter i discovered the perfect little device: the &lt;a href="http://www.linksysbycisco.com/US/en/products/NSLU2" target="_blank"&gt;Linksys NSLU2&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;The Slug&lt;/h1&gt;
&lt;p&gt;The NSLU2 is nicknamed Slug. It contains a 266 MHz ARM processor, 32 MB RAM and 8 MB Flash ROM. Being small the only connectors on it are 2 USB ports, an ethernet port and the power. A nice feature of the device is that it is passively cooled, so it is dead quiet &lt;img title="Laughing" src="http://blog.soelsoft.dk/editors/tiny_mce3/plugins/emotions/img/smiley-laughing.gif" border="0" alt="Laughing" /&gt;. The OS on the slug is a custom made version of Linux.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://blog.soelsoft.dk/image.axd?picture=nslu2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nslu2" src="http://blog.soelsoft.dk/image.axd?picture=nslu2_thumb.jpg" border="0" alt="nslu2" width="158" height="244" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://blog.soelsoft.dk/image.axd?picture=250px-NSLU2_board_front.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="250px-NSLU2_board_front" src="http://blog.soelsoft.dk/image.axd?picture=250px-NSLU2_board_front_thumb.jpg" border="0" alt="250px-NSLU2_board_front" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Modding&lt;/h1&gt;
&lt;p&gt;Being a Linuc device, there are some nifty people that have managed to replace the firmware on the slug with their own version, making it capable to do a lot more than it was designed to. A good source for information regarding what you can do with a slug is &lt;a title="http://www.nslu2-linux.org/" href="http://www.nslu2-linux.org/"&gt;http://www.nslu2-linux.org/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By changing the firmware it is possible to install the OS on an external disk, making it possible to install a lot more programs on it than can be kept in the 8 MB onboard flash. My first attempt was with Unslung, which is a good starting point, since it only extends the original firmware and still keeps the interface from the original. After a while though, i decided to change it to Debian to get the power of a full linux distro.&lt;/p&gt;
&lt;h1&gt;My Setup&lt;/h1&gt;
&lt;p&gt;My Slug runs Debian 5.0, which there is a nice installation guide for &lt;a href="http://www.cyrius.com/debian/nslu2/install.html" target="_blank"&gt;here&lt;/a&gt;, from a 30 GB external 2.5&amp;rdquo; harddrive. I have set up ssh with key authentication on it, which is my primary means of interacting with it. I also have &lt;a href="http://us1.samba.org/samba/" target="_blank"&gt;Samba&lt;/a&gt;to make a little network drive. I have &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;subversion&lt;/a&gt; installed for having my own versioning control system. I also have some backup solutions running that stores the backup on &lt;a href="http://aws.amazon.com/s3/" target="_blank"&gt;Amazon S3&lt;/a&gt;, i will describe those setups in other blog posts.&lt;/p&gt;</description>
      <link>http://blog.soelsoft.dk/post/2009/05/14/My-Home-Server.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2009/05/14/My-Home-Server.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=bab1ff3a-d3f6-4b35-a826-d376632834f1</guid>
      <pubDate>Thu, 14 May 2009 21:40:00 +0200</pubDate>
      <category>NSLU2</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=bab1ff3a-d3f6-4b35-a826-d376632834f1</pingback:target>
      <slash:comments>41</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=bab1ff3a-d3f6-4b35-a826-d376632834f1</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2009/05/14/My-Home-Server.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=bab1ff3a-d3f6-4b35-a826-d376632834f1</wfw:commentRss>
    </item>
    <item>
      <title>JAOO 2008 Day Three</title>
      <description>&lt;p&gt;
My third day at &lt;a href="http://www.jaoo.dk/"&gt;JAOO&lt;/a&gt; started out with working in the eating area from 9:00 to 14:00, so i only got to attend two sessions. But atleast there was enough food at lunch. After the sessions there was a crew and speakers dinner. We got some very good food including a chili chocolate mousse, which was insanely good. It was a good way to end the conference.
&lt;/p&gt;
&lt;h3&gt;Six Designs Principles Illustrated&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://jaoo.dk/presentation/Six+Design+Principles+Illustrated" target="_blank"&gt;This talk&lt;/a&gt; was about using some common design principles when making software. The presenter used three case studies to discuss a bunch of design principles. I liked the talk, it was interesting and presented well.
&lt;/p&gt;
&lt;h3&gt;Concurrent Programming with Parallel Extensions to .NET&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://jaoo.dk/presentation/Concurrent+Programming+with+Parallel+Extensions+to+.NET" target="_blank"&gt;This talk&lt;/a&gt; was very interesting. It was about concurrency and how it will be handled in the .NET framework in the future. Parallel Extensions is an addition to the .NET that is currently in a beta stage. It will be a core part of .NET when the next big release will take place (C# 4.0). The talk gave rise to some thoughts about how I use for and foreach loops. For example in a typical for-loop, you specify an ordering, usually with the use of an index variable. In an foreach-loop however, you don&amp;#39;t specify an ordering, and thus it is easier for the runtime system to run the loop concurrently. 
&lt;/p&gt;
</description>
      <link>http://blog.soelsoft.dk/post/2008/10/02/JAOO-2008-Day-Three.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/10/02/JAOO-2008-Day-Three.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=32435ad0-0f78-45b4-bc7f-c7b35bc2df92</guid>
      <pubDate>Thu, 02 Oct 2008 21:30:00 +0200</pubDate>
      <category>JAOO</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=32435ad0-0f78-45b4-bc7f-c7b35bc2df92</pingback:target>
      <slash:comments>35</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=32435ad0-0f78-45b4-bc7f-c7b35bc2df92</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/10/02/JAOO-2008-Day-Three.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=32435ad0-0f78-45b4-bc7f-c7b35bc2df92</wfw:commentRss>
    </item>
    <item>
      <title>JAOO 2008 Day Two</title>
      <description>&lt;p&gt;
My second day at the JAOO conference has ended. I had no duties as a crew, so I could spend the entire day going to sessions. I attended 4 sessions today. I had planned to go to a 5th session, however I was almost about to fall asleep in the last two sessions I attended. Not because the sessions where boring, but due to lack of sleep the last few days. When 30 odd helpers sleep in the same room, the majority being in young and drinking beer, the noise level has been too high for me to sleep properly.
&lt;/p&gt;
&lt;h3&gt;How Cool do Users Feel When Interacting with Your Software&lt;/h3&gt;
&lt;p&gt;
When entering this session i thought it was about how users feel when interacting with various pieces of software, and tips for what to do in order to get users to like ones application. Boy was i wrong! The session was more about how you could enhance the physically world around you with IT. As an example was shown a beanbag that you could use to display images on a wall. The more you messed around in the bag, the more pictures was displayed. Try to do that with a business application! The presenter was a researcher at &amp;Aring;rhus University with HCI as her research area, and she falls into the same category as some of the work i have been presented to at Aalborg University during my own studies: Research for the sake of research. Or atleast that is my opinion,
&lt;/p&gt;
&lt;h3&gt;Identifying your Client&amp;#39;s Needs&lt;/h3&gt;
&lt;p&gt;
This talk centered around the issues of customers not knowing what they want. I liked the talk. It gave some good examples of what to be aware of when trying to identify a client&amp;#39;s needs.
&lt;/p&gt;
&lt;h3&gt;Architecture of a RIA&lt;/h3&gt;
&lt;p&gt;
This talk was a joint effort by Josh Holmes from Microsoft and James Ward from Adobe. They gave&amp;nbsp; a talk about the background of Rich Internet Applications (RIA) and what kinds of patterns are behind them (Model-View-Controller). They gave 10 best practice advices and 10 worst practice advices. All of them based on their own experiences. It was a very good talk, and it was cool to see that two RIA competitors (Microsoft with Silverlight and Adobe with Flex) joined forces inorder to spread the message about RIA.
&lt;/p&gt;
&lt;h3&gt;RIAs using Adobe AIR &amp;amp; Flex&lt;/h3&gt;
&lt;p&gt;
This talk was a continuation of the RIA introduction. This time with the focus on Adobe Flex and AIR, and with demonstrations of what you can do with those technologies. This was demonstrated by James Ward from Adobe. Again it was a good presentation, but unfortunately it was also the time when the lack of sleep really started to kick in.
&lt;/p&gt;
</description>
      <link>http://blog.soelsoft.dk/post/2008/09/30/JAOO-2008-Day-Two.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/09/30/JAOO-2008-Day-Two.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=b3dc730a-e5d3-470f-9242-28071dc63d77</guid>
      <pubDate>Tue, 30 Sep 2008 20:54:00 +0200</pubDate>
      <category>JAOO</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=b3dc730a-e5d3-470f-9242-28071dc63d77</pingback:target>
      <slash:comments>27</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=b3dc730a-e5d3-470f-9242-28071dc63d77</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/09/30/JAOO-2008-Day-Two.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=b3dc730a-e5d3-470f-9242-28071dc63d77</wfw:commentRss>
    </item>
    <item>
      <title>JAOO 2008 Day One</title>
      <description>&lt;p&gt;I am attending this year's &lt;a target="_blank" href="http://www.jaoo.dk/"&gt;JAOO Conference&lt;/a&gt; in Århus, Denmark as student crew. It's pretty nice, I have to work for 2x6 hours during the 3 days, and the rest of the time I can attend the sessions as I like. A nice way to spend 3 days.&lt;/p&gt; &lt;h3&gt;Where Are Programming Languages Going&lt;/h3&gt; &lt;p&gt;The first session i attended was Anders Hejlberg's &lt;a target="_blank" href="http://jaoo.dk/presentation/Opening+Keynote%3A+Where+Are+Programming+Languages+Going%3F"&gt;keynote speak&lt;/a&gt; about his views on the future for programming languages. He started out by giving a small demo of Turbo Pascal, which was the first language he helped create. He gave two reasons for showing the pascal demo. Firstly it is 25 years since it was made and secondly he wanted to show that not much has changed since then. At least not in the way we program today. 25 years ago you programmed using text files, and that method hasn't changed since. Anders's prediction as to how we program in 25 years, is that it will still be as text files. &lt;/p&gt; &lt;h3&gt;A Developer's guide To the Microsoft Platform&lt;/h3&gt; &lt;p&gt;After the keynote speak, i attended a session showing the possibilities with &lt;a target="_blank" href="http://jaoo.dk/presentation/A+Developer%27s+Guide+to+the+Microsoft+Platform+%28part+1%29"&gt;.NET and C#&lt;/a&gt;. During the session the presenter made an application using various new techniques for just about everything. Some of the topics covered was Ling to SQL,Silverlight, WPF and ASP.NET AJAX. Basically it was show how to use &amp;lt;insert Microsoft acronym for fancy stuff here&amp;gt;. But pretty cool though. I find it fascinating how much stuff you can make so easily using the .NET languages and Visual Studio.&lt;/p&gt;</description>
      <link>http://blog.soelsoft.dk/post/2008/09/30/JAOO-2008-Day-One.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/09/30/JAOO-2008-Day-One.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=e6a724ff-b5ec-4855-945b-6243c75e0a6e</guid>
      <pubDate>Tue, 30 Sep 2008 08:14:59 +0200</pubDate>
      <category>JAOO</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=e6a724ff-b5ec-4855-945b-6243c75e0a6e</pingback:target>
      <slash:comments>18</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=e6a724ff-b5ec-4855-945b-6243c75e0a6e</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/09/30/JAOO-2008-Day-One.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=e6a724ff-b5ec-4855-945b-6243c75e0a6e</wfw:commentRss>
    </item>
    <item>
      <title>Update 24. September 2008</title>
      <description>&lt;p&gt;It has been a while since my last update. but to sum up what has happened, the most important part is that I got my Bachelor degree in Computer Science. &lt;/p&gt; &lt;p&gt;I have not made any real progress on the online gallery application since i ran into troubles with my subversion repository server. At home i have a &lt;a target="_blank" href="http://en.wikipedia.org/wiki/NSLU2"&gt;Linksys NSLU2&lt;/a&gt;, on which i have installed Debian Linux. A few months ago a security issue regarding SSL was discovered and as a result of the update i lost the ability to log into it. Kind of a problem when the device is only accessible through a network connection. I spend the entire summer trying to convince myself to correct the problem, so i would be able to access my repository again, but playing Guitar Hero on my Xbox always won &lt;img alt="Open-mouthed" src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/teeth_smile.gif"&gt;, so it wasn't until i started at the university again i got it up and running. &lt;/p&gt; &lt;h4&gt;LSGallery&lt;/h4&gt; &lt;p&gt;What has happened with the gallery, is that i have AJAX enabled it. I put the Treeview and the Gridview in separate updatepanels, such that an update in one doesn't affect the other. And this works very nicely, except for one small detail. Since the entire page no longer gets updated when something happens, the page history doesn't get updated and thus the ability to use the back button has disappeared. &lt;/p&gt; &lt;p&gt;To solve the history problem i am using .NET 3.5 SP1, which adds history management to AJAX. At the moment there is added a new entry to the history, every time there is navigation event on the page. I still need to make the functionality that actually uses the history, but before i can get that working i need to make some changes to how the albums are loaded in the first place.&lt;/p&gt;</description>
      <link>http://blog.soelsoft.dk/post/2008/09/24/Update-24-September-2008.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/09/24/Update-24-September-2008.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=036c341d-dc1e-446b-ad07-c1e204d211c1</guid>
      <pubDate>Wed, 24 Sep 2008 11:57:44 +0200</pubDate>
      <category>General</category>
      <category>LSGallery</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=036c341d-dc1e-446b-ad07-c1e204d211c1</pingback:target>
      <slash:comments>47</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=036c341d-dc1e-446b-ad07-c1e204d211c1</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/09/24/Update-24-September-2008.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=036c341d-dc1e-446b-ad07-c1e204d211c1</wfw:commentRss>
    </item>
    <item>
      <title>LSGallery - Online Image Gallery</title>
      <description>&lt;p&gt;
During Easter I was on a study trip to San Francisco (Fantastic trip &lt;img src="/editors/tiny_mce/plugins/emotions/images/smiley-laughing.gif" border="0" alt="Laughing" title="Laughing" /&gt;). I took a bunch of pictures there (510 to be exact) and I wanted an easy solution for publishing them online, since some be interesting for the other students that participated in the trip. 
&lt;/p&gt;
&lt;p&gt;
I decided on some features that the gallery should have. It should be made in ASP.NET and all I would have to do would be to upload the pictures to my domain with FTP, and then the gallery should take care of the rest. So the albums in the gallery should mimic the folder structure on the server, and when a folder is chosen, it should show the images as clickable thumbnails. 
&lt;/p&gt;
&lt;p&gt;
I did a search for this kind of gallery, and it came up empty. At least for solutions where I didn&amp;#39;t have to pay anything. But hey, I ain&amp;#39;t studying Computer Science for nothing, so I decided to make my own. 
&lt;/p&gt;
&lt;h3&gt;The Web Page&lt;/h3&gt;
&lt;p&gt;
The web page has a TreeView control on the left that is used to display the menu. And then it uses a GridView control to show the thumbnails for the selected album. It has a TextBox control on the top that is used for debugging purposes. The following screenshots shows the UI of the gallery. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="width: 651px; height: 421px" src="http://blog.soelsoft.dk/image.axd?picture=LSGalleryUI.jpg" alt="" width="762" height="468" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="file:///C:/Documents%20and%20Settings/Lasse%20Soelberg/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/64f0a301-8710-4610-b79d-8c3103f3be3a/image[10].png"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h3&gt;Some&amp;nbsp;Code&lt;/h3&gt;
&lt;p&gt;
I made a class called Library, where I do all the work with the images. This is where I get the list of folders, get the list of images in the folders and make thumbnails of the images. I will just show a single method from that class. 
&lt;/p&gt;
&lt;p&gt;
The method that gets the folders uses recursion to easily figure out the folder structure. It builds a TreeNode representation of the folders, for use in a TreeView control on the UI. The following code snippet shows the implementation of the method. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.soelsoft.dk/image.axd?picture=LSGalleryFolderStructure.jpg" alt="" width="537" height="240" /&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="file:///C:/Documents%20and%20Settings/Lasse%20Soelberg/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/64f0a301-8710-4610-b79d-8c3103f3be3a/image[6].png"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The gallery can be seen in action at &lt;a href="http://www.soelsoft.dk/gallery/default.aspx"&gt;&lt;font color="#669966"&gt;http://www.soelsoft.dk/gallery/default.aspx&lt;/font&gt;&lt;/a&gt;. 
&lt;/p&gt;
</description>
      <link>http://blog.soelsoft.dk/post/2008/04/23/LSGallery-Online-Image-Gallery.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/04/23/LSGallery-Online-Image-Gallery.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=be87f471-5b84-4b8a-b7d0-60575e54336a</guid>
      <pubDate>Wed, 23 Apr 2008 21:00:00 +0200</pubDate>
      <category>ASP.NET</category>
      <category>LSGallery</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=be87f471-5b84-4b8a-b7d0-60575e54336a</pingback:target>
      <slash:comments>175</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=be87f471-5b84-4b8a-b7d0-60575e54336a</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/04/23/LSGallery-Online-Image-Gallery.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=be87f471-5b84-4b8a-b7d0-60575e54336a</wfw:commentRss>
    </item>
    <item>
      <title>FECalc</title>
      <description>&lt;p&gt;
This is the first J2ME program i have made. The program calculates the fat energy percentage. To calculate the program needs to know the total amount of energy per 100 grams and the amount of fat per 100 grams. On the Options page it is possible to change the energy from Kilo Joule (standard) to Calories or vice versa. 
&lt;/p&gt;
&lt;p&gt;
The jar file containing the program is attached to this blog entry. It requires a java enabled phone that supports CLDC 1.1 and MIDP 2.0. The screenshots are taken from Sun&amp;#39;s phone emulator, so the screens will probably look different on different brand phones. I have tested the program on my own Nokia 6230. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.soelsoft.dk/image.axd?picture=FECalcMain.jpg" alt="" width="242" height="326" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.soelsoft.dk/image.axd?picture=FECalcOptions.jpg" alt="" width="247" height="327" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="enclosure" href="http://blog.soelsoft.dk/file.axd?file=FECalc.jar"&gt;FECalc.jar (6,01 kb)&lt;/a&gt; 
&lt;/p&gt;
</description>
      <link>http://blog.soelsoft.dk/post/2008/04/06/FECalc.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/04/06/FECalc.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=1dbe9fe1-f981-475c-a8ba-6f8971996326</guid>
      <pubDate>Sun, 06 Apr 2008 12:45:00 +0200</pubDate>
      <category>Mobile</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=1dbe9fe1-f981-475c-a8ba-6f8971996326</pingback:target>
      <slash:comments>148</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=1dbe9fe1-f981-475c-a8ba-6f8971996326</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/04/06/FECalc.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=1dbe9fe1-f981-475c-a8ba-6f8971996326</wfw:commentRss>
    </item>
    <item>
      <title>Predicting Opponents in RPS</title>
      <description>The project aimed towards making a program that was able to consistently win against human players in a game of Rock-Paper-Scissors. The program we made were able to win against humans, however it needs around 50 played rounds until it wins consistently. The program uses different kinds of AI to try to beat humans.Such as pattern detection and modelling using Bayesian net. 
&lt;p&gt;
&lt;a rel="enclosure" href="http://blog.soelsoft.dk/file.axd?file=report.pdf"&gt;report.pdf (1,53 mb)&lt;/a&gt; 
&lt;/p&gt;
</description>
      <link>http://blog.soelsoft.dk/post/2008/04/06/Predicting-Opponents-in-RPS.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/04/06/Predicting-Opponents-in-RPS.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=29ac839f-bf04-486b-b5d4-20372d9f73e8</guid>
      <pubDate>Sun, 06 Apr 2008 12:27:00 +0200</pubDate>
      <category>University Projects</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=29ac839f-bf04-486b-b5d4-20372d9f73e8</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=29ac839f-bf04-486b-b5d4-20372d9f73e8</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/04/06/Predicting-Opponents-in-RPS.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=29ac839f-bf04-486b-b5d4-20372d9f73e8</wfw:commentRss>
    </item>
    <item>
      <title>Mini Brick Language</title>
      <description>&lt;p&gt;
The aim for this project, was to create a programming language for the&amp;nbsp;&lt;a href="http://mindstorms.lego.com/"&gt;Lego Mindstorms NXT&lt;/a&gt;&amp;nbsp;set. The language should be aimed at a specific robot and have a very high degree of abstraction. The attached image shows the root we made for the project. The only item used on the robot that is not provided in the original set from Lego, is a compass sensor provide by &lt;a href="http://www.hitechnic.com/"&gt;www.hitechnic.com&lt;/a&gt;. The report attached describes the project and our results with it. 
&lt;/p&gt;
&lt;img src="http://blog.soelsoft.dk/image.axd?picture=robot.png" alt="" width="300" height="344" /&gt; 
&lt;p&gt;
&lt;a rel="enclosure" href="http://blog.soelsoft.dk/file.axd?file=report.pdf"&gt;report.pdf (3,14 mb)&lt;/a&gt; 
&lt;/p&gt;
</description>
      <link>http://blog.soelsoft.dk/post/2008/04/06/Mini-Brick-Language.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/04/06/Mini-Brick-Language.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=9975da6c-eab7-4c63-baff-04b13af01a06</guid>
      <pubDate>Sun, 06 Apr 2008 12:02:00 +0200</pubDate>
      <category>University Projects</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=9975da6c-eab7-4c63-baff-04b13af01a06</pingback:target>
      <slash:comments>109</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=9975da6c-eab7-4c63-baff-04b13af01a06</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/04/06/Mini-Brick-Language.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=9975da6c-eab7-4c63-baff-04b13af01a06</wfw:commentRss>
    </item>
    <item>
      <title>Welcome!</title>
      <description>&lt;p&gt;
This blog will contains bits and pieces&amp;nbsp;related to the field of&amp;nbsp;Computer Science. It will probably most be a place for me to share different kind of programs. This will probably not be the most updated blog in the world. 
&lt;/p&gt;
</description>
      <link>http://blog.soelsoft.dk/post/2008/04/05/Welcome!.aspx</link>
      <author>Lasse</author>
      <comments>http://blog.soelsoft.dk/post/2008/04/05/Welcome!.aspx#comment</comments>
      <guid>http://blog.soelsoft.dk/post.aspx?id=50533124-1bed-4161-ba5f-45de16e58223</guid>
      <pubDate>Sat, 05 Apr 2008 15:21:00 +0200</pubDate>
      <category>General</category>
      <dc:publisher>Lasse</dc:publisher>
      <pingback:server>http://blog.soelsoft.dk/pingback.axd</pingback:server>
      <pingback:target>http://blog.soelsoft.dk/post.aspx?id=50533124-1bed-4161-ba5f-45de16e58223</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://blog.soelsoft.dk/trackback.axd?id=50533124-1bed-4161-ba5f-45de16e58223</trackback:ping>
      <wfw:comment>http://blog.soelsoft.dk/post/2008/04/05/Welcome!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.soelsoft.dk/syndication.axd?post=50533124-1bed-4161-ba5f-45de16e58223</wfw:commentRss>
    </item>
  </channel>
</rss>