DreamHost での HTML > PHP 設定 (2009/01/09)

DreamHost では現在、新しく設定したドメイン及びサブドメインについて、PHP5 を CGI で動かすという選択肢しかありません。PHP が CGI として動作している場合、HTML ファイルを PHP ファイルと同等に処理させるにはどうするか、.htaccess でひとしきり試してみたので、その結果をメモ。

「AddHandler php5-cgi .html ― PHP5 CGI」以外はここのサーバーではサポート外であり(いつ全く使えなくなるかわからない)、さらに phpinfo で確認すればわかりますが、それ以外では PHP の機能が削られるみたいなのであまり使わないほうがよろしいようです。

ついでに少しあちこちのファイルを見直していたら、Gallery のヘッダスクリプトにバグ発見。「=」で内容を割り当てるべきところが「==」になってたのと、変数先頭の「$」抜けという初歩的なやつ。英語と日本語の振り分けを入れたときに、混入したもよう。あわてて修正しました。

PHP4 から PHP5 へ (2009/04/26)

とっても今さら、な感じですが、ローカル環境もレンタルサーバの環境も PHP4 から PHP5 に移行しました。ローカルは新しいパソコン組んで環境が変わり、新規に XAMPP を入れたため、レンタルサーバは .htaccess で無理やり mod_php で動かすのをやめたため、です。使用しているレンタルサーバの DreamHost ではずっと前に mod_php モードが使える PHP4 は新規では選択できなくなってました。サイト内容を別のサブドメインにコピーして PHP5 の CGI モードで動かしてみたら、速度もまったく遜色なかったので、4 月 19 日あたりに「無理やりな .htaccess」をはずして、PHP5 に切り替えました。

メインのマシンを入れ替えるというのは、なかなかの手間で、1 月中には組み上がっていたものの、ツール類の移行が一瞬ではできず、(この際、どうでもいいのは少しは取捨選択したい、と思ったりするので、ちょっと目を通したりすることもあります)、組立場所から通常稼働位置に移動したのが 4 月 15 日で、まだ未インストールのツールが残っています。

さすがに新しい環境では Painter 11 も快適に動いています(古い環境は Windows 2000 なのでインストールもできませんでした)。Windows XP になってシステムがデュアルモニタに対応してるので、アプリケーションの「全画面表示」モードはメインの画面に対してのものになり、Windows 2000 (デュアルヘッドのビデオカード使用)のときみたいに Painter の起動スプラッシュや Welcome 画面が 2 つの画面の継目のところに表示されることがなくなって、かなりうれしいです。

というわけで、このサイトの各ページの自動リンクとか「伝言板」とかも PHP5 で動いております。CGI モードだとパーミッションが楽になるし、もっとさっさと移行してもよかったのですが、「いちど変更したら戻せない」という選択なので躊躇して延ばしてました。最後は「サイトの内部に DokuWiki を入れてみたい」という動機で踏み切りました。DokuWiki は 自動インストーラ がすごく便利な、ファイルベースの Wiki です。mod_php で動かすとキャッシュフォルダとかのパーミッション設定を手動でやらないとダメで、アップデートでインストールしなおすことも考えるとしんどくなったので、見切りをつけました。

DokuWiki をサイト内に設置 (2009/06/14)

このサイトではブログツール類は、このサイトを作成する以前からサイト外で使っている painter log の他にはずっと使ってこなかったのですが、ウェブページの自動生成、すなわちタグ打ちとページ管理からの解放というのはやはり魅力的であり、ヒューマンエラーを減らすことにもつながるので、サイト構築をほぼ手書きでやりながらも、ずっと気になっていました。ブログツールや CMS もわりといろいろウォッチングしたり試用したりしてきました。その検討にたいへん時間がかかったのですが、このたび DokuWiki をサイトの一部に使ってみることにしました。

自動生成機能があるスクリプトというのは、いったん稼働させはじめたらサイト内構造とかを変更するのが面倒だし、ほんとうにそれなりに快適に使えるのかどうか納得するために、しばらく他の場所で動作させてみたりもしました。そしてやっと Memo コーナーとして導入。

