2011年12月18日日曜日

あなたが参加したイベントの出席者はあなたが知らないこんなイベントにすでに参加しようとしている。

(この記事は、Clojure Advent Calendar 2011 21日目の記事です。)

前々からATNDでAPIが利用できることを知ってましたので、週末起業的な意味で、以下のサービスをHeroku上で作って見ました。当然Clojureです。
サービスの内容はブログのタイトル通りです。

http://find-event.herokuapp.com/users/tnoborio

作ったときに残したメモを頼りに、Herokuでどんな感じで作っていったかをさくさくっと書いていきたいと思います。

まずはLeinigenを作ってディレクトリを作成しますがそこらへんは割愛。

Herokuにアプリケーションを作るときに、--stack cedraを忘れずに作ります。アプリの名前を付けないと、flower-company-hogehoge-xみたいな名前がつくので最初から決めといたほうがいいです。

$ heroku apps:create --stack cedar find-event

それ以外にHeroku出動かすからという理由で必要だった作業はしProcfileを作る位でした。
こんな感じです。

web: lein run -m find-event.web

あとはgitを使ってガンガンプッシュしていきます。

$ git push heroku master

といっても、開発時はEmacs上でslimeつないで検証していく方が早くておすすめです。
プロジェクトを起ち上げた当初はproject.cljに必要なライブラリを追加して行く作業になりますが、clojarsからライブラリの最新バージョンを確認したり、どんなものがあるかというのを調べるのに最近では以下の直接のリポジトリから探すことが多いです。

http://clojars.org/repo/

その結果、project.cljはこんな感じになりました。


(defproject find-event "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [compojure "1.0.0-RC1"]
                 [ring/ring-jetty-adapter "1.0.0"]
                 [fleet "0.9.5"]
                 [clj-json "0.4.3"]]
  :dev-dependencies [[swank-clojure "1.3.4-SNAPSHOT"]])

Clojure 1.3はHerokuですんなり使えました。流石です。

以降コードの話になりますが、ATND APIを使いたいのでこんなコードを書きました。(一部抜粋です。)

(ns find-event.api
  (use [clojure.walk :only [keywordize-keys]]
       [clojure.string :only [join]]
       [clj-json [core :as json]]))

(def events-url "http://api.atnd.org/events/")
(def users-url "http://api.atnd.org/users/")

(defn- fetch [url]
  (-> (slurp (str url "&format=json"))
      json/parse-string
      keywordize-keys))

;; (fetch "http://api.atnd.org/events/?twitter-id=tnoborio")

イベントの検索、特定のイベントのユーザの取得、Twitter IDでの検索など、必要だと思った機能がそろってました。

例えば特定のイベントからユーザを取得するのはこんな感じです。

(defn- users-by-event-id [event-id]
  (let [url (str "http://api.atnd.org/events/users/?event_id=" event-id)
        users (-> (fetch url)
                  :events
                  first
                  :users)]
    (map :user_id users)))

で、どうやってイベントをレコメンドするかというと、
  1. Twitter IDからそのユーザの参加イベント取得
  2. 取得したイベントに参加しているユーザ取得
  3. そのユーザたちが来月開催されるイベントで参加するものを取得
という流れです。Clojure的に->>を使ってそれを表したのが以下のコードです。

(defn suggest-events [twitter-id]
  (let [entry-events (fetch-events :twitter-id twitter-id)]
    (->> entry-events
         event-users
         (take 50)
         (fetch-events :year 2012 :month 1 :users))))

みていただいて分かりますようにかなり手を抜いていて、もっとよくなるポイントはいくつもありますが、これだけのコードで面白そうなイベントが分かったので今日のところはオッケーとしました。
実際にもう少し作りこめば普段から使えるサービスになりそうです。

ちなみにClojureとは関係ないのですがデザインにはTwitterのBootstrapを使いました。Fleetを組み合わせましたが、デザインにかけた時間は5分くらいです。プログラマだけでサービスを作るのにBootstrapはおすすめです。

と、そんな感じでラフな記事になりましたが、皆様良いお年を、良いクリスマスを。

2011年12月6日火曜日

Clojureの会社を作った話。

(この記事は、Clojure Advent Calendar 2011 6日目の記事です。)

Advent Calendarでお掃除ロボのルンバをClojureで制御するという記事を書こうと思ったんですが、Bluetoothデバイスとの繋ぎこみがうまく行かなかったので、一年前にニャンパスというClojureな会社起業した話を書きます。

Clojureという決してメジャーではない言語を選んだということで、人によってはそんな言語で起業なんてしてしまって問題ないのかと驚かれることもありますので、この機会にまとめときたいと思います。

