Laptop woes

I've been working on my projects, I have had a couple of delays. I have an acer aspire laptop that is about 4 years old. This week two things went wrong with it. First the backlight inverter died on me, so I had no screen till I replaced it.
Second the replacement power supply quit on me. And the one i ordered to replace the replacement is bad right out of the box. Fortunately i've been able to borrow one for the next couple of days.
So i can some work done.
Right now I am finishing up an rtanque tutorial. I should have that up later today.

Ruby on Rails in Windows and 390 Hours of Study.

Before last November, the operating systems (OS) of the computers, I spent most of my time on, were Windows based.  However since I started programming Ruby on Rails (ROR), I've been using Ubuntu 12.04 as my main OS.  This Past week I've been trying to get ROR up and running on my Windows 7 half of my machine, with mixed success.  The initial install of ROR went went well.  However adding Sublime and a Sublime alias proved more challenging than I expected, but in the end, I managed to get the alias mostly working.  I also reached 390 hours this week. This next week I plan on working on a small independent auto service's website. Revisit the Cucumber Tutorial I was working on earlier this year and try to push out an Rtanque Tutorial.

Back on track.

The past couple of weeks I've been transitioning to a different job with a different schedule, that has thrown me for a bit of a loop. but I've tried to work on a couple of sites and I feel that I need a better understanding of HTML and CSS. So I am going to spend a bit of time this week, exploring HTML and CSS. I have a couple of website projects coming up shortly and I'll be updateing my blog as I make progress.

Ruby on rails, weekly round up.

This week has gone by fast.
I have accomplished a lot this week, unfortunately it wasn't all software development. Only 14.25 hours of it was was software development.
A bit short of my goal. I don't have my next weeks goals setup yet. The original business model for my website won't work out so i will have to make some adjustments. I am going to have a planning session on Monday afternoon and finish this blog post's details.

RTanque: Article # 5 "How to Avoid Brain Surgery"

How to Avoid Brain Surgery 

Changing how your bot thinks. 

Scalpel, forceps, knife, screwdriver... ...the brain surgeon keeps operating on the patient until, with a sense of surprise he realizes. Oops, there is no patient here! Now in real life that would never happen, but in this world of RTanque that is what can happen, and I am going to show you how you modify any bot to avoid brain surgery. All you need to do is redefine one method in brain, so that we can rename the tick! method. That way when the brain surgeon replaces your tick! method it won't matter because your not using that function to think any longer. So your bots tick! function will look something like this before we rename it.
 
  def tick!
      some_function_a
      some_function_b
  end
 
Which we will rewrite to say
 
  def some_hard_to_guess_name
     some_function_a
     some_function_b
  end

So now that you made this change your bots code, we also need to redefine the function in brain that calls tick! The name of this function is tick. What we will do is define the tick function in our code so that it will override the one in brain. the tick method in brain looks like this.

def tick(sensors)
  self.sensors = sensors
  RTanque::Bot::Command.new.tap do |empty_command|
    self.command = empty_command
    self.tick!
  end
end
 
Put the whole function in your bot's code, and then we change self.tick! to self.some_hard_to_guess_name like this.

def tick(sensors)
  self.sensors = sensors
  RTanque::Bot::Command.new.tap do |empty_command|
    self.command = empty_command
    self.some_hard_to_guess_name
  end
end
 
Let me explain what is going on. the tick function in the brain normally calls tick! but now because we define it locally, the local function will override the one built into the brain, and now call the some_hard_to_guess_name function. One important note: if you add this code to a brains surgeon bot you can now make make clones of your tank without your clones lobotomizing each other.
Here is what the BrainSurgeonBasicTargetingBot looks like after I added this feature.

