1. トップページ

CakePHP の Upgrade shell

2013年04月05日

今まで CakePHP 1.3.15 を使用していたのだが、ARC2 を利用することになったので PHP のバージョンが必然的に 5.3 以降となった。

折角なので CakePHP 2 にアップグレードでもしようかと思ってたのだが、これが面倒極まりない。

CakePHP 2 に付属している Upgrade shell を利用すれば簡単にアップグレードが可能だと思っていたのだが、考えが甘かった。

フォルダーのリネーム一つとっても Controller とすべきなのに controllers のままだったり layouts や elements もそのままになっている。

実際にアクセスしても以下のようなエラーが出てしまう。

Notice: Undefined index: Error in C:\Users\admin\Downloads\xampp\htdocs\cakephp2\lib\Cake\Core\Configure.php on line 99

Notice: Undefined index: Exception in C:\Users\admin\Downloads\xampp\htdocs\cakephp2\lib\Cake\Core\Configure.php on line 100

Fatal error: Class name must be a valid object or a string in C:\Users\admin\Downloads\xampp\htdocs\cakephp2\lib\Cake\Error\ErrorHandler.php on line 122

一つ一つファイルを CakePHP 2 用に書き換えるのも面倒なのでやめた。CakePHP 3 の開発も行われているようなので CakePHP 1.3.15 で様子見でいいかな。

タグ: PHP

死について

2013年04月05日

死というのはある種の恐ろしさと同時に、ある種の美しさを持ち合わせているように思う。不思議なものだ。

匿名通信のアルゴリズム

2013年03月31日

Tor や I2P で用いられている匿名通信のアルゴリズムが紹介されている。よくまとめられていて分かり易い。

PHP 5.3 のサポートが終了

2013年03月27日

マイナビニュースやスラッシュドット・ジャパンに PHP 5.3 のサポートが終了する記事が掲載されていた。

記事中には5.3がもっとも高いシェアを占めたと書かれているが、私の知る限り無料のレンタルサーバなどでは未だに PHP 5.2 が主流のように感じる。場合によっては PHP 5.1 や PHP 5.0 でサービスを提供している所もある。

全ての人が最新バージョンという恵まれた環境の中でウェブサイトを作ることが出来るわけではないのだ。

ICRA(Internet Content Rating Association) が終了していた

2013年03月27日

久々にインターネットにおけるレイティングを調べている中で分かったことなのだが ICRA によるラべリングは終了したようだ。

Upon the recent decision of FOSI's Board of Directors, the ICRA labeling engine has been discontinued. While all current labels will continue to work with Internet content filters, the ICRA label generator, ICRA tools and Webmaster support will no longer be available.

ICRA は HTTP Response Header で使用する PICS-Label の値やサイトのレイティングを記述した RDF/XML を生成してくれるジェネレータなどを提供していただけに少し残念だ。

ちなみに ICRA のジェネレータによって生成された RDF/XML は以下のようなものである。

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:label="http://www.w3.org/2004/12/q/contentlabel#"
    xmlns:icra="http://www.icra.org/rdfs/vocabularyv03#"
>
    <rdf:Description rdf:about="">
        <dcterms:creator rdf:resource="http://www.icra.org" />
        <dcterms:created>2011-04-30</dcterms:created>
        <dcterms:modified>2011-04-30</dcterms:modified>
        <label:authorityFor>http://www.icra.org/rdfs/vocabularyv03#</label:authorityFor>
    </rdf:Description>

    <label:Ruleset>
        <label:hasHostRestrictions>
            <label:Hosts>
                <label:hostRestriction>japan.nusutto.jp</label:hostRestriction>
            </label:Hosts>
        </label:hasHostRestrictions>
        <label:hasDefaultLabel rdf:resource="#label_1" />
    </label:Ruleset>

    <label:ContentLabel rdf:ID="label_1">
        <rdfs:comment>Label for all/most of website</rdfs:comment>
        <icra:nz>1</icra:nz>
        <icra:sz>1</icra:sz>
        <icra:vz>1</icra:vz>
        <icra:lz>1</icra:lz>
        <icra:oz>1</icra:oz>
        <icra:cz>1</icra:cz>
        <rdfs:label>No nudity; No sexual material; No violence; No potentially offensive language; No potentially harmful activities; No user-generated content; </rdfs:label>
    </label:ContentLabel>
