ラベル Clojure の投稿を表示しています。 すべての投稿を表示
ラベル Clojure の投稿を表示しています。 すべての投稿を表示

2021-12-04

Clojureで行列計算を実装したときに考えたトリック

これはClojureのアドベントカレンダー2021、4日目の記事です。


趣味でディープニューラルネットワークのフレームワークをClojureでゼロから実装しています。

「ゼロから」とは行列計算から。

deltam/neuro: Deep Neural Network written in Clojure from scratch

そのときに行列計算についてあるトリックを思いついて実装したら早くなったのでそれを紹介してみます。関数的プログラミングっぽい発想で、ほかにも応用が効くかもしれない。Clojureのデータ構造の勘所もすこし分かるかも。

注意:完全なる趣味の行いなので単に行列計算したいだけならそれ用のライブラリを使うほうが100倍かしこい。
実用的な知識というよりちょっとしたトリックを面白がってくれればありがたい。

ニューラルネットの学習では行列の転置をよく使うんですが、プロファイルを取ってみたらそこが遅かったので何とかしたいといろいろやって思いついたトリックです。
思ったより応用が効きました。

2014-12-22

素数腕立て伏せ Advent Calendar 21日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


風邪を引いても熱が出ても構わず素数腕立て伏せやってて結局治ったわけだから、素数のお陰で全快したと言えまいか。
素数腕立て伏せ健康法、イケまいか。

21日目
50回で負け(合成数)


体力も戻ってきたみたいです。59を目指してたけど53にも届かなかったよ。


ところで50は2通りの方法で2つの平方数の和に表せす最小の数字らしいですね。(smallestttってバグってるのかななな)

50 is the smallesttt number with 2 representations as a sum of 2 squares:
50 = 1^2+7^2 = 5^2+5^2
50 - Wolfram|Alpha

ではこの条件に叶う2番めに小さい数字ってなんだろう?
まず$ x = a^2 + b^2 = c^2 + d^2 $として、a,b,c,dはそれぞれ異なる数でないといけない。(←追記:コレ違う)
では50のときは$ a = 1, b = 7 $ だったから$ a = 2 $ で幾つか計算してみよう。
2つの数の組合せを計算しないといけないけど、奇偶を考えればチェックする数が減らせますね。

\[
\begin{eqnarray}
2^2 + 7^2 & = & 53 \nonumber \\
3^2 + 6^2 & = & 45 (ダメ) \nonumber \\
5^2 + 6^2 & = & 61 (ダメ) \nonumber \\
4^2 + 5^2 & = & 41 (ダメ) \nonumber
\end{eqnarray}
\]

うーん、だめだった。では次は和の大きさも考えて候補を減らそう。和の大きい順に抑えていって目標の数より下回ったら終わりということ。

\[
\begin{eqnarray}
2^2 + 8^2 & = & 68 \nonumber \\
5^2 + 7^2 & = & 74 (最大の組合せはダメ) \nonumber \\
3^2 + 7^2 & = & 58 (残ってる組合せで最大の組合せもダメ) \nonumber
\end{eqnarray}
\]

これもダメすね。はい次!

\[
\begin{eqnarray}
2^2 + 9^2 & = & 85 \nonumber \\
7^2 + 8^2 & = & 113 (最大の組合せはダメ) \nonumber \\
6^2 + 7^2 & = & 85 (残ってる中で最大の組合せはビンゴ!)\nonumber
\end{eqnarray}
\]


おぉ、85が2番めに小さな(省略)な数らしいぞ!
たまには地道に計算してみるのもいいものだね〜。

念のため、プログラムで検算してみよう(もちろん使うのはClojure)。

user> (def squares (map (fn [x] (* x x)) (range 1 10)))
#'user/squares
user> (filter (fn [[k v]] (>= (count v) 4))
              (apply merge-with concat
                     (for [x squares, y squares :while (<= y x)] {(+ x y) [x y]})))