class CloneableBrainSurgeonBasicTargetingBot < RTanque::Bot::Brain
  NAME = "#{self}"
  include RTanque::Bot::BrainHelper

  TURRET_FIRE_RANGE = RTanque::Heading::ONE_DEGREE * 1.5

  # drill open their skulls
  class RTanque::Bot
    attr_accessor :brain
  end

  def tick(sensors)
    self.sensors = sensors
    RTanque::Bot::Command.new.tap do |empty_command|
      self.command = empty_command
      self.some_hard_to_guess_name
    end
  end

  def some_hard_to_guess_name
    first_time do
      lobotomize_opponents
    end

    ## main logic goes here
    # use self.sensors to detect things
    # use self.command to control tank
    # self.arena contains the dimensions of the arena

    self.make_circles
    if we_have_target
      target = we_have_target
      track_target(target)
      aim_at_target(target)
      fire_at_target(target)
    else
      self.scan_with_radar
    end
  end

  def make_circles
    command.speed = MAX_BOT_SPEED # takes a value between -5 to 5 
    command.heading = sensors.heading + MAX_BOT_ROTATION
  end

  def we_have_target
    self.nearest_target
  end

  def nearest_target
    self.sensors.radar.min { |a,b| a.distance <=> b.distance }
  end

  def track_target(target)
    self.command.radar_heading = target.heading
  end
  
  def aim_at_target(target)
    self.command.turret_heading = target.heading
  end

  def fire_at_target(target)
      if self.pointing_at_target?(target)
        command.fire(MAX_FIRE_POWER)
      end
  end

  def pointing_at_target?(target)
    (target.heading.delta(sensors.turret_heading)).abs < TURRET_FIRE_RANGE
  end

  def scan_with_radar
    self.command.radar_heading = self.sensors.radar_heading + MAX_RADAR_ROTATION
  end

  private

  def first_time
    unless @first_time_guard
      yield
      @first_time_guard = "checked"
    end
  end

  def lobotomize_opponents
    ObjectSpace.each_object(RTanque::Bot) { |x|
     x.brain.class.send(:define_method, :tick!) {
      "#This is where you write the new tick!
      #method that you will use to replace your opponents
      #if you leave this blank you will make him brainless"
      } unless x.brain.class == self.class
    }

  end
end
class DroidSurgeon < CloneableBrainSurgeonBasicTargetingBot
NAME = "#{self}"
end
 
With this tank not only will you be protected from brain surgery, but you will also lobotomize all the other tanks in the field including the lobotimizer, if they have not taken similar steps to defend their brains.

Easter, Breaking 300, and the End of Class

Happy Easter! I completed the Berkeley classes this week. I got the bulk of my weekly agenda goals done. The one I didn't quite get all the way done was watch all the videos lectures. I have one lecture left to watch, and some bonus videos from the course. I racked up 20 hours study time this week, one short of my basic goal, but I still broke 300 hours this week, and I will make it up that hour, this week.

My Weekly Agenda Goals
  1. Publish 2 RTanque Articles
  2. Finish the bonus videos from class and the one lecture on deployment and security.
  3. Spend at Least 6 hours on the Michael Hartl's Ruby on Rails Tutorial.
  4. Create a mockup of what I want the Job application site to look like.
  5. Interview 3 local business owners on

'RTanque' Part 4: Invincible

'RTanque' Part 4: Invincible

Making Any Bot a Brain Surgeon. 

How to render your opponents brainless. 

Brain surgery is not simple, at least not to me. The base brain surgery code for this bot came from a bot David Bock created called the lobotomizer. I am going to show you how you can make any bot a brain surgeon like the lobotomizer by:
  • Adding an accessor to the Bot class.
  • Adding three lines of code to your tick! method.
  • Adding two private methods at the end of your code.
 So your bot will look something like this before we make your bot a brain surgeon.  
class YourBot < RTanque::Bot::Brain
  NAME = "Your Bot's Name"
  include RTanque::Bot::BrainHelper
  TURRET_FIRE_RANGE = RTanque::Heading::ONE_DEGREE * 1.5

  def tick!
      some_function_a
      some_function_b
  end

  def some_function_a
     #logic of function a 
  end

  def some_function_b
     #logic of function b 
  end

end

First we will drill open the skull, by adding the following code.

# drill open their skulls
  class RTanque::Bot
    attr_accessor :brain
  end

This little bit of code reopens the Bot Class and allows you access to That by itself won't make you a brain surgeon but it will allow you to avoid doing brain surgery on your self. We will next edit the tick! of your bot.

  def tick!
 first_time do
      lobotomize_opponents
    end
      some_function_a
      some_function_b
  end

