ガラパゴスな売り方とオライリーな売り方との違い。そして、Amazon Kindle はうまくやっているという話
オライリーは電子書籍と一緒に「安心」を売っている - ただのにっき(2011-09-16) を読んで考えたことをまとめてみます。
オライリーは電子書籍という新しいメディアに対して旧態依然とした売り方をすることを選択しました。すなわち、「電子書籍も紙の本と同じですから安心して買ってください」という売り方です。オライリーの DRM フリー普及フォーマット(EPUB, PDF)による販売は本と同様の「所有感」と「利便性」を購入に与え、それを「今までと変わらない」という安心感につなげることに成功しました。
一方、ガラパゴスな事業者*1は電子書籍は新しいメディアなのだから、今までにはないなにかを開発することを選択しました。しかし、新しいメディアにふさわしい表現方法や読書体験を開発するのではなく、新しい販売形態をビジネス開発してしまいます。すなわち、電子貸本ビジネスであり、「電子書籍は本を売っているのではなく、読む権利を売っている。ちゃんと規約読め」な売り方です。貸本なので DRM やリーダーの限定は必然です。
つまり、オライリーとガラパゴスの違いは単に DRM の有無に留まらず、「書籍販売」か「電子貸本」かというビジネス形態の違いということになります。このビジネス形態の違いは販売価格帯の差につながります。どういうことかというと、本に近いオライリーな売り方の場合、電子書籍の販売価格を印刷本に近づけることができます。具体的には印刷本の 2/3-1/3 に設定できます。一方、貸本に近いガラパゴスの売り方の場合、電子書籍の販売価格は印刷本よりかなり低く設定しないと、「高い」と思われてしまいます。具体的には、印刷本の 1/5-1/10 が値頃レンジです。TSUTAYA などのレンタル CD/DVD の価格設定が参考になります。
さて、異色なのが Amazon Kindle です。Amazon Kindle はどう考えても電子貸本サービスです。しかし、利便性を印刷本に近づけ、ある部分では印刷本を越えるという利便性を提供するという努力を続けました。これにより「電子貸本」であるにもかかわず「書籍販売」に近い価格設定を可能にする、という新たなビジネス領域を可能にしました。
オライリーな売り方が望ましいのかガラパゴスな売り方が望ましいのか、筆者には断言することができません。両者が共存して読者が状況に応じて適切な方を選択できるようになるのを希望するのですが、その両方のバランスをうまくとった Amazon Kindle はうまくやっていると思います。私も欲しいです Kindle, 誰かください。
7つの言語7つの世界 第4章 Prolog 1-3 日目セルフスタディやってみた
7つの言語 7つの世界 第4章 Prolog 1-3 日目のセルフスタディやってみました。Prolog を触るのは今回が初めてだったのですが、やっていて楽しかったです。もっとやりたいかと聞かれれば、もういいですと答えますけど。
Prolog のインストール
例によって、セルフスタディにかけた時間よりも、インストールに費した時間のほうが長かったです。
→MacPorts の gprolog 1.4.0 で Segmentation Violation - passingloopの日記
1 日目
探してみよう
いくつか見つかりますが、Introduction to Prolog (in Japanese) がおすすめです。
サポートフォーラム(複数ある)
日本語のサポートフォーラムはどこにあるんだろう?
Prolog のオンラインリファレンス(自分が使っている処理系に合ったものを選ぶこと)
GNU Prolog のオンラインリファレンスは、GNU-Prolog Manual.
試してみよう
自分のお気に入りの本と作家を表す簡単な知識ベースを作成せよ.
はてダのスーパー pre 記法が prolog をサポートしていることを知りました。
publish(arai_motoko,hitome_anatani). publish(hoshi_shinichi,bokko_chan). publish(ito_keikaku,harmony). publish(komatsu_sakyo,nippon_chinbotsu). publish(tsutsui_yasutaka,toki_wo_kakeru_shojo). publish(tsutsui_yasutaka,paprika). publish(tsutsui_yasutaka,nanase_futatabi). publish(yumeno_kyusaku,dogura_magura).
作成した知識ベースから特定の作家の著作をすべて検索せよ.
コマンドラインから gprolog を実行して検索します。
% gprolog | ?- ['favorites.pl']. (1 ms) yes | ?- publish(tsutsui_yasutaka,What). What = toki_wo_kakeru_shojo ? a What = paprika What = nanase_futatabi yes
これも、はてダのスーパー pre 記法で貼り付けてみます。
play(coba,accordion). play(bruce_hornsby,accordion). play(bruce_hornsby,piano). play(hakase_taro,violin). play(senju_mariko,violin). play(sakamoto_ryuichi,piano). play(matsumoto_takahiro,guitar). play(sergio_assad,guitar). play(muraji_kaori,guitar). genre(coba,soundtrack). genre(bruce_hornsby,jazz). genre(bruce_hornsby,rock). genre(hakase_taro,classic). genre(hakase_taro,soundtrack). genre(senju_mariko,classic). genre(sakamoto_ryuichi,piano). genre(sakamoto_ryuichi,soundtrack). genre(matsumoto_takahiro,rock). genre(matsumoto_takahiro,jpop). genre(sergio_assad,tango). genre(muraji_kaori,guitar).
ギターを演奏するすべての音楽家を検索せよ.
これも、gprolog で検索します。
% gprolog | ?- ['musicians.pl']. (1 ms) yes | ?- play(Who,guitar). Who = matsumoto_takahiro ? a Who = sergio_assad Who = muraji_kaori yes
2日目
探してみよう
フィボナッチ数列と階乗計算の実装.動作方法を説明せよ
まずはフィボナッチ数列から:
- 2行目: Fib(0) = 0
- 3行目: Fib(1) = 1
- 4行目: Fib(N) = F の F を求めるには、
- 5行目: N > 1 のとき、
- 6行目: N1 = N - 1,
- 7行目: N2 = N - 2 とすると、
- 8行目: F1 = Fib(N1),
- 9行目: F2 = Fib(N2) として求められた F1, F2 を使って、
- 10行目: F = F1 + F2 とすればよい。
つぎに階乗計算:
- 2行目: 定義 Fact(0) = 1
- 3行目: F = Fact(N) の F を求めるには、
- 4行目: N > 0 のとき
- 5行目: N1 = N - 1 なる N1 について
- 6行目: F1 = Fact(N1) を求め、
- 7行目: F = F1 * N とすればよい。
少し高度な問題に取り組んでみたいなら,次の問題に挑戦してみるとよい.
ハノイの塔を実装し,その動作方法を説明せよ.
ハノイの塔とは何かを調べるために、Tower of Hanoi - Wikipedia を読んでいたら解き方も載っていたので、そのまま実装しました:
プログラム中の hanoi(N, A, B, C) は、A にある N 枚のディスクを B に移動させることを意味しています。
- 2行目: N = 0 のとき、つまり、ディスクが無いときは何もしなくてもいいと言っています。
- 3-4行目: N > 0 のときの hanoi/4 は、
- 5行目: N1 = N - 1 として、
- 6行目: まず、N1 枚のディスクを A から C に動かして、
- 7行目: 次に、N 枚目のディスクを A から B に動かす(動かしたこと write する。nl は改行)
- 8行目: そして、C にある N1 枚のディスクを B に動かすことで実現される。
これを実行してみると、
% gprolog GNU Prolog 1.4.0 By Daniel Diaz Copyright (C) 1999-2011 Daniel Diaz | ?- ['tower_of_hanoi.pl']. yes | ?- hanoi(3, rod1, rod2, rod3). move,1,from,rod1,to,rod2 move,2,from,rod1,to,rod3 move,1,from,rod2,to,rod3 move,3,from,rod1,to,rod2 move,1,from,rod3,to,rod1 move,2,from,rod3,to,rod2 move,1,from,rod1,to,rod2 true ?
となります。
「not」(~でない)という表現を扱うときの問題点を指摘せよ.Prolog では否定表現に気をつけなければならないが,それはなぜか.
Google 先生に聞いてみると、Prolog の否定 \+ は論理否定ではなく失敗としての否定 (negation as failure) であることがわかりました。
- あるゴールの否定は、あるゴールの証明が失敗すること
- 否定のゴールの中に変数を含むときに問題が起こりえること
までは書いてあったのですが、文章を見てもよくわからなかったので、例を作ってみました。
飛ばない鳥はペンギンだという推論です。これを実行すると、
% gprolog GNU Prolog 1.4.0 By Daniel Diaz Copyright (C) 1999-2011 Daniel Diaz | ?- ['penguin.pl']. (1 ms) yes | ?- penguin1(X). no | ?- penguin2(X). X = kiwi ? yes | ?-
となり、penguin2/1 は想定通りに推論できるのですが、penguin1/1 は何も見つけられません。
これは、pengin1/ では 7行目の fly(X) が X = duck で証明されてしまい、失敗しないからです。penguin2/ の場合、bird(X) で X = kiwi か X = duck となるので、X = kiwi のとき fly(X) の証明に失敗することができます。サブゴールの順番にも気をつける必要があるということですね。
試してみよう
リストの各要素を逆順に並べよ.
% gprolog GNU Prolog 1.4.0 By Daniel Diaz Copyright (C) 1999-2011 Daniel Diaz | ?- reverse([a, b, c], X). X = [c,b,a] yes | ?-
リスト内で最も小さな要素を見つけよ.
実行結果:
% gprolog GNU Prolog 1.4.0 By Daniel Diaz Copyright (C) 1999-2011 Daniel Diaz | ?- ['min.pl']. (1 ms) yes | ?- min(X, [5, 2, 7, 4, 9]). X = 2 ? yes | ?-
リスト内の要素をソートせよ.
% gprolog GNU Prolog 1.4.0 By Daniel Diaz Copyright (C) 1999-2011 Daniel Diaz | ?- sort([3, 1, 5, 2, 0], S). S = [0,1,2,3,5] yes | ?-
これは簡単なのですが、前段で min/2 を作っているので選択ソートも作ってみました。
3日目
探してみよう
Prolog には,入出力機能もいくつか用意されている.変数を出力する述語 print を見つけよ.
→ http://www.gprolog.org/manual/gprolog.html#htoc163
print を用いて正しい答えだけを出力する方法を考えよ.この述語はどのような 方法で動作しているか?
これは次の試してみようでやってみる。
MacPorts の gprolog 1.4.0 で Segmentation Violation
7つの言語 7つの世界 第4章 Prolog のセルフスタディをやろうとして、MacPorts で GNU Prolog 1.4.0 をインストールしてみました。
$ sport install gprolog
(sport は sudo port への alias です。詳しくは、MacPorts 2.0.1 インストールメモ: PATH とファイルシステムの case-sensitivity に注意 - passingloopの日記)
しかし、
GNU Prolog 1.4.0 で例えば次のような計算をすると,次のようなエラーが出て,prolog自体が終了してしまいます.
?- X is 0 + 1 Fatal Error: Segmentation Violation
■【Mac】【Prolog】is を使った計算をするとエラーが出る: メモ帳
この人と同じエラーに遭遇しました。
調べてみると、gprolog 1.4 は x86_64 をサポートしていなかったので、CC='gcc -arch i386' してみたところ、エラーが再現しなくなりました。
かなりのやっつけ仕事ですが、Mac OS X への Io のインストール - passingloopの日記 で紹介した passingloop-ports に追加して、
$ sudo port install gnuprolog
で修正版をインストールできるようにしました。
Graffletopia で見つけたおすすめ OmniGraffle ステンシル
Graffletopia で見つけたおすすめ OmniGraffle ステンシルを 4 つ紹介します.
はじめに
Mac OS X で定番のドローツールといえば OmniGraffle です*1.これを使うと,パワーポイントで描くよりも綺麗に速く図を仕上げることができるので重宝しています.OmniGraffle はインストール直後の状態でも十分仕事に使えるレベルです.しかし,ステンシルと呼ばれるクリップアートと追加図形がセットになった拡張セットを追加することで,より表現の幅が広がります.今回は,おしゃれな図を作成するために便利なおすすめステンシルを紹介します.
まずは,一押しステンシルから.
一押し (1)
角丸四角形ときれいなグラデーション
おしゃれな図に必要なものは何か?それは,Apple に代表される角丸四角形とグラデーションです.
標準のステンシルにも角丸四角形が含まれています.しかし,残念ながら白黒でグラデーションはありません.そこで,おすすめなのが,Boxes, Arrows | Graffletopia です.
名前こそ "Boxes, Arrows" ですが,中身は今流行りの角丸四角形と円形,しかも,塗り潰しはグラデーションです.図形色にあわせた矢印もついているので,このステンシルだけで 8 割くらいの図は作成できます.
以降,惜しくも一押しからは漏れたものの,インストールしておきたいステンシルを紹介します.
おすすめ (3)
人形 2 種
角丸四角形と円形は何にでも重宝するのですが,人物を表わすのには向きません.
人を表現するなら人形(ひとがた)が一番です.といっても,パワーポイントに入っている棒人間を使ってしまうと,せっかくのおしゃれ感が台無しです.おしゃれな図にはおしゃれな人形を,というわけでおすすめなのが,Little People | Graffletopia です.
色使いとグラデーションが一押しで紹介した "Boxes, Arrows" と合わせて使うのに最適です.
もう少し,かしこまった硬い感じの資料に仕上げたい場合には,UX Humans | Graffletopia がおすすめです.
生命保険のパンフレットに出てきそうな人達もいます.
アクセント
資料の終わりには感謝の意を表したいという礼儀正しい方におすすめなのが,Post-it Notes | Graffletopia です.
サンプルは Thank you! ですが,ステンシルなのでもちろん文字を変更できます.資料の中でアクセントをつけたりメッセージを伝えたりするのに便利です.
おわりに
図に関しては内容も大事ですが,見た目の印象も大事です.私はデザインに関しては自信が無いほうなので,今回紹介したステンシルは重宝しています.見た目をステンシルに任せることができれば、あとは内容に集中することができますからね。
引数のバインディングと実行を遅延させる Io 言語: 7 つの言語 7 つの世界 第 3 章を読んだ感想
7つの言語 7つの世界 第3章 Io 言語を読んでいて最初に疑問に思ったのが,
制御構造が無い Io 言語がどのように Ruby の && 相当を実現しているか
です.
前のエントリに書いたように,
Ruby で AND, OR の論理演算を行うための論理演算子には {&&,||} と {&,|} の 2 種類あります。この 2 種類は似ていてまぎらわしいのですが、{&&,||} は制御構造で、{&,|} はメソッド ...
Ruby の論理演算子、&& と || は制御構造で & と | はメソッド - passingloopの日記
です.& はメソッドなので必ず両辺が評価されますが,
ruby-1.9.2-p290 :004 > (puts 'foo') & (puts 'bar') foo bar => false
&& は制御構造なので左辺が false の場合右辺を評価しないということが可能になります.
ruby-1.9.2-p290 :005 > (puts 'foo') && (puts 'bar') foo => nil
Io は制御構造が無く全てがメッセージなのに,Ruby の && 相当をどうやって実現しているか.というのが冒頭の疑問でした.
この疑問は,第3章を読みすすめていくと,すぐに解決しました.なんのことはない,Io 言語の and が Ruby の && 相当だったのです.
Io> true and writeln("evaluated") evaluated ==> false Io> false and writeln("evaluated") ==> false
どうして,こんなことが可能なのかは p.59 に書いてありました.
ほとんどの言語では,引数をスタック値として渡す.例えば Java では引数の各値を最初に計算してから,それらの値をスタックに詰む.Io ではそのようなことはせず,メッセージ自体とそのコンテキストをそのまま渡す.そしてレシーバ側でそのメッセージを評価する.
...
Io では,メッセージの引数を解釈するが,バインディングと実行は遅延させる.
Ruby のように引数を実行してからメソッドを実行するというのが常識だと思っていましたが,Io はそうではありませんでした.第 3 章を読むまでは,引数のバインディングと実行を遅延させるという発想はありませんでした.このような自分の中にあるプログラミング言語に対する誤った思い込みを正せるのも,様々なプログラミング言語を学ぶ利点だと思います.第 4 章以降を読むのが楽しみになってきました.
7 つの言語 7 つの世界 第 3 章 Io 言語 1-3 日目のセルフスタディやってみた
1日目
探してみよう
Io のいくつかの問題点の例
- 名前を Google で検索しにくい
- コミュニティが小さく OS の最新バージョンでしかテストされていない→id:passingloop:20110908:p1
質問に答えてくれる Io コミュニティ
英語だと http://tech.groups.yahoo.com/group/iolanguage/ があります.
少なくとも日本語の質問に答えてくれる Io コミュニティは見つかりません.
Io のイディオムに関するスタイルガイド
英語だと Io Programming/Io Style Guide - Wikibooks, open books for an open world があります.
日本語のスタイルガイドは見つかりません.
確認してみよう
1 + 1 を評価してから,1 + "one" を評価する.Io は強く型付けされた言語か,それとも弱く型付けされた言語か? コードを書いて答えを確かめてみてほしい.
確かめてみました.
Io> 1 + 1 ==> 2 Io> 1 + "one" Exception: argument 0 to method '+' must be a Number, not a 'Sequence' --------- message '+' in 'Command Line' on line 1
答: 型の不一致に対して例外を投げているので Io は強く片付けされた言語です.
0 は真か偽か? 空文字列はどうか? nil は真か偽か? コードを書いて答えを確かめてみてほしい.
確かめてみました.
Io> 0 and true ==> true Io> "" and true ==> true Io> nil and true ==> false
答: 0 と "" は真,nil は偽です.
プロトタイプに存在するスロットを確認するにはどうすればよいか?
答: proto slotNames を使います.
Io> Vehicle := Object clone ==> Vehicle_0x1002760e0: type = "Vehicle" Io> Vehicle description := "Something to take you places" ==> Something to take you places Io> Vehicle slotNames ==> list("type", "description") Io> Nissan := Vehicle clone ==> Nissan_0x10039eaf8: type = "Nissan" Io> Nissan proto slotNames ==> list("type", "description")
=(等号),:=(コロン等号),および::=(コロンコロン等号)の違いは何か?それぞれどのようなときに使うか?
答: 次の表に整理して説明します.
= | スロットが存在すれば代入,スロットが無ければ例外 |
:= | スロットを作成して代入 |
::= | スロットを作成して代入,スロットの setter も同時に作成 |
試してみよう
ファイルから Io のプログラムを実行せよ
ファイルの例として hello_world.io というファイルを用意します.
この,hello_world.io をコマンドラインから実行します.
$ io_static hello_world.io Hello, world
スロットの名前を指定して格納されているコードを実行せよ.
getSlot で名前を指定して,call で実行します.
2日目
試してみよう
フィボナッチ数列は 2 つの連続する 1 で始まる.以降,それぞれれの数は直前の 2 つの数の和になっている.1, 1, 2, 3, 5, 8, 13, 21,... という具合ただ.フィボナッチ数 列の n 番目の数を見つけるプログラムを書け.例えば,,fib(1) は 1,fib(4) は 3 となる.また,この問題を再帰とループを用いて解け.
答: 再帰版:
実行結果:
% io_static fib_rec.io 1 3 21
ループ版
実行結果:
% io_static fib_loop.io 1 3 21
分母がゼロのときゼロを返すように/演算子を変更するには,どうすればよいか.
まず,数値の型を調べてみます.
Io> 0 type ==> Number Io> Number getSlot("/") ==> Number_/() Io> Number getSlot("divide") ==> nil
Number に divide スロットは無いようなので,元の / を divide に移動して,新しい / を定義します.
実行結果:
% io_static zero_division.io
0
1.6666666666666667
2 次元配列のすべての要素の数値の総和を求めるプログラムを書け.
答: flatten sum
Io> list(list(1, 2), list(2, 3, 4), list(6, 7)) flatten sum ==> 25
リストに,そのリストのすべての数値の平均を算出するスロット myAverage を追加せよ.リストに数値が含まれていない場合は何が起こるか? (おまけ:リスト内に数値以外の項目を見つけたら,Io 例外を発生させるようにしてみよ.)
答: 平均を算出するだけでいいのなら,
Io> List myAverage := List getSlot("average") ==> # io/A3_List.io:7 method( self sum / self size ) Io> list(1, 2, 3, 4) myAverage println 2.5 ==> 2.5
答(おまけ):
2 次元リストを実現するプロトタイプを書け.dim(x, y) メソッドは,要素数が x のリスト y のリストを割り当てる.set(x, y, value) はリストに値を設定し,get(x, y) はリストの値を取得する.
答: 行列を 1 次元リストで表現してみました.次の問題で苦労しそうです.
ボーナス問題: (new_matrix get(y,x)) == matrix get(x,y) が成立するように,元のリストの転置メソッドを書け.
答: 全然ボーナスではなかったです.
実行結果:
% io_static transpose.io foo foo
行列をファイルに書き出し,ファイルから行列を読み込め.
答: 今度は 2 次元リストをリストのリストで表現してみます.
実行結果:
% io_static file_matrix.io foo bar
1~100 の数のなかからランダムに数を 1 つ 取り出し,それを 10 回以内に当てさせるプログラムを書け.できれば,2 回目以降前回より正解に近づいたか遠ざかったかをヒントとして与えるようにしてみよ.
答: MacPorts で Io をインストールすると,Random が使えずに詰みました → Mac OS X への Io のインストール - passingloopの日記
実行結果: 偶然ですが正解できました.
% io_static quiz.io input (1-100) > 50 input (1-100) > 51 closer input (1-100) > 70 closer input (1-100) > 85 further input (1-100) > 80 closer input (1-100) > 75 correct
3日目
本文に掲載した XML プログラムを改良して,インデントを示すスペースを追加するようにしてみよ.
答:
実行結果:
% io_static builder_with_indent.io <ul> <li> Io </li> <li> Lua </li> <li> JavaScript </li> </ul>
角括弧を使ったリスト構文を作成せよ.
答: squareBrackets を使うだけでできました.DSL をつくりたくなりますね.
実行結果:
io_static list.io List list("foo", "bar", "baz")
本文に掲載した XML プログラムを改良して属性を処理できるようにしてみよ.具体的には, 第 1 引数がマップ(丸括弧構文を使用)の場合は, それらの各属性を XML プログラムに追加する.次に例を示す.
book({"author": "Tate"}...) と書くと,
と出力される
答:
実行結果:
% io_static builder_with_attributes.io <book "Author"="Tate"> <ul> <li> Io </li> <li> Lua </li> <li> JavaScript </li> </ul> </book>
Mac OS X への Io のインストール
本記事の Io とは Io 言語のことです.*1
さて,本題に入ります.Mac OS X に Io をインストールするのなら,MacPorts が便利です.
$ sudo port install Io
するだけでインストールできます.しかし,MacPorts がインストールする Io には問題があります.それは,dylib が働かず addon のロードに失敗するという問題です*2.
これを解決するには,MacPorts ではなくソースからインストールしなければなりません.しかし,Io 言語には次のような問題があるので簡単ではありません.
- Io はリビジョンによってビルドできたりできなかったりする.最新のリビジョンをもってくればいいかというとそうではない
- Io はコミュニティが小さいので,サポート各 OS についても最新のバージョンしかサポートできない.Mac OS X でいうと,Lion 以外は自力で解決しないといけない
そこで,Io のインストール手順をパッチとともに紹介しようと思ったのですが,手順が長くなるので自家製 port (以下,passingloop-ports)にまとめ,GitHub で公開しました.この passingloop-ports を使うと,
$ sudo ports install Io@20110908
するだけで Io をインストールすることができます.
本記事では執筆時点で私の環境:
を対象に,passingloop-ports の導入法と,Io のインストール方法を紹介します.
passingloop-ports の導入
passingloop-ports を導入するには,
します.
(1) GitHub から passingloop-ports を入手
$ git clone https://passingloop@github.com/passingloop/passingloop-ports.git
(2) PortIndex を作成
$ cd passingloop-ports
$ portindex
(3) sources.conf に passingloop-ports を追加
(1) で作成した passingloop-ports の URL を ${prefix}/etc/macports/sources.conf に追加します.デフォルトでは sources.conf の最終行に rsync の URL が書かれていますので,その一行上に追加するのが分かりやすいでしょう.
file:///Users/passingloop/passingloop-ports rsync://rsync.macports.org/release/tarballs/ports.tar [default]
上の例では,ユーザ passingloop のホームディレクトリに passingloop-ports を置いています.
passingloop-ports による Io のインストール
これで,passingloop-ports を使う準備ができました.試しに,
$ port list Io Io @20110908 lang/Io Io @2009-11-04 lang/Io
と Io を探してみると 2 つ表示されました,上の @20110908 が passingloop-ports によるものなので,こちらをインストールします.
$ sudo port install Io@20110908
依存関係のあるパッケージも port がまとめてインストールしてくれます.インストールが無事終ったら早速使ってみましょう.
% io_static Io 20110905 Io> Random ==> Random_0x1004df370: bytes = Random_bytes() flip = Random_flip() gaussian = Random_gaussian() setSeed = Random_setSeed() value = Random_value()
ちゃんと Random プロトタイプが使えます.これで 7つの言語 7つの世界 第 3 章 Io 言語のセルフスタディにとりかかれます.
MacPorts の問題点
余談ですが,sudo port install Io@20110908 でインストールされる依存パッケージに yajl1 があります.MacPorts の公式 ports にも yajl が含まれているのですが,この yajl port が古いバージョンだったり壊れていたりいるので,yajl1 として passingloop-ports で作りなおしています.
MacPorts は 1万2000種類以上もの多くのソフトウェアが使えるというのが魅力なのですが,ソフトウェアの人気が無くなったり port メンテナが忙しかったりで,古いバージョンのまま放置されている ports が混じっています.今回 passingloop-ports で作り直した Io と yajl も,そういった古いバージョンの ports です.
「Ports の種類は多いけど,その中には古いまま放置されている ports が含まれているので注意が必要」というのが MacPorts の問題点かもしれません.
おわりに
本記事では MacPorts で Io をインストールするための passingloop-ports とその利用法を紹介しました.くわえて,Io の問題点として,
- リビジョンによってビルドできたりできなかったりすること
- 最新でないバージョンの OS へのサポートが不十分
すなわち,「インストールに手間がかかる」ことを指摘しました.また,MacPorts の問題点として,
- 動かない古いバージョンの ports が放置されていること
を指摘しました.
Io を MacPorts でインストールしようとすると,これらの Io と MacPorts の問題点を両方踏んでしまうので,自家製 ports を作って対処することになりました.この ports は 7つの言語 7つの世界 第 3 章 Io 言語のセルフスタディをやるためだけに作ったようなものなのですが,きっと,セルフスタディよりも ports 作成のほうが時間かかっています.
ここまで長々と MacPorts による Io のインストール方法を説明してきたのですが,もし,Lion を使っているのなら Homebrew でインストールできる そうです.実を言うと,こちらのほうが楽そうです.