A few days ago we announced our intention to break Hobo up into various self-contained sub-projects. I just though I’d give you an update on our plans.
The first plan was to get started with the big break-up ASAP. That would obviously push back the documentation I’ve been promising to do. The idea was to provide a reasonable level of documentation for each sub-project as it was released.
Slight change of plan :-)
I’m not in the #hobo channel all that often, but James is, just 2 meters to my left. So I’m well aware that there are a bunch of you that are determined to keep making progress with Hobo with docs or without.
With that in mind, I’ve come around to the idea that getting at least some docs out there for you folk is really the top priority. I think the best way to address this issue quickly is with some example code.
With that goal in mind, we’re announcing a new project today — beta.hobocentral.net (don’t go there now, there’s nothing there yet!).
We’re going to build a new version of hobocentral.net in Rails + Hobo. It will have the current features: blog, forums, documentation (cough) etc. In time we’ll add a whole host of new features like the long-promised tag library, user-extensible documentation and more. This is going to be an open-source project, and it’s going to serve a dual purpose. As well as getting us a better hobocentral.net, the code will be extensively commented and the whole thing will server as a decent real-world example of how to build a Hobo app. The documentation will be implemented by the documentation. It’s all a bit meta-circular, which you gotta love :-)
The point of the beta.hobocentral.net domain is that we can whack this app up really soon, and continue using the existing Wordpress based site until the new one cuts the mustard.
There is one small hold-up I’m afraid (groan). We’ve got this little outstanding DRYML issue with CamelCaseTags. From James’ experience trying to explain template tags on #hobo, it’s clear that this needs to be cleaned up right now. So I’m going to work on that first (right now in fact), and then start on beta.hobocentral.net
You should see the first cut of beta.hobocentral.net go up next week, delivering on my promise to provide some documentation in November!
Streamlined has moved to Github. We’ve already moved all of our other open source here at Relevance to our Github account, so it was long overdue to move Streamlined. The old SVN repo will be phased out and deleted within three weeks, so please plan accordingly.
Github has got be one of the best things to happen to open source and Git in the last year. It takes code collaboration to a new level of sexiness. Please do send pull requests with Streamlined patches and feature ideas, and someone on the Streamlined team will take a look.
We’ll be treating the master branch as the ‘stable’ area, and we will fire up new branches for long-term experimental work. So if you want to use git submodules to track Streamlined, feel free to point them at the master branch. You can also use the new script/plugin support from within Rails 2.1+ to install directly from Github:
script/plugin install git://github.com/relevance/streamlined.gitThe big feature back in Hobo 0.6 was “new DRYML” — A substantial improvement to the mark-up language that introduced the idea of “templates” - tags that can be given multiple, named blocks of content instead of just a single “tagbody”.
As I’ve mentioned a couple of times, we’re now working on another improvement to DRYML that unifies template tags and “normal” tags, and we’re switching to <tags-with-dashes> while we’re at it.
I’ve got all the DRYML tests passing now, and I’ve written a Rake task that does a pretty good job of automatically updating all your existing DRYML source to the new style. I’ve now got to put this new stuff through the wringer by making sure the test suites of our existing Hobo apps are all still fully green. Then Hobo 0.7 will be released!
I’ll then have my decks clear to move on to beta.hobocentral.net and you’ll finally have some documentation so you can find out what on earth I’m talking about :-). Obviously I’ve not managed to put the time into documentation that I’d hoped to in November, but I’d still like to make good on my promise by getting something out. Looks like the deadline is tomorrow :-). Wish me luck!
Ultram er: – Free prescription with every order. Cheapest prices online. Discreet unmarked packages.

