jruby 1.9モードのencoding に関して

492 views
Skip to first unread message

ytakagi

unread,
Feb 22, 2012, 10:42:24 AM2/22/12
to jruby-u...@googlegroups.com
初めまして。
最近、jruby を1.9モードで使い始めた者です。
encoding なるものが非常に使いにくいと感じています。
みなさんは、どのように解決しているのでしょうか?

ファイルの冒頭に # encoding: utf-8 と入れて置けばよいのは分かりますが、
そうではなくて、デフォルトの環境を utf-8 には出来ないのでしょうか。

うちの環境は、ubuntu10.04 ですが、
ファイルの冒頭に そのおまじないを入れなければ、ソースにマルチバイト文字が入っていると
そのまま落ちてしまいます。

1.8 なら jruby --1.8 -Ku myscript.rb とでも起動すればいいだけなのに。

要するに、コマンドライン・オプションを使用して
SyntaxError: invalid multibyte char (US-ASCII)
を見ないですむように出来ないのか、ということです。

そもそも、なんでutf-8 がデフォでなくて、US-ASCII がデフォなんでしょう?
そこがそもそも分かりません。面倒なだけに思えます。

os もubuntu ですから、env で見ても LANG=ja_JP.utf8 です。
これを参照してくれてもよさそうなもんだと思うのですが。

コマンドライン・オプションでは -E でencoding が指定出来ることになっているかと
思うのですが、これはどうやらファイルの入出力のためのもののようで、
jruby ではそのほか -U オプションもあるようですが、それも同様のようで
効きません。 -Ku などはもはや無効のようです。

これは要するに、1.9モードでは 1.8 とは違い、ファイルの冒頭に
# encoding: utf-8 を置かない限り、マルチバイト文字が含まれていた場合、
プログラムが落ちることを防げないということでしょうか?

件のおまじないは tab補完で瞬時に入れられるようにはしていますが、
めんどくさくてしょうがありません。

1.8 のときのようなわけにはいかないのでしょうか?
みなさんはどうしてるんでしょう?

-- 

ytakagi

Hiroshi Nakamura

unread,
Feb 23, 2012, 1:58:17 AM2/23/12
to jruby-u...@googlegroups.com
(2012/02/23 0:42), ytakagi wrote:
> 要するに、コマンドライン・オプションを使用して
> SyntaxError: invalid multibyte char (US-ASCII)
> を見ないですむように出来ないのか、ということです。

今のJRubyだと、できないみたいです。-Kが効いてませんね。
とりあえずチケット化しました。
https://jira.codehaus.org/browse/JRUBY-6487

> そもそも、なんでutf-8 がデフォでなくて、US-ASCII がデフォなんでしょう?
> そこがそもそも分かりません。面倒なだけに思えます。

この辺の仕様は以下で説明されているので、参考になると思います。
http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18

以上です。

signature.asc

ytakagi

unread,
Feb 24, 2012, 4:52:02 AM2/24/12
to jruby-u...@googlegroups.com

チケット化の件、ありがとうございます。
大変助かります。

実はこの問題、もっと根深い問題かもしれません。
jruby on rails 3.1.1 上での動作確認中に、どうにも納得いかないことから、
お尋ねしたのです。

というのは、
RailsによるアジャイルWebアプリケーション開発 第4版(オーム社)のサンプルが
jruby 1.8 モードなら苦もなく動作するのに、1.9 モードだと動作しないため、
私はその動作しない原因を この encoding 問題ではないかと疑っているのです。
(本当にそれが原因かどうかは、掴みきれていません。database は mysql を使用)

1.9 モードでの不具合の状況は長くなるので省きますが、
今のところ、1.8 モード と 1.9 モードの違いで問題になりそうなのは、
database.yml しかないのではないか? と思いあたったところです。

ここに書き込んだ mysql のパスワードが問題かもしれない。

パスワードの生成は keypass を使いました。ここで 数字・英字そして下線を
keyword の要素と
指定しましたが、この下線が US-ASCII の範囲からはみ出しているかな、とよう
やく気づいた
ところです。

この何日間もの苦闘はなんだったのかな? といいましょうかwww
でも、本当にそれが原因かはまだ分かりません。

とにかく、いろいろありがとうございました。では。

--

ytakagi


Hiroshi Nakamura

unread,
Feb 24, 2012, 4:58:30 AM2/24/12
to jruby-u...@googlegroups.com
(2012/02/24 18:52), ytakagi wrote:
> ここに書き込んだ mysql のパスワードが問題かもしれない。
>
> パスワードの生成は keypass を使いました。ここで 数字・英字そして下線を
> keyword の要素と
> 指定しましたが、この下線が US-ASCII の範囲からはみ出しているかな、とよう
> やく気づいた
> ところです。

