2010-11-28

Shibuya.lisp#6でLT発表してきました

Shibuya.lisp#6にて「ClojureとEPUBで「普通のやつらの上を行く」方法」というタイトルでLightningTalkしてきました。
まずはプレゼン資料です。
ここ最近作っているEPUBツールの説明をして来ました。あとGoogle AppEngine for Javaにfeed2epubの機能を載せたのを実験中だったのでデモとして見せたかったんですが、時間切れ&エラー… ムー、不本意なオチをつけてしまった! (最後に発表してるひとです) 途中でDEMOとして見せたサイトはこれです。LTに間に合わせようと拙速に作ったので、近日中にいろいろ変えます。 一応、RSS2/ATOMフィードのURLを入れてボタンを押すとEPUBがダウンロードできるように作ったます(たまにエラーが出るけどね) http://epubninja.appspot.com 前半のTechTalksの先生方の話しはさすがでした。まさにShibuya.lispみたいな機会がないと知らなかったようなことを聞けてよかったです。難しくて分からないことも多かったですけど、「何が分からないのか」はそこはかとなく分かったような感じがしました。少なくともMOP(MetaObject Protocol)についてはまるっきり勘違いしてたのが自覚できて良かった。 Shibuya.lispは前回#5が初参加です。それまで技術系イベントにはほとんど参加したことはありません。だから前回でこのことを初めて実感しました。 「実際にコード書いている人、スゴイ人に会ってみるとパワーが湧いてくる」 それで前回参加したあとは「今度参加するときは、絶対見るだけじゃなくて何か面白いものを作って発表したい」と決心してました。なんかこういう場をせっかく用意してくれてるんだから参加しないともったいない!という気持ち。やる気はだいぶチャージされましたね〜。 私はプログラミングや技術自体も好きだけど、何か具体的なプロダクトを作りたいタイプです。 「Lispを使えば難しい問題も簡単に解けるんだ」という主張を良く読むけども、ならば「簡単な問題をさらに劇的に簡単にする」ためには使えないのかな。いわゆるプログラミングが出来ない「普通の人たち」が便利だと思えるものを作りたい、そのためにLispが利用できるんではないかと思って使ってます。 Lispで開発効率が上がるんなら、それでできた時間をより便利な何かのアイデアを考えるのに使えないでしょーかねー。 本番のLTでは時間切れになっちゃいましたが、その後の懇親会でリベンジ発表させてもらったのでいちおう言うべきことは言い切りました。 「普通の人」が使いやすいものをLispで作ろう。そんで草の根的にLispはスゴイという空気を作ってこう。仕事でLispを使いたいならお客さんにLispがスゴイって認識を持ってもらわないと無理だし、逆にお客さんがOKならばあと社内は何とかなりそうじゃない? まぁ、まずはコード書きましょう。 最後に。 もういい加減、自己紹介で無職というのも飽きました。仕事探しはじめます。

2010-11-05

ePubcastローカル版の遊び方を説明します!

先日、ありえる勉強会でLT発表したときに触れたePubcastのローカルサーバ版がだいたい出来たので使い方を書いておきます。

このソフトウェアの目的は「ePubをPodcastで配信する実験を行う」なので、機能はおもちゃ程度です。とりあえずePubとPodcastでなにができるか手元で遊んでみたい人向けに説明します。以下ではMacBook+Google Chromeで説明してますが、Windows、他のブラウザでも基本的に同じです。

まずJarファイルをダウンロードします。0.0.11のやつです。

Downloads for deltam's ePubcast - GitHub

これを適当なフォルダに置き、同じフォルダに"static"という名前のフォルダを作ります。このstaticフォルダにePubを置くだけでPodcast配信が出来るようになります。

上述の準備が終わったらサーバを起動します。コンソールを立ち上げてJarを置いたフォルダに移動し、以下のように打ち込みます。2行目以降のようにログが表示されたら起動してます。

$ java -jar epubcast-0.0.11-alpha-standalone.jar 
2010-11-05 08:14:25.944::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
2010-11-05 08:14:25.960::INFO:  jetty-6.1.x
2010-11-05 08:14:26.050::INFO:  Started SocketConnector@0.0.0.0:8080


ブラウザでhttp://localhost:8080をアドレスバーに打ち込みます。



ブラウザ上ではstaticフォルダの中身をリストにして表示させてます。
[add iTunes]というリンクを押すと、以下のようなメッセージが出てくるので[アプリケーションの起動]を押してください。



これでiTunesのPodcastに自動追加されます。


