Ruby



Sitemap | Profile | タグ一覧
最近の更新
ドライランのありがたみを改めて知る
2024/04/04
伊豆半島
2024/03/31
お出かけチェックリスト
2024/03/29
Ruby
2024/03/27
Kubernetes
2024/03/22
音楽データをDisplayAudioで聞く
2024/03/09
Redmine
2024/02/05
git
2024/02/02
経済
2024/01/08
どうする家康
2023/12/17
MX-Linux
2023/11/06
國體関連学-休学のご連絡
2023/08/13
Debian
2023/08/02
CentOS
2023/06/13
Dell-XPS13
2023/05/23
ベルト
2023/05/18
SourceForge
2023/04/17
確定申告
2023/02/19
さらば「まぐまぐ」
2023/01/09
風猷縄学
2022/11/23


[-] 1. コーディングルール

  1. 継続行はタブ2つ
    • 例:
      printf(format_str,
          date,
          user.name,
          ...)
      ...
      parent.is_nil? ?
          'hello' :
          'world'
    • 例外:
      1. ブロックは1タブ。例:
        post :create, user: {
          email:  'x@example.com'
        }

[-] 2. Tips memo

[-] 2.1. Oneliner

  • パターンマッチさせ、それを印字
    ... | ruby -ane 'print($&, "\n") if $_ =~ /...().../'
  • パターンマッチさせ、キャプチャ部分を印字
    ... | ruby -ane 'print($1, "\n") if $_ =~ /...().../'

[-] 2.2. トレース

実行時、行内容付きで表示してくれる機能。bash の set -x と同様。 debug に便利:

$ ruby -rtracer ...

[-] 2.3. MD5

require 'digest/md5'

Digest::MD5.hexdigest('abc') Digest::MD5.file('/etc/group')

[-] 2.4. JSON

[-] 2.4.1. str -> JSON

require 'json'
s = File.open('/tmp/x').read
h = JSON.parse(s)

[-] 2.4.2. pretty print hash in JSON

File.open('/tmp/x.out', 'w'){|f|
  f.puts(JSON.pretty_generate(h))
}

[-] 2.5. rcov

[-] 2.5.1. install

$ sudo gem install rcov

[-] 2.5.2. how to use

$ rcov 

[-] 2.6. trace

実行トレースを取る方法: tracer.rb を require する。例:

ruby -rtracer script/generate ...

[-] 2.7. hash update each value

[-] 2.7.1. destructive

my_hash.each { |k, v| my_hash[k] = v.upcase }

[-] 2.7.2. non-destructive

my_hash.inject({}) { |h, (k, v)| h[k] = v.upcase; h }

[-] 2.8. DBI

DBI 野良ビルド

ruby setup.rb config --with=dbi,dbd_pg
ruby setup.rb setup 
sudo ruby setup.rb install

[-] 2.9. openssl

2008-01-17, openssl がなかったので入れる。 desktop は Vine3.x + ruby 1.8.2(2004-12-25) の野良ビルドなので openssl も野良install が必要:

(1.8.2 ソースをダウンロード)
$ umask 022
$ cd ruby-1.8.2/ext/openssl
$ ruby extconf.rb
$ make
$ sudo make install

[-] 2.10. nil なら別の値を代入する方法

a = b || c

b が nil でないなら b が a に代入される
b が nil なら       c が a に代入される

[-] 2.11. Chili install(旧情報)

(2014/04/01 時点、redmine に移行したのでこの情報は古い)。

https://www.chiliproject.org/projects/chiliproject/wiki/Installation より。

