次の13日の金曜日というサービスをリリースしました
最近、なかなかプログラミングする機会がないので*1、作って放置していたプログラムを編集して、Webサービスにしてみました。
サイト
作ってみて
ClojureでWebサービス作りたいなーとは思ってはいたものの、なかなかそんな時間もモチベーションもなく、今に至ります。
作った背景とかサイトの使い方は、リポジトリのREADME.mdに書いてあります。
Clojureの基本は、4Clojureで概ね学んだので、新たに学んだのは、noirの使い方です。
noirのテンプレートは標準だとviewが別ファイルになっていますが、これくらい小規模であれば1ファイルで書く方が楽でした。
noirは、シンプルで、Mojolicious::Liteみたいに気軽に使えて良いのと、標準のテンプレートエンジンのhiccupがかなり良いです。zen-codingのような感覚で記述できます。zen-codingみたいに、手動でHTMLに展開する手間ないし、プログラムも埋め込めるし、勝手にminifyするし。
noirを使ってて困ったのは、JSONに出力する時に、charsetがISO-8859-1になってしまう点です。ただ、バージョンアップで改善されるっぽいので安心しました。(Google Groups)
Clojureらしく、無限シーケンスで処理したり、小さな関数を組み合わせて処理を組み立てるってところは意識しながら作りましたが、そもそも関数脳になりかかってるので、他の言語使うより、Lisp系統である、Clojure使った方がストレスなく記述できるようになってきました。ただ、Javaの主要のクラスとメソッドはなんとなくでも覚えておいた方がいいなぁとは思います。副作用はdotoの中に押し込んでしまえば、そんなに抵抗なく使えます。
なんというか、関数型言語は、小さな関数作って、拡張してみて、挙動変えてみて、入れ替えてみて、最後に欲しいのはこれ、って感じでルーズにプログラミングできる感じがして、自分の性格的に合ってるような気がするんですよね。
Clojure + noirでモノ作って、herokuに上げる流れは、ひと通り把握したので、また機会を見つけて、Clojureで何か作りたいですね。
たらい回しの塔
たらい回し関数(竹内関数)とProcessing.jsを使って塔を建てる。
たらい回しの塔 - jsdo.it - share JavaScript, HTML5 and CSS
えげつなさが可視化される。
はじめてのはてなブログ
はてなダイアリーからはてなブログへのインポート機能を追加しました - はてなブログ開発ブログという記事が出たので、とうとう重い腰を上げて、はてなブログに移行することにしました。
人柱になっているかもしれませんが、とりあえずはうまく移行できたように見えます。
今後、あと味の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のスライドをそろそろ準備します...