7つのデータベース7つの世界

7つのデータベース7つの世界」という書籍の書評を書こう(久しぶりに書評を書くぞ)。「7つの言語…」が有名な米国のPragmatic Bookshelfから出版された翻訳本であり、この書籍についてはオーム社から発売された。原書は手にしていないので、翻訳本についての紹介になる。

本書で紹介しているのは、PostgreSQL、Riak、HBase、MongoDB、CouchDB、Neo4J、Redisとちょうど7つだ。まず、このチョイスにMySQLがないことがポイントだ。データベースと言えばRDBという時代が長く続いたがここ数年来NoSQL(Not-only SQL)がブームになっている。とは言え、RDBやSQLがなくなるわけではなく、データベースにも適材適所の時代が来たということである。NoSQLにもいろいろなタイプがあり、キーバリュー、列指向、ドキュメント指向、グラフ指向から代表的なものを選択して紹介しているわけである。

1つのDBあたり、30〜40ページというところで、すべてを知るための書籍ではない。これは「7つの…」シリーズで踏襲されている「その世界をツアーしガイドする」というコンセプトによる。DBの概要となると、言語とは少し違う。本書では基本的なデータの扱いの概念と、そのDBを使ったおいしい事例というところにフォーカスされている。詳細や他の世界との接点については「宿題」として自分で考えましょうというスタンスだ。たとえば、MongoDBではMapReduceの事例をしっかりと紹介しているが、ショートカットや正規表現については宿題として自分で調べることになっている。

NoSQLは何だと言われても、うまく答えは見つからないが、本書はNoSQLの世界への非常に巧みなガイダンスとなっている。DBは何と言っても基本的なデータの扱いという絶対にはずせない情報があり、そこはどのDBについても実践的な解説でうまく体験できるような説明となっている。それぞれのDBについての最初の解説を読むだけでも、DBのコアな仕組みが見えてくる。NoSQLに興味がある人は、まず最初に手に取って読んでみることを勧めたい。

ここからは余談…コンピュータ書籍はオライリーの独断場のような様相であると言い切るとして、その中で、Pragmatic Bookshelfの企画力には注目していた。オライリーはユニークな企画ものもあるけど、やはり「Perl」とか「SSH」といった直球勝負な書籍が中心だ。そのオライリーにもっと早い重い直球で勝負するぞと意気込んだところでなかなか勝てない。しかし、Pragmaticはある意味オライリーがだしそうにない書籍という点で注目できるのである。個人的には「SQL Antipatterns」のファンでもある。そのSQL Antipatternsは、日本ではオライリーから出た。え?なんで?と思って調べたら、Pragmatic Bookshelfの書籍のディストリビューション(意味的には販売会社だろう)はオライリーだったのである。やっぱりオライリーの独断場なのだろうか。

余談は続くが、Pragmaticの書籍をアメリカのアマゾンから買って読んでいた頃、ふと、電子版は割引と書いてある。紙の書籍を持っていないと買えない仕組みである。その絶妙な価格付けで、思わず電子版を買ってしまった。書籍の4分の1ほどの値段で電子版が購入でき、しかも改訂があれば最新版が手に入る。紙の書籍を買って、必要なら電子版を買い、読んだら紙の書籍は古書流通に流す…。これだと、自炊もしなくてもいいし、軽いPDFやePubファイルが手に入る。中身の翻訳はもちろん歓迎されることだが、こうした仕組みも含めて出版社にはローカライズして欲しいところだ。

[FMRP]TOの名前付け

パターンとして微妙、あるいはパターンと言えるほどの考察がないのじゃないのかと思われる1つのパターンを紹介しましょう。しかしながら、問題点は明確であると思います。

カテゴリ:要素

略称:ネーミング

名前:TOの名前付け(Ver.1.0)

問題:

  • TOは任意の名前が設定できる。そして自動的に名前が設定されてしまうが、そのままにすると後から混乱が生じる。
  • TOの名前は、元になるテーブル定義の名前とはまったく関係ない名前をつけてしまうこともできてしまう。
  • 1つのテーブル定義に対してたくさんのTOを定義することも多く、TO選択のポップアップメニューは混乱しがちである。TO選択時に目的のTOを確実に素早く探し出せる名前付けルールが必要である

解決策:

  • TOには、TOグループを端的に示す「グループ名」と、どのテーブルをもとしているかを示す「テーブル名」を含めた名前を付ける

フォース:

  • 1つのソリューションで一貫した名前付けのルールを持たせないと混乱する
  • グループ名とテーブル名だけでは、時として同じ名前の異なるTOが登場し、完全な名前付けができない。そこで、バリエーションにあるように、「用途名」といった補助的な名前を追加する必要が発生する