ここですべてのePubをダウンロードさせて、iTunes「ブック」のページを見てみると、ダウンロードしたePubが追加されていることが分かると思います。



これでiPodTouch/iPhoneを同期させて、iBooksを開くと下のようにePubが追加されます。

これで読めます!


以下、ちょっと補足。

Q. 配信するePubがない
A. feed2epub-cljを使ってはどうでしょう。長文記事のブログを読むときなどにePubに変換できます。(ファイル名が日本語だとePubcastでダウンロードできなかったりするので適宜変えてください)

Q. ローカルだけじゃなくてインターネットで公開したい!
A. このePubcastをGoogle AppEngineに移植する作業を始めてます。しばしお待ちを!


【参考リンク】
[ポ] 電子書籍に繋がった - ...My cup of tea...
こちらの記事で始めてEPUBをPodcast配信できることを知りました。感謝。
アップル - iTunes - Podcast - Podcastを作成する
アップルの技術資料。EPUBは配信可能なファイル形式に含まれてないですが、きっちりiBooksにも追加できちゃいました。
deltam's ePubcast at master - GitHub
ソースコードも公開してます(Clojureですが)。1ファイルべた書きなのでそれなりに分かりやすいかと。

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-10-05

text2epub-clj更新、行頭"!!"でePub目次設定。

Downloads for deltam's text2epub-clj - GitHub
ここの0.0.3-alphaの更新内容のご報告です。


これまでのお話し→ サルノオボエガキ: ePub

text2epub-cljを更新しました。version 0.0.3-alphaです(もはやバージョン番号の意味が分からない)。

今回は簡易記法を導入してみました。前回までだとePubのページ分割をするのは「章ごとに複数ファイルに保存」しないとtext2epub-cljではページ分割出来ませんでした。でも書いてる最中は章ごとにファイルを分けるなんて面倒なことしたくない。だから簡単な記法をちょちょいと付けて、そのまんまtext2epub-cljに通したらページ分割できたらいいなーと思って作りました。

まずは例を見てもらうのがいいでしょう。GitHubリポジトリのsamplesフォルダにあるhello.txtから全文引用。

!title! hello
!author! hello

!! chapter 1
this is a pen.
hello world.

!! chap 2
hello! hello!
today is sunday

!! end
eof, eof!

これをtext2epub-cljに通してePubをiTunesにドラッグアンドドロップ、iPod touchに同期するとiBooksではこうなります。



こうなりました。

「!title!とか!author!ってなんやねん?」。あとで書く予定のePubメタデータ簡易記法のプロトです。あんまりカッコよくないので良い案があったらコメントください。とりあえず作っときます(あとで)。

これでしれっとSamplesフォルダにテストデータとして追加しておいた自作小説の『スウスウと砂漠の運び屋』もちゃんとePub化できたヨ。




あとCommonLisper深町さんforkしていろいろ直してくれたりMarkdown記法で書けるようにした分があるんですが、こっちをマージする前にとりあえず出しちまおうと思ってアップしときました。ちゃんと吸収しますよ!>深町さん


以上、進捗報告でした。また開発に戻る!

【リンク】
L5のver1.1.0をリリースしました - 八発白中
プレゼンツール。Clojureで書かれているので参考に読んでます。
生まれて3日目のUn-Common Lisp - 八発白中
Lisperはあるレベルを超えると自分言語を作り出すというのは都市伝説ではなかったのだなー

2010-09-05

素数腕立て伏せについて

「落ち着け………… 心を平静にして考えるんだ…こんな時どうするか……
2… 3 5… 7… 落ち着くんだ…『素数』を数えて落ち着くんだ…
『素数』は1と自分の数でしか割ることのできない孤独な数字……
わたしに勇気を与えてくれる」

最近やっている筋トレ法。自分で思いついたけど、わりと普通の発想だからすでにやってる人も多いかも。

もともとの疑問は「なぜ筋トレって10や5の倍数で終わらせることが多いの?」だった。5の倍数ってあんまり好きじゃないし、なんか必然性がねーよ、という感覚でした。だったら数学的に大きな意味を持つ素数の回数を単位にしたほうが自然じゃないのか、と思い至りました。

やり方
  • 普通に腕立て伏せをやる。1から順に数えながら。
  • もう限界、腕が上がらない! というとこまでやる。
  • 潰れたときの回数が素数だったら勝ち、合成数だったら負け。
  • 何に対して勝ち負けとか関係ない。勝ちを喜び、負けは猛省。

