MODxというCMSがすごいよ!

今まで僕が試したことのあるCMS・Blogツールは、インストールしてちょっとだけ触ってみたものを含めると、なんだかんだで3、40ぐらいある。各ツールは、もちろんそれぞれ特徴があるのだけれども、似ているといえば似ていて、同じような系統のものが多かった。

Continue reading “MODxというCMSがすごいよ!”

PHP,Rubyでの入出力まわり(文字列、ファイル、ストリーム)

最近、XML、HTMLファイルをあれこれする事が増えてきた気がする。ファイルに書き込んだり、読みこんだりするときの入出力に関するメモ。

PHP

参考。PHP: ファイルシステム関数 – Manual

まずは、fopenや、fsockopenで、ファイルポインタを取得する。

ファイルをすこしずつ読み込んでいく場合は、ファイルポインタから、
fgets(ファイルポインタから1行取得)、
fread(バイナリ・モードでファイルを読み込む)、
fgetcsv(CSV用)、
などを使う。書き込みは、fwriteで。

<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}
?>

ファイル全体を一度に処理したい場合は、filefile_get_contentsを利用すればいい。

文字列と配列の変換

データが、欲しいときに、欲しい形であるとは、限らない。
配列、文字列、ファイルなどにある情報を適当な形にしたい時。

  • explode文字列を文字列により分割する->配列
  • split正規表現により文字列を分割し、配列に格納する->配列
  • implode配列要素を文字列により連結する->文字列

これらの関数で、配列と文字列が変換できる。

ストリーム

大き目のデータをキャッシュとしてファイルに保存しておいて、あとでも利用するときなど、ファイルを使っていろいろするとき
(ファイルからデータを読み込む場合と、すでに文字列などでデータをもっていてそのまま使いたい場合の両方があるときとか)。

1.ファイルから読み込んだデータを加工して、適当な形(文字列とか)にしてから、処理に回す。

2.文字列を、ポインタを使って、ファイルからデータを読み込む場合と同じ処理にまわす。参考、データ (RFC 2397)

<?php
$TEXT =<<<EOF
data1
data2
data3
EOF;
$handle = fopen("data://text/plain,$TEXT", 'r');
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}

?>

PHP 5.1.0 以降なら、
php://memory とか、
php://tempも使えるみたいです。
PHP 入出力ストリーム

Ruby

Fileや、IOクラスを使う。

openや、
File.openで返されるオブジェクトを操作する。

filename = "data.txt"
file = open(filename)
#file = File.open(filename)
text = file.read(file)
print text
file.close

ファイルを一度に読む場合、クラスメソッドを使って

data = File.read("foo.txt")

ともできる。

ファイルを一行ずつ読む場合は、

filename = "data.txt"
file = open(filename)
while text = file.gets do
	print text
end
file.close

のようにする。あるいは、

filename = "data.txt"
open(filename){|io|
	while line = io.gets
	print text
	end
}

のように、closeを省略することもできる。

Ruby メモ

  • HTTPやFTPからファイルを開きたいときは、open-uriを使う。
  • io.readlinesで、ファイルの各行を配列として取得できる。
  • io.eachとeachメソッドが使える
  • 出力は、io.write,io.print,io.printf,io << strなど。
  • io.rewindでファイルポインタを先頭にできる。

配列と文字列

配列->文字列は、joinで。

p ["a", "b", "c"].join(',') #=> "a,b,c"

文字列->配列は、splitscanで。

p "   a \t  b \n  c".split(/\s+/) # => ["", "a", "b", "c"]
p "foobarbazfoobarbaz".scan(/ba./)
# => ["bar", "baz", "bar", "baz"]

%wで、空白で分割して配列を作れる。

p %w(a b c) # => ["a", "b", "c"]

StringIO

StringIOオブジェクトを使うと、文字列のデータを、IOオブジェクトとして扱うことが簡単にできる。

require 'stringio'
str = << EOF
data1
data2
data3
EOF
io =StringIO.new(str)
#io.puts(str)
io.rewind
p io.read

JaikuのAPIで投稿をするためのPHP(XML-RPC)メモ。

Twitter系のサービスJaikuのAPIの使い方メモ。Jaiku APIでは、情報の取得については、他のサービスを同じような感じでできるのですが、新規の投稿にはXML-RPCを使うみたい。
必要になったので、PHPでXML-RPCを使うときのメモ。

XML-RPCとは

次のページを参考にした。

どうやら、XML-RPCは、HTTP-POSTリクエストで、XMLをやり取りするもののようです。