バリエーション:

  • 「グループ名_テーブル名」を基本とする。TOグループ内で同じテーブル定義を元にしたTOが複数登場する場合には、用途に応じて、「グループ名_テーブル名_用途名」、あるいは、「グループ名_用途名_テーブル名」をTO名とする。この名前付けルールだと、TO選択のポップアップメニュー等で、同一TOグループの項目がまとまる。その中で後半のテーブル名や用途名を見つけ出すという作業になる。TOグループを基準に考える場合には適した方法であると言える。
  • 「テーブル名_グループ名」を基本として、前記のバリエーションと同様に、さらに用途名を付け加える。この名前付けルールだと、TO選択のポップアップメニュー等で、同一のテーブル定義をもとにしたTOがまとまる。その中で後半のTOグループ名や用途名を見つけ出すという作業になる。テーブル定義名を基準に考える場合には適した方法であると言える。
  • TOの結合の流れに従って名前を付ける。名前からリレーションシップの中での関係が一目瞭然になるが、TO名が長くなり過ぎる傾向がある

関連パターン:(TBD)

FileMakerリレーションパターンの前提知識

本当はこれを最初にまとめないといけないのかもしれません。そもそも、パターンの記述を読み込むための前提知識は前提知識として定義できるはずです。パターン集ではあまりそういう記述を見ませんが、パターンなのか、たんなる機能なのかを判断する上でも、必要な情報と考えます。つまり、前提知識はパターンではないというところが出発点です。前提知識は、問題解決というよりも、単一の機能であるとも言えるかもしれません。以下、見出しが前提知識として提示します。

テーブル、フィールドといったデータベースの基本

データベースあるいは表形式のデータそのものは、フォーマットです。もしかすると、広い意味でのシステム構築パターンには「データベースを使う」というのがあるかもしれませんが、ここではリレーショナルデータベースを使用した場合の設計に関する問題解決にフォーカスしているので、フィールドやレコードといった存在、あるいはその概念は前提知識とします。

テーブル演算によるデータ処理

テーブル演算そのものは、パターンでないと考えますが、パターンの中で特定のテーブル演算を使うことはあり得ます。言い換えれば、テーブル同士の演算があるという前提から出発している話なので、これらも前提知識とします。

リレーションシップによるテーブル結合

前項と同じ意味ですが、テーブル同士は結合できるという事実も、前提知識です。いや、むしろ、この仕組みが出発点なのです。これはパターンではなく、いちばんコアな意味での前提知識と言えるでしょう。

FileMakerに関する機能

ここの切り分けが難しいところですし、どこまでの機能が前提知識で、どこからがパターンなのかは問題解決への貢献度や、自明さから考えることになるでしょう。「レイアウト」というのは機能であり、動作は明確であり、目的を持って使えるものです。しかしながら、レイアウトの機能でも「データに応じて文字列の色を変更したい」という問題点から出発すれば、「条件付き書式」はパターンかもしれません。一方、条件付き書式に対するトレードオフはFileMakerで実装しているかどうかの問題しかなく、問題解決で発生する葛藤は薄いでしょう。そうなると、「条件付き書式」はやっぱり単なる機能でしかないかなと考えるわけです。機能そのものがパターンになり得る場合も一部はあると考えますしかしながら、一般には機能そのものはパターンにはなり得ないと考えます。

他に項目を思い付いたらまた追記します。

[FMRP]種類フィールドを持つテーブル

前回の、FileMakerリレーションパターンの記事は、「いいね」が非常に少なくなり、みんなが引いているのが分かりますが、ともかく進めましょう。前回は、「種類フィールドを持つテーブル」というパターンがなぜ問題解決につながるのかを説明しました。パターンでは、そうした発見を、パターン記述にします。そのとき、適当に書き散らすのではなく、項目を決めておくのが一般的です。それもふまえて、「種類フィールド」パータンを記述したのが以下の通りです。

カテゴリ:リレーションシップ

略称:種類フィールド

名前:種類フィールドを持つテーブル(Ver.1.0)

問題:

  • 異なる種類の情報を一元的に管理をしたい
  • 異なる種類の情報を1つのテーブルでまとめて管理をしたい

解決策:

  • 種類ごとにテーブルを作るのではなく、単一のテーブルにさまざまな種類のデータをまとめて記録する。
  • 一般には種類ごとに必要なフィールドは異なるので、テーブルの定義では、複数の種類に必要なフィールドが混在する。不要なフィールドはつかなければ良い。
  • 一部のフィールドは、異なる種類で共通に使って良い。たとえば、「完了」フラグや、「発生日」といったフィールドがその例である。
  • そのときに、1つ1つのレコードに対して、いくつかある情報の種類のどれなのかを記録するためのフィールドが必要になる。そのフィールドには通常は番号を入力して、番号で情報の種類を特定することになる。

