2014-12-06

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

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




豚バラ白菜鍋を作るのに夢中になっていたらこんな時間じゃないか! 鍋が煮えるあいだに素数腕立て伏せすっぞ!
(昨日の反省を踏まえてメガネは取った)


6日目
33回で負け(合成数)


31で一山越えて32で潰れそうになったが踏みとどまった。だけど34には勝てなかったよ......。
まだ鍋が煮えてないのでもう一回やってみる。

6日目(2セット目)
22回で負け(合成数)


1日で二度負けちゃったよ、勇次郎に怒られそうだよ......。だけど鍋は美味そうに煮えてきたよぉ。

最近、腕の筋肉痛が無くなってきたので2セットやってみましたが、キーボード打つ手がぷるぷるしてきたので今日はここまでにします。


素数腕立て伏せ一言PR
寒いですね、素数腕立て伏せです!
筋トレしたいけど時間がない? 素数腕立て伏せです!
クリスマスに予定がない? 素数腕立て伏せアドベントカレンダーです!

※ 当方では素数腕立て伏せアドベントカレンダー参加者を随時募集しております。
参加登録とかしゃらくさいものは要りません。素数腕立て伏せをやったら #prime_num_pushups をつけてツイートしましょう!

#prime_num_pushups - Twitter検索

2014-12-05

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

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


自然数に0を含めるうんぬんを調べてたらますます分からなくなってきたので、明日は積読になってたこの本を読んでみよう。

数とは何かそして何であるべきか (ちくま学芸文庫)




5日目
28回で負け(合成数)


「自然数に0を含めるのか」を考えながら素数腕立て伏せを始めたらメガネをかけっぱなしであることに気づいて動揺してしまった。他事に気を取られては記録は伸びぬ。28回は1日目と同じですね。


28 - Wolfram|Alpha
1日目ではスルーしてましたが、28は完全数でもあるんですね。うーむ、完全数腕立て伏せをやったら28の次が496なので、すごく記録が伸びづらくなるなぁ。素数は程よく散らばってて良い!



素数腕立て伏せ一言アドバイス
メガネは外せ、腕立て伏せをはじめる前にメガネを外すのだ(4日ぶり2回目)



【自然数に0を含めるか関係リンク】
自然数 - Wikipedia

「先生、0って自然数ですか?」|多摩英数進学教室 栗平校
0は自然数か | 東海大学理学部情報数理学科

#0は自然数 - Twitter検索

2014-12-04

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

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



大寒波が来るみたいですが、あいも変わらず素数腕立て伏せを続けていきますよ。


4日目
32回で負け(合成数)


3日目は31回を目指して30回で潰れましたが、今日は31回を越えて気が緩んでしまったようです。次の37まで続ける素数力が足りなかったぜ......。




ところで3日目記事で「自然数を3つの平方数の和で表せる条件ってなんなんだろね」と書きましたが識者より情報を頂きました!



自然数$N$が三個の平方数の和で表されるための必要十分条件は、$n\ge0,k\ge0,a\in\{1,2,3,5,6\}$により、$N=4^n(8k+a)$と表されることである。逆に、$N=4^n(8k+7)$で表される自然数は三個の平方数の和で表されない。これはディオファントスの時代から研究されてきた[1]ことであるが、1798年、ルジャンドルによって証明された。

三個の平方数の和 - Wikipedia

$30=4^0(8*3+6)$となるので3平方和で表せるということですね。今日の32は$32=4^2(8*0+2)$となるので3平方和に表せる。毎度WolframAlpha先生に聞くのもアレなので3つの平方数を計算してみます。

32未満の平方数は$\{1,4,9,16,25\}$ですね。……あっれー、0を含めないと3平方和で表せなくね???

\[32=0^2+4^2+4^2\]

WolframAlpha先生も3平方和は出してくれないし...。
32 - Wolfram|Alpha

自然数に0を含めるうんぬんのアレなんですかねぇ。時間がギリになったので一旦棚上げしますが。


[2014-12-07追記]
これって単純に平方数に$0^2$を含めてなかっただけですね、自然数と0は関係ない。筋トレ直後の酸欠で脳みそがアレだったから間違えちゃった(・ω<)☆

2014-12-03

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

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



今回はちゃんと腕を90度曲げたぜ!

3日目
30回で負け(合成数)


