ブログトップ 記事一覧 ログイン 無料ブログ開設

あと味 このページをアンテナに追加 RSSフィード Twitter

2012-05-17 Clojureで文字列を整数にする

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は本当に素晴らしいですね。

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

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

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

2012-05-13 よりSchemerフレンドリなJavaScriptへ in kyoto.lisp

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

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

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

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

よりSchemerフレンドリなJavaScriptへ

感想

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

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

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

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

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

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

2012-05-09 4Clojureが楽しい

4Clojureが楽しい

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

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

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

4Clojureの学習の流れ

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

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

ということで、今週末のKyoto.lispスライドをそろそろ準備します...

2012-04-14 流行りっぽいツールを組み合わせたミニマルpjaxサンプル書いた

流行りっぽいツールを組み合わせたミニマルpjaxサンプル書いた

先日、Meteorっていうツールが話題になっていて、いろいろ見てみたんですけど、pjaxいいなぁと思って、今まで実装したことなかったので、Mojolicious::Liteで実装してみました。

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

利用したツール

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

サンプル

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ディレクトリに入れておくべきだと思います。

以上、まじめなまとめでした。

2012-04-06 Perlの環境構築

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
perlbrewperlインストールする

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でモジュールインストールされている。

まとめ

一昔前は、自分にとっては環境構築が本当に難しかったんだけど、今はツールも揃っていて、導入も簡単だし、Perl楽しい