25 grudnia 2010

Świąteczne próby z JRuby on Rails

Jeszcze przed wigilią udało mi się znaleźć chwilę, aby popróbować się z JRuby on Rails. Swoje doświadczenia oznajmiam na kanale @jaceklaskowski na twitterze i okazuje się, że stamtąd głównie czerpałem natchnienie do dalszych aktywności w temacie. Ech, gdyby tylko twitter pozwalał na dłuższe wypowiedzi...

Zająłem się Rails, głównie z powodu jego powszechnie znanego upraszczania tworzenia aplikacji webowych. Gdziekolwiek nie spojrzę widzę zestawienia, które świadczą o jego prostocie, co ma przekładać się na rzekome zwiększenie produktywności. Samodzielnie chciałem przekonać się, ile w tym prawdy i co takiego ma Rails czego nie mają inne rozwiązania na bazie JEE, a dokładniej rzecz ujmując, chciałem dowiedzieć się, jak zrealizowane jest tworzenie warstwy interfejsu użytkownika. Mam do dyspozycji Grails (wzorowany na Rails) i jest JSF z facelets, Wicket, GWT oraz nieznany mi Play Framework i Vaadin. Jest z czego wybierać, a chciałbym umieć wybierać właściwie. W JSP mamy HTML ze specjalizowanymi znacznikami, JSF to facelets i XHTML ze specjalizowanymi znacznikami, GWT oferuje HTML na podstawie kodu w Javie, a najmniej inwazyjnym rozwiązaniem pod względem możliwości użycia edytorów HTML do tworzenia UI wydają mi się Wicket i Tapestry, które po prostu wskazują na miejsca dynamicznie podstawiane przez specjalny atrybut, np. wicket:id. To ma dla mnie bardzo duże znaczenie, kiedy mogę wskazać osoby w zespole (którego nigdy jednak nie miałem na wyłączność, więc praktycznie nie mam praktycznego zweryfikowania tego postulatu), które mogą używać narzędzi właściwych dla obsługiwanego problemu - w tym przypadku edycji HTML.

Mam pewne doświadczenie z Grails - odpowiednikiem Rails na platformę Java, w którym językiem wiodącym jest Groovy, więc tym bardziej zachodziłem w głowę, czym mógłby mnie urzec Rails. Biorąc pod uwagę, że i Rails i Grails realizują te same koncepcje, a dokładniej rzecz ujmując Grails powstał jako odpowiednik Rails, przez co w zasadzie są bardzo zbliżone do siebie, nie mogłem znaleźć odpowiedzi na pytanie: "Dlaczego w ogóle miałbym chcieć spojrzeć na Rails, skoro mam Grails?" Pomijając zaletę poznawania nowego, jeśli owe nowe ma być jedynie nowym w sensie nomenklatury, a detale zostają te same, to szkoda czasu - są inne rzeczy, które czekają na mnie.

Z takim nastawieniem podszedłem do tematu poznania Rails z JRuby jako język programowania.

Zacząłem od instalacji JRuby, która sprowadziła się rozpakowania w odpowiednim katalogu i dodania podkatalogu bin do zmiennej PATH. Od tej pory polecenie jruby widoczne było z dowolnego katalogu. Super proste i w zasadzie niczego innego nie oczekiwałem. Zdecydowanie na plus i zachęca do dalszej lektury. Niestety nie można tego powiedzieć o stronie Getting Started na jruby.org, która po poinformowaniu użytkownika, że od tej pory polecenie jruby -v zwróci wersję, nic więcej nie przekazuje. Pozostawia nowicjusza we mgle i nie wprost każe mu z niej wyjść.
$ jruby -v
jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2010-12-03 9cf97c3) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_22) [x86_64-java]
W poszukiwaniu przewodnika, przejrzałem dostępne książki o Rails w books24x7 (jako pracownik IBM mam do niej wgląd bezpłatnie) i trafiłem na Building Dynamic Web 2.0 Websites with Ruby on Rails: Create Database-Driven Dynamic Websites With This Open-Source Web Application Framework z wydawnictwa Packt Publishing z roku 2008. Od razu przeszedłem do rozdziału Chapter 1: Getting Started with Ruby and RoR. Interesowało mnie, co należy dalej począć ze świeżo zainstalowanym JRuby. W końcu nie sam język JRuby był dla mnie interesujący, ale sposób, w jaki Rails korzysta z tego języka do budowania aplikacji webowych, a dokładniej, jak budowane są strony.

