IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  XML | Web development  >

XML の論考: マイクロフォーマットよりも軽いピコフォーマット

X のない Ajax、不等号括弧のないマイクロフォーマット

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

ダウンロード

原文はこちら

原文はこちら


レベル: 初級

Dethe Elza (delza@livingcode.org), Senior Technical Architect, Blast Radius
David Mertz, Ph.D (mertz@gnosis.cx), Author, Gnosis Software, Inc.

2006年 8月 01日

David Mertz は以前の XML の論考コラムの中で、大部分がテキストである文書をフォーマットするための軽量マークアップ言語、reStructuredText を解説しました。またその前には、大部分がデータである文書のための軽量マークアップ言語、YAML を取り上げました。AJAX とマイクロフォーマットが一般的になってきたことを考えた場合、これらは相変わらず便利なのでしょうか。あるいは、マイクロフォーマットは十分「軽量」なのでしょうか。Xのない AJAX 用に MochiKit を利用し、またマイクロフォーマットの生成に reStructuredText を適用して、 (YAML よりも軽量な) JSONを活用する方法を学びましょう。

XML は、文書のマークアップにも、構造化されたデータのマークアップにも使われています。これはどの視点で見るかによって、XMLの最大の強みであるとも、最大の弱みとも言われてきました。文書とデータの境界が曖昧な場合にはXML が有利ですが、XML は一般的なソリューションであり、問題に特化したソリューションに比べると複雑です。Davidは以前、YAML を取り上げました (参考文献を見てください)。YAML はマークアップ言語ではありません。いや YAML は、もう1 つのマークアップ言語、つまり Yet Another Markup Language: YAML であり、データ(数字やストリング、リスト、単純な構造など) のトランスポートが XML よりも単純に行えるように考えられた方言です。この記事では、JSON(JavaScript Object Notation) に焦点を当てます。JSON は YAML のサブセットですが、作成や構文解析は、YAMLよりもさらに容易です。JavaScript や Python では、もし JSON が信頼できるソースのものである場合にはスクリプト・エンジンによって単純に評価されますが、あまり信頼できないソースからのJSON のために、パーサーがあります。

文書からデータへと広がるスペクトル上の、データに近い側から取り組むためにJSON を使いますが、構造化テキスト・フォーマットを使うと、文書という色のついたメガネをかけてマイクロフォーマットを処理することができます。構造化テキスト・フォーマットを使う手法には、reStructuredText と Markdown、そして Textile という、主に 3 つがあります (Wiki にあげられている数多くものは除きます)。この記事では、この3 つについてそれぞれ調べ、これらがマイクロフォーマットを、少なくとも理論上はどう処理するかについて考えます。

マイクロフォーマットの中には何があるのか

マイクロフォーマットには、どんな種類のデータが含まれているのでしょうか。(通常は)少量のデータを、人あるいはマシンのいずれか一方が容易に処理できる形式で入れる、ということがマイクロフォーマットの要点です。ですからこの制約を無視して、人あるいはマシン用にデータをエンコードし(両方を満足させませんが)、マイクロフォーマット化されたデータが得られるように処理すると、いくらか得したように見えるかもしれません。一般的なhCalendar の例には、次のような情報が含まれています。

  • 要約とタイトル
  • 位置
  • URL
  • 開始日 (オプションとして時刻)
  • 終了日 (オプションとして時刻)
  • タイムゾーン
  • 説明

エンコードの対象は、それほど多くありません。リスト1 は hCalendar のイベント例を示したものです。


リスト1. hCalendar のイベント
                
<div class="vevent">
    <a class="url"
        href="http://www.vanpyz.org/conference/keynotes.html">
        <abbr class="dtstart" title="20060804T1900-0700">
            August 4, 2006 - 19:00
        </abbr> -
        <abbr class="dtend" title="20060804T2100-0700">
            21:00
        </abbr> -
        <span class="summary">
            Vancouver Python Workshop Keynotes
        </span> - at
        <span class="location">
            Fletcher Challenge Canada Theatre,
            SFU Harbour Center,
            Downtown Vancouver
        </span>
    </a>
    <div class="description">
        <p>The Vancouver Python Workshop keynote address is an
        opportunity to hear from leading members of the Python
        community. This years speakers are Guido van Rossum of
        Google and Jim Hugunin from Microsoft.</p>
    </div>