なぜ DokuWiki に落ち着いたか、というあたりは DokuWiki 覚書 を読んでいただくとわかると思います。まずは「ファイルベース」の Wiki だったこと。個人が管理するものとしては、ファイルベースのほうが扱いやすいと思います。

サーバー上にこういったものを置いておくと、自分用のメモを取るにも便利です。メモを記録し、さらにそれを再編集できるようなスクリプトを自分で書くよりは、すでに公開されている高度なツールを使わせていただいたほうがよい、と考えました。

Wiki 本来の複数の書き手による情報集積というのは、その情報がきちんと永続的に共有される保障がないかぎり、書き手がわに「ムダ働き」の懸念があるわけで、組織の内部のような場所か、あるいは完全に個人を離れた公共のサイトでないとむずかしい気がします。ここはどうしても「個人サイト」という枠組みがありますので、この Wiki は基本的に Painter の質問に答える場になる予定です。(ただ、公共性を目指して、「基本的に再利用自由なデータ」として公開するべく、Creative Commons の宣言をしております。)

質問を受ける目的のために普通の「掲示板」を設置することも考えたのですが、以前に掲示板で質問を受けたときに、どうしても実例や図解の画像ファイルを参照する必要が出てきた経験があり、添付ファイルをどうするか、という課題が残っていたために現在まで設置に至っていませんでした。DokuWiki を使うと、このあたりはセキュリティ対策も含めてきちんと対応できます。いっぽう、Painter 11 の公開あたりから Painter Factory など Painter 関連の英語のフォーラムも時々見るようになり、多少複雑な掲示板でも質問の場として問題なさそうな印象を得ました。

……というような経緯での設置です。この Wiki の運用について疑問や提案などありましたら、Wiki 内、伝言板、連絡フォームなどで教えてください。

RSS 周辺の再確認 (2009/06/15)

DokuWiki で RSS フィード読み込み機能を使ったページを作成してみたのをきっかけに、自分のところの RSS も見直してみました(個別アイテムにも作者タグを入れるように変更しました)。以前、更新メモから RSS フィードを作るスクリプトを書くために RSS の仕様について調べたとき情報が少なくて苦労して、TypePad が生成するファイルなんかも参考にしたのですが、きょう「RSS specification」で検索したら何だかけっこういろいろあるみたい。以前に調べて回ってから約 3 年、RSS もさらに普及したわけですね。RSS 2.0 の仕様も少し改訂されてオプション項目が増えたようです。(日本語圏の情報は「RSS 仕様」で検索できます。)

よく見に行くウェブサイトの更新状況を知りたい、という要請はずっと以前からあって、一時は WWWC という更新チェックツールが日本ではわりと使われていました。情報をチェックするがわでリストしたサイトに対して WWWC を走らせて、トップページのファイルが更新されたかどうかをチェックするしくみですが、さらに WWWC に合わせた META タグをトップページに入れておくと WWWC がその内容を読み、まとめてくれるという機能がありました。しかし、普及度がいまひとつ。

このほかに「はてな」が登録ページの更新チェックのサービスをやってたようですし、以前の TINAMI の更新情報は WWWC と同じく専用 META タグによるものでした。

ブログツールの普及によって、高レベルでのウェブページの作法の平準化が起き、高度な CSS の使用があたりまえになり、日本語サイトの UTF-8 化も進みました。さらに、ブログや CMS で生成されるウェブページの割合が日増しに高くなる中で RSS があたりまえになり、利用者が増えて、そろそろ「RSS が提供されていないと不便に感じる」ところまで来てしまったような印象です。

RSS フィードを生成するためのツールも有料・無料、いろいろあるようです。上記の「RSS specification」での検索でトップに表示されたのが RSS 作成ツール販売の会社でしたが、「RSS 生成」で検索すると無償のものもかなりあるのがわかります。窓の杜 RSS 作成支援 のものが無料のものでは代表的らしいです。

なお、RSS 生成についてかなり前から公開されている CGI スクリプトとして The Web Kanzaki - RSS 生成スクリプトのサンプル があります。これは特定のページに「更新情報」のセクションがあることを前提に、そのデータを RSS に加工するものです。うちのサイトでやっていることも基本的なアプローチは同じで、RSS のために特定のデータを用意します。ただ、「更新情報」のページから RSS を生成するのではなく、多少自動化した(テキストエディタマクロ使用の)手書きによる元データを加工して RSS と更新情報の両方を生成しています。