So now that you added this code to your bot, we also need to add the functions first_time and lobotimize_opponents that your tick! method will now call at the end of your code.

private

  def first_time
    unless @first_time_guard
      yield
      @first_time_guard = "checked"
    end
  end

  def lobotomize_opponents
    ObjectSpace.each_object(RTanque::Bot) { |x|
     x.brain.class.send(:define_method, :tick!) {
      "#This is where you write the new tick! 
      #method that you will use to replace your opponents
      #If you leave this blank or only comments"
      } unless x.brain.class == self.class
    }

  end

Let me explain tick! calls first_time every time it runs. When first_time runs for the first time will not @first_time_guard be defined so by default @first_time_guard will be nil.
The unless is basically an if not so when @first_time_guard is evaluated as nil, yield will execute which means lobotomize_opponents will be called, and @first_time_guard will be assigned "checked". When tick! runs again it will still call first_time, but @first_time_guard  is not false or nil, so yield will not execute again.
How lobotomize_opponents works is a little more complicated, and I do not fully understand it completely, but basically for every Bot it will redefine tick! to whatever string is inside the inner curly brackets.

unless x.brain.class == self.class

The above code, just makes sure you are not redefining your own bots tick! One important note if you try to make clones of this tank, they're likely to lobotomize each other. Here is what the BasicTargetingBot looks like after I made him a brain surgeon.

class BrainSurgeonBasicTargetingBot < RTanque::Bot::Brain
  NAME = "#{self}"
  include RTanque::Bot::BrainHelper

  TURRET_FIRE_RANGE = RTanque::Heading::ONE_DEGREE * 1.5

  # drill open their skulls
  class RTanque::Bot
    attr_accessor :brain
  end

  def tick!
    first_time do
      lobotomize_opponents
    end

    ## main logic goes here
    # use self.sensors to detect things
    # use self.command to control tank
    # self.arena contains the dimensions of the arena

    self.make_circles
    if we_have_target
      target = we_have_target
      track_target(target)
      aim_at_target(target)
      fire_at_target(target)
    else
      self.scan_with_radar
    end
  end

  def make_circles
    command.speed = MAX_BOT_SPEED # takes a value between -5 to 5 
    command.heading = sensors.heading + MAX_BOT_ROTATION
  end

  def we_have_target
    self.nearest_target
  end

  def nearest_target
    self.sensors.radar.min { |a,b| a.distance <=> b.distance }
  end

  def track_target(target)
    self.command.radar_heading = target.heading
  end
  
  def aim_at_target(target)
    self.command.turret_heading = target.heading
  end

  def fire_at_target(target)
      if self.pointing_at_target?(target)
        command.fire(MAX_FIRE_POWER)
      end
  end

  def pointing_at_target?(target)
    (target.heading.delta(sensors.turret_heading)).abs < TURRET_FIRE_RANGE
  end

  def scan_with_radar
    self.command.radar_heading = self.sensors.radar_heading + MAX_RADAR_ROTATION
  end

  private

  def first_time
    unless @first_time_guard
      yield
      @first_time_guard = "checked"
    end
  end

  def lobotomize_opponents
    ObjectSpace.each_object(RTanque::Bot) { |x|
     x.brain.class.send(:define_method, :tick!) {
      "#This is where you write the new tick!
      #method that you will use to replace your opponents
      #if you leave this blank you will make him brainless"
      } unless x.brain.class == self.class
    }

  end
end
This is a guide to making 'RTanque' tank bot brain surgeons.
This is Part 4 of a 4 part series on 'RTanque' tank bot making. Joshua Kemp @joshuakemp1 and myself  Cody Kemp @codesterkemp have be joint authors during this series.
We do foresee writing of future RTanque articles including "How to Avoid Brain Surgery" and "Precision Targeting" 

Crank Out RTanque Tutorials