</div>

これから余計なものを省いて、本質的なデータのみを取り出すと、同じイベントをJSON を使ってエンコードすることができます。日付や時刻、タイムゾーンは、日付や時刻のフォーマットの標準であるISO8601を使ってエンコードされていることに注意してください (ISO8601 自体がマイクロフォーマットです。参考文献を参照) 。リスト2 の例は、JavaScript あるいは Python で有効なコードです。


リスト2. JSON を使ってエンコードしたもの
                
event = {
    'title':  'Vancouver Python Workshop Keynotes',
    'location': 'Fletcher Challenge Canada Theatre, \
                 SFU Harbour Center, Downtown Vancouver',
    'url': 'http://www.vanpyz.org/conference/keynotes.html',
    'start': '2006-08-04T19:00-0700',
    'end': '2006-08-04T21:00-0700',
    'description': 'The Vancouver Python Workshop keynote address\
     is an opportunity to hear from leading members of the Python\
     community. This years speakers are Guido van Rossum of Google\
     and Jim Hugunin from Microsoft.'};

この後を読めば分かると思いますが、このフォーマットは Web 上で容易に渡し合うこともできます。そうすると、悪だくみがふくらんできます。




上に戻る


文書の中にデータがある

マイクロフォーマットのコンテンツに対して JSON を使う手法は、データ側からの手法です。文書側からマイクロフォーマットを扱う手法としては、構造化テキストを使います。hCalendarは、reStructured Text を使って書くとどうなるのでしょう。reST では、ディレクティブを使ってプラグイン・エクステンションを作成することができます。ですから、hCalendar風のデータを構文解析するディレクティブは、下記のようなものになります。

.. event::

    LOCATION: Fletcher Challenge Canada Theatre,
    SFU Harbour Center, Downtown Vancouver
    DTSTART: TZID=America/Vancouver:20060804T190000
    DTEND: TZID=America/Vancouver:20060804T210000
    SUMMARY: Vancouver Python Workshop Keynotes
    DESCRIPTION: The Vancouver Python Workshop keynote address
    is an opportunity to hear from leading members of the Python
    community. This years speakers are Guido van Rossum of Google
    and Jim Hugunin from Microsoft.

ここで 1 つ、面白いことがあります。hCalendar の仕様は、それまでの iCalendar標準を HTML のサブセットにマッピングしたものです。では、この不可思議なiCalendar とはどんなものなのでしょうか。リスト3 は、同じイベントを iCalendar で表現したものです。


リスト3. iCalendar でのイベント
                
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
BEGIN:VEVENT
DURATION:PT3H
LOCATION: Fletcher Challenge Canada Theatre,
SFU Harbour Center, Downtown Vancouver
DTSTAMP:20060615T034522Z
UID:FE31377A-AB78-4D99-BC25-3F09C99E5928
DTSTART;TZID=America/Vancouver:20060704T100000
SUMMARY:Vancouver Python Workshop Keynotes
DESCRIPTION:The Vancouver Python Workshop keynote address
is an opportunity to hear from leading members of the Python
community. This years speakers are Guido van Rossum of Google
and Jim Hugunin from Microsoft.
END:VEVENT
END:VCALENDAR

そうです。iCalendar は、比較的単純に構文解析できるテキスト・ベースのフォーマットです。構文解析のためのライブラリーもあり、その結果を自分の好きな言語で操作することができます。ですから、hCalendarの全データ要素をとる reStructured Text 用にディレクティブを実装することもできますが、そんなことをしなくても、..include:: ディレクティブを修正し、(hCalendar としてフォーマットされた)iCalendar コンテンツを直接含められるのです。Appleの iCal など既存の多くのツールは、iCalendarフォーマットをインポート、エクスポートできるため、このフォーマットを直接再利用できると非常に便利です。ここでは簡単にするために、また著者のDethe が reStructured Text の開発リーダーである David Goodger と共著で既にチュートリアルを書いているので、reStructuredText での疑似命令の追加や修正の詳細には触れないことにします (参考文献を参照)。




上に戻る


空気よりも軽いですが、吸い込むのは簡単ではありません