PEARのXML_RPCを使えば、クライアント側も、サーバー側も簡単に実装できるみたいなので、まずこれを使いました。

以下、PHPのサンプルスクリプトです。

PEARのXML_RPCライブラリを使う場合

$personal_keyと、$userを正しく入力して、$textに投稿したい文字を入れれば、次のスクリプトでJaikuに投稿できます。


<?php
require_once 'XML/RPC.php';
define('JAIKU_SERVER', 'api.jaiku.com');
define('JAIKU_PATH', '/xmlrpc');

$text="Test テスト";
$personal_key="personal_key";
$user="user";

$params = array(new XML_RPC_Value(array(
//"generated" => new XML_RPC_Value(false, 'boolean'),
//"icon" => new XML_RPC_Value(300, 'int'),
//"location" => new XML_RPC_Value('', 'string'),
"message" => new XML_RPC_Value($text, 'string'), 
"personal_key" => new XML_RPC_Value($personal_key, 'string'),
"user" => new XML_RPC_Value($user, 'string'),
),'struct'),);

$msg=new XML_RPC_Message('presence.send',$params);
//print $msg->serialize();
$client=new XML_RPC_Client(JAIKU_PATH,JAIKU_SERVER);

$response=$client->send($msg);
if(!$response->faultCode()){
	print "ok";
}else{
	print $msg->serialize();
	print '<br />Fault Code:' . $response->faultCode() ;
	print '<br />Fault Reason:' . $response->faultString();
}

?>

XML_RPC_Value()や、XML_RPC_Message()で、Jaikuのサーバー側に送るXMLを組み立てています。
実際の中身は、serialize()で見ることができます。

serialize()で送信するXMLを見ると、


<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>presence.send</methodName>
<params>
<param>
<value><struct>
<member><name>message</name>
<value><string>Test テスト</string></value>
</member>
<member><name>personal_key</name>
<value><string>personal_key</string></value>
</member>
<member><name>user</name>
<value><string>user</string></value>
</member>
</struct></value>
</param>
</params>
</methodCall>

のようになっているはずです。

後は、XML_RPC_Client()で、上のXMLをsend()すれば、
Jaikuに新しい記事がポストされます。

(日本語が文字化けして、なかなか、ちゃんと表示されなかった。
php.iniとか,.htaccessも見たけれども、よくわからない。
XML_RPCを新しく入れて、php.iniのinclude_path=”~”の順番を変えたら、
なんとか動くようになった。XML_RPCのバージョンが古いとうまくいかないのかも。)

PEARのXML_RPCライブラリを使わない場合

XML_RPCを使わないで、何とかする場合。
前回のDrupalのJaikuモジュール
の中身とほとんど同じです。モジュールの方では、drupal_http_request()を使いましたが、
下のサンプルでは、
PEARのHTTP_Request()を使いました。

ここでは、ヒアドキュメントで、送信するXMLを組み立てています。


<?php
require_once "HTTP/Request.php";
$req =& new HTTP_Request();

$text="Test テスト";
$personal_key="personal_key";
$user="user";
$RequestURL="http://api.jaiku.com/xmlrpc";

$data = <<< CALL_DATA
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>presence.send</methodName>
<params>
<param>
<value><struct>
<member><name>message</name>
<value><string>$text</string></value>
</member>
<member><name>personal_key</name>
<value><string>$personal_key</string></value>
</member>
<member><name>user</name>
<value><string>$user</string></value>
</member>
</struct></value>
</param>
</params>
</methodCall>
CALL_DATA;

$req->setURL($RequestURL);
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addHeader('Content-Type' ,'text/xml; charset=UTF-8');
$req->addRawPostData($data);

$response = $req->sendRequest();
if (!PEAR::isError($response)) {
	print $req->getResponseBody();
	print_r($req->getResponseHeader());
}else{
	print $response->getMessage();
}

?>

$req->addRawPostData($data, false)で、urlencode()が効くようにもできるのですが、これを
使うと、うまくいかない。

あとは、ブログの記事が、新規投稿か、過去記事更新かを区別できる部分があれば、
これでJaikuとブログの両方にポストできる。

Drupalでは、
jaiku_nodeapi(&$node, $op)の$opに、’insert’とか、’update’が渡されるので、
これを使えばいいらしい。

Drupal用のTwitter系サービスのモジュールを作った