This week has been good overall, I logged 22.5 hours of study time this week. Josh and I have published two tutorials together this week and written a third, that Josh will publish shortly on his blog. We will finish writing and I will publish the fourth tutorial this week on my blog. I had originally thought the final tutorial would cover an advanced targeting topic, dealing with smart targeting and avoiding shooting your allies. But instead we decided to cover a tutorial about using meta programming to disable your enemies. Unfortunatly while I really did crank out tutorials I slacked off and didn't complete the rest of my Weekly Agenda goals. This is being posted on Monday so I am a little late on publication, but still pretty close. My new Weekly Agenda Goals are: Watch all unwatched lecture videos. Complete hw 2 for class. Complete the the last quiz for the class. Finish writing the part 4 of the tutorial series.

Beginner's guide to 'RTanque' Part:2

The Attack of the Clones


This guide covers how to make a tank bot army in a single file with 'RTanque'

Now that you all have seen how to build a basic tank, We are going to see how to create a bunch of clones in the same file first we start with a single BasicBot
 
class BasicBot < RTanque::Bot::Brain
  NAME = 'basic_bot'
  include RTanque::Bot::BrainHelper
  def tick!
    ## main logic goes here
    # use self.sensors to detect things
    # use self.command to control tank
    # self.arena contains the dimensions of the arena
    self.make_circles
    self.command.fire(0.25)
  end
  def make_circles
  command.speed = MAX_BOT_SPEED # takes a value between -5 to 5 
  command.heading = sensors.heading + 0.01
  end
end  
first we copy and paste the whole BasicBot and paste it below the original and run it. Unfortunatley there is still only one bot. The problem is the class's both have the same name. So we change the second class name to Clone1 Now when we run it there will be two tanks. This is marvolous, but lets see if we can DRY up this code a little. Lets cut out all the logic for Clone1 so we have
class Clone1 < RTanque::Bot::Brain
end
When we run it again we still have two tanks but one is just sitting there still as death. The problem is Clone1's Brain doesn't have any logic. We solve that problem by letting Clone1 inherit BasicBot's Brain with
class Clone1 < BasicBot
end
Now here is my code for a basic_bot_swarm
class BasicBot < RTanque::Bot::Brain
  NAME = "#{self}"
  include RTanque::Bot::BrainHelper

def tick!
    ## main logic goes here
    # use self.sensors to detect things
    # use self.command to control tank
    # self.arena contains the dimensions of the arena

    self.make_circles
    self.command.fire(MIN_FIRE_POWER)
end

def make_circles
  command.speed = MAX_BOT_SPEED # takes a value between -5 to 5 
  command.heading = sensors.heading + MAX_BOT_ROTATION
end
end

class Clone1 < BasicBot
 NAME = "#{self}"
end

class Clone2 < BasicBot
 NAME = "#{self}"
end

class Clone3 < BasicBot
 NAME = "#{self}"
end

class Clone4 < BasicBot
 NAME = "#{self}"
end

class Clone5 < BasicBot 
 NAME = "#{self}"
end

class Clone6 < BasicBot
 NAME = "#{self}"
end

This is an extremely basic, easy guide to making 'RTanque' tank bot clones. If you are looking to make your tank smarter, you'll want to see part 3,  when we will deal with the subject of targeting.

This is Part 2 of a 4 part series on 'RTanque' tank bot making. Joshua Kemp @joshuakemp1 and myself  Cody Kemp @codesterkemp will be joint authors during this series.

RTanque and the Tank Wars

RTanque is a ruby based Tank duel/war simulator, that I was shown this past week. Creating my own AI for a tank was very addicting. So I have forked and cloned the Repo, to get a closer look on how to modify these tanks. So this week Josh and I will start posting a multi-part tutorial that will take you from a simple dumb tank to a relatively smart tank that can selectively target its prey and avoid targeting allies. Check out this video and screenshot of the game from Rtanque.

This past week has been great, I finished homework 1 part 2 in three hours, However I am still having trouble with homework 1 part 1, which I have completed, except for the ability to successfully transfer the comments from the one to the other without losing them. I am troubled by the autograder, not agreeing with my manual tests, but maybe I'll be able to sort it out easier when I have completely finished the assignment. I watched most of the two previous weeks of video lectures. I pushed up some more of chapter 3 from Michael Hartl's Rails Tutorial. I also spent a great deal of time trying to create the 'super' tank in rtanque. Study hours this week was at 26.5 hours, bringing my grand total to 263.25 hours. Pair programed and went to a programming Meetup.