JSON には、YAML あるいは XMLよりも単純なデータ・フォーマットがありますが、reStructuredText は少しばかり複雑なツールかも知れません。reStructured Text 文書は XMLよりも簡単に読むことができ、全機能を使おうとしなければ、XML よりも単純です。しかし、大量のディレクティブやテーブル、その他の機能を追加し始めると、Detheによる Complexity Meter の針が動き始めます。JSON は、特化すること (DSL(Domain Specific Language) に至る、一般的なトレードオフ) によって単純さを実現しています。そのため、reStructured Text の機能や柔軟性の一部を犠牲にしても構わなければ、構造化テキストをさらに単純化することができます。そして実際のところ、さらに軽量な、文書中心のフォーマットが存在するのです。

ここでは、Textile と MarkDown を解説することにします。この 2 つは、より一層軽量な構造化テキスト用のオプションであり、これらを使うと、マイクロフォーマットのデータを容易に作成することができます。残念なことに、これらのツールの持つ、文書中心のコンテンツを作成する上で便利な特徴は、hCalendarのようなデータ中心の作業には、あまり役に立ちません。Textile には <div>や <abbr> のためのマークアップがなく、また、<a> にクラスを追加する方法がありません。Textileは非常に柔軟であり、class や id、style などの属性を追加することは容易ですが、title属性を追加するための機構がありません。また MarkDown には、属性を追加するための機構がまったく無く(ただし PyMarkdown には、そのサポート用のエクステンションがあります)、<div>や <abbr> のための構造もありません。どちらのシステムも、既にフォーマットされたHTML をパススルーすることはできますが、そうすると、そもそも軽量フォーマットを使う利点がなくなってしまいます。

こうした軽量マークアップ言語がマイクロフォーマットをサポートしないことは、よく理解できることです。マイクロフォーマットの本質はデータですが、Textileも MarkDown も、Web を記述することに焦点を絞ったツールなのです。両者とも、ちょっとしたフォーマット作業のみで言いたいことを表現できるように作られていますが、マシンが読み取れるデータを挿入する、という問題は無視しています。これはXML の持つ古い問題、つまり XML はデータ (マシンが読み取り可能な情報) 用とコンテンツ(人が読み取れるテキスト) 用の両方に使われる、という問題に根ざしています。構造化テキスト・フォーマットはもっぱらコンテンツ側から取り組み、一方YAML や JSON は、もっぱらデータ側から取り組んでいます。どちらも XML と同じくらい、あるいはXML よりもうまく仕事をこなしますが、マイクロフォーマットにあるように、データとコンテンツの境界が曖昧なところでは、そのギャップを越えると、トラブルが起きる可能性があります。




上に戻る


JSON と REST

JSON を使った数多くの例を見ると、ブラウザーが、GET を使ってサーバーからJSON メッセージを受信している様子がわかります。しかし REST のパラダイムには、GETと POST、PUT、そして DELETE という 4 つの動詞があり、それだけの理由があるのです。GETを使うと、何ら副作用もなく Web リソースを取得することができます (つまり、GETは繰り返し実行しても 1 回だけ実行した場合と結果は同じ (idempotent: べき等)です)。POST は新しいリソースを作成し、PUT は既存のリソースを更新し、DELETEはリソースを削除します。私たちは良き REST 市民でありたいと望んでいるので、これらの4 つの動詞を使って、JSON データを移動する単純なフレームワークを作ってみましょう。

下記は CGI プログラム用の Python コードです。このコードは、JSON コードの塊を移動させるための、最も単純なスケルトンをカプセル化したものです。ここでは、BobIppolito による simplejson ライブラリーを使って、Web から受信されるストリングを単純にeval するよりも安全に JSON の構文解析をしています。います。もちろん、RESTインターフェースを作る場合には、こんなに単純には済みません (リソースそれぞれに対してURI を作成することは大仕事です)。詳しい情報については、参考文献を見てください。リスト4 は、最も単純な REST/JSON サーバーです。


リスト4. REST/JSON サーバー
                
#!/usr/local/bin/python

'''
Minimal JSON REST server
'''

import os
import cgi
import cgitb
cgitb.enable()
import simplejson

sample_data = {'name': 'King Arthur',
    'quest': 'To seek the holy grail',
    'airspeed_of_unladen_European_swallow': '24 MPH'}




