0

wordpressがpreタグの中の改行をbrタグにするので

フッターにJS書いて消した

<script type="text/javascript">
window.addEventListener("load", function(){
var pres = document.getElementsByTagName("pre");
for(var i = 0; i < pres.length; i++){
var pre = pres[i];
pre.innerHTML = pre.innerHTML.replace(/<br>/gi, "");
}
}, false);
</script>


このblogではgoogle-code-prettifyでコードに色つけてるんだけど
preタグの中でも改行をbrタグに変換してて、1行開いてしまうので消した。


あとblogの見た目を変えた。
テンプレをアップデートしてもカスタムした差分をgitで取ってあるからパッチ当てれるだろ・・と思ってアップデートしたら、templateディレクトリごと消滅して.phpだけしか残っていなかった。
それで色々消えたので違うテンプレートにした。

5

Ruby書くならBundler使え

Rubyでプログラム書くにあたって、bundlerを使わないプログラムは1年ぐらい経つと動かなくなってる事が多々あって、bundlerマジ重要なのと
ぐぐってもあまりbundlerの利点や説明がまとまってる記事がなかったので

研究室のwikiに書いた記事を転載しておく。



Bundlerとは


Bundler: The best way to manage a Ruby application's gems

プロジェクト内で使うRubygemsを管理するしくみ。
プロジェクトの一番上のディレクトリに「Gemfile」というテキストファイルを置き、その中にgemの名前(と必要あればバージョンも)書く。
% bundle install
というコマンドで、gemが一括インストールできる

プログラム内で
require 'bundler'
Bundler.require
と書くと、gemが一括requireできる


どんな時に便利なの?


使用するgemのバージョンを指定できる


開発環境とデプロイ環境で完全に同じバージョンのgemを使えると、無駄なバグが起こらない


gemがメジャーバージョンアップして仕様が変わってしまったので、古いのを使いたい事がある。
railsとかtwitter gemとか、バージョンアップも速いし各バージョンでAPIに互換性がない


あるプロジェクトではtwitter gem 5.x系を、別のプロジェクトでは4.x系を使いたい場合
bundlerなしで
require 'twitter'
するとどちらのプロジェクトでも、バージョンの大きい5.xを読み込んでしまう
そのマシンに存在する最もバージョンの大きいtwitter gemを読み込んでしまうのだ
つまり、新しくtwitter gemを使ったプロジェクトを始めるだけで、古いプロジェクトは何も手を触れていないのに壊れてしまう


作ったプログラムが1年後もちゃんと動くにはbundler必須だとお分かりいただけましたか


rubygems.org以外でホストされているgemをインストールできる

gitリポジトリを指定してインストールできるので、
部外秘なgemは学内に置いておきつつ、Herokuにインストールさせるとかも可能
特定のgit branchやtagを指定してインストールも可能
既存のgemをgithub上でforkして、ちょっとカスタムして使う事もできる
rubygems.orgが死亡してしまった時にも使える


プロジェクトのディレクトリにgemをインストールできる

% bundle install --path (ディレクトリ名)
gemそのものをちょっと修正して使う時や、gemのバグ探しなどに便利


使用方法伝授


準備
まずRubygemsを2.0.0以上にアップデートしておく。
% gem update --system
% gem -v


bundlerをインストール
% gem install bundler
最新版は1.3.4です


Gemfile というテキストファイルを作成し、使用するgemを列挙する
source 'https://rubygems.org'
gem 'sinatra'
gem 'mongoid', '>=2.4.0', '<3.0.0'
gem 'json', '~> 1.7'
gem 'tw', :git => 'git@github.com:shokai/tw.git'
意味 – sinatraはどのバージョンでもいい、mongoidは2.4以上3未満、jsonは1.7.x系の最新、twはgithubから開発版をインストール

このファイルはbundle initすれば雛形を生成してくれるので、書式忘れたらinit。


gemをインストール

% bundle install