The two Agenda goals that really did not happen, were watching last weeks video lectures and make significant progress in the Uno game. I have set the Uno game on the back burner while I crank out these RTanque Tutorials. I might even try to throw in a short screencast.

My Agenda Goals for this week.

    Complete Homework 1 part 1.
    Catch up on watching the lecture videos.
    Finish pushing up chapter 3 of Michael Hartl Rails Tutorial app.
    Crank out these RTanque Tutorials.

So here again are my Weekly Basic Goals.

    Pair program at least once a week.
    Study a minimum of 21 hours a week.
    Publish my weekly blog by the end of Sunday.
    Share it on Twitter



Legacy Code and Other Nightmares

Legacy Code - A large chunk of code some other programmer(s) wrote, that you now have to deal with.  My homework this week and the lectures from last week, deal with the subject of legacy code and while I hate trying to read another programmers mind, just by looking at code, especially when that code is several thousand lines of code.  I am grateful that I am presented with this type of challenge, While at this stage of my Learning Journey.

My Other Nightmare - Cucumber, the homework is supposed to be accomplished with Test Driven Devolpment, using Cucumber. Which I tried to do but it was very slow going and the amount of good Cucumber tutorials is underwhelming. I spent a great deal of time figuring out how to write tests using Cucumber.  Maybe I will love Cucumber once I learn how to use it... ...If I ever learn it.

This week was difficult overall,
I did not complete the homework, I feel like I have made a great deal of progress, but I have not finished it yet.
I pair programmed once this week.
I watched the lectures videos.
I created a Github Repo but only pushed up part of chapter 3 of Michael Hartl Rails Tutorial
I did add Josh as a Collaborator on Github, which I hope will allow Josh the access he needs.
I created a simple logo design  and applied it to my blog, a bit short of the goal but a step in the right direction.
I did not touch the second half of the Railscast #155 Cucumber Tutorial Substitutions.

With my basic goals, I fell short,
While I did pair program once this week, I only logged a total of 17 hours this week, for a total of 237.25 hours.  Ouch, four hours short.
It is very early Monday when I write this Blog so I am only slightly tardy on the blog and the Twitter share.

My Agenda Goals for this week.
  • Complete Last week's Homework for class.
  • Complete This week's Homework for class.
  • Watch the two previous weeks of lecture videos.
  • Watch this week's lecture videos.
  • Finish pushing up chapter 3 of Michael Hartl Rails Tutorial app.
  • Make some significant progress on my Uno Game.
So here again are my Weekly Basic Goals.
  • Pair program at least once a week.
  • Study a minimum of 21 hours a week.
  • Publish my weekly blog by the end of Sunday.
  • Share it on Twitter

200 Hour Plus Mark.

So I looked at my last blog and noticed I didn't put down my last week's study hours (18.25) for a Journey total of 201.75 study hours at the end of last week!

There is something I will mention, before I go further , First I wasn't too happy with names for my goals last week, so I have renamed "One Time Goals" to be "Weekly Agenda Goals". I have also renamed "Recurring goals" to be "Weekly Basic Goals".

This week was fairly good overall, I met all of my Basic Goals.
I pair programmed with Josh this week, and I think we will go through Michael Hartl's Rail tutorial together and push it up to Git Hub as we go. I just barely exceeded my minimum study with 19 hours of study time, for a total of 220.75 hrs for my Learning Journey.
I started writing this blog on Sunday night...  ...so close enough, and I plan to share it on Twitter right after I am finished here.
However I didn't meet two of my Agenda Goals this week.  I didn't finish the screencast tutorial, but I did work on it, and I realized I need to sharpen my Ruby skills. the second is I didn't publish the screencast I didn't finish.  However on the bright side I did finish the video lectures.