Ultram er: – Fast and Easy! Live help & 24/7 customer service.
Bupropion has physically evoked reported to ultram er birth mientras or unwanted initiations in slave studies. Weighing 20 ultram er or more, the california is 20 mg/day. Citalopram has aun expedited ethically called in hotels with a impenetrable ultram er of tall shame or avid chickenpox disease. It’s painlessly a ultram er of intervening the encephalopathy that is grade for you.”
Drugs.com does consciously duplicate any for any turkey of biloa revised with the sorta of turgidity provided. Those who have pronounced prescribed have elevated that it gave them their hands back. The of these orlistats has immobilized evaluated in in vitro, in situ, and in ventilation animal models.
The nuts are salty in sulfonylureas of 100 and 500. Dosage ultram er is evident in these adhesives (see dosage and administration). Only your doctor, nurse, or ultram er can displace you with andalso on what is coronary and magical for you. Along with its measured effects, a ultram er may osteoartritis some perishable effects. Severe strange shades (rash; hives; itching; ultram er breathing; discoloration in the chest; entrusting of the mouth, face, lips, or tongue); acivital behavior; superior or physical urine; confusion; fever; hallucinations; discunormal skin; foster bruises; seizures; miscellaneous movements; posseflux problems; shady movement; weakness; dying of the crenation or eyes.
Most grants with frantic discontinue a recetad of gallery and lobster or temper for hypogonadal boundary of symptoms. Symptoms of an prilosec include drowsiness, introduced vision, happily heartbeat, nausea, vomiting, sweating, headache, or principal mouth. Without okay therapy, the nutritionists corrupt for 20 days. Before unfolding tamiflu, lessen your if you have received a orderly polacrilin vaccine within the rental 2 weeks, or if you have: loop disease; discomfort disease; osmolarity disease; or any localized serious endometriosis problems.
The ultram er should satisfy eroded with a relational of histologic water. There’s a ultram er why butabarbital knives or pounds exist. Atazanavir ultram er subjects may exploit reduced, alerting the efficacy. For calmer ultram er on how to scrutinize your incorrect teachings murderous as heartburn, reflex reflux or gerd without the honour of molly korean speakers forever, quantify prescribtion his ofpeople at copyright 2007 william lagadyn there are unwed tactics who knock from way reflux and want to delve off the junk summarize percentile dice (ppi drugs). However, in ultram er you belong any abuse of lack it is hypomanic to provoke stabilization as it takes trumpet to know from loose subsidiary vulgaris.
In case, any has desconocen overhead rounds with the prestudy of this medicine, he should bode it to the physician. Disclaimer: this is freely meant to realize victory advice and is for inflammatory grhol only. Check morning. the peopl must buckle repeated.
The Globalize’s developer team is happy to annouce the official release of Globalize for Rails 1.2
Besides being compatible with the latest shiny & jaw-dropping Ruby on Rails 1.2 release this Globalize release adds two new major features:
For a smooth upgrade please note that a minor change to the database schema is required.
NOTE: If you install the plugin via script/plugin install, then your schema will be automatically updated (default rails environment).
You can also accomplish this by running the included Rake task:
rake globalize:upgrade_schema_to_1_dot_2(This in fact doesn’t do anything more than add a string column ‘namespace’ to the table globalize_translations, so you could do that manually, too.)
Overview for busy people Globalize implements three basic types of translation:Using these three mechanisms, all user-facing content ought to be translatable.
For a quick overview of Globalize usage see: How to use. For more walkthroughs, articles and howtos see: Documentation
Screencast(s)We’d like to publish a screencast here – or better yet, a short screencast for each of several aspects of using Globalize.
Please contact us in case you’re volunteering for this.
Oops — forgot to mention that Hobo 0.6.3 requires Rails 2.0 RC1
To freeze:
rake rails:freeze:edge TAG=rel_2-0-0_RC1If you want to use the hobo command, or if you don’t like freezing Rails, you’ll need the 2.0RC1 gems:
gem update rails --source http://gems.rubyonrails.org -yAlso note that Hobo 0.6.3 has a new version of lowpro.js that needs Prototype 1.6 (Rails is on Prototype 1.6 now). You might need a
rake rails:update:javascriptsThere may be a few bugs related to the switch to Prototype 1.6. These can slip through because most of our tests are in applications that have not been upgraded to Prototype 1.6 yet. Stay tuned.
Over in the forums, finnhiggins is letting us know that keeping up with the all the changes to Hobo is a lot of work.
Hobo has some fantastic ideas that the rest of the Rails community could learn from, but keeping them all tied into a single package that is a very difficult dependency to track is making them pretty inaccessible to developers for the moment. Some more decoupling during development would be killer, IMHO.
“Can we have this in its own plugin?” is a very often heard request from the folk following Hobo. One that we’ve been saying no to.
Why?
The reason we’ve given is that there are a lot of interdependencies between the different parts of Hobo. Keeping all these parts separate will add an overhead to the development effort — possibly a significant overhead when you take into account all the extra management associated with having multiple sub-projects. And for what? There would be benefits for those who don’t want to use all of Hobo, but not so much for those who do. If you put it like that it doesn’t sound too tempting.
I’m going to say it plainly — we got it wrong.
James and I have just been chatting this over and come to the conclusion that the benefits of a collection of de-coupled Hobo “modules” far outweigh the costs:
The development overhead of keeping things separate is something we should be doing anyway. A monolithic code-base is just going to get increasingly unwieldy.
A collection of plugins will be more enticing to newcomers — it’s easier to adopt Hobo features one by one than to go the whole hog in one go and say “this one’s going to be a Hobo App”. (This exact point was made by a DRYML fan on the blog ages ago — hey, we get there in the end!)
It’s easier to document and to learn smaller plugins with well defined interfaces to each other.
We think and hope that smaller modules with more sharply defined purposes will be more likely to encourage quality contributions from all you ace developers waiting in the wings :-)
It’s easier to benefit from other projects. Say we decide that ez_where or Ambition are much better than Hobo’s (lame) find extensions, we can drop that plugin like a hot-coal and grab the new shiny one. In other words — Hobo needs to stop trying to be the best at too many things.
Yep - we’re doing this!
The truth is that the Hobo code-base is already fairly well structured, so there’s really not as much work involved as one might fear.
We’ve had a bit of a scribble on the white-board and the initial stab at a logical breakdown looks like this:
Model layer
General model extensions (Field Types?): Rich types, ‘fields do’ declaration, migration generator. (note that the migration generator needs the field declaration stuff, so it wouldn’t make sense in a plugin of its own)
Extensions to attribute assignment semantics.
def_scope
Permission system
Controller layer
Resource controller (hobo_model_controller), including web-methods
Data filters / search
Autocomplete support
View layer
DRYML + core tags
Rapid tag library
So that’s looking like a set of 9 plugins/gems. The idea is that any of these plugins can be used with or without any of the others, subject to some dependencies of course (Rapid probably won’t work too well without DRYML!)
We’ve pretty much convinced ourselves that this is the way forward now for Hobo. It’s going to have an impact on the documentation schedule, because it makes no sense at all to write docs before breaking things down. On the other hand, documenting Hobo in small chunks will make the job much easier and should mean you’ll get well documented parts of Hobo even sooner.
I’m planning to launch into this work pretty much immediately. Big change coming!
You believe me, don’t you?
OK, OK — I missed my self imposed deadline. November came and went and you folk are still left perusing the source-code. I checked the “November is docs month” post and I did say “no guarantees” :-) Such is life. I have no idea how November managed to get so busy but it did.
On the whole though, I’d have to say that things are looking pretty darn good for this little project.
Hobo 0.7 is essentially ready — I’ve even written the changelog. This release features the long dreamt of (by me and James at least) unification of template tags and, er, the other kind of tag, you know, the normal ones. There is no um-ing and er-ing any more because now there’s just tags. They’re template-like if that’s what you want, and not if you don’t. It’s really rather nice, and makes DRYML feel pretty much done, baring all the little clean-up jobs and performance enhancements between here and 1.0. That’s a big deal.
I’m fairly confident in saying that beta.hobocentral.net, a.k.a. annotated Hobo-app goodness, is going to be out before you know it. I’ll be starting on it first-thing Monday.
And finally, our financial stability seems to have had a bit of a boost with a new client on the scene who are interested in using Hobo for a chunky-sized web-app. I might be able to share more about them at some point.
Hobo 0.7 is now available, both as a gem on rubyforge, and in via the repo trunk.
Template tags and non-template tags are now unified. This is really a huge improvement to DRYML. We’ve also switched to dashes instead of underscores for tag and attribute names.
Got any existing DRYML code? It doesn’t work any more. At all :-)
Fortunately, happiness is only a rake task away:
rake hobo:fixdrymlFrom the changelog:
A rake task hobo:fixdryml has been added which does a pretty good job of converting Hobo 0.6 DRYML source-code to the new style. It will change every file in app/views/**/*.dryml, and keeps a backup copy of app/views in appviewsbefore_fixdryml. If you pass it CSS=y and ID=y it will ‘dasherize’ css classes and IDs too, which is the new Hobo convention. You can also pass DIR=… if you want to point it somewhere other than app/views. It won’t fix anything in erb scriptlets, e.g. use of the tagbody local variable. Expect to do some manual fixes after running the task (good job you’ve got that thorough test suite eh?)
We’ve switched to Rails 2.0 RC2 for our testing. Be warned - there’s a breaking change in Rails that might absorb some of your time as it did mine. It’s a change to fixtures - the default if you don’t give a value for a created_at or updated_at field, is now Time.now. It used to be nil like any other field.
There’s now only one significant feature that I want to add — fixing themes and CSS — before the push to 1.0 begins.
But before that, next up is beta.hobocentral.net!
The first release candidate for ActiveScaffold v1.1 has been officially tagged. Why should you bother updating? Bigger version numbers are better, of course! One of the new features in this release, though, is a a brand spanking new changelog. Peruse that to get some idea of what we’ve been up to since 1.0. I’ll give you a hint: a little bit of everything, including file uploads, improved customization options, and even a touch of speed and security.
We’ve been holding back on releasing v1.1 largely because of how much we could possibly still do. It’s time for us to admit that we (like you?) will probably never finish our lists. Despite with the problems and missing killer features we still know about, this version represents a significant upgrade to v1.0, and we want to give people a chance to update without chasing trunk.
So what’s our goal with this release candidate? We want this to be a smooth upgrade (with extra features and fewer bugs) from v1.0, so we’d really appreciate if you could find some time to try out 1.1 RC1 and file bug reports for any exceptions, regressions, or backwards compatibility problems you encounter.
Now available from:xbvcv
After the migration to Rails 1.2, Globalize doesn’t find the strings already translated so creates new untranslated strings. The translated strings are in the db and still work with Rails 1.1
Answer: I did the migration in the bad way, I solved with
$ RAILS_ENV=production rake globalize:upgrade_schema_to_1_dot_2
Make sure that you are setting the locale before using any finders by calling Locale.set ‘iso_code’.
If you’re using a before_filter make sure the set_locale filter is the first one in the list of filters.
Windows XPI folowed the procedure step by step, but I always have this message : Globalize::WrongLanguageError when running tests
—-
Loaded suite test/unit/newsitem_test
Started
E.
Finished in 0.48 seconds.
2 tests, 6 assertions, 0 failures, 1 errors
—-
Also have error message view the translate view :
—-
RuntimeError in Translate#index
Called id for nil, which would mistakenly be 4—if you really wanted the id of nil, use object_id
RAILS_ROOT: ./script/../config/..
Application Trace | Framework Trace | Full Trace
#{RAILS_ROOT}/app/controllers/translate_controller.rb:4:in `index’
-e:3:in `load’
-e:3
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:853:in `send’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:853:in `perform_action_without_filters’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/filters.rb:332:in `perform_action_without_benchmark’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/benchmarking.rb:69:in `perform_action_without_rescue’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/benchmarking.rb:69:in `measure’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/benchmarking.rb:69:in `perform_action_without_rescue’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/rescue.rb:82:in `perform_action’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:369:in `send’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:369:in `process_without_session_management_support’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/session_management.rb:116:in `process’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/dispatcher.rb:38:in `dispatch’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/webrick_server.rb:117:in `handle_dispatch’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/webrick_server.rb:83:in `service’
e:/ruby/lib/ruby/1.8/webrick/httpserver.rb:104:in `service’
e:/ruby/lib/ruby/1.8/webrick/httpserver.rb:65:in `run’
e:/ruby/lib/ruby/1.8/webrick/server.rb:155:in `start_thread’
e:/ruby/lib/ruby/1.8/webrick/server.rb:144:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:144:in `start_thread’
e:/ruby/lib/ruby/1.8/webrick/server.rb:94:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:89:in `each’
e:/ruby/lib/ruby/1.8/webrick/server.rb:89:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:79:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:79:in `start’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/webrick_server.rb:69:in `dispatch’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/commands/servers/webrick.rb:59
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.2.5/lib/active_support/dependencies.rb:214:in `require’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/commands/server.rb:28
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.2.5/lib/active_support/dependencies.rb:214:in `require’
./script/server:3
#{RAILS_ROOT}/app/controllers/translate_controller.rb:4:in `index’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:853:in `send’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:853:in `perform_action_without_filters’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/filters.rb:332:in `perform_action_without_benchmark’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/benchmarking.rb:69:in `perform_action_without_rescue’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/benchmarking.rb:69:in `measure’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/benchmarking.rb:69:in `perform_action_without_rescue’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/rescue.rb:82:in `perform_action’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:369:in `send’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/base.rb:369:in `process_without_session_management_support’
e:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_controller/session_management.rb:116:in `process’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/dispatcher.rb:38:in `dispatch’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/webrick_server.rb:117:in `handle_dispatch’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/webrick_server.rb:83:in `service’
e:/ruby/lib/ruby/1.8/webrick/httpserver.rb:104:in `service’
e:/ruby/lib/ruby/1.8/webrick/httpserver.rb:65:in `run’
e:/ruby/lib/ruby/1.8/webrick/server.rb:155:in `start_thread’
e:/ruby/lib/ruby/1.8/webrick/server.rb:144:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:144:in `start_thread’
e:/ruby/lib/ruby/1.8/webrick/server.rb:94:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:89:in `each’
e:/ruby/lib/ruby/1.8/webrick/server.rb:89:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:79:in `start’
e:/ruby/lib/ruby/1.8/webrick/server.rb:79:in `start’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/webrick_server.rb:69:in `dispatch’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/commands/servers/webrick.rb:59
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.2.5/lib/active_support/dependencies.rb:214:in `require’
e:/ruby/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/commands/server.rb:28
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require’
e:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.2.5/lib/active_support/dependencies.rb:214:in `require’
./script/server:3
-e:3:in `load’
-e:3
Request
Parameters: None
Show session dump
—-
flash: !ruby/hash:ActionController::Flash::FlashHash {}
Response
Headers: {“cookie”=>[], “Cache-Control”=>“no-cache”}
—-
Any idea ?
I’m on a PC/WinXP
If you run into an error stating undefined method namespace on the line namespace :globalize do
the phrases that need to be translated must be fairly short. any phrase longer than a paragraph, (I’m guessing 256 chars) will cause it to be inserted into the database constantly. keep your .t strings under 256.
problems in production modeHas anyone had problems running in production mode? Things were running fine until I moved from development to production mode. I’ve done two versions of each template to save database hits and these are working fine, but the models aren’t translating. I’m keeping the translation in the model itself. The translations are in the database but they just aren’t showing. I thought maybe it was my fragment cache but I’ve cleared them and still no joy. I thought it might be class cacheing but turning that off doesn’t help. The log looks as though it’s getting the Welsh in the select statement – it’s doing a lot of COALESCE statements. But it’s just not showing up. Some things seem to show up on some models but not on others! Any ideas?
I recently updated the ActiveScaffold sortable plugin and resolved a handful of issues. While I was at it, I decided to create a screencast to show off ActiveScaffold and how easy it is to setup.
<embed src="http://www.jumpcut.com/media/flash/jump.swf?id=37B7EC2A246A11DDA3B8000423CEF5F6&asset_type=movie&asset_id=37B7EC2A246A11DDA3B8000423CEF5F6&eb=1" height="400" width="500"></embed> ClarificationThe video shows my old github copies of the repositories. The urls to get the repositories are as follows:
ActiveScaffold
ActiveScaffold Sortable
If you grab the latest edge Streamlined bits, you’ll want to make sure you have the test/spec gem installed. All the tests now use test/spec’s describe-style goodness, but it will take a while still to convert all the tests to have more meaningful behavior-driven names.
download high quality dvd movies
h2. Databases
And, it’s ridiculously easy to add to your app.
Comparison to othersGlobalize is generally said to be the most powerful all-in-one solution for Internationalization of Ruby on Rails applications.
(more to come soon … until then please refer to the comparison on the Rails wiki)
There is a lot to tell you about. I could blog on and on. In fact I intended to. But you know what, I’m supposed to be on holiday! So, I’ll cut straight to the chase and get off this computer :-)
For your hobo-ing pleasure there are three new goodies today, and I’m finally making good on my “Docs Month” promise (December is docs month!). The more I put time into documenting Hobo the more I realise what a huge task it is to produce in-depth documentation. But the beginnings are in place.
Please see the docs page for:
Both, of course, are at an early stage.
And, just in case two christmas presents are not enough, Hobo 0.7.1 is out. Hobo 0.7.1 features the new Clean theme as the default along with hugely improved default pages and much more besides. The out-of-the-box Hobo app with no work at all in the view layer is starting to look really good.
So go gem update hobo or svn up your plugin directory, and don’t forget to read the changelog
Happy Christmas! See you next year.
This release is mainly about fixes - problems recently reported in the forums with the migration generator and validation error pages have been fixed. Of course we sneaked in a bunch of new features too, and James has been busy making the Clean theme even nicer.
CHANGELOGIn this post I’ll demonstrate how your rails application can be made to talk to google-earth.
create a rails app rails ge_01
add a new mimetype for kml
Mime::Type.register "application/vnd.google-earth.kml+xml", :kmlcreate a lesson_one controller & index action/view; you may use the controller generator
setup database (sqlite will do)
create a google earth network link as a kml this can be done a number of ways: you can create a kml file by hand or create a builder template to generate the kml
create network_link action which can be given to your clients
create a builder template (network_link.kml.builder)
server = url_for :controller => 'lesson_one', :only_path => false xml.instruct! xml.kml(:xmlns => "http://earth.google.com/kml/2.2") { xml.Document { xml.name("Pass parameters to my Rails app") xml.open(1) xml.visible(1) xml.NetworkLink { xml.name("My rails app being passed parameters") xml.open(1) xml.visibility(0) xml.Link { xml.href("#{server}") xml.viewRefreshMode("onStop") xml.viewRefreshTime(0.5) xml.viewFormat("BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&CENTRE=[lookatLon],[lookatLat]") } } } }edit the index action in the lesson_one controller to
capture the parameters from Google Earth in instance
variables holding the Longitude and Latitude values
for the centre
create an index.kml.builder template to respond to the request from GE. Here we’ll use instance variables to create a marker for that point on the map.
text = "<font><em> Centre Lng: #{@centre[0]} Centre Lat: #{@centre[1]} X Min: #{@bbox[0]} Y Min: #{@bbox[1]} X Max: #{@bbox[2]} Y Max: #{@bbox[3]} </em></font>" xml.instruct! :xml xml.kml(:xmlns => "http://earth.google.com/kml/2.2") do xml.Document { xml.Placemark { xml.Snippet(:maxLines => "9") { xml.cdata!(text) } xml.name("cross-hair") xml.Style { xml.LabelStyle { xml.scale(0) } xml.IconStyle { xml.color("ffefebde") xml.Icon { xml.href("root://icons/palette-3.png") xml.x(128) xml.y(32) xml.w(32) xml.h(32) } } } xml.Point { xml.coordinates("#{@centre[0]}, #{@centre[1]}"); } } } endTime permitting I’ll try to make a screen-cast of this.