</rdf:RDF>

タグ: RDF

HTML の中に Turtle を埋め込む方法

2013年03月27日

Turtle の仕様は Turtle - Terse RDF Triple Language にて公開されていたようだが、正式な W3C 勧告候補案が http://www.w3.org/TR/2013/CR-turtle-20130219/ にて公開されている。

ところでこの勧告候補案の A Embedding Turtle in HTML documents 中でThis section is non-normative.と前置きしながらも Turtle を HTML5 の中に埋め込む方法を提案している。

<script type="text/turtle">
@prefix dc: <http://purl.org/dc/terms/> .
@prefix frbr: <http://purl.org/vocab/frbr/core#> .

<http://books.example.com/works/45U8QJGZSQKDH8N> a frbr:Work ;
     dc:creator "Wil Wheaton"@en ;
     dc:title "Just a Geek"@en ;
     frbr:realization <http://books.example.com/products/9780596007683.BOOK>,
         <http://books.example.com/products/9780596802189.EBOOK> .

<http://books.example.com/products/9780596007683.BOOK> a frbr:Expression ;
     dc:type <http://books.example.com/product-types/BOOK> .

<http://books.example.com/products/9780596802189.EBOOK> a frbr:Expression ;
     dc:type <http://books.example.com/product-types/EBOOK> .
</script>

以前 HTML の中に RDF/XML を埋め込む方法として HTML のコメントを使用してその中に RDF/XML を記述するという方法があったがそれに近いものを感じる。悪くはないと思うのだが、RDFa があるのだからここまでしなくてもいいような気が…

タグ: RDF

ある時点を RDF で表現する

2013年03月27日

Webページのある時点を RDF で表現するにはどうしたらよいかを考えてみる。

実はある興味深いブログをブックマークしていたのだが、久々にアクセスしてみると胡散臭い情報商材を紹介したページとなっていた。恐らくドメインの売買が行われたのであろう。

仮にそのページの URL が http://www.example.com/blog/ であったとすると、ある時点で http://www.example.com/blog/ はブログであり、ある時点では情報商材を紹介したページということになる。

例えば http://www.example.com/blog/ がブログだった時の RDF は以下のようなものだとする。

@prefix dc: <http://purl.org/dc/elements/1.1/> .

<http://www.example.com/blog/>
    dc:title "アリスのブログ"@ja;
    dc:description  "アリスの日々を綴ったブログです。"@ja;
    dc:creator "アリス"@ja; .

この RDF は http://www.example.com/blog/ がブログだった時点では真だが、情報商材の時点では偽となる。こういった場合ある時点を RDF で指定する方法はあるのだろうか。

自分が思いつく方法としてはスナップショットのようなクラスを利用する。

@prefix ex: <http://www.example.com/vocabulary/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .

[]
    a ex:Snapshot;
    dc:title "アリスのブログ"@ja;
    dc:description  "アリスの日々を綴ったブログです。"@ja;
    dc:creator "アリス"@ja;
    ex:isSnapshotOf <http://www.example.com/blog/>;
    ex:date "2011-09-06"; .

空白ノードに ex:Snapshot の性質を与えて ex:isSnapshotOf で URL を指定し ex:date で日時を指定する。

この方法ならば RDF でWebページのある時点を切り取ることが出来る。

参考までにここで使用した語彙を Turtle で定義しておく。

@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix ex: <http://www.example.com/vocabulary/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:Snapshot
    a owl:Class;
    rdfs:subClassOf
        [   a owl:Restriction;
            owl:onProperty ex:isSnapshotOf;
            owl:cardinality 1;
        ],
        [   a owl:Restriction;
            owl:onProperty ex:isSnapshotOf;
            owl:allValuesFrom owl:Thing;
        ],
        [   a owl:Restriction;
            owl:onProperty ex:date;
            owl:cardinality 1;
        ],
        [   a owl:Restriction;
            owl:onProperty ex:date;
            owl:allValuesFrom xsd:date;
        ];
    rdfs:label "Snapshot"@en;
    rdfs:comment "ある時点を切り取ったスナップショットである。"@ja .