Pierwszy rozdział zaczyna się dokładnie tak, z jakim nastawieniem zabrałem się za Rails.

'Which is the best framework for web application development?' This question is asked in different ways and forms. The answer, however, always remains the same — 'The one that enhances productivity'. The next obvious query would be 'In that case which is the framework that enhances productivity?' After some debates and deliberations, we can conclude, 'A framework that reduces Boilerplate code and also reduces the learning curve is the one that increases productivity.'

Pojawia się polecenie gem, które dostarczane jest razem z JRuby.
$ type gem
gem is hashed (/Users/jacek/apps/jruby/bin/gem)
W książce wykonano gem update, więc i ja wykonałem. Nie spodziewałem się wielu poprawek, ale poniżej widać, jak bardzo się myliłem.
$ gem update
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
Updating installed gems
Updating columnize
Successfully installed columnize-0.3.2
Updating rspec
**************************************************

  Thank you for installing rspec-core-2.3.1

  Please be sure to look at the upgrade instructions to see what might have
  changed since the last release:

  http://github.com/rspec/rspec-core/blob/master/Upgrade.markdown

**************************************************
Successfully installed rspec-core-2.3.1
Successfully installed diff-lcs-1.1.2
Successfully installed rspec-expectations-2.3.0
Successfully installed rspec-mocks-2.3.0
Successfully installed rspec-2.3.0
Updating ruby-debug
Building native extensions.  This could take a while...
ERROR:  Error installing ruby-debug:
 ERROR: Failed to build gem native extension.

/Users/jacek/apps/jruby/bin/jruby extconf.rb
WARNING: JRuby does not support native extensions or the `mkmf' library.
         Check http://kenai.com/projects/jruby/pages/Home for alternatives.
extconf.rb:16: undefined method `create_makefile' for main:Object (NoMethodError)


Gem files will remain installed in /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/linecache-0.43 for inspection.
Results logged to /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/linecache-0.43/ext/gem_make.out
Updating ruby-debug-base
Building native extensions.  This could take a while...
ERROR:  Error installing ruby-debug-base:
 ERROR: Failed to build gem native extension.

/Users/jacek/apps/jruby/bin/jruby extconf.rb
WARNING: JRuby does not support native extensions or the `mkmf' library.
         Check http://kenai.com/projects/jruby/pages/Home for alternatives.
extconf.rb:16: undefined method `create_makefile' for main:Object (NoMethodError)

Gem files will remain installed in /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/linecache-0.43 for inspection.
Results logged to /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/linecache-0.43/ext/gem_make.out
Gems updated: columnize, rspec-core, diff-lcs, rspec-expectations, rspec-mocks, rspec
Installing ri documentation for columnize-0.3.2...
Installing ri documentation for rspec-core-2.3.1...
Installing ri documentation for diff-lcs-1.1.2...
Installing ri documentation for rspec-expectations-2.3.0...
Installing ri documentation for rspec-mocks-2.3.0...
Installing ri documentation for rspec-2.3.0...
Installing RDoc documentation for columnize-0.3.2...
Installing RDoc documentation for rspec-core-2.3.1...
Installing RDoc documentation for diff-lcs-1.1.2...
Installing RDoc documentation for rspec-expectations-2.3.0...
Installing RDoc documentation for rspec-mocks-2.3.0...
Installing RDoc documentation for rspec-2.3.0...
W końcu pojawia się sekcja Installing RoR - podobno wystarczy gem install rails --include-dependencies.
$ gem install rails --include-dependencies
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list

