2012-05-17 Clojureで文字列を整数にする
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は本当に素晴らしいですね。
文字列を整数に変換する関数
ということで、上記のテクニックを使って、文字列を整数に変換する関数を実装してみました。
こんな感じになりました。
2012-05-13 よりSchemerフレンドリなJavaScriptへ in kyoto.lisp
よりSchemerフレンドリなJavaScriptへ in kyoto.lisp
土曜日にKyoto.lispに行ってきました。
無謀にもスピーカー枠で参加したので、ちょっとドキドキでしたが、話したいことは話せたので良かったです。
スライドは以下に置いておきました。
感想
Lispの勉強会というのは、東京でSICPの読書会みたいなものに参加したことがあるだけで、ほとんど初めてのような感じでした。
なかなか敷居の高い勉強会で話すことにはなったものの、JavaScriptからSchemeに興味を持った者として、こういったテーマで話ができたのは嬉しかったなと思います。
TL見る限り、JavaScriptに多少、興味を持ってくれた人も見受けられたのでよかったです。逆にJavaScriptが好きな人はSchemeにもハマると思います。
割とマジに将来的にはSchemerになりたいと思っているので、もっとSchemeに没頭していきたいですね。(その前にClojurianになることを目標にしますが)
参加者の多くは、懇親会の話など聞いていても、計算機科学勉強してる人がほとんどだったので、逃げちゃダメですね。
参加者、スピーカー、主催者のみなさん、ありがとうございました。
2012-05-09 4Clojureが楽しい
4Clojureが楽しい
プログラミング学習サイトには、プログラムの実行環境が必要だと思っていて、ドットインストールのアプローチよりも、Codecademyのアプローチが正解だと思っています。
4ClojureはREPLこそ、別のサイトですが、プログラムの実行環境があるのでとても良いです。
4Clojureの学習の流れ
4Clojureは以下のような流れで学習します。
- 難易度とカテゴリが設定された問題から取り組む問題を選ぶ
- 実装する機能のテストが提示される
- 機能を実装し、入力画面にコードを打ち込んで、打ち込んだ内容を評価する
- テストに通れば、クリア、通らなければ、リトライ
- Golfコンテストに参加していれば、Golf Scoreとともに、コンテスト参加者のScoreのグラフが表示され、評価したコードがどの位置にいるかわかる
ゲーム性があり、リズム良く、効果的な学習ができると思います。
難易度はElementalyからHardまで用意されていて、自分は#1から順番に解いていったのですが、Hardも出てくるし、難易度順でやり直しました。
4Clojureで遊んでみて良かった点
など、いろいろあります。
アルゴリズムをまともに勉強したことはないので、Easyでも結構苦戦することもあります。ただ、普段であれば、ライブラリに頼って自分で書かないアルゴリズムを、敢えて自分で書かなければいけないというのはとても頭の刺激になります。
特に最初の方は、Clojureの語彙が自分の中でほとんどないため、ドキュメントを読む機会が増えます。いろいろ解いていく中で、だんだんメソッドに慣れていって、解くまでの時間が短くなっていく実感が湧きます。
また、コアメソッドを自分で実装する問題もあるので、より理解が深まる感じがしました。
パスカルの無限三角形
1例ですが、パスカルの三角形の段を数値で指定すると、その段のシーケンスが返る関数を実装しろという問題がありました。
パスカルの三角形をそもそも知らなかったので、パスカルの三角形とはどういうものかググって、書いてみて、再帰じゃなくて無限シーケンスにしよう、もっと短く書こう、もっとClojureらしく書こう、というようにひとつの問題を取り組むだけでもかなり楽しめます。
上の例は、Clojureらしく書けたけど、Golfスコアはそんなに高くないし、もっと改善したいと思います。もしかしたら、java.lang.Long/MAX_VALUEを超える場合、bigintで出力するといった分岐を書いても、今以上に短く書けるのかもしれませんし。ひとつの関数でここまで考えようと思うのは、やはり4Clojureのゲーム性がなせる技でしょう。
まとめ
プログラミング学習サイトにおけるゲーム性(ゲーミフィケーション)は、学習者にとって、かなり有効に働くものだと思います。
4Clojure楽しいので、1日1問でも進めて、全クリしたいですね!
2012-04-14 流行りっぽいツールを組み合わせたミニマルpjaxサンプル書いた
流行りっぽいツールを組み合わせたミニマルpjaxサンプル書いた
先日、Meteorっていうツールが話題になっていて、いろいろ見てみたんですけど、pjaxいいなぁと思って、今まで実装したことなかったので、Mojolicious::Liteで実装してみました。
ついでに流行りっぽいツールを組み合わせてみました。
利用したツール
- Mojolicious::Lite
- Backbone.js
- jQuery
- CoffeeScript
- LESS
実装するにあたり、以下の記事を参考にしました。
サンプル
1ファイルなので、ミニマルですってことです。コードもなるべく短くなるようにしました。
ここで使ってるツールは流行ってるし、オシャレですね。
どうもMojolicious::Liteが一番流行ってなさそうですね。流行らせたいですね。
実行した時の画面
ナビをクリックすると、fadeInとともにオシャレにあいさつ文が変わるだけのサンプルです。
試す方法
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ディレクトリに入れておくべきだと思います。
以上、まじめなまとめでした。
2012-04-06 Perlの環境構築
Perlの環境構築
こなれてきたので、Perlの環境構築についてまとめる。出尽くされてる感は半端ないけど。
導入するツール
- perlbrew
- cpanm(App::cpanminus)
- Carton
perlbrew
perlbrewはユーザー領域に複数のPerlのバージョンをインストールして使えるツール。Rubyのrvm相当。
インストール
公式ドキュメントに書いてある手順で簡単に導入できる。
$ curl -kL http://install.perlbrew.pl | bash
これでインストール終わり。
設定
$ 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
これでインストール終わり。
使い方
$ 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でモジュールがインストールされている。



