12.20.2011

Top picks from the Ludum Dare game programming competition

If you don't know what the Ludum Dare game development competition is, you should definitely go check it out. It is free and anyone can join. You get 48 hours to create a game and then post it on their site. People can create accounts on the site and then vote for their favorite games.

I made a list of some of my favorites after paging through the submissions for a couple hours. (there are 891 entries currently)


Alone in the Gloom - hulahulahest

It is the dawn of the 20th century. A Cambridge scholar and explorer has led a team to the depths of the South American jungle to investigate a newly discovered temple complex claimed to predate the Olmec by several centuries, showing evidence of stonework thought beyond the capabilities of preclassical Mesoamerican masonry. As they begin to explore the strange temple, our professor accidentally falls into a pit and is separated from the group. All alone, he must find his way back to the surface, and maybe score some fascinating pieces of research data while he is at it...
This is a fun little game with some decent graphics.  You play as a gentleman with a monocle who is investigating a temple. There are keys and small puzzles that you have to solve your way through in order to get out. The graphics were very "SNES Zelda" - esque and were fairly pleasing. Overall it was a decent game with good gameplay. It actually has a story which is more than a lot of the submissions in this competition can say.


WEIRDLY ALONE. - xilefian
You work for Nicholas Snowwe, the most famous art collector in the country. He has purchased an old museum that has had no visitors for over ten years. Inside is a fresco by the painter Harld Forche. Find it for me.
This retro looking game looks like it came straight off one of the original gameboys. As you make your way through the museum, you run into different obstacles that require different items to get past them (logs can be burned with your lighter.) One tip: press z to sprint in the direction you are facing, otherwise it will take you ages to move anywhere.

A Gravekeeper - downsider
 ...a Gravekeeper who enters a crypt one night after hearing stories about a treasure inside
Although it doesn't have any sound, A Gravekeeper was a fun game to play through. It is a short platformer with good graphics and fairly solid game play. Basically you are dropped into a crypt and as you continue through you eventually find a gem and the cave starts collapsing. You eventually find you're way to the end of the cave and you win. Short and sweet. It doesn't offer much in terms of gameplay as the level is quite short, but it looks amazing and could really be expanded well.

Dungeons of Solitude - Knighty
Your only friend has wandered into the Dungeons of Solitude and has not returned. Can you survive the dangers of this place alone to find your friend?
This game was very well done. It is very reminiscent of a NES or SNES dungeon crawler. As you make your way through the dungeon, you find items (sword, throwing knives etc.)  that will be used to make it through to the next level. The sounds was a nice addition to the game, although there is no music the sound effects were well done.  The enemies who look like balls of goop were a nice addition. And generally just move towards you after they are aggroed. It was an enjoyable game to play that gets quite difficult as you progress through the levels.

Shaped - sendmorepeople

 A game from a two-man team about being alone, looking for others, and being shaped along the way.
This game is easily one of my favorites. The kind of like one of those match the shape games for kids except on steroids. In Shaped you start as the shape in the picture, your goal is to find the shape that matches you. You aren't left to searching though, as you can press E to send out a sort of tracer that will find your friend. Once you find your friend you simply bump into him and are tasked with finding the next one. Carefully make your way to the next shape without bumping into the others!

An all around great game that is simple and easy to play. The music in the background is superb and the gameplay is unique and relaxing.

Minicraft - Notch
 The goal of the game is to kill the only other sentient being in the world, making sure you'll be alone forever.
Game:
Although Notch created a great game, it would have been nice to see something branching away from Minecraft.Overall Minicraft is a fun little adventure with much the same feel as Minecraft. You can cut down trees to get wood and craft things at your crafting table. It is enjoyable to play and very similar to minecraft. Watch out for the zombies!

Source:
The real plus to minicraft is the code that Notch wrote. The source code is freely available on the Ludum Dare website.
The code for Minicraft is very well done. You can tell that Notch is a brilliant programmer. I had the opportunity to watch his live feed on twitch.tv during the competition. As a Java programmer, it was amazing to see the amount of skill and focus he was able to conjure up during the event. Notch's code is a great example of Java game code. If you are a Java programmer looking to get into game development but don't know where to start. I would suggest using Notch's code as a starting point.

12.17.2011

T420 - Remap Back / Forward Keys

