初心者が初心者に送るシェルと Python のオムニバス

みなさん,グミにちわ!新入社員の osada です.
入社したばかりで右も左も解らないのに「技術ブログを書け」とは,それなんて無茶ぶり?と思ったのですが,逆に初心者にしか書けない「初心者向き」の記事を書けば良いのでは?と思いました.

ということで,

  • 対象者は Linux 初心者です.

プロの方はどんどんツッコんで,初心者を助けていただれば幸いです.

内容は以下2点.再度いいますが完全に初心者向きですよ.

  • Bash: alias, 関数, そして Ctrl-?
  • Python: やっちゃった反省を書いています.誰かの役に立てば…….

「オムニバス」といいつつ,個別の記事に分かれていたため,一つの記事になるよう書式を修正しました.

Bash 履いてますか?

開発では Intel Mac を使っています.必然的にお世話になるのが "Bash".
私の最初の仕事は,Bash をカスタマイズすることでした.

やっぱり alias でコマンド短縮

「キーを打つのは1文字でも少ない方がいい」ですよね?頻繁に打つコマンドは2文字くらいがベストだと思っています.
でも,"git pull"とか,あまり頻繁に打たないので,ワザワザ専用コマンドを割り当てて脳の記憶容量を使うのも勿体無いかもしれません.もちろん "git commit" のように後ろにオプションを付けるコマンドも "gcom -m comment" と打つことができます.

alias ls="ls -GF"
alias ll="ls -l"
alias la="ls -a"
alias en="emacs"
alias ..="cd ../"

alias gadd="git add"
alias gcom="git commit"
alias gpl="git pull"
alias gph="git push"
alias gtus="git status"

関数が一番

Django では manage.py というコマンドラインユーティリティを使って,専用コマンドや自作コマンドを発行することができます.でも,settings オプションなどを付けるとちょっと長いです.

python manage.py syncdb --settings=mysettings
python manage.py migrate --settings=mysettings
python manage.py validate --settings=mysettings

それぞれのコマンドだけを書けば済むようにしたい!と思ったのですが,alias は引数展開ができないらしいです.そこで関数にしてみました.

manage(){
python manage.py ${1} --settings=mysettings
}

# manage syncdb
# manage migrate
# manage vlidate

登録した関数は,タブによるコマンド補完が使えるので,だいたい10キーくらいで,コマンドが打てます.ラクチンですね.

他にも,ローカル開発サーバを立ち上げるのを1コマンドでまとめたりしています.ラクチンですね.

workstart(){
workon xxxx
cd xxxx/xxxx/xxxx
runttserver &
runserver mysettings.py &
}

runttserver(){
ttserver -port xxxx /tmp/sweet.tch
}

runserver(){
python manage.py runserver xxxx --settings=${1/.py/}
}

Ctrl-r って知ってる?

alias やら 関数 やら,書いてきましたが,Ctrl-rって知ってますか?
"sy"と打ったところで,コマンドのヒストリを後方検索してくれました.

alias 要らないじゃん(笑)「ターミナルを複数立ち上げたときに,そのターミナルしか検索してくれないから,不便じゃん!」と言ったら,普通に統合できるそうです.そりゃそうですね.トホホ.
もっと勉強します!

Python

文字列を比較してはいけません(反省録)

ちょっと Django に慣れないので,うっかりやってしまうことがあります.

view を通ってくる変数は,「文字」ということをうっかり忘れて,比較してしまいました.ダメですね.
ところで,

perl -e "print '5' < '10' ? 'True' : 'False'
True

なぜか,perlだけTrueを返します.
詳細は次までに調べておきます.

特定の文字列の行だけを抜く python の備忘録

ターミナルのログを取っておいて,特定の箇所だけ取り出そうと思ったら,awk の書き方を完全に忘れていました.仕方ないので python で処理をします.また何かに使うかもしれないので,自分のために書き残しておきます.

python -c "import re;import sys; [sys.stdout.write(s) for s in sys.stdin.readlines() if re.match('done|fail|err',s)]" < log

ところで,tee ってコマンド,知ってますか?

tee(ティー)はUnixのコマンドの一つ。 コマンドの標準出力 (stdout)を 他のファイルへコピーできる機能を提供する。
http://ja.wikipedia.org/wiki/Tee_(UNIX)

次はこれを使うことにします.

いや〜,初心者は知らないことが沢山あるので,とても楽しいですね.
では,どこかの誰かの役に立てますように.