効能
  • 限界までやるので常に限界越えを目指す必要があり、筋肉増強の効果が望める
  • 腕に限界が来ていても「あと数回で素数に達する!」と思うと少しだけ力が湧いてくる(私はこれを素数力と名付けている)
  • 素数間の距離は不規則に広がっていく傾向があるので、これを続けた場合でも常に達成困難な目標を持ち続けられる


とりあえず素数腕立て伏せということで、このアイデアを実装しましたが、素数腹筋、素数背筋、素数ダッシュなどいろいろ実装例は思い浮かびますね。ただし素数スクワットは最後にこけることになるので注意が必要です(実験済み)。

Twitterでは#prime_num_pushupsというハッシュタグで実施報告をしてますが、このタグはまったくバズる気がしない。

誰とは言いませんが、「素数腕立て伏せって何なんじゃ」と問われたのでいちいちTwitterで説明するのも面倒くさいなーとおもってブログ記事にしてみました。


【追記2011.02.24】
Togetter - 「素数腕立て伏せ進行状況」
「素数腕立て伏せ」とは何か 「素数力」が腕立て回数を伸ばす - モジログ

2010-08-17

第0回『ガロアの群論』読書会、第1-3章読書ノート公開

第0回『ガロアの群論(ブルーバックス)』読書会 まとめ - ツルマウソフト

第0回『ガロアの群論』読書会というのに参加しました。もうひと月前の事なんですが、読書ノートをちゃんとまとめて無かったので、ざっくりまとめたPDFを公開します。
たぶん『ガロアの群論』を読んでないと意味不明ですが、最後の「方程式の係数」「対称式」などの相関図は読んだあとに見直すと頭の中が整理できるかなーと思います。

ガロアの群論(1−3章)読書ノート(PDFリンク)


あ、『ガロアの群論』は講談社ブルーバックスの群論初心者向け解説書です。ふつうの数学書では省いてしまうような具体的計算を丁寧にしてくれて、私のような凡人には有難い本です。数学好きで「ガロアが五次方程式に解の公式が無いことを証明して、その過程で群論が発明されたってことは知ってるけど、いまいち詳細が分からなくてすっきりしない」って人にはおすすめです。

明日(18日)、第1回『ガロアの群論』読書会があるので、急いでまとめてみました。気分は8月31日の小学生。

【定期】明日18日、第1回『ガロアの群論(ブルーバックス)』読書会を開催します!場所は前回と同じエクセルシオールカフェ赤羽東口店にて、時間は13〜15時です。飛び入り参加も歓迎です。第0回のまとめ→ http://bit.ly/9GBaxu
Twitter
追記:PDF内の相関図だけキャプチャして載せときます。あくまでザックリ。
『ガロアの群論』1−3章 各概念の相関図



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-08-04

秀吉とMapReduce

高校のとき数学の先生がよく授業の合間に雑談をしてくれた。そのなかで聞いた豊臣秀吉の話しが面白かったのでいろいろ絡めて紹介。

あなたはいきなり鬱蒼とした森に連れてこられて、「あの山に生えている樹の本数を可能なかぎり正確に数えてこい」って命令されたらどうしますか? もちろん秀吉の話しなので部下はそれなりにたくさん居るとします。

山の表面積を計測して、ランダムに区画を選んでその中の樹を数えて、ひと山の概算をしますか?
それとも部下を何グループかに分けて麓から地道に樹の本数を数えながら登らせますか?
秀吉はどっちの方法もとらず、さらに精度が良い方法で樹の本数を部下たちに数えさせました。

それはこんな話し。

豊臣秀吉はあるとき、一つの山に何本の樹が生えているか調べるという任務を仰せつかった(理由は建築資材の見積もりだったかな?)。ひと山は広い。いちいち数えていたのでは何日経っても終わらないし、重複して数えるミスも出てくるだろう。

秀吉はどうしたか。

まずたくさんの紐を用意した。そしてその紐を部下たちに配りこう言った。
あの山にある樹に紐を縛り付けてこい、ただし一本の樹に紐は一本だけしか縛ってはいけない
たくさんの部下たちを動員してもう縛り付ける樹が見つからないほどその作業を続けた後、今度はこう言った。
樹に縛り付けた紐を解いて持ってきなさい
そして秀吉は集めた紐の数を数えてひと山の樹の本数を調べた。

これは数学における1対1対応の応用である。秀吉はとても数学的な思考力を持った武将であった」と数学の先生は最後に付け加えた。



これってMapReduceの考え方とも似てないだろうか?

MapReduceっていうのは、Googleが膨大なサーバ群で分散処理を実行するときに使われているプログラミングフレームワーク。