My Lenovo T420 has two keys above the arrow keys that I almost never use. By default they are forward and backward keys for browsing the internet. I decided to remap them to End and Home. This isn't too difficult.

To do this simply use the following terminal commands:
use xev to find the keycode for the key you would like to change the mapping of
use this link to find what you want the key to actually do
Use xmodmap to map the two together.

xmodmap -e 'keycode 167=End KP_1 KP_1 End'
xmodmap -e 'keycode 166=Home KP_7 KP_7 Home'

LWJGL Setup with Eclipse

I recently decided to try my hand at some game programming and decided to try and use the Light Weight Java Game Library (LWJGL)

It took me a little while to figure out how to get it set up in eclipse. Here is how.
Download lwjgl.zip from here

One you've created a new project in eclipse, add the .jar files like you normally would by right clicking on the project -> properties. Click on the Java Build Path tab and then Libraries. Add the jar files by clicking on the "Add Jars..." button.
The next step is what through me off. Make sure you click on the arrow next to lwjgl.jar and fill in the native library location to point you toward the native files that came with lwjgl (.so files in linux and .dll files for windows)

Hopefully this helps!

Building the Linux Kernel on Debian Based Systems

So you want to build the Linux kernel from scratch, but don't know where to start?
Wikipedia describes the Linux kernel as
The Linux kernel is an operating system kernel used by the Linux family of Unix-like operating systems. It is one of the most prominent examples of free and open source software.

If you are using a debian based system like Ubuntu or Linux Mint, building your own kernel isn't very difficult. I put together a short tutorial to that is fairly easy to follow and should make the process less painful.

Prerequisites:
In order to download, build, and install a custom kernel you will need the following packages installed.
1. Git - a fast, scalable, distributed revision control system with an
unusually rich command set that provides both high-level operations and
full access to internals.
2. kernel-package - a package used to make kernel compilation more automated and less painful.
3. fakeroot - runs in a command environment at pretends to have root privileges for file manipulation. Useful for creating archives with files inside that have root permissions.
4. buid-essential - contains an informational list of packages which are considered essential for building Debian packages. This package also depends on the packages on that list, to make it easy to have the build-essential packages installed.
5. ncurses-dev

sudo apt-get install git-core kernel-package fakeroot build-essential ncurses-dev

1. Change to the home directory
cd ~

2. Clone the mainline kernel git tree
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

3. CD to the linux directory
cd linux

4. Copy the kernel config from your existing kernel using uname -r for your currently loaded kernel
cp /boot/config-'uname -r' .config

5. Update the config file. The default answer to these questions will suffice.
make oldconfig
yes "" | make oldconfig to accept the defaults

6. Clean the kernel source directory
make-kpkg clean

7. Build the linux-image and linux-header .deb files. This is where the actual work takes place. It could take some time. On my machine with an i5 processor it took 15 - 30 minutes.
The concurrency level of this piece can be set manually. Basically it lets you allocate how many processors you would like to utilize in making the kernel image
CONCURRENCY_LEVEL=`getconf _NPROCESSORS_ONLN` fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

8. Change the directory level one up and install the two .deb packeges created<blockquote>
sudo dpkg -i linux-image-<insert custom kernel name here>.deb
sudo dpkg -i linux-headers-<insert custom headers name here>.deb

9. Make the kernel bootable
cd /lib/modules
sudo update-initramfs -c -k <insert kernel module name here>

10. Make sure grub recognizes your custom kernel when you reboot.
sudo update-grub

You're done! Reboot and see if it worked.

Links:
Summary of Linus's Kernel on Git

12.14.2011

Linux - Scripts for hardware

Toggle Volume

    <keybind key="XF86AudioLowerVolume">
     <action name="Execute"><execute>ossmix vmix0-outvol -q -- -1</execute></action>
      </keybind>
    <keybind key="XF86AudioRaiseVolume">
       <action name="Execute"><execute>ossmix vmix0-outvol +1 -q</execute></action>
    </keybind>

Linux - Script to Toggle Touchpad

Short script to toggle the touchpad on/off in Linux.
Comes in real handy if you want to map it to a keybinding in openbox.

#!/bin/bash
if [ $(synclient -l | grep TouchpadOff | awk '{print $3}') == 1 ] ; then
synclient touchpadoff=0;
else
synclient touchpadoff=1;
fi