フォース:

  • 種類に対応したフィールドを求めるような仕組みはデータベースには一般にはない。そういう仕組みの構築も面白そうではあるが、実用的な意味と、限られた時間でシステム構築する上では、種類を特定する番号と、利用するフィールドの対応付けはドキュメンテーションで済ませることで大きな問題は発生しない。
  • フィールドの命名規則で、おのおののフィールドがどの種類の情報に関連したものかを明示する方法も考えられるが、一長一短がある。たとえば売り上げに関するフィールドは「sales_金額」「sales_個数」、コンタクト情報に関するフィールドは「con_名前」などとする。一見分かりやすそうに見えるが、異なる種類の情報でも、共通に使いたいフィールドが出てきたとき、名前を変えるべきなのかどうなのか、迷う事になる。また、複数の情報にまたがって使うようになっても名前が単一の情報を示してると、誤解を生じる。一般に、開発中のドメインについての理解があれば、「仕入金額」「受注個数」「担当者名前」などの名称で、概ね何の種類の情報かは分かるのが一般的だろう。種類に応じたフィールド名は、メンテナンスの問題が生じないかどうかをよく検討する必要がある。種類を特定するキーワードを入れないとすれば、これもドキュメンテーションにより各フィールドの利用方法を周知させる必要が発生する。
  • 粒度の小さな情報(たとえば、日時のみ、商品名のみ)を一元化したい場合には、このパターンではなく、別のパターン(名称未定、商品名についてはマスター処理と同等)を適用すべきである。このパターンは、複数のフィールドからなる情報がいくつも種類があり、それらをまとめて管理したい場合の1つの設計指針である。

バリエーション:

  • 種類フィールドを持つテーブルのレコードと、実際のデータがあるレコードを1対1でリンクを取ってもよい。たとえば、すでにある種のテーブルが利用されている上で、別の種類の情報と一元的に管理をしたい場合は、新たな情報については種類フィールドを持つテーブルにまとめるとしても、既存のテーブルに対してはリンクを取るだけにすることもできる。このとき、種類フィールドを持つテーブル側に外部キーフィールドーを設定し、元から存在するテーブルの主キー値を代入して対応付けをすれば良い。通常は、種類フィールドを持つテーブルから元からあるテーブルへの参照が多いと考えられるからである。
  • 情報の種類によって表示すべき情報が異なっている場合でも、それらを一覧したい場合もある。そのときは、表示用文字列の計算フィールドを作成すれば良い。たとえば、売り上げ情報なら金額、コンタクト情報なら相手と要件など、種類フィールドの値に応じた計算式を作る事で、1つのフィールドに種類によって異なる内容を表示させることはそれほど難しくはない。
  • あるテーブルから、種類フィールドを持つテーブルの特定の種類のレコードだけを参照したい場合、画面に表示するだけならポータルフィルタを利用できる(別パターンとしてまとめる予定)。また、リレーションシップ自体が特定の種類のレコードに絞られた状態にしたい場合、種類フィールドを持つテーブルとは違う方のテーブルに定数フィールド(別パターンとしてまとめる予定)を用意し、その定数フィールドと、種類フィールドを持つテーブルの種類フィールドの間にリレーションシップを定義する。

関連パターン:ポータルフィルタ、定数フィールド

フォースについて

パターンにおけるフォースの説明は大変難しいのですが、問題と解決策では記述しきれないことをフォースとしてまとめるというのが1つの方法です。フォースの1つの役割は、パターンを適用したり展開するときの前提条件や、制約条件を記述できる点があります。さらに広い意味では、人間の意思に近いものもフォースと言えるかもしれません。まさに、ある種の力関係、力学的作用、そういうものが働くことによってパターンが成り立つというその状況を記述するための項目になります。

電子書籍が売れないとしたら、その理由は?

電子書籍問題の三部作、最後の記事です。今回は、取り次ぎは金融であるというお話です。出版流通での取次というシステムは、電子出版の注目とともに、より世間に知られることになりました。是非はともかく、これまで何十年の間、出版業界を支えていたのは事実です。

この話は、以前に出版を行う会社に居たときに聞いた話で、今は違っているかもしれませんが、大筋はそのままだと思います。その会社の話だけでなく、複数の会社でそうなっているというのを聞きました。出版社が書籍を出版し、取次に納品し、取次が書店に納品する、そして定価販売を義務づけられているけど、書店は自由に返品でき、それは出版社へも返品できるというのが原則でした。むかし、その原則にコンピュータ系ではおそらくただ1社アスキーだけが「返品不可」をやっていたのも記憶されます。しかし、普通は返品自由なので、書店にとってはリスクが低く、とりあえず注文するという気軽な発注にもつながります。

