Hatena::ブログ(Diary)

このブログは証明できない。

2012-06-29

[][]shellに設定しておくと幸せになれるaliasをいくつか。

ご無沙汰しております。生きてます。


スクリプトを書いてパスを通しておくと、どこにいても呼び出せるので便利。なんだけど、短いやつなら.zshrcとか.bashrcとかのaliasとして書いておくと管理がラク。自分の.zshrcに書いてあるaliasをいくつか紹介。ちなみに、Mac + zsh環境。




コマンドを短くする系

こういうのは、よくやると思う。

alias r=rails
alias g=git

下のように使える。

% r g scaffold happy title:string expire_in:integer
% g status

よく使うコマンドのタイプ量を減らしておけば、計画停電にも耐えられるかもしれない。




オプションを付けとく系

これもよくあると思う。

alias ls='ls -G'

lsって打ったときに、ls -Gの効果が発揮されて、Greatな表示になる。常時付けとくオプションをタイプしなくていいようにしておけば、計画停電にも耐えられるかもしれない。




一発ログイン

こんなの。

alias dev='ssh -p 22 -l shunsuk dev.shunsuk.net'

ターミナルでdevと打つだけでサーバーログインできる。コレ系は症状が悪化するとパスワードとか書いて、.zshrcを人に見せれなくなる。もっと悪化すると誤ってWebで一般公開してしまう。停電してほしい。




独自コマンド系

複数のコマンドを組み合わせて独自のコマンドを作る。

alias rgrep='find . -name "*.svn*" -prune -o -type f -print0 | xargs -0 grep'

これは、カレントディレクトリ以下を再帰的に検索するrgrepというコマンドを作ってる。.svnの中は検索しないようにしつつ。パイプ "|" で繋いでいく。使い方は。

% rgrep happy

本文中に "happy" と書いてあるファイルの名前と該当行が表示される。現在の情報化社会では、あえて停電させた方がいいかもしれない。





いつでもどこでもWebサーバーを起動したい系

スタバで待ち合わせをしている時など、ふとWebサーバーを起動したくなる時があると思う。RubyにはWebrickというWebサーバーを書くためのライブラリが用意されていて、かんたんにオレオレWebサーバーを書くことができる。

ここのコードはこんな感じ。これだけでpublic_htmlディレクトリに入れたHTMLファイルにhttp://localhost:8000からアクセスできるようになる。

#!/usr/bin/env ruby
require 'webrick'
include WEBrick

s = HTTPServer.new(
  :Port => 8000,
  :DocumentRoot => File.join(Dir::pwd, "public_html")
)
trap("INT"){ s.shutdown }
s.start

これを1行で書く。セミコロンとかで区切ればいいんだろうけど、ワンライナーで。DocumentRootをコマンドライン引数で指定できるようにした。デフォルトhtmlディレクトリ

WEBrick::HTTPServer.new(Port: 8000, DocumentRoot: File.join(Dir::pwd, ARGV.shift || 'html')).tap {|s| trap('INT') { s.shutdown } }.start

これを使って、いつでもどこでもWebサーバーなコマンドを作る。

alias rserver="ruby -r webrick -e \"WEBrick::HTTPServer.new(Port: 8000, DocumentRoot: File.join(Dir::pwd, ARGV.shift || 'html')).tap {|s| trap('INT') { s.shutdown } }.start\""

Webサーバーを起動する時は。

% rserver happy

これでWebサーバー経由でhappyディレクトリアクセスできる。ついでにポート番号も引数にすれば、複数のサーバーを同時に起動できる。


CGIも動くのでHaskell作ったCGIをサクッと試せる。停電でネットにつながらなくてもローカルでいろいろできる。


追記:

シェル関数というのを定義するとワンライナーじゃなくていいそうです。いつも無意識のうちにlsls、って打ってるのに、しぇるのこと全然わかってなかったです。具体例はコメント欄で!




業務を効率化する系

すごく便利なスクリプトがある。


このコードを書いたファイルをどこかに置いてパスを通しておくといいんだけど、案の定1行で書いてaliasにする。まず、微妙に変えつつ1行で。

STDIN.readlines.map(&:chomp).tap{|lines| puts eval(ARGV.shift || '') }

そしたらaliasに。

alias firter="ruby -e \"STDIN.readlines.map(&:chomp).tap{|lines|puts eval(ARGV.shift || '')}\""

使い方は変わらない。例えば、テキストファイルの中からHappy!が含まれる行だけ表示するには。

cat happy_hacking.txt | firter "lines.select {|x| x =~ /Happy!/ }"

Railsのログを解析してみる。日にちごとのPVを集計。

cat development.log | firter "lines.select{|x|x =~ /GET/}.map{|x|[x[/\d{4}-\d{2}-\d{2}/],1]}.reduce({}){|h,x|h.merge(Hash[*x]){|k,a,b|a+b}}.map{|k,v|%<|#{k}|#{v}|>}"

Rubyなのでもっといい書き方があると思うんだけど、計画停電中の計画を立てないといけないので調べる時間がない。


こんな感じのログから。

Started GET "/" for 127.0.0.1 at 2012-06-25 23:07:15 +0900
Processing by SamplesController#show as HTML
  ^[[1m^[[36mProof Load (2.2ms)^[[0m  ^[[1mSELECT * FROM "samples" LIMIT 1^[[0m
Completed 302 Found in 13ms (ActiveRecord: 2.2ms)

Wikiに貼るとtableに変換してくれる記法で出力。(ダイアリーに貼ってもtableになってしまうので下の例は全角になってる。)

|2012-06-25|285|
|2012-06-26|380|
|2012-06-27|200|

ただし、画像などへのアクセスも全部集計してるので、assetsはカウントしないとかの対応が必要。そういうのもチョロっと書いてやるといい。




f:id:shunsuk:20120629080744j:image

Surviving the World - Lesson 628 - Happiness




そんなことより、停電回転寿司が止まってしまうことが心配です。


ハッピーターン 32g×20袋

ハッピーターン 32g×20袋

通りすがり通りすがり 2012/06/29 16:11 もともと1行なら alias でもいいですが、ある程度複雑になったらシェル関数にして .zshrc におけばいいんじゃないでしょうか。無理にワンライナーしなくていいですし…

function rserver()
{
RSERVER_VERBOSE=no
[ "$RSERVER_VERBOSE" != no ] && echo "arguments : $@"

RSERVER_SCRIPT=`cat <<EOS
require 'webrick'

doc_root = ARGV.shift || 'html'
doc_root = File::join(Dir::pwd, doc_root)
server = WEBrick::HTTPServer::new( :Port => 8888, :DocumentRoot => doc_root)
trap("INT"){
server.shutdown
}
server.start;
EOS
`
[ "$RSERVER_VERBOSE" != no ] && echo "RSERVER_SCRIPT : ${RSERVER_SCRIPT}"

ruby -e "$RSERVER_SCRIPT" $@
}

shunsukshunsuk 2012/06/29 19:25 シェル関数!
シェルのことよくわかってないのでRubyで完結しようとしてました。
ありがとうございます!!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/shunsuk/20120629/1340925330
リンク元