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

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


Ubuntu11.10にアップグレードしたらwi-fiが遅い件

珍しく休日にPCを起動した。
何年ぶりだろう。

自宅PCはWindows7とUbuntuのデュアルブートにしているのだけど、Ubuntuを11.04から11.10にしたら無線が遅い。
ネットには接続されるし、IPもふられてるんだけど通信速度が異常に出ない。
なんじゃこりゃ。

このフォーラムWireless Internet Connection so slow after upgrade to 11.10のとおりにコマンド打ったら、解決した。

sudo rmmod iwlagn
sudo modprobe iwlagn 11n_disable=1

SDカードをマウントして、ファイル削除したけどSDカードの容量が増えない場合

注意)以下の作業はやる前に、バックアップを取ってからやってください。

Ubuntu(OS関係あるのか不明)で、Android(IS04)のSDカードをマウントして、ファイル削除したけどSDカードの容量が増えない。゚ヽ(゚´Д`)ノ゚
よく見ると

.Trash-1000

とかってゴミ箱的なフォルダがあって、そこに削除したファイルが移動してた。
んでそこのフォルダ内のファイル全部選択して削除したけど、ファイルが一向に消えないヽ( ̄д ̄;)ノ

ここ見て、ubuntuのゴミ箱を全て空にしたら消えた(´・ω・`)
http://www.google.com/support/forum/p/android/thread?tid=60747a992c0a473b&hl=en

そして再び携帯に戻ったら、破損したSDカードとか出るようになってフォーマットしますかの一択となった。
色々やってたから、なんかまずいの消したのか?
それともまさか上の操作がNGなんだろうか?

めんどいので調査しないけど。

っていう投げっぱなしのどうしようもない記事。


指定した要素で指定した数分、配列を埋める

初期値を指定して配列を作りたいならこうできる。

1
2
  Array.new(3, nil) # => [nil, nil, nil]
  Array.new(2, "foo") # => ["foo", "foo"]

んで、指定した値で要素数Nの配列を要素数Mにしたい場合。

1
  変数.fill(指定した値,変数.size..(N-1))

で出来る。

例)とりあえずMを5とする場合。

1
2
3
4
5
6
7
8
  ary = [1]
  ary.fill(nil,ary.size..4) #=> [1, nil, nil, nil, nil]

  ary = [1,2]
  ary.fill("empty",a.size..4) #=> [1, 2, "empty", "empty", "empty"]

  ary = [1,2,3,4,5]
  ary.fill(nil,a.size..4) # => [1, 2, 3, 4, 5] 

ちなみにfillは!ついてないけど破壊的メソッドなので、レシーバの値変わってしまうのがちょっと注意。

1
2
3
  ary = [1]
  ary.fill(nil,ary.size..4) #=> [1, nil, nil, nil, nil]
  p ary #=> [1, nil, nil, nil, nil]