After some reviewing this week I decided to change one of my Basic Goals.  I am going to increase my minimum study time goal to 21 hours. and I probably overloaded my Agenda Goals for this week, but it will mostly depend on how long it take to do the Homework.

 So here are my Agenda Goals this week in order of importance.

  • Complete Homework for class.
  • Watch lecture videos this week.
  • Create a Github Repo and push up to chapter 3 of Michael Hartl Rails Tutorial app.
  • Add Josh as admin on that repo.
  • Create a screen cast intro. It probably will be about 5 - 10 sec, and publish it on youtube or some other video hosting service.
  • Finish the second half of the Railscast #155 Cucumber Tutorial Substitutions.
So here are my updated Weekly Basic Goals.
  • Pair program at least once a week.
  • Study a minimum of 21 hours a week.
  • Publish my weekly blog by the end of Sunday. I am late this week.
  • Share it on Twitter. 

Recurring Weekly Goals

I am excited that I met all my weekly goals.
I watched the video lectures for the class. 
I set up my computer to do screencasts, I think I want to invest in a couple microphones and a cheap usb sound card.
I pair programmed twice this week. 
After I looked over how I did this week, I realized that I want to have recurring and one time weekly goals.
I have decided I won't mention my longer term goals in my weekly posts unless I make some progress toward them during the week, Like this week when I setup the screencasting on my PC, is a step toward a BDD Screencast.

So here are my one time goals this week
  • Create a screen cast tutorial. It probably wont be BDD, but it will be a step toward it.
  • Publish the screencast on Youtube or my own site.
  • Watch lecture videos this week.
So here are my Recurring weekly goals.
  • Pair program at least once a week.
  • Study a minimum of 18 hours a week.
  • Publish my weekly blog by the end of Sunday. I am late this week.
  • Share it on Twitter.
This week I spent a good deal of time trying to work through outdated cucumber tutorials, the only two tutorials I found that were fairly up to date were the two screen-casts listed in the book for my EDX class (first screen-cast, second screen-cast). The other Railscast tutorial link is seriously out of date. In my previous post  I documented what needed to be updated in the Screen-cast so that the first half of Railscast #155 could be completed. I am very excited to have come to the end of the first half of CS 161.1x from EDX. Getting ready for part two. This past week I put in a solid 22.25 hours, bringing my Learning Journey total up to 183.25. I plan to break the two hundred hour mark this week. I decided to post goals up this week and discuss their progress in the upcoming blog posts.

Goals this next week
  • Watch Video Lectures for CS169.2x
  • Setup my computer to do screen-casts
  • Pair program, twice or more this week.
Longer Term Goals
  • Do a Behaviour Driven Development,(BDD) Screen-cast.
  • Build a online job application site for local business.
  • Design a tutorial building gem witha sister gem that checks whether a tutorial is still up to date, and notifies the owner of the tutorial that it needs updating.

Railscast #155 Cucumber Tutorial Substitutions part A

I've had trouble finding a good cucumber tutorial that isn't out of date. In fact I haven't found one, so I worked through the first half of the Railscast #155 which is an outdated Cucumber Tutorial, which if you can get over the outdated part is very well done. I would love it if someone posted an updated cucumber tutorial.
Below I've listed the substitutions necessary to follow the first half of the screen-cast.
So follow the on screen instructions unless I have a substitution listed, and these substitutions should allow you to finish the first half.

rails blog rails new blog

instead of setting up our test gems in test.rb
add this to Gemfile instead

group :test do
    gem 'rspec', ">=1.2.2"
    gem 'rspec-rails', ">=1.2.2"
    gem 'capybara' # replaced webrat
    gem 'cucumber-rails' #replaced cucumber
    gem 'cucumber-rails-training-wheels' #is needed to generate web_steps.rb

    #web_steps.rb replaced webrat_steps.rb
    gem 'database_cleaner' # I don't know why you need this one but I had an error that told me I needed it so I added it.
end


sudo rake gems:install RAILS_ENV=test bundle install
script/generate cucumber rails generate cucumber:install
#as well as the line below to generate web_steps.rb
rails generate cucumber_rails_training_wheels:install
rails generate rspec:install #I don't know if you need
cucumber features -n #including the -n results in an error, including features isn't necessary as features is the default location.
script/generate rspec_model article title:string content:text
rails generate model article title:string content:text

