第五世代筆記具


第五世代というと顔をしかめられる業界もあるようですが、文房具業界はどうでしょう。

パーカーから“第五世代”と銘打った筆記具「インジェニュイティ」が発売されたので試してみました。手で書く機会はあまりないにもかかわらず、いつもいい筆記具を探しているので、「書き味」をアピールする筆記具の新製品はだいたい試しています。

allaboutより)

まず、名前にちょっと問題があります。発音しにくく憶えにくい。限定販売の今のうちに、発音しやすい名前に変えておいた方がいいと思います。メーカーは違いますが、ぺんてる「プラマン」の高級版だってことがすぐわかる感じにするのはどうでしょうか。「ハイプマ」とか。

パーカーが勝手に言っていることではありますが、「世代」というのはこんな感じだそうです。

  1. 万年筆
  2. 油性ボールペン
  3. ローラーボール(水性ボールペン)
  4. メカニカルペン(シャープペンシル)
  5. 一般名称不明(製品例:インジェニュイティ)

サインペンが入っていないのも問題です、限定販売の今のうちに、「インジェニュイティ」は“第六世代”ということにして、空いたところにサインペンを入れておいた方がいいと思います。

私のお気に入りはこんな感じです。

万年筆
油性ボールペン
ローラーボール
  • Swift(映画マトリックスの小道具)
サインペン
メカニカルペン
  • クルトガ(すごいと思うが、シャープペンシル自体、あまり使わない)
“第五世代”

「1本だけ」と言われればジェットストリームだという人が多いと思いますが、ピュアモルトシリーズ以外は手触りがあまりよくありません。リフィルは同じM66でも、TipoよりもSwiftがいい、これも同じ理由からでしょう。この点に関しては、「インジェニュイティ」はとてもいいと思います。

