Commandlinefu のをコマンドラインから見るコマンド。fu を作った。

commandlinefu とは?

commandlinefu.com というサイトをご存知だろうか?
便利なコマンドラインをユーザーが投稿,評価付けするコミュニティサイトだ。
便利なコマンドラインがいっぱいだ。
個人的に今まで蓄積してきたコマンドライン集が空しくなる程の充実度と凝集度。
シェルスクリプトを書く時は重宝するし,find や xargs 等の実践的な使い方を手っ取り早く理解するのにも最適だ。
こんな使い方出来るのか!?といったようトンチの効いたコマンドラインがあったりして,暇つぶしに眺めるだけでも面白い。
ついつい時の経つのも忘れて見入ってしまい、気づいたら数時間経っていた,なんてのはよくある事だ(うそ)。

これは何?

fu
↑で紹介した commandlinefu の CLI フロントエンド。
Web サイトに行かなくても、CLI でコマンドの検索、閲覧が出来る。※ 投稿は出来ない。

インストール

  1. gem install colored
  2. gem install nokogiri ※ Tag での検索を可能にする為に必要。別に無くても動く。Tag での検索ができないだけ。
  3. chmod +x fu
  4. ./fu

使い方

Abbreviation にある通り、コマンドはユニークになった時点であとの文字を省略できる。
fu list_tag と打たずとも、fu l で OKということ。

実際に find を検索したところ。

iTerm を Ruby から操作する。terminitor もどき、iTerminitor を作った。

iTerminitor とは?

iTerminitor

iTerm の定型作業を設定ファイルに基づいて自動で行うソフト。
※ terminitor ぽいことを iTerm でもやりたかった。
DSL の形式はまるまる terminitor をパクってます。
GNU Screen を使っている人は、そもそもこういうソフトは不要だと思う。

出来ること

iTerm の Window、Tab の作成、各タブへ名前をつける。
各タブでコマンドを実行する。
実行するコマンド群をファイルから読み込んで実行する。

やってること

AppleScript で iTerm を自動操作。
AppleScript については直接 AppleScript を使わず、RubyAppleScript の bridge である、rb-appscript を使用している。

動作環境(僕の)

Mac OS X / Ruby 1.8.7
iTerm 0.10
iTerm 2 ※ これも動いた。

その他

Leopard 標準の Terminal.app を使っている人は terminitor を使った方がいいです。
他に似たプロジェクトとして godo があります。こちらは iTerm も操作できます。

インストール〜使うまで

  1. ダウンロード
  2. 実行権限付与
  3. iTerminitor.rb init でサンプル設定作成
  4. 実行して動作確認
  5. サンプル設定を変更、コピーして使っていく。

使い方

help

### Usage:
# Start iTerminitor session for CONF
  /Users/taqumd/Dropbox/script_bin/iTerminitor.rb start 'CONF'

# Show CONF list
  /Users/taqumd/Dropbox/script_bin/iTerminitor.rb list

# This command create sample CONF for iTerminitor
  /Users/taqumd/Dropbox/script_bin/iTerminitor.rb init

初期ファイル作成。

~% 
~% iTerminitor.rb init
~% 

[created] /Users/taqumd/.iterminitor/sample.rb
[created] /Users/taqumd/.iterminitor/run_file_sample

Check setting DSL
 $ cat /Users/taqumd/.iterminitor/sample.rb

Try sample config
 $ /Users/taqumd/Dropbox/script_bin/iTerminitor.rb start sample.rb

   Thanks.

~%

できあがる sample.rb はこんな感じ
:session で指定するのは Bookmark 名。

起動

~% iTerminitor.rb start sample.rb
~% 

左上の Window 2つは自動的に出来上る。

Python を最短で学ぶ為に有効なリンク集。独断と偏見、というか俺がやっている方法です。

2週間ちょっと前から Python のお勉強をしている。思っていた印象よりも全然良くて、とても大好きになりました。
今もまだまだお勉強中。俺がやっている or やろうとしている方法のメモ。

買った本

Python ポケットリファレンス (Pocket Reference)

Python ポケットリファレンス (Pocket Reference)

網羅的。コードの量と説明の分量も好み。回りくどくなくていい。著者が書いている通り、「実際に現場で使われる」事を志しているからか、、すばらしい!

エキスパートPythonプログラミング

エキスパートPythonプログラミング

買った。プロが読みそうなイメージで。良さそうだし。でもまだチラ読み。この本に取り組むのはまだ先だな。

10 Free Python Programming Books

http://www.coderholic.com/free-python-programming-books/

無料本。一冊やるなら一つ目の Dive into Python がいいらしい。

Python Quick Reference Card

http://perso.limsi.fr/pointal/python:pqrc?s=quick&s=reference&s[]=card

2.4 用だが、めっちゃ網羅している。これ系では一番いいと思う。

他のスクリプト言語との比較。

http://hyperpolyglot.org/scripting
言語の Syntax 比較表と、そのコンセプトの詳細な説明。
PHP とか Perl とか Ruby とかの経験者は Python のニュアンスをつかむのに有用かも。

その他のCheatSheet ※ ↑で紹介したやつは載ってない。なぜか。。

http://devcheatsheet.com/tag/python/

Python Koans(穴埋め問題に値を埋めていく事でテストケースを成功させる。)

https://github.com/gregmalcolm/python_koans/wiki/

全部で 35 lesson(テーマ)で 287 koan(一つ一つの問題)。
これを終えれば一通りの言語仕様を学べる。Python 2.7 or 3.0 対応。僕は 2.7 系で一応全部やりました。
※ 他の言語で、JavaScript-Koans や ruby-koans(これが元祖らしい),rspec_koans とかもある。

