ErlangのEshellで遊んでみた

今年の目標の一つとしてErlangを覚えるというのを挙げたので、さっそく「プログラミングErlang」を手に入れて読み始めた。とりあえず目次に目を通して思ったこと。

https://twitter.com/#!/inoshiro/status/154606384397303808:twitter:detail:left

第1章はErlangを学ぶべき理由と各章についての説明。
第2章からはErlangをインストールし、シェル上でいろいろ動かしていく。

インストール

Mac OS X Lionで、homebrewからインストールした。

% brew install erlang

特に問題なくインストール完了。

シェルで遊ぶ

erlコマンドでErlangのシェルを起動する。

% erl
Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.5  (abort with ^G)
1> 

公式サイトを見たら最新版は R15B のようなので、ちょっと古い。
適当に式を入力してみる。

1> 123 + 2312 - 382.
2053
2> 111 * (22 + 33).
6105
3> 100 / 20.
5.0
4> 10 % 3.
4> .
10
5> 

おや、余りが出るかなと思ったら何も出力されない。Erlangでは%がコメントなので、 % 3. はコメント扱いになっていた。もう一度ピリオドを打つと10だけが評価された。

5> "hogehoge".
"hogehoge"
6> abc.
abc
7> X = 12345.
12345
8> X
8> .
12345
9> X+X+X*X*X.
1881365988315
10> X = 123.
** exception error: no match of right hand side value 123
11> _HOGE = 9999.
9999
12> _HOGE.
9999
13> fuga = 32434.
** exception error: no match of right hand side value 32434
14> 1 == 1.
true
15> 2#11111111.
255
16> 16#ff.
255
17> 

文字列、変数代入、再度代入しようとしてexception errorが発生。Erlangは単一代入なので、変数に値を代入できるのは一度きり。そうすることでプログラムの問題個所を特定しやすくなるとのこと。また、このことがプログラムの並列化を容易にする、らしい。

6番目で何気なく abc. を評価したら abc が返ってきて、文字列として扱われてる?と思ったんだけど、先を読むとこれはアトムというものだった。アトムは数字以外の不変値のこと、とあった。
あと、Erlangはn進数をn#で始まる値で表すことができるようだ。

17> 3#111.
13
18> 100#12.
* 1: illegal base '100'
18> #12.
* 1: syntax error before: 12
18> 33#111.
1123
19> 10 div 3.
3
20> 10 rem 3.
1
21> 36#11.
37
22> 37#11.
* 1: illegal base '37'
22> #11.
* 1: syntax error before: 11
22> 

n進数は2~36が有効範囲だね。あと、余剰の求め方も出てきた。remを使えば良いみたいだ。

今日はとりあえずここまで。第2章の残りはタプル、リスト、文字列、パターン照合について。

New Years Python Meme

エキスパートPythonプログラミングの原著者であるTarek氏がこんな記事を書いています。みんなで決まったお題に対する回答を書いてブログで公開しようぜ!みたいな感じ。なかなか参考になるわーと思って見ていたのだけど

https://twitter.com/#!/inoshiro/status/152654365684019200:twitter:detail:left
https://twitter.com/#!/aodag/status/152702345397018625:twitter:detail:left

書けというプレッシャーを感じたので書きます。但し回答は日本語。
はじめは年内に書こうと思ってたけど書ききらず、既に新年迎えてしまって時期を外した感があってアレですが。

1. What’s the coolest Python application, framework or library you have discovered in 2011 ?

それなりにPythonを使うようになったのは2011年からなので、discoverばっかりでクールと言えるほど使い込んでるものがなかったりします。
が、敢えて挙げるならこのあたり。

  • Pyramid (Webアプリケーションフレームワーク)
  • SQLAlchemy (O/Rマッパー)
  • threading (スレッドプログラミング用の標準ライブラリ)
2. What new programming technique did you learn in 2011 ?

上記のthreadingを使ったマルチスレッドプログラミングに一歩足を踏み入れました。本当に一歩くらい。
並列、並行、非同期などの違いが少しわかるようになったかも。

3. What’s the name of the open source project you contributed the most in 2011 ? What did you do ?

特にオープンソースのプロジェクトには関わってないです。
コードを読んだり書いたりする力をつけるのにオープンソースプロジェクトに参加するのはイイよ。というのはよく聞く話だけど、自分なんかが…と腰が引けてしまってますね。

4. What was the Python blog or website you read the most in 2011 ?

特定のブログとかウェブサイトをチェックはしてませんでした。twitterでフォローしてるPythonistaから流れてくる情報を拾ってた感じ。
あとはPythonとPyramidのメーリングリストは登録してます。
今年はこのハッシュタグで書いた記事を参考に、英語情報も拾って行きたいです。

5. What are the three top things you want to learn in 2012 ?
  • Pyramid
    • ちゃんと使いこなせるようになりたい。
  • Twisted
    • Webアプリだけじゃなくて裾野を広げたいと思うので。Pythonでネットワークプログラミングといったらこれかなあと。
  • Erlang
    • 関数型やってみようと思ったのと、メッセージパッシングってどんなもんじゃろ、という興味から。
6. What are the top software, app or lib you wish someone would write in 2012 ?