指先の神経は脳と大変密接に関係していますので、ペンの手触りという面でも満足してもらうというのはとても大切なことだと考えています。(「LAMY」社長が語る、モノ造りの真髄

インジェニュイティ (parkerpen.com)

つぶやきの限界(140文字)への挑戦


4627847327拙著『Webアプリケーション構築入門』のサンプルとして、Twitterクライアントを作りました。

単なるクライアントではつまらないので、つぶやきが140文字未満のときは、文字を追加して139から140文字になるようにしています。

本稿執筆時点でのTwitterの仕様では、ちょっと面白い結果になるみたいです。仕様が変わったら公開を止めます。

Twitterのアカウント情報は保存しませんが、気になる人は https://twitter.com/settings/applications で削除してください。

試してみる

しばらくすると改竄されてしまいました。Twitter社には書き換える権限があるのかもしれませんが、それを頻繁に行使されるとちょっと不安になりますね(ジャスミン革命に使えるのかしら)。

参考書

矢野啓介『プログラマのための文字コード技術入門』(技術評論社, 2012)

4797361190徳丸浩『体系的に学ぶ 安全なWebアプリケーションの作り方』(ソフトバンククリエイティブ, 2011)

スクラップロゴス


ワタナベコメディスクールのライブ「SMILE DAWN」を観てきました。なんというか、常識的な人生の正攻法には絶対入ってこないであろうことを追求する姿を見ていると、ネタがちょっと・・な時でも笑って拍手したくなるから不思議なものです。そんな中でも、「スクラップロゴス」や「サツマカクRPG」、「ひまつぶし」は面白かった(名前をもっとわかりやすくして!)。特に渡辺輝さんの相撲ネタは、たくさん作ってシリーズ化してほしいと思いました。

スクラップロゴス

OAuth認証でTwitterを利用するWebアプリケーション(PHPの場合)


OAuth認証が必要なAPIでは、Twitter APIとFacebook APIが有名ですが、ちょっと仕様が違うので、使い方を簡単に紹介しようとすると、記事を分けなければなりません。さらに、JavaとPHPの両方を学べるというお得な本を書いたこともあって、その読者をサポートするために、JavaとPHPの両方で記事を書かなければなりません。都合、以下の4パターンが必要です。

今回は、「PHPでTwitter API」です。「JavaでFacebook API」はまた別の機会に。

アプリの登録

http://dev.twitter.com/appsでアプリケーションを登録し、Concumer keyとConsumer secretを取得してください。その際、クライアントアプリケーションではなくブラウザウェブアプリケーションとして登録するように注意してください。

OAuthのためのライブラリ

PHPには、標準の「PECL/oauth」や準標準と言える「Pear HTTP_OAuth」、Twitterに特化した「Pear Services_Twitter」がありますが、例によって、PECLはWindowsで使いにくいし、HTTP_OAuthはベータ版、Services_Twitterはアルファ版なので、さっさと見限って「abraham / twitteroauth」を使いましょう。

OAuth.phpとtwitteroauth.phpをダウンロードして、ウェブサーバで配信できる場所に置きます。

cURL

XAMPP

PHPでcURLを使うために、php.iniに以下のように記述して、Apacheを再起動します。

extension=php_curl.dll

Ubuntu

次のコマンドを実行してcURLモジュールをインストールしてからApacheを再起動します。

sudo apt-get install php5-curl

4627847327お約束ですが、このあたりでもうついて行けないという場合は、拙著『Webアプリケーション構築入門』などを参照してください。以下のPHPプログラミングで必要な知識も本書にまとめてあります。

OAuth認証

以下の3画面で認証することにします(oauth-start.phpとoauth-end.phpは一つのファイルにまとめることもできますが、ここではわかりやすいように二つに分けています)。

  1. OAuth認証のためのURIを生成し、それにアクセスするためのリンクを表示するoauth-start.php
  2. アプリケーションを許可するTwitterページ
  3. Twitterからのコールバックを受信し、access tokenとtoken secretを取得するoauth-end.php

実装

oauth-start.php

OAuth認証の入り口となるoauth-start.jspは以下のようになります。「Consumer key」や「Consumer secret」、コールバックURIの部分は、状況に合わせて書き換えてください。

<?php
require_once('twitteroauth.php');

session_start();

//セッションを節約したい場合は別ファイルに書いておく。
$_SESSION['consumer_key'] = Consumer key;
$_SESSION['consumer_secret'] = Consumer secret;
$callbackUri = 'http://localhost/twitter/oauth-end.php';

$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret']);
$request_token = $connection->getRequestToken($callbackUri);
$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

$authUrl = $connection->getAuthorizeURL($token);
?>
<!doctype html>
<html>
  <head>
    <title>OAuth Start</title>
  </head>
  <body>
    <p><a href="<?php echo $authUrl; ?>">Twitter OAuth認証開始</a></p>
    <p><a href="logout.php">logout</a></p>
  </body>
</html>

oauth-end.php

コールバック後の処理を実装するoauth-endは以下のようになります。

<?php
require_once('twitteroauth.php');

session_start();

$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret'],
                $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$access_token = $connection->getAccessToken($_GET['oauth_verifier']);
unset($_SESSION['oauth_token']);
unset($_SESSION['oauth_token_secret']);

//セッションに記録する。データベースなどを使ってもよい。
$_SESSION['access_token'] = $access_token;
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Twitter OAuth認証完了</title>
  </head>
  <body>
    <pre><?php print_r($access_token); ?></pre>
    <p>access_tokenをセッションに保存した</p>
    <p><a href="post.php">送信テスト</a></p>
    <p><a href="logout.php">logout</a></p>
  </body>
</html>

つぶやく

認証が終わったら、以下のようなコードでつぶやけます。

<?php

header('Content-type:text/plain; charset=utf-8');
require_once('twitteroauth.php');

session_start();

$access_token = $_SESSION['access_token'];
$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret'],
                $access_token['oauth_token'], $access_token['oauth_token_secret']);

$message = "テスト at " . time();
$parameters = array('status' => $message);
$status = $connection->post('statuses/update', $parameters);
print_r($status);

ブラウザを再起動すればはじめに戻りますが、次のようなlogout.phpを作っておいてもいいでしょう。

<?php
session_start();
session_destroy();
?>
<!doctype html>
<html>
  <head>
    <title>Logout</title>
  </head>
  <body>
    <p><a href="oauth-start.php">start</a></p>
  </body>
</html>

グレン・グールド 天才ピアニストの愛と孤独


私がグレン・グールドを好きなのは、演奏だけでなくセルフ・プロデュースの仕方にも惹きつけられるからだ。若くしてコンサート活動を止めた代わりに、膨大な録音や映像、著作を残した。そういうパフォーマンスの、どこまでが演出されたものだったのか。今回公開された映画の、二人の子を持つ女性との生活の記録には、彼のコントロールできないコントロール願望が刻まれている。天才芸術家の愛と孤独。

公式サイト

ほかにおすすめの映像

