Perlの補完機能付きインタラクティブモード perlsh

前回の記事の続き。

今回はperl。

探してみると、やっぱり対話型インターフェイスを作ってる方がいますね。
メソッド名などの補完も行ってくれるものとして、perlshがありました。
perlshは、Term::ReadLine::Gnuライブラリに付属してます。

Term::ReadLine::Gnuのインストールには、cpanを使うと便利です。
普通にyum install perlとかしとけば、cpanコマンドも付いてくるっぽい。

ただ、私のCentOS 5.1だと、cpan経由のライブラリダウンロードURL (urllist)の
設定がされてなかったので、下記リンク先を参考にしてurllistを設定しました。
http://www.drk7.jp/MT/archives/000885.html

そして、Term::ReadLine::Gnuライブラリをインストールするわけなんですが、
事前にreadlineライブラリ等をyumなどを使ってインストールしとかないと、うまくインストールできないらしいですhttp://www.hasta-pronto.org/archives/2006/08/20-0408.php参照
私の環境では、すでにインストール済みだったので、特に問題ありませんでした。

Term::ReadLine::Gnuライブラリのインストールからperlshを使うまでの流れは以下、

$ cpan install Term::ReadLine::Gnu
$ perl ~/.cpan/build/Term-ReadLine-Gnu-1.17/eg/perlsh
main[1]$ use utf8
main[2]$ utf8:: [TAB]
utf8::             downgrade          is_utf8            unimport
AUTOLOAD           encode             native_to_unicode  upgrade
decode             import             unicode_to_native  valid
main[2]$ exit   #終了

perlshファイルは、実行パスの通ってるディレクトリに入れておくと起動が楽です。

PythonのインタラクティブモードでTab補完を使う

昨日の記事の続き

このまま、各言語のインタラクティブモードの補完機能について書いてけば、
しばらくネタに困らないので続けよう。

今回はPythonです。

pythonの場合、引数なしで起動すればインタラクティブモードになりますが、
下記のようにrlcompleterをimportすることで、補完機能が使えます。
ただし、readlineライブラリが必要です。Linuxとかなら、yum install pythonで普通に入るようです。
[Python]
$ python
>>> import rlcompleter
>>> rlcompleter.readline.parse_and_bind(‘tab: complete’)
>>> di [TAB]
dict dir divmod
>>> di
[/Python]

Windowsの人は、Python Alternative Readlineをインストールするのが楽だと思います。

若干、通常のreadlineと挙動が違うのがアレですが・・・。

参考サイト

Interactive ShellによるPHP対話入力補完

この前の記事の続き。

rubyには、irbっていうinteractive modeあります。
irb実行中に、 require ‘irb/completion’ すると、TABでメソッド名等の補完ができるようになって大変便利です。

PHPのinteractive modeでも同じことができないかなと思い、
探してみたところ、PHP5.1 から標準で導入されてることがわかりました補完機能付きのinteractive modeは、Interactive Shellっていう名称が付いてます。

ただし、–with-readline付きでPHPをコンパイルした場合に限ります。なんで、readlineを動的リンクするだけで使えるようにしてないんだー

yumでインストールしたPHPは、–with-readlineが付いてないので、少なくとも、CentOS 5.1のyumでインストールしたPHPは–with-readlineはついてませんでした。
PHP-cliだけソースコードからもう一度コンパイルしてみました。

環境は、CentOS 5.1です。

$ wget http://jp2.php.net/get/php-5.2.6.tar.gz/from/jp.php.net/mirror
$ tar xzvf php-5.2.6.tar.gz
$ cd php-5.2.6/
$ yum install libxml2-devel
$ yum install readline-devel
$ ./configure --prefix=~/local --disable-cgi --with-readline
$ make
$ make install
$ ~/local/bin/php -a
Interactive shell

php > get_class  [TAB]
get_class          get_class_methods  get_class_vars
php > get_class

うむ、便利だ。

万歩計の桁溢れを目指して歩く

この前、100円均一で万歩計を買いました。
99999歩までカウントできる万歩計です。

