Thursday, December 20, 2007

Sign of the times?

I was in a large book store chain recently and as I always do, I strolled down the technology isle and found this very interesting:


Is this a sign of the times? The heading tells me there will be "Java" books here... but the first two rows are all Python, PHP, Ruby/Rails and a little TCL book in there for good measure. :) Dynlangs (scripting languages) are beginning to take the front seat for development these days... do the folks at this store know this? Or was this a simple stacking slip?

With projects like JRuby, Jython and the like gaining steam as viable alternatives to the Java programming language on the JVM... maybe the heading should just read "JVM" and this stacking order would work just fine!

Thoughts?

Monday, December 17, 2007

Rake 'ing in the Tomcats

So I needed to have a quick way to start/stop/restart/tail -f logs for two different Apache Tomcat instances, Rake is a great tool for this.

I wrote the following very quickly, sure there may be other "frameworks" out there to do this, but I didn't download anything, just wrote it and off I go. (no xml, sorry Ant)

[sourcecode language="ruby"]
# home directory for all this stuff
HOME = '/path/to/my/tomcats'
# defining our servers and their locations
SERVERS = {
:one => "#{HOME}/tomcat_one/",
:two => "#{HOME}/tomcat_two/"
}

# sure there is a better way than this.?.?.
task :default do
puts "\nThe following are the tasks you may choose from:\n"
app = Rake.application
app.do_option('--tasks', ARGV.shift)
app.display_tasks_and_comments()
end

SERVERS.each do |name, dir|
namespace "#{name}" do
desc "start the #{name} server instance"
task :start do
Dir.chdir(dir)
puts `./bin/startup.sh`
end

desc "stop the #{name} server instance"
task :stop do
Dir.chdir(dir)
puts `./bin/shutdown.sh`
end

desc "tail the #{name} server log"
task :tail do
system("tail -f #{dir}/logs/catalina.out")
end
end
end

def server_names
SERVERS.keys.join(', ')
end

[:start, :stop].each do |action|
desc "#{action} servers (#{server_names()})"
task "#{action}" do
SERVERS.keys.each do |key|
task("#{key}:#{action}").invoke
end
end
end

desc "restart servers (#{server_names()})"
task :restart do
task(:stop).invoke
task(:start).invoke
end
[/sourcecode]

Wednesday, December 12, 2007

You know you are getting old when

Just a few things that make me feel old sometimes... what does the same for you?

  • someone's definition of "legacy code" includes something you wrote

  • you know what "load *,8,1" means

  • you remember when we used to call them "scripting languages"

  • you simply can't continue to code after 2:30 AM

  • you had a BBS handle

  • this means something to you: "Hello everybody out there using minix -"

  • these screens ring a bell? : http://toastytech.com/guis/guitimeline.html

Friday, December 7, 2007

Rails 2.0 Released

Rails 2.0 Rails 2.0 Released.



This blog post is the official word releasing Rails 2.0 on the community.

The post includes a nice intro to some of the new features of Rails 2.0.

For a more in depth look at new features, head on over to Ryan Daigles' list of Rails 2.0 features which contain much more detail.

Monday, December 3, 2007

New Ruby Shootout

Antonio Cangiano recently completed a new Ruby performance shootout:
The Great Ruby Shootout

JRuby has a very nice showing this time compared to the shootout done in February.



Congrats JRuby team!

On a separate note, Charles Nutter (JRuby core developer) recently asked that all benchmarks currently being outperformed by Ruby 1.8.x should be reported as bugs!!! Bold and inspiring!

Friday, November 30, 2007

Interesting Debate...

Martin Fowler brings up a good topic on his blog : "GroovyOrJRuby"

I like the way Martin ends this post... Ruby (and Rails) have brought the dynamic (we used to call them scripting) languages back to the forefront.

There is a need for different languages, to help the programming/software engineering world grow. Finding different ways to do things. The same way we have Ruby, Python, Perl, PHP... we should have JRuby, Jython, PHP/Quercus, Groovy.