なぜ、Clojureを選んだのか


改めて考えてみました。ふんだんに主観が入ってますのでこういう見方もあるんだな位に考えてください。

  • JVMの安心感 - 人によって考え方はいろいろあるでしょうが、僕は結構信頼してます。受託の場合、お客さんも安心です。
  • Javaのライブラリが使える - 後発のプログラミング言語の場合、いくら生産性高いといっても、ライブラリの充実度も重要です。そうでないと、サービスを公開する前に作らなきゃいけないライブラリを多くて、逆に回り道になってしまいます。その点Clojureの場合Javaで書かれている既存のライブラリが利用できるため安心ですし、Clojure用にJavaライブラリのラッパーが意外と揃っています。
  • Lisp - いろいろと言語を触って来ましたが、Lispに落ち着きました。書いてて楽しいです。マクロの魅力もあります。
Clojureを選んだといっても、サーバサイドに限った話で、iOS / Androidアプリを開発する場合にはネイティブな言語を使います。(無理にClojureでAndroidアプリを書くことはしてません。)

Q&A

このブログを書いているとき隣の席に、フリーランスエンジニア桃太郎君がいました。業務委託で仕事を頼んでいる普段Ruby使いの彼に、唐突にClojureの会社なんだけど何か質問ある?と聞いて出してもらった質問に対して、解答をまとめてみました。

- Clojureの情報、ドキュメントは揃っているのか。

日本語だとあんまりないです。みんなで頑張って書いていくしかないですね。ただ、PC買うときに回りにWindowsの人が多いのか、Macの人が多いのかで決めたほうが良いという話と同じで、周りにClojure使いが多ければ問題にならないんじゃないかなというレベルです。

- Clojureの開発者は集まるのか

マクロに見たらほとんどいないに等しいんですが、僕の能力的に数十人の人で何十ヶ月もかかるプロジェクトを受けることはなくて、今後も数ヶ月で数人のチームで開発できるくらいの規模で仕事をしていくと思います。なので、あんまり心配してない(あるいは考えてない)というのが正直なところです。

- ライブラリはどうなのか

上記の通りで、Javaのライブラリが使えます。ライブラリがなかったら作ろうと隙を伺ってますがなかなかそのチャンスが有りません。

- クライアントはどうやって納得しているのか

ここがポイントになるところですよね。開発会社は開発会社向けに仕事しているわけではないと考える所が重要かなと思います。

例えば開発会社同士で仕事をしている場合にはこの案件はJavaのシステムだからJavaの開発が出来る人が欲しい、なんていう感じで依頼があったりしますが、ニャンパスでは原則、その製品を欲しいお客さんと直接仕事をするようにしています。

本質的にはお客さんから見て言語がなにかということより生産性の高いものが望まれるわけで、(さんざん書いといてなんですが、)プログラミング言語はお客さんからしたら重要じゃないと思います。お客さんから生産性の高さが望まれ、それに答えるための手段としてニャンパスではClojureが有効かなと考えて提案しています。
(Clojure以外の言語が向いている場合やどうしてもPHPで、あるいはJavaでというプロジェクトについては、僕らより我々よりもっとうまくやれる会社がありますよ、きっとという提案です。)

マイナーな言語でありながらこのタイミングですでにいろいろClojureのコード書いている人というのはプログラミング言語に好奇心がある人だと思うので、そういう人と仕事をやって裏切られることは少ないんじゃないかなという気はします。なので、起業したいというみなさん、周りのClojure好きなエンジニアと一緒に会社をクリスマス前に立ち上げたらいいんじゃないでしょうか。

2011年10月13日木曜日

地域コミュニティとレイクタウン北自治会の話


いつもブログの更新間隔が長いので、書くたびにどんな語尾で書いていたかを忘れてしまう。

今年1月に長男が生まれて、彼が大きくなったら2011年という君が生まれた年はパンダがやってきた年だったんだよと言おうくらいの、今思えば歌的な会話してたんだけど、それが今やエライコッチャな感じになっていて、それはつまり抽象的な表現になっちゃうけど、大きいシステムで持続可能ではなかったものがどんどん崩壊していっている時代なんじゃないかなと思う。

そういった現在進行形で、大きな古いシステムにさよならを告げていく中で、小さい単位(=顔が見えるくらい)でのコミュニティの重要性が高まっていくんじゃないかなと勝手に妄想している。(3.11を経験したこともあって、近くの人とつながっているというのは重要なこととして捉えられて行っているんじゃないかなと思う。)

そういった思いがむくむくとあるなかで、去年から住んでいるレイクタウンという町は、町としてできたのがまだ二、三年という大変新しいところで、まだ自治会がなかった。