Successfully installed activesupport-3.0.3
Successfully installed builder-2.1.2
Successfully installed i18n-0.5.0
Successfully installed activemodel-3.0.3
Successfully installed rack-1.2.1
Successfully installed rack-test-0.5.6
Successfully installed rack-mount-0.6.13
Successfully installed tzinfo-0.3.23
Successfully installed abstract-1.0.0
Successfully installed erubis-2.6.6
Successfully installed actionpack-3.0.3
Successfully installed arel-2.0.6
Successfully installed activerecord-3.0.3
Successfully installed activeresource-3.0.3
Successfully installed mime-types-1.16
Successfully installed polyglot-0.3.1
Successfully installed treetop-1.4.9
Successfully installed mail-2.2.13
Successfully installed actionmailer-3.0.3
Successfully installed thor-0.14.6
Successfully installed railties-3.0.3
Successfully installed bundler-1.0.7
Successfully installed rails-3.0.3
23 gems installed
Installing ri documentation for activesupport-3.0.3...
Installing ri documentation for builder-2.1.2...
ERROR:  While generating documentation for builder-2.1.2
... MESSAGE:   Unhandled special: Special: type=17, text=""
... RDOC args: --ri --op /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/doc/builder-2.1.2/ri --title Builder -- Easy XML Building --main README --line-numbers --quiet lib CHANGES Rakefile README doc/releases/builder-1.2.4.rdoc doc/releases/builder-2.0.0.rdoc doc/releases/builder-2.1.1.rdoc --title builder-2.1.2 Documentation
(continuing with the rest of the installation)
Installing ri documentation for i18n-0.5.0...
Installing ri documentation for activemodel-3.0.3...
Installing ri documentation for rack-1.2.1...
Installing ri documentation for rack-test-0.5.6...
Installing ri documentation for rack-mount-0.6.13...
Installing ri documentation for tzinfo-0.3.23...
Installing ri documentation for abstract-1.0.0...
Installing ri documentation for erubis-2.6.6...
Installing ri documentation for actionpack-3.0.3...
Installing ri documentation for arel-2.0.6...
Installing ri documentation for activerecord-3.0.3...
Installing ri documentation for activeresource-3.0.3...
Installing ri documentation for mime-types-1.16...
Installing ri documentation for polyglot-0.3.1...
Installing ri documentation for treetop-1.4.9...
Installing ri documentation for mail-2.2.13...
Installing ri documentation for actionmailer-3.0.3...
Installing ri documentation for thor-0.14.6...
Installing ri documentation for railties-3.0.3...
Installing ri documentation for bundler-1.0.7...
Installing ri documentation for rails-3.0.3...
File not found: lib
Uruchomiłem to polecenie jeszcze raz, bo ten komunikat na samym końcu - File not found: lib - mnie zaniepokoił i liczyłem na poprawę.
$ gem install rails --include-dependencies
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Successfully installed rails-3.0.3
1 gem installed
Installing ri documentation for rails-3.0.3...
File not found: lib
Niestety to samo. Na razie nieważne.

Kolejna sekcja Testing the Installation dotyczyła (jak tytuł wskazuje) sprawdzenia, że środowisko jest faktycznie gotowe. Pierwszy skrypt w Ruby.
$ echo "print 'Hello Ruby'" > first.rb
$ cat first.rb 
print 'Hello Ruby'
$ jruby first.rb
Hello Ruby
To było proste, aczkolwiek w książce wyświetliło się "Hello from Ruby" - intrygujące przeoczenie.

Kolej na głównego sprawcę całego zamieszania - Rails. Tutaj wystarczyć miało rails test_app, ale niestety doświadczyłem kolejnego błędu w książce - brakujące new. Zaczyna być irytujące.
$ rails test_app
Usage:
  rails new APP_PATH [options]