B001HBQL2C
レーザーディスク版を持っている(Collection 2も)。プレーヤーも、これのために買ったと言っていいだろう。DVDを買う人がちょっとうらやましい。

B005D4Y4H8
Amazonで絶賛値下がり中だから、初値で買った私は少し悲しいのだが、後述のBoxセットのその後のことを考えると、好きな人はさっさと入手しておいた方がいいかもしれない。

ほかにおすすめの著作

4622043815462204382346220441964622070197
1冊だけあげるなら、著作集2巻「パフォーマンスとメディア」だろうか。

ほかにおすすめの録音

B000TJQ75E
かつて、ちょうど3万円くらいで買ったのだが、今Amazonで買おうとすると新品が16.5万円、中古でも7万円。「あとで中古で買えばいいや」がいつも通じるわけではない。

B00005G82T
グールドの一般的ではない解釈をバーンスタインが採用した演奏。映画でも登場した「協奏曲にあっては誰がボスなのか? 独奏者なのか、それとも指揮者なのか?」というバーンスタインの有名な前口上「心配しないで下さい。グールド氏はちゃんと来てますから・・・」が収録されている。

B000WXR328
グールドのラジオシリーズ(5枚組)。

  1. The Idea of North
  2. The Latecomers
  3. The Quiet in the Land
  4. Casals: A Portrait for Radio
  5. Stokowski: A Portrait for Radio

B000N4RBGO
自動ピアノによるグールドの再現。オリジナルとの違いはグールドの肉声が聞こえないことと、音がクリアになっていること。グールドは、死んでもなおメディアについての話題を提供し続けている。

Wolfram CDF PlayerをMathematicaとして使う方法


http://www.unfindable.net/umm3/

計算可能ドキュメント形式(Computable Document Format, CDF)を閲覧するためのソフトウェアWolfram CDF PlayerとMathematicaの関係は、Portable Document Format (PDF)を閲覧するためのソフトウェアAdobe ReaderとAcrobatの関係に似ています。Wolfram CDF Playerで閲覧可能なCDF文書を作るにはMathematicaが、Adobe Readerで閲覧可能なPDF文書を作るにはAcrobatが必要です。

しかし、CDFとPDFには大きな違いがあります。PDF文書は内容が固定された静的な文書であるのに対して、CDF文書は内容を変化させられる動的な文書です。下はCDF文書の簡単な例です。Wolfram CDF Playerがインストールされている環境なら、aの値を変えながらSin[a x]をプロットしてみることができます。CDF文書の内容は計算によって変化するのです。

Sin[a x]のaの値を変えられるなら、もっと大胆に「Sin[a x]」という式全体を変えられるのではないかと考えるのは自然でしょう。Mathematicaの式を処理できるCDF文書、それはMathematicaとして使えるCDF文書です。使い勝手は多少悪くても、「Mathematicaを使いたいけれど高すぎて買えない」という人にとっては有用でしょう。みんな大好きWolframAlphaも、Mathematicaのすべての機能を使えるわけではありませんし。

残念ながら、直接的な方法はうまくいきません。CDF文書に入力できるのは数値だけであり、「Sin[a x]」のような文字列は入力できないからです。しかし、コンピュータ上で表現されるすべてのものは、メモリ上では数で表現されています。「Sin[a x]」のような式ももちろん数で表現されています(メモリのことがよくわからない人は、ゲーデル数を思い出してもいいでしょう)。ですから、Mathematicaの式を一度数値に変換してからCDF文書に入力し、CDF文書内でそれを元に戻すというような工夫をすれば、CDF文書で式を扱えます。このアイディアを実現したのが、以前紹介したUniversal Mathematica Manipulator (UMM)です。

UMMには、Mathematicaの式を変換してできる数値が長大なため入力に手間がかかるという問題がありました。Wolfram CDF Playerには、文書上でクリップボードからの貼り付けができないという制約があるため、長大になる数値をCDF文書上で入力するための面倒な仕掛け(VBScriptやAppleScript)が必要でした。(Mathematicaに付属するCDF Playerなら貼り付けられます。このように仕様がばらばらなことが後で混乱を生まないことを祈ります。)

ここでは別の方法を紹介します。

まず、Wolfram CDF Playerをインストールします。これがなくては始まりません。

次に、PHPを使えるウェブサーバをlocalhostに用意します。WindowsならXAMPPを導入するのが簡単でしょう。