def post(args):
    '''
    Used to create a new resource
    '''
    new_uri = 'http://example.org/' # URI of newly created resource
    sample_data['result_uri'] = new_uri
    print simplejson.dumps(sample_data)


def put(args):
    '''
    Used to update an existing resource
    '''
    sample_data.update(args)
    print simplejson.dumps(sample_data)


def get(args):
    '''
    Used for any side-effect free request
    '''
    print simplejson.dumps(sample_data)

def delete(args):
    '''
    Used to remove an existing note
    '''
    print simplejson.dumps({'content':'None'})


def main():
    method = os.environ.get('REQUEST_METHOD', 'GET')
    if method == 'GET':
        args = None
    else:
        json_value = cgi.FieldStorage().getfirst('json_value')
        args = simplejson.loads(json_value)
    if method == 'POST':
        method = args['method'] # fix for browsers that don't
                                # send PUT or DELETE properly

    # Start an HTTP response
    print "Content-type: text/plain"
    print ""

    # Python dispatch idiom using a dictionary vs. case-statement
    dict(POST=post,
         PUT=put,
         GET=get,
         HEAD=get,
         DELETE=delete)[method](args)

if __name__ == '__main__':
    main()

リスト4 は、サーバーサイドの REST と JSON の基本部分を処理します。クライアントサイドとしては、Webページに埋め込み可能な、ちょっとした JavaScript を Dethe が書いています。この例も、BobIppolito によるコード (今回は MochiKit JavaScript ライブラリーで、私たちのお気に入りです)を利用しています。リスト5 は最も単純な JSON/REST クライアントのコードです。


リスト5. 単純な JSON/REST クライアント
                
//
//   rest.js
//
//   Simplistic framework for bi-directional JSON transport via REST
//

SERVER = 'http://localhost/rest_cgi.py'

function handle_success(result){
    alert('Success: ' + result.responseText);
}

function handle_error(result){
    logError(result.responseText);
}

var sample_content = {'name': 'Sir Lancelot',
         'quest': 'To seek the holy grail',
         'favorite_color': 'blue'};

function _sendVerb(verb, content, handler){
    var req = getXMLHttpRequest();
    // Certain browsers don't actually support verbs besides GET
    // and POST, spoiling the party for the rest of us
    content['method'] = verb;
    if (verb != 'GET'){
        verb = 'POST'
    }
    req.open(verb, SERVER);
    # queryString is the easiest way to send data to the server
    json_content = queryString(['json_value'],
        [serializeJSON(content)]);
    var req = sendXMLHttpRequest(req, json_content)
    req.addCallbacks(handler, handle_error);
}

function get(){
    _sendVerb('GET', '', handle_success);
}

function post(){
    _sendVerb('POST', sample_content, handle_success);
}

function put(){
    _sendVerb('PUT', sample_content, handle_success);
}

function test_delete(){
    _sendVerb('DELETE', sample_content, handle_success);
}




上に戻る


JSON を運ぶもの

リスト4リスト5 のコードを使えば、JSON のデータを自在に送信することができますが、まだ少し手を加える必要があります。ここまでのことを考えると、サーバーサイドを処理するのかクライアントサイドを処理するのか、そして最終的な目標に応じて、hCalendarあるいは iCalendar に逆に変換できるようにした方が自然です。例えば、クライアントサイドでMochiKit を使って (特に DOM ショートカット関数を使って) リスト2 の JSON データ用に単純なテンプレートを作成し、リスト6 に示すように handleSuccess() 関数を置き換えることによって、ブラウザーの中でhCalendar に再フォーマットすることができます。


リスト6. handleSuccess() 関数を置き換える
                
function handleSuccess(result){
    var data = evalJSON(result.responseText);
    // Convert json data to DOM nodes
    var hCalendarData = objectToCalendar(data);
    // In a real application we would add/replace this in our
    // Web page somewhere, but for this demo we'll just display it.
    alert(toHTML(hCalendarData));
}

var ABBR = createDOMFunc('abbr');

function pad2(number){
    if (number < 10){
        return '0' + number;
    }else{
        return '' + number;
    }
}

function time(date){
    return pad2(date.getHours()) +
        ':' +
        pad2(date.getMinutes());
}

