!kiyoka.blog.2011_09 RSSPLAIN

Related pages: !kiyoka.blog.list
55555553333223333333333333333333333333333333333333333333333333333333333330333555555555555555555555555555555545555555555555555555555555555555455555555555555555555555555555555555555555511111055555555555550555555555555555550555555555555555555555555555555505555555555555555555555555555555555555555555555550555555555555555555555055555555555555555555505555555555555555555555555055555555555555555555555555555555505
5

kiyoka日記。NendoSekkaの開発や、最近思うことなど

5

最新10件!kiyoka.blog   過去記事一覧!kiyoka.blog.list

5

kiyoka.blog_header 

5

このブログを書いている人: 西山 清香(kiyoka) - twitter: @kiyokaEXT

5

5

 

5

 

3

kiyoka.2011_09_30[Ruby] Rubygems.orgから取得したgemでエラーが出るのはなぜか(追記)

3

 

3

昨日のエントリ「kiyoka.2011_09_29[Ruby] Rubygems.orgから取得したgemでエラーが出るのはなぜか」の続き。

3

 

2

実際に作ったGemパッケージの中のmetafileの内容を調べたのを貼りつけておく。

2

昨日のエントリに入れると、記事として長すぎるのでやめたもの。

3

 

3

Ruby 1.9.1-p429 + Syck環境 + Rubygems 1.7.2で作った

3

sekka 0.9.2の配布済みのRubyGems。

3

[gemspec]

3
  gemspec.add_dependency( "nendo", "= 0.5.3" )
3

 

3

[gem内部のmetadata]

3
rubygems_version: 1.7.2
3
- !ruby/object:Gem::Dependency 
3
  name: nendo
3
  requirement: &id015 !ruby/object:Gem::Requirement 
3
    none: false
3
    requirements: 
3
    - - "="
3
      - !ruby/object:Gem::Version 
3
        hash: 13
3
        segments: 
3
        - 0
3
        - 5
3
        - 3
3
        version: 0.5.3
3
  type: :runtime
3
  prerelease: false
3
  version_requirements: *id015
3

 

3

Ruby 1.9.2-p280 + Psych + rubygems 1.8.10で作った

3

[gemspec]

3
  gemspec.add_dependency( "nendo", "= 0.5.3" )
3

 

3

[gem内部のmetadata]

3
- !ruby/object:Gem::Dependency
3
  name: nendo
3
  requirement: &72178800 !ruby/object:Gem::Requirement
3
    none: false
3
    requirements:
3
    - - =
3
      - !ruby/object:Gem::Version
3
        version: 0.5.3
3
  type: :runtime
3
  prerelease: false
3
  version_requirements: *72178800
3

 

3

Ruby 1.9.2-p280 + Psych + rubygems 1.8.10で作った

3

[gemspec]

3
  gemspec.add_dependency( "nendo", ">= 0.5.3" )
3

 

3

[gem内部のmetadata]

3
- !ruby/object:Gem::Dependency
3
  name: nendo
3
  requirement: &72174990 !ruby/object:Gem::Requirement
3
    none: false
3
    requirements:
3
    - - ! '>='
3
      - !ruby/object:Gem::Version
3
        version: 0.5.3
3
  type: :runtime
3
  prerelease: false
3
  version_requirements: *72174990
3

 

3

 

0

comment (disabled)

3

3

 

3

 

5

kiyoka.2011_09_29[Ruby] Rubygems.orgから取得したgemでエラーが出るのはなぜか

5

rubygems_icon_128

5

ずっと前から自分が作ったgemが環境によってエラーになる原因が解析できずにいた。

5

やっと、tenderloveEXTことAaron Patterson氏が書かれたブログエントリでメカニズムが理解できた。

5

 

5

Aaron Patterson氏の説明を読み解く

5
 Shaving a YAML Yack EXT
5
 Have you ever seen this error?
5
 
5
 $ gem install rails --pre
5
 ERROR:  While executing gem ... (NameError)
5
   uninitialized constant Psych::Syck
