あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

はじめてのはてなブログ

はてなダイアリーからはてなブログへのインポート機能を追加しました - はてなブログ開発ブログという記事が出たので、とうとう重い腰を上げて、はてなブログに移行することにしました。

人柱になっているかもしれませんが、とりあえずはうまく移行できたように見えます。

今後、あと味の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みたいに実行可能な擬似コードして使用できる側面を感じます。

とりあえず、ラムダ計算の勉強には使えそうだなと思いました。

簡潔さは力なり。

*1:Haskellもラムダ式をほとんどそのまま書くっぽい

Clojureで文字列を整数にする

4Clojureで数値の各桁をゴニョゴニョするという問題に何度か遭遇しました。

各桁に対して何か処理をしようとする時は、文字列が文字のシーケンスで、シーケンス系の関数を適用できるシーケンシャルな型であることを知っていれば、一旦、数値を文字列にしてからシーケンス処理して、数値に戻すという発想が思いつきます。

数値を文字列に変換するのは、str関数を適用すれば良いだけなので簡単です。

その後、mapなりで処理して、数値に戻す時が問題です。数値を文字列にする関数は、先ほど書いたように、str関数が用意されているのですが、数値を文字列にする関数は、ClojureDocsを見る限り見当たりません。

ググってみると、JavaInteger/parseIntで変換すると書いてあるものがほとんどで、何か負けた気がしました。高階関数にそのまま渡すこともできませんし。

4Clojureの回答で見つけた例

数値の各桁に対してゴニョゴニョする問題の回答例を見てみると、str関数を使う例が案の定ほとんどだったのですが、文字列を数値のシーケンスする処理で不思議なコードを見かけました。

#(- (int %) (int \0))

何やってんだろ?ということで実際実行してみると、(int \0)は48という数値を返しました。

実際の数値を当てはめてみて

(- (int \9) (int \0))

と実行してみたら、9を返しました。これでなんとなくやってることの意味がわかったんですが、charintで変換すると、文字コード番号を返すようです。

それを利用して、数値の文字の文字コード番号から、0の文字コード番号を引いて、数値の文字を数値そのものに変換しているということなんですね。

0の文字コード番号が48で、9の文字コード番号が57なので、その差を取れば、9になります。

目からうろこでした。

そもそも

そもそも、自分が知らなかっただけで、文字(数値)を数値に変換する時に、よく使われるテクニックのようです。知らないテクニックを遊びながら学べる4Clojureは本当に素晴らしいですね。

文字列を整数に変換する関数

ということで、上記のテクニックを使って、文字列を整数に変換する関数を実装してみました。

こんな感じになりました。

よりSchemerフレンドリなJavaScriptへ in kyoto.lisp

土曜日にKyoto.lispに行ってきました。

無謀にもスピーカー枠で参加したので、ちょっとドキドキでしたが、話したいことは話せたので良かったです。

スライドは以下に置いておきました。

よりSchemerフレンドリなJavaScriptへ

感想

Lispの勉強会というのは、東京でSICPの読書会みたいなものに参加したことがあるだけで、ほとんど初めてのような感じでした。

なかなか敷居の高い勉強会で話すことにはなったものの、JavaScriptからSchemeに興味を持った者として、こういったテーマで話ができたのは嬉しかったなと思います。

TL見る限り、JavaScriptに多少、興味を持ってくれた人も見受けられたのでよかったです。逆にJavaScriptが好きな人はSchemeにもハマると思います。

割とマジに将来的にはSchemerになりたいと思っているので、もっとSchemeに没頭していきたいですね。(その前にClojurianになることを目標にしますが)

参加者の多くは、懇親会の話など聞いていても、計算機科学勉強してる人がほとんどだったので、逃げちゃダメですね。

参加者、スピーカー、主催者のみなさん、ありがとうございました。

4Clojureが楽しい

最近、4Clojureにハマっています。

プログラミング学習サイトには、プログラムの実行環境が必要だと思っていて、ドットインストールのアプローチよりも、Codecademyのアプローチが正解だと思っています。

4ClojureはREPLこそ、別のサイトですが、プログラムの実行環境があるのでとても良いです。

4Clojureの学習の流れ

4Clojureは以下のような流れで学習します。

  1. 難易度とカテゴリが設定された問題から取り組む問題を選ぶ
  2. 実装する機能のテストが提示される
  3. 機能を実装し、入力画面にコードを打ち込んで、打ち込んだ内容を評価する
  4. テストに通れば、クリア、通らなければ、リトライ
  5. 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で実装してみました。

ついでに流行りっぽいツールを組み合わせてみました。

利用したツール

  • Mojolicious::Lite
  • Backbone.js
  • jQuery
  • CoffeeScript
  • LESS

実装するにあたり、以下の記事を参考にしました。

サンプル

1ファイルなので、ミニマルですってことです。コードもなるべく短くなるようにしました。

ここで使ってるツールは流行ってるし、オシャレですね。

どうもMojolicious::Liteが一番流行ってなさそうですね。流行らせたいですね。

公式サイトのオシャレさはピカイチなんですけどね。

もとい、自分の周りからでもPerl流行らせたいですね。

実行した時の画面

f:id:jdg:20120414164302p:image

ナビをクリックすると、fadeInとともにオシャレにあいさつ文が変わるだけのサンプルです。

試す方法

Perl5.10.1以上が入ってる環境で、以下の手順でミニマルpjaxサンプルを試せます。

  1. http://mojolicio.us/のトップページからtar.gzで圧縮されたMojoliciousをダウンロード(インストールしてもよいです)
  2. ダウンロードしたMojoliciousの最終バージョンを解凍し、mojoとでも付けておく
  3. 上記のgistのファイルをmojoディレクトリに設置する
  4. 設置したapp.plの2行目に、use lib "lib";を追加する
  5. ターミナルでmojoディレクトリに移動する
  6. そのディレクトリ内で以下のコマンドを叩く
$ ./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)」という項を参考にしてください。

App::cpanminus - search.cpan.org

使い方
$ 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楽しい。