BibleGateway.com Verse Of The Day

Wednesday, May 30, 2007

Ruby On Rails On Oracle Hurdles, Part 2

I've hit my first bumps in the road to hooking up RoR to an existing Oracle database schema. Like I posted yesterday, designing an RoR app from the ground up would be easier because you can build your database schema to RoR's expectations and limitations. And now I explain in more detail why...

Other than getting connected to an Oracle database (officially "Hurdle #1"), which I discussed yesterday, I've hit a few more snags.

Hurdle #2: Table naming. I'm trying to hook up to an in-house authentication/authorization database that is used by several of our application platforms. For RoR's "coding by convention" to work properly, you would ideally have plural table names, e.g. reps, rep_roles. Then when you generate your scaffolding, you would use singular names for the controller and view, e.g. rep, rep_role.

The existing database had singular table names. Generating scaffolding would come up with an error about the reps table not existing. Of course not, it's rep. My initial thought is, "how can I fool RoR?" And the answer was obvious, create views and see what happens.


create view reps as select * from rep;
create view rep_roles as select * from rep_role;


With newly created views sitting in from of the tables, I go back to the trusty command line and try to generate my scaffolding again. PRESTO!! It worked. It's a hack, it's trashy, it's shameful. But it works, and it was quicker than ripping apart the framework and touching code in inappropriate fashion.

So, Hurdle #2 has been overcome.

Hurdle #3: This one is what I alluded to yesterday about simple keys. These tables don't have simple "id" type keys. In MySQL when I was starting an app from scratch, of course I would use an auto-increment id. Works great. But according to the RoR on Oracle article (http://www.oracle.com/technology/pub/articles/saternos-rails.html), there are expectations for the primary key column being "id" and having a sequence with a naming convention of "singular-table-name"_seq, e.g. rep_seq for table reps.

Well, that's not going to happen here, not for this database. And despite the tagline of the article ("Learn techniques for creating a Ruby on Rails Web application that utilizes a legacy schema."), the article really doesn't address natural primary keys, whether they are simple one-column keys or complex multiple-column keys.

I can generate the scaffolding and launch the server. I get pages displaying all the rows in the table. But clicking on the show, edit, etc. links fail. The error, obviously is that it couldn't find an "id" column to look up the record by. I also noticed the PK fields aren't showing up on the list view or in the "create new" record view.

I've been working on other projects most of the day, so haven't had a chance to work on it beyond identifying what doesn't work.

So, Hurdle #3 remains a hurdle for now.