In openbox I mapped this to my fn + f8 key (the default button to toggle the touchpad on my T420)
I added the following to ~/.config/openbox/rc.xml

<keybind key="XF86TouchpadToggle">
<action name="Execute">
<startupnotify>
<enabled>true</enabled>
<name>toggletouchpad</name>
</startupnotify>
<command></command>~/bin/toggletouchpad.sh
</action>

If you aren't sure what the key presses are that you want to use, there is a program called "xev" that will tell you the xevents keybindings, mousebindings etc. to the actions you are doing.

12.13.2011

Lenovo T420 - Linux - Toggle Touchpad

Here is a helpful little script that toggles the touchpad on or off in Linux.

#!/bin/bash
# My first script
SYNSTATE=$(synclient -l | grep TouchpadOff | awk '{ print $3 }')

# change to the other state
if [ $SYNSTATE -eq 0 ]
then
synclient touchpadoff=1
notify-send "Touchpad" "disabled"
elif [ $SYNSTATE -eq 1 ]
then
synclient touchpadoff=0
notify-send "Touchpad" "enabled"
else
notify-send "Error" "Couldn't get Touchpad status from synclient"
exit 1
fi
exit 0

Thinkpad T420 and Arch Linux

I finally got Archlinux installed on my T420 without much of a headache.

Hardware and General Notes:
I turned off the Nvidia card (I have optimus on this laptop) and I am currently running with only the integrated Intel HD 3000 card. I used the xf86-video-intel driver for the card and everything works great. Sometime in the future I'm going to try to get Bumblebee working.

Sleep is working great.

I haven't tested the webcam or microphone.



thinkpad-acpi:
thinkpad-acpi gives you all kinds of nifty tools to use for controlling different aspects of the Thinkpad series laptops.

This comes default with most kernels (it comes with Arch anyway.) To enable it edit /etc/rc.conf with your favorite text editor and under the MODULES section add the following:
MODULES=(thinkpad-acpi)

Now (probably after a restart) you should be able to control some of your thinkpad's hardware. One of my favorite things is controlling the thinklight through the command line using the following commands:
echo 255 > /sys/class/leds/tpacpi\:\:thinklight/brightness
echo 0 > /sys/class/leds/tpacpi\:\:thinklight/brightness

This will toggle the thinklight on and off. There are all sorts of uses for this in bash scripts etc. There is a nice plugin for pidgin that uses the Thinklight and flashes whenever someone sends you an IM. A nice little addon.

12.02.2011

Thinkpad T420

I recently ordered a new Thinkpad t420 off of Lenovo's website. I figured it was about time to replace my Asus eeepc with an actual notebook, something that I could actually use for programming. I wanted something durable that would last a while, and of course something that could handle Linux well. I opted for the t420 and took advantage of some of Lenovo's black friday deals.

It shipped out on Dec. 2 and should arrive by Dec. 8.

Specs:

CPU:
Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
GPU:
Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) nVidia Corporation Device 1057 (rev a1)
Audio:
ALSA Timer Device
Audio:
ThinkPad Console Audio Control
Audio:
HDA Intel PCH (CONEXANT Analog)
Audio:
HDA Intel PCH(HDA Intel ALSA hardware specific Device)
Audio:
HDA Intel PCH
Network:
Loopback device Interface
Network:
RTL8188CE 802.11b/g/n WiFi Adapter
Network:
82579LM Gigabit Network Connection


I haven't heard the best of things on Lenovo's shipping, but we will see what it looks like. Currently the shipping information is as follows
EDIT:
Wow, the t420 had quite the trip from hong kong! Final shipping times.
Tri-City, IN, United States 12/08/2011 12:46 P.M. Delivered
12/08/2011 4:15 A.M. Out For Delivery
12/08/2011 3:42 A.M. Arrival Scan
Indianapolis, IN, United States 12/08/2011 1:42 A.M. Departure Scan
Indianapolis, IN, United States 12/07/2011 6:45 P.M. Arrival Scan
Louisville, KY, United States 12/07/2011 3:41 P.M. Departure Scan
12/07/2011 2:35 P.M. Import Scan
12/07/2011 2:00 P.M. Arrival Scan
Anchorage, AK, United States 12/06/2011 11:50 P.M. Departure Scan
12/06/2011 1:48 P.M. Arrival Scan
Chek Lap Kok, Hong Kong 12/06/2011 9:27 P.M. Departure Scan
Chek Lap Kok, Hong Kong 12/03/2011 8:30 A.M. Origin Scan
Hong Kong 12/02/2011 7:04 A.M. Order Processed: Ready for UPS