([65 (49 16 64 1)] [50 (25 25 49 1)] [85 (49 36 81 4)])
あれれ、85は正しいけど3番目だったみたいだ。(1,7)から(2,7)じゃなくて、(1,6)を調べれば65に行き当たってたのになー。 ということで、2通りの方法で2つの平方数の和で表せる2番めに小さい自然数は65でした(ついでに3番めは85)。


2013-12-14

生まれて約三時間目のHashlog

これはClojure Advent Calendar 14日目のエントリです。


(最近自作したライブラリ、Hashlogについて書きます。)


複雑な難しいプログラムを書くのはつらくとも面白いけど、煩雑なプログラムを書くのはつまらないです。

煩雑
事柄がこみいっていてまとまりがつかず,わずらわしいこと(さま)。

例えばこんなコードを読んだことが有ります(実物じゃないですよ)。

// 擬似コードです
function calc($value1,$value2,$value3,$flag)
{
  if($value1>0) {
    if($value1>=5)
      return  5;
    elseif($flag===true)
      return 4;
  }
  elseif($value2>0)
    return 3;
  elseif($value3>0)
    return 2;
  else
    return 1;
}


ある計算をする関数なんですが、if-ifelse、ifのネストで返り値を決めています。
これコード自体は「まぁしゃーない」で済ませられると思います。
しかしこの関数が30箇所にベタ書きで書いてあって、微妙な違い($value5まである/$value2までしかない、$flag2がある)があったらどうでしょう。
さらに30のなかの5個ぐらいはまったく違う引数を取って、別々の数式で返り値を計算している。

ビルの屋上で「F****CK!」と叫びたくなってきます。



if-elseif、ifのネストの何がダメなのか


2013-12-11

core.unify - 単一化をサポートするClojureライブラリ

(この記事はClojure Contrib Library Advent Calendar 2013の11日目の記事です)


概要

core.unifyは「単一化」をClojureで扱うためのライブラリです。作者は『Joy of Clojure』の著者の一人、Fogusさんです。

単一化はPrologなど論理プログラミングなどで使われる処理で、与えられた条件から未知の値を推論する仕組みです。単一化自体について詳しく説明するのは私には難しいので、詳しくはWikipedia等で調べて下さい;−)

ユニフィケーション - Wikipedia

抽象度が高いライブラリなので利点が分かりにくいですが、同じくFogusさんの作ったcore.constractsで使われているそうです。

fogus: Using unification to write readable Clojure macros?



Clojure Contirib Libraryにはcore.logicという論理プログラミングをするためのライブラリがあり、そちらでも単一化の機能は提供してます。ではなんでcore.unifyがあるんでしょう?
READMEを読むとcore.logicとの違いについて次のように書いてあります。

2011-12-10

Overtone: Clojureで音楽を書こう


この記事はClojure Advent Calendar 2011の10日目の記事として書いています。

12月1日からクリスマス25日まで毎日1ネタ、Clojureの記事を書くというこの企画。
せっかくなので前々から興味のあったOvertoneというライブラリの紹介をしてみようと思います。
Home // Overtone
overtone/overtone - GitHub

Overtoneは"Programmable Music"を目標とするシンセサイザーです。普通のシンセサイザーの操作とは違い、Clojureコードで音を作り音楽を書くことができます。
プログラマブル・シンセサイザーとしてはSuperColliderというのが前からあるそうで、それをClojureでラップした作りのようですね。
この記事では導入の仕方と簡単な音の作り方、最後にとあるクリスマスソングをOvertoneで書いてみたいと思います。

2011-11-28

Clojureコードを性能測定する3つの方法


ClojureハッカソンであるTokyo.clj#15に行って来ました。

そこで前々から気になっていたClojureでの性能測定(プロファイリング)の方法について試してみたのでまとめます。

性能測定といってもいろいろな切り口があるので、今回は「実行速度」と「メモリ使用量」に限定して調べて見ました。
その結果、次の3つが手軽でいいかなーと思ったので説明します。

  1. clojure.core/time
  2. clojure.contrib.profile
  3. VisualVM


1,2はClojure用の性能測定ツール、3のVisualVMはJava用のJVMモニタリングツールです。それぞれ一長一短があるので、まずは使い方から説明していきます。