5
 $
5
 
5
 Yes, I have too. Today we’re going to discuss the source of this error, and what we
5
 need to do to fix it.
5

 

5

やっぱり、誰もが同じエラーに遭遇していたのか。

5

自分の環境が悪いのかと思っていた。自分の環境はちょっと違うエラーメッセージだけど、原因は同梱のようだ。

5

結局RubyのYamlライブラリの互換性問題だった。

5

gemspecファイルの依存規則のところに'='イコールを使うとダメらしい。

5
Gem::Specification.new do |s|
5
  ...
5
  s.add_dependency('activesupport', '= 3.1.0')
5
  ..
5
end
5

 

5

上記のようなgemspecファイルを元に、gemパッケージが生成されるが、gemの中に格納されるmetafileはyaml形式となる。

5

gemパッケージ生成環境がPsychを使っている場合と、Syckを使っている場合で生成されるmetafile中の '='の扱いが異なる。

5

 

5

再現確認

4

メカニズムについては上記のAaron氏のブログエントリに書かれている通りなので、NGとOKパターンだけまとめると次のようになる。

5
 (1) OK ...   Syckで作ったgem =>  SyckライブラリがインストールされたRuby環境でmetafile(yaml)をパース
5
 (2) OK ...   Syckで作ったgem => PsychライブラリがインストールされたRuby環境でmetafile(yaml)をパース
5
 (3) OK ...  Psychで作ったgem => PsychライブラリがインストールされたRuby環境でmetafile(yaml)をパース
5
 (4) NG ...  Psychで作ったgem =>  SyckライブラリがインストールされたRuby環境でmetafile(yaml)をパース
5

 

5

NGの確認は自分のOSSパッケージsekka-0.9.3のパッケージをPsych環境で作った。gemspecには次のような行がある。

5
  gemspec.add_dependency( "nendo", "= 0.5.3" )
5

 

5

なお、gemをインストールした環境はlibyamlの入っていないRuby環境だ。そこではyaml parserはPSychではなくSyckが使われる。

5

このようにエラーメッセージが出る。

5
/tmp $ gem --version
5
Invalid gemspec in [/usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/specifications/sekka-0.9.3.gemspec]: Illformed requirement ["#<Syck::DefaultKey:0x00000102ca5258> 0.5.3"]
5
1.8.10
5

 

5

念のためSyck環境であることを確認。

