すでにあるメソッドに処理を追加したい場合。
すでにあるメソッドを踏襲した新しいメソッドを定義して、メソッドの呼び出し側を新しいメソッドに向けることができますが
現実的でないですね。
ではどうやってすり替えるか。
実現手段はいくつかあると思いますが、ここではアラウンドエイリアスを使ってみます。
今回は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をそこにくっつけています。
これでメソッドのすり替えが完了です。
今日は肉の日。
肉関係ないけど.
機能追加中に、バグ報告がはいった場合。
今やってる修正を置いといて、最新を取得しなおしてバグフィックスしたい場合がある。
そんな場合
ってやると、今やっている作業内容(ステージングファイルもアンステージングファイルも)を一時退避できる。
戻した場合は
で、戻せる。
今保存しているstash一覧は
コンフリクトしたりして、stashがどうにもならなくなってstashを消し去りたい場合には
ってな感じでどうですか。
これ知るまでは
1
2
| git commit -m "一時退避"
git reset --soft HEAD^
|
ってやっていたマヌケは私です。
ああ、とりあえず肉食いたい。
昨日降りしきる雨の中灯油をもったまま玄関前でよろけた拍子に水鉢を踏み割ってしまい。
地面に放り出された冬眠中の金魚とメダカを救出して、45センチのグッピー水槽に移したら
ノロノロでかわせずにグッピー♀にいじめられて冬眠からさめたばかりの金魚が死んでしまってとても悲しいのです。
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に動画あげてみた。
画像荒いなー。
千葉県一宮。
12月某日。
多分わからないと思うけど、5秒目ぐらいから中央の一番奥で真横にのってそのまま消えていくのが自分です。
真横に真横にって呪文のように唱えていて、頭にそのことしかなかったけど。
波が割れる前のうねりで真横に乗っちゃいけないということをこの時知りました。
コシぐらいで綺麗に割れる初心者向けの良い波でした。
風です。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
つかうといいよ。
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
|
他に良い案ありますか?
ログとかファイル監視する時とかは何も考えずに
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
ルートに移動してからスクリプトランナー起動。
とか。