20回までは勢いでいける、「23か29あたりで妥協しようかなー」という気持ちが湧いてくるのでそれを振り払うのが一山。あと必死にやってると一瞬、「27が素数なのでは」と思ってしまうが$27=3^3$なので気をつけよう。29の誘惑を振りきった後、あと1回が続かなかった。無念。

WolframAlpha先生に聞く前に素因数分解してみると $30=2*3*5$となり、1日目記事を参考にすると「合成数かつ3を平方で素因数に持ってない」ので2つの平方数の和としては表せないってことが分かります。
30 - Wolfram|Alpha

ところが先生によると$30=1^2+2^2+5^2$と表せちゃう。自然数を3つの平方数の和で表せる条件ってなんなんだろね。


素数腕立て伏せ一言アドバイス
「せっかくだからBGMはクセナキスを流してみっか」とか思ってもやらんほうがいいです(テンション上がらない)。素数腕立て伏せだろうが筋トレBGMはロッキーのテーマが定跡のようだ。



2014-12-02

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

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



MathJaxを導入して数式がキレイに表示できるようにしてみた。昨日のAC1日目の記事もちょいと修正してみました。すこしTeXの書き方を覚えるだけでLife Changingだなこりゃ。


2日目
37回で勝ち(素数)


昨日の素数腕立て伏せの筋肉痛のせいか、腕の曲げ角がすこし鈍角になっていたように思う。今回は素数回までいけたが、回数が多いほうが良いわけではなく限界まで続けるのがキモなので、明日は回数の多さにこだわらず鋭角に腕を曲げよう。


今日もWolframAlpha先生に37について聞いてみよう。
37 - Wolfram|Alpha

37は原子ピタゴラス数の斜辺の数であるとのこと。

\[37^2 = 12^2 + 35^2\]

斜辺が37で1辺が35ってことは、かなり鋭角な直角三角形ですね。……まさか腕をこの直角三角形の斜辺のごとく鋭角に曲げよとの啓示なのか!



素数腕立て伏せ一言メモ
最後は床に伏せることになるんで床が汚いとツライ。素数腕立て伏せを続ければクイックルワイパーする習慣がつくのでは。




【MathJax参考サイト】
Irreducible representation: MathJax in Blogger (II)
BloggerでMathJaxを使ってTeXっぽく数式を入れる方法 - Ichiro Maruta Homepage

2014-12-01

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

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。

素数腕立て伏せについて : サルノオボエガキ
素数腕立て伏せ進行状況 - Togetterまとめ

このアドベントカレンダーでは今日から毎日、素数腕立て伏せをしてその実施報告をしていきます。誰が得をするのか分からないけど、今日の昼頃に急に思い立ったのでしょうがない。インターネットでは誰かが得をすることはもう誰かがやっているので、私がやる必要はないのです。

1日目
28回で負け(合成数)。

1日目から負けとは悔しい。23回あたりで「29回までならイケるやろ」と気を抜いたのがダメだったみたい。ひさしぶりだったせいか、素数力(素数回目までがんばろうという気力)の出し方を忘れているようだ。

負けだけど、せっかくなので28をWolframAlpha先生に聞いてみよう。
28 - Wolfram|Alpha
28は3通りの方法で4つの平方数の和で表せる最小の数字。だけど3つの平方数の和で表すのは不可能だそうです。なんでだろね?(※)


素数腕立て伏せ一言アドバイス
メガネは外しておきましょう。力尽きた時に刺さります。(危なかった)


なおこのACは29日か31日まで続けます。25は5*5だからヤダ。




※ 長風呂してちょっと考えてみた。
二乗して28より小さい自然数は1〜5。28は偶数だから3つの平方数は$(偶,偶,偶)$か$(偶,奇,奇)$の組み合わせになるはず。つまり最低一つは偶数が含まれる。その偶数を$2a$として表そう。$b,c$を3つ組みの残りとして次のように式変形してみる。

\[
\begin{eqnarray}
28 = 2^2*7 & = & (2a)^2+b^2+c^2 \nonumber \\
2^2(7-a^2) & = & b^2+c^2 \nonumber
\end{eqnarray}
\]

$2a = 2 \ or\ 4$ だから $a=1\ or\ 2$。ということは次の2つの場合が不可能と言えればOKそう。