以下、ME, MY_GROUP は Linux のユーザ, グループ。

  1. 前提:
    chili:3.8.0
    Passenger:3.0.17
    Ruby:1.9.3
    Postgresql:9.1
    OS:Ubuntu 12.04
  2. https://www.chiliproject.org/projects/chiliproject/files からダウンロード。
  3. 展開。/home/chili/ 以下にインストールと仮定。例:
    $ sudo mkdir /home/chili
    $ sudo chown ME:MY_GROUP /home/chili
    $ cd /home/chili
    $ tar zxvf /tmp/chiliproject-3.8.0/
    $ bundle install --without test development
  4. config/database.yml 作成し、DB作成:
    $ bundle exec rake generate_session_store
    $ RAILS_ENV=production bundle exec rake db:create
    $ RAILS_ENV=production bundle exec rake db:migrate
    $ RAILS_ENV=production bundle exec rake redmine:load_default_data
  5. 特定のファイルに対し、chiliProject 実行ユーザにファイル書き込み権を与える:
    $ mkdir -p tmp public/plugin_assets
    $ sudo chown -R ME:MY_GROUP files log tmp public/plugin_assets
    $ sudo chmod -R 755 files log tmp public/plugin_assets
  6. Passenger(v3.0.x) on Ruby-1.9.3 on Ubuntu 12.04 セットアップ
    • Passenger 自身のインストールは略。
    • 背景
      • ruby は rvm 等は使わず、/home/ruby/ruby-N.N.N-pNNN/ にインストールして PATH を切り替えて使用している(ここで N はバージョン番号)。
    • /etc/apache2/mods-available/passenger.conf
      <IfModule mod_passenger.c>
        PassengerRoot /home/ruby/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/passenger-3.0.17
        PassengerRuby /home/ruby/ruby-1.9.3-p194/bin/ruby
      </IfModule>
    • /etc/apache2/mods-available/passenger.load
      LoadModule passenger_module /home/ruby/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
    • /etc/apache2/sites-available/default-ssl
      #--------------------------------------------------------
      # Chili(using rails2.3.x) passenger setup
      #--------------------------------------------------------
      RailsBaseURI /chili
      <Directory /home/chili/chiliproject-3.8.0/public>
        Options -MultiViews
      </Directory>
      • 注: Rails3用設定としてしまうと、下記エラーとなるので要注意:
        Ruby (Rack) application could not be started
          :
        No such file or directory - config.ru
    • enmod
      $ sudo a2enmod passenger
    • apache2 restart
      $ sudo service apache2 restart
  7. admin/admin でログインし、password を変更。

[-] 3. ハマった

[-] 3.1. 引数への副作用

引数も上書きするため、某自前クラスインスタンスにて rails の params を書き換えてしまい、 paginate でページリンクを押したときに初めて発覚するバグを誘発してしまった。

[-] 3.2. and, or, &&, ||

and と &&, or と || は意味は同じだが、優先度は...

高い: && → || → (or/and) :低い

とのこと。or と and が同じ優先度とは... はまった。

[-] 4. ruby の良いところ

[-] 4.1. 以下の文は簡潔かつ意味明瞭

a  = b || c

"a は b さもなくば c"

[-] 5. Install

[-] 5.1. Ruby 3.1.0 on MX-Linux 21 (Debian 11(Bullseye)ベース)

  1. prerequisite (TODO)

$ sudo apt install make libreadline6-dev libssl-dev

  1. 野良ビルド
    $ umask 002
    $ tar zxvf ruby-3.1.0.tar.gz
    $ cd ruby-3.1.0
    $ ./configure --prefix /home/ruby/ruby-3.1.0 \
          --disable-install-doc --disable-install-rdoc
    $ make              # 12th Gen Intel(R) Core(TM) i7-12700K で約2分01秒。速っ!
    $ make test
    $ (cd /home; test -d ruby || sudo mkdir ruby && sudo chown [USER] ruby) # /home/ruby が無ければ作成
    $ make install

[-] 5.2. Ruby 2.5.5 on Ubuntu 16.04

  1. prerequisite (2.2.2 と同様)
  2. 野良ビルド
    $ umask 002
    $ tar zxvf ruby-2.5.5.tar.gz
    $ cd ruby2.5.5
    $ ./configure --prefix /home/ruby/ruby-2.5.5 \
        --disable-install-doc --disable-install-rdoc
    $ make              # Thinkpad x250 (Core i7) で約3分30秒
    $ make test
    $ (cd /home; test -d ruby || sudo mkdir ruby && sudo chown [USER] ruby) # /home/ruby が無ければ作成
    $ make install

[-] 5.3. Ruby 2.2.2 on Ubuntu 15.04 64-bit

  1. prerequisite (2.2.0 on Ubuntu 14.04 64-bit + postgresql-9.4)
    $ sudo apt-get install make gcc zlib1g-dev libreadline6-dev libssl-dev \
          postgresql-server-dev-9.4 libyaml-dev \
          libmagickcore-dev libmagickwand-dev \
          libffi-dev \
          libsqlite3-dev
  2. 野良ビルド
    $ umask 002
    $ tar zxvf ruby-2.2.2.tar.gz
    $ cd ruby2.2.2
    $ ./configure --prefix /home/ruby/ruby-2.2.2-64bit \
        --disable-install-doc --disable-install-rdoc
    $ make              # Thinkpad x250 (Core i7) で約2分30秒
    $ make test
    $ (cd /home; test -d ruby || sudo mkdir ruby && sudo chown [USER] ruby) # /home/ruby が無ければ作成
    $ make install