Drupalの利用者でかつ、Twitterみたいなサービスを使っている人なんてほとんど見かけない気もするのですが、
一応、Drupalの投稿に合わせてTwitterみたいなサービス(
もごもご
Timelog
Jaikuの3つ)にも、
合わせて投稿するモジュールが動くようになったので、載せておきます。
(もうすでにどこかで公開されているかもしれないけれど…)

中身は、Twitterのモジュール
Drupalモジュール一覧の下のほう)
を参考にして、ほんの一部分だけ書き直しただけのものです。

一応どれも動作を確認しましたが、
Drupalの内部についても、.infoや.moduleのファイルの書式についても、僕は知らないので、
ただ動くかもしれないものとして扱ってください。

使い方は、オリジナルのTwitterモジュールと同じで、通常のモジュールと同じように有効にしてから、
プロフィールの変更をすればOKです。
!titleが新規ページのタイトルに、!urlが新規ページのURLに置換されるのも同じです。
サービスによって、Usernameがメールアドレスだったり、アカウント名だったりと違うので注意してください。

もごもご投稿用のDrupalモジュール

Twitterのモジュールのごく一部だけを書き換えたもの。
mogo2_nodeapi()の「case ‘update’:」を有効にすると、新規投稿エントリーでなくとも、もごもごに投稿されるようになります(テスト用に)。

mogo2.tgz もごもご用Drupalモジュール。

Timelog投稿用のDrupalモジュール

こちらも、Twitterのモジュールに数箇所の修正を加えたものです。
「case ‘insert’:」と「case ‘update’:」の部分で、新規記事の投稿と、過去記事の更新のそれぞれについてTimelogへの投稿をするかどうかを決めています。
投稿用のテキストはurlencode()ではなく、
rawurlencode()で処理をしています。そうしないと、半角スペースが「+」で表示されてしまいます。

Timelogはタグや、各種コマンド(Timelogヘルプ)が使えるので、
「/B http://~」や「/G」、タグを組み込むと表現が広がるかもしれません。

timelog.tgz Timelog用Drupalモジュール。

Jaiku投稿用のDrupalモジュール

XML-RPCを使わなくてはならなかったので、一番修正が必要だったモジュールです。
最初は、PEARのXML_RPCを使えばいいのかなと思ったのですが、
drupal_http_request()
を良く見たらdrupalの関数でもできそうだったので、モジュールはこちらで動くようにしています。

XML/RPC.phpを使う場合は、「//drupal_http_request」から「/* XML_RPC」の前の「drupal_set_message()」までをコメントアウトして、
代わりに、「/* XML_RPC」から「*/」までを有効にしてください。

jaiku.tgz Jaiku用Drupalモジュール。

Twitterのメモ

その他のCMS,BlogのTwitterモジュール。

Nucleus用のモジュールもあるのかな。Xoopsとかも。

Twitterのところとか、
元のクリップ用メモはこっちでやっています。
こういったTwitter系のサービスはあまり僕の性に合わないのですが、
他のサービスもportalooの名前でアカウントはあります。

作成予定メモ

  • XML-RPCとか。
  • PEARのHTTP_Request Basic認証メモ。
  • ただ、HTTP_Requestするだけの簡単なサンプル↑。と

役に立ちそうなDrupalモジュールの一覧

今、Drupalを少しだけいじっているので、どんなモジュールが使えるのか、
いろいろと調べているところです。以下は、導入(と変更)を試してみた、よさそうなモジュール一覧です。

Drupalの基本的なモジュール導入方法

「modules」ディレクトリなどの特定の場所に、
ダウンロードしてきたモジュールのファイルをアップロードし、管理画面
「管理セクション>
サイトの構築>
モジュール」で設定を保存する。
次に、権限の設定や、各個別の設定をして、モジュールを有効にする。
(この記事の末尾のサイト参照。)

Ping モジュール

参考ページはPing モジュール
Ping送信先は、最新更新Pingサイトリストとかで確認を。

Pingの送信先を複数指定し、Pingがうまく行っているか確認できるようにする。

XML Sitemap モジュール

XML Sitemap モジュール
サイトマップの使用についてはsitemaps.org – ホーム
(英語)。

GoogleやYahoo、Microsoftなどの代表的な検索エンジン用のXML サイトマップを作成するモジュール。
最近では、robots.txtからもSitemapsの通知ができるようになったので、robots.txt内に

Sitemap : http://example.com/gsitemap

としてもいいかもしれない。

TrackBack モジュール

参考ページは、
TrackBack モジュール
trackback | Drupal-jBox.net
公式ページTrackBack | drupal.orgでは、5.x系のモジュールも公開されています。

TrackBackの送受信を可能にするモジュール。

