August AITP Presentation
Here are the slides to the talk I gave on Wednesday. Enjoy!
POSSCon Talk
Awesome conference. Met lots of great people and the roundtable and ensuing conversation at the end were the best part. We need more of these kinds of conferences.
Here are the slides from my talk:
I'm looking forward to next year!
POSSCon: Palmetto Open Source Software Conference
I'll be speaking at the new South Carolina OSS conference in Columbia, SC on July 30th -- more details at their website. I plan to talk about the open-source technologies that we use at the SC Budget and Control Board -- mostly Ruby on Rails and mySQL. I'm pretty excited about the conference as its the first of its kind here in Columbia. Should be worth coming to check it out -- oh, and did I mention its free to attend? See you guys there!
Calculating IRR
So I decided to give the latest Ruby Quiz a shot. I created an `Algebra` module to deal with finding the root of a function -- using Newton's method.
and here is the more specific code to calculate the IRR:
module Algebra
class MaximumIterationsReached < Exception
end
class NewtonsMethod
def self.calculate(function, x)
x - function.evaluated_at(x) / function.derivative_at(x)
end
end
class NewtonsDifferenceQuotient
def self.calculate(function, x, delta=0.1)
(function.evaluated_at(x + delta) - function.evaluated_at(x) ).to_f / delta
end
end
class Function
attr_accessor :differentiation_method, :root_method, :maximum_iterations, :tolerance
def initialize(differentiation_method=NewtonsDifferenceQuotient, root_method=NewtonsMethod, &block)
@definition = block
@differentiation_method, @root_method = differentiation_method, root_method
@maximum_iterations = 1000
@tolerance = 0.0001
end
def evaluated_at(x)
@definition.call(x)
end
def derivative_at(x)
differentiation_method.calculate(self, x)
end
def zero(initial_value=0)
recursive_zero(initial_value, 1)
end
private
def recursive_zero(guess, iteration)
raise MaximumIterationsReached if iteration >= @maximum_iterations
better_guess = @root_method.calculate(self, guess)
if (better_guess - guess).abs <= @tolerance
better_guess
else
recursive_zero(better_guess, iteration + 1)
end
end
end
end require 'algebra'
class IRR
def self.calculate(profits)
begin
function(profits).zero
rescue Algebra::MaximumIterationsReached => mir
nil
end
end
private
def self.function(profits)
Algebra::Function.new do |x|
sumands = Array.new
profits.each_with_index {|profit, index| sumands << profit.to_f / (1 + x) ** index }
sumands.inject(0) {|sum, sumand| sum + sumand }
end
end
end
puts IRR.calculate([-100, 30, 35, 40, 45])
puts IRR.calculate([-1, 1])
puts IRR.calculate([]) Ruby and Rails Talk
I gave this talk at the Columbia Linux Users Group meeting last night. Thought I would post it here in case anyone wanted to have a look at it.
My new favorite website
I know its geeky, but I love it. Its great practice –
The general idea is: people post code that they think could be written better and then other people refactor it and get rated on it. How cool!
Common Beginnings
Its funny what a hobby can turn into. Listening to Matz at RubyConf 07 made me reminisce about how I got started programming. He was asked "do you consider yourself to be a scientist or an artist?" to which Matz responded: "a hobbyist." Ruby was just a hobby to him, something he found to be fun and fulfilling. Its kind of the same way I made it into full-time web development. Its what I did on the side because I enjoyed it. Now I feel privileged that I have a job where I can do what I love most of the time. Its nice to find commonalities with people that you respect.