aodag先生がPyramidベースのフレームワークを作るそうなので、期待しています。

Want to do your own list? Here’s how:
  • copy-paste the questions and answer to them in your blog
  • tweet it with the #2012pythonmeme hashtag

これから書く人がいるかどうかはともかく、お決まりのようなので一応。

IPython0.12の新機能notebookを動かしてみた

IPython0.12がリリースされました。

0.12 Series — IPython v0.12 documentation

whatsnewから見出しだけ抜き出した。

  • An interactive browser-based Notebook with rich media support
  • Two-process terminal console
  • Tabbed QtConsole
  • Full Python 3 compatibility
  • Standalone Kernel
  • PyPy support

中身はあんまり読んでないけど、「browser-based」ってところが新しい!と思ったのでとりあえず試してみた。

セットアップ

OSはMac OS X Lion。

mkvirtualenv --no-site-packages --distribute ipython
pip install ipython

新しい環境作ってipythonをインストール。そして実行!

ipython notebook

tornadoがねえよ と言われる。ですよねーブラウザベースだしWebサーバ必要ですよねー。インストールして再度実行!

pip install tornado
ipython notebook

今度はzmqモジュールが見つからねえよ と言われる。zmqってなんですか?
で、ぐぐってみたところzmqというのはZeroMQというメッセージキューのPythonバインディングモジュールらしい。

zeromq: Fastest. Messaging. Ever.

ZeroMQについては割愛。こことかここを読むとなんとなくわかった気になれるかも。

brew searchしたらあったのでそこからインストール。楽ちん楽ちん。

brew install zeromq

あっさりと入ってくれました。で、あとはPythonバインディングをインストールする。

pip install pyzmq

では、いってみよー。

ipython notebook
[NotebookApp] Using existing profile dir: u'/Users/kenjiro/.ipython/profile_default'
[NotebookApp] The IPython Notebook is running at: http://127.0.0.1:8888
[NotebookApp] Use Control-C to stop this server and shut down all kernels.
[NotebookApp] Using MathJax from CDN
[NotebookApp] Kernel started: cd9c31c0-2fbb-41cf-9610-cb6cf27cc148
[NotebookApp] Connecting to: tcp://127.0.0.1:50420
[NotebookApp] Connecting to: tcp://127.0.0.1:50421
[NotebookApp] Connecting to: tcp://127.0.0.1:50423
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-cd9c31c0-2fbb-41cf-9610-cb6cf27cc148.json

ぞろぞろとメッセージが出力されるとともに、自動的にChromeが新しいウィンドウで立ち上がりました。やったー、動いたよー!

f:id:inoshirou:20111220015117p:image:w600

こんな感じ。tab補完もきいてます。
動かしてみたけど、これってどう活用すればいいんでしょ?だれか知ってたら教えてください。

おしまい。

最近覚えたコマンドライン処理の小ネタ

スクリプト書かないでコマンドだけでテキストファイルの処理ができるといろいろ楽。
最近覚えた使い方をメモメモ。

tsvファイルを特定のフィールドの値で分割する
1 hoge 123
2 fuga 456
3 hoge 111
4 fuga 333

こんなファイルがあったとする。ファイル名はdata.txt

awk '{file=$2 ".txt"; print > $file; close($file)}' data.txt

フィールドの2番目の値に拡張子を付けてファイル名として、そのファイルにprintの出力をリダイレクトする。上のデータの場合はhoge.txtとfuga.txtができる。
close()しているのは、開くファイルが多くなり過ぎるとエラーになるため。

行数が多いファイルの特定範囲を抜き出す

数百万行とかあるログファイルをエディタで開くのはつらいので、特定範囲を切り出してから開くようにしてる。

sed -ne '1000,1100p' hoge.txt > fuga.txt

大抵の場合は

grep -n -B 100 -A 100 keyword hoge.txt

こんな感じで探したいキーワードの前後の行をチェックして、行数を確認してから切り出す。

エキスパートPythonプログラミング読書会 第二期 02に参加した

エキスパートPythonプログラミング読書会 第二期 02

第一回目に引き続き、無駄に会場一番乗りでした。
今回はしみずかわ先生による説明が始まる前に、アイスブレイクとして同じテーブル内での自己紹介がありました。こういうのがあると後で話しやすくなるし良さそうですね。次回は知らない人の多い席に潜り込んでみようかな。

第二回の内容をマインドマップで書いてみたので晒してみる。
f:id:inoshirou:20111216010407j:image:w640
字が下手でサーセン。あとスペースが無くて細かいところまで書き切れてないけど、その辺は他の人のブログを見ればいいと思います。
個人的にはコルーチンの使い方が興味深かったです。コルーチンで実現できるような、プログラム側で制御を行ったり来たりというのを書けるマルチタスクの事を協調的マルチタスク(またはノンプリエンティブ マルチタスク)というらしい。これに対してネイティブスレッドのようなOS(カーネル?)側で処理の切り替えを行うのがプリエンティブ マルチタスクというのだそう。

他の参加ブログだったりツイッターでも話題になっていたけど、LT始まるとなかなか会話がしづらいので、もう少しLT少なめでもいいかなと思った。

次回は2012/01/17(火)です。

エキスパートPythonプログラミング読書会 第二期 03