Spam モジュール

Spam | drupal.org

Drupalのスパム対策用モジュール。

Akismet モジュール

Akismet

WordPressでは、結構有名なスパム対策用のプラグイン。
最強の呼び声高いブログ用対スパムプラグイン「Akismet」
Akismet 有名ハックの解説と追加ハック。API Keyの取得が必要。

captchajp モジュール

captchajp モジュール

日本語キャプチャによる認証で、スパムを防ぐためのモジュール。
captcha モジュール(1-10 までのランダムな 2 つの数字を足し算するという問題による認証)もある。
参考、
日本語専用のスパム対策モジュールを作る!-Captchaの改造への道-

Content Construction Kit (CCK) モジュール

Content Construction Kit (CCK)

オリジナルのコンテンツタイプを作って、自由に入力フィールドをカスタマイズするためのモジュール。
この下にある「Meta tags モジュール」は、各ページごとにdescriptionやkeywordsなどを設定できるモジュールですが、
こちらはもっと自由にフィールドを設定できるモジュールです。

類似のモジュールとしてflexinodeモジュールもある。

Meta tags モジュール

Node (key)words

metaタグ「
abstract、
copyright、
description、
geourl、
keywords、
robots」などを使えるようにする。

Tagadelic モジュール

参考ページは、Tagadelic モジュール
日本語翻訳ファイルも作成してくださっています。解凍してpoデイレクトリの中にアップロードします。

複数のタグをタグクラウドとして表示するモジュール。

taxonomy_dhtml モジュール

参考ページは、Taxonomy dhtml モジュール
taxonomy_dhtml | Drupal-jBox.net

カテゴリに分類されたコンテンツを、まとめて一覧表示するモジュール。

Taxonomy Menu モジュール

Taxonomy Menu モジュール | Drupal.0829.info

サイト全体のナビゲーションメニューの中にカテゴリのナビゲーションを追加する

SiteMenu モジュール

SiteMenu モジュール

カテゴリごとに、記事をまとめて一覧表示するモジュール。
コンテンツの件数や最新のコンテンツを表示可能。

Archive モジュール

Archive モジュール

ダイレクトにURLを指定して、記事を表示する。「http://example.com/archive/2007/1/1」
Monthly Archive
Weekly node listing もあり。

Taxonomy Breadcrumb モジュール

Taxonomy Breadcrumb モジュール

パンくずリストを表示するためのモジュール

Site map モジュール

Site map | drupal.org

サイトマップや、カテゴリー別RSSを表示する。

Read More Tweak モジュール

Read More Tweak モジュール

“続きを読む” リンクの位置を調節するモジュール。

AdSense モジュール

AdSense | drupal.org

Google Adsenseの広告を表示するモジュール。使うには、管理セクション >> ユーザの管理 >> プロフィールで
「profile_google_adsense_client_id」の名前を付けた一行テキストフィールド(single-line textfield)を追加してから、
ユーザアカウントで「profile_google_adsense_client_id」の値に“pub-***”を入力する必要があります。

Adsense Injector モジュール

Adsense Injector | drupal.org

記事内にGoogle Adsenseの広告を表示するモジュール。

Service links モジュール

Service links | drupal.org

記事内にdel.icio.us, Diggなどへのリンクを表示する。

Google Search モジュール

Google Search | drupal.org

Google’s Site Search用のモジュール。

jBox モジュール

jBox モジュール
日本語プロフィール+jBoxモジュール

日本語環境(メールの文字化、日付)用モジュール。
日本語環境用モジュールは、Update Locale モジュールもある。

Rounded corners モジュール

Rounded corners | Drupal.0829.info

角丸を実現するためのモジュール。

人気ランキング ブロック

人気ランキング ブロック。モジュールではない。
Ruby,Cronも使用。

ブロックに PHP コードを記述することで、
人気記事ランキングを表示する方法。

Twitter モジュール

Twitter | drupal.org

Drupalの新規更新記事を、Twitterに投稿するためのモジュールです。
上にあるGoogle AdSense モジュールと同じく、プロフィールの変更で使えるようになります。

自分のプロフィールの設定ページに、Twitter settingsの項目があるはずなので、正しく値を入力してください。

