既存のメソッドをすり替える方法

すでにあるメソッドに処理を追加したい場合。
すでにあるメソッドを踏襲した新しいメソッドを定義して、メソッドの呼び出し側を新しいメソッドに向けることができますが
現実的でないですね。

ではどうやってすり替えるか。
実現手段はいくつかあると思いますが、ここではアラウンドエイリアスを使ってみます。

今回はStringのto _sメソッドを、

文字列(文字列長)

と表示するよう変えてみる。

今日のコードではaliasを使いますが、二度呼ぶとエラーとなってしまうのでirbを都度起動してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
str = "あいう"

str.to_s #=> "あいう"

class String
  alias :old_to_s :to_s

  def to_s
    old_to_s + "(" + length.to_s + ")"
  end
end

str.to_s #=> "あいう(3)"
str.old_to_s #=> "あいう"

この前のrubyのオープンクラス - なんとなく日々徒然と使ってStringクラスにコーディングしていきます。

構文は
alias 新しいメソッド名 古いメソッド名
です。
今回の例ではto sにold to _sという別名をつけます。

1
2
3
4
5
6
7
8
9
10
str = "あいう"

str.to_s #=> "あいう"

class String
  alias :old_to_s :to_s
end

str.to_s #=> "あいう" 
str.old_to_s #=> "あいう"

それでto _sを書き換えちゃいます。

1
2
3
  def to_s
    old_to_s + "(" + length.to_s + ")"
  end

to sが呼ばれた場合は書き換えたメソッドが呼ばれ、old to sが呼ばれた場合は昔のメソッドが呼ばれる状態です。
書き換えられたto
sは昔のto sをold to _sで呼び、lengthをそこにくっつけています。

これでメソッドのすり替えが完了です。


gitで今やってる作業を一時退避する方法

今日は肉の日。

肉関係ないけど.

機能追加中に、バグ報告がはいった場合。
今やってる修正を置いといて、最新を取得しなおしてバグフィックスしたい場合がある。

そんな場合

1
git stash

ってやると、今やっている作業内容(ステージングファイルもアンステージングファイルも)を一時退避できる。

戻した場合は

1
git stash pop

で、戻せる。

今保存しているstash一覧は

1
git stash list

コンフリクトしたりして、stashがどうにもならなくなってstashを消し去りたい場合には

1
git stash clear

ってな感じでどうですか。

これ知るまでは

1
2
git commit -m "一時退避"
git reset --soft HEAD^

ってやっていたマヌケは私です。

ああ、とりあえず肉食いたい。


悲しいお話

昨日降りしきる雨の中灯油をもったまま玄関前でよろけた拍子に水鉢を踏み割ってしまい。

地面に放り出された冬眠中の金魚とメダカを救出して、45センチのグッピー水槽に移したら
ノロノロでかわせずにグッピー♀にいじめられて冬眠からさめたばかりの金魚が死んでしまってとても悲しいのです。


rubyのオープンクラス

rubyのオープンクラス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Hoge
  def aaa
    p "aaa"
  end
end


hoge = Hoge.new

hoge.methods.grep(/aaa/) # => [:aaa]


class Hoge
  def bbb
    p "bbb"
  end
end

hoge.methods.grep(/aaa|bbb/) # => [:aaa, :bbb]

一度定義済みのクラスHogeに再度Hogeを定義している。
Hogeが定義されていると、二回目の呼び出しでは一回目の呼び出しのHogeが呼ばれ
そこにメソッドbbbが追加される。

当然String等の既存クラスにも対応。

1
2
3
4
5
6
7
8
9
class String
  def aaa
    p "aaa"
  end
end

str = "fuga"
str.methods.grep(/aaa/) # => [:aaa]
p str.aaa # => "aaa"

構造体を使う

rubyで構造体を使いたい時
OpenStructが使える。
属性は動的に作ってくれる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require 'ostruct'
user1    = OpenStruct.new
user2   = OpenStruct.new

user1.id = 1
user1.name = 'hoge'

user2.id = 2
user2.name = 'fuga'

p user1.id #=> 1
p user1.name #=> 'hoge'

p user2.id #=> 2
p user2.name #=> 'fuga'

#Arrayにラップしちゃえば、options_from_collection_for_selectにも渡せる。
require 'action_view'
require 'active_support/all'

include ActionView::Helpers::FormOptionsHelper

users = [user1,user2]
options_from_collection_for_select(users , "id" ,"name") #=> "<option value=  "1  ">hoge</option>  n<option value=  "2  ">fuga</option>" 

すばらしい


youtubeに初投稿してみた

動画埋め込みやりたくて、はじめてyoutubeに動画あげてみた。
画像荒いなー。