出版社にとっての出版から返品までのサイクルは、早く半年くらい、長くて1年あるいはそれ以上ということを聞いた事があります。今はもっと早いのかもしれません。このとき、驚くことに、出版時の納品によって、出版社は納品しただけの売り上げが立つらしいのです。そして、返品の度に買い取りになるのか、清算になるのか分かりませんが、取次に対しての支払いと、返品されてきた書籍の引き取りが発生します。つまり、出版直後はほんとうに読者の手に渡っていないのに出版社は売り上げになるという仕組みです。事実上、取次が出版社に対して金融しているのと変わらないという気がしますが、どうでしょう?

従って、出版を始めたばかりの出版社は、出だしがきわめて好調です。全部売れるからです(笑)。しかし、しばらくすると、返品の山で実は売り上げていないことが分かります。そうなると、ともかく、タイトル数を増やして突っ込むことで、売り上げを確保するという悪循環が始まるかもしれません。しかし、返品がどっさりとは言え、私の感覚だと、5〜10冊のうち1冊が大きく売れて、残りが損益分岐点程度なら、出版社は十分黒字になると思っています。全部が損益分岐点では人件費が出ません。ですが、時々ヒットを出すくらいでもうまく回るようです。返品があっても、またじわじわ売れるかもしれないし、ともかく、時々ヒットを打つくらいの感じでなんとか行くのです。

電子書籍は売れないと言われます。電子書籍は、まさに売れた分しかカウントされないので、過去の書籍に比べて売れている感じがしないのかもしれません。しかしながら、実は取次による金融システムによって、紙の書籍は売れているという錯覚に陥っている可能性も否定できません。出版後1ヶ月程度で、売れているかどうかは紙の書籍の場合、なかなか分かりません。最近は書店が減っているので大分分かるのかもしれませんが、一方の電子書籍はまさに生データなのです。出版社としてお金がきちんと(かどうかは問題あるんだけど)入ってくるビジネスに主軸を置くのは当然です。そして、お金の論理で「電子書籍は売れないですから」と言う訳です。

電子書籍の世界に、紙の書籍の取次のような金融的システムはあるでしょうか? 取次の闇の部分だけを引き合いにして邪魔者扱いするのはもうやめましょう。現状はともかく、古い時代に書籍の購入者から業界を含めて、読者の利益とみんなが儲かる仕組みを彼らは構築してきたのだとも言えます。ユーザの論理は重要ですが、業界として成り立つ仕組みがないと、絵空事で終わってしまいます。iPhoneが、Apple独自の流通網App Storeによって成り立ち、そしてそれが成功の一員となったことを改めて思い出し、電子出版にも紙の出版物と同様な業界モデルを本格的に模索をしなければならない時期にあるのではないでしょうか。

FMリレーションパターンの作成方針

パターンに要求されるもっとも根本的なことは、問題解決のために利用できることです。ありがちな間違った理解は、技法に名前をつけることと混同していることです。あるいは、「自慢の得意技」を集めたものになってしまったとき、単に技法のカタログにしかなりません。問題解決のために必要な事は、当然ながら「問題点」の抽出と、その問題点の一般化による解決手段の提示が含まれている必要があります。

一方、ちょっと違う見方をすると、どこからが「機能」で、どこからが「パターン」なのかという線引きが分からないということもあります。パターンの世界では、いくつかの要件が組み合わされることの矛盾とそのトレードオフを示すということがパターンに対して要求されるということがよく言われますが、これは1つのヒントです。問題が発生するということは、おそらく要求が単純ではない、つまり、複数の要求があってあちらが立てばこちらが立たずという状況になっているということが言えるわけです。1つの機能でそうした複雑な問題に立ち向かえるかもしれませんが、もし、そうした機能があるとしたら、パターンというよりも、「チョイス」と言えるわけです。FileMakerの世界では、複雑な問題を簡単に解決ことができる「プラグイン」が存在します。では、「プラグイン」はパターンかというと、そうではないと私は思います。単一の機能に帰着するものは、シンプルな、つまり、1対1で事が終わるような問題と解法であり、知っているのかどうか、あるいは挙げられているのかどうかといった、ドキュメントの問題や、記憶しているかどうかといった問題で帰着する訳です。

では、パターンとして論じるものはどんなものがあるのでしょうか。次のような問題があるとしましょう。

最初の問題

顧客管理をしていて、顧客1人が1レコードを確保している(前提)。全社的な情報共有のために、顧客の購買記録と、顧客へのコンタクト記録をデータベースに記録したい(要望)。どのように、ソリューションを作るのが適切か?

