電子書籍がデバイスに縛られないのはいいですね。Java)を使うためのライブラリ群と、それを使ったサンプルclj-gae-blank(名前に反して簡易ゲストブック)を公開しているので、中身を調べつついじってみる。「clj-gae-blank」と「clj_gae_blank」を「gb」に。src/gb.cljの中身と編集メイン処理のソース。guestbook]))ちなみに、こんな感じ(↓)でCompojureでURLルーティングしている。app)Compojureのこのへんの仕様は変更が激しそう。hiccupを使ってHTMLを生成している。投稿のアクションと、データストアまわり。[gb.guestbook]ちなみに、同じmakingさんのclj-gae-dsを使ってデータストアに投稿内容を格納し、"/"にリダイレクトしている。あと、表示のときは、clj-gae-dsでデータストアから取り出している。warブラウザでhttp://localhost:8080/にアクセス。データストアがwar/WEB-INF/appengine-generatedの下に作られる。created.Googleアカウント認証Googleアカウント認証を試すため、投稿するのにGoogleアカウントでの認証を求めるようにしてみる。src/gb/hello.cljnsの:useに追加。clj-gae-usersライブラリは最初からproject.cljで指定されている。[am.ik.clj-gae-users.core]ユーザー名はGoogleアカウント入力から取るので、入力フォームのHTMLを生成するgreet-form関数のうち、名前の入力フォームを削る。greet-form関数をラップして、認証しているかどうかで分ける関数を追加。user-logged-in?やcreate-login-url、create-logout-urlはclj-gae-usersのもの。(login-or-form)src/gb/guestbook.clj同じくnsの:useに追加。[am.ik.clj-gae-users.core]投稿アクションのgreet。let中、名前をHTTPリクエストからではなく、get-current-user-map(clj-gae-usersのもの)を使ってGoogleアカウント情報から。letとその中のds-putをuser-logged-in?が真のときのみ評価するようにして、redirectはそこから出す。「Login」をクリックするとログイン画面に。SDKのローカルサーバーだと、パスワードなしで認証が通ったことになる。ログインすると入力フォームが表示される。ユーザー別の表示データストアとCompjureを試すため、特定ユーザーの発言だけをフィルタリング表示できるようにしてみる。src/gb.cljURLルーティングに1つ追加。"id")))src/gb/hello.cljデータストアから、ユーザー名に合致したものだけをシーケンスとして取ってくる関数を作る。SQLのWHERE節っぽい。)これを使ってuser-greetingsを実装。])]))hを使えるようにnsの:useを変更。h]]で、ビルドして実行して、「http://localhost:8080/u/ユーザー名」にアクセスすると、そのユーザーの発言だけ表示する。"@"とかが入ったユーザー名は扱えないので、"@"とかが入ってない名前でログインして投稿する必要がある。1.2でProtocolという仕組みが追加されたと聞いた。解説ビデオによると、マルチメソッドと似たようなことを、オーバーヘッド少なく実行するものらしい。1.2は、masa_edwさんの解説の方法で使う。defprotocolでProtocolを定義。SujiMojiというProtocolの中で、2引数を取る関数tasuと、1引数を取る関数nibaiを定義してみる。Javaのinterfaceと同じで、実装を含まない。)でProtocolに対する実装。いくつかの方法があるようだけど、extend-protocolを使って、第1引数の型で処理を分けてみる。)ビルドしたあと、実行。sujimoji-standalone.jar12345168123123246とりあえず、それらしい結果になった。#1からClojureさわってなかったので、いちから復習しているところ。