半年前に自治会をつくろうという有志の集まりに参加し、そこから半年間かけて、レイクタウンで暮らす方々となって自治会の設立に向けてにやってきたが、今月の初めに自治会設立の総会が開かれ、晴れて設立の運びとなった。

ニャンパスという会社も"おはよう++(インクリメント)"という経営理念でやっていて、それはつまりおはようを言い合える近くの人をITの力で増やすことが目的だった。
自治会の参加は最初の一歩くらいに思っていて、具体的に小さいコミュニティが活発になれるようなサポートを具体的にやりたいと思っている。
(そういえば、去年ニャンパスという会社を立ち上げたことなど今二期目に入ったことなど気がつけば何も書いてなかった。ニャンパスとしての近くの人をつなげるサービスも進行中なのでその話はまた別で。)

という訳で、レイクタウン北自治会の広報委員会会長になりました。
よろしくお願いします。

2011年9月19日月曜日

函数プログラミングの集い

9/17に行われました函数プログラミングの集いにて、Clojureとその界隈での最近の更新やどういったものがきているのかという話をさせていただきました。


函数プログラミングの集い | 発表資料

内容としては、Clojure 1.3の非常にざっくりとした話と、ClojureScript、Herokuで動くようになりましたよという3つで、狙いとしてはClojureがいろんな環境で動くことを知ってもらい、同時に短い期間でこれだけのサービス、ライブラリが立ち上げっていることからClojureがきている感じを伝えられればというところでした。

普段から仕事で使っていて、使い勝手のよい、楽しい言語なのでもっと日本ででも広がればと思っています。

2010年5月21日金曜日

Clojure + Jettyでウェブアプリケーションを動作させるJarファイル

このところClojureを使ったウェブアプリケーションを書いていて、
そのアプリケーションを単体で動かそうとしたときのまとめを書いておこうと思います。

ウェブアプリケーションをJarファイルにパッケージしたというそれだけのことですが、ClojureでJarアプリケーションを作って動くことに感動したので。

前提としてLeiningenを使いCompojureでウェブアプリケーションを開発しています。
project.cljに以下の行を追加します。

(defproject hoge "1.0.0-SNAPSHOT"
  :main hoge.core
  ....

src/hoge/core.cljには以下のように記述しました。hoge.web/appというのをCompojureのdefroutesで定義しています。

(ns hoge.core
  (:use hoge.web
 compojure)
  (:gen-class))

(defn -main [& args]
  (run-server {:port (Integer/parseInt (first args))}
       "/*" (servlet app)))

これで、Leiningenを使いJarファイルを作成します。

lein uberjar

作成された、hoge-standalone.jarがJettyで起動するかを確認します。

java -jar hoge-standalone.jar 8080

Jettyの起動時のログが出力され、ブラウザでhttp://localhost:8080/を見るとアプリケーションとして動作してるかどうかが分かります。

あとは、このJarファイルをサーバへアップし起動すればOKです。

このやりかただとアプリケーション単体でアプリケーションサーバとして動かしているので、既存のウェブアプリケーションサーバに配置したい場合は、warにしてXMLファイルをゴニョゴニョすればいいんだと思います。

2010年3月15日月曜日

携帯セッションを管理するSinatraアプリケーション用プラグイン

Sinatra、Rackアプリケーションで携帯のセッション管理の自動化を行うためのプラグインをgithubに公開しました。
セッション情報をmemcacheに格納し、HTML中に自動的にセッションIDを埋め込みます。

機能
- ボディ内のリンクおよびフォームを解析し、自動でセッションIDのURLに変更します
- URL中に含まれるセッションIDをもとにセッションの管理を行います
- セッション情報はmemcacheに格納されます

昨年末に作った携帯サイト用の機能を切り出したものです。

MobileSession

2010年3月12日金曜日

WakameTech #1 そろそろ本気でIaaS型クラウドを作る会のプレゼン資料

当日話しをさせていただいたプレゼンの資料をアップしました。
まもなく公開されるWakame1.0の内部を作るエンジニアとしてのWakameの実際の動きを話させていただきました。
(40人もの前で話すのは初めての経験でしたがなんとかなると思ってたところ、けっこうカミカミで、来ていた友人にもあとで指摘されました、、、)
懇親会での参加者とのクラウド、関数型言語あたりの話が面白かったです。

スライドショーの内容は前提としてあくしゅ代表の山崎さんの資料が先に頭に入ってないと略語だらけであまり分からないかと思います。
[Wakame] IaaSを本気で作る会のスライドをアップしました! | やむにやまれず


フリーランスとしてですが開発に参加させていただき、また発表の場まで与えていただいたあくしゅさんありがとうございます。