>> 古い記事: (solved) Javascriptのエラー: Node cannot be inserted at the specified point in the hierarchy / NS_ERROR_DOM_HIERARCHY_REQUEST_ERR
<< 新しい記事: JsUnit: テスト実行とエラーメッセージ表示をキーボード操作で行う

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ruby メモ

APP/bin/foo から APP/lib にパスを通す

2011-06-03

実行ファイル bin/foo を含み lib/foo/bar.rb を利用して動作するライブラリ foo について、 普通に gem や setup.rb でインストールして使えるだけでなく、 「アーカイブファイルを展開しただけで bin/foo を呼び出せば動く」ようにしたい。

ディレクトリ・ファイル構成はこんな感じ

- APP
  - bin/
    - foo # 実行ファイル
  - lib/
    - foo/
      - bar.rb

begin
  require "foo/bar"
rescue LoadError
  $LOAD_PATH << File.expand_path(
                                 File.join(
                                           __FILE__,
                                           "..",
                                           "..",
                                           "lib"
                                           )
                                 )
  require "foo/bar"
end

非 Ruby ユーザ視点で見ると、 Ruby(製のツール)が使いたいのではなく単にそのツールを使って目的が達成できればいいはずで、 gem がどうとか setup.rb がどうという話を持ち出さずに 「アーカイブを展開して適当な所に置いたらあとは ruby /path/to/app/bin/foo で実行できる」 というかたちになっていると簡単で良いと思う。 作った側としても非 Ruby ユーザに薦めやすくなる。

というわけで anbt-sql-formatter では上記のようにパスを通してます。

You don't have write permissions into the /var/lib/gems/1.8 directory.

2011年  2月 26日 土曜日 15:06:23 JST
Ubuntu 10.10 Desktop
ruby 1.8.7 (2010-06-23 patchlevel 299) [i686-linux]
----
$ gem install foo
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions into the /var/lib/gems/1.8 directory.
----

/var/lib/gems/1.8 の書き込み許可がないのでインストールできないらしい。

----
$ ls -la /var/lib/gems/1.8
合計 8
drwxr-xr-x 2 root root 4096 2010-09-14 02:24 .
drwxr-xr-x 3 root root 4096 2011-02-25 23:50 ..
----

たしかに一般ユーザは書き込みできない。

----
$ echo $GEM_HOME
$ 
$ env | grep GEM_HOME
$
----

環境変数 GEM_HOME は存在していない。

----
RubyGems Environment:
  - RUBYGEMS VERSION: 1.3.7
  - RUBY VERSION: 1.8.7 (2010-06-23 patchlevel 299) [i686-linux]
  - INSTALLATION DIRECTORY: /var/lib/gems/1.8
  - RUBY EXECUTABLE: /usr/bin/ruby1.8
  - EXECUTABLE DIRECTORY: /var/lib/gems/1.8/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86-linux
  - GEM PATHS:
     - /var/lib/gems/1.8
     - /home/user/.gem/ruby/1.8
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://rubygems.org/
----

GEM PATHS のところを見ると

  - /var/lib/gems/1.8
  - /home/user/.gem/ruby/1.8

の2つがあり、たぶん、
最初に /var/... へのインストールを試み、
次に /home/... へのインストールを試みるようになっているのではないかと
(詳しくは調べてない)。

ならば、GEM PATHS から /var/... の方を取り除いたり
/home/... の方が優先されるようにできないか、と一旦考えたが、
gem help install を見ていたらこういうのがあった:

  --[no-]user-install          Install in user's home directory instead
                               of GEM_HOME.

これを使うとユーザ側にインストールできた。

----
$ gem install foo --user-install
Successfully installed foo-0.30
1 gem installed
Installing ri documentation for foo-0.30...
Installing RDoc documentation for foo-0.30...
----

面倒なので .bashrc でエイリアス
alias gem-install='gem install --user-install'

ホームディレクトリを得る

File.expand_path("~")

環境変数 HOME が設定してある場合はその値、 設定されていない場合 Windows では C:/Documents and Settings/{USER}、 Linux では / が得られる。
(Ruby 1.8.7 で確認)