【clojure.core/time】
S式の実行速度を表示する関数です。
『プログラミングClojure』でもよく使われているから知っている人は多いでしょう。
測定用のサンプルとして竹内関数を実装して計測して見ました。

; たらい回し関数(竹内関数)
(defn tarai [x y z]
  (if (<= x y)
    y
    (tarai
     (tarai (dec x) y z)
     (tarai (dec y) z x)
     (tarai (dec z) x y))))

user> (time (tarai 19 16 11))
"Elapsed time: 13.304 msecs"
19

REPL上でいちばん手軽に性能測定ができる方法ですね。



【clojure.contrib.profile】
拡張ライブラリにあるプロファイラ用ライブラリです。
timeだと全体の実行時間しか分からなかったんですが、これを使うと測定したい部分をもっと細かく指定できます。
まずコードの中で測定したい部分をprofでキーワードとともに包んでやります。
そのあとtimeと同じようにprofileから呼び出してやると、指定部分ごとに実行時間の平均/最短/最大と実行回数をまとめた表を見せてくれます。

(defn prof-tarai [x y z]
  (if (<= x y)
    y
    (prof-tarai
     (prof :arg-x (prof-tarai (dec x) y z))
     (prof :arg-y (prof-tarai (dec y) z x))
     (prof :arg-z (prof-tarai (dec z) x y)))))

user> (profile (prof-tarai 10 5 2))
 Name      mean       min       max     count       sum
arg-x    117410         0   2127000       100  11741000
arg-y     70040         0   2960000       100   7004000
arg-z     64230         0   1668000       100   6423000
nil

時間の単位はナノ秒です。

以下のように*enable-profiling*にfalseを指定してやると、コンパイル時にプロファイル用コードを除去してくれるそうです。