ex:isSnapshotOf
    a owl:ObjectProperty;
    a owl:FunctionalProperty;
    rdfs:subPropertyOf dcterms:isPartOf;
    rdfs:domain ex:Snapshot;
    rdfs:range owl:Thing;
    rdfs:label "is Snapshot of"@en;
    rdfs:comment "主語は目的語のスナップショットである。"@ja .

ex:date;
    a owl:DatatypeProperty;
    a owl:FunctionalProperty;
    rdfs:subPropertyOf dcterms:date;
    rdfs:domain ex:Snapshot;
    rdfs:range xsd:date;
    rdfs:label "date"@en;
    rdfs:comment "スナップショットの日時"@ja .

ヨコハマ・アート・LOD

2013年03月27日

公益財団法人横浜市芸術文化振興財団ヨコハマ・アート・LODというプロジェクトの中で RDF でデータを公開しているのだが、そこで定義されている語彙が「なんだかなぁ」と思わざるえない。

YAN event Vocabulary の一部を引用する。

<rdf:Description rdf:about="http://fp.yafjp.org/terms/event#Event">
    <rdfs:label xml:lang="ja">イベント</rdfs:label>
    <rdfs:comment xml:lang="ja">イベントを表す</rdfs:comment>
    <rdfs:isDefinedBy>http://fp.yafjp.org/terms/event/</rdfs:isDefinedBy>
    <rdf:type>http://www.w3.org/2000/01/rdf-schema#Class</rdf:type>
</rdf:Description>

@rdf:reource は何処へ行ってしまわれたのでしょうね。

パンくずリストを RDFa で表現する

2013年03月26日

リッチスニペットでのパンくずリストにおける問題で Google のパンくずリストでの RDFa の記述は問題があるのではないかと指摘したが、ではどのように記述すればよいか代替案を考えてみる。

最初に記述方法を考えるうえで以下のような条件を設ける。

  • RDF として問題ないようにする
  • 簡単に導入できる
  • コードが汚くならないようにする

この条件からするとパンくずリストを RDFa で階層的に表現するのは無理だと言える。となると他に考えられる方法としては RDF Collection か rdf:Seq を利用する方法が考えられる。

まず以下のようなパンくずリストのコードがある。

<div class="breadcrumb">
    <a href="http://www.example.com/dresses">洋服</a> › 
    <a href="http://www.example.com/dresses/real">ドレス</a> › 
    <a href="http://www.example.com/dresses/real/green">緑のドレス</a>
</div>

RDF Collection を使用した記述

このコードを RDF Collection を使用して表現するとおそらく以下のようになる。

<div class="breadcrumb" prefix="ex: http://www.example.com/vocabulary/" about="" rel="ex:breadcrumbList" inlist="">
    <a typeof="ex:Breadcrumb" href="http://www.example.com/dresses" rel="ex:url" property="ex:title">洋服</a> › 
    <a typeof="ex:Breadcrumb" href="http://www.example.com/dresses/real" rel="ex:url" property="ex:title">ドレス</a> › 
    <a typeof="ex:Breadcrumb" href="http://www.example.com/dresses/real/green" rel="ex:url" property="ex:title">緑のドレス</a>
</div>

このコードを Turtle に変換すると以下のようになる。

@prefix ex: <http://www.example.com/vocabulary/> .

<>
    ex:breadcrumbList (
        [   a ex:Breadcrumb;
            ex:url <http://www.example.com/dresses>;
            ex:title "洋服";
        ]
        [   a ex:Breadcrumb;
            ex:url <http://www.example.com/dresses/real>;
            ex:title "ドレス";
        ]
        [   a ex:Breadcrumb;
            ex:url <http://www.example.com/dresses/real/green>;
            ex:title "緑のドレス";
        ]
    ); .

RDFa 1.1 で追加された @inlist のおかけで大分簡略に記述できる。ただ RDF Collection は閉じたリストを表現するときに使われるものであるので、パンくずリストを表現するのに適しているかは正直微妙なところだと思う。

rdf:Seq を使用した記述

次に rdf:Seq を使用した記述の場合は以下のようになる。