Gemfile.lockが無い場合(はじめてbundle installした時)
Gemfile.lockというファイルが生成される
gemの名前とバージョンが列挙されている
これをgitにcommitしておくと吉
Gemfileではゆるめにバージョン指定して、詳細はGemfile.lockに任せた方がいい


gemのインストール元
ローカルにないgemはrubygemsから最新版が
ローカルにあるgemは、ローカルにある中で一番バージョン番号が大きいものがインストールされる


Gemfile.lockがある場合(2回目以降のbundle install時)
書いてあるバージョンのgemがインストールされる


gemのアップデート

% bundle update
rubygems.orgから最新版を取得し、Gemfile.lockを更新する



bundlerで指定したgemを使う

これやらないと、システムに入っている最新版gemを使ってしまいます


bundlerで指定したgemを使う(実行時に指定)
今まで
% ruby foo.rb
% rackup config.ru
等で実行していたのを、
% bundle exec ruby foo.rb
% bundle exec rackup config.ru
とする


bundlerで指定したgemを使う(プログラム内で指定)
require 'bundler/setup'
これを書けば使用バージョンがGemfile.lockに書かれている物に固定される(俺はこっち派)

個別にrequireしてもいいし、
Bundler.require
でgemを一括requireしてもいい。


Gemfileはカレントディレクトリにある物を参照するので、crontabで使う場合はプロジェクトの中にcdしてからrubyしないといけません。
7時30分に実行する例
30 7 * * * cd $HOME/src/ruby/myapp && bundle exec ruby start.rb > /dev/null 2>&1


gemのテンプレも作れる


% bundle gem 名前
でgemの雛形が作れる。
作ったgemは特に審査などなくrubygems.orgにホストしてもらえて、世界中に大公開されてみんなに使ってもらえるのでどんどん作るといいと思います



まとめ


そんな感じで、Rubygemsたちの更新は速いのでGemfileをちゃんと書かないとすぐにプログラムは動かなくなります。
Bundlerを使いましょう

2

crontabでrbenvのrubyを使う

関連 crontabでRVMのRubyを使う

crontabの頭で環境変数PATHに ~/.rbenv/shims を入れておけばおk


うちではこんなふうになっている

SHELL=/usr/local/bin/zsh
HOME=/Users/sho
PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/$HOME/bin:$PATH
PATH=$HOME/.rbenv/shims:$PATH

## この下にcrontabが書かれている


ちゃんと切り替えれているか確認

ruby -vでバージョンがでるので、
* * * * * ruby -v > $HOME/ruby_version
と書いておけばホームディレクトリにruby_versionというファイルが毎分書き出される
これがrbenvでglobal設定したrubyになっているか確認する。
ちゃんとPATHに $HOME/.rbenv/shims が追加できていれば2.0.0とか書き込まれる。



ディレクトリ毎の確認

rbenv local 1.9.2-p320
でそのディレクトリに .ruby-version というrbenvの設定ファイルができる
これがあると、そのディレクトリに入ったらrbenvが切り替わる。


また、rbenv-rehashというgemを入れておけば自動的にrehashしてくれる。
gem install rbenv-rehash


1.9.2にだけarduino_firmata gemを入れて、ディレクトリ毎にrbenv切り替えがcrontab上でも有効なのか試す
mkdir ~/tmp/1.9.2
cd ~/tmp/1.9.2
rbenv local 1.9.2-p320 # .ruby-versionが生成される
gem install arduino_firmata
arduino_firmata -v

で、crontabに書く
* * * * * arduino_firmata -v > $HOME/arduino_version
* * * * * cd $HOME/tmp/1.9.2 && arduino_firmata -v > $HOME/tmp/1.9.2/arduino_version

ホームディレクトリではrbenvのglobaで設定されているRuby2.0.0が使われたので、arduino_firmata gemがインストールされていなくてコマンド実行失敗していた。
tmp/1.9.2にcdした方はちゃんとRuby1.9.2に切り替わっていて、gemで入れたarduino_firmataコマンドへのパスも通っていた。
tmp/1.9.2/arduino_versionには ArduinoFirmata v0.2.8 と書かれていた。