[-] 5.4. Ruby 2.2.0 on Ubuntu 14.04 64-bit

  1. prerequisite (2.1.2 on Ubuntu 14.04 64-bit + libffi-dev)
    $ sudo apt-get install make gcc zlib1g-dev libreadline6-dev libssl-dev \
          postgresql-server-dev-9.3 libyaml-dev \
          libmagickcore-dev libmagickwand-dev \
          libffi-dev \
          libsqlite3-dev
    libffi-dev がないと、make 時に下記エラーが出る:
    linking shared-object fiddle.so
    /usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
    ./libffi-3.2.1/.libs/libffi.a: error adding symbols: Bad value
    collect2: error: ld returned 1 exit status
    make[2]: *** [../../.ext/x86_64-linux/fiddle.so] Error 1
    make[2]: Leaving directory `/home/[MYNAME]/temp/ruby-2.2.0/ext/fiddle'
    make[1]: *** [ext/fiddle/all] Error 2
  2. 野良ビルド
    (download 2.2.0)
    $ umask 002
    $ ./configure --prefix /home/ruby/ruby-2.2.0-64bit \
        --disable-install-doc --disable-install-rdoc
    $ make              # Thinkpad X220 (Core i5) で約4分
                        # Dell PowerEdge R200 (Celeron 430 1.8G) で約9分
    $ make test
    $ make install

[-] 5.5. Ruby 2.1.2 on Ubuntu 14.04 64-bit

  1. prerequisite
    $ sudo apt-get install make gcc zlib1g-dev libreadline6-dev libssl-dev \
          postgresql-server-dev-9.3 libyaml-dev \
          libmagickcore-dev libmagickwand-dev \
          libsqlite3-dev
  2. 野良ビルド
    (download 2.1.2)
    $ ./configure --prefix /home/ruby/ruby-2.1.2-64bit \
        --disable-install-doc --disable-install-rdoc
    $ make              # Thinkpad X220 (Core i5) Ubuntu-11.10 non-enc-fs で約5分
                        # VAIO Core i7 + vmware Ubuntu-12.04 で約5分
                        # Shuttle XS35GT (Atom D510 1.6G) で約20分
                        # Shuttle XS35V3 (Atom D2700 2.1G) で約15分
                        # Shuttle DS47 (Celeron 847) で約13分
    $ make test
    $ make install

[-] 5.6. JRuby 1.7.4

  1. java install
    $ sudo apt-get install openjdk-7-jdk
  2. jruby install
    1. tar.gz 版をダウンロード
    2. untar

[-] 5.7. Ruby 2.1.1 on Ubuntu-server 12.04 64-bit

これまで通りとは行かなかった。下記ステップにてインストール:

  1. 必要なパッケージをインストール。ここは従来通り。
  2. 以下のオプションで configure:
    $ ./configure --prefix /home/ruby/ruby-2.1.1 \
      --disable-install-doc --disable-install-rdoc
  3. 以下、make && make test && make install は同様。

※ configure の追加オプションがないと、make install 時に下記のエラーが:

Generating RDoc documentation

Directory .ext/rdoc already exists, but it looks like it isn't an RDoc directory.

Because RDoc doesn't want to risk destroying any of your existing files,
you'll need to specify a different output directory name (using the --op 
option)
...

[-] 5.8. Ruby 2.0.0-p0 on Ubuntu-12.04

Ruby 1.9.* on Ubuntu-12.04 と同じ。無事インストールされた。

[-] 5.9. Ruby 1.9.3-p327 on Ubuntu-12.04

Ruby 1.9.3-p286, Ruby 1.9.3-p194 on Ubuntu-11.10 と同様だが、 以下でハマった:

[-] 5.9.1. 2012/11/12

bundle install で以下エラー発生:

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native
extension.

        /home/ruby/ruby-1.9.3-p327/bin/ruby extconf.rb 
checking for vm_core.h... no
checking for vm_core.h... no
Makefile creation failed
**************************************************************************
No source for ruby-1.9.3-p327 provided with debugger-ruby_core_source gem.
**************************************************************************
*** 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.

ググると、色々皆さん困っている様子(^_^;。 https://github.com/cldwalker/debugger/issues/12 で解決できた:

$ gem install ruby-debug19                    # 数分かかる
$ gem install debugger-linecache -v '1.1.2'
$ bundle install                              # リトライ!

[-] 5.10. Ruby 1.9.3-p286 on Ubuntu-12.04

次節 Ruby 1.9.3-p194 on Ubuntu-11.10 と同様。次節参照。

[-] 5.11. Ruby 1.9.3-p194 on Ubuntu-11.10

[-] 5.11.1. 結論

rvm は一旦置いて、plain ruby を使う。
※ ただし、gdbm を使用するなら。

[-] 5.11.2. 背景

rvm 1.9.2-p318 で gdbm が動かない(データが壊れる) (サンプルソース)。

一応 rvm の作者に問題点を mail してみた(2012/04/27)。

後は返事待ち。 とは言え、待てないので、検証目的でソースから入れて上記サンプルを動かすと、 普通に動く。ということで、こちらを使用することにする。

[-] 5.11.3. task

  1. 必要となるパッケージを事前にインストール (Ubuntu 11.04, 12.04 共):
    $ sudo apt-get install make gcc zlib1g-dev libreadline6-dev libssl-dev \
      postgresql-server-dev-9.1 libgdbm-dev libyaml-dev
  2. 野良ビルド
    (download 1.9.3-p194)
    $ ./configure --prefix /home/ruby/ruby-1.9.3-p194
    $ make              # Thinkpad X220 (Core i5) Ubuntu-11.10 non-enc-fs で約5分
                        # VAIO Core i7 + vmware Ubuntu-12.04 で約5分
                        # Shuttle XS35GT (Atom D510 1.6G) で約20分
                        # Shuttle XS35V3 (Atom D2700 2.1G) で約15分
                        # Shuttle DS47 (Celeron 847) で約13分
    $ make test
    $ make install

[-] 5.12. rvm on Ubuntu

1.8.* と 1.9.* の両方を使用する必要に迫られた。 rvm の存在は知ってはいたが、まだ当時信用していなかったので、 /home/ruby/ 以下に両版をインストールし、ユーザ側を my, my1.9 として (後者が ruby 1.9 用)使いわけようとした。 が、いざそうやってみると、my1.9 でログイン中にメールを見たい時、 my1.9 で thunderbird のセットアップをする必要があったり、my にログインして 見たり、というのがかなりわずらわしいことが分かってきた。

…で、rvm を導入してみたのだった。

  1. インストール
    $ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
  2. .bashrc に以下を設定
    [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
  3. ログアウト&ログインし、rvm が動作するか確認
    $ rvm
    ...
  4. 1.8.7, 1.9.2 インストール:
    $ rvm install 1.8.7
    $ rvm install 1.9.2
  5. 1.9.2 を使用(切り替え)
    $ rvm 1.9.2

[-] 5.12.1. gdbm で怒られる

1.9.2-p290 :001 > require 'gdbm'
LoadError: Could not open library 'gdbm': gdbm: cannot open shared object
file: No such file or directory.
Could not open library 'libgdbm.so': libgdbm.so: cannot open shared object
file: No such file or directory
  1. 一旦 uninstall
    $ gem uninstall gdbm
  2. gdbm devパッケージをインストール
    $ sudo apt-get install libgdbm-dev
  3. 再度 install
    $ gem install gdbm

ok(^_^)/

[-] 5.12.2. ruby 1.8.6 on rvm

Ubuntu 11.10 に ruby 1.8.6 をインストールしようとすると以下のエラーが発生:

expected ‘struct stack_st_X509_CRL *’ but argument is of type ‘int *’

色々ググッて、下記で解決した:

$ rvm get head
$ rvm reinstall 1.8.6

[-] 5.13. Ruby 1.9.2-p290 on Ubuntu 11.04

[-] 5.13.1. 方針

  • 1.8.* と共存させるため、/home/ruby/ruby-1.9.2-p290 に install
  • しばらく両方使い続ける必要あり。
  • Rails3.1 + Postgresql9.x を使用。
  • 同じユーザ間で 1.8 ←→ 1.9 切り替えも面倒なので、新たに別のユーザ (yaruo とか)を作り、このユーザの PATH を 1.9 専用として 使用することとする。

以下は却下した案:

  • VMを新たにつくり、その中で 1.9 + pg9 環境を作る。
    • → そのためだけに10G消費するのも無駄かな、と。

[-] 5.13.2. task

  1. pg9 をインストールしておく(Postgres のページ参照)。
  2. 以下、1.9専用ユーザ(yaruoとか)で作業。
  3. 事前準備。これらが無いと後で泣くはめに:
    $ sudo apt-get install gcc zlib1g-dev libreadline6-dev libssl-dev
  4. 野良ビルド

(download 1.9.2-p290)

$ ./configure --prefix /home/ruby/ruby-1.9.2-p290
$ make              # Thinkpad X40 Ubuntu 11.04 encryptfs で約28分
$ make test
$ make install

[-] 5.13.3. Rails3 関連

  1. pg
    • Postgres9 野良ビルドの場合:
      $ gem install pg -- --with-pg-config=/home/pg/postgresql-9.0.4/bin/pg_config
    • Postgres8 ubuntu パッケージを使う場合:
      $ sudo apt-get install libpq-dev
      $  gem install pg
  2. rails インストール
    $ gem install rails -v 3.1
  3. mongrel 1.2.0 インストール(これでないとインストール時エラー)
    $ gem install mongrel --pre
  4. テスト的に Rails アプリを作成
    $ rails new myapp -d postgresql
  5. config/database.yml の修正(ポートを 15432 に)
  6. 以下が必要:
    • 以下を Gemfile に追加:
      gem 'execjs'
      gem 'therubyracer'
    • 以下を実行:
      $ bundle install
  7. 以下も必要:
    gem 'rake', '0.8.7'
  8. テスト的に scaffold
    $ rails generate scaffold page title:string slug:string body:text --timesta
    $ rake db:create rake db:migrate
    $

[-] 5.14. Ruby 1.8.7-p334 on Ubuntu-10.04

Ruby 1.8.7-p249 も同様。

[-] 5.14.1. 方針

  • /home/ruby/ruby-1.8.7-p334 に install

[-] 5.14.2. task

  1. install
    $ sudo apt-get install gcc zlib1g-dev libreadline6-dev libssl-dev postgresql-server-dev-8.4
    (download 1.8.7-p249)
    $ ./configure --prefix /home/ruby/ruby-1.8.7-p334
    $ make
    $ make test
    $ make install
  2. gem (1.8.* だと "Gem::SourceIndex#each is deprecated with no replacement." が出てうるさいため)
    $ /home/ruby/ruby-1.8.7-p334/bin/ruby setup.rb
    後は必要な gem パッケージをインストール。
  3. rake, pg, rmagick
    • 以下で install $ gem install rake pg rmagick
  4. rdoc 2.4.3
    $ gem install rdoc -v2.4.3
    • rake と rdoc のバージョンでハマるので、上の2つは必要。
  5. will_paginate 2.3.11: 最新(3.x)は rails2.3には対応してない:
    $ gem install will_paginate -v2.3.11

[-] 5.14.3. 注

Ruby 1.8.6-p368 は Ubuntu-10.04 にはインストールできない。make test で 実数の扱いでエラーとなるバグがあるため。

[-] 5.15. Ruby 1.8.7-p17

  • Rails2.0.2 を vine3.2 で動かす
    • 1.8.7 は Rails2.0.2 が動作しない(Ruby側のバグ)
    • 本家から download
    • ./configure && make && make install

[-] 6. gem

[-] 6.1. gem パッケージの作成

  1. bundle をインストール
    $ gem install bundle
  2. MyPackage なる gem を生成
    $ bundle gem my_package

参考: http://qiita.com/ogomr/items/5b85459738d97bfa0a23

[-] 6.2. gem へのパッケージの登録

  1. 準備
    1. version 確定
      $ $EDITOR lib/edgarj/version.rb
      $ bundle install
    2. テスト
      $ rake test
    3. コミット
      $ git commit -v -a
    4. パッケージ作成
      $ rake app:edgarj:build_gem
    5. local test
      $ sudo gem install pkg/edgarj-#.#.#.gem
      $ cd [APP]; rake test
  2. push
    $ gem push pkg/my-package-0.1.0.gem

NOTE:

  1. rake build は umask の問題を解決しないので使えない。





Generated by juli 2.3.2