And I just had a few minutes to Google, and found this article (http://www.oracle.com/technology/pub/articles/tate-activeerecord.html) which basically says the same thing I am realizing. To quote:
But Active Record is not for every application. It does not handle legacy schemas nearly as well. For those, you need a mapping framework, not one that merely wraps tables with simple classes.

But then there is this blog (http://paulmwatson.com/journal/category/ruby-on-rails/) that has some encouraging words about setting the table name and PK column with the set_primary_key and set_table_name methods of the ActiveRecord model. (The specific post is at http://paulmwatson.com/journal/2006/11/02/wrangling-rails/)

Now that is worth a try, but still not so sure it will work for a VARCHAR primary key field, and still not going to cut it for multiple-column primary keys.

Tuesday, May 29, 2007

Hooking Up Ruby To Oracle

Well, I have to admit this one stumped me for a few days. Actually it stumped me one day, and I got pulled to work on actuall work stuff, and just got back to it a few days later.

I started by following the examples at http://www.oracle.com/technology/pub/articles/haefel-oracle-ruby.html
to get the Ruby Oracle libraries installed. That part was easy, download the OCI8 Ruby package at http://rubyforge.org/projects/ruby-oci8 and run it.

Then I whipped up a script to test the connection from an example I found online (forget the URL to reference -- sorry if I stole your crap, dude!) That script basically looks like this (with usernames and passwords changed to protect the innocent.

test-conn.rb


require 'oci8'

OCI8.new("user", "password", "oracle_sid").exec("select * from rep") do
|r| puts r.join(", ");
end



I was pumped! That seems easy, and then I can get out of the MySQL realm and start hooking up Rails to existing enterprise DB's and really show this stuff to be useful in our environment. Sorry MySQL fanatics, we are (mostly) an Oracle shop -- I have nothing against MySQL for my personal projects.

Anyways, she didn't work out so well. I figured it would work since I have Oracle installed on my PC, but got the following popup when I ran that script.

There was also a Ruby stack trace on the command line. Basically I did some Google'ing and found this posting (http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/238003) which at least gave me the clue I needed to look for OCI.dll on my system. My thought was it was getting confused between the Oracle 8 and Oracle 9 versions loaded on my machine.

Searching and searching, I don't have OCI.dll on my machine. Back to Google (a developer's best friend IMO, it always confuses me when other developers don't try this first when they get stumped) That's when I came across this page (http://www.dll-files.com/dllindex/dll-files.shtml?oci) that let me download OCI.dll. Dropped that in C:\WINNT\system32 (I'm on Windows 2000 at work, might be WINDOWS instead of WINNT for you), and re-ran the above test-conn.rb script.

IT WORKS!
Ruby on Rails on Oracle, here I come (again)

I'm guessing my next big hurdle (or potentially a roadblock instead of a hurdle) will be the lack of support for complex primary keys. Starting an application from scratch, you can design your database with that limitation in mind, but building applications for existing databases becomes another issue. I'm sure someone smarter than me has already addressed these concerns, so it might just be a matter of more Google searches.

Monday, May 28, 2007

Thursday, May 24, 2007

Ruby Syntax Sampler Script

Alright, I got a few different Ruby On Rails applications off the ground with the help of some tutorials, examples, and just plain screwing around. But I came to the scary conclusion that these apps were cool, but I still don't know much about Ruby the language. Rails makes it almost too easy! I only injected a few lines of code here and there based on the samples and tutorials to do things like define the foreign keys to get a selection list instead of text entry box for referenced tables.

So here's my lame attempt at playing with "Ruby proper" -- the language, devoid of frameworks. This is my trashy syntax_sampler.rb script that demonstrates some of the basics of Ruby.


require 'net/http'

#define a class
class SyntaxSampler
# define a constant
Dude = "Constants are capitalized. They cannot be declared in methods"
# the constructor method in Ruby is always "initialize"
def initialize( name )
@name = name # instance var starts with at sign
end

def print_name
puts @name
end

# big ugly method
def dostuff
print "x = "
x = 5
puts x
print "x + x = "
puts x + x
print "x * x = "
puts x * x
print "x**x = "
puts x**x
print "x/2 is "
puts x/2
print "but x/2.0 is "
puts x/2.0
names = ['robb', 'paula', 'raina', 'taryn'] #assign array to 'names'
print "crappers reversed is "
puts "crappers".reverse
print "\nPrint the Array: #{names}" # embed values right in print instead of 2 lines
puts "\nReverse the Array: #{names.reverse}"
puts "for methods with no args, parenthesis optional..."
puts names.reverse()
print "\nCapitalize Each Array Item: "
names.each {|name| print "#{name.capitalize} " }
print "\nUpper case Each Array Item: "
names.each {|name| print "\n\t - #{name.upcase} " }
puts "\n\n'5' as an integer = #{"5".to_i}"
puts "\n19.0 as a string = #{19.0.to_s}"
puts "\n'a19' as an integer = #{"a19".to_i}"
puts "\n'19a3' as an integer = #{"19a3".to_i}"
puts Dude
# define a global var
$wicked = "Global vars start with a dollar sign"
puts $wicked
end

def anothermethod
puts $wicked # make sure that var is really global scope
end

def mirror( something )
puts "#{something} #{something.reverse}"
end

def mirrordefval( something = "dude")
puts "#{something} #{something.reverse}"
end
end

class DiffClass
def initialize
end

def rundiff
puts $wicked # really is global, even across classes
10.times {print " x "} # everything is an object
puts
# use the above "required" module to do something...
Net::HTTP.start( 'www.ruby-lang.org', 80 ) do |http|
print( http.get( '/en/LICENSE.txt' ).body )
end

# shortcut for string arrays, no more pesky commas and quotes
food = %w{elk deer caribou squirrel pig chicken cow}
puts food

# basic if/else control structure
count = 5
if count > 10
puts "Try again"
elsif count == 5
puts "You lose"
else
puts "Enter a number"
end

# a while loop
xx = 0
while xx < 10
print "#{xx}..."
xx += 1
end
print "done"
end
end

# classes and methods are defined, now run them....
ss = SyntaxSampler.new("Robb")
ss.print_name
ss.dostuff
ss.anothermethod
ss.mirror("hello, I'm passing params baby") # with parens
ss.mirrordefval "yo yo yo" # no parens
ss.mirrordefval # no params sent in, use default value
puts $wicked # still don't believe me? it IS GLOBAL DAMMIT!
dc = DiffClass.new
dc.rundiff()
#now a little introspection for your sorry ass
puts "\n\nMethods of SyntaxSampler class...."
SyntaxSampler.instance_methods.each {|mm| print "#{mm} "}
puts "\n\nNow eliminate inherited methods...."
# this looks like a simpler way to print out a list, eh?
puts SyntaxSampler.instance_methods(false).join(" ")
exit # not really needed here

Friday, May 18, 2007

Getting Started With Ruby On Rails

The steps I took to install and get Ruby on Rails up and running. This is working on Windows (2000 at work, XP at home). I basically followed the steps on http://www.rubyonrails.org/down.

  1. Download and install Ruby. For Windows, there is a .exe installer. Make sure you pick the installer that comes with the "gems" package updater. I installed at c:\ruby to keep things simple. Installers are at http://www.ruby-lang.org/en/downloads/
  2. Once installed, you made need to add your Ruby bin directory to your PATH environment variable. On 2000, I had to do that, on XP, it just worked from the command line without doing that.
  3. In a command line window, cd into c:\ruby and run: gem install rails --include-dependencies
  4. To create the application, I created a webapp directory under c:\ruby.
  5. Change directory into c:\ruby and type: rails webapp
  6. Change directory into c:\ruby\webapp and type ruby script/server
  7. Once that comes up, open up a browser and check out http://localhost:3000
  8. There you have it, Rails is up and running on Webrick server.
  9. I already had MySQL installed, so next step was quick for me. If you don't already have it, go download and install MySQL.
  10. While you're in a downloading kind of mood, you might as well grab the Eclipse plugin for Ruby if you are an Eclipse guy. You could use any editor, like Notepad++, FreeRIDE (is that still supported? not in latest Ruby release, but it was in last release I downloaded), etc.
  11. With MySQL up and running, create a database and some tables.
  12. Edit your c:\ruby\webapp\config\database.yml file to point at your database.
  13. Run ruby script/generate to create controllers, models, etc.
  14. Edit your c:\ruby\webapp\routes.rb file to add your "routes" for your app.
I'm still on step 14, so can't tell you much more about that. Sitting on a conference call doing "real work"....

To create a controller, I did this....

C:\ruby\webapp>ruby script/generate controller recipe list
exists app/controllers/
exists app/helpers/
create app/views/recipe
exists test/functional/
create app/controllers/recipe_controller.rb
create test/functional/recipe_controller_test.rb
create app/helpers/recipe_helper.rb
create app/views/recipe/list.rhtml


And then enter http://localhost:3000/recipe/list into your browser. So far I got the screen below running without writing a single line of code. Not bad for about 30-45 minutes' worth of work.


It's amazing what you learn when you actually look at a tutorial. Instead of generating models blindly and getting the above, I should have been creating scaffolding to get something useful. I created a table call "robbs" in my database and added a single row (from MyEclipse DB Explorer). Notice my table is "robbs" plural, and the scaffolding controller and view is simply "robb" singular. Then by running the following command, I get this....



C:\ruby\webapp>ruby script/generate scaffold robb robb
exists app/controllers/
exists app/helpers/
exists app/views/robb
exists app/views/layouts/
exists test/functional/
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
identical app/models/robb.rb
identical test/unit/robb_test.rb
identical test/fixtures/robbs.yml
create app/views/robb/_form.rhtml
create app/views/robb/list.rhtml
create app/views/robb/show.rhtml
create app/views/robb/new.rhtml
create app/views/robb/edit.rhtml
create app/controllers/robb_controller.rb
create test/functional/robb_controller_test.rb
create app/helpers/robb_helper.rb
create app/views/layouts/robb.rhtml
create public/stylesheets/scaffold.css


Thursday, May 17, 2007

My Ruby Dilemna

To Ruby or not to Ruby?

I looked at Ruby a while back, maybe 2004/5-ish, when it was just starting to make a buzz. It seemed interesting because it was an object oriented scripting language. Loosely typed, to-the-point syntax, etc. I liked the concept, but ultimately I couldn't find a use for it to get me off the ground. When I really needed a shell script, it was quicker to just use ksh or bash and the standard array of unix utilities--awk, sed, cut, grep, etc.

Spare time is precious, and there are a lot of things besides programming to fill it with. And how often do you really get time at work to sit down and learn a new technology, pure R&D and personal development type stuff?

And if I do sit down to learn something new, should I really be spending time on a "toy" like Ruby when I could be brushing up on new Java stuff? Afterall, Java/J2EE are paying the bills, so shouldn't I be the best Java guy I can be, instead of dabbling in flavor-of-the-month technologies?

Then I saw a demo for Ruby on Rails. Wow, that blows the mind of a STRUTS/JSP/Servlet kinds of guy like me. It looks so cool, so fast, so easy, can it really be like the demo? It sparked my interest, but again, the buzz was that this was more of a "toy" than a real enterprise alternative, and lots of negative press was spent decrying lack of security and scalability, blah blah blah. Short attention span, drifting off, blah blah blah.

So now a friend of mine is diving head first into Ruby on Rails along with a few of his friends at work. His genuine enthusiasm has piqued my interest for a 3rd time. He is enthusiastic without being one of those zealots that are screaming loudly about how Ruby is going to kill Java or kill .Net or kill Python or whatever. No languages have to die here, people, it's just one more tool in the toolbox -- do you throw away your drill when you buy a new hammer?

And after all this time, Ruby is still out there and gaining support, so I can't really label it "flavor-of-the-month" or "toy" anymore. To be honest, I thought the same thing about Java back in '96/'97-ish when it was just being used to write applets embedded in HTML pages. I dabbled with some Java, but as a C/SQL/Motif programmer, Java seemed completely useless for real apps. I wasn't convinced until I saw the proof-of-concept office suite Corel wrote in Java -- whoa, real applications like drawing and word processing and spreadsheets running in a graphics "desktop" with icons and stuff! Now I write Java every day. So given that my judgement on this sort of thing sucks goat, I think Ruby, esp. Ruby on Rails, deserves another, more serious, look.

Using the instructions on this link, I was able to use Ruby GEMS to download and install Rails. Then a few commands and I got my sample skeleton project up and running. About 20 minutes worth of "work" while I sit here trying to figure out a production support issue for work. And here it is, my local server running my skeleton project....

And now, some links.....

Ruby Programming Language

Ruby On Rails

Ruby in 20 Minutes tutorial

Learning Ruby by comparing to languages you already know

More Ruby documentation

RDT Ruby IDE plugin for Eclipse

Why's Poignant Guide To Ruby

Using Oracle with Ruby

Wednesday, May 16, 2007

Mini KISS

Couple of friends saw these guys playing at the JavaOne After Dark bash. It's at once disturbing and intriguing at the same time. Mini KISS is a KISS tribute band made up of midgets, er, little people, or whatever they like to be called nowadays.

http://www.minikissonline.com/

Tuesday, May 15, 2007

Freaky Word Tricks For Your Shriveled Little Mind

An interesting email I got recently. Must be some amount of truth to it because I could read it without much difficulty...


Only great minds can read this


This is weird, but interesting!

fi yuo cna raed tihs, yuo hvae a sgtrane mnid too
Cna yuo raed tihs? Olny 55 plepoe out of 100 can.
i cdnuolt blveiee taht I cluod aulaclty uesdnatnrd waht I was rdanieg. The phaonmneal pweor of the hmuan mnid, aoccdrnig to a rscheearch at Cmabrigde Uinervtisy, it dseno't mtaetr in waht oerdr the ltteres in a wrod are, the olny iproamtnt tihng is taht the frsit and lsat ltteer be in the rghit pclae. The rset can be a taotl mses and you can sitll raed it whotuit a pboerlm. Tihs is bcuseae the huamn mnid deos not raed ervey lteter by istlef, but the wrod as a wlohe. Azanmig huh? yaeh and I awlyas tghuhot slpeling was ipmorantt! if you can raed tihs forwrad it

FORWARD ONLY IF YOU CAN READ IT.

Monday, May 14, 2007

More Chicken Pictures

The chickens have more than tripled in size since we got them a few weeks ago.

The buff orpington's seem to be the beefiest of them all right now, and a few of the reds are still kind of scrawny looking. They are all almost fully feathered out now, though -- with just their undersides and necks looking downy now.

I picked one up the other day and could not believe how thick the legs are already. These things went from fluffy little balls to something that resembles actual chickens now. Every day I go back there I notice a difference. I think if I just sat back there in the coop, I would actually see them grow. Well, maybe not.

Friday, May 11, 2007

I've Got Some Time

I've been increasingly paranoid about not having time to build my nest boxes for the chickens. So I asked myself, "self, how early do chickens start laying eggs?"

And when I had no answers, I asked Google instead. According to the Murray McMurray hatchery site, this is the answer:

"Most hens will start laying between 5-7 months of age. They will lay best at 1 to 2 years of age. All pullets (female chicken under 1 year of age) lay small eggs at first and after a while will lay larger eggs. Younger hens will lay 1 egg every 3-4 days. A hen 30 weeks old can lay 2 eggs every 3 days. Some have been known to lay an egg a day. All breeds have different laying abilities."
So I have a little time before I really need to panic. They are getting pretty big though, and when I fed them this morning, one of them was actually up on the perch. They are almost fully feathered out now as well. By the end of May we should be grillin' up our first chickens.

MMMmmmm, chickens!

Thursday, May 10, 2007

9 Week Old Lexi

This is what Lexi, our Wheaten Terrier, looks like at about 9 weeks old. Chewing on a toy. Play! Play! Play! Crash and sleep! Repeat.....

Wednesday, May 09, 2007

Bear Kills Moose in Alaska Driveway as Residents Watch

Bear Kills Moose in Alaska Driveway as Residents Watch
FOX News

I've seen stray cats hunting for mice in my driveway, but never anything as exciting as a brown bear killing a moose. If I had been in this situation, I probably would have grabbed the camera AFTER grabbing my rifle and skinning knife.

Click on the URL below for the rest of this story:
http://www.foxnews.com/story/0,2933,270936,00.html

Monday, May 07, 2007

Winchester 1300 - Possible Issue Shooting Slugs?

My father just bought the rifled slug barrel for his Winchester 1300 12 gauge, and brought it up this weekend to try it out. I gave him a couple of my Lightfield Hybrid EXP sabot slugs to shoot through it, and the when he fired, the action came all the way open and ejected the shell without any intervention.

He thought maybe he was inadvertently pulling the slide open because he wasn't expecting that much recoil, so I tried it. I rested the gun over the "V" of my pointer finger and thumb, not holding the forestock at all. The action came all the way open and ejected the spent casing for me as well.

Now we aren't sure if the barrel is keeping the bolt from fully locking properly, or if this is a side effect of the Winchester "Speed Pump" feature (I never really knew what that feature was supposed to do anyways), or if it is a matter of too much shell for the gun to handle?

Each shot was dead accurate at about 70 yards, and it didn't seem to be an "unsafe" condition as it was firing accurately and ejecting the spent casing, but it could definitely catch you off guard in a hunting situation if you are used to doing all the work of pumping a new round in.

I've fired everything from light target loads to heavy 3" magnum turkey and goose loads to rifled slugs through my Mossberg 500 and never had this happen, so I can't image a 2-3/4 slug being too much for a 1300 to handle.

My initial research on the web found another guy in a forum that this happened to, but haven't been able to find too much more info on it. I'll have to keep looking, and in the meantime he was going to have a gunsmith look at it to see if there is an issue with the bolt locking mechanism.

Thursday, May 03, 2007

Lexi Is OURS!!! HAHAHA

We picked her up Tuesday evening because the breeder was going to be out of town delivering a few puppies on Wednesday (a few hours early, yeah!). We'll have to post more pictures when we get a chance. She does a lot of hyper play-play-playing, followed immediately by crashing into a sleep. That's what puppies do.