参考: File - Rubyリファレンスマニュアル

Lisp 由来なところ

直接の由来でなくても、少なくとも共通してるところ。 Common Lisp とかはちゃんと使ったことないのでよく分かってません。

- nil
- if などが式
- return の省略
- シンボル
- lambda(Proc, proc, ブロック)
- site-ruby
- 真偽値を返すメソッドは foo?(Lisp じゃなくて Scheme?)
- load, require (Emacs Lisp 由来?)
- "?" + 文字 でコードが取得できる
- 破壊的な処理をするメソッドには "!" を付ける
  参考: set! や delete-item! に代表される、名前の最後を ! で終わらせる命名方法は、
  変数やデータ構造を破壊的に変更する操作であることを示す Scheme の慣習です。プログラミングGauche p113)

- assoc
- intern
- eval
- autoload(Emacs Lisp 由来?)

参考: 2010-09-28 Togetter - 「RubyはメッセージのないSmalltalkか、に関するまとめ」

respond_to?


# こういうことをしない
begin
  foo.bar # bar がない場合エラーになる
rescue
  # ...
end

# respond_to? を使う
if foo.respond_to? :bar
  foo.bar
else
  # ...
end

ディレクトリを準備

* ディレクトリがすでにある場合は何もしない
* なければ作る
* ディレクトリではなく同名のファイルが存在する場合は例外を発生させる

def prepare_dir(path)
  if not File.exist?(path)
    Dir.mkdir(path)
  else
    if File.file?(path)
      raise IOError, %Q!file "#{path}" already exists!
    else
      # use existing directory
    end
  end
end

(solved) gem でインストールしたライブラリのドキュメントが見れない

2010-05-02
環境: Ubuntu 9.04 / Ruby 1.8.7

Rubyで、gem installした後、ざっとドキュメントを見たいとき、
どうするのが良いでしょうか?→gem serverで解決 - rubyco(るびこ)の日記

に書いてあるように gem server すると、gem でインストールしたものが出てこない。
(おそらく、sudo ではなくユーザ権限で gem install したものが見えていない)

$ gem --help
(略)
      gem help commands            list all 'gem' commands
(略)

$ gem help server
(略)
    -d, --dir=GEMDIR                 directory from which to serve gems
(略)

というわけで、以下で解決。

$ gem server --dir=~/.gem/ruby/1.8/ # ユーザ権限だとここにインストールされる
Starting gem server on http://localhost:8808/

その他

ディレクトリ内の "." と ".." を除いたパスのリストを得る

Dir.open(dir_foo).to_a - [".", ".."]

配列から nil を除く

[1, 2, nil, 3, nil] - [nil] #=> [1, 2, 3]

配列から重複のないように n 個ランダムに取り出す

irb(main):010:0> [1,2,3,4,5,6,7,8].sort_by{ rand }[0..3]
=> [3, 2, 6, 7]
irb(main):011:0> [1,2,3,4,5,6,7,8].sort_by{ rand }[0..3]
=> [7, 4, 5, 8]

setup.rb

■ prefix の指定

  $ ruby setup.rb config --prefix=/usr/local

■ 設定の確認

  $ ruby setup.rb show

秒を hh:mm:ss.ms の文字列に変換


def sec2timestr(sec)
  sec_f = Float(sec)
  sec_i = sec_f.to_i
  ms = (sec_f % 1.0) * 100
  h = sec_i / 3600
  m = (sec_i - h * 3600) / 60
  s = (sec_i - h * 3600 - m * 60)
  
  "%02d:%02d:%02d.%02d" % [h, m, s, ms]
end

探すのが面倒なもの

# require - gem
feed_tools - feedtools
flacinfo - flacinfo-rb

>> 古い記事: (solved) Javascriptのエラー: Node cannot be inserted at the specified point in the hierarchy / NS_ERROR_DOM_HIERARCHY_REQUEST_ERR
<< 新しい記事: JsUnit: テスト実行とエラーメッセージ表示をキーボード操作で行う
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。