Options:
  -r, [--ruby=PATH]           # Path to the Ruby binary of your choice
                              # Default: /Users/jacek/apps/jruby/bin/jruby
  -d, [--database=DATABASE]   # Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite3/frontbase/ibm_db)
                              # Default: sqlite3
  -b, [--builder=BUILDER]     # Path to an application builder (can be a filesystem path or URL)
  -m, [--template=TEMPLATE]   # Path to an application template (can be a filesystem path or URL)
      [--dev]                 # Setup the application with Gemfile pointing to your Rails checkout
      [--edge]                # Setup the application with Gemfile pointing to Rails repository
      [--skip-gemfile]        # Don't create a Gemfile
  -O, [--skip-active-record]  # Skip Active Record files
  -T, [--skip-test-unit]      # Skip Test::Unit files
  -J, [--skip-prototype]      # Skip Prototype files
  -G, [--skip-git]            # Skip Git ignores and keeps

Runtime options:
  -f, [--force]    # Overwrite files that already exist
  -p, [--pretend]  # Run but do not make any changes
  -q, [--quiet]    # Supress status output
  -s, [--skip]     # Skip files that already exist

Rails options:
  -v, [--version]  # Show Rails version number and quit
  -h, [--help]     # Show this help message and quit

Description:
    The 'rails new' command creates a new Rails application with a default
    directory structure and configuration at the path you specify.

Example:
    rails new ~/Code/Ruby/weblog

    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.
    See the README in the newly created application to get going.
Szczęśliwie Rails dba o takie szczegóły (zastanawiam się, czy nie mógłby jednak stworzyć tej aplikacji, skoro wiedział, że chodziło mi o rails new APP_PATH?!)

Podejście numer dwa - tym razem z new.
$ rails new test_app
      create  
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      ...
      create  vendor/plugins
      create  vendor/plugins/.gitkeep
Pojawiły się kolorowe create, więc znowu jest kolorowo. Pora na uruchomienie świeżoutworzonej aplikacji. Zgodnie z książką wystarczy wykonać polecenie jruby script/server.
jacek:~/sandbox
$ cd test_app/
jacek:~/sandbox/test_app
$ jruby script/server
Error opening script file: /Users/jacek/sandbox/test_app/script/server (No such file or directory)
Ale cóż to?! No such file or directory?! Nadeszła chwila pierwszego samodzielnego rozwiązywania problemów w Rails.
jacek:~/sandbox/test_app
$ ls -l script/
total 8
-rwxr-xr-x  1 jacek  staff  296 Dec 23 21:12 rails
jacek:~/sandbox/test_app
$ jruby script/rails 
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
Could not find gem 'sqlite3-ruby (>= 0, runtime)' in any of the gem sources listed in your Gemfile.
Try running `bundle install`.
Niestety, uruchomienie script/rails to zdecydowanie za mało. Zainstaluję kilka gemów - ciągle pojawiający się jruby-openssl oraz sqlite3-ruby. Może pomoże.
jacek:~/sandbox/test_app
$ gem install jruby-openssl sqlite3-ruby
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
Successfully installed bouncy-castle-java-1.5.0145.2
Successfully installed jruby-openssl-0.7.2
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3-ruby:
 ERROR: Failed to build gem native extension.

/Users/jacek/apps/jruby/bin/jruby extconf.rb
WARNING: JRuby does not support native extensions or the `mkmf' library.
         Check http://kenai.com/projects/jruby/pages/Home for alternatives.
extconf.rb:9: undefined method `dir_config' for main:Object (NoMethodError)