FileMakerが得意な人は、もうあれこれ解決策は頭の中を巡るでしょう。もちろん、未確定な要素もあるので、そこはそれぞれです。また、上記の問題は、「問題点」がはっきり分かりません。その上で、まずはこう考えるのではないでしょうか。

  1. 購買記録、コンタクト記録は、別テーブルを用意してリレーションシップを定義する。いずれも、顧客レコードとは1対多の関係になる
  2. 特定の顧客に対してのそれぞれの記録は、顧客のレイアウトに、ポータルをそれぞれ配置すればとりあえずは参照できる
  3. 購買記録は他のテーブルにすでに残している事が判明した(状況の追加)。もともと、顧客とのリレーションシップは存在する
  4. コンタクト記録の入力をする場合、入力しやすいユーザインタフェースを作らないと、利用してもらえないのではないか

みなさんがさらに考えた事があれば、追加してください。ポイントは、ここまでは、FileMakerの単純な機能についての検討をしたということです。4については、いろいろあるかもしれませんが、要はFileMakerの機能の組み合わせということで帰着できるでしょうし、おそらくユーザ分析しないとこれ以上は議論できません。この状況から、パターンを抽出するのはちょっと無理かなと思います。FileMakerを勉強すれば、迷うところはありません。しかし、打ち合わせをしているうちに、どうもこういう問題ではないかと問題が拡張されてきます。

状況が追加された問題

顧客管理をしていて、顧客1人が1レコードを確保している(前提)。全社的な情報共有のために、顧客の購買記録と、顧客へのコンタクト記録をデータベースに記録したい(要望)。ただし、購買記録はすでにテーブルが存在する。一方、コンタクトと購買の関連を知りたいというのはユーザの要望としてでてきた。どのように、ソリューションを作るのが適切か?

ここでのポイントは、まず、「購買記録」テーブルは存在し、そこにおそらく販売担当者がレコードを追加する仕組みがすでに動いているということが想定され、自由に設計できない範囲が出てきました。一方、コンタクトは初出の機能だとしたら、ともかく、自由に作れそうです。

さて、「コンタクトと購買の関連を知る」というのは一種の非機能要求です。関連って何? 知るというのはどういう状況? ここの解決はユーザインタビューなどの要求工学的手法になるでしょう。開発者と顧客で喧々諤々の議論の結果、「購買情報」と「コンタクト情報」を交えたリストを1人の顧客に対して見えるようにするという基調の機能でいいのではないかとなってきました。大分具体的になってきました。

ここで、「購買記録」「コンタクト記録」が別々のテーブルにあるとして、統合的なリストを作りたいということが要求としてクリアになりました。問題点は「複数のテーブルを1つのテーブルのように扱う」ということでかなり抽象的に表現できそうです。ですが、まずは、FileMaker的にどのように解決できるでしょうか、いくつか案を考えてみます。

  1. コンタクトも購買テーブルの1レコードとして記録する。つまり、購買の特別な状況としてコンタクトがある。しかし、そうすると、現在の購買テーブルを利用している別のフォームで、コンタクトを見せないようにしないと行けない場合も出てくる。既存の作成物への変更なく終わらせるのはかなり難しい。
  2. コンタクトテーブルを作るのはもちろん、コンタクトテーブルの1レコードとして購買を記録できるようにする。既存の購買処理には表面的には手を加えなくてもよさそうだが、購買記録を付けたとときに、同時に新しいコンタクトテーブルへのレコード追加も必要となる。スクリプトを加えることで、既存の購買機能はそのままに機能の追加だけでできそうだが、購買機能側に、通販、Webなどなど状況ごとにレイアウトがあったりなんかすると、これは作業としてはコンプリートするのがかなり大変かもしれない。
  3. コンタクトテーブルは作るが、第三の(第4かな?)、「コンタクト&購買」テーブルを作る。まとめリストはそちらから取得する。この場合、前の2と同様、購買処理時に「コンタクト&購買」テーブルを作る必要があると同時に、コンタクトテーブルについても同じように、別のテーブルにレコードが必要になる。

どうでしょう、一長一短ありますね。まさにここでどうトレードオフをするのかが開発者の腕の見せ所でもありますし、それを成功させるために、より詳細に要求を詰めることもあるかもしれません。ただ、4つ目があるんですが、それは実はパターンそのものなので、以下に記述します。