function objectToCalendar(obj){
    var startDate = isoTimestamp(obj.start);
    var endDate = isoTimestamp(obj.end);
    var cal = DIV({'class':'vevent'},
                  A({'class':'url', 'href': obj.url},
                      ABBR({'class':'dtstart', 'title': obj.start},
                          startDate.toLocaleDateString(),
                          ' - ',
                          time(startDate)
                      ),
                      ' - ',
                      ABBR({'class': 'dtend', 'title': obj.end},
                          time(endDate)
                      ),
                      ' - ',
                      SPAN({'class': 'summary'}, obj.summary),
                      ' - at ',
                      SPAN({'class': 'location'}, obj.location)
                  ),
                  DIV({'class':'description'},
                      P(obj.description)
                  )
              );
    return cal;
}

リスト6 のコードを見ただけではよくわからない人のために説明すると、MochiKit では数多くのHTML DOM ショートカット関数が定義されているのです。これらを使うと、hCalendar断片のDOM 構造を非常に容易に作成することができます。<abbr> 要素のための組み込みショートカットはないため、このコードでは、それも作成しています。MochiKitは ISO8601 フォーマットと JavaScript Date オブジェクトとの間で変換を行いますが、Dateオブジェクト用の、組み込みのストリング描画機能ではうまくいきません。そのため、少しばかり自分でコーディングを行う必要があります。このコードには特別難しいものはありませんが、まだよくわからない場合には、第1 級の MochiKit ドキュメンテーション (参考文献を参照) を読むようにお勧めします。

これで、AJAX を使ってJSON データをブラウザーに送れるようになりました。そして、ブラウザー内テンプレート機能を使ってhCalendar にフォーマットすることができます。これによって、流行の言葉に完全準拠できただけではなく、実際に皆さんにとって便利なものに近づいたはずです。




上に戻る


分かれ道のゴミを除く

この記事で説明したことから、皆さんは何を得たのでしょう。reStructured Textの中に iCalendar を含めることや、hCalendar ではなく JSON のデータをブラウザーに送信することは、本当に便利なのでしょうか。なぜ、単純にバイナリーあるいはXML でエンコードして終わり、ではいけないのでしょう。

ここで解説した手法が便利なものかどうかは、結局のところコンピューター・サイエンスにおける古い格言に行き着きます。つまり「場合による」のです。RESTベースの Web サービスを構築した場合には、XML ではなく JSON を使ってデータ転送した方が速く、しかも便利です。より容易に(そして読みやすい) HTML コンテンツを作成するために reStructured Text を使った場合には、HTML形式 (hCalendar) あるいはプレーンテキスト形式 (iCalendar) でマイクロフォーマットを直接含められる機能が便利です。新しいシステムを構築する際には、どちらの手法も考慮に値するはずです。

マイクロフォーマットの究極的なゴールは、データをマシンで構文解析しやすく保ったまま、人にも構文解析しやすくすることです。マイクロフォーマットの哲学は、既存のセマンティック・フォーマット、特にHTML を可能な限り再利用することなのです。AJAX や JSON、REST のどれを使っても、マイクロフォーマットのためのシステムや様々なコンテンツの構築を容易に、そして表現力豊かに行うことができます。その一方、軽量マークアップによって、そうしたシステムのためのコンテンツ作成や編集が容易かつ迅速にでき、人が扱いやすいものになります。つまり、こうした手法には存在意義があり、これらを組み合わせることでシナジー効果が期待できるのです。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
Example codex-matters46-examples.zip3KBHTTP
ダウンロード形式について


参考文献