Gem files will remain installed in /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.2 for inspection.
Results logged to /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.2/ext/sqlite3/gem_make.out
2 gems installed
Installing ri documentation for bouncy-castle-java-1.5.0145.2...
Installing ri documentation for jruby-openssl-0.7.2...
Installing RDoc documentation for bouncy-castle-java-1.5.0145.2...
Installing RDoc documentation for jruby-openssl-0.7.2...
I jeszcze raz - jruby script/rails.
jacek:~/sandbox/test_app
$ jruby script/rails
Could not find gem 'sqlite3-ruby (>= 0, runtime)' in any of the gem sources listed in your Gemfile.
Try running `bundle install`.
Znowu to samo?! I co oznacza "Try running `bundle install`"?! Zaczyna przypominać poznawanie każdego innego nowego rozwiązania, gdzie zamiast obiecywanego, gładkiego wejścia mam przejścia.

Teraz dopiero zauważyłem, że podczas instalacji sqlite3-ruby pojawiły się błędy, aczkolwiek sam komunikat świadczy, że został zainstalowany mimo to.
ERROR:  Error installing sqlite3-ruby:
 ERROR: Failed to build gem native extension.

/Users/jacek/apps/jruby/bin/jruby extconf.rb
WARNING: JRuby does not support native extensions or the `mkmf' library.
         Check http://kenai.com/projects/jruby/pages/Home for alternatives.
extconf.rb:9: undefined method `dir_config' for main:Object (NoMethodError)

Gem files will remain installed in /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.2 for inspection.
Results logged to /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.2/ext/sqlite3/gem_make.out
Wchodzę na rubyonrails.org, aby poszukać artykułu-przewodnika. I tu kolejne zaskoczenie - sama strona domowa wskazuje na książki Agile Web Development with Rails (4th edition) oraz Rails Recipes, z których pierwsza jest w fazie BETA (wyglada jednak interesująco i zaplanowałem już sobie jej lekturę), a druga jest starociem i sugeruje się jej całkowite zapomnienie na rzecz Advanced Rails Recipes: 84 New Ways to Build Stunning Rails Apps. Na chwilę obecną zostanę przy dokumentacji dostępnej publicznie.

Zaczynam od Getting Started with Rails.

Zaraz na początku, przy 3.1 Installing Rails, zwróciłem uwagę na "Usually run this as the root user". A po co mi root?! A co mi tam, zaryzykuję i sprawdzę instalację z konta roota.
jacek:~/sandbox/test_app
$ sudo gem install rails
Password:
Successfully installed rails-3.0.3
1 gem installed
Installing ri documentation for rails-3.0.3...
File not found: lib
Znowu to "File not found: lib"!