WordPress 導入メモ (2010/09/09)

ブログという形式で小さめの絵の公開を始めたのは 2003 年、@ニフティのココログ のサービスを使ってでした。この painter log は、そのまま 2010 年まで、サイト本体とは別にココログで運営しつづけました。

その間に世の中のレンタルサーバ事情は大きく変化しました。アカウントごとの容量がぐんと増え(現在このサイトで使用中の DreamHost を含む北米のメジャーなサービスではすでに容量無限)、MySQL が標準で提供されるようになり、サーバのハードウェアの処理速度も速くなっています。以前は MySQL 関係と処理速度が不十分で無理だった「自分で借りたサーバでブログ運営」がストレスなくできるようになっています。

ココログでは自分のほしい機能がカスタマイズをしても得られないので、そういったブログサービスを使うことの利点もあるのは承知の上で、painter log をこのサイトの内部に移動し、WordPress を使うことにしました。

どんな機能が欲しかったかというと、まずは記事を羅列(時系列一覧、カテゴリ別一覧など)したときのページ区切り機能。タグも便利に使えそう。特に基本的に Painter で描いた絵ばかりなので、カテゴリとは違う分類方法が切実に必要でした。そして、テーマが PHP ファイルのグループで、カスタマイズに手を出せる程度には把握できるものである、ということも重要。

テーマを使う

たいへんな数のテーマが提供されているので、まずは迷いながらいくつかを導入。実際に適用してみたり、プレビューしてみたり。記事ごとの表示にしたときに前後記事へのリンクがあること、ページトップの画像が小さいことなどを条件に、とりあえず iNove というテーマを選び、次のようなカスタマイズをしました。

サムネイル一覧から記事選択

絵が主なコンテンツになっているサイトでときどき見かける、最近投稿した画像がサムネイルで一覧できる機能がよい感じ。ならば 過去の記事からランダムでサムネイルをリスト表示できれば、見た目も楽しいし便利じゃないか、と思ったわけです。

まずはそういうことができるプラグインがないかどうか探してみました。本家サイトのプラグイン一覧からは目的のものにたどりつきにくいので、Google で「wordpress random image」などと複数キーワードで検索。Random Image Plugin というのを発見して、実際に導入、表示カスタマイズまでやってみました。カテゴリ選択などの設定もあり便利です。しかし、一覧表示の画像がメディアライブラリに作成ずみのサムネイルではなく、(WordPress は画像アップロード時に自動的にサムネイルを生成する)、記事内の表示に使用している画像の表示をサイズ指定しているだけなので、サムネイル表示が汚くなるという問題に気がつきました。

そこで、WebTecNote の記事 や WordPress のサポートフォーラムの投稿などを参考にしつつ、WordPress の基本機能を利用したテンプレートで対応することにしました。上記記事の function で、get_posts に渡す引数一覧に「'orderby' => 'rand'」を追加することでメディアライブラリの画像をランダムに抽出できます。

しかし、これだけではサムネイルはフルサイズ画像にリンクしているだけで、記事へのリンクにはなりません。で、これはうちの painter log だけの特殊事情だと思いますが、記事の URL とその記事で使用している画像の名前が拡張子をのぞいて同じ、ということを利用して、フルサイズ画像へのリンク文字列に置換をかけて記事へのリンクに変換しています。これにはさらに特殊条件があり、各記事に付随して WordPress の投稿画面からアップロードする画像はひとつだけにしています。他の画像はすべて FTP でメディアフォルダに転送しました。こうすることで、データベースで把握されている画像ファイルは、各記事についてひとつずつ、という1 対 1 対応が成立し、画像 URL を置換して記事 URL することが可能になるわけです。

特殊条件だらけですが、このおかげでサムネイル一覧ページの生成はかなり軽くなっています。(これから WordPress 使用を始める場合は、新機能の「投稿サムネイル」を使ったほうがよさそうですが。)

