ガラパゴスな売り方とオライリーな売り方との違い。そして、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, 誰かください。

*1:特定の事業者ではなく、ある種の国内の主要「電子書籍」事業者の総称として用いています。

7つの言語7つの世界 第4章 Prolog 1-3 日目セルフスタディやってみた

7つの言語 7つの世界 第4章 Prolog 1-3 日目のセルフスタディやってみました。Prolog を触るのは今回が初めてだったのですが、やっていて楽しかったです。もっとやりたいかと聞かれれば、もういいですと答えますけど。

Prolog のインストール

例によって、セルフスタディにかけた時間よりも、インストールに費した時間のほうが長かったです。

MacPorts の gprolog 1.4.0 で Segmentation Violation - passingloopの日記

1 日目

探してみよう

無償の Prolog チュートリアル

いくつか見つかりますが、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) の証明に失敗することができます。サブゴールの順番にも気をつける必要があるということですね。

試してみよう

リストの各要素を逆順に並べよ.

GNU Prolog の reverse/2 を使います。

% 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
| ?- 

リスト内の要素をソートせよ.

GNU Prolog の sort/2 を使います。

% 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 のセルフスタディをやろうとして、MacPortsGNU 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 です.
http://graffletopia.com/images/previews/571/original.png
名前こそ "Boxes, Arrows" ですが,中身は今流行りの角丸四角形と円形,しかも,塗り潰しはグラデーションです.図形色にあわせた矢印もついているので,このステンシルだけで 8 割くらいの図は作成できます.

以降,惜しくも一押しからは漏れたものの,インストールしておきたいステンシルを紹介します.

おすすめ (3)

人形 2 種

角丸四角形と円形は何にでも重宝するのですが,人物を表わすのには向きません.
人を表現するなら人形(ひとがた)が一番です.といっても,パワーポイントに入っている棒人間を使ってしまうと,せっかくのおしゃれ感が台無しです.おしゃれな図にはおしゃれな人形を,というわけでおすすめなのが,Little People | Graffletopia です.
http://graffletopia.com/images/previews/395/original.png
色使いとグラデーションが一押しで紹介した "Boxes, Arrows" と合わせて使うのに最適です.

もう少し,かしこまった硬い感じの資料に仕上げたい場合には,UX Humans | Graffletopia がおすすめです.
http://graffletopia.com/images/previews/640/original.png
生命保険のパンフレットに出てきそうな人達もいます.

アクセント

資料の終わりには感謝の意を表したいという礼儀正しい方におすすめなのが,Post-it Notes | Graffletopia です.
http://graffletopia.com/images/previews/487/original.png
サンプルは Thank you! ですが,ステンシルなのでもちろん文字を変更できます.資料の中でアクセントをつけたりメッセージを伝えたりするのに便利です.

おわりに

図に関しては内容も大事ですが,見た目の印象も大事です.私はデザインに関しては自信が無いほうなので,今回紹介したステンシルは重宝しています.見た目をステンシルに任せることができれば、あとは内容に集中することができますからね。

*1:iPad 版もありますね

引数のバインディングと実行を遅延させる 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 を入手
  • (2) PortIndex を作成
  • (3) sources.conf に 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 を作って対処することになりました.この ports7つの言語 7つの世界 第 3 章 Io 言語のセルフスタディをやるためだけに作ったようなものなのですが,きっと,セルフスタディよりも ports 作成のほうが時間かかっています.

ここまで長々と MacPorts による Io のインストール方法を説明してきたのですが,もし,Lion を使っているのなら Homebrew でインストールできる そうです.実を言うと,こちらのほうが楽そうです.

*1:検索用

*2:7つの言語7つの世界第3章のセルフスタディを進めていくと,2 日目で Random プロトタイプを使えずに詰みます.