大丈夫です。「_」はUS-ASCIIです。関係ありません。

とりあえず、「1.9 モードだと動作しない」をもう少し詳しく教えてくれません
か。エラーが出たときのスタックトレース(log/development.log)をどこかに
貼り付けてくれるので構いません。

signature.asc

ytakagi

unread,
Feb 24, 2012, 12:18:47 PM2/24/12
to jruby-u...@googlegroups.com

いろいろご迷惑をおかけして、すいません。
いまのところ、まだ解決していず、自分自身が迷走している状態です

私が試しているのは、
RailsによるアジャイルWebアプリケーション開発 第4版 の p61 あたりにある
もっともシンプルなアプリケーションのサンプル depot の例です。

jruby 1.6.6 で rails 3.1.1 により試すと、1.8 モードでは問題ないように思
えます。
が、1.9 モードではダメです。どうもよく分かりません。
(なお、node.js は 0.6.8 、また coffee script は 1.2.0 が入ってます)

手順を簡略に書くと、

rails new depot -d mysql
cd depot

rails generate scaffold Product title:string description:text
image_url:string price:decimal

ここで ~/depot/config/database.yml を編集。mysql のパスワードを設定。
また、事前に mysql に database.yml で指定する detabase名 と同名の
database を作成しておく必要あり。

rake db:migrate

rails server

http://localhost:3000/products

のような感じです。これを、1.8 モードと 1.9 モードでやってみました。
以下に、両方の log/development.log を貼ってみます。
なにか分かりますでしょうか? お手数おかけしてすいません。


######### jruby 1.8 モード の場合の log/development.log 。(ブラウザ的に
は、問題なく動作しているように見える)