ついでに、WordPress の自動生成によるサムネイルは細部が少しつぶれるので、ローカルで IrfanView の一括処理(リサイズ+シャープ)でサムネイルを作成し、サーバのサムネイルを上書きしてあります。現在使用している 140 x 140 サイズだと、けっこう違いがあります。

DokuWiki 更新のタイムスタンプ取得 (2011/05/17)

このサイトは主に HTML をテキストエディタで書いて(PHP でちょっとつないで)構築していますが、Painter 関係のことをタグ打ちなしで書き留められる場所として Painterfun Memo に DokuWiki も導入してみました。で、DokuWiki 部分を頻繁に更新するわけでもないので、この部分の最終更新日時がサイトのトップページで確認できたほうがよさそうだ、と思いつきました。

最終更新のタイムスタンプをトップページに表示する、という仕組みは、すでに 伝言板 でやっています。投稿時にタイムスタンプを記述したファイルを更新して、そのファイルをトップページに PHP で組み込むという、たいへんベーシックな方法です。DokuWiki の記事の保存時関連のスクリプトファイルの内容を確認したところ、タイムスタンプ書込みを割り込ませることができそうだったので、次のような追加をしてみました。場所は inc/actions.php のなかほど、 //delete draft のセクションのすぐ後ろです。

//write to timestamp file
$date = gmdate('(Y/m/d H:i)', time()+32400);
$fp = fopen('timestamp.dat', w);
fputs($fp, $date);
fclose($fp);

これで DokuWiki 設置のルートに timestamp.dat というファイルができ、記事書込みのたびに更新されるようになるはずですので、好きなところから参照することができます。このサイトではこれもトップページに PHP で読み込んでいます。

DokuWiki で編集者の IP アドレスを非表示にする (2011/09/29)

DokuWiki は基本設計がいろいろと手堅いところが好印象で、データファイルのバックアップもファイルベースであるために明快で安心という理由で、うちのサイトでも使っています。しかし、デフォルト状態ではユーザー登録していないゲストがページを編集したときに、最終更新者名のところに IP アドレスが表示される、という、これも手堅いと言える仕様が、日本のユーザー向けには合わないかも、と考えるようになりました。

そこでちょっとスクリプトを眺めて、最終的なページ出力から逆にたどって改変していったら、とりあえず IP を表示しないようにカスタマイズすることができたので、覚書を書いておきます。(同じ内容を DokuWiki 改造メモ にも書きました。)

最終更新がゲスト書き込みだったとき、IP ではなく「guest」と表示

DokuWiki フォルダ内の inc/common.php の if($revinfo['user']) の部分(200行よりちょっと後のあたり)で、次の行を、

$info['editor'] = $revinfo['ip'];

次のように変更。

if($revinfo['ip']){
  $info['editor'] = 'guest';
}

ここでなんで if が必要かというと、最終更新がログインユーザーによるものでない場合というのは、未登録ゲストによる場合と、外部編集の場合(ローカルで作成・編集したファイルをアップロードした場合)があるからで、「外部編集」のときは「外部編集」という表示にするためです。

編集履歴の一覧で IP アドレスを非表示

inc/html.php の if($info['user']) の部分(525行あたり)で、次の行を


if($info['user']){
    $form->addElement(editorinfo($info['user']));
    if(auth_ismanager()){
        $form->addElement(' ('.$info['ip'].')');
    }
}else{
    $form->addElement($info['ip']);
}

次のように変更。


if($info['user']){
    $form->addElement(editorinfo($info['user']));
    if(auth_ismanager()){
        $form->addElement(' ('.$info['ip'].')');
    }
}else{
    //$form->addElement($info['ip']);
    if($info['ip']){
      $form->addElement('guest');
    }
    if(auth_ismanager()){
        $form->addElement(' ('.$info['ip'].')');
    }
}

この改造は、すでにインストールずみのちょっとバージョンが古くなった DokuWiki に対して行ったので、新しいバージョンだといろいろ違うかもしれません。バージョンアップの手順を考えていたら、ついでにこっちもやっておこう、ということになってしまいました。スクリプトや CSS を改造した場合、アップグレードのときにカスタマイズを残すなり再導入するなりする作業が必要なので、ボタンのクリックひとつでアップグレードというわけにいかないのが、ちょっと辛いです。