MapReduceでは処理するデータをKey-Valueの組みとして扱い、それをプログラマが書いたMap関数とReduce関数で処理していきます。
ラフに説明するとMap関数では「Keyの値ごとにValueをどう処理するか」を書いて、Reduce関数では「処理結果を各Keyに対してどのように集計するのか」書く感じ。


MapReduce論文(PDF)
のP.3, Figure 1の処理手順を書き出して、それに上記の秀吉の数え方を対応させてみよう。処理の詳細は同論文の”3.1 ExecutionOverview”から抜粋。
  • Input files
    • MapReduce(以下MP):処理するデータを一定サイズに切り分ける
    • 秀吉: 兵たちに紐を配る
  • Map phase
    • MR : 複数のWorkerがUser Programに従って切り分けたデータを処理する
    • 秀吉: 兵たちが山に登って木に紐を縛り付ける
  • Intermediate files
    • MR: Map phaseで処理した結果を保持する
    • 秀吉: 縛り付けられた紐(でいいのかな?)
  • Reduce phase
    • MR: Keyごとに保持された結果を集計する
    • 秀吉: 兵に命じて縛り付けた紐を回収すると同時に本数を集計。
  • Output files
    • MR: 集計結果
    • 秀吉: 紐の数すなわちひと山にある樹の本数

秀吉の方法が優れているのは動員する部下を増やせば増やすほど早く数えられるというところだろう。つまり作業の並列化によるスケールアウトができる。サーバを増やせば性能が比例して上がるWebのバックグラウンドシステムみたい。
1、2、3と数えて行く方法は並列化しづらいし、間違い防止やらで末端作業者の負担が大きい。
秀吉の方法では、末端の作業者には単純なルールを守らせるだけでミスを減らすことが出来る(一本の樹に一本の紐)。だから人員の調達も低コストで行える。
さすが後に天下を取る男、素晴らしく頭が切れて無駄がないですね。

ということで、
「豊臣秀吉は戦国時代からMapReduceを駆使する関数型武将だったんだよ!」「な、なんだってー!!」
というエントリでした。



・・・・・・正直言いまして、上記のリストがMapReduceの説明に本当に合っているのか自信がありません。あと秀吉の逸話もソースが不明です。そこらへん、コメントで教えてくれる方がいたら有難いです。m(__)m

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-06-25

iOS4で肩コリが軽くなるかも

今年の4月ごろに買ったiPod touchをiOS4にアップデートしてみました。
それまでの3.1.3で結構サクサク動いていたので、アップデートには消極的だったんですが、TwitterのTLを見ても文句が少ない・Bluetoothキーボードが使えるらしいということでアップデートしちゃいました。
文句の中には「アップデートに時間がかかりすぎ」ってのがありましたけど、自分の場合は数分で終りました。

で、iOS4です。思ったよりもサクサクというかヌルヌル動きますね。画面遷移のアニメーションに細かい演出が追加されてて、ヌルヌルっていう動作感です(上手く言えない…)。
マルチタスク/アイコンのグループ化については色んなところで書かれているので省略。

問題はBluetoothキーボードです! EM・ONEを買った時にBluetoothキーボードとしてStowaway Universal Bluetooth Keyboardというのを買ってたので、それを使ってみました。



ペアリングはかなり簡単に終了、それ以降はキーボードの電源が入ると自動的にBluetoothを繋いでくれるみたいです。
Touchのソフトウェアキーボードは繋いでいる間は非表示になります。以下、入力中の画面キャプチャ。


変換候補は全画面で表示してくれて見やすい。


このキーボードの場合はCmd(Win)キー+スペースで入力切替ができました(一番下のはアラビア語です)。


ちょこっと使っただけですけど、文字入力に関してはかなり早くてストレスなく使えると思います。あとはこのキーボードの変則キー配列に慣れればOKですね。
このキーボード、薄いわりにキーの深さがそこそこあって良いんですが、真ん中から二つに折りたためるというギミックのため、キー配列が少々特殊です。

こんなふうに折りたたんで持ち運べば、文字入力マシンの最小構成になりますね。これでサボリ気味だったこのブログも更新出来るかな?




これで文章作成のためだけなら重たいMacBookを持ち歩かなくて良くなりました。最近、肩が重いのもこれで良くなったらいいんですけどねー。


【関連リンク】
サルノオボエガキ: EM・ONEと折りたたみキーボード
ThinkOutside Stowaway Universal Bluetooth Keyboard

2010-04-05

「根をはる安定」から「コマの安定」へ

