はじめてのはてなブログ
はてなダイアリーからはてなブログへのインポート機能を追加しました - はてなブログ開発ブログという記事が出たので、とうとう重い腰を上げて、はてなブログに移行することにしました。
人柱になっているかもしれませんが、とりあえずはうまく移行できたように見えます。
今後、あと味のURLは、http://taiju.hatenablog.comに変わります。
スタイル(見た目)について
ほとんどテーマのデフォルトそのままですが、コードを貼る機会が増えてきたので、ワンカラムのスタイルにしました。個人的にワンカラムがシンプルで好きってのもあります。
コードの1行も長めになる傾向があるので、広々使えた方がいいですね。
後は、ど近眼にやさしく、文字を大きめにしました。これも自分の好みです。
他は特に弄ることないかなという気がします。
まとめ
今後とも、あと味をよろしくお願いいたします。
CoffeeScriptでチャーチ数(CoffeeScriptとラムダ式)
ラムダ計算では、数値すら関数で表現できるらしいです。
数値を関数で表現する方法のひとつにチャーチ数というものがあるとのこと。
何で書いてみようかなと迷ったのですが、この手の処理をシンプルに書けそうだと思ったので、CoffeeScriptで書いてみることにしました。多分、正解だったと思います。
サンプルコード
church.coffee
church.js
関数適用の数で自然数を表現するってのが面白いし、まず発想できないですね。
ややこしかったので間違ってるかもしれませんが、簡約していくと、こんな感じになるのでしょうか。
最初は関数がメタな表現過ぎて、何をしたいのか頭で整理しきれませんでしたが、参考サイトを見ながら、書いてみて、実行して、理解できました。生JavaScriptで書こうとしていたら、もっと理解に苦しんだでしょう。
なんでも関数で表現できるラムダ計算ってすごいですね。データ構造や条件分岐も関数で表現できるそうです。
まとめ
CoffeeScriptは、以前の記事で、OCamlっぽいっとか言ったことがありましたが、確かにOCaml並にラムダ式が簡潔に書けます。
今回のように、ラムダ式の表現をその言語での書き方に置き換える時、JavaScriptだと苦行で、Schemeでもちょっと面倒です。
生まれた背景からして当然なのですが、OCamlだとラムダ式をほとんどそのままでOCamlのコードとして書けるので、CofeeScriptよりも簡潔です。*1
OCamlの話は置いといて、上杉周平さんの作ったプログラミング学習サイトのchibicodeでも、CoffeeScriptを採用されたそうですが、CoffeeScriptは教育用言語としては、アリだと思います。Rubyみたいに実行可能な擬似コードして使用できる側面を感じます。
とりあえず、ラムダ計算の勉強には使えそうだなと思いました。
参考記事等
Clojureで文字列を整数にする
4Clojureで数値の各桁をゴニョゴニョするという問題に何度か遭遇しました。
各桁に対して何か処理をしようとする時は、文字列が文字のシーケンスで、シーケンス系の関数を適用できるシーケンシャルな型であることを知っていれば、一旦、数値を文字列にしてからシーケンス処理して、数値に戻すという発想が思いつきます。
数値を文字列に変換するのは、str
関数を適用すれば良いだけなので簡単です。
その後、mapなりで処理して、数値に戻す時が問題です。数値を文字列にする関数は、先ほど書いたように、str
関数が用意されているのですが、数値を文字列にする関数は、ClojureDocsを見る限り見当たりません。
ググってみると、JavaのInteger/parseInt
で変換すると書いてあるものがほとんどで、何か負けた気がしました。高階関数にそのまま渡すこともできませんし。
4Clojureの回答で見つけた例
数値の各桁に対してゴニョゴニョする問題の回答例を見てみると、str
関数を使う例が案の定ほとんどだったのですが、文字列を数値のシーケンスする処理で不思議なコードを見かけました。
#(- (int %) (int \0))
何やってんだろ?ということで実際実行してみると、(int \0)
は48という数値を返しました。
実際の数値を当てはめてみて
(- (int \9) (int \0))
と実行してみたら、9を返しました。これでなんとなくやってることの意味がわかったんですが、char
をint
で変換すると、文字コード番号を返すようです。
それを利用して、数値の文字の文字コード番号から、0の文字コード番号を引いて、数値の文字を数値そのものに変換しているということなんですね。
0の文字コード番号が48で、9の文字コード番号が57なので、その差を取れば、9になります。
目からうろこでした。
そもそも
そもそも、自分が知らなかっただけで、文字(数値)を数値に変換する時に、よく使われるテクニックのようです。知らないテクニックを遊びながら学べる4Clojureは本当に素晴らしいですね。
文字列を整数に変換する関数
ということで、上記のテクニックを使って、文字列を整数に変換する関数を実装してみました。
こんな感じになりました。
よりSchemerフレンドリなJavaScriptへ in kyoto.lisp
土曜日にKyoto.lispに行ってきました。
無謀にもスピーカー枠で参加したので、ちょっとドキドキでしたが、話したいことは話せたので良かったです。
スライドは以下に置いておきました。
感想
Lispの勉強会というのは、東京でSICPの読書会みたいなものに参加したことがあるだけで、ほとんど初めてのような感じでした。
なかなか敷居の高い勉強会で話すことにはなったものの、JavaScriptからSchemeに興味を持った者として、こういったテーマで話ができたのは嬉しかったなと思います。
TL見る限り、JavaScriptに多少、興味を持ってくれた人も見受けられたのでよかったです。逆にJavaScriptが好きな人はSchemeにもハマると思います。
割とマジに将来的にはSchemerになりたいと思っているので、もっとSchemeに没頭していきたいですね。(その前にClojurianになることを目標にしますが)
参加者の多くは、懇親会の話など聞いていても、計算機科学勉強してる人がほとんどだったので、逃げちゃダメですね。
参加者、スピーカー、主催者のみなさん、ありがとうございました。
4Clojureが楽しい
最近、4Clojureにハマっています。
プログラミング学習サイトには、プログラムの実行環境が必要だと思っていて、ドットインストールのアプローチよりも、Codecademyのアプローチが正解だと思っています。
4ClojureはREPLこそ、別のサイトですが、プログラムの実行環境があるのでとても良いです。
4Clojureの学習の流れ
4Clojureは以下のような流れで学習します。
- 難易度とカテゴリが設定された問題から取り組む問題を選ぶ
- 実装する機能のテストが提示される
- 機能を実装し、入力画面にコードを打ち込んで、打ち込んだ内容を評価する
- テストに通れば、クリア、通らなければ、リトライ
- Golfコンテストに参加していれば、Golf Scoreとともに、コンテスト参加者のScoreのグラフが表示され、評価したコードがどの位置にいるかわかる
ゲーム性があり、リズム良く、効果的な学習ができると思います。
難易度はElementalyからHardまで用意されていて、自分は#1から順番に解いていったのですが、Hardも出てくるし、難易度順でやり直しました。
4Clojureで遊んでみて良かった点
- アルゴリズムを自分で書く経験ができる
- Clojure Docsを隅々まで読むことになる
- コアメソッドを自分で実装することで理解が深まる
など、いろいろあります。
アルゴリズムをまともに勉強したことはないので、Easyでも結構苦戦することもあります。ただ、普段であれば、ライブラリに頼って自分で書かないアルゴリズムを、敢えて自分で書かなければいけないというのはとても頭の刺激になります。
特に最初の方は、Clojureの語彙が自分の中でほとんどないため、ドキュメントを読む機会が増えます。いろいろ解いていく中で、だんだんメソッドに慣れていって、解くまでの時間が短くなっていく実感が湧きます。
また、コアメソッドを自分で実装する問題もあるので、より理解が深まる感じがしました。
パスカルの無限三角形
1例ですが、パスカルの三角形の段を数値で指定すると、その段のシーケンスが返る関数を実装しろという問題がありました。
パスカルの三角形をそもそも知らなかったので、パスカルの三角形とはどういうものかググって、書いてみて、再帰じゃなくて無限シーケンスにしよう、もっと短く書こう、もっとClojureらしく書こう、というようにひとつの問題を取り組むだけでもかなり楽しめます。
上の例は、Clojureらしく書けたけど、Golfスコアはそんなに高くないし、もっと改善したいと思います。もしかしたら、java.lang.Long/MAX_VALUE
を超える場合、bigintで出力するといった分岐を書いても、今以上に短く書けるのかもしれませんし。ひとつの関数でここまで考えようと思うのは、やはり4Clojureのゲーム性がなせる技でしょう。
まとめ
プログラミング学習サイトにおけるゲーム性(ゲーミフィケーション)は、学習者にとって、かなり有効に働くものだと思います。
4Clojure楽しいので、1日1問でも進めて、全クリしたいですね!
ということで、今週末のKyoto.lispのスライドをそろそろ準備します...
流行りっぽいツールを組み合わせたミニマルpjaxサンプル書いた
先日、Meteorっていうツールが話題になっていて、いろいろ見てみたんですけど、pjaxいいなぁと思って、今まで実装したことなかったので、Mojolicious::Liteで実装してみました。
ついでに流行りっぽいツールを組み合わせてみました。
サンプル
1ファイルなので、ミニマルですってことです。コードもなるべく短くなるようにしました。
ここで使ってるツールは流行ってるし、オシャレですね。
どうもMojolicious::Liteが一番流行ってなさそうですね。流行らせたいですね。
公式サイトのオシャレさはピカイチなんですけどね。
もとい、自分の周りからでもPerl流行らせたいですね。
試す方法
Perl5.10.1以上が入ってる環境で、以下の手順でミニマルpjaxサンプルを試せます。
- http://mojolicio.us/のトップページからtar.gzで圧縮されたMojoliciousをダウンロード(インストールしてもよいです)
- ダウンロードしたMojoliciousの最終バージョンを解凍し、mojoとでも付けておく
- 上記のgistのファイルをmojoディレクトリに設置する
- 設置したapp.plの2行目に、
use lib "lib";
を追加する - ターミナルでmojoディレクトリに移動する
- そのディレクトリ内で以下のコマンドを叩く
$ ./script/morbo app.pl
最後にlocalhost:3000にアクセスすれば試せます。
まとめ
流行ってる感じでオシャレ。
まじめなまとめ
pjax、初めて試しましたが、とても良いですね。特にユーザー側に不便をかけるわけでもなく、反応速度が上がるってのが良い。
しかも、後からpjaxに対応しても、そんなに手間じゃないのがいいですね。
ただ、pushStateに対応していないブラウザは、Backbone.jsのRouterがハッシュのついたURLに変更してしまうので、その辺りが採用できるかできないかの基準になるかなと思います。
Mojoliciousのせいなのかわかりませんが、IEでどうしても$c->req->headers->is_xhr
が取れなかったので、jquery-pjaxと同じように、リクエスト時のパラメータに_pjax=true
を付けるという対応にしました。
LESSとCoffeeScriptのファイルを読み込む時は、これらのリクエストがis_xhrではないので、レイアウトを読み込んでしまうのを避けるために、_pjaxを指定しています。
今回のサンプルはCoffeeScriptとかLESSを直接パースするようにしていますし、CDNからファイルを持ってきているので、実運用では、コンパイルするものはコンパイルして、サーバーに置くものはダウンロードして、publicディレクトリに入れておくべきだと思います。
以上、まじめなまとめでした。
Perlの環境構築
こなれてきたので、Perlの環境構築についてまとめる。出尽くされてる感は半端ないけど。
導入するツール
- perlbrew
- cpanm(App::cpanminus)
- Carton
perlbrew
perlbrewはユーザー領域に複数のPerlのバージョンをインストールして使えるツール。Rubyのrvm相当。
インストール
公式ドキュメントに書いてある手順で簡単に導入できる。
$ curl -kL http://install.perlbrew.pl | bash
これでインストール終わり。
設定
次はperlbrewの設定。でも最初から付いてくる。
$ echo source ~/perl5/perlbrew/etc/bashrc >> ~/.bash_profile
インストールした際のログに書いてあるが、perlbrew用のbashrcが添付されてるので、それを読み込む設定を.bash_profile
などに追記するようにするだけ。
$ which perlbrew /home/taiju/perl5/perlbrew/bin/perlbrew
which
コマンドで、ちゃんとパスなど通してくれてることが確認できる。
(ターミナルを一度も閉じていないと、.bash_profile
の設定が反映されていないので、source ~/.bash_profile
をあらかじめ実行しておくこと)
使い方
perldoc形式でヘルプが用意されている。
$ perlbrew -h
perlbrewでperlをインストールする
perlbrewでユーザー領域にperlをインストールする。
$ perlbrew install perl-5.14.2
しばらくすると、インストールが完了する。
perlbrewでインストールしたperlを利用するようにする
perlbrewでインストールしたperlを、そのユーザーで利用するようにする。
$ perlbrew switch perl-5.14.2
また、perlbrewでインストールしたperlはlistコマンドで確認できる。
$ perlbrew list
いつでも好きなタイミングで、好きなバージョンに切り替えできる。
cpanm(App::cpanminus)
より良いCPANシェル。CPANシェルはこれで完全に置き換えが可能。
インストール
次は、cpanmを導入する。perlbrewにインストールコマンドがある。
$ perlbrew install-cpanm
これでインストール終わり。
追記(2012/08/29)
Cartonとcpanmを組み合わせる際、この方法でcpanmをインストールするとあんまりよろしくないようです。
carton と古い cpanm をくみあわせたら悲しい話 - tokuhirom's blog.
cpanmはperlbrewに同梱されたインストーラを使うのではなく、通常通りインストールした方が良さそうです。以下のリンク先の「Installing to local perl (perlbrew)」という項を参考にしてください。
使い方
$ cpanm -h
Carton
CPANモジュールの依存関係管理ツール。RubyのBundler相当。今後もよく使いそうなコマンドがインストールされるCPANモジュールなどはcpanmを利用して、インストールして、それ以外は、プロジェクトごとにCartonでインストールするのが良さそう。
インストール
cpanmでインストールする。
$ cpanm Carton
これでインストール終わり。
cartonの使い方
プロジェクトのディレクトリを作ったら、まず、Makefile.PLにプロジェクトに必要なCPANモジュールを列挙する。cartonのhelpはModule::Installで書かれているし、最近はExtUtils::MakeMakerより採用例をよく見かけるので、Module::Installも導入しておいた方が良さそう。
$ cpanm Module::Install
では、本題に戻って、Makefile.PL。cartonのドキュメントの例を掲載する。
use inc::Module::Install; name 'MyAwesomeApp'; requires 'Plack', 0.9980; requires 'Starman', 0.2000; WriteAll;
そのプロジェクトのMakefile.PLを書いたら、依存モジュールをプロジェクトで使えるようにcartonでモジュールをインストールする。
$ carton install
プロジェクト内のフォルダに、localというディレクトリが作られ、cpanmでモジュールがインストールされている。
まとめ
一昔前は、自分にとっては環境構築が本当に難しかったんだけど、今はツールも揃っていて、導入も簡単だし、Perl楽しい。