W przewodniku tworzy się aplikację blog, ale ja pozostaję przy książkowej test_app. W sekcji 3.3 Installing the Required Gems dowiaduję się o tym magicznym poleceniu bundle install. Uruchamiam.
jacek:~/sandbox/test_app
$ bundle install
Fetching source index for http://rubygems.org/
Using rake (0.8.7) 
Using abstract (1.0.0) 
Using activesupport (3.0.3) 
...
 from /Users/jacek/apps/jruby/lib/ruby/site_ruby/1.8/rubygems/installer.rb:445:in `each'
 from /Users/jacek/apps/jruby/lib/ruby/site_ruby/1.8/rubygems/installer.rb:445:in `build_extensions'
 from /Users/jacek/apps/jruby/lib/ruby/site_ruby/1.8/rubygems/installer.rb:197:in `install'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/source.rb:95:in `install'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/installer.rb:55:in `run'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/spec_set.rb:12:in `each'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/spec_set.rb:12:in `each'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/installer.rb:44:in `run'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/installer.rb:8:in `install'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/cli.rb:225:in `install'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/vendor/thor/task.rb:21:in `run'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/vendor/thor/invocation.rb:118:in `invoke_task'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/vendor/thor.rb:246:in `dispatch'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/vendor/thor/base.rb:389:in `start'
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/bin/bundle:13
 from /Users/jacek/apps/jruby-1.5.6/lib/ruby/gems/1.8/gems/bundler-1.0.7/bin/bundle:19:in `load'
 from /Users/jacek/apps/jruby/bin/bundle:19
To znowu nie wygląda zachęcająco. Dopiero teraz przypomniałem sobie tweeta od Artura Karazniewicza, w którym pisał:

@jaceklaskowski $ rails new mynewapp -m http://jruby.org and go ahead! #jruby

Próbuję tej ścieżki.
jacek:~/sandbox
$ rails new mynewapp -m http://jruby.org
      create  
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      ...
      create  vendor/plugins
      create  vendor/plugins/.gitkeep
       apply  http://jruby.org
       apply    http://jruby.org/templates/default.rb
        gsub      Gemfile
Podczas tworzenia aplikacji pojawił się plik README, więc zgodnie z jego nazwą zabieram się za niego. Podobno wystarczy:

1. At the command prompt, create a new Rails application:
rails new myapp (where myapp is the application name)

2. Change directory to myapp and start the web server:
cd myapp; rails server (run with --help for options)

3. Go to http://localhost:3000/ and you'll see:
"Welcome aboard: You're riding Ruby on Rails!"

4. Follow the guidelines to start developing your application. You can find
the following resources handy:

* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
* Ruby on Rails Tutorial Book: http://www.railstutorial.org/

Teraz dostrzegam polecenie rails server.
jacek:~/sandbox/mynewapp
$ rails server
Could not find gem 'activerecord-jdbc-adapter (>= 0, runtime)' in any of the gem sources listed in your Gemfile.
Try running `bundle install`.
I znowu ten bundle install! Sprawdzam, co robi.
jacek:~/sandbox/mynewapp
$ bundle install
Fetching source index for http://rubygems.org/
Using rake (0.8.7) 
Using abstract (1.0.0) 
...
Using activerecord (3.0.3) 
Installing activerecord-jdbc-adapter (1.1.0) 
Using activeresource (3.0.3) 
Using bundler (1.0.7) 
Installing jdbc-sqlite3 (3.6.14.2.056) 
Using thor (0.14.6) 
Using railties (3.0.3) 
Using rails (3.0.3) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
W międzyczasie pojawił się tweet od Nicka Siegera, który doradził:

@jaceklaskowski try regenerating the app with "--template http://jruby.org" or change your Gemfile to use "activerecord-jdbcsqlite3-adapter"

Jestem wdzięczny za rady, ale będąc kompletnym laikiem w temacie nie mam bladego pojęcia, o czym się do mnie mówi. Doświadczam tego błogiego stanu bycia nowicjuszem, które miałem możliwość skosztować przy Clojure, a teraz pojawia się przy Rails. Wspaniała końcówka roku!

Sprawdzam, czy bundle install coś poprawił w mojej aplikacji.
jacek:~/sandbox/mynewapp
$ rails server
=> Booting WEBrick
=> Rails 3.0.3 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-12-23 21:56:36] INFO  WEBrick 1.3.1
[2010-12-23 21:56:36] INFO  ruby 1.8.7 (2010-12-03) [java]
[2010-12-23 21:56:36] INFO  WEBrick::HTTPServer#start: pid=24997 port=3000
Tak, to jest dokładnie to, czego oczekiwałem! Serwer HTTP nasłuchuje na porcie 3000. Otwieram przeglądarkę z adresem http://0.0.0.0:3000 i...

Jeszcze rzut oka na środowisko przez odnośnik "About your application’s environment".

Pierwsze doświadczenia, jakkolwiek w międzyczasie okraszone pewnymi nieprzyjemnościami, zakończyłem z sukcesem. Jeśli to ma się nazywać zwiększenie produktywności, to ja dziękuję - zwiększyło się, ale jeśli chodzi o rozwiązywanie problemów :) A tak poważnie, to chciałbym, aby tego typu doświadczenia nie miały już miejsca, jeśli mam okrzyknąć Rails produktywnym rozwiązaniem. Wejście powinno być bardziej gładkie. Pewnie zostanie mi przypomniane, że z Ruby nie byłoby tych problemów i wszystkiemy winny JRuby. Pożyjemy, zobaczymy.