「安定した生活」という言葉の意味が自分の中で変わりつつあるのを感じる。

以前の安定とは、ひとつところに樹のように根をはって定住するようなイメージだった。自分の場所があって、そこでいかに心地良く暮らすかが問題。

いまは回転するコマのような安定も良いんじゃないかと思うようになってきた。コマに動き続け、その回転力によって姿勢を安定させる。
決まった場所は持たないけど回転力を維持するためにやることはいろいろある。

まだ具体的なアクションにまで落とせないんだけど、こんなことを考えました。

あれこれジタバタしてみようかなーっと。


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-02-15

手話を覚えたくなった

今日の仕事の帰り、コーヒーが飲みたくなってスタバに寄った。音楽を聞きながら本を読んでいると隣の席に男女のカップルが座った。横目にずいぶん身振りがオーバーアクションな人だなーと思っていたらそれは勘違いで、二人は手話で会話していたのだ。音楽で耳がふさがっていたのでしばらく気がつかなかった。

BGMが流れ、客の話し声で雑然としたなか、二人は静かに淀みない手の動きで饒舌に語り合っていた。なんというか、その滑らかな手の動きがきれいだと思ったし、それが言葉になっているということが美しく思えた。

そういや、今年の正月に「毎月ひとつ、何か新しいことを始める」って決めたんだった。今月はもう半分以上過ぎてしまっているけど、手話を覚えてみたい。まずは挨拶を覚えよう。それだけなら今週中に出来そうだ。



---
3DCGと手話は相性が良いのかもしれない。いつか音消しで見る!

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

2010-01-06

さくらインターネットにインストールしたMercurialをバージョンアップ

しばらくぶりにさくらインターネットにインストールしていたMercurialを使おうとしたら、hg stでエラーメッセージ。調べてみたらさくらインターネットではPythonを2.5.2から2.6.2にバージョンアップしたらしい(お知らせ記事)。

Mercurialもver0.9.5をインストールした時からアップしてなかったので、これを機に1.4に入れ替えることにした。
こちらの記事を参考にやったら結構簡単にできました。感謝。

さくらとPythonとMercurial。 - handlerの日記


これでOKだー、と0.9.5のときに作ったレポジトリのCGIにアクセスしてみたらInternal Server Error。どうやらMercurialのhgweb.cgiもバージョンアップされてたらしいので入れ替えることにする。

Mercurialに同梱されているhgweb.cgiというスクリプトをwww用ディレクトリにindex.cgiと改名してコピーする。実行権限を与えておくのを忘れずに。

cd mercurial-1.4
cp ./hgweb.cgi ~/www/hgtest/index.cgi
cd ~/www/hgtest/index.cgi
chmod +x index.cgi


index.cgiをレポジトリに合わせて書き換えていきます。まずPython pathの設定の行のコメントを外して環境に合わせてパスを設定する。

hgweb.cgi(6-7行)
import sys
sys.path.insert(0, "/home/ユーザ名/local/lib/python/site-packages/")


次にUTF-8の設定を有効にする。日本語を表示させたいならこれが必要。

hgweb.cgi(21-22行)
import os
os.environ["HGENCODING"] = "UTF-8"


最後にホームディレクトリに作ったMercurialレポジトリの位置を指定する。私は~/hgrepos以下にレポジトリをまとめているのでこんな感じになった。

hgweb.cgi(27行)
application = hgweb("/home/ユーザ名/hgrepos/レポジトリ名/", "レポジトリの説明")



蛇足。上記の設定をしたのに500 Internal Server Errorになっちゃう場合は以下のところのコメントを外すと詳細なエラーメッセージをブラウザに表示してくれる。私もちょっとハマりかけたのでこれが役に立った。

hgweb.cgi(13-14行)
import cgitb
cgitb.enable()



以上でバージョンアップは完了。hgweb.cgiも進化しているようでページデザインとかが小奇麗になっている気がする。

iPhone Note App File Sync: shortlog


【関連記事】
サルノオボエガキ: Mercurialをサーバにインストールした
2008年1月の記事。2年ぶりのバージョンアップでした。

2010-01-01

謹賀新年

あけましておめでとうございます。今年もこのブログをよろしくお願いします。

元日の今日を私はPHPを勉強しつつ過ごしてました。実験的にTwitterで記録しながらやってみました。まずは1日でPHPの基礎からTropyクローンを作ることまで目標に実施。結果はこれ。なんとか完成。

元旦からわりと疲れましたが、まぁ1年の滑り出しとしては良いかなーと思います。


ではみなさんが良い一年を過ごせますように!