12.01.2011

Nvidia Optimus and Linux - Notes

I have a Lenovo Thinkpad t420 coming in the mail soon. I opted for the version with the Nvidia Optimus technology which switches between an Nvidia 4200m (?) graphics card and the Intel HD 3000 integrated graphics. The Linux support for Optimus isn't entirely there, but I've found a couple interesting fixes.

Basically you can either (from the BIOS) turn off the Nvidia card completely or turn off the Intel HD Graphics completely.
A better option (in my opinion) is the Ironhide project which allows you to launch applications using the Nvidia card and uses the Intel HD Graphics for everything else.

Basically I'm keeping some notes in the bottom of this post and will write a tutorial and review later for Linux on the t420 with Optimus.
Notes:
Ironhide for Ubuntu
Ironhide
Ubuntu Forums Ironhide how-to
Ironhide PPA Ubuntu

Archlinux AUR search for "Bumblebee" : http://aur.archlinux.org/packages.php?O=0&K=bumblebee&do_Search=Go

General Thinkpad / Notebook tips and scripts
Thinkwiki Thinklight
ArchWiki - T420
CPU Frequency Scaling

9.11.2011

Bubblesort a Linked List

Sometimes when you're programming you just need to sort an array. You could use a built in function like any old schmuck; or you could whip out a shiny sorting algorithm and show off a little bit. Ok, so in all reality using a built in sorting function is most likely more efficient than building your own, but it is important to know what is going on behind the built in abstraction layer.

Today I am going to look at the bubblesort sorting algorithm. The main aspects I will be looking at are the Big-O analysis and general benchmarking.

Before I start I should give a basic summary of what big-O notation is and why it is used. Big-O notation is a way that computer scientists and mathematicians express the limits of a certain algorithm. Basically they show how an algorithm reacts to large data sets.

If you would like to read more, Wikipedia has a great article found here.
big-O

BubbleSort
Bubblesort is a simple "exchanging" algorithm. It starts at the first element of the data set and compares it to the second, if the first is greater it swaps them. It will then compare the second element to the third and so on until it reaches the end of the set. At this point we know that the last element is the largest element. The algorithm will then start at the first two elements of the set again and compare until it reaches the element before the end of the list (since we already decided that was the largest.) This pattern continues until the list is sorted.

As you may have guessed, this is not a very efficient algorithm for sorting a large data set. Bubblesort is rarely used due to this fact, however it does offer several small advantages - it uses a relatively small amount of code and can reach decent efficiency with an almost sorted data set.

Here is the code to the bubbleSort method I came up with. It requires the files LinkedList.java and ArrayFromFile.java which I posted about a week ago. The real meat of the program is in the method bubbleSort(LinkedList list). The main method is only there for testing purposes.

download a zip file with all the files you need to run the program

Code:

Bubblesort Stats:
Big-O best case: n
Big-O average case: n^2
Big-O worst case: n^2
Benchmark (100 elements in the collection): 7844 milliseconds (about 7.8 seconds)
This benchmark will likely be something completely different for you since it will be run on a different machine.

9.07.2011

Linked List

Linked lists are important topics in computer science. The theory behind them is something that computer science students learn in classes like data structures and algorithms. I have created a linked list for you to study. It is fairly simple, but has the necessary methods to expand to it with a BubbleSort algorithm etc.

The following picture explains the idea behind a linked list.


Basically you have a list of these things called Nodes that are linked together. Each node is a bucket of sorts that contains a piece of data. A Linked List is a group of these buckets strung together one at a time. The head bucket is linked to the 2nd bucket, the 2nd bucket is linked to the 3rd and so on until you get to the tail bucket which isn't linked to anything.

Currently I am implementing the following methods on the linked list:
-addAtHead(Object) - creates a node and adds it to the beginning of the linked list as the head Node
-addAtTail(Object) - creates a node and adds appends it to the end of the list as the tail Node
-addAtIndex(Object) - creates a node with Object as its data and adds the node at the index
-addAtIndex(Node) - adds the node at the index
-deleteAtIndex(int index) - deletes the node at the index
-switchWithNext(int index) - switches the current index with the one right after it. This is used by the bubble sorting algorithm.
-printList() - prints out the whole LinkedLIst
-find(Node) - returns index
-find(index) - returns Node
-getSize