user> (binding [clojure.contrib.profile/*enable-profiling* false]
      (macroexpand '(prof :abc (+ 2 3))))
(do (+ 2 3))


以下ちょっと不満点
timeと違って実行結果は返してくれません。結果表をプリントするだけで常にnilを返します。
さらに計測で使ってるSystem.nanoTime()はlong型を返しますが、数分かかるような重い処理だと途中で桁あふれを起こして止まる場合があります(Integerでキャストしている部分が怪しい)。
ナノ秒で測っていることから考えて測定精度を優先して作られているのかなーと思いました。

Clojureメーリングリストを調べてみたら作者のStuart Sierraさんが「half-bakedなんで本気でやるならJVMプロファイラ使ってね」と言ってました。

ここらへん改良したのを作りたいなー。



【VisualVM】
上2つはClojure純正ツールでしたが、こっちはJava用のツールをClojureに応用してみたというものです。
JVMをモニタリングしてメソッド単位で実行速度・メモリ使用量などを計測してくれます。
そのほかにもいろいろ機能があるみたいなので細かいことを公式サイト参照すべし(日本語ドキュメントあり)。

VisualVM 入門 — Java.net

VisualVMを起動してClojureのREPLを立ち上げると、左側のツリービューにREPLの動いているVMが表示されます。それをダブルクリックするとこんな画面が開きます。



ここではCPU使用率とかヒープメモリ使用量のグラフを表示してくれます。このままでも十分有益なデータが得られますね。
プロファイル情報を得たいときは、[プロファイラ]のタブで画面を切り替えます。
[CPU]と[メモリー]のどっちかのボタンを押してから測定したいコードを実行すると、Javaのメソッド単位で処理速度やメモリ使用量を測ってくれます。


Clojureで定義した関数なんかはこんなふうにリストに出てきます。あくまでJava用ツールなのでClojure視点だと結果が読みにくいんですが、下にあるテキストボックスで絞込みが出来るので、それを上手く使うともうちょっと読みやすくなります。



【まとめ】
time、c.c.profileはREPL上で使うのに都合がいいです。ただし実行速度計測がメインで、メモリ使用量なんかは分かりません。チューニングが必要なときに「コード修正して計測」というループを素早く繰り返したいときには楽ですね。
VisualVMは高機能で網羅的ですが、開発中に何度も繰り返し使うというには重い。「ある程度完成しているアプリで何かボトルネックがある、その箇所にあたりを付ける」という場合に使うと良いと思います。

全体的にはClojureの性能測定ツールはまだ発展途上、という感想です。



【参考リンク】
Fatvat: JVisualVM and Clojure
Tokyo.clj#15 - Togetter
Tokyo.clj二次会ではClojure以外の言語の話題でもよく盛り上がって面白いです。

2011-02-07

Clojureのシーケンス関数を使用例で説明してみる

《例示は理解の試金石》

Clojureではいろんなデータを「シーケンス」として扱います(Clojure - sequences)。だからシーケンスを操作する関数をいろいろ使うことになりますが、ちょっと複雑な操作をしようとすると基本的な関数だけでは足りなくて自分で処理を書くことになります。ところがあとで標準ライブラリをよく読んでみると「この関数使えばもっと簡単に処理を書けたんじゃん! 知らなかったばっかりに(ぐぬぬ」となることもあります。

拡張ライブラリのclojure.contrib.seqはちょっと便利なシーケンス関数をまとめたものですが、ドキュメントをちょっと読んだだけだと使いかたが分かりにくい。そこで各関数の使用例をまとめてみました。これでライブラリにある関数を再発明しないで済むはずだ!

gist: 780422 - GitHub



rec-seq、rec-catはイマイチ用途が分かってません。
最後のfill-queueだけ毛色が違いすぎます(入れる名前空間間違ってない?)。これは別に使用例を書く予定。

c.c.seqの関数はclojure.coreに移動予定のも多いです。coreに入っちゃうと他とごっちゃになって分かりにくくなると思うので今のうちに試してみては?


【参考リンク】
Clojure - cheatsheet
このチートシートを印刷しておくのも便利。

追記(2011-12-25)
fill-queueの使用例も書きました
fill-queueでお手軽非同期処理 : サルノオボエガキ

2011-01-10

Clojureでコマンドラインアプリを作るときはwith-command-lineが便利

追記(2013-12-11)
最近のClojureだったらtools.cljを使うほうが良いようです。

tools.cli: Clojureでコマンドライン引数を扱う - Qiita [キータ]




Clojureでコマンドラインアプリを作るときに便利なマクロを見つけたので、使い方をメモっておきます。

clojure.contrib.command-line/with-command-lineを使うと、コマンドラインでオプションを受け取る処理をスッキリ書けます。
何はなくともまず例示、ということで整数計算するスクリプトをwith-command-lineを使って書いてみたのがこれです。

gist: 770487 - GitHub


option?のように?を付けると真偽値、?無しだと引数をその変数名で受け取ってくれます。オプションの省略記法も一緒に定義。オプション説明のあとに値を指定するとデフォルト値を設定してくれます。

これを実行するとこんな感じになります。自動でhelpオプションを表示してくれるのも気が利いてる。

$ clj int-calc.clj -p 3 5
8
$ clj int-calc.clj 3 5
8
$ clj int-calc.clj -p 3 5 -modulo 2
0
$ clj int-calc.clj -ml 3 5
15
$ clj int-calc.clj -ml 3 5 -modulo 2
1
$ clj int-calc.clj --help
clj int-calc.clj [-p|-mi|-ml] [-modulo n] nums..
Options
  --plus, -p        plus      [default true]
  --minus, --mi     minus                   
  --multiply, --ml  multiply                
  --modulo     mod n                   


こういう定型処理をサクっと分かりやすく書けるのは良いですね。

これに限らずclojure.contribライブラリには便利なものが揃ってて良いんですが、全体の量が多いしドキュメント読んだだけだと使い方がわからないことがちらほら。コーディングしてて「おー、なかなか気の利いたコードが書けたぜ!」と思ってたら、あとでライブラリにもっとエレガントな実装を見つけて凹むみたいなケースが何件かありました(text2epub-cljのcore.cljもこれで書き直した)。

日本語情報が少ないというのも良くない再発明をしちゃう原因のひとつかなーと思うので、こういう便利なのを見つけたらちょこちょこ書いていこうと思います。


【参考】
Building a Clojure app with a command-line interface? - Stack Overflow
Clojure関連質問サイト。英語情報で良ければかなり充実。
逆引きClojure
日本語情報だとこちら。こっちにも書きこんでますよ。

2010-10-31

「Lisp脳」勉強会でEPUB関連ツールのLT発表してきました #arielarea

”ありえるえりあ勉強会〜「Lisp脳」勉強会〜”でライトニングトーク(LT)してきました。5分ほどの発表時間内で、今までやってきたEPUB関連ツールとこれから作ろうとしているEPUB生成/配信システムの説明をしました。
まずはプレゼン資料です。
前々から「そろそろ自分のEPUBに関する考えをちゃんと説明しておかないといけないな」と考えていたので、ちょうどいい機会だと思って好き勝手に話させてもらいました。アリエルさんありがとうございました! 正直言いまして、初めてのLTでUstreamで中継されている、さらに資料はその日の15時ぐらいから作り始めた、という悪いフラグ立ちまくりな中で発表したのですが、どうだったんでしょ? 発表内容はこれ以上無いぐらいシンプルに作ったので、話す内容に迷いはなかったですけども。 話した内容を思い出せる範囲で箇条書きにしておきます。
  • 野望『みんなが書いた長い文章を エディタからショートカット一発で みんなの手のひらの中に届ける』
  • 「みんなプログラムを書けるってことはエディタがあって一定量のテキストを打つことが出来て、論理的思考力がある。なぜ小説を書かないのか?」
  • 「作文を書くのが嫌いな人が多かったはずなのに”ブログ”という形式ができた途端、自発的に文章を書く人が増えた」
  • 「同じように、小説もしくは長文エッセイを流通させる形式ができたら、みんな小説を書き始めるんではないか?」
  • 「そんな野望を抱きつつ、ClojureでEPUB関連ツールを作ってます」
われながら極論だなーと思いますけど、その後の懇親会でもいろいろ反応してくれる人がいたので「関心を持ってもらい議論を巻き起こす」という効果は少しあったのかと考えてます。これからEPUB関連ツールを作っていく上で間違いなくプラスになったと思います。 まずは報告まで。ではコーディングを継続していきます。 【参考リンク】 ・L5 資料作りに使ったLT用のプレゼンツールです。ClojureのS式(テキスト)でプレゼンを書くことができて、サクっと作り始められて直前まで手直しできました。ほかにもPDF出力機能など、いろいろ出来がいい。開発者の深町さんが活発に開発しているみたいなので、進化に期待してます! ・EPUB関連ツールの記事: サルノオボエガキ: ePub このブログのEPUBタグにまとめてあります ・書いた小説:ラノベ小説(?)書きました : サルノオボエガキ この小説のテキストファイル、text2epub-cljのテストデータとして同梱してます。samplesフォルダにしれっと入れちゃったりして。 ・ Lisp脳と世代 — ありえるえりあ アリエルさん、最後の最後で空気読まない発表でさーせんしたっ! ・発表したL5のソース 深町さんにならってそのまま貼りつけときます。コピペ便利。
(ns L5.sample
  (:use L5 L5.layout)
  (:import [java.awt Color]))

(defcontext
  {:width 640 :height 480
   :font-family "Gill Sans"
   :font-size 30
   :color (Color/white)
   :background-color Color/black})

(defslides
  [(with-size 35
     (t "ClojureとEPUBと俺"))

   (with-size 15
     (lines "さいたま・無職"
            "deltam"
            "2010/10/29"
            "Powered by L5"))]

  [(title "自己紹介")
   (item "@deltam {:blog サルノオボエガキ}"
         "プログラム書くのが好き(Clojureに注力)"
         "小説書くのが好き"
         "Lisper未満、ワナビー未満")
   (with-size 20
     (item "素数腕立て伏せ愛好家"))
   (img "icon.png")]
  
  [(t "Lisp脳?")]
  
  [(t "ClojureではじめてLispを使い始めました"
      "-> Lisp脳にセルフ洗脳中?")]
  
  [(title "野望")
   (with-size 35
     (lines "『みんなが書いた長い文章を"
            "エディタからショートカット一発で"
            "みんなの手のひらの中に届ける』"))]
  
  [(t "どうやって?"
      "→これから説明します")]
  
  [(title "!注意書き!")
   (item "EPUBのことしか話しません!")
   (lines "\"電子書籍\"ってバズり過ぎてて"
          "話せません!")]
  
  [(title "EPUBってなに?")
   (item "XML(メタデータ)+XHTML+αをZip圧縮。"
         "\"枯れた技術の水平思考\"")
   (img "folder_tree.png")]
  
  [(title "つくったもの")
   (item "text2epub-clj (2010-07-02..)"
         " PlainTextをEPUBに変換するだけ"
         "feed2epub-clj (2010-08-03..)"
         " RSS2/ATOMからEPUB作る"
         "ePubcast (2010-08-28..)"
         " 作ったEPUBを流すPodcastサーバ")]
  
  [(title "こんなふうに変換できます")
   (img "epub_convert.png")]
  
  [(title "反響")
   (with-size 25
     (item "ちょっとだけ使ってくれる人がいた")
     (item "text2epub-clj"
           " MOONGIFTで紹介"
           " @kotorikoに褒められる"
           "feed2epub-clj"
           " 自分のブログをEPUBにして読むなど"
           " 数人、遊んでくれた人いた模様"
           "ePubcast"
           " とくになし(まだできないナイッス)"))]
  
  [(title "つくってみて分かった問題")
   (item "ePubを作ってもみんなの手元に届ける"
         "ルートがない!"
         "→Podcast RSSのエンクロージャに\".epub\""
         "を設定するとiBooksに自動追加される")]
  
  [
   (img "epub_system.jpg")]
  
  [(title "弱点")
   (with-size 25
     (item "無職..."
           " 時間はいっぱいあるよ!"
           "ClojureやってるのにLisp技術の勉強が追いつかない"
           "  マクロむずかしい"
           "サーバサイドの技術よく知らない"
           " GAE/J勉強中"))]
  
  [(with-size 50
     (t "べ、べつにpull requestして"
        "くれてもいいんだからねっ!"
        "http://github.com/deltam"))]

  [(title "告知")
   (item "ほぼ毎月、Tokyo.cljやってます"
         "Clojureは友だち、こわくないよ!")]
  
  [(t "おわり")]
)

2010-08-12

「お前のブログをePubにしてやろうかぁ!」、feed2epub-clj作りました。

deltam's feed2epub-clj at master - GitHub

RSS2.0とAtomのURLを指定して、そのフィード内容をePubにするツールを作りました。
上リンクのダウンロードから、feed2epub-clj-0.0.2-alpha-standalone.jarを持ってくればJava実行環境だけでMac、Win関係なく動かせます。もろもろ至らない点はありますが、とりあえず使えるので公開してみました。

text2epub-cljと同じくシンプルなコマンドラインツール。

これで実際に配信されているブログ記事をePubにするのを説明します。
サンプルとしてコトリコさんのrss2をePubにしてみました。


$ java -jar feed2epub-clj-0.0.2-alpha-standalone.jar "http://d.hatena.ne.jp/kotorikotoriko/rss2"


これで”コトリコ.epub”が作られるので、iTunesにドラッグアンドドロップしてください。あとはiPhone/iPod touchで同期させて、iBooksで開けるか確認。
こんな感じで表示されます。





以下、このツールについて少し。

「これって単にiBooksがRSSリーダになっただけじゃないの?」っていうのはちょっと違います。目次の画像をよく見てもらうと分かりますが、RSSリーダみたいな新→旧ではなく旧→新に並んでます。
Blogってサイトの更新情報を配信することから始まりました。だから基本的に読み捨ての情報を書くためのメディアでした。しかしブログがこれだけ普及すると、繰り返しなんども読みたいような文章を書く人が出てきます。
具体的にはこのid:kasawoさんのブログ。

傘をひらいて、空を

これって過去ログ含めて全部読み直したいレベルの文章群です。
でもブラウザやRSSリーダの制約で過去記事が読みにくいのはムカつく。なにより勿体無い。
つーことでこのツール作りました。

あとAtomPubとかも調べているので最終的にブログ全記事をePubに出来るようにするする予定です。

はてなダイアリーAtomPubとは - はてなキーワード

2010-07-02

テキストファイルをePub化するツールをClojureで作りました。

追記(2010-08-10):現状、複数のファイルを束ねてファイ名を目次にしたepubを作るとこまで作成。こちらでそのことを紹介してくれてマジ感謝。
MOONGIFT » Blog Archive » テキストファイルをePub化「Text2ePub-clj」 オープンソース・ソフトウェア/フリーウェアを毎日紹介



deltam's text2epub-clj at master - GitHub


ePubというのはiPad、iPhone、iPodTouch(iOS4かつiBooks)などで読むことが出来る電子書籍のフォーマットです。
ePubを作るツールはいろいろあるんですが、単純にテキストファイルをePubにするツールが見当たらなかったので作ってみました(Clojureの練習も兼ねて)。
iBooksで読めるePubを作るところまで来たので、alpha版として紹介します。完成度:”とりあえず動く”、なので近日中にいろいろ書き換える予定。

以下、そのツールtext2epub-cljでテキストファイルからePubを作りiBooksで読むまでを説明します。


  • まずDownloadページに行ってtext2epub-clj-standalone-0.0.1-alpha.jarをダウンロードしてきてください。Javaの実行環境があればこのJarひとつで動きます。
  • ePub化したいテキストファイルを用意してください。これはUTF-8でエンコード必須です。
  • コマンドラインで以下のように打ってください。
    java -jar text2epub-clj-standalone-0.0.1-alpha.jar テキストファイル名 ePub名.epub ePubのタイトル
  • これでePub名.epubというファイルが出来るはずです。そのほかcontent.opfとかファイルが出来てると思いますが、それらは削除してOKです。
  • そのePubをiTunesにドラッグ&ドロップしてください。上手く行ってれば”ブック”の項目にコマンドラインで打ち込んだタイトルが表示されるはずです。
  • iPhone、iPodTouchを同期してePubを送ります。iBooksを開いてタイトルが表示されていればOK。それをタップしてちゃんと開ければ、あとは大丈夫。
  • 読書する。
iBooks画面はこんなふうになります(このときに書いたやつをサンプルに使用)。





現状では章ごとの目次とか表紙の画像は設定してません。著者欄もnobody。本当にシンプルな素のePubです。


今後のToDoとしてはRSS・AtomフィードからePubを作る、GAE/JでWebサービス化するとかを考えてます。


【参考リンク】
ssig33 - Tumblr 2 ePub の PodCast 機能を強化した
この人スゴイです。開発スピードが俺の10倍ぐらいある。ただ運用が大変みたいなので俺もYet Anotherなサイトを作って負荷分散に協力したい(来週中ぐらいにできたらいいな)。
あとドネーションも受け付けているみたいです(支援)。
ssig33 - Tumblr 2 ePub の Premium Service 作った、お金ください

2010-02-28

Compojure - Clojure版Webアプリフレームワークをインストール

もっとClojureで遊びたいのでCompojureというフレームワークをインストールしてみました。Clojure用のWebアプリフレームワークです。まだMacPortsとかにも入ってないみたいなので、簡単にビルドと設定の方法を書いて記憶を整理しときます。とりあえずHello Worldを実行するまで。
以下、環境はMacBookでGitはインストール済(MacPortsにある)とします。


1) GitHubリポジトリから最新版を取ってくる。
git clone git://github.com/weavejester/compojure.git

適当な場所にcloneしときます。


2) 関連ライブラリを取得
cd compojure/
ant deps

必要なライブラリは上のコマンドで自動的に取得してくれます。実行するとcompojure/deps以下にJarファイルが用意されます。


3) ビルド
ant

これでcompojure.jarが作られます。


4) Jarファイルをまとめて配置
mkdir ~/.compojure
cp compojure.jar ~/.compojure
cp deps/*.jar ~/.compojure

私の場合はホームディレクトリに.compojureを作ってそこに配置することにしました。


5) 起動用シェルスクリプトを作る
cd ~/.compojure
vi compojure.sh

でファイルを作成して、以下のスクリプトを書く。
#!/bin/sh

for f in ~/.compojure/*; do
CLASSPATH=$CLASSPATH:$f
done

java -cp $CLASSPATH clojure.main $1

CLASSPATHに必要なJarファイルを追加してClojure起動という内容。
chmod +x compojure.sh
sudo ln -s ~/.compojure/compojure.sh /opt/local/bin/compojure

このスクリプトのシンボリックリンクをパスが通ったところに作ります。


6) Hello Worldスクリプトを作る。
CompojureのページにあるSample Codeをそのまま書きました。


7) テスト
compojure hello_compojure.clj

ブラウザでhttp://localhost:8080を見てちゃんと表示されればOK。




【参考リンク】
Compojure/Getting Started - Wikibooks, collection of open-content textbooks
起動スクリプトはココの情報を参考にしました。



プログラミングClojure

2010-01-31

Clojureコードバトンを受け取った

manjilabさんよりTwitterでお誘いされたので光速で受けました。『プログラミングClojure』を読ん出る最中なのでちょうど良かったです。
自分が書いたのはGitHubのここのページに置いときました。

gist: 291106 - GitHub


さて「Clojureコードバトンっていったい何?」ってことなんですが、もともとはid:higeponさんがSchemeではじめたものらしいです。

Scheme コードバトンまとめページ - ひげぽん OSとか作っちゃうかMona-

コードバトンは、誰かが書いたコードをリレーして各人が好きに書き換えて面白いものに変えちゃおう!って感じの主旨のものみたいです。途中でathosさんがClojureで書き換えて、いろいろバトンが渡り現在に至ると。

噂の「英単語を覚えるスクリプト」をClojureで - athosの日記



今回のお題は「英単語を覚えるスクリプト」。前のmanjilabさんはMac OS Xで英単語をしゃべらせるというVery Coolな機能を書いてるわけで、あえて自分なりに一工夫加えるとなるとけっこう考えてしまう。と思いきや、すぐにアイデア浮かびました(やっぱり12時間睡眠すると頭がすっきりするなぁ)。

このスクリプトは英単語の辞書ファイルを読み込んで表示してくれるんですが、肝心の辞書ファイルを作るのが面倒くさい。じゃぁSmart.fmで学習中のアイテムを引っ張ってきて、このスクリプト用の辞書ファイルにする機能つければ便利じゃね?ということで作ってみました。

まず調査! Smart.fmのデベロッパ向けページを見てみると、ユーザ名を指定してその人の学習中アイテムを取得するAPIがありました。

items studied

いろんな形式でデータが取れるみたいですが、今回はXMLを選択。Clojureでは"Sequences"という概念でいろんなデータの連なりを統一して扱えます。XMLには"xml-seq"というやつが使えそう。いろいろ検索して使い方を調べてなんとかAPIのXMLを読み取れるようにしてみました。

自分が手を加えたのはコマンドラインで”−s”オプションと、smartfm-dictのところですね。一通り書いた後になんとかキレイにしようと思ったんですけど、どうかしら。

勢いで受け取っちゃったコードバトンですが、思いのほか面白かったです。だれか次に受け取ってくれる人は、この記事のコメントかTwitterのほうで話しかけてください! ちょっとでも興味があったら勢いでYou受け取っちゃいなYO!



---
(02/15追記)
私のバトンは@omasanoriさんが受け取ってくれました(感謝!)。さらにコメントを英訳するという試みもされてます(スゴイ。
さらにその先は@tnoborioさんに渡り、ついにSwingでGUI化されました(ぉぉ。今のところ受け取り先募集中みたいです。
tnoborio | Blogger Blog: Clojureコードバトン参加中



プログラミングClojure