僕は木になりたい。。。

子供のとき本気でそう思ってました。 理由は樹齢が長いから

ruby

Ruby 1.9.2でRubyGemsがエラー

ruby1.9.2をインストールしたが、gemがうまく動かない。

gem -v
$ gem -v
/usr/local/lib/ruby/site_ruby/1.9.1/rubygems/source_index.rb:68:in `installed_spec_directories': undefined method `path' for Gem:Module (NoMethodError)
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/source_index.rb:58:in `from_installed_gems'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb:884:in `source_index'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:81:in `init_gemspecs'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:13:in `initialize'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb:842:in `new'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb:842:in `block in searcher'
        from :10:in `synchronize'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb:841:in `searcher'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb:480:in `find_files'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb:984:in `load_plugins'
        from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb:1140:in `'
        from :29:in `require'
        from :29:in `require'
        from /usr/local/bin/gem:8:in `
'

いろいろとググってみると、 以下のサイトに詳しい内容があった。
Ruby 1.9.2とRubyGems 1.3.7とGem.pathの消失
詳しく解説してくれていてとても助かった。
で、結局、どこにどういうコード入れれば良いかなんだけど、
まずは、rubygems.rbがどこにあるのかを検索

$find / -name rubygems.rb
※良い子はマネしない!

/home/hoge/.gem/ruby/1.9.1/gems/rubygems-update-1.3.7/lib/rubygems.rb
/usr/src/ruby/ruby-1.9.1-p0/lib/rubygems.rb
/usr/src/ruby/ruby-1.9.2-p0/lib/rubygems.rb
/usr/local/src/branches_ruby_1_9_2/lib/rubygems.rb
/usr/local/src/ruby/lib/rubygems.rb
/usr/local/src/ruby-1.9.2-p0/lib/rubygems.rb
/usr/local/lib/ruby/gems/1.9.1/gems/rubygems-update-1.3.7/lib/rubygems.rb
/usr/local/lib/ruby/1.9.1/rubygems.rb
/usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb
/usr/lib/ruby/1.9.1/rubygems.rb
と、いろいろ弄っているので、 かなりたくさん出てくる。
どのrubygemsが最初にロードされているかを確認
$ruby -e 'p $LOAD_PATH'
["/usr/local/lib/ruby/site_ruby/1.9.1", "/usr/local/lib/ruby/site_ruby/1.9.1/i686-linux", "/usr/local/lib/ruby/site_ruby", "/usr/local/lib/ruby/vendor_ruby/1.9.1", "/usr/local/lib/ruby/vendor_ruby/1.9.1/i686-linux", "/usr/local/lib/ruby/vendor_ruby", "/usr/local/lib/ruby/1.9.1", "/usr/local/lib/ruby/1.9.1/i686-linux"]
/usr/local/lib/ruby/site_ruby/1.9.1/rubygems.rb
がロードされている事がわかった。 中身を見ると、確かに、
Gem::QuickLoader.remove
が、無い。
で、
gem_disabled = !defined? Gem
の下に以下のコードを、追加
unless gem_disabled
  # Nuke the Quickloader stuff
  Gem::QuickLoader.remove
end
そして再度
$ gem -v
1.3.7

はい。おっけー!

Redmineでカスタムフィールドの表示でリンク表示にするハック

詳細表示画面

app/helpers/issues_helper.rb

  def render_custom_fields_rows(issue)
    return if issue.custom_field_values.empty?
    ordered_values = []
    half = (issue.custom_field_values.size / 2.0).ceil
    half.times do |i|
      ordered_values << issue.custom_field_values[i]
      ordered_values << issue.custom_field_values[i + half]
    end
    s = "<tr>\n"
    n = 0
    ordered_values.compact.each do |value|
      s << "</tr>\n<tr>\n" if n > 0 && (n % 2) == 0
      case value.custom_field.id
      when 1
        s << "\t<th>#{ h(value.custom_field.name) }:</th><td><a href='http://ow-japan.com/#{issue.custom_field_values[1]}'>#{ simple_format_without_paragraph(h(show_value(value))) }</a></td>\n"
      else
        s << "\t<th>#{ h(value.custom_field.name) }:</th><td>#{ simple_format_without_paragraph(h(show_value(value))) }</td>\n"
      end
      n += 1
    end
    s << "</tr>\n"
    s
  end

チケット一覧

app/helpers/queries_helper.rb

  def column_content(column, issue)
    value = column.value(issue)

    case value.class.name
    when 'String'
      if column.name == :subject
        link_to(h(value), :controller => 'issues', :action => 'show', :id => issue)
      elsif column.name == :cf_1
        link_to(h(value), "http://ow-japan.com/#{issue.custom_field_values[1]}")
      else
        h(value)
      end
    when 'Time'
      format_time(value)
    when 'Date'
      format_date(value)
    when 'Fixnum', 'Float'
      if column.name == :done_ratio
        progress_bar(value, :width => '80px')
      else
        value.to_s
      end
    when 'User'
      link_to_user value
    when 'Project'
      link_to_project value
    when 'Version'
      link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
    when 'TrueClass'
      l(:general_text_Yes)
    when 'FalseClass'
      l(:general_text_No)
    when 'Issue'
      link_to_issue(value, :subject => false)
    else
      h(value)
    end
  end

Rails2.2 で db:migrate でハマる。

Railsで、DBを作成しようとしました。
$ rake db:create
(in /home/user/railsapp)
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
rake aborted!
no such file to load -- mysql

Rails 2.2.2でMySQL使うにはドライバを更新しないといけないみたいですよ・・ - てーげー探訪

Rails 2.2.2でMySQL使うにはドライバを更新しないといけないみたいですよ・・
を参考に
# cd /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7

ruby extconf.rb  --with-mysql-config=/opt/local/bin/mysql_config5

extconf.rb:1: command not found: /opt/local/bin/mysql_config5 --cflags
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config
ダメでした。
以前の記憶からひらめいて、mysql-develをインストール。
# yum install mysql-devel
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
 * addons: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package mysql-devel.i386 0:5.0.45-7.el5 set to be updated
---> Package mysql-devel.x86_64 0:5.0.45-7.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mysql-devel             i386       5.0.45-7.el5     base              2.4 M
 mysql-devel             x86_64     5.0.45-7.el5     base              2.4 M

Transaction Summary
=============================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 4.8 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): mysql-devel-5.0.45 100% |=========================| 2.4 MB    00:04
(2/2): mysql-devel-5.0.45 100% |=========================| 2.4 MB    00:04
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing: mysql-devel                  ######################### [1/2]
  Installing: mysql-devel                  ######################### [2/2]

Installed: mysql-devel.i386 0:5.0.45-7.el5 mysql-devel.x86_64 0:5.0.45-7.el5
Complete!
で、configurationオプションを参考に以下のように実行
#gem install mysql -- --with-mysql-config=/usr/bin/mysql_config

Building native extensions.  This could take a while...
Successfully installed mysql-2.7
1 gem installed

そして、再度、
$ rake db:create
(in /home/user/railsapp)
今度は、オッケーでした!!。

gem install mysql にハマる5

Rails2.2.2では、mysqlがデフォルトでは使えず、

gem install mysql
をやれと言われました。

やってみる。

$ sudo gem install mysql
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config
        --without-mysql-config
        --with-mysql-dir
        --without-mysql-dir
        --with-mysql-include
        --without-mysql-include=${mysql-dir}/include
        --with-mysql-lib
        --without-mysql-lib=${mysql-dir}/lib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-mlib
        --without-mlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-zlib
        --without-zlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-socketlib
        --without-socketlib
        --with-mysqlclientlib
        --without-mysqlclientlib
        --with-nsllib
        --without-nsllib
        --with-mysqlclientlib
        --without-mysqlclientlib


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/gem_make.out
失敗。。

どうやら、 mysql_configの場所を教えてあげないとダメらしい。

やってみる。

$ sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb install mysql -- --with-mysql-config=/usr/bin/mysql_config
checking for mysql_ssl_set()... no
checking for mysql.h... no
checking for mysql/mysql.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/bin/ruby
        --with-mysql-config


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/mysql-2.7/gem_make.out
失敗。。

どうやら、 mysql-develが必要らしい。

インストールしてみる。

$ sudo yum install mysql-devel
Loaded plugins: refresh-packagekit
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package mysql-devel.i386 0:5.0.51a-1.fc9 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mysql-devel             i386       5.0.51a-1.fc9    fedora            2.4 M

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 2.4 M
Is this ok [y/N]: y
Downloading Packages:
(1/1): mysql-devel-5.0.51a-1.fc9.i386.rpm                                                                                                                                                  | 2.4 MB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : mysql-devel                                       [1/1]

Installed: mysql-devel.i386 0:5.0.51a-1.fc9
Complete!
お、入った。

で、やってみる

sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
Building native extensions.  This could take a while...
Successfully installed mysql-2.7
1 gem installed

よし、OK

Rails 2.2 で RubyGemsがどうのこうのと言われて。。5

Rails2.2で、試しにアプリを起動してみたら、
Rails requires RubyGems >= 1.3.1 (you have 1.2.0). Please `gem update --system` and try again.
と、言われたので、
$ sudo gem update --system 
とすると、
Updating RubyGems
Nothing to update
と言われた。
言われたとおりにしたのに。。

解決策

こうしたら
$ sudo gem install rubygems-update
Successfully installed rubygems-update-1.3.1
1 gem installed
出来た。
意気揚々と
$script/server
Rails requires RubyGems >= 1.3.1 (you have 1.2.0). Please `gem update --system` and try again.
ええええっ
$gem --version
1.2.0
やっぱり。。
ぐぐってみた。
Rails 2.2.2 と RubyGems 1.3.1 と rubygems-update - Rubyとか Illustratorとか SFとか折紙とか
Rails 2.2.2 と RubyGems 1.3.1 と rubygems-updateComments
と、言う事で、
$sudo update_rubygems
...いろいろやって...
If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.

$gem --version
1.3.1
$ script/server -p 4000
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.2.2 application starting on http://0.0.0.0:4000
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:4000
** Starting Rails with development environment...
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready.  TERM => stop.  USR2 => restart.  INT => stop (no restart).
** Rails signals registered.  HUP => reload (without restart).  It might not work well.
** Mongrel 1.1.5 available at 0.0.0.0:4000
** Use CTRL-C to stop.
解決しました。ありがとう!!

プログラムとデザインの分離とはいっても5

PHPやJavaのJSPやRubyのeRBのクールじゃないところ - 矢野勉のはてな日記
彼らはHTMLファイルにコードを書くことをなんとも思ってないんだね。もちろん、プログラマからすればその方が早いのかもしれないけどね、私には「HTMLはプログラマのものなの?」という思いがあります。

ちょっと古い記事を目にしてしまった。。
これについて、 ちょっと語ってみる。

この記事に書かれている。

  1. デザイナをプロとして尊重する。
  2. プロダクトに於いて、デザインは重要。
  3. ビジネスにおいては、成果を挙げる為には、デザインが優れている事は重要。
  4. 僕もそう思っている。

    では、デザイナとは何であろうか? 会社のロゴマークや商品のパッケージ もそうだが、デザインとは芸術的創造物とは ちょっと違う。

    個人のセンスを表現する場所ではなく、 ユーザにとって価値のあるものを創造するという 視点が重要だと思う。

    優秀なWEBデザイナは本当にすごいと思う。

    そのプロダクトのコンセプトにマッチていて、 心地良さすら感じさせてくれるデザインをする。

    そして良く見れば、そこには徹底的に拘り尽くされた 様子さえ垣間見る事ができる。

    デザインとはそういうものだと思う。 だから、「デザイナはHTMLCSSで勝負しているんだ!」と、決め付けてしまうのは良くない。 (そういう人が居る事は事実だが。) Windowsのクライアントアプリケーションの画面デザインや、 Flashでの画面デザインなど、 画面という物一つとってもあらゆる手段とツールがある。

    だから、JSPにしろWikietにしろRailsにしろ 画面デザインの領域に必要な構造化やスクリプトは あってよいのだと思う。

    何も、HTMLCSSだけを 生業とする人の為だけに、 分離をがんばってやったり、 その為にプログラマの負担を増やしたりする必要は無いと思う。 つまり、「HTMLCSSが出来る人が、WEBデザイナであり、 それ以外ができなくてもOK」という考えを改めるべきだと思う。

    「別に、JSPのタグが入っていてもOKですよ。」 というデザイナが居たっていいし、多分それよりはるかに 複雑なコーディング(デザインの世界では、HTMLを作成する事をコーディングと呼ぶらしい)をしているデザイナーは山ほど居る。

    それに、そもそもJavaScriptは良いのかという話にもなる。

    多分もうすぐ、 というかもうなってるかも知れないけど、
    jQuery等JSライブラリはデザイナーは必須の知識になるのではないだろうか。

    そうなれば、JavaScriptが良くてJavaが駄目な理由はないだろう。

    重要な事は、 デザイナだって作りながら確かめながらを、 繰り返すわけで、その作業に弊害のない環境を 用意する事

    そういう意味で、JSPは実行させるための手順が多く、 敷居が高い気がする。 デザインツールとEclipseを同時に起動するってのもつらい気がするし。。

    Rubyならツールの支援はさらに、まだまだ感が強い。 でもそれは、需要の問題だから、欲しい人がいれば出来るのも 時間の問題でしょう。

    当然ながら、普通のHTMLとしてあつかえ、ブラウザで起動すれば 表示を確認できるという、Wiketが、そのような点において優れている事については何の異論もない。

    でも、フレームワークて、そういう要因だけで決められるほど 単純なものじゃないよね。
    ひとつの要因ではあるけど。

    社内にRailsが得意な人が居て、
    HTMLとCSSが得意な人が居たら、
    別にRails止めさせる必要ないだろうし、 デザイナが頑張ってERB覚えた方が、絶対良いよね。

    だから、ビジネス的に考えるなら、 あまりそこに拘らないほうが良いよという話。

    HTMLはデザイナだけの物でもないし、
    プログラムはプログラマだけの物でもない。

正規化とか、小クラス主義とか3

ronSpace: データベース正規化・非正規化
データベースの 正規化 vs 非正規化 というのは、オブジェクト指向でいう、小クラス主義 vs 大クラス主義 に通じるものがあるんじゃないですかね。
L'eclat des jours(2008-04-07)
大クラス主義とか、非正規DBでも、そのほうが良いと考えてユースケースや後先まで想定した結果そうしたのと、分割するという発想がないため結果的にそうなるのでは、生成物は同じでもずいぶん異なる。
これ、違うよ。
大クラス主義は、最初から積極的に分割しないんだから。
それ以外の大クラス主義なんて、ないんじゃない?。

だから、データベースの正規化・非正規化と、 プログラミングの小クラス・大クラス主義とを 並べて語るのはどうかと思う。

しかも、

正規化 <=> 小クラス

非正規化 <=> 大クラス

をペアにして語るのはどうかと。

非正規化というのは、正規化というRDBの一応あるべき姿があり、RDB以外の世界の都合により非正規化されるもの。

でしょ。

大クラス主義とか、小クラス主義というのは、 どちらが良いという話は置いておいて、 どちらも、言語設計などの内側だけの議論

だよね。
外の世界は関係ない。

もう少し言うと、非正規化それ自体が正しいと主張する人は殆どいなくて、
ある状況に於いて、非正規化が適切な場合がある。というだけ。

あ、でもこれって元記事の趣旨と違うところに ツッコミ入れてるね。

言いたかったのは、
正規化と非正規化の関係に存在する。

正規化は正し(美し)くて、非正規化は正しくない(美しくない)
でも非正規化も、時にはしょうがないよね。

という関係と、

小クラス主義と大クラス主義の関係

は違うよね。
って事でした。
あいかわらず、文章が下手で、我ながら伝わりにくい。。。

ブログやブックマークの同期3

ブログやブックマークって 一回使い始めると変えにくい。

自分のこのライブドアのブログを使っているけど、 はてなを使ってみたくなったりする。

そこで、こんなの作りました。 まだ拡張しなきゃならんですが、 そのうち公開します。 使い方はこんな感じ
require 'epost'

# ライブドアブログから、
#  ・ライブドアクリップへ
livedoorBlog = EPOST::Livedoor::Blog.new(user_id, password)
livedoorClip = EPOST::Livedoor::Clip.new(user_id, api_key)

livedoorBlog.feed{ | url, title, summary |
 livedoorClip.post( {:url=>url, :description=>title, :tags => "emosei", :rate => "5"} )
}

# ライブドアクリップから、
#  ・はてなブックマークへ

hatenaBookmark = EPOST::Hatena::BookMark.new(user_id, password)
deliciousBookmark = EPOST::Delicious::BookMark.new(user_id, password)
livedoorClip.recent{ | url, description, extended, tags | 
  hatenaBookmark.post( {:url=>url, :summary=>description} )
}

サービス化しようと思ったけど、 パスワードとか管理できないのでやめました。

どっかのサーバーのクーロンとかに設定して、 定期的に実行させておけば、同期されます。

紹介だけですが、以上です。

Rubyで、Javaソースのコメントを削除する正規表現(不完全だけど。。)

Javaのソースからコメントを削除する正規表現

を作った。

けど完全じゃない。。。 リテラルの中の/* xxx */ の部分を削除してしまう。

できるかなぁ。。。

あと、gsubを2重にしてるのもやめたい。


誰か添削希望 以下ソース
class JavaSource
  def initialize( file_path )
    if file_path && file_path =~ /\.java/
      open( file_path ) {|file|
        @text = file.read
      }
    end
  end

  def comment_strip
    return nil unless @text
    return @text.gsub( %r{/(\*.*?\*/)}m, "").gsub( %r{(//.*$)}, "")
  end

end

src = JavaSource.new( ARGV[0] )
puts src.comment_strip

RubyでHashの初期化3

Rubyのライブラリを読んでいるとHashの初期化で

h = Hash.new([].freeze)
というのを良く見かける。

これはどういう意味なんだろうと調べてみた。

まずは freeze の意味 Object - Rubyリファレンスマニュアル

オブジェクトの内容の変更を禁止します。self を返します。 フリーズされたオブジェクトの変更は例外 TypeError を発生させます。
という事で、任意のオブジェクトを変更不可能にできます。

次に、Hash.new の引数の意味 Hash - Rubyリファレンスマニュアル

Hash.new([ifnone]) 空の新しいハッシュを生成します。 ifnone はキーに対応する値が存在しない時のデフォルト値です。 デフォルト値の扱いには注意が必要です。 ( trap::Hash )。

という事で、Hashオブジェクトに対して存在しないキーを要求したときに返す値をコンストラクタで指定できるらしい。
例)

h = Hash.new(4)
age = h[:age] # => 4
つまり、 Hash.new([].freeze)となっているのは、 デフォルト値を[](空配列)とし、さらにそれを 変更されては困る場合の宣言の仕方だった。 しかしこれにはtrap::Hash にもあるように、freezeを付けないと、 デフォルト値自体に破壊的な操作をすると、 混乱するから気をつけよう。と書いてあり、 その破壊的な操作の殆どは予期せず行ってしまうだろう事を 懸念している。
例)
h = Hash.new([])
# key=0の値に0を追加
h[0] << 0
# key1の値に1を追加
h[1] << 1
# 間違った期待
p h         #=> {0=>[0], 1=>[1]}
# 実際の値
p h         #=> {}
p h.default #=> [0, 1]
どうやら、freezeは上記の混乱を避ける事にも役立っている。

そういう意味だったのかぁ。。 やっと理解できました。

その他まとめ Hashオブジェクトの初期化
  1. Hash.new() キーが無い場合はnil
  2. Hash.new( obj ) キーが無い場合はobj
  3. Hash.new( ブロック ) ブロックの結果を返す ex) Hash.new( | hash, key | hash[key] = "Booo!" )
  4. 2.を使う場合は要注意 で特に値を変更するような場合は、 誤ってアクセスした時に気がつかない場合があるので、 freezeを使う。 でも個人的には、freezeを使うくらいなら、 1を採用してnilを返すようになっていれば良いと思うのだが。。 freezeにする必要があるケースを強引に考えると、 基本的に特定の範囲のキーを期待するが、 将来的に期待外のキーが与えられる可能性があり、 そのキーを拒否する事もするべきでないようなケース。。。 どんなケースだろう。
livedoor プロフィール

emosei

記事検索
読書をしよう
楽天市場
こちらもどうぞ
Archives
RSS
  • ライブドアブログ