<div class="breadcrumb" prefix="ex: http://www.example.com/vocabulary/" typeof="ex:BreadcrumbList" rel="rdf:li">
    <a typeof="ex:Breadcrumb" href="http://www.example.com/dresses" rel="ex:url" property="ex:title">洋服</a> › 
    <a typeof="ex:Breadcrumb" href="http://www.example.com/dresses/real" rel="ex:url" property="ex:title">ドレス</a> › 
    <a typeof="ex:Breadcrumb" href="http://www.example.com/dresses/real/green" rel="ex:url" property="ex:title">緑のドレス</a>
</div>

このコードを Turtle に変換すると以下のようになる。

@prefix ex: <http://www.example.com/vocabulary/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

[]  a ex:BreadcrumbList;
    rdf:li
        [   a ex:Breadcrumb;
            ex:url <http://www.example.com/dresses>;
            ex:title "洋服";
        ],
        [   a ex:Breadcrumb;
            ex:url <http://www.example.com/dresses/real>;
            ex:title "ドレス";
        ],
        [   a ex:Breadcrumb;
            ex:url <http://www.example.com/dresses/real/green>;
            ex:title "緑のドレス";
        ]; .

この方法ならば RDF 観点からみても全ての条件を満たしていると思う。XHTML の観点からしても無駄なspan要素などもなく美しい。rdf:Seq が記述されていないと思われるかもしれないが ex:BreadcrumbList のサブプロパティに rdf:Seq を指定しておけば問題はないであろう。個人的にはやはり RDF Collection よりは rdf:Seq を使用した記述方法のほうが妥当に思える。

語彙

参考までにここで使用した語彙を Turtle で定義しておく。

@prefix ex: <http://www.example.com/vocabulary/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix v: <http://rdf.data-vocabulary.org/#> .

ex:BreadcrumbList
    a owl:Class;
    rdfs:subClassOf rdf:Seq;
    rdfs:label "Breadcrumb List"@en;
    rdfs:comment "パンくずリストを格納しておくクラス。"@ja .

ex:Breadcrumb
    a owl:Class;
    rdfs:subClassOf
        v:Breadcrumb,
        [   a owl:Restriction;
            owl:onProperty ex:url;
            owl:cardinality 1;
        ],
        [   a owl:Restriction;
            owl:onProperty ex:url;
            owl:allValuesFrom _:OnlineDocument;
        ],
        [   a owl:Restriction;
            owl:onProperty ex:title;
            owl:cardinality 1;
        ],
        [   a owl:Restriction;
            owl:onProperty ex:title;
            owl:allValuesFrom rdf:PlainLiteral;
        ];
    rdfs:label "Breadcrumb"@en;
    rdfs:comment "一つ一つのパンくず。"@ja; .

ex:breadcrumbList
    a owl:ObjectProperty;
    rdfs:domain _:OnlineDocument;
    rdfs:label "breadcrumb list"@en;
    rdfs:comment "パンくずリスト用の RDF Collection を指定する"@ja; .

ex:url
    a owl:ObjectProperty;
    a owl:FunctionalProperty;
    rdfs:subPropertyOf v:url;
    rdfs:domain ex:Breadcrumb;
    rdfs:range _:OnlineDocument;
    rdfs:label "url"@en;
    rdfs:comment "パンくずの URL を指定する。"@ja .

ex:title
    a owl:DatatypeProperty;
    a owl:FunctionalProperty;
    rdfs:subPropertyOf v:title;
    rdfs:domain ex:Breadcrumb;
    rdfs:range rdf:PlainLiteral;
    rdfs:label "title"@en;
    rdfs:comment "パンくずのタイトルを指定する。"@ja .