in the routes file with rails >3.0 you don't need map
map.resources :articles

 I think this should get you through the first half of the tutorial, The second half I'm still working on... ...if I I ever finish I'll be sure to post them up.
This has been a pretty good week. I achieved a personal high on study time at 26.75 hours this week, and pair programmed several times this week.  I finally pushed up the Gosu Gem game on Monday which I mentioned earlier this week.  I discovered the Style Editor in Firefox under the tools menu, in  Web Developer section.  The Cool thing about Style Editor is that it allows you to make changes to the style-sheets and instantly see the results.  Which was especially helpful when I was adjusting the the layout of the Rotten Potatoes site for the CS 169.1x homework. Right now I have 161.25 hours of study time completed since I began my Learning Journey this past November.

Quick update

I finally pushed the my version of the Gosu game from Ruby4kids.com tutorial, up to github, I added a score tracking feature to the game which is directly proportional to the number of bullets you destroy. Right now the speed is set a little too slow on the bullets, and the game is not set to generate the bullets fast enough. there is one more feature/bug, that I have added to the game while experimenting with varible speed bullets. this feature/bug is that the further the bullet is to the right the faster it falls. this feature/bug will likely be eliminated from the game eventually. Here is the link to the repo http://bit.ly/11SfKTQ

This week I used Oracle's VM VirtualBox to run Ubuntu 12.04 on Ubuntu 12.04.  I know it seems pointless to run the same system on top of itself, but I couldn't get the Gems working right for a cloned project, outside of the virtual machine.  The difference the VM was running an image of Ubuntu that needs 240 plus updates, the image has a lot less programs installed than the base system, and last and probably most important, the image was set up by the creators of the cloned repository that was giving me grief.  Worked with Github and Heroku again this week.  The Gosu game that I mentioned last week has not been put up, but I will push the Gosu game up this week.  I spent 15 hours studying Ruby on Rails this week bring up my Learning Journey total to 134.5 hours.
This past week has been a pretty solid week of studying with 20.5 hours of study time this week. Which brings up My Journey's total to 119.5 hours. I didn't get a chance to mess with the text to speech project this week, I focused mostly on CS 169.1x homework from www.edx.org
I definitely  enjoy pair programming with my brother Josh, we've had the opportunity to do it both in person and virtually using Google Docs with the auto-formatting turned off.  It would be so cool if there was a setting on Google docs that automated programming syntax highlighting and auto-correct.
This week I started working on a project with Dan Voell, and my brother called sideprojects.  On this project we are using the Devise Gem that I haven't used before.
This projects feels like a roofing project where tools I have mastered, handtools (Programing without Gems from scratch) might be able to put up the shingles, but if I am doing a large roof or multiple roofs, it will be worthwhile to take the time to learn how to use power tools, (Gems).
Yesterday My brother Josh and I were able to add the score feature to the Ruby4kids Tuturial Gosu game, I hope to push this updated game upto my Github later this week.
I've been working on making a text to voice program in ruby, and I'm thinking there are basically three ways it could be structured, 1.use a small sound library of individual sounds or phonograms, with a pronunciation guide database, which would concatenate the sounds together to form words as the program runs, or 2. have a large sound library of the most common words, and only use a pronunciation guide database on the less common words. or 3. have a small small sound library with with no pronunciation guide database, and only rules how to pronounce words.  I have also been working on my Ruby homework, which is forcing me to better understand how ruby works. I'm still finding the .each technique of doing iterations a bit uncomfortable but I think it'll eventually make my life easier. I missed doing a post last Sunday so I will mention I studied for 18 hrs that week, and I studied 21.5 hrs this past week. which brings up my total study time to 99 hrs!
This past week my studying has been pretty consistent, moving my studying total to 60 hours.  Except for Monday and Tuesday I have managed to study 3 hours a day and have moved from chapter 3 to the middle of chapter 7 of the Michael Hartl's ROR Tutorial. I am looking forward to starting the EDX CS 169 from BerkleyX Tomorrow, Software as a Service.