後半はリフレクションとか,デコレータ、@property とか、十分 Advaced な内容も入ってくる。
テストケースを満たす、メソッドを実装せよ、なんて問題も出てくる。
module や package とその名前空間。__all__ で export する名前を選択可能だとかってことが、実際に経験として身につくところがすばらしい。
一度通しでやったとはいえ、一つ一つは実際に問題解決に適用するといったリアルな経験をしないとなかなか身につかない。
でも一度やったっていうおぼろげな記憶は残るし、「 そういえば python koans で確かやったな。。。」と思い出せればサンプルコード集としても使える。
lesson は class ,koan(=問題) は method として実装されており、テーマ毎にまとまっていて、ファイル名からも調べやすい。

ローカルの koans フォルダのファイル一覧。これが koan の目次みたいなもん。

|+a_normal_folder/
|+a_package_folder/
|-__init__.py
|-about_asserts.py
|-about_attribute_access.py
|-about_class_attributes.py
|-about_classes.py
|-about_control_statements.py
|-about_decorating_with_classes.py
|-about_decorating_with_functions.py
|-about_deleting_objects.py
|-about_dice_project.py
|-about_dictionaries.py
|-about_exceptions.py
|-about_extra_credit.py
|-about_generators.py
|-about_inheritance.py
|-about_iteration.py
|-about_lambdas.py
|-about_list_assignments.py
|-about_lists.py
|-about_method_bindings.py
|-about_methods.py
|-about_modules.py
|-about_monkey_patching.py
|-about_multiple_inheritance.py
|-about_new_style_classes.py
|-about_none.py
|-about_packages.py
|-about_proxy_object_project.py
|-about_scope.py
|-about_scoring_project.py
|-about_sets.py
|-about_strings.py
|-about_triangle_project.py
|-about_triangle_project2.py
|-about_true_and_false.py
|-about_tuples.py
|-about_with_statements.py
|-another_local_module.py
|-GREEDS_RULES.txt
|-jims.py
|-joes.py
|-local_module.py
|-local_module_with_all_defined.py
`-triangle.py

全部終わったところ。おまけ問題はやってない。

やってる最中はファイルを編集しては、テストケースを走らせる、という繰り返しなんだが、Vim → iTerm → Vim の切り替えで意識がそがれるので、Vim から iTerm 上で testcase を実行できるようにした。
やり方は自作の py-anything プラグイン経由で呼び出した。iTerm の操作は py-appscript を利用している。

https://github.com/t9md/vim-py-anything/blob/master/python/ac_source_cmd.py#L342

vim-py-anything

以前(id:t9md:20101030)で書いた、anything like なランチャをもうちょっとマシにした。

https://github.com/t9md/vim-py-anything

もうちょっと頑張って仕様を決めれば、誰でも気楽に pythonvim 用の anything-source を書いて share できるのではないかと思う。
まだまだ遠いですが。。

高階関数(Higher Order Function)と、デコレータの理解メモ

vim_bridge という egg(?) を使用すれば、python で定義した関数を VimScript から直接呼べるらしい

これは Python で定義した関数を デコレータを使用して、Vim の関数として自動的に定義しているから。
コードはすごく短い。
http://github.com/nvie/vim_bridge/blob/master/vim_bridge/__init__.py


そういう訳でデコレータを理解したくなったので,簡単なコードサンプルにまとめてみた。
デコレータっていいんかね? 特定の領域で convention 的に使用するなら分かりやすいんかな。
デコレータ使うともとの関数は隠蔽されちゃう?このへんは追々分かってくるはず。
今回は大体分かったってレベル。

  1. gen_seq_transformer() は 関数 f を引数にとって、新しい関数を返す。
  2. 作られた新しい関数は sequence を引数にとる。引数として与えられた sequence の一つ一つの要素に対し、1で渡された関数 f が適用される。

sequence の要素一つ一つに、特定の関数を適用する、というのはよくあるパターンで、その関数が、upper() だったり、lower() だったりする。
そういう時に高階関数を使用して関数を生成する関数(関数ジェネレータ)を作れば、重複コードを減らし、全体のコード量を減らす事が出来る。
関数ジェネレータで生成した関数を,別の変数にバインドする作業自体も定型作業だから、@hogehoge を関数定義の直前に書けば、単に関数を呼んでも、
「@hogehoge に(@hogehogeの直後に定義した)関数を渡して生成して出来た関数」を呼ぶ事にしましょう、というルールを作った。それがデコレータ。
個人的にはそんな感じの理解。

※ 参考にしたサイト
http://satoshi.blogs.com/life/2009/11/python%E5%85%A5%E9%96%80%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%81%AF.html

python の関数を VimScript から直接呼べるヘルパー vim_bridge の example を試してみた。

vim_bridge を試してみた。
eazy_install vim_bridge でインストール。

■ 試した環境
Python 2.5.1
vim_bridge 0.4


試したのは下記にある example
http://github.com/nvie/vim_bridge/tree/master/examples/

コードのコメントに書いた通り、example 5 は example 4との違いが分からなかったので飛ばした。
example 7 は Python が返す True/False/None を Vim 側で処理できないようだったので明示的に 0 or 1 を返すようにした。
後、全体として、元々の example では python 側でも関数を CamelCase で定義しているが、def CamelCase() とすると、Vim 側では Camelcase()(※ 後ろのcが小文字)という名前になって嫌なので、Python 側での関数名は under_score() スタイルにしてある。