千葉県一宮。
12月某日。

多分わからないと思うけど、5秒目ぐらいから中央の一番奥で真横にのってそのまま消えていくのが自分です。

真横に真横にって呪文のように唱えていて、頭にそのことしかなかったけど。
波が割れる前のうねりで真横に乗っちゃいけないということをこの時知りました。

コシぐらいで綺麗に割れる初心者向けの良い波でした。


tail -fをDBの特定のテーブルに対して行う方法

風です。tail -f風。

前にwatchコマンドについて書いた。

watchコマンド ~ログとかファイル監視する時とかは何も考えずにtail -f ファイル名としちゃう人へ

の追記的なもの。

開発中ってマスタ系のテーブルは空にしないけど、トランザクション系のテーブルはテスト前に空にすることが多い。

んでデータ登録する作業する度に、なんていうのか知らんけど。SQLブラウザ?(common sqlとか SI Object Browserとか)っていうんでしょうか
で、select文書いておいて一々executeボタンを押す。

このexecuteが対した手間じゃないけど、毎回押すとめんどいし、意外に時間もかかる。

そこでこの間紹介したwatchで2秒起きにselectしちゃえばいいよねってお話。
しかも変更部分ハイライトすれば、追加したレコードも一目瞭然。

1
watch -d=cumulative 'mysql -u root --password=  db_name -e "select * from XXX_table;"'

で、どうでしょうか。
難点は差分ハイライト表示している時に、desc指定すると差分拾えないこと。

だいたい自分は10秒起きに、毎回差分拾ってます。

1
watch -d -n 10 'mysql -u root --password=  db_name -e "select * from XXX_table;"'

ちなみに今モデル監視してログ作成する処理書いているんだけど。
登録作業していないのに、意図しないタイミングでレコードが増えていることがあって、そういう場合にも一定間隔でselect投げるようになるので
ウィンドウ並べて操作していれば、すぐに察知できる。

ちなみにrailsでモデルのログ機能作るのであれば
acts as audited

つかうといいよ。


if文をずらずら書かないために

rubyだけじゃないんだけど。
変数の値を繰り替えしif文の条件にする場合

1
2
3
if crud == 'insert' || crud == 'update' || crud == 'delete'
  #do somtehing
end

だったらこう書いた方がいいよね。

1
2
3
if ['insert','update','delete'].include?(crud)
  #do somtehing
end

他に良い案ありますか?


watchコマンド~ログとかファイル監視する時とかは何も考えずにtail -f ファイル名としちゃう人へ

ログとかファイル監視する時とかは何も考えずに

tail -f debugger.txt

とかってしちゃう人いると思うんですが。

表示する内容が少ない場合なら、watchってのがある。

watch cat debugger.txt

でデフォルトの2秒起きにcat debugger.txtが実行されます(表示は画面に収まるまで)

秒数変えたければ(下記例は60秒)

watch -n 60 cat debugger.txt

コマンドに-dをつければ変更箇所を毎回ハイライトしてくれる。

watch -d cat debugger.txt

cumulativeを指定すれば、watchし始めてからの変更をハイライトしてくれる。

watch -d=cumulative cat test.txt

もちろんコマンドも可能

watch -d ls -la

ロックファイルとか、ファイルが作成されたことの確認したい時とかに便利かもしれません。

開発中にログファイルに特定の文言が出たか知りたい場合とかにも便利。
例えば「error」と「fatal」がログに出た場合に、watch使えばすぐ気づける。

watch grep -n -e error -e fatal app.log

ってやると行番号付きでerrorかfatalが発生したことがわかる。


コマンドの繋ぎ方

コマンドの繋ぎ方は

パイプ(|)とかファイルに書き込むリダイレクション( > もしくは > > もしくは <)が有名ですが。

ps aux | grep postfix

他にもあるんですね。

下の例のコマンド自体は意味のないコマンドですが。

1 cd /var/www/app/log/ ; scp app.log 192.168.X.XX:/home/user
2 cd /var/www/app/log/ && scp app.log 192.168.X.XX:/home/user
3 cd /var/www/app/log/ || scp app.log 192.168.X.XX:/home/user

1がコマンドを実行した後に次のコマンドを実行する方法。
2が移動に成功した場合のみ次のコマンドを実行する方法。
3が移動に失敗した場合のみ次のコマンドを実行する方法。

cronで指定するコマンドや、postfixのエイリアスで標準入力にメールの内容渡してプログラムを起動する際に使ったり。

例えばrailsのスクリプトランナー使いたい場合に。

cd rails appのルートディレクトリ ; rails runner "Calender.generated" RAILS_ENV=production

ルートに移動してからスクリプトランナー起動。
とか。