下のような内容のexpression.phpをhttp://localhost/umm3/expression.phpというURLで呼び出せるようにしておきます。ディレクトリumm3は、ウェブサーバから書き込めるようにしてください。

<?php

$file = 'expression.txt';

if (isset($_GET['body'])) {
  file_put_contents($file, $_GET['body']);
  echo $_GET['callback'].'()';
} else {
  if (is_file($file)) echo file_get_contents($file);
  echo '(* OK *)';
}

PHPのmagic_quotes_gpcがOffであることを確認します。XAMPPの場合はデフォルトでOffになっています。Macの場合はphp.iniを編集してApacheを再起動する必要があるかもしれません。

4627847327お約束ですが、上の手順がよくわからない人は、拙著『Webアプリケーション構築入門』などを参照してください。

以上の準備ができたらhttp://www.unfindable.net/umm3/にアクセスします。ピタゴラス3体問題のような比較的大きなプログラムも実行できることを、Wolfram CDF Player 8.0.4(Win, Mac)で確認しています。

世界一軽い日本のことば


ジョブズの遺志をガン無視した犯人、それは講談社さんアンタだよ!

ジョブズの伝記の装丁が、日本語版だけひどいと話題になっていました(左が英語版・右が日本語版)。

1451648537 4062171260

個人的には、原書が1冊のものを分冊で翻訳することに文句を言いたいのですが、そういう重さの話はまた別の機会に。

真犯人は私たち消費者なのではないでしょうか。私たち消費者の好みに出版社が合わせているだけなのではないでしょうか。

似たような本なのに売り上げが全然違う。その原因を分析して、「デザインが派手だった」とか「帯の文句が目を引いた」という結論になる、ということはよくありそうな気がします(確証はありません)。

タイトルでも似たようなことは起きていそうです。邦題のタイトルがあまりに大げさだと思って調べると原題は冷静なものだった、というのはよくあることです。

『世界で一番美しい元素図鑑』の原題は The Elements でした。

『世界でもっとも美しい10の物理方程式』の原題は The Great Equations でした。

『世界でもっとも美しい10の数学パズル』の原題は The Liar Paradox and the Towers of Hanoi でした。

『世界一わかりやすいプロジェクト・マネジメント』の原題は The Complete Idiot’s Guide to Project Management でした。

「世界」にはいろんな意味があるので、もしわかしたら私の解釈が間違っているのかもしれませんが、「日本ではこういう恥知らずなタイトルの方が売れる」という経験則を出版社が持っているのなら、その原因の一部は消費者にあるはずです。

『もっとも美しい対称性』の原題は Why Beauty Is Truth でした。

A Beautiful Mind『ビューティフル・マインド』という邦題で成功したにもかかわらず、
A Beautiful Math『もっとも美しい数学 ゲーム理論』という邦題で出してしまうのにはちょっとあきれました(内容は素晴らしい)。ジョブズもよく「最高の」って言っていましたから、ことばに関して言えば、通じるものがあるような気もします。

もっとも、政治家を引き合いに出すまでもなく、日本のことばは「軽い」ものなので(このブログのように)、重要さをアピールするためには、「世界一の」とか「最高の」、「もっとも」といった、重い修飾語が必要になのかもしれません。

恥知らずなタイトルが日本のことばの軽さを表しているのだと思えば、軽やかな気分になれるというものです。ジョブズの伝記の装丁も、そんな軽さの表れと言えるのではないでしょうか。

Zapf 展「ヘルマン・ツァップ&グドルン・ツァップ カリグラフィーの世界」


震災の影響で延期されていた Zapf 展が、ギャラリー ル・ベインで開催されている。

Zapf 展

Herman Zapf さんは Widows にも Mac にも入っているエレガントなフォント Palatino (この記事の欧文フォント)の作者。Windows には入っていないが、Mac には標準で入っている Optima や Zapfino も Zapf さんの作品。『コンピュータの数学 』『数学ガール 』シリーズの数式部分で使われている AMS Euler も。

0895792524カリグラファーとしても有名。Knuth 先生の 3:16 では、プロジェクトにとって最も重要な聖句である John 3:16 とカバーを手がけている。不幸なことに、John 3:16 の Knuth 先生による英訳には間違いがあり、それをもとに作成され 3:16 に収録された Zapf さんのカリグラフィーも不満足なものだったのだが、最終的には幸運なことに、修正版が Knuth 先生のウェブサイトで公開されている(PDF)。(このあたりの話は『コンピュータ科学者がめったに語らないこと』に詳しい。)