こうした分析をすると、1つのパターンが見えて来ます。ここでは「種類フィールドを持つテーブル」と名付けます。どういうものかをまずはまとめます。

  • 複数の異なる情報を1つにまとめたリストとして表示する必要がある場合に適用可能
  • 新規にテーブルを作成し、テーブルの1つのフィールドにそのテーブルの種類を示す「種類」フィールドを確保する。一般には数値フィールドが良く、何らかの方法で、数値と種類の対応はドキュメント化しておく
  • 種類A、B、Cがあったとき、それらに必要なフィールドを、すべて新規に作ったテーブルに確保しても良い
  • 種類A、Bは新たな項目、一方、種類Cはすでにテーブルで存在する場合、種類Cを記録しているテーブ売るに対する外部キーを、新たに作ったテーブル上に確保する。また、外部キーは種類ごとに用意する

前に示した解決案2と3の折衷案的です。なぜ、3ではないのかというと、3のやり方はオブジェクト指向的な言い方で言えば、抽象クラスに相当するレコードを作る事です。1エンティティに常に2レコードを作るというのは、たとえばポータルなどを含めて、FileMakerではスクリプトを作成する以外に実現のしようがない機能です。そうした仕組みが広範囲に渡りそうなのが解決案3です。ここでは、すでに作ってしまった「購買記録」レコードのメンテナンスのためにスクリプトや改造をがんばって加えるとしても、新たに発生した「コンタクト」情報は素直に作ればいいだろうということで上記のような手法が考えられるということです。

「種類フィールドを持つテーブル」は、さまざまなトレードオフを考える基礎になるということで、パターンであると言えるかと思います。パターンは解決を約束するものではないので、これをベースに考えるということです。この問題で発生した、新たな記録テーブルと、既存の記録テーブルの混在という点についても指針があります。

ここまでがんばって読まれた方だと、容易に分かるかと思いますが、上記のパターンの箇条書きを理解するには、リレーショナルデータベースの基本的なことはみんな知っていないといけません。もちろん当然なのですが、言い換えれば「1対多のリレーションを取る」とか「ポータルに配置する」というのはパターンとは言えないと思います。もっとも、「ポータルフィルタ」は問題解決との関連があるので、パターンの1つと考えています。そこの線引きは難しいですね。一般にパターンカタログでは、パターンだけのカタログになっていますが、これから随時紹介する「FileMakerリレーションパターン」では、前提知識的なものもコンパクトにまとめて行くつもりでもあります。

電子出版がはやらないとしたら、その理由は?

電子出版はそれなりに大きな市場が形成されつつあり、多くの人の注目が集まるところです。2009年頃に、Amazonがすでに電子の売り上げが上回ったという話があって、多くの人があわてたところにiPadが発売されて盛り上がり、そこから約3年、思ったほど、というか、その頃に妄想したほどは盛り上がっていません。その理由の1つが、実は牽引役だと思われているタブレット系デバイスにあるんじゃないかとも思えます。その理由を書いてみました。

電子出版をネガティブに見る人が必ず言うのは、「紙の感覚」とか「ぱらぱらめくれる」といったハードウエア的な側面です。そんなもん、電子出版物のメリットに比べたら取るに足らないというのが電子出版に対してポジティブな人の意見でしょう。ここの対立は分かるのですが、この対立点から連想されるのは、「読書体験」の違いです。大まかに言えば、紙の書籍と電子出版物はコンテンツはまったく同一なので、中身が違うということは基本的にないでしょう。もちろん、ePubだとレイアウトがいまいちなことがあるなど細かい問題はさておきます。同じ内容なのになぜ違うフィーリングになるのかという問題が「読書体験」です。

紙だからここがいいという言い方は、電子出版に対する単なるないものねだりになりますので、言い方を変えてみましょう。電子出版に欠けるものの1つは、書籍の所有感覚の違いではないかと思います。もっとも、人によってそれも違うのですが、多くの人は、昔からずっと使っている書籍があると思います。1年に1回しか見ない書籍も、毎日のように見る書籍も、そして、以前は毎日見たけど、最近は本棚に置きっぱなしという書籍もあれこれあるのですが、それぞれが、同一の厚みを持った紙の固まりとして書棚にあるわけです。見たい書籍は、自分の本棚を探します。もちろん、見当たらない場合もあるでしょう。しかし、けっこうどこに並べておいたかがだいた分かるので、久しぶりに見る本でも、本棚をざーっと見て探し当てます。書籍の背表紙の色だとか、ちょっと高さが高めだったりとか、そういう特徴は意外に覚えているものです。それを手がかりに探したりをしまし。

つまり、電子書籍は、本棚に相当するものが提供できていません。もっとも、これは提供側からすれば、「できている」という感覚だと思います。専用タブレットでも、MacでもWindowsでも、Kindoleだったら見れる。つまり、Kindleが本棚だろうという言い方ができます。iBooksは突っ込みどころ満載ですかね。いずれにしても、各社はそれぞれが本棚を提供しているつもりなんじゃないかと思います。一方、単にコンテンツだけを提供している場合もあります。いずれにしても、リアルな本棚に相当するものが今は提供できていないと言えるでしょう。