Which language is the best for the JVM? I would not jump right into saying Java... it really depends on what you are doing.

Sunday, November 25, 2007

Simple file IO in different dynamic languages

Was just messing around and thought I would look at the different ways to skin a cat... in this case, the cat being "read each line of a file and spit out it's contents". I'm using TCL, Python, PHP, Ruby, Groovy, Scala and Javascript (Rhino) for this example. Let's take a look at what I came up with:

Code


TCL


[sourcecode language="css"]
set fp [open "test.txt" r]

while {[gets $fp line] != -1} {
puts stdout $line
}

close $fp[/sourcecode]
Here we need to open the file pointer and loop over the file using a procedure call to 'gets' which sets a local variable 'line' for us. ('gets' is wrapped in brackets so we can validate on it's return, the length of the string returned by gets proc call.) Finally we will need to close our file pointer.

Python


[sourcecode language="python"]
f = open("test.txt")
try:
for line in f:
print line.strip()
finally:
f.close()[/sourcecode]
Similar to TCL, we are getting our file pointer (in this case an object), looping the file object and closing the pointer. Version 2.6 will support the 'with' keyword allowing you to wrap the file IO in a block (therefor closing the file pointer for you after executing the block.) Here's what it will look like:
[sourcecode language="python"]
from __future__ import with_statement # <-- only use this line for Python 2.5!

with open("test.txt") as f:
for line in f:
print line.strip()[/sourcecode]

PHP


[sourcecode language="php"]
foreach (file('test.txt') as $line) {
echo $line;
}[/sourcecode]
This code looks 'blockish', but we're actually calling a function 'file' which returns the file's contents as an array... the file pointer is created and closed within this function so we don't have to worry about closing it in this example.

Ruby


[sourcecode language="ruby"]
# File.open('test.txt', 'r').each do |line| <-- BAD: open file pointer
File.foreach('test.txt', 'r') do |line| <-- CORRECTION
puts line
end[/sourcecode]
UPDATE: was leaving file pointer open... thanks for the correction Sebastian Hungerecker.

Now we are getting OO with blocks. We're creating a File object and calling that object's 'each' method which iterates over each line of the file and passes the contents to the supplied block.

Groovy


[sourcecode language="java"]
new File("test.txt").eachLine { line ->
println line
}[/sourcecode]
Again, OO with blocks... very similar to Ruby.

Scala


[sourcecode language="css"]
import scala.io.Source

for {
(line) <- Source.fromFile("test.txt").getLines
} print(line)[/sourcecode]
Procedural type programming using a language that 'goes both ways.' Similar to the PHP code above, the file IO is wrapped up in the 'Source.fromFile' method call which returns a 'Source' object already populated with the file's contents. We then call the getLines method which returns an iterable collection.

Javascript (Mozilla Rhino)


[sourcecode language="javascript"]
lines = readFile("test.txt").split("\n");
lines.pop(); // <-- last item is empty... EOF?

for (i in lines) {
print(lines[i]);
}[/sourcecode]
Using a Rhino built-in 'readFile' to get the contents of the file, splitting on line breaks using OO method call, and finally looping the array and printing it's contents. You see something I had to do here to get rid of the empty item in 'lines'.

Speed?


Update: I failed to mention, these times include JVM startup so it's not a true speed check for IO... rather from the command line experience (total execution time of one call.) This can paint a bad light on the JVM impls, but keep in mind the JVM is built for long running rather than one shot processes.

Of course I was curious... what kind of speed do these languages have for this basic IO? The test file contained only the following:

this
is
a
test

I don't have the latest and greatest for a few of these... but here are the versions and real time taken. (using 'time' on Mac OS X 10.4.10)

Native Impls


[sourcecode language="css"]
RUBY: 0m0.009s (1.8.6)
TCL: 0m0.012s (8.5)
PHP: 0m0.024s (4.4.7)
Python: 0m0.034s (2.5.1)[/sourcecode]

JVM Impls


[sourcecode language="css"]
RHINO: 0m0.310s (1.6R2)
GROOVY: 0m0.885s (1.0)
SCALA: 0m1.312s (2.6.0)
JRUBY: 0m1.668s (1.1b1)[/sourcecode]What does all of this mean? Not much really... just that there are a lot of different ways (many of which I didn't cover here) to skin a cat. Just choose the one that fits your needs and have fun with it.

Did I miss your favorite language here? Did I not use the most optimal code for accomplishing this task? Let me know!

Friday, November 23, 2007

Swing'in with Ruby and Javascript

I did a presentation last fall about Mozilla's Rhino (a Javascript engine found here.) One of the things demonstrated was the use of Java's Swing from Javascript. It's a tiny bit of simple code so I thought it might be interesting to look at the similarities and diffs between Rhino and JRuby's Java integration from this perspective.

Javascript (Rhino)


[sourcecode language="js"]
importPackage(Packages.javax.swing)

frame = new JFrame("My New Window")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(200,200)

panel = new JPanel()

button = new JButton("Click Me")

function clicked() {
print("button was clicked")
}

button.addActionListener(clicked)

panel.add(button)

frame.add(panel)
frame.pack()
frame.show()[/sourcecode]

Ruby (JRuby)


[sourcecode language="ruby"]
require "java"

include_class %w{
javax.swing.JFrame
javax.swing.JPanel
javax.swing.JButton
java.awt.event.ActionListener
}

frame = JFrame.new("My New Window")
frame.set_default_close_operation(JFrame::EXIT_ON_CLOSE)
frame.set_size(200,200)

panel = JPanel.new

button = JButton.new("Click Me")

listener = ActionListener.impl do
puts "button was clicked"
end

button.add_action_listener(listener)

panel.add(button)

frame.add(panel)
frame.pack()
frame.show()[/sourcecode]

click me



Similarities



  1. short and sweet, much nicer than writing this tiny thing in Java

  2. only one JVM specific call in both : importPackage and include_class respectively


Diffs



  1. Java support automatically 'on' in Rhino : no need to call something to initiate the Java support (JRuby: require 'java')

  2. Rhino has fewer lines : yes, part of this is how I include the classes, but not all...

  3. specifying the ActionListener : Rhino simply allows a function to be passed in... JRuby needs to have an impl of the ActionListener interface... which requires me to include that class

  4. speed : Rhino is faster for this silly test... this is most definitely due to the sheer size of the JRuby impl. Rhino comes in just about 3 times faster than JRuby.


Conclusion


Either way, it's much easier to work with than writing the same thing in Java. JRuby now has a few libraries to help you build your JRuby Swing apps:

I have not seen anything for Rhino, but that doesn't mean they don't exist!

ActiveRecord Migrations - JRuby

I was goofing around a while back, wanted to use AR in a Java project... came up with this Rakefile. Comments welcome, didn't spend much time on it so I'm sure there may be some issues:

[sourcecode language="ruby"]
require 'active_record'
require 'active_support'
require 'yaml'
require 'ftools'

$mig_dir = 'db/migrate'
File.mkpath($mig_dir) if !File.exists?($mig_dir)

task :default do
Rake.application.options.show_task_pattern = //
Rake.application.display_tasks_and_comments
end

namespace :db do
task :environment do
ActiveRecord::Base.establish_connection(YAML::load(File.open('database.yml')))
ActiveRecord::Base.logger = Logger.new(File.open('.migrations.log', 'a'))
end

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
task :migrate => :environment do
ActiveRecord::Migrator.migrate($mig_dir, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
end

desc "Get the schema version number from DB"
task :version => :environment do
class SchemaInfo :environment do
abcs = YAML::load(File.open('database.yml'))

case abcs["adapter"]
when "mysql", "oci", "oracle"
ActiveRecord::Base.establish_connection(abcs)
File.open("db/schema_structure.sql", "w+") { |f| f db/schema_structure.sql"
else
raise "Task not supported by '#{abcs["test"]["adapter"]}'"
end

if ActiveRecord::Base.connection.supports_migrations?
File.open("db/schema_structure.sql", "a") { |f| f < max then n else max end
end
end

def next_migration_number
current_migration_number + 1
end

def next_migration_string(padding = 3)
"%.#{padding}d" % next_migration_number
end

def write_template(file_name, name)
contents = < :user_id do |t|
# t.primary_key :user_id
# t.column :user_id, :integer, :null => false
# t.column :first_name, :string, :null => false
# t.column :last_name, :string, :null => false
# end

# sample for self.down:
# drop_table :users

end
EOS

File.open("#{$mig_dir}/#{file_name}", 'w') do |file|
file.write(contents)
end

puts "Created migration file: #{$mig_dir}/#{file_name}"
end[/sourcecode]

Saturday, November 3, 2007

XBOX 360 D-Link 624

So the power went out... again... this time I could not reload my router settings from config (checksum error!) So I had to google my way back to XBOX Live...

have to open
udp 88
udp/tcp 3074
udp 53

The last one is very important... if I don't have all the above opened up for XBOX, my dlink router will actually reboot during xbox live tests (and fail of course.)

Back to fun.

Tuesday, October 30, 2007

“DynLangs” and you…

Unless you have been living behind your monitor and keyboard only to look up to find the coffee mug you knocked over, you've most likely heard about all the attention dynamic languages, or dynlangs, have been getting these days. Dynamic Languages (or scripting languages) have been taking their spot in the limelight in recent years... I feel this is in large part due to the readily available video streaming sites showcasing the benefits of such languages/frameworks.



For those willing to step outside the compiler, large gains in productivity abound. And with so many dynamic language options being implemented on the JVM, JSR 223, and attention from large companies... dynlangs are quickly becoming viable options in companies and organizations that would never have considered using them in the past.

If you primarily work with a compiled language (Java maybe?) and don't want to miss the productivity boat, you may want to review the following list comprised of just a few languages/frameworks making waves (on and off the JVM) :

Languages



Ruby


Object Oriented, interpreted, dynamically typed language. Created by Yukihiro “matz” Matsumoto, everything is an object and every class is "open" for change.

JRuby


JVM implementation of the Ruby language... provides the ability to use the Ruby language and leverage the existing capabilities of the Java Virtual Machine (and all it's libraries.)

Groovy


Dynamic OO language built for the JVM... "builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk"

Python


Dynamic OO language, embeddable, integration friendly, dynamically typed. Strong user base.

Jython


JVM implementation of the Python language... project has fallen behind the Python pace, but new life buds. As with most JVM dynlangs, Jython provides Java integration.

Scala


Type-safe, both object oriented and functional. Written for the JVM so the Java integration is there.

Rhino


JVM implementation of the JavaScript language... all you would by now expect from a JVM dynlang, Java integration, embeddable, shell access.
... and of course...


PHP


"PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML." Heavily pervasive, low barrier to entry, object oriented with PHP 5, large library code base.
(PHP can now run on the JVM too: Quercus)


Web Frameworks



Ruby on Rails


"Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern. From the Ajax in the view, to the request and response in the controller, to the domain model wrapping the database, Rails gives you a pure-Ruby development environment. To go live, all you need to add is a database and a web server." ORM, MVC, JavaScript and templating for views...

Grails


"It's an open-source web application framework that leverages the Groovy language and complements Java Web development." Inspired by the Ruby on Rails framework (at least at one time it was.)

django


"Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design." ORM, MVC we're seeing a pattern here...

Symfony


"Based on the best practices of web development, thoroughly tried on several active websites, symfony aims to speed up the creation and maintenance of web applications, and to replace the repetitive coding tasks by power, control and pleasure." (PHP web framework)

Did I miss a dynlang/framework you enjoy working with? (most certainly...) Then drop me a line in the comments below and let me know what dynamic language or framework you use to get your job done!

P.S.
One of the best implementations of a dynamic/scripting language IDE around (non-trivial task): NetBeans Ruby Support (thanks Tor)