当然、10万歩を歩くと、万歩計の表示桁を溢れさせることができるんですが、
ふと、表示桁を溢れさせたら何か面白いことが起きるんじゃないかと思い立ち、
友人と一緒に10万歩を歩いてみました。

徒歩ルートは以下のようになりました。

  • 9月8日 14:20 横浜駅スタート
  • 大船駅まで根岸線沿いを歩く
  • 大船駅から江ノ島を目指して歩く
  • 江ノ島から、小田原まで海岸沿いを歩く
  • 9月9日 14:50 小田原駅近くで10万歩達成
  • その後は、交通機関をフルに使って箱根で適当に温泉に入って帰宅

途中、マックやデニーズで休憩をはさみましたが、大体1日あれば10万歩を歩くことができます。
後半は足が死にそうでした・・・。

結局、万歩系を桁溢れさせても、0歩になるだけで特に意味はありませんでしたw

約5000歩ごとに、携帯電話のGPSで位置を記録し、カメラで撮った写真と合わせて、
Google MapとKMLを使って徒歩経路を表示したのが下のマップになります(赤い線が徒歩経路)。


大きな地図で見る

GPS情報から総移動距離を求めたら約57kmでした。実際にはもう少し歩いた気がします。

Google Mapで経路表示を行ったのは初めてなんですが、GPX Editor JSなどを使うと、
比較的簡単に経路表示できました経路情報をGPX Editor JSへ入力する作業はめんどうでしたが

各種言語の文法

以前のブログで各種言語の文法がBNFとかで書いてあるサイト群をメモりました。
でも、SQLのBNFリンクは入れてなかったことに最近気づいたので、改めてこちらに記事を作りなおしておきます。

C/C++, Java, COBOL, Prolog, SmallTalk
http://www.csci.csusb.edu/dick/samples/index.html
Python
http://www.python.jp/doc/2.3.5/ref/
Ruby
http://www.ruby-lang.org/ja/man/html/_B5BFBBF7BNF_A4CBA4E8A4EBRuby_A4CECAB8CBA1.html
PHPPHPの場合、言語仕様では文法が決まってないそうです。リンク先は、有志の人がそれっぽく作った文法ということになります。
http://www.phpcompiler.org/doc/grammar.html
ECMAScript
http://tomcopeland.blogs.com/EcmaScript.html
Javascript
http://www.mozilla.org/js/language/grammar14.html
ActionScript
http://www.m2osw.com/en/action_script.html#grammar
C#
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
  • Annex A. Grammar参照
SQL
http://savage.net.au/SQL/

なお、正確な言語文法が知りたい方は、それぞれの言語仕様書を見た方が良いです。上記リンク先は、ある程度文法がわかればよい人向けです。

PHPインタラクティブモードの便利な使い方

ブログに書くネタは結構あるんだけど、整理してから書こうとするとなかなか書けない・・・。

しょうがないんで、ネタは小出しに書くことにしよう。

PHPで何かのライブラリのオブジェクトを使う際、どんなメソッドがあるのかよくわからにことが多々あります。リファレンスを見りゃいいんですが、それが面倒な時は、PHP (CLI)のインタラクティブモードを使うと便利です。

インタラクティブモードの場合、statementが完成するたびに(セミコロンで区切られるたびに)処理が実行されるようです。

[PHP]
$ php -a

close
[1] => getAttribute

[24] => expand
)
(Windowsだと Ctrl-Zで終了)

$
[/PHP]

インタラクティブモードで、よく利用する関数は以下 (全部、リフレクション系関数)、

  • get_class_methods( mixed $class_name )  [クラスのメソッドを配列として返す]
  • get_object_vars ( object $object ) [オブジェクトのプロパティを配列として返す]
  • get_declared_classes(void) [定義済のクラスの名前を配列として返す]
  • get_defined_functions(void) [定義済の関数の名前を配列として返す]
  • get_defined_vars(void) [定義済の変数の名前を配列として返す]
  • get_loaded_extensions(void) [コンパイル/ロードされている全てのモジュールの名前を配列として返す]
  • get_extension_funcs ( string $module_name ) [あるモジュールの関数名を配列として返す]