Text formatは、空欄にすると「New post: !title (!url)」と入力したときと同じ結果を生みます。
!titleが新規ページのタイトルに、!urlが新規ページのURLに置換されて
「New post: タイトル (http://~)」でTwitterに投稿されます。!title と!urlを使って形式は自分で決められます。

Drupal、モジュール関係の参考サイト

  1. 拡張モジュール | ≡ Drupal Japan ≡
  2. Modules | drupal.org
  3. モジュール情報の検索結果 | Drupal-jBox.net
  4. MODULE | Drupal.0829.info
  5. Drupal モジュール | Diaspar Journal
  6. Perl Tips: 「Drupal」 のまとめ
  7. Drupalの便利なモジュール | Momokuri’s
  8. 備忘録 – Hironoblog
  9. Drupal-J.com | Drupal導入試行錯誤痕跡蓄積サイト

Drupalの参考本 書籍

非デザイナーのためのデザイン本 ノンデザイナーズ・デザインブック

ノンデザイナーズ・デザインブック
を読みました。プロのデザイナーでない人のために書かれたデザイン基礎学習のための参考書。

上手にデザインするための4つの基本原則

本書では、気にすべきデザインの基本原則として、4つのポイントが示されている。
この4点の原則(コントラスト、反復、整列、近接)の説明を、具体例を挙げなが進めていくというのが全体の構成です。

Webに限定したデザインの本ではなく、どちらかというとデザイン一般についての本ですね。
説明に使われている例も、Webサイトの例はほとんどなく、ペーパー・印刷物の具体例がほとんど。
デザインのちゃんとした基礎を勉強したことがない人には、これ以上ないぐらいに役に立つ本と思われるのですが、
逆にWeb関係のデザインとか、ユーザビリティの勉強には期待できない本です。

Webサイトの運営に慣れてくると、いつのまにかやっていたり、こうした方がいいのかなという事がなんとなくわかってくるのですが、
そういった点がなんとなくではなく言葉できっちり表現されています。

レイアウト、デザインの説明としては、まったく問題がないものの、具体例の大半が英語の印刷物についてです。
また、フォントまわりの話も、英語についてのものなので、その点は注意が必要か
(一応、Appendixに和文フォントについての説明もありますが)。

以下、4つのポイントについての簡単な説明。

近接 Proximity

関連する項目を組織的にまとめてデザインする。
論理的に流れを追うことができるようになっているのかを確認する。

これは、Webサイトでは、ユーザビリティとかと関係してくる。
適切な項目をラベル付けしてまとめるのは、とても大切。

整列 Alignment

ページ内の要素を、意識的にそろえて配置する。
みえない線に沿って要素を揃えると、確かに落ち着いて見えてくる。

昔の?Webサイトでたまに見かけた「やたらと中央配置」が整列の悪い方の例か。
ボーダーとか、文章の出だしも本当はピクセル単位で気を付けないといけないものみたいだ。

整列をきちんとしておけば、崩すこともできると言う話は、なるほどと思った。
デザインは崩れているんじゃダメなんだ、崩すんだ…。

反復 Repetition

配置や、ロゴの気持ちのいい繰り返し。

ロゴや、グローバルナビゲーションが決まった所にいつもあるWebサイトは、安心できる。
似た項目の繰り返しがうまくあると、ページの構成が掴み易いし、斜め読みもしやすい。

コントラスト Contrast

色、書体、サイズ、太さ、グラフィックなどで、ページに動きを与える。

コントラストを付ける所は、勇気を持って大胆に変える! はっきり違うようにしないと、紛らわしい。

僕は結局、非デザイナー

以上、いろいろ書いてきたのですが、結局のところ僕はデザインが、どうにもうまくない。(このサイトで、すぐばれる…)

改善点はすぐ見つかる。例えば、右のサイドメニューは何か工夫が欲しい(し、配置、ラベリングも検討の余地あり)。ああ、でも実際どうしたらいいのか?

コメント欄(の上の方)も、がたがたとずれていて、まぁ、気になると言えば気になる。
この部分は恐らくラベルを右揃え、フォームを左揃えにして、一つ線を通すのがセオリーか。
しかし、これも面倒だ…。

ロゴも原色むき出しで、配色もなんというか色気がない。
絵心があれば、ちょっとしたボタンだって、きっと自作できるのにな。

というか、一番の問題はサイトそのものがいったいどうなんだ?という事だ…。

HTMLをスクレイピングして解析(パース)する

HTMLをスクレイピング(scraping)してあれこれとするとき、僕はずっと正規表現に頼っていたのですが、
ページの構造が変化するとすぐに使えなくなってしまうし、時間がかかる割りに退屈な作業なので何とかならないかなと思っていました。

PHPで探していたのですが、XML(とかRSS)をパースする関数やライブラリは、良く目にするものの、HTMLを処理できるものはなかなか見つかりませんでした。以下は、PHP(とかRuby、Perl)でHTMLをスクレイピングしたりパースするための方法。(追記 2007/5/21)。

PHPでスクレイピング&パース

HTMLを整形式のXML文書に修正するPHPクラス

HTMLを、整形式のXMLに変換してくれるライブラリ。PEARのXML_HTMLSax3が同梱されているので、これだけでちゃんと動きます。いんちきなHTMLとか、XHTMLが整形式のXMLになるので、後は通常のXMLと同じように処理できる。

動作は、サンプルの「sample.php」ですぐに確認可。「$target = ~」で対象ファイルと、文字コードを指定し、「$output_xml = true;」でXMLファイルになる。とても便利!

rhacoのSimpleTagを試してみました

rhaco.org(らこ。PHPのWebアプリケーションフレームワーク)のSimpleTagを使うとPHPでHTMLを簡単にparseできる。使い方もシンプルです。(参考:[rhaco]SimpleTag

rhacoは、本当にいろんなことができるっぽい。ただ、ドキュメントが見当たらない?みたいなのでなかなか内容が掴めない。
テンプレートtemplate(rhaco)エンジンとかも使える。

Snoopy

スヌーピーはウェブブラウザをシミュレートするPHPのクラス。リンク(aタグ)を抜き出したり、submitして、getしたりできる。
そういえば、前に使ったMagpie RSSも中でSnoopyを使っているみたい。

PHPその他

PHP以外の他の言語の方が、この手のスクレイピング、パース(parse)周りは豊富かもしれない。
僕は、PHP以外、ほとんど使えないのですが一応メモ。

Rubyでスクレイピング&パース

「WWW::Mechanizeとか」、 「htree」、「Hpricot」とかいろいろある。
サーバーにはRubyもインストールされているようなので、初めてだけど、
VikiWiki – htreeを参考に、
“htree”あたりを使ってみたらちゃんと動いた。

こういうのをみると、Rubyもいいなって思う。

RubyでWebサイトを解析するときに強い味方となるライブラリ、HpricotとWWW::Mechanize

Perlでスクレイピング&パース

WWW::MechanizeはRubyとかに移植されているが、元は
Perlで書かれていたものだったらしい。

他にも、PerlにはWeb::Scraperというモジュールがあるようです(追記 2007/5/21)。これは使いやすそうですね。

スクレイピングとか他の雑メモ

Spidering スパイダ 参考書

Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Perl中心だけど、かなりおもしろい。Hack#84にPHPのサンプルコードも一応ある。紹介されているコードが日本のサイトに合わせてあったり(国立国会図書館、Yahoo!JAPANのサイトなど)、日本語処理にかんするパートもちゃんと載っている。ページ数500ぐらいでちょっと厚めかな。

更新2007/7/10 PHPその他のリンクに追加

Firefoxの検索バーをもっと便利に使う!

Firefoxのキーワード機能を活用できていますか?におもしろい記事がありました。ちょうど、Firefoxの検索機能まわりを調べていた所だったので、僕もいくつかTipsをメモしておきます。

Firefoxでアドレスバーを有効活用

Firefoxのキーワード機能を活用できていますか?を参考にすると、アドレスバー(URL、ロケーションバー)を使って、特定のWebページにすぐアクセスできるようになります。

他にも、Firefoxにはスマートキーワードという仕組みがあって、これを使うと、指定したキーワード+検索文字をアドレスバーに入力することで、簡単にWeb サイト内を検索できるようになっています。デフォルトのブックマークにあるクイックサーチがそれです。e-Wordsを例にすると、次のブックマークです。

e-Words内を検索するブックマークの例

%sがキーワードを表していて、アドレスバーに「ewords キーワード」と入力することでIT用語辞典 e-Words内の検索ができます。もちろん、このようなブックマークは自分で好きなものを作ることができて、例えば、

はてば検索をするブックマークの例

とブックマークを作れば、アドレスバーに「hatena キーワード」と入力することで、はてな検索を使うことができます。

また、ブックマークの別の作り方もあります。検索フォームのあるページを開いてから、検索窓の上で右クリックをして、[この検索にキーワードを設定] を選択すると手軽に作成できるようになっています。”ブックマークを追加” ダイアログに、サイト名と入力しやすいキーワードを付けて、[OK] を選択すれば完成です。

スマートキーワードの設定の仕方

あらかじめ用意されている検索エンジン(&OpenSearch)

Firefoxを使い始めた状態でも、Amazonや楽天、Yahoo,Googleなどの検索エンジンは、検索バーから使えるようになっています。
Firefoxの検索バーに登録されている検索エンジンは、自分で追加や削除ができます。
アドオン(拡張機能) – 検索エンジン

はてな検索についても、上の方法でわざわざ用意しなくてもHatenabar(Firefox Extension) Search Pluginsのページにあるように、クリック一つで自分用に検索エンジンを追加できます。「はてな検索」を検索バーの検索エンジン一覧に追加するリンクは次のようになっていました。


javascript:addEngine('http://www.hatena.ne.jp/tools/hatenasearch.src',
'http://www.hatena.ne.jp/tools/hatenasearch.png',
'%E3%81%AF%E3%81%A6%E3%81%AA%E6%A4%9C%E7%B4%A2',
'');

javascript:addEngine(‘検索エンジンを記述したファイル’,’アイコンの画像’,’名前’,”);」ですね。hatenasearch.src自体はとてもシンプルなファイルなので、自作も簡単にできそうです。

addEngine(~)を実行すると、ローカルのパソコンの内にファイルができます。
デフォルトでは、「C:\Documents and Settings\ユーザ名\Application Data\Mozilla\Firefox\Profiles\文字列\searchplugins」内に、対応した検索エンジンを表すXMLファイルができます。XMLファイルは、OpenSearchフォーマットによって記述されています。
Creating OpenSearch plugins for Firefox – MDC。searchplugins内に自分用のファイルを作って、カスタマイズすればOKですね。

Firefox 検索にかんする参考リンク

PS2(プレイステーション2)をパソコンディスプレイ(液晶画面)でプレイする

ひぐらしのなく頃に祭をプレイするというその為だけにPS2(プレイステーション2本体)を買ってしまいました(財布が寒い…)。
以下は、パソコンで使っている液晶画面(ディスプレイ)で、PlayStation 2などのゲームをプレイするための参考メモです。

スキャンコンバータを用意する!

スキャンコンバータ(scan converter)とは、パソコンやテレビなどの出力信号を変換する装置のことです。この変換装置を使えば、パソコンの出力をテレビの画面で表示したり、逆にゲームやTV番組をパソコンで使っている液晶ディスプレイに表示したりすることができます。スキャンコンバータは、その用途からアップスキャンコンバータとダウンスキャンコンバータに分けることが出来ます。価格.com – スキャンコンバータにスキャンコンバータの比較情報一覧があるのですが、数がだいぶ多いので、いくつか興味を引かれたものだけをピックアップしておきます。

パソコンディスプレイとの接続は、アナログRGB(Mini D-sub15ピン)を使います。大抵のディスプレイはこの方式だと思うので、ほとんどのデイスプレイで問題なく繋げることが出来ると思います。
(参考:ワニでもわかる「コネクタ図鑑」)

アップスキャンコンバータ

パソコンモニタにTV/ゲーム等の映像を出力するための装置です。TVチューナーが内蔵されている製品もあって、その場合はアンテナを接続すれば簡単にテレビを視聴することができます。値段は2007/3/4に調べたおおよその値です。

ダウンスキャンコンバータ

こちらは逆に、TVにパソコンの画面を出力(ダウンスキャン)するための装置です。ここでは使いません。

ケーブルを用意する

PS2本体に付属しているケーブルを使って、アップスキャンコンバータとPS2接続することもできますが、実際に僕が接続して使ってみた限りではケーブルを自分で用意した方が画質がずっと良くなります(アマゾンのレビューも参考になります)。

結局、次のように接続した

今回、僕が買ったのは「PS2本体+TVBOXes+S端子ケーブル」。PS2本体以外に一万数千円かかった。安くはないけれど、リーズナブルだとは思う。

ディスプレイ⇔TVBOXesのアナログRGB出力端子[背面](ディスプレイと接続していたアナログRGBケーブル)
パソコンのアナログRGB出力端子⇔TVBOXesのアナログRGB入力端子[背面](TVBOXesに付属していたアナログRGBケーブル)
PS2本体⇔TVBOXesのオーディオ&Sビデオ入力端子[前面](付属のSビデオ/コンポーネント変換端子と別途購入したS端子ケーブルを使用)

接続は、思ったほどは面倒ではない。説明書にちゃんと書いてありました。
パソコン本体からの入力と、PS2からの入力をリモコン一つで切り変えることができ、
いちいちコネクタの入れ替えをしなくていいのがありがたい(痛んでしまうし…)。

パソコン出力をディスプレイに表示する場合にはTVBOXesの電源を入れなくてもOKなのですが、ACアダプターで電源と接続しておかないと画面が表示されないのが残念。

音量等はリモコンから調節できるので、電池を入れておかないとひどい目に遭う。

画像は予想以上に良かったけれど、CGバリバリのゲームをしたい人には少し物足りないかもしれない。

専用液晶orテレビ

ここまでの話をひっくり返してしまうのですが、PS(プレイステーション)専用の液晶モニターや、テレビ(特にブラウン管[CRT])を買うという選択肢もあります(というか、こっちの方が一般的かもしれません)。部屋のスペースや、値段を考慮して検討の価値ありです。

PS(プレイステーション)専用の液晶モニターは、やや品薄で現在のところ手に入りにくいのですが、
ショップで「プレイステーション」、「専用」、「液晶」、「モニター」などのキーワードで検索すると見つかる場合もあります。
値段はそれほど安くはありませんがが、持ち運んだりすることができます。

テレビもブラウン管のものは相当安く購入できます。場所をとってしまうのが難点ですが…。

おまけ

今回の記事とは直接関係しないものの、気になったページ。

PlayStation 2

JavaScriptとiframeで、Googleイメージ検索の画像をランダムに表示する方法

りょーちの駄文と書評:Google Random Image を試してみた
の記事を読んで、僕もGoogle Random Imageを試してみました。
JavaScript+iframeで、Googleイメージ検索の検索結果を切り替えて、表示する方法です。
Firefoxでも動く(はずの)サンプルを、「JavaScriptでGoogleイメージ検索の画像をランダムに表示する方法」に設置しました。10秒おきに画像が切り替わります。

オリジナルのGoogle Random Image

google hack from douwe osinga
にオリジナルのソースと説明があります。
実際に設置してみたJavaScriptのコード
サンプル例(IEでないと動かないと思います)

walkHtml()でページの文章を取得し、
boxfill()で単語ごとに切り分けてloadword()を一定時間ごとに呼び出しているようです。
loadword()で、Googleから画像を呼び出して表示しています。
id「searchLabel」のspanに検索キーワード、id「imagebox」のインラインフレーム(iframe)に画像を出しています。

JavaScriptで、


imagebox.document.body.innerHTML='<iframe width=1000 height=1000 
src="http://images.google.com/images?&q='+escape(searchfor)+'"></iframe>';
imagebox.scrollTo(50,200);

と、Googleの検索結果を取得しつつ、画面をスクロールして、表示部分のインラインフレーム(iframe)を、


<iframe id="imagebox" width="150" height="130"  vspace="0" hspace="0" frameborder="0" scrolling="no">></iframe>

とする事で、一部分を切り出す仕組みです。

残念ながら、Firefoxでは、動きませんでした。replaceNode~や、imagebox~のあたりが、どうも良くないみたいです。

Firefoxでも(多分動く)、Googleイメージの画像ランダム表示

元々のGoogle Random Imageは、2(javascriptをHTMLに直に書けば1)つのファイルで動くのですが、
僕が書いたのだと、3(or 2)つのファイルで動きます。りょーちさんのソースを参考に、ランダムに単語を指定して表示する仕組みです。

表示用のページ(index.html)
Googleイメージ検索を呼び出すページ(gri.html)
gri.htmlから呼び出すJavaScript(gri.js)
の三つです。

JavaScript(gri.js)をgri.htmlで呼び出し、Googleの検索結果画面を取得しています。


document.getElementById("imagebox").src=baseurl+encodeURI(searchfor);
document.getElementById("searchlabel").innerHTML=searchfor;
window.scrollTo(20,190);

の部分が、オリジナルと対応している所です。

表示用(index.html)と、呼び出し(gri.html)にある
インラインフレーム(iframe)それぞれのサイズで表示を調節しています。

直接index.htmlからGoogleの画面を呼び出したものを、スクロールする事がうまく出来なかったので、
仕方なく、iframeで呼び出したgri.htmlをgri.jsでスクロールしています。
(画面の表示位置を変えるためだけに、1ファイル余計に使っている!しかも、ブラウザによっては、うまくスクロールしてくれない!)

(誰か改良してくれないかな。scrollTo()を、どうやったらうまくインラインフレームに適用できるのか、よくわからない)。

iframe(インラインフレーム)とJavaScript

iframe(インラインフレーム)内の情報を引っ張ってこれないかなと思って検索しました。メモ。

なんだか、難しそうだ…。
「document.getElementById(‘フレームのID’).contentDocument」というのは、初めて知りました。
こんなのがあるなんて!