\[
\begin{eqnarray}
2^2(7-1^2) = 2^3 *3 & = & b^2+c^2 \\
2^2(7-2^2) = 2^2 *3 & = & b^2+c^2
\end{eqnarray}
\]

ここまで考えてよく分かんなくなってきたので、Wikipediaのこのページでカンニングした。
二個の平方数の和 - Wikipedia

(1)の場合は合成数についての証明に「素因数として3を平方以外で持ってる数は二平方和で表せない」とあるので大丈夫。
(2)も同じ理由で不可能。
これで証明終了できた...っぽい。

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との違いについて次のように書いてあります。

2012-05-07

#残パン会 に残念ながら参加してきました

残念言語ハッカソン&貧民パンの会」、略して残パン会に参加してきました。まったくひどい略称ですね、誰がつけたんだろう???

当日は朝から大雨が振っており、かなり濡れながら会場に到着しました。
そこには床に新聞紙を広げて胡座をかいてノートPCを弄っている数人の男性と、床の上に無造作に並べられたパンが…。あぁ、ATNDの説明はネタじゃなかったのか。

6時間以内に何か発表できるものを作らないとってことだったので、みんな黙々とハッカソンを進めてました。
止まった空調、雨で濡れた衣服、男どもが18人も一箇所に集まっている…。
「俺は大切なGWに何をしてるんだろうか」という思いはみんな感じていたと思うんですが、それは言わない約束です。


私はZozotezというLisp実装をつかって何かできないかな〜と思って会場にやってきたんですが、処理系を動かすまでに予想以上に時間がかかってしまい、時間までに大したことできないまま終わってしまいました。残念というか無念!
ちなみにZozotezというのはBrainf*ck上で動くLisp実装です。作者はZozotezを作るためにEBF(Extended Brainf*ck)という拡張言語まで作ってます。
EBF自体がEBFで書かれており、Pure Brainf*ck(変な言葉)にコンパイルすることが可能。なんというか、すべてをBrainf*ck上でやってしまおうという哲学が垣間見えますね。

当初の目標はZozoez上で動く簡単な言語(逆ポーランド記法計算機など)を作って、Hoge言語 on Zozotez on Brainf*ckをやろうと思ってたんですが、Zozotezがmakeでコケる・同梱のバイナリがMacで動かないなどいろいろありまして、Zozotezコードを書けるようになったのが残り2.5時間ぐらい。
けっきょくMacでは動かせずVirtualBox上でUbuntuを立てて同梱のバイナリを動かしました。

まずは1+1を書くかと思ったらZozotezには数値リテラルがないと。Zozotezはいわゆる純Lispで、シンボルとリストしかない。だからまずは数字表現から決めてやらないといけない。
そこでいろいろやった結果、なんとか1+1を書くことに成功。ここまででだいぶ力尽きました。
だって会場が蒸し暑いし、足がしびれてくるし、ちょっと体力の限界に近づいてたんですよ!