このように、もはや伝説とも言える Zapf さんの直筆作品や複製品、フォント制作資料、金属活字などが、Zapf 展では 50 点ほど展示されている。会場では、図録のほかに、Alphabet Stories by Herman Zapf や Linotype の見本帳(紙と CD-ROM)も購入できる。

9/25 まで。

円周率の近似値を手元に置くこと


B00264YQ80

円周率の近似値が印刷されたマグカップを手元に置くのが一つの手です。

487310002X

円周率の近似値が印刷された書籍、牧野貴樹『円周率1000000桁表』を手元に置くのも一つの手です。

必要な時にすぐ計算できるように、スーパーπをダウンロードしておくのも一つの手です。スーパーπはかなり前からある有名なプログラムで、ベンチマークなどでもよく使われています。本稿執筆時点で、419万桁の計算時間を集めたサイトスーパーπランキングのトップは、Intel i7 2600K@5.454GHz (Sandy Bridge)の35秒とのこと。私のマシン(Core i7 930)では121秒でした。

Mathematicaを使うのも一つの手です。Mathematicaが手元にない人は、UMMで代用してもいいでしょう。スーパーπのベンチマークと同じだけ計算したい場合は、「pi = ToString@N[Pi, 4194307];」とします。有効な結果はStringDrop[pi, -2]です(最後の2桁を捨てる)。私のマシン(Core i7 930)では16秒と、スーパーπよりかなり速く計算できました(もちろん計算結果は同じです)。

結果をそのままファイルに書き出しても4MB程度なので、「記録しておくより、必要な時に計算したほういい」という状況ではありませんが。

ライフゲーム上の万能チューリングマシン


『ライフゲイムの宇宙』という本を以前紹介しました。そこで、

ところで、ライフゲイムで万能チューリング・マシンを作るために必要なセルは10^13程度と見積もられている。これはクラスタ計算機なら到達できるところだろう。視覚化の問題はあるが、誰かやらないだろうか。

などと言っていたのですが、クラスタを使うまでもなく、2002年に実現しているということを教えてもらいました[Paul Chapman]。

万能チューリングマシンとは何か。チューリングマシンと万能チューリングマシンの違いは、電卓とパソコンの違いのようなものだと考えてください。電卓は、あらかじめ組み込まれたタスクしかこなせませんが、パソコンは、プログラムが与えられればどんなタスクでもこなせます。万能チューリングマシンは、適切な入力が与えられればどんなチューリングマシンにもなれます。チューリングマシンでできることが「計算可能なこと」だと考えられているので、万能チューリングマシンは、計算可能なものならどんなものでも計算できるのです。計算がすぐに終わるかどうかは別問題です。

ライフゲームが興味深い理由の一つに、ライフゲーム上に万能チューリングマシンを構築できることがあるのは間違いないでしょう。しかし、そのための空間はとても大きく、『ライフゲイムの宇宙』当時には難しかったわけです。

しかし、計算技術の進歩によって、ふつうのパソコンで実現できるようになったというのは先に述べたとおりです。2011年になっても改良が加えられ、Golly用のファイルも配布されたりしているので、簡単に動かして試せるようになっています[Paul Rendell]。

万能チューリングマシンをシミュレートするためのライフゲームの世界はとても大きいです。1:16くらいで表示するとこんな感じですが、

Golly Scale=1:16

全体を表示できるようにしたときの縮尺はなんと2^8:1です。ステップが進むにつれて大きくなります。

Golly Scale=1:16

こういうのは、先日紹介したMathematicaによる手軽な方法ではまったく歯が立たないでしょうね。

4150112908『ライフゲイムの宇宙』は原書が1985年、翻訳が1990年です。発行から時間が経っているので、このように、内容が古くなっている部分があります。他にもたとえば、p.43に載っているエデンの園(Garden of Eden)は9×33のパターンですが、2009年には11×11のものが発見されています(参考:LifeWiki)。

「エデンの園配置とはなにか、知っていますか?」

「ええ、もちろん。セル・オートマトン理論において、あるシステムの状態が、それ以前のいかなる状態の結果でもありえないことをいうの。ほかのいかなるセルのパターンも、その状態を生じさせられない。エデンの園配置を望むなら、それそのものからはじめなくてはならない—それをシステムの最初の状態として、自ら設定する必要があるわけ」(イーガン『順列都市』(下p.20))