なぜか? これは明確です。タブレット各社あるいはサービス提供各社が、囲い込みを解かないからです。そのように見せない工夫は随所にあるものの、本棚のように、世界中のすべての出版物に対応したものがないわけです。各社とももちろん、アピール点はあるのですが、それは提供側の論理であり、消費者側の論理とはマッチしません。私たち読者は、あれこれ工夫をしながら、書籍コンテンツを自分で管理するわけです。しかし、大量になると安直には行きません。iBooksのように、本棚のようなグラフィックスを出しているのはどうでもいい話で、デジタル化されたコンテンツの本棚に相当するものができない限りは、過去の読書体験を上回ることはできないでしょう。言い換えれば、特定のタブレットで完結させようとしているのは各社さん見え見えなんですが、それを遣り過ぎるとそろそろ自分の首を絞め始める時期に来ているのじゃないでしょうかと考えます。

もちろん、各社のタブレットは、電子出版の立ち上がりにおいては、一般の人たちに意味が理解しやすい素材として重要な役割を果たしました。その点は功績は高いでしょう。しかし、従来の読書体験を阻害する要因にもなり始めているとも言えるのです。

FileMakerリレーションパターンを始めます

FileMakerのパターンについては、以前にいくつかサイトがあったようですが、fmpatterns.comだったかは応答なくなっていますし、こちらはリンク切れ気味です。まあ、オブジェクト指向の世界では90年代にパターンのブーム的なものもあったのですが、FMについては、2000年代の後半あたりにそのムーブメントがやってきて、そろそろおしまいなのでしょうか?

とは言え、パターン自体は確立した手法でもあるので、私の著書「リレーションで極めるFileMaker」(改訂版はRとの共著)にある解説内容を、パターンとして記述することを今検討中です。最近日本でも翻訳が出た「SQL Antipatterns」にも触発されました。

英語でのFileMakerに関するパターンは、誰かがWikiを立ち上げて、それにみんなが記述するという方法は取っていまして、まずはみんなの英知を集めいたいという意思は感じられます。ところが、パターン記述の定石とも言える、「決められた項目に従って記述する」ということが結局守られず、名前とやり方だけが掲載されていて、微妙に自慢大会状態になっていました。

パターンがなぜ使われるかというと、問題解決につながるからです。そのためには、開発作業に名前を付けるのはパターンの本質ではなく、発生した問題からパターンにたどり着くパスが必要なのです。そういう記述を、現状では工夫して行うということになりますが、やっていく必要があります。それを意識しながら、パターンを記述して行きたいと思っています。

ということで、これは前振りでした。

学校として成り立つには何が必要か?

私自身、ある学校でiOSの開発のことを教えており、このことを書くべきかどうか、同業者のことなのでちょっと迷ったのですが、きっかけのことがあってからやや時間が空いているので書く事にしました。自分の考えを残すのがブログの1つの役割でもあります。

ちょうど、2〜3年ほど前、複数の人からまったく同じ依頼を受けました。一部の方には個人レッスンもしました。依頼というのは「あるスクールへ通ったのだけど、まったく何も勉強できなかった」というものです。実際、個人レッスンしても、けっこう当たり前のことでつまずいていたのです。どこでどんなことを習ったのかを聞き、みなさん、同じことをおっしゃいました。もちろん、どの学校なのかはここでは伏せますが(とは言え関係者にはすぐ分かるでしょう)、その学校に行けば、「まとまった数のアプリケーションが作る事ができる」という点に実用性を感じたということなのです。また、値段的にも安いということもあったみたいです。

そういうわけで、みんな期待するのはそのスクールへ行けば、自分もアプリケーションを作れるようになるだろうということです。ところが通ってみると、テキストが配られ、アプリケーションのソースとちょっとした解説があり、その通りに入力してアプリが動いた〜というのの繰り返しだそうです。当然、動くアプリのプログラムだから、動く訳ですが、その繰り返しで、何十もアプリケーションを作った上に、さて、自分で作りたいアプリケーションがあるのだけど、プロジェクトを作った後にハタと手が止まるというわけです。

このスクールはかなりメディア露出もしたりして、そこそこ有名であり、かなり多数の受講者がいるようなことが紹介されています。だけど、同じようなことを言う人に何人にも出会い、私にとってはこのメッセージのタイトルの内容、つまりは学校とはなんぞやという考える契機になりました。