_:OnlineDocument
    a owl:Class;
    owl:intersectionOf (<http://xmlns.com/foaf/0.1/Document> <http://www.w3.org/2006/gen/ont#InformationResource>);
    rdfs:comment "オンライン上に存在するドキュメント。"@ja .

タグ: RDF

リッチスニペットでのパンくずリストにおける問題

2013年03月25日

Google のリッチスニペットでのパンくずリストにおける RDFa の記述は少し問題があるように感じる。

Google ではパンくずリストについて2種類の記述方法をサポートしている。

まずはパンくずリストがページ内に1つしかない場合の記述方法である。

<div xmlns:v="http://rdf.data-vocabulary.org/#">
   <span typeof="v:Breadcrumb">
     <a href="http://www.example.com/dresses" rel="v:url" property="v:title">
      ドレス
    </a> ›
   </span>
   <span typeof="v:Breadcrumb">
    <a href="http://www.example.com/dresses/real" rel="v:url" property="v:title">
      ドレス
    </a> ›
   </span>
   <span typeof="v:Breadcrumb">
    <a href="http://www.example.com/dresses/real/green" rel="v:url" property="v:title">
      緑のドレス
    </a> ›
   </span>
</div>

この RDFa を Turtle に変換すると以下のようになる。

@prefix v: <http://rdf.data-vocabulary.org/#> .

[] a v:Breadcrumb;
    v:title "ドレス";
    v:url <http://www.example.com/dresses>; .

[] a v:Breadcrumb;
    v:title "ドレス";
    v:url <http://www.example.com/dresses/real>; .

[] a v:Breadcrumb;
    v:title "緑のドレス";
    v:url <http://www.example.com/dresses/real/green>; .

RDF の観点から見ると、この記述の仕方では v:Breadcrumb という性質の空白ノードを作成しているにすぎない。RDF では rdf:Seq などを使用する場合を除きリソースの順番は考慮することはない。

本来ならば rdf:Seqrdf:li を使用して空白ノードの順番を記述すべきであろう。しかしこの RDFa ではそれが行われていない。これでは残念ながら RDF としては不完全であろう。

次にパンくずリストがページ内に複数ある場合の記述方法である。

<div xmlns:v="http://rdf.data-vocabulary.org/#">
  <span typeof="v:Breadcrumb">
    <a href="http://www.example.com/books" rel="v:url" property="v:title">
      書籍
    </a> ›
    <span rel="v:child">
      <span typeof="v:Breadcrumb">
        <a href="http://www.example.com/books/authors" rel="v:url" property="v:title">
          著者
        </a> ›
        <span rel="v:child">
          <span typeof="v:Breadcrumb">
            <a href="http://www.example.com/books/authors/stephenking" rel="v:url" property="v:title">
              スティーブン・キング
            </a> ›
          </span>
        </span>
      </span>
    </span>
  </span>
</div>

<div xmlns:v="http://rdf.data-vocabulary.org/#">
    <span typeof="v:Breadcrumb">
    <a href="http://www.example.com/books" rel="v:url" property="v:title">
      書籍
    </a> ›
    <span rel="v:child">
      <span typeof="v:Breadcrumb">
        <a href="http://www.example.com/books/fiction" rel="v:url" property="v:title">
          フィクション
        </a> ›
        <span rel="v:child">
          <span typeof="v:Breadcrumb">
            <a href="http://www.example.com/books/fiction/horror" rel="v:url" property="v:title">
              ホラー
            </a> ›
          </span>
        </span>
      </span>
    </span>
  </span>
</div>

この RDFa を Turtle に変換すると以下のようになる。

@prefix v: <http://rdf.data-vocabulary.org/#> .

[] a v:Breadcrumb;
    v:child [
        a v:Breadcrumb;
        v:child [
            a v:Breadcrumb;
            v:title "スティーブン・キング";
            v:url <http://www.example.com/books/authors/stephenking>;
        ];
        v:title "著者";
        v:url <http://www.example.com/books/authors>;
    ];
    v:title "書籍";
    v:url <http://www.example.com/books>; .

[] a v:Breadcrumb;
    v:child [
        a v:Breadcrumb;
        v:child [
            a v:Breadcrumb;
            v:title "ホラー";
            v:url <http://www.example.com/books/fiction/horror>;
        ];
        v:title "フィクション";
        v:url <http://www.example.com/books/fiction>;
    ];
    v:title "書籍";
    v:url <http://www.example.com/books>; .

こちらの記述方法では順番ではなく階層構造で解決しようとしている。この方法ならば RDF の観点からしても問題がないと思われる。しかし問題点が無いわけではない。一番目につくのはspan要素の多さだ。これは階層構造を記述するために仕方ないとはいえ汚いコードには変わらない。

Google のパンくずリストの記述方法は一方では RDF の観点からして不十分であるし、もう一方はソースが汚くなるという問題点がある。

タグ: RDF