スキップしてメイン コンテンツに移動

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

(この記事は、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はおすすめです。

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

コメント

このブログの人気の投稿

ESP8266で書き込めない時に対処したこと

ESP8266のチップで書き込めなかった問題が起こり、それについての対処を参考になる可方がいるかもということでブログにもメモとして残しておきます。 書き込みで失敗したケースとしては、 スイッチサイエンスさんのESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 へのシリアル通信での書き込みができなかった問題 Over The Air(OTA)の機能を使うコードを、同じくESP-WROOM-02に対して転送するも、更新の途中でクラッシュし、書き込みが失敗するという問題 の二つです。 OTAまで使って書き込もうとしている背景は、ニャンパスとして Robip というプログラミング学習環境を作っていて、そのツールの中でWi-Fi経由での書き込み機能を対応することでスマートフォン、タブレットなどでのビジュアルプログラミングしたものが、OTA経由で電子工作のプログラミングができるようという機能があり、いくつかのESP8266を積んだモジュールへのサポートを増やそうとしたところ(ようはRobipとしての対応デバイスを広げたかった)上記の書き込みできない問題にぶつかりました。 Facebookのこちらに書いたことの詳細版です。 ESP-WROOM-02への書き込み出来ない問題 もともと、HaLake KitというコワーキングスペースHaLakeオリジナル基板は、ESP8266を積んでいますので、この書き込みツールとしてClojureで書いた robip-tool というのを用意していました。 このツールであればHaLake Kitには書き込めていたのですが、ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》ですと最初の書き込みの段階で失敗することが分かりました。 そこで世界中で人気のESP8266ですので、色んなバージョンの書き込みツールがありまして、書き込みに成功するツールを探す旅が始まりました。 その際には、シンプル版だけでなく、HaLake Kit、ESPr Developer(ESP-WROOM-02開発ボード)、ESP-WROOM-02ピッチ変換済みモジュール《フル版》でも試して、全てで動くツールを検証しました。 途中、Go言語で書きなおしてみたりいろいろテストもしたのですが、結果的に全て

ClojureScriptとBLE

2017年Clojure Advent Calendar 15日目の記事として書きました。 今年、ニャンパスとして、またプライベートでいろいろとBLEを扱うコードをClojureScriptで書きましたので、まとめてみます。 使用したデバイスは、micro:bitです。秋葉原や通販等で手に入り、BLE、25個のLED、加速度センサーがついている学習用のボードです。ブラウザ上でビジュアルプログラミングでの開発ができたりと面白いので、年末年始に遊んでみてください。 ClojureScriptでの環境の作り方から始まって、micro:bitとPCとの接続、リモートでのLチカを試すというIoTなClojureScriptの内容となってます。 1. ClojureScriptで、BLEな環境を作る Node.js、npm、Leiningenを入れておいてください。プロジェクトを作ります。   $ lein new figwheel-node ble figwheel-nodeテンプレートを使い、できたファイルはこんな感じです。 ./project.clj ./README.md ./package.json ./.gitignore ./src ./src/ble ./src/ble/core.cljs ./dev ./dev/user.clj 今回、PC側をBLEのセントラルとして振る舞わせ、micro:bitをペリフェラルとして操作しますので、そのためセントラル側のプログラムとしてnobleというライブラリを使います。 OS毎に依存するものが違いますので、サイトで事前に確認しておいたほうが良いです。    https://github.com/sandeepmistry/noble ※nobleはMac、Linux、Windows、FreeBSDをサポートしており、 僕自身今年nobleを使ったコードをClojureScriptを使って、Windos、Mac、Linuxそれぞれで動かしていて動作は安定していました。 では、nobleを以下のコマンドを実行しておきます。   $ npm install noble ※普段はlein-npm等を使

ClojureでCompojureを使わずにサーブレットを書く方法

Clojureでgen-class、proxyを使ってみようと思い、試しにサーブレットを書くとどうなるかを試してみました。 コンパイルにLeiningenを使うためプロジェクトを作ります。 lein new sample-servlet まずはsrc/sample_servlet/servlet.cljを書いてみます。 (ns sample_servlet.servlet (:gen-class :extends javax.servlet.http.HttpServlet)) (defn -servlet [this request response] (.setContentType response "text/html; charset=UTF-8") (let [out (.getWriter response)] (.. out (println "<html><body>hello world</body></html>")))) (defn -doGet [this request response] (-servlet this request response)) 依存関係とクラスファイル生成のオプションを与えたproject.cljファイルを作りました。 (defproject sample-servlet "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.1.0"] [org.clojure/clojure-contrib "1.1.0"] [javax.servlet/servlet-api "2.5"] ] :namespaces [sample_servlet.servlet]) 必要なライブラリを取得しコンパイル。 lein deps lein compile 無事生成されたことが分かります。 % ls -lr