�[1m�[36m (33.0ms)�[0m �[1mSET SQL_AUTO_IS_NULL=0�[0m
ActiveRecord::JDBCError: Table 'depot_development.schema_migrations'
doesn't exist: SHOW FIELDS FROM `schema_migrations`
�[1m�[35m (137.0ms)�[0m CREATE TABLE `schema_migrations` (`version`
varchar(255) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
�[1m�[36m (1.0ms)�[0m �[1mSHOW KEYS FROM `schema_migrations`�[0m
�[1m�[35m (258.0ms)�[0m CREATE UNIQUE INDEX `unique_schema_migrations`
ON `schema_migrations` (`version`)
ActiveRecord::JDBCError: Table 'depot_development.schema_info' doesn't
exist: SHOW FIELDS FROM `schema_info`
�[1m�[36m (0.0ms)�[0m �[1mSELECT `schema_migrations`.`version` FROM
`schema_migrations` �[0m
Migrating to CreateProducts (20120224163103)
�[1m�[35m (140.0ms)�[0m CREATE TABLE `products` (`id` int(11) DEFAULT
NULL auto_increment PRIMARY KEY, `title` varchar(255), `description`
text, `image_url` varchar(255), `price` decimal, `created_at` datetime,
`updated_at` datetime) ENGINE=InnoDB DEFAULT CHARSET=utf8
�[1m�[36m (52.0ms)�[0m �[1mINSERT INTO `schema_migrations` (`version`)
VALUES ('20120224163103')�[0m
�[1m�[35m (0.0ms)�[0m SET SQL_AUTO_IS_NULL=0
�[1m�[36m (1.0ms)�[0m �[1mSELECT `schema_migrations`.`version` FROM
`schema_migrations` �[0m
�[1m�[35m (0.0ms)�[0m SHOW KEYS FROM `products`


Started GET "/products" for 0:0:0:0:0:0:0:1 at Sat Feb 25 01:33:35 +0900
2012
�[1m�[36m (3.0ms)�[0m �[1mSET SQL_AUTO_IS_NULL=0�[0m
Processing by ProductsController#index as HTML
�[1m�[35mProduct Load (1.0ms)�[0m SELECT `products`.* FROM `products`
Rendered products/index.html.erb within layouts/application (9.0ms)
Compiled application.css (16ms) (pid 2787)
Compiled products.css (27ms) (pid 2787)
Compiled scaffolds.css (369ms) (pid 2787)
Compiled application.js (17ms) (pid 2787)
Compiled jquery.js (21ms) (pid 2787)
Compiled jquery_ujs.js (1ms) (pid 2787)
Compiled products.js (346ms) (pid 2787)
Completed 200 OK in 1375ms (Views: 1370.0ms | ActiveRecord: 1.0ms)


Started GET "/assets/products.css?body=1" for 0:0:0:0:0:0:0:1 at Sat Feb
25 01:33:38 +0900 2012
Served asset /products.css - 200 OK (10ms)

Started GET "/assets/application.css?body=1" for 0:0:0:0:0:0:0:1 at Sat
Feb 25 01:33:38 +0900 2012
Served asset /application.css - 200 OK (5ms)

Started GET "/assets/scaffolds.css?body=1" for 0:0:0:0:0:0:0:1 at Sat
Feb 25 01:33:38 +0900 2012
Served asset /scaffolds.css - 200 OK (25ms)

Started GET "/assets/jquery.js?body=1" for 0:0:0:0:0:0:0:1 at Sat Feb 25
01:33:38 +0900 2012
Served asset /jquery.js - 200 OK (13ms)

Started GET "/assets/jquery_ujs.js?body=1" for 0:0:0:0:0:0:0:1 at Sat
Feb 25 01:33:38 +0900 2012
Served asset /jquery_ujs.js - 200 OK (20ms)

Started GET "/assets/products.js?body=1" for 0:0:0:0:0:0:0:1 at Sat Feb
25 01:33:38 +0900 2012
Served asset /products.js - 200 OK (6ms)

Started GET "/assets/application.js?body=1" for 0:0:0:0:0:0:0:1 at Sat
Feb 25 01:33:38 +0900 2012
Served asset /application.js - 200 OK (0ms)

######### jruby 1.9 モード の場合の log/development.log 。

(ブラウザの表示としては、
TypeError in Products#index
Showing /home/ytakagi/depot/app/views/layouts/application.html.erb where
line #6 raised:
can't convert Encoding into String
(in /home/ytakagi/depot/app/assets/javascripts/products.js.coffee)
とのエラーが出ています)


�[1m�[36m (36.0ms)�[0m �[1mSET SQL_AUTO_IS_NULL=0�[0m
ActiveRecord::JDBCError: Table 'depot_development.schema_migrations'
doesn't exist: SHOW FIELDS FROM `schema_migrations`
�[1m�[35m (124.0ms)�[0m CREATE TABLE `schema_migrations` (`version`
varchar(255) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
�[1m�[36m (1.0ms)�[0m �[1mSHOW KEYS FROM `schema_migrations`�[0m
�[1m�[35m (241.0ms)�[0m CREATE UNIQUE INDEX `unique_schema_migrations`
ON `schema_migrations` (`version`)
ActiveRecord::JDBCError: Table 'depot_development.schema_info' doesn't
exist: SHOW FIELDS FROM `schema_info`
�[1m�[36m (1.0ms)�[0m �[1mSELECT `schema_migrations`.`version` FROM
`schema_migrations` �[0m
Migrating to CreateProducts (20120224164027)
�[1m�[35m (130.0ms)�[0m CREATE TABLE `products` (`id` int(11) DEFAULT
NULL auto_increment PRIMARY KEY, `title` varchar(255), `description`
text, `image_url` varchar(255), `price` decimal, `created_at` datetime,
`updated_at` datetime) ENGINE=InnoDB DEFAULT CHARSET=utf8
�[1m�[36m (47.0ms)�[0m �[1mINSERT INTO `schema_migrations` (`version`)
VALUES ('20120224164027')�[0m
�[1m�[35m (1.0ms)�[0m SET SQL_AUTO_IS_NULL=0
�[1m�[36m (0.0ms)�[0m �[1mSELECT `schema_migrations`.`version` FROM
`schema_migrations` �[0m
�[1m�[35m (1.0ms)�[0m SHOW KEYS FROM `products`


Started GET "/products" for 0:0:0:0:0:0:0:1 at 2012-02-25 01:43:27 +0900
�[1m�[36m (6.0ms)�[0m �[1mSET SQL_AUTO_IS_NULL=0�[0m
Processing by ProductsController#index as HTML
�[1m�[35mProduct Load (10.0ms)�[0m SELECT `products`.* FROM `products`
Rendered products/index.html.erb within layouts/application (15.0ms)
Compiled application.css (39ms) (pid 2647)
Compiled products.css (36ms) (pid 2647)
Compiled scaffolds.css (276ms) (pid 2647)
Compiled application.js (30ms) (pid 2647)
Compiled jquery.js (30ms) (pid 2647)
Compiled jquery_ujs.js (2ms) (pid 2647)
Completed 500 Internal Server Error in 970ms

ActionView::Template::Error (can't convert Encoding into String
(in /home/ytakagi/depot/app/assets/javascripts/products.js.coffee)):
3: <head>
4: <title>Depot</title>
5: <%= stylesheet_link_tag "application" %>
6: <%= javascript_include_tag "application" %>
7: <%= csrf_meta_tags %>
8: </head>
9: <body>
app/views/layouts/application.html.erb:6:in
`_app_views_layouts_application_html_erb___359730182_6358'
app/controllers/products_controller.rb:7:in `index'

Rendered
/usr/local/bin/jruby/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb
(21.0ms)
Rendered
/usr/local/bin/jruby/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb
(11.0ms)
Rendered
/usr/local/bin/jruby/lib/ruby/gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/template_error.erb
within rescues/layout (94.0ms)

--

ytakagi

ytakagi

unread,
Feb 24, 2012, 7:43:07 PM2/24/12
to jruby-u...@googlegroups.com

いろいろご迷惑おかけしております。
すべて出直したいと思っております。すいません。

問題の根本は、
database.yml にあるのは間違いないようです。

現状、database.yml は
adapter: mysql
database: depot_development
username: root
password:
のようになっておりますが、少なくとも adapter は
rails new depot -d mysql のコマンドで自動生成したものから、
変更しないといけないですよね。

1.8 モードではとりあえず動いてしますため、なかなか気づきませんでした。

なにをボケているのか。jruby on rails の解説書がないので ruby on rails
の解説書で代用しているため、基本的なことが分かってないようです。

失礼しました。
まだ問題は完全には分かってませんが、もう一度、初歩からやり直します。
ありがとうございました。では。

Yoko Harada

unread,
Feb 24, 2012, 10:19:29 PM2/24/12
to jruby-u...@googlegroups.com
かなり苦労されているようですね。

2012/2/24 ytakagi <yta...@m5.dion.ne.jp>:

> 問題の根本は、
> database.yml にあるのは間違いないようです。
>
> 現状、database.yml は
> adapter: mysql
> database: depot_development
> username: root
> password:
> のようになっておりますが、少なくとも adapter は
> rails new depot -d mysql のコマンドで自動生成したものから、
> 変更しないといけないですよね。

ですね。JRubyの場合、JDBC経由ですから。
http://guides.rubyonrails.org/getting_started.html
"3.3.5 Configuring a MySQL Database for JRuby Platform"に
サンプルがあります。

> 1.8 モードではとりあえず動いてしますため、なかなか気づきませんでした。
>
> なにをボケているのか。jruby on rails の解説書がないので ruby on rails
> の解説書で代用しているため、基本的なことが分かってないようです。

本がなくてもググれば、たくさん出てきますよ。

> 失礼しました。
> まだ問題は完全には分かってませんが、もう一度、初歩からやり直します。
> ありがとうございました。では。

がんばってください :)

原田

ytakagi

unread,
Feb 26, 2012, 4:37:27 AM2/26/12
to jruby-u...@googlegroups.com

アドバイス、ありがとうございます。

おっしゃるとおりで、database.yml は自動生成されたままではダメで、

development:
adapter: jdbcmysql

のように修正しなければいけなかったわけで、これに気づかないとは
我ながら情けない限りです。

ただ、そのように変更しましても状況は変わらず、
jruby on rails 3.1.1 はいまのところ ruby1.8 モードでは動きますが、
ruby 1.9 モードでは動作させることが出来ていません。

気長に取り組もうかと思っているところです。
ruby 1.9モードへの移行は、jruby 1.7 が登場するまで待った方がいいのかも
しれません…。

--

ytakagi

PCメール・アドレス yta...@m5.dion.ne.jp


ytakagi

unread,
Feb 26, 2012, 10:06:27 PM2/26/12
to jruby-u...@googlegroups.com

jruby on rails 3.1.1 を ruby 1.9 モードで動作させたいという件ですが、
jruby 1.6.7 がリリースされたのを知り、1.6.6 からアップデートしたところ、

まだごく簡単なサンプルしか試しておりませんが、
jruby on rails 3.1.1 が ruby 1.9 モードで動作するようになりました。

以上、ご報告まで。


(2012年02月26日 18:37), ytakagi wrote:
>
> アドバイス、ありがとうございます。
>
> おっしゃるとおりで、database.yml は自動生成されたままではダメで、
>
> development:
> adapter: jdbcmysql
>
> のように修正しなければいけなかったわけで、これに気づかないとは
> 我ながら情けない限りです。
>
> ただ、そのように変更しましても状況は変わらず、
> jruby on rails 3.1.1 はいまのところ ruby1.8 モードでは動きますが、
> ruby 1.9 モードでは動作させることが出来ていません。
>
> 気長に取り組もうかと思っているところです。
> ruby 1.9モードへの移行は、jruby 1.7 が登場するまで待った方がいいのかも
> しれません…。
>

--

ytakagi

PCメール・アドレス yta...@m5.dion.ne.jp


Reply all
Reply to author
Forward
0 new messages