学ぶために
  • 「XMLの論考: reStructuredText」 (David Mertz 著、developerWorks、2003年2月) を読むと、軽量マークアップがXML の改善であることがわかります。

  • 「XMLの論考: YAMLはXMLに改良を加える」 (David Mertz 著、developerWorks、2002年10月) は、XML を使用したデータ転送を考える場合にYAML が使えることを解説しています。

  • 「XMLの論考: マイクロフォーマットのパイプストリーム」 (Dethe Elza 著、developerWorks、2006年4月) は、適当な XML 方言ではなくマイクロフォーマットを使うべき場合について解説しています。

  • 「XMLの論考:Atom駆け足解説」 (Dethe Elza 著、developerWorks、2006年5月) は、理想的な REST インターフェースとしてAtom Publishing Protocol を解説しています。

  • JSON を世界に紹介した、Douglas Crockford のサイト、「Introducing JSON」を訪れてください。様々なプログラミング言語で JSON を使うための記事やサンプル、ライブラリーなどへのリンクが用意されています。

  • Python の docutils プロジェクト、Restructured Text を訪れてください。ほとんどは reStructured Text に関するものですが、reStructuredText は HTML だけではなく、XML や PDF、スライド、DocBook などのフォーマットを生成することができます。例えば著者らは、この記事をreStructured Text を使って書きました。

  • John Gruber による、軽量マークアップ競争への出場候補、Markdown を調べてみてください。著者らが試したところ、非常に明確で読みやすいテキストを生成しました。またブログに使ってみましたが、明確さにはコストが伴います。拡張は簡単ではありません。

  • Dean Allen による、軽量マークアップ用のフォーマット、Textile を調べてみてください。(著者らによる非常に主観的な意見ですが) Markdownと同じくらい読みやすく、しかも ID やクラス属性が許されています。CSS スタイルは、文書に(そして、できあがる HTML に) 直接埋め込むことができるため、柔軟性が向上した反面、読みやすさは少し低下しています。

  • 日付や時刻、時刻範囲などをテキストでフォーマットするための ISO8601 パターンを Markus Kuhn が要約していますので、お読みください。

  • REST インターフェースを作成する際に考慮すべき問題を詳述した、Joe Gregarioによる記事「How to create a RESTful Protocol」をお読みください。

  • 「Calculating the average airspeed of an un-laden sparrow」では、何世代にも渡ってアーサー王学者を悩ませてきた問題が取り上げられています。

  • Dethe Elza と David Goodger、そして Felix Wiemann の共著による、reStructuredText プロセッサーに新しい疑似命令を追加するためのガイド「Creating reStructured Text Directives」をお読みください。

  • XML 1.1 および関連技術においてIBM認証開発者になる方法については、こちらを参照してください。

  • developerWorks の XML ゾーンを見てください。広範な内容を網羅した技術記事やヒント、チュートリアル、技術標準、IBMRedbook などが用意されています。

  • developerWorks technical events and webcasts を利用して、最新技術を学んでください。


製品や技術を入手するために
  • JSON データを安全に構文解析し、シリアル化するための Python ライブラリー、「Simple JSON」を試してみてください。

  • MochiKit を利用して、様々なブラウザーに対して JavaScript と DOM を正規化し、また、様々なユーティリティーを入手してください。大部分のユーティリティーはPython 的です。

  • Dean Allen による Textile 軽量マークアップ・システムを Python に移植した、PyTextileを入手してください。この開発者のサイトは消えてしまったようなので、リンクはarchive.org の Wayback Machine に行きます。

  • iCalendar for Python を訪れ、Python で使用するための、iCalendar ファイルのパーサー兼ジェネレーター、iCalendarパッケージを試してください。これは RFC 2445 (iCalendar) 仕様に従っています。

  • Chandler プロジェクトから、vCalendar と vCard ファイルを構文解析し、生成するためのPython パッケージ、vobject を入手してください。

  • 皆さんの次期開発プロジェクトを、IBM trial software を使って構築してください。developerWorks から直接ダウンロードすることができます。


議論するために
  • XML zone discussion forums に参加してください。これらのフォーラムでは、XML を中心に議論が行われています。

  • developerWorks blogs から developerWorks のコミュニティーに加わってください。


著者について

Photo of Dethe Elza

Dethe Elzaは自分の肩書きとして、Chief Mad Scientistを好んでいます。彼の連絡先はdelza@livingcode.orgです。主にPythonとMac OS Xを話題にする、http://livingcode.blogspot.com/というブログを持っており、また自分の子供たちのためにプログラムを書いています。このコラムに対する助言を歓迎します。


Photo of David Mertz

David Mertz氏は多くの分野で活躍しています。ソフトウェア開発や、それについて著述もしています。その他、学術政策理念について分野を問わず、関係する雑誌に記事も書いています。かなり以前には、超限集合論、ロジック、モデル理論などを研究していました。その後、労働組合組織者として活動していました。そして、David Mertz氏自身は人生の半ばにもまだ達していないと思っているので、これから何かほかの仕事をするかもしれません。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