cronで使うまとめ

アプリのディレクトリ毎に
  • crontabの一番上で PATH=$HOME/.rbenv/shims:$PATH
  • アプリ毎にGemfileを作ってbundlerでgem管理
  • アプリのディレクトリに .ruby-version作って、rbenvのバージョンも合わせる
  • アプリのディレクトリにcdで移動してから実行

これで複数バージョンのRubyをcrontabで使える。

0

rvmからrbenvに乗り換えた

rvmで入れた1.9.2でbundler1.3以上が動かないので、入れなおした。
OSはMountainLion


まずmacportsを消す
2.5. Uninstall
pLaTeXのために使っていたけど無くてもなんとかなる気がしたので消した


Homebrewもmacportsとからみ合ってしまっていたので、一旦全部消す
Uninstall Homebrew

rvmも消す

rvm seppuku
sudo rm -rf ~/.rvm
.bashrcとかの設定も消す


App Storeで最新版のXCodeを入れる
Command Line tools for XCodeは必要なし
代わりにXCodeのPreferenceからCommand Line Toolsをインストールする。こっちだと多分XCodeをアップデートしたらアップデートされそうだし。

osx-gcc-installerもインストールする。Rubyのビルドに必要。

それからhomebrewを入れなおす。
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

brew doctor
でおかしい所が無いか確認。

brew install openssl readline rbenv ruby-build


1.9.2のextが2.0.0で必要なので先にビルドする。
rbenv install 1.9.2-p320
rbenv global 1.9.2-p320
rbenv rehash
gem update --system
gem install rbenv-rehash bundler
rbenv-rehashを入れておくとgemコマンド毎にrehashしなくてもよくなるそうだ。
ただし、gemコマンドの後にrehashを自動的にやってくれるだけなので、すでに開いてある別のターミナルではrehashする必要がある。
gemは2.0以上、bundlerは1.3以上を入れておく。


Ruby2.0.0もインストールする
rbenv install 2.0.0-p0
rbenv global 2.0.0-p0
rbenv rehash
gem update --system
gem install rbenv-rehash bundler

で、1.9.3や2.0.0でsha1やmd5が動かないので、1.9.2から持ってくる
これしないとbundlerやoauthが動かない。
Ruby2.0.0と1.9.3でSymbol not found: _rb_Digest_SHA1_Finish (LoadError)


こういう面倒くさい手順、Ubuntuだとbuild-essential入れてrvm入れるだけで済んでたのでやっぱりMacは開発環境に向いてないと思った。
最近は1年ごとのOSアップデートに付いて行かないといけないし、入れた直後はgcc消えたりするし、
XCodeのアップデートくる毎におかしくなるし、つらすぎる。

2015年ぐらいにはiOS以外の開発者はMac使ってない気がする。
あと2018年にはgitもオワコンって言われてるはず

0

Ruby2.0.0と1.9.3でSymbol not found: _rb_Digest_SHA1_Finish (LoadError)

macにrbenvで入れたRuby2.0.0や1.9.3でbundlerを使った時にそういうエラーがでて動かなかった


1.9.2でビルドしたsha1.bundleをコピーしてきたら動くようになった。

cp ~/.rbenv/versions/1.9.2-p320/lib/ruby/1.9.1/x86_64-darwin12.3.0/digest/* ~/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/x86_64-darwin12.3.0/digest/

cp ~/.rbenv/versions/1.9.2-p320/lib/ruby/1.9.1/x86_64-darwin12.3.0/digest/* ~/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/x86_64-darwin12.3.0/digest/

そしたらsha1.bundleだけじゃなくmd5.bundleもエラー出る事に気づいたので、面倒だからdigestの下のバイナリまるごと上書きした。


ubuntuでは問題なし。