5
/tmp $ ruby --version
5
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]
5
/tmp $ irb
5
irb(main):001:0> require 'yaml'
5
require 'yaml'
5
=> true
5
irb(main):002:0> YAML.dump [ '=' ]
5
YAML.dump [ '=' ]
5
=> "--- \n- \"=\"\n"
5
irb(main):003:0> YAML.load "---\n- =\n"
5
YAML.load "---\n- =\n"
5
=> [#<Syck::DefaultKey:0x00000101259de0>]
5
irb(main):004:0> 
5

 

5

 

5

rubygems.orgとの関係

4

Aaron氏のブログエントリでも書いてあるように、rubygems.orgはmarshalされたオブジェクトをユーザーに配布しているらしい。

5

上記の私の再現確認では、ローカルにあるgemファイルを使ってgem install していたが、rugygemsに登録した場合はrubygems.org内部のyamlパーサでパースしたmarshalオブジェクトが配布されるということだ。

5

現在rubygems.orgはSyckだそうで、これからPsychに差しかえるべく動いているとのこと。

5

つまり、Psyckでgemsでパッケージを作りrubygems.orgに登録すると上記のパターンで書いた(4)に該当する。

5

このとき、クライアント環境がどのような環境であろうとエラーが出るはず。これはマズい。

5

 

5
 Shaving a YAML Yack EXT
5
 How can we fix this?
5
 
5
 We have two ways to deal with this issue. The first way to deal with
5
 this issue is to upgrade rubygems. Rubygems contains code to work
5
 around the issue when installing gems. But it does not fix the issue.
5
 
5
 The only way we can fix this error for all users is to upgrade
5
 rubygems.org to use psych as the YAML parser. Upgrading rubygems.org
5
 will prevent the strange objects from entering marshal data sent to
5
 users.
5

 

5

 

5

 

5

回避方法 案1

5

gemspecはSyck環境でgemパッケージを作ってrubygems.orgに登録する。

5

Sekkaではこれまで、この方法を使っていた。

5

 

5

回避方法 案2

5

gemspecに、'='を使わない。かわり'>='を使う。

5

 

5

[SekkaのRakefile]

5

現状

5
  gemspec.add_dependency( "nendo", "= 0.5.3" )
5

回避策

5
  gemspec.add_dependency( "nendo", ">= 0.5.3" )
5

 

5

かなり姑息というか、本来行いたい指定とは違うのでちょっと不満がある。

5

Nendoのほうで下位互換性を壊すバージョンアップがあった場合Sekkaが動かなくなるという直接的な問題がある。

5

ただし、どんな環境でgemパッケージを作ってもよい。

5

 

5

 

5

まとめ

5

gemのinstall時のエラーは多くの人が遭遇しているはず。

5

メカニズムを理解すれば環境に依存しないgemを作れるが、スマートな解決方法は無い。

5

 

5

 

1

追記

1

実際に複数の環境でgemパッケージを作り、内容を貼りつけた。

1

「 kiyoka.2011_09_30[Ruby] Rubygems.orgから取得したgemでエラーが出るのはなぜか(追記)」

1

 

1

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_24[MongoDB]  foursquareは何故MongoDBを選んだか

5

このビデオを観た。

5
 The 10gen Blog on MongoDB and NoSQL, 10gen CEO on NoSQL; foursquare discusses why they use MongoDBEXT
5
 bbzG
5
 foursquareのエンジニアの方のトーク。 何故、MongoDBを選んだか。
5

NoSQLなのでスケールするのは当然として、ほかのNoSQLテクノロジに比べて、

5

既存のSQLデータベースに近いので移行しやすいそうな。

5

次にWebアプリを作るとしたら、試すのはMongoDBだなと感じた。

5

 

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_22[Scala][Nendo] Scaleの関数プログラミングのアプローチについて(1)

5
 4274068579  7つの言語 7つの世界: Bruce A. Tate
5

この本のScalaの章を読み初めたばかりで、まだScalaについてはよく分かっていないのだけど、作者のインタビューが掲載されていて、Scalaはオブジェクト指向と関数プログラミングの橋渡し役になるという話が書いてあった。現代の二大プログラミングパラダイムを両取り。

5

自分として、一番興味があるのは、Scalaが破壊的操作が必須のオブジェクト指向と破壊的操作が非推奨の関数プログラミングのバランスをどう取っているのかというところ。

5

現在私が開発中のNendoという言語では、破壊的操作をしようしている場所を、実行時ではなくコンパイル時に検出できないかと考えている。

5

Scalaがそのへんを解決したのかが知りたい。

5

仮に解決しているなら、どうやって解決しているのかを知りたいと思っている。

5

まさか、実行時に検出できるレベルで満足しているのだったら残念なんだけど。もう、その時点でScalaから貰うものは無いかなー。

5

Haskellの場合は、破壊的操作自体の無い純粋な世界を構築しており、プログラマがその世界の中でプログラミングしないといけないようにしてある。オブジェクト指向が付け入る隙は全く無い。プログラミングパラダイムは単一というわけだ。パラダイムというかパラダイス的な(笑)

5

 

5

この本でのScalaのページ数は少ないので書いていないかもしれないけど、ヒントくらいは書いてあればと楽しみに読んでいる。

5

このエントリの最後に(1)番号が書いてあるように、この疑問が解けるまで引き続き書く予定。

5

 

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_17[Sekka] Sekka 0.9.2 リリース

5

SKKライクな日本語入力メソッド Sekka 0.9.2をリリースしました。(リリースノート Sekka.ReleaseNote)

5
 NbpKsE
5

 

5

過去の日記で何度か実験の様子を書きましたが、ついにRedisをサポートしました。

5

これまで通り、Tokyo Cabinetも使えます。

5

RAMが大量に余っている環境では、Redisを試してみてください。(800MByteくらい余っていることが望ましい)

5

非常にレスポンスが良くなります。辞書学習のディスク書き込みが遅延されているためか、ディスクIO特有の引っ掛かりは無くなります。

5

体感的には全てmemcachedにキャッシュされているのという感じです。

5

 

5

注意:  Sekka.VersionUpを参考に古い辞書を一旦削除してください。

5

 

5

 

5

version 0.9.2

5
辞書用ストレージとして、Redisに対応した。
5
 [経緯など]
5
  kiyoka.2011_09_08[Sekka] RedisEXTを試す
5
  kiyoka.2011_09_10[Sekka] RedisEXTは仮想メモリ機能を使ってメモリを節約してくれる
5
辞書にバージョン番号を含めた。(key=SEKKA::VERSION)
5
  Sekka.VersionUpを参考に古い辞書を一旦削除してください。
5
  sekka-serverへの辞書データアップロード済みかどうかを、上記のキー(SEKKA::VERSION)の有無で判断します。
5
'q'キーで無変換を指定するユーザ・インタフェースを追加した。
5
  有効/無効は、sekka-muhenkan-keyで 'q' 以外のキーに変更可能。
5

 

5

 

5

次の目標

5

特に決まったTODOは無いので、気がついたユーザ・インタフェースの改良などを随時やっていきます。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_10[Sekka] RedisEXTは仮想メモリ機能を使ってメモリを節約してくれる

5
 redis_logo
5

Redisはメモリが溢れた時に仮想メモリを使用するようだ。

5

単純なIn Memoryデータベースだと思っていたので、用途が限られると思っていた。

5

データが全てメモリに載りきらない応用にも使えるんじゃないかなぁ。

5

 

5

以下は、redis-serverを少ないメモリ容量のサーバで動かした時の様子。

5
PID   USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
5
  739 kiyoka    18   0  146m  98m 3672 S    0  2.4   0:34.84 sekka-server
5
  497 kiyoka    15   0  814m  46m  624 R    0  1.1   3:18.34 redis-server
5

 

5
 memcachedと“正反対”、Redisが仮想メモリをサポートEXT
5
  RedisはCで各種データ構造を実装したものをデーモンとしたようなソフトウェ
5
  アで、リード・ライトともに非常に高速なのが特徴。ただ、実メモリに乗り
5
  切らないデータセットは扱えないことから利用局面が限定的だった。バージョ
5
  ン2.0では、新たに独自に仮想メモリ機構を実装。実メモリに乗り切らないデー
5
  タをディスクへ書き出す仕組みを取り入れた。
5

 

5
  これはOSのスワップの仕組みそのものだが、Redisでは、あえて独自で実装し
5
  たという(実装にはLinuxカーネルを参考にしたという)。理由の1つは、デー
5
  タ構造が分かっている分、シリアライゼーションによる圧縮効果が高く(最
5
  大で10倍程度)、OSに依存するよりもはるかに効率がよくなること。もう1つ
5
  の理由は、キー・バリューのうち、キーだけはすべてメモリ上に保持すると
5
  いう設計が可能なため。キーがすべてメモリに乗っていることから、Redisの
5
  高速性は保たれるというわけだ。また実際のバリューのほうがいくら大きく
5
  なっても、メモリ消費量はキーの数にだけ依存することになり、100万キー当
5
  たり160MBのメモリ消費で済むという。
5

 

5

なるほど、キーだけメモリ上に置くというのは工夫だなぁ。独自で実装する意味あり。

5

 

5

こちらは詳細に仕様が書かれている。やはり効率良く仮想メモリを管理できるように独自に実装された仕様のようだ。

5
 仮想メモリ技術仕様 — redis v2.0.3 documentationEXT
5
 もうひとつの重要な仮想メモリの属性として、 vm_max_memory があります。
5
 このパラメータはスワップのトリガーを設定するために重要となります。
5
 Redisは、このメモリの設定値を超えた
5
 メモリを使用した場合にのみ、スワップを行おうとします。この値に到達しな
5
 い場合は、スワップの必要はないものとして動作します。
5

 

5

同じ実メモリ容量を使った状態でも体感速度は、Tokyo CabinetよりもRedisのほうが軽く感じる。(Tokyo Cabinetが64MByteでRedisが上記の46MByteを消費した状態の場合)

5

Sekkaは最後に確定した変換候補を記憶するために辞書ストレージに頻繁に書き込みにいくが、Tokyo Cabinetのほうは即座にDiskにsyncしようするのに対して、Redisのほうは遅延させているのだろうと推測している。

5

Sekkaの場合、最悪学習データがDiskに書き込まれずにサーバが落ちても致命的な問題にならない程度の重要度なのでRedisはSekka向きだ。

5

 

5

実際に使ってみればいろいろ工夫が見えて勉強になる。何事も実践あるのみだね。

5

 

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_09[Life] ガラケーSH-03Bは十分使える。そして安い

5

皆さんスマートフォンは使ってる?私はまだ使ってない。

5

凄く便利になるのはわかっているのだけど、毎月の出費を抑えるため、ガラケーにした。

5

中古でSH-03Bという機種を手にいれたのだ。

5
 SH-03B - WikipediaEXT
5
 270px-SH-03B「型は古いが〜シケには強い〜」
5

QWERTYキーボード付き。

5

本体は1万5千円ほどで、毎月の出費は2000円未満。(docomoショップで新品の機種変では6万円強)

5

docomoの一番安い契約でも使える。メールはほとんど家族としかしないので、写真を送ったとしてもこれで十分。

5

 

5

しばらく使ってみて、自分はQWERTYキーボードでローマ字で入力するのが一番快適だということを再認識した。ローマ字入力回路は無意識の領域に焼き込まれている。

5

思いついたことを自分のメールアドレスに即送るというのができるようになった。

5

前までは携帯テンキーでの日本語入力が億劫でやらなかったのだ。

5

SH-03Bはさすがビジネス用途だけあって、キーボードを開くと新規メール作成画面が開くように設定できる。というか購入して最初にキーボードを開いたら、このスライドアクションを新規メール作成画面に関連付けますか?という質問が出るようになっている。完全に営業報告用カスタマイズ。ニィーッポンノォービィージネスマン、ヨクハタラキマス。

5

 

5

自分にとっては、思いついたネタを即メモするため挙動として最高だ。

5

ブログ記事の草稿なんかが書けるようになるかも。いいね。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_08[Sekka] RedisEXTを試す

5

前から気になっていたRedisEXTを試した。 (Redis 2.2.12)

5
 redis_logo
5

Sekkaの辞書ストレージに使うと高速になりそうだという直感があった。

5

しばらく試した結果、非常にSekka向きだということわかった。非常にレスポンスが良く、まさにスラスラという表現がしっくりくる。

5

64MByteのメモリを割り当てたTokyo Cabinetと比べてひっかかりが無い。

5

 

5

但し、問題もあって辞書データが全てメモリに載っているので、64bit環境のredis-serverだと、800MByteのメモリを常時消費した状態になる。

5

これはこれでいいだろう。最近のノートパソコンでもRAMは4GByteほど搭載されてきている。いつもメモリ消費量の進歩については私は楽観的なのだ。

5
 fRAVXM
5

 

5

Tokyo Cabinetでも設定次第でRedis同様にデータベースをオンメモリにし、DISKへの遅延書き込みもできるだろうが、Redisなら標準設定がそうなっている。

5

設定無しでできるのなら、そちらをサポートしたほうが手間がかからない。ユーザにインストールしてもらうことも考慮すると設定不要なのは好都合なのだ。

5

また、In Memory データベースならではの工夫もされているだろうし、今後もいろんな改善が入ってくるだろう。

5

 

5

Sekka 0.9.2に入る予定なのでしばらくお待ちを。

5

 

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_06[TDD] どれだけテストを書けばいいか(1)

5

いま自分のメインプロジェクトは二つあって、両方共TDDで開発している。(NendoSekka)

5

もうTDDでない開発方法には戻れないと思っているが、効果を上げるにはNendo側のテストスイートの網羅率が足りない気がしている。

5

(科学的に分析したわけではないが… というか、そもそも科学的に分析できるものなのかもわからないけど)

5

あきらかにNendoのほうが複雑なソフトウェアだと思うので、より多くのテストコードが必要になるのだろう。

5

それぞれ、実際にテストコードがどれくらいあるのか気になったので調べてみた。

5

 

5

調べるのは、製品コードとテストスイートの行数。

5
 oimg?key=0AhM1GRmxablSdGoyTXJUYTFDSXVtMjNXeXlmTFY5Ync&oid=2&zx=ej3a98ufk7vz
5

実際に調べてみると、Nendoの製品コード(テストされる側のコード)は自分が思ったよりも行数が多い。

5

5000行程度じゃないかと思っていたが、そうではなかった。

5

おまけに、テストコードも製品コードと同じくらい書いていると思っていたが、実際はテストコードのほうが行数が少なかった。

5

 

5

一方、Sekkaのほうはバランス良さそう。一応テストコードのほうが行数が多い。

5

感覚的にはSekkaくらいがいいのかも。

5

 

5

Nendoのほうはまだまだ機能追加していくけれども、このペースでいけばテストコードが製品コードを追い抜くことは無さそうだなぁ。

5

このブログのテーマに戻ると、結局どれだけテストを書けばいいかという結論は出なさそうだ。

5

しかし何らかの指標にはなるので把握しておいて感覚を掴んでおくといいのではないかと思う。

5

他のプロジェクトはどれくらいテストしているんだろう… というのはまた後日。

5

 

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_09_03[Sekka] Sekka 0.9.1 リリース

5

SKKライクな日本語入力メソッド Sekka 0.9.1をリリースしました。(リリースノート Sekka.ReleaseNote)

5
 NbpKsE
5

 

5

主にバグ修正です。

5

また、Tokyo Cabinetのデータベースで辞書データ提供するのをやめました。

5

CPUアーキテクチャ間でTokyo Cabinetの辞書データベースのバイナリは互換性がないためです。

5

将来、Tokyo Cabinet以外のKey Value Storeもサポートするのです、その伏線も兼ねています。

5

 

5

version 0.9.1 変更点

5
Ctrl-RでGoogleIME経由の辞書登録と平仮名フレーズの登録の両方を行えるようにした。
5
Tokyo Cabinetのサポートバージョンを 1.4.37 以上に引き下げた。
5
  Debian squeezeとUbuntu 10.10以上に含まれるTokyo Cabinetが1.4.37であるため。
5
辞書ファイルの提供形式をTSV(タブで区切りのテキストファイル)にした。
5
  sekka-serverの初期化時にTSVの辞書ファイルをダウンロードし、その場で辞書ファイル(tch)に変換するようにした。
5
  (Tokyo Cabinetの辞書は異なるCPUアーキテクチャ間で互換性が無いため)
5
バグ修正
5
M-x 20 [space] でスペースが20文字入るはずが1文字しか入らないバグを修正した。
5
sekka-pathが廃止予定のRubygemsのメソッドの使用をやめた。
5
  https://gist.github.com/1168173
5
  rubygems 1.8.xの環境では大量の NOTE: の表示が出てしまう
5
"2011nen9gatu"などの数字混じりのクエリを変換するとサーバエラーが出る
5
  sprintfのフォーマット文字列(%s)と実引数の個数が異なるというエラー。
5

 

5

 

5

次の目標

5

ユーザ・インタフェース改善のいろんなアイデアを試していきます。

5

辞書ストレージとして、redisを使ってみようと思います。

5

 

5

 

0

comment (disabled)

5