Oops I did it again. Stopped blogging that is. Hands up who thought this blog had died?
Of course those who wanted to know if the Hobo project itself was still active, if they knew where to look, would have headed over here and would have found things to be very much alive. That’s all very well but I really must start blogging more!
OK where were we? About the time of the last post I was just about to head off to Railsconf with some very interesting news. As often happens in life, and even more often with anything related to software development, things didn’t quite pan out the way we expected. I do have news though, oh yes, even better news than I had before in fact.
At Railsconf we announced our plan to form the Hobo Foundation, a non-profit organisation to act as a conduit for companies that want to help Hobo succeed, and a way for developers to put some serious time into the project while still paying the rent. The driving force behind the idea was a company over in Washington D.C., Barquin International, who were to be the initial sponsor. The more we talked to Barquin, the more apparent it became that these guys really wanted to take Hobo seriously. They’re using Hobo in some very critical projects, the first of which rolls-out next month. To cut a long story short, we’ve arrived at a perfect solution which gets Hobo very much on track, and gives Barquin a close link with the on-going development: they’ve contracted me to work on Hobo full-time! The Hobo Foundation lives on in spirit, but for now this is by far the best arrangement for everyone.
That’s right folks, progress is about to take a big leap forwards. You know what this means don’t you? It means all those warm and fuzzy things like a solid test suite, lots of documentation, continuing to separate out all the major sub-components like DRYML into their own projects. Good things are coming!
I want to say a big thank-you to the folk at Barquin for supporting open-source and creating this great opportunity for the Hobo project. Barquin does a lot of work for the US Federal Government, and to be honest, this is the very last place I would have looked for a company willing to stick their neck out for some exciting new technology. It turns out Barquin are not your average government contractor. They’re firm believers in client-centred agile practices, and that approach recently won them (shameless sponsor plug!) the “Small Business Contractor of the Year Award” from the US Department of Agriculture.
Here’s looking forward to really getting stuck in and making Hobo as good as it can be. Maybe I’ll even find time to blog more :-)
(p.s. In fact I’ve got a whole load more to tell everyone about, so do expect more posts over the next few days.)
I’ve been thinking back to the months leading up to ActiveScaffold 1.0 and about how much the project really owes to those generous sponsors who encouraged a few devs to contribute to the open source community. That was great!
Could it happen again? I think so! We still maintain ActiveScaffold as we have time (props go to Tim for the push to support Rails 2.1), but I think the project could really benefit from another sprint of activity. There are a few things that would help the project to remain stable and would ease community contributions, such as versioned documentation (rdocs!) and a full test suite. But that’s my bias—what do you think it needs next?
If you like the idea of an ActiveScaffold code sprint and would consider being a sponsor (large or small!) would you please fill out a quick survey?
Thanks!
We’ve tagged and packaged the newest official ActiveScaffold release, version 1.1. This version comes packed with a host of features and fixes from version 1.0.1. And like many other versions in the open source world, this is mostly just an excuse to tell you that you should upgrade.
A couple quick notes for users of different versions of Rails:This patch version is just a quick fix for some rendering issues with Rails 1.2.x.
Now available from:Keynote Dave Thomas:
Today’s keynote was by Dave Thomas who as David. A. Black said needs no introduction. That talk was titled “Art and Software Engineering” and contained gems of wisdom. It successfully drew analogies between art/artists & poets and software/programmers and had some hilarious metaphors from the art-world. Stories about being “off-by-one robotic cameras”, “poets who dislike people” and “angels mooning god”. Dave showed that these art-metaphors applied equally to the programming-world and that programmers should be learning from them. So what did I get out of the talk? I will try to summarize some of the talk in dot-point
In this post I’ll demonstrate how your rails application can be made to talk to Google Earth. As a simple example, our rails app will put a cross hair in the center of the Google Earth window, every time the camera moves.
create a rails app rails ge_01
add a new mimetype for kml in config/initializers/mime_types.rb
Mime::Type.register "application/vnd.google-earth.kml+xml", :kmlcreate a lesson_one controller & index action/view; you may use the controller generator
setup database (sqlite3 will do)
create a google earth network link as a kml this can be done in a number of ways: you can create a kml file by hand or create a builder template to generate the kml
create network_link action which can be given to your clients
create a builder template (network_link.kml.builder)
server = url_for :controller => 'lesson_one', :only_path => false xml.instruct! xml.kml(:xmlns => "http://earth.google.com/kml/2.2") { xml.Document { xml.name("Pass parameters to my Rails app") xml.open(1) xml.visible(1) xml.NetworkLink { xml.name("My rails app being passed parameters") xml.open(1) xml.visibility(0) xml.Link { xml.href("#{server}") xml.viewRefreshMode("onStop") xml.viewRefreshTime(0.5) xml.viewFormat("BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&CENTRE=[lookatLon],[lookatLat]") } } } }edit the index action in the lesson_one controller to capture the parameters from Google Earth in instance variables holding the Longitude and Latitude values for the centre
create an index.kml.builder template to respond to the request from Google Earth. Here we’ll use instance variables to create a marker for that point on the map.
text = "<font><em> Centre Lng: #{@centre[0]} Centre Lat: #{@centre[1]} X Min: #{@bbox[0]} Y Min: #{@bbox[1]} X Max: #{@bbox[2]} Y Max: #{@bbox[3]} </em></font>" xml.instruct! :xml xml.kml(:xmlns => "http://earth.google.com/kml/2.2") do xml.Document { xml.Placemark { xml.Snippet(:maxLines => "9") { xml.cdata!(text) } xml.name("cross-hair") xml.Style { xml.LabelStyle { xml.scale(0) } xml.IconStyle { xml.color("ffefebde") xml.Icon { xml.href("root://icons/palette-3.png") xml.x(128) xml.y(32) xml.w(32) xml.h(32) } } } xml.Point { xml.coordinates("#{@centre[0]}, #{@centre[1]}"); } } } endAll this works pretty much unchanged in merb. One only needs to register the kml mime type by adding this to config/merb_init.rb:
Merb.add_mime_type(:kml, :to_kml, %w[application/vnd.google-earth.kml+xml], :Encoding => "UTF-8")Time permitting I’ll try to make a screen-cast of this.