もっとも、「サンプルアプリケーションをたくさん作る」点はけっして悪くはないと思います。スクール側は期待するのは、実例から学ぶということでしょう。きちんとした実例は確かに手本ではあります。しかし、単に作業として進めてしまうと疑問に思う事なく進めてしまい、実は何も理解していない人も発生します。それは受講者の力量だろうと言ってしまうと、学校ってそこで終わるのです。学校の最終目標は、当然ながら生徒の能力を高めることに尽きるのです。ただ、100%それが達成できないだろうとか、絶対はないとか、いろいろエクスキューズはあるでしょう。しかし、学校として、全部の生徒に対する能力を高める努力をしないというのは正しいあり方ではありません。もちろん、そのスクールでは、実際にiOSのアプリをApp Storeに登録した人もたくさんいるらしく、まったくだめなわけではないようですが、一方で、私個人の周囲にも、失礼ながら落ちこぼれた人が何人もいるというのは、多分、成功者の方が少ないのじゃないかと想像できます。

ちなみに、そのスクールで結果を出した人ってのは、どうやら、作業をした後に、講師をしっかり捕まえて、あれこれ質問をした人ということを聞きました。その人は、手本と自分の知識の対比を判断でき、ギャップを埋める努力をしたということです。その方は、たぶん、一般より安い受講料で高い効果を得たという意味で、得るもの多数あったでしょう。しかしながら、聞くところによると、そういう人はごく小数、特に誰かが講師をスタックしたら、結局他の受講者は質問すらできないような場合もあったりするということです。まあ、実際には常にそうではないのかもしれませんけど、そういう状況が1回でもあると、受講している人は悪い状況を印象深く記憶するものです。

ただ、残念なことに、そうしたスクールの成功事例を「アプリケーションのサンプルを作らせる」という点に集約して、それによって儲かるみたいな話に流れている傾向があります。学校もベースはビジネスです。もちろん、儲かるという点は重要です。しかし、明らかに楽に儲かる方法みたいなパターンとして理解されているのはほんとうに残念です。サンプルベースでの学習の方法についてはは、ここでは詳細は書きませんが、実際のところは運用は難しいです。本来、学習には王道はないという前提があるとします。すると、学校というのは究極的には生徒に苦労させ、また言い換えればつまずかせて、その状況を打破する手伝いをし、そこから生徒は何かを得るという状態を作るということが求められます。苦労するのは当たり前だけど、そこで手を差し伸べるのが学校の役割と考えます。サンプルベースの学習でもそれは可能ですが、すくなくとも作業として集約させれば、苦労やひっかかりはありません。その場では「至ってスムーズ」としか思わないでしょう。そうではなくて、むしろ、ひっかけ、あるいはひっかかりをうまくコースの中に入れることによって、自力で解決させるような手法を取るほうが、本来の学校の機能を満たすと思います。

別にそのスクールがある前から、私は同じような事を言ってきており、そういう手法はどうなのかときかれることも多々あり、上記のようなことをお話することも何度もありました。結果的に学校に行っても地力が身に付かなかった人が多く出てくると、市場が飽和した段階で挽回する手段はなくなります。それは、学校にとっても生徒にとっても幸福な話ではないでしょう。長らく学校にかかわっている人はその意味が分かると思います。来シーズン(つまり4月から)、こういう主張をする私をラインからはずす学校がある一方で、こういう主張が正しいということでライン拡充を依頼するところもあります。もちろん、ラインからはずされれば何もできないのではありますが、一方で、本筋を忘れないで、かつ今時の市場環境において受け入れられるテイストってのもやっぱり考えて、がんばってやろうかなと思った次第でした。

ディスプレイを追加

そういうわけで、BenQの24インチGL2450、USB to HDMI Adapterが到着して、こんな状態になりました。写真がヘタですみません。右が、AppleのLED Cinema Display 27″、左がBenQの24″、右端はMacBook Air、左端はiPad 3rdです。AppleのDisplayの下にはNexus 7とCloud Communicatorなんかもあります。アダプタのドライバは古いものしか製品にはなかったのですが、こちらから最新版がダウンロードできました。

IMG_0018

それで、大画面2台の見え方がけっこう違います。当然、Appleの方がきれいなんですが、まあ、そいういう用途ではなく、ドキュメントなどを開いておくためのものなんで、あまり気にはしていません。ただ、BenQの方はまぶしい…。輝度0にしても、まだまぶしいです。

最初、「システム情報」のシステムレポートで見てみると、2項目は見えたのだけど解像度がおかしいと思ったのですが、ここに見えるのは、MacBook Airのディスプレイチップから接続されている、内蔵の液晶パネルと、Cinema Displayだけのものでした。小さい方の解像度は内蔵ディスプレイです。

ScreenSnapz001

アダプタ+BenQは、システムレポートとしては、USBのカテゴリにしか見えません。これは、「システム情報」がUSBアダプタのディスプレイなどには対応していないということですかね。

スクリーンショット 2013-02-19 11.44.57