残パン会で使う言語を決めるためにいろいろなマイナー言語を調べるのは面白かったです。他の参加者の発表を見て、HSPForthLazy Kはちょっと使ってみたいなって思いました。
マイナー言語ってそれぞれ独特な哲学があります。そこに触れるだけでも新たな視点を知ることが出来てよかったと思います。
私もBrainf*ckのことを考えると胸が高鳴るようになってしまって…。この気持、恋かな?(ヒント:ストックホルム症候群



もう一度、残パン会が開かれることがあったら、ぜひとも参加することを前向きに検討しないでもないと思います!!


【参考リンク】
まとめ
#残パン会 貧民パンを食べながら残念な言語でハッカソンする何か - Togetter

会場の雰囲気はこのツイートが一番正確に表している。


2011-12-25

fill-queueでお手軽非同期処理

この記事はClojure Advent Calendar 2011の25日目の記事として書いています。
あんまりホリデイっぽくないので、Overtoneの記事と入替えて読むとちょうどいいですよ。

前にClojureのシーケンス操作関数の使い方一覧を書いたけど、最後に例示を挙げられなかったものがふたつ残りました。
seq-onは「何かをシーケンスとして扱いたいとき」というわり合い特殊なものなので良いとして、fill-queueはもう少し便利に使えそうなものなので何とか例示ができないかなーと思って簡単なファイルの変更監視スクリプトを書いてみました。

まずはfill-queueのdocを見てみましょう。
user=> (doc fill-queue)
-------------------------
clojure.contrib.seq/fill-queue
([filler-func & optseq])
  filler-func will be called in another thread with a single arg
  'fill'.  filler-func may call fill repeatedly with one arg each
  time which will be pushed onto a queue, blocking if needed until
  this is possible.  fill-queue will return a lazy seq of the values
  filler-func has pushed onto the queue, blocking if needed until each
  next element becomes available.  filler-func's return value is ignored.
nil

どうやら別スレッドで実行させる関数filler-funcを指定して、その関数でゴニョゴニョした値をqueueシーケンスとして受け取れるということらしい。filler-func内から値を返すときは引数fillに渡す。
非同期処理をシーケンスの流儀で取り扱えるっていうやつみたいですね。

これだけだとイメージが沸かないので使用例をぐぐってみたらこんな記事が見つかりました。
The Infolace Story: Simple webhooks with Clojure and Ring
この海外記事を読むとRingサーバー処理になにかフックさせるときに使ってる。途中の図がわかりやすい。

これでも使用例としてはいいんですけど、もうちょっと手元でいじれる例が欲しいのでファイルの最終更新日時を監視するスクリプトを書いて見ました。



watching-loopがfiller-funcで実行される本体です。ループで1秒ごとにファイルの最終更新日時を監視、変わっていたらfillにプッシュ。スレッド名を出力するコードを入れてるので別スレッドで実行されてることがはっきりしますね。
実行するとこんな感じ。


$ echo happy > test.txt
$ clj watch-file-status.clj test.txt
watching... (seq-test.txt)
main thread: main
watching-loop thread: pool-2-thread-1
;; $ echo chrismas! >> test.txt
modified: seq-test.txt
datetime: 2011-12-25 11:29:28
;; Ctrl-C
$ cat test.txt 
happy
chrismas!


これでfill-queueの使用例を書くことができました。前々から気になってたのをアウトプットできてスッキリ。
もうクリスマスがどうとか言ってる時期じゃないよ! 大掃除、棚卸しが大事だよ! リア充が爆発したら掃除が大変だよ!

ではみなさん良い年末を。俺は年賀状を書きます。

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

Shibuya.lisp#7に参加してきました

Shibuya.lisp » Blog Archive » 2011/10/22 Shibuya.lisp テクニカルトーク #7 開催しました!!

最初に参加したのが#5なので、これで三回目です。


TechTalkでは最初の@m2ymさんの発表が気になりました。

括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか


タイトルだけだと「信者乙!」と言いそうになりますが、中身は実際に開発する上での問題点をバランスのとれた視点で解説していて面白かったです。
私もLispに興味を持った最初のころはCommon Lispを使っていたんですが、ライブラリがどこにあってどうやって使うのかが分かりにくくて、結局フィボナッチ数列を計算させたぐらいで終わっていました。
これからCommon Lispを始めようというひとは目を通しておくと良いと思います。
また「マクロは万能ではない」という部分に関してはClojure-conjにあったこの発表を思い出しました。

(not= DSL macros) - Slideshare


そのほかの発表もLisp+ハードウェア、Lisp+セキュリティなど面白い組み合わせで興味深かったです。


会場に来た方たちともいろいろお話しできて面白かったです。私が話しかけた人は初参加というひとが多かったんですが、もっとがんがん話しかけちゃっていいと思いますよー。こういうイベントに集まるってことはまさにそういうコミュニケーションを求めているはずですから、話しかけられて嫌な人は居ないはずです。
あと初参加の人は次は発表する側にまわってみるのもいいですね。不安な人のために私がLTしたときのを貼っときましょう。

ClojureとEPUBで「普通のやつらの上を行く」方法

LTの良いところはどんなにスベっても5分で終わるところにあります(キリッ
またスベったらスベったで覚えてもらいやすくなります(キリッ

まぁ、自分が作っているものって欠点がよく見えてしまいがちですが、他人から見ると充分面白いかったりするので思い切って発表しちゃうのもいいですねー(今回LTしなかった自分への自戒も込めて)。



毎度のことながら運営者の方々、お疲れ様です。
次回、渋谷の街に迷わなかったら早めに行って準備を手伝いたいと思います(田舎者には難易度高いですが)。

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-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 - 「素数腕立て伏せ進行状況」
「素数腕立て伏せ」とは何か 「素数力」が腕立て回数を伸ばす - モジログ