To Do:
-Sorting by different algorithms(bubble sort, selection sort etc.)

8.26.2011

Arch Linux Installation

After Ubuntu's Unity fiasco, Linux Mint has become my distro of choice. It is everything I remembered about Ubuntu (without Unity and some of the bloat), plus some great new features.

I recently had some issues with the graphics and decided that instead of fixing Mint, I decided to make the best of the situation and start a fresh install of a new distro.

I think I want a distro that gives me more control and really lets me get elbow deep. After researching a little bit I decided on Arch Linux due to its rolling release platform and helpful user base.

I will be following the Arch installation guide found here: https://wiki.archlinux.org/index.php/Beginners%27_Guide

Let's get started!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
I downloaded UNetbootin (http://unetbootin.sourceforge.net/) and downloaded and extracted the Arch Linux netinstall image to a flash drive. After backing up my .home folder from my previous Linux Mint install. After a reboot I'm greeted with a simple UnetBootin boot screen and several boot options. I chose Default and Arch Linux was soon loaded and boot to a command prompt.

/arch/setup
to run the installation

I won't go into very much detail on the installation as the Arch Linux install guide is an excellent source of information when installing. It covers just about every option you have.


Preparing the Hard Drives
I gave the following sizes to my partitions:
/boot - 200 mb
swap - 4000 mb
/ - 30000 mb
/home - 42000 (the rest of the hard drive)

I also chose for / and /home to be ext4

Select Packages
I chose the grub bootloaders as that is what I have experience with
For package groups I chose base and base-devel (as I do a lot of programming)
Extra Packages Installed:
links, ncurses, openssh, sudo
The installation will now download and install the selected packages if you have the netinstall version. If you are installing from core you won't have to wait for the packages to download.

Once the download / installation is finished it will update with a couple statistics. Select continue to... continue. If there is a bit of lag after selecting, be patient. I thought it had frozen for a little while but popped up with the menu again after a minute or so.

Configure System
There may be several things in here you wish to configure. I'm only going to set the root password. If you edit any of the other files they will open with your preferred text editor from earlier.

You're so close to being done! Exit out of the installation to find yourself at the command prompt. Type
reboot
to restart your computer.

If it was successful you should find yourself at the Arch Linux boot loader. Select Arch Linux from the menu and enjoy your new system (albeit command line only.)

Thanks, and Happy Coding!

8.03.2011

Programming Practice - Problem 1

I recently found the website Project Euler (pronounced like oiler) and have been slightly addicted to it.

Basically Project Euler is a website filled with fun math problems that you can either solve by coding or through pen and paper. It isn't like other programming practice problem websites that require you to submit code to an online judge using standard input and output. Project Euler is simple: they give you a problem and a text box to put the answer in. Once you figure it out you click submit and check if you found the correct answer.

As a basic example I'm going to walk through the first practice problem.
Problem 1 from PE states:
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

My solution used the following java Code.

class p1
{
public static void main(String [] args)
{
int sum=0;
for(int i = 0; i < 1000; i++) { if(i%3 == 0 || i%5 == 0) { sum = sum + i; System.out.println(i); } } System.out.println("\n\nThe total is: " + sum); } }


I solved this problem using the basics of divide and conquer programming. Wikipedia defines this as-
In computer science, divide and conquer (D&C) is an important algorithm design paradigm based on multi-branched recursion. A divide and conquer algorithm works by recursively breaking down a problem into two or more sub-problems of the same (or related) type, until these become simple enough to be solved directly. The solutions to the sub-problems are then combined to give a solution to the original problem.

Basically we split the problem into two "subproblems."
1. Find the sum of numbers below 1000.
2. Determine whether a number is a multiple of 3 or 5

For the first part we simply add for(int i = 0; i< 1000; i++) , which lets us walk through the values of 1:1000. Inside of this for loop we test each integer with if(i%3 == 0 || i%5 == 0) to see if it is a multiple of 3 or 5. If it is, we add our number "i" to our variable keeping track of the sums.

Using this method we get the correct answer of: 233168

That wasn't too difficult, now was it? Give Project Euler a try and happy coding!