Plugin Directoryから削除されたプラグインを検知する

このサイトで使用しているプラグインは、未公開の自作品を除けば全て「WordPress.ORG」の「Plugin Directory」に登録されたものを使っている。

「Plugin Directory」に登録されたものであれば、ダッシュボードで更新通知を受信できるためアップデートが楽というメリットがあるが、実はもう1つの理由がある。

それは、「Plugin Directory」に登録されたものなら比較的安全だろうという考えに基づいている。

WordPress用のテーマやプラグインは、悪意を持って作ることも簡単である。

実際、そのようなテーマやプラグインは少なくない。

そのため、導入前のチェックが重要になる。

チェックを行うツールとして「Theme-Check」と「Plugin-Check」をインストールする手もあるが、これもメッセージの内容が理解できてこそ意味のあるツールなので、敷居は低いとは言えない。

個人的には「Plugin Directory」のプラグインが比較的安全だろうとは思っているが、登録されているプラグイン全てが安全かと言われればそうではなく、そもそも「Plugin Directory」への登録自体が簡単で、ソースコードを提出しなくとも許可される。

実際、登録申請フォーム「Add Your Plugin」を見ると、「Plugin URL」の項目が「required(必須)」になっていない。

過去に「Plugin Directory」でセキュリティ上の問題が発生したことがあり、そのタイミング登録申請したプラグインに対してソースコードの提出を求められたので、最近は面倒を避けるために、最初からソースコードも提出しているおり、現在、すべての申請に対してソースコードの提出が求められていないかは分からない。

しかし、現在もノーチェックで登録が許可されている可能性も高い。

そもそも、登録申請から許可されるまでの時間を考えると、ソースコードを提出した場合でも、殆どノーチェックではないかと思われる。

つまり、すべての登録プラグインが、ガイドライン「Detailed Plugin Guidelines」を守っているとは限らず、「Free Themes Directory」に比べると甘いと言える。

とは言え、「Plugin Directory」はユーザー自体が多いので、万が一、悪意のあるプラグインが登録された場合でも、ある程度の期間公開されれば、ユーザーによって問題が報告され「Plugin Directory」から削除される。

公開からある程度時間の経過しているプラグインは、より安全であるとは言えるだろう。

ただし、公開間もないプラグインが全て危険という意味ではないので誤解のないように。

また「Plugin Directory」から削除される理由としては、プラグインの作者の都合であるケースもあるため、削除されたからと言って危険なプラグインだったとは限らない。

私は、以前から「Plugin Directory」に一度登録された後に削除されたプラグインを簡単に調べる方法が欲しいと思っていた。

削除されたプラグインは問題があった可能性もあるので、それを知りたいと言う理由もあるが、それに加えて運用上の理由が大きい。

私の場合は、ダッシュボードでの更新通知に完全に頼っているので、更新通知によってプラグインをアップデートしている。

更新通知がない場合は、それが単にアップデートが無いだけなのか、「Plugin Directory」から削除されたためなのか知る手段がないので、単にアップデートがないと考えるしかなくなる。

その結果、作者の意思で「Plugin Directory」から登録を削除し、「Plugin Directory」以外の場所で公開されている場合でも、アップデートがないと思って、古いバージョンを使い続けることになるかもしれないからだ。

この問題に対処する1つの方法として、先日「No Longer in Directory」というプラグインを見つけた。

このプラグインは、「Plugin Directory」から削除されたプラグインのリストを保持している。

リストは、バージョン1.0でも8,000行以上もある。

ダッシュボードの「プラグイン」->「No Longer in Directory」にアクセスすると、インストールされたプラグインの中にリストにマッチするものないか調べ、マッチするものがあれば、更にそのプラグインのページが「Plugin Directory」に存在するかHTTP requestによって調べ、ページがなければ、今、現在も「Plugin Directory」から削除されたままであると判断し、警告を表示する仕様になっている。

この方法であれば、リストが間違っていたり、不幸な偶然でリスト致してしまわない限り「Plugin Directory」以外からダウンロードしたプラグインが誤検知されることはない。

大前提としてリストが正確で、今後も更新され続けることが重要であるが、この問題の解決の1つの手段にはなりそうだ。

あまりダウンロードされないと、作者も更新しなくなる可能性があるので、再度、「No Longer in Directory」を宣伝しておく。

Posted in WordPress, ネット・PC | Tagged , | Leave a comment

POST2PDF Converter バージョン0.4 リリース

WordPressの投稿や固定ページをPDF形式でダウンロード出来るようにするプラグイン「POST2PDF Converter バージョン0.4」をリリースした。

バージョン0.4 2012/2/16

最新の「POST2PDF Converter」をダウンロード

バージョン0.4では、作成されたPDFをキャッシュする機能を追加した。

過去のバージョンでは、ダウンロードリンクがクリックされる度に、PDFへの変換処理を行う仕様であったが、新しく追加されたキャッシュを有効にすることで、一度変換が行われた投稿に関しては変換を行わず、キャッシュからダウンロードされるようになり、サーバーの負荷が軽減されるようになった。

キャッシュの保持期間の設定は出来ず、無制限であるが、記事の内容が変更された場合は、更新後の最初ダウンロードのタイミングで個別にキャッシュは更新され、変更内容がPDFに反映される。

また、設定のリセットを含め、PDFの内容に影響を与える設定変更を行った場合や、キャッシュを無効にした場合には、すべてのキャッシュファイルがクリアされるようになっている。

記事とキャッシュの内容の不一致が起こらないように配慮しており、手動でキャッシュをクリアすることも出来るが、これは殆ど使う必要はないだろう。

記事とキャッシュの不一致が起こると考えられるケースは、直接、データベース上の記事データを変更した場合で、これをダッシュボード上から実行できるプラグインもあるが、通常の仕様の範囲では、まず、記事とキャッシュの不一致は発生しないと考えて良いだろう。

なお、ダッシュボードからプラグインの自動更新を行った場合も、キャッシュはクリアされてしまうため、これを避けたいならば、アップデートの際、手動で上書きインストールを行えば良い。

キャッシュは、「プラグインディレクトリ/post2pdf-converter/pdfs」に格納されている。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | Leave a comment

初心者による初心者のためのPHP講座 第8回 ループ処理

PHPでは、同じ処理を繰り返し実行するための「ループ処理」を記述出来る。

ループ処理は、PHPでは、出番が多い構文であり、必ずマスターしておくこと。

while構文

while構文はシンプルなループを記述するための構文で、if文と似ている。

while (式) {
	処理
}

if文の場合は、式が真の場合に処理を実行するが、while文の場合は、式が真である限り、同じ処理を繰り返し実行する。

下記のサンプルは、$countが6未満であれば処理を繰り返す。

$countの初期値は1であり、処理が実行される度に1加算される。

<?php
$count = 1;
while ($count < 6) {
        echo $count;
	$count++;
}
?>

従って、上記のサンプルを実行すると「12345」と表示される。

for構文

for構文は、while構文と比較すると複雑な構文で、繰り返しの条件を定義するために3つの式を必要とする。

for (式1; 式3; 式3) {
	処理
}

式1は、whileを開始した時に1度だけ実行され、式2は、処理に実行を完了する度に実行される。そして、式3が真であれば処理が繰り返される。

複雑ではあるが、以下のように読み替えると理解しやすい。

for (初期値; 条件式; 増減) {
	処理
}

式1で変数の初期値を定義し、式3で変数の増減を定義しておけば、式2の条件式で変数を評価することで意図した回数ループを繰り返すことが出来る。

<?php
for ($count = 1; $count < 6; $count++) {
        echo $count;
}
?>

上記のサンプルでは、$countの初期値が1で、処理の度に1増える。

そして、$countが6未満なら処理が繰り返されるため、実行すると「12345」と表示される。

次のサンプルでは、複数の変数の初期値と増減を記述している。

<?php
for ($count = 1, $value = 5; $count < 6; $count++, $value--) {
        echo "\$count:".$count." \$value:".$value."<br />";
}
?>

複数の変数の初期値と増減を記述する場合は、それらをカンマで区切ること。

for構文は、次のように記述しても良い。

for (式1; 式2; 式3):
	処理
endfor;

do~while構文

while構文やfor構文が、まず条件式を評価した上で、条件式が真であれば処理を繰り返すのに対して、do~while構文は、まず処理を実行してから、条件式の評価が行われる。

つまり、条件を満たしているか否かに関係なく、少なくとも1回の処理が実行され、2回目以降は、条件式が真である場合のみ繰り返される。

do {
	処理スクリプト
} while(式);

条件評価と処理の順序が逆であるが、基本的にはwhile構文と似ている。

次にサンプルは、$valの初期値が既に条件を満たしていない。

<?php
$val = -1;
do {
	echo $val;
} while ($val > 0);
?>

しかし、do~while構文では、条件の評価より先に処理が実行されるため、「-1」と表示される。

foreach構文

foreach構文は、配列を処理するために使われる配列専用のループ構文である。

だからと言って、配列にfor構文などを使用してはいけないという訳ではない。

foreach構文が優れている点は、ごく簡単な記述で、配列から要素を1つずつ取り出して処理出来る点である。

構文は下記のようになる。

foreach(配列 as $value) {
	処理
}

または

foreach(配列 as $key => $value) {
	処理
}

foreach構文では、配列から要素を取り出し、取り出した要素の値が自動的に変数$valueに代入される。

そして、この処理を、配列の先頭から最後まで繰り返す。

また、演算子「=>」を用いることで、配列から取り出された要素のキーと対応する値を、$key、$valueに代入させることも出来る。

なお、受け皿となる変数名は、$key、$value以外でも構わない。

おそらく、具体的な処理を見た方が理解しやすいだろう。

以下では、全ての要素からキーと値を取り出して表示させてる。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>foreach文で連想配列を処理</title>
</head>
<body>
<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => $age) {
	echo "名前:".$name."<br />";
	echo "年齢:".$age."<br /><br />";
}
?>
</body>
</html>

上記のスクリプトの実行結果を表示

下記のサンプルでは、要素の値の書き換えを行なっている。

<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => $age) {
	$members[$name] = $age * 2;
}

print_r($members);
?>

処理としては、単に年齢を2倍しているだけであり、下記のサンプルのように変数の「参照渡し」を利用し、直接、要素を書き換えて同様の処理を行うことも出来る。

<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => &$age) {
	$age = $age * 2;
}

print_r($members);
?>

「$gae」ではなく「&$age」としている点がこの処理のポイントである。

ループのネスト

ループ内にループを記述して多重ループを構成することも出来る。

<?php
$a = 1;

while ($a < 3) {
	$b = 1;

	while ($b < 3) {
		echo "\$a:".$a." \$b:".$b."<br />";
		$b++;
	}

	$a++;
}
?>

上のサンプルでは、外側のwhile文が1回実行される毎に内側のwhile文が3回実行される。

外側のwhile文は3回実行されるので、内側のwhile文内の処理echo()は、計9回実行されることになる。

break

「break」は、switch構文の際にも用いたが、ループ構文に対しても使用可能で、while、for、do~while、foreach構文の処理を中断し、ループを抜けることが出来る。

次の例では、「suzuki」というキーを持つ要素の値を表示している。

<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => $age) {
	if ($name == "suzuki") {
		echo $age;
	}
}
?>

上記の例では、「suzuki」に一致するキーが見つかった時点で、以後の繰り返しは無駄になってしまう。

従って、以下のようにbreakを使ってループから抜けるのが適切な処理と言える。

<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => $age) {
	if ($name == "suzuki") {
		echo $age;
		break;
	}
}
?>

無駄な処理は、処理の遅延や負荷を生む原因になるため、breakを使用することを心掛ける必要がある。

ネストされたループ処理をbreakで抜ける場合は注意が必要である。

break文では、ループ構造を抜ける回数を指定できるので、例えば2重のループを完全に抜ける場合は、

break 2;

と言った記述を行う必要がある。

なお、サンプルのようにループ構造を抜ける回数を指定しなかった場合は、「1」と見なされる。

continue

ループの中で「continue」が記述されていると、それ以降の処理をスキップして、この回の繰り返しを終了し、条件式の評価を行い、真ならば次の繰り返しを実行する。

以下のサンプルでは、「continue」を使って、キーが「yamada」の場合のみ、echo()による出力を行わないようにしている。

<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => $age) {
	if ($name == "yamada") {
		continue;
	}

	echo "名前:".$name."<br />";
	echo "年齢:".$age."<br /><br />";
}
?>

ループとループ内の変数

以下のサンプルの実行結果が予想出来るだろうか?

<?php
$count = 1;
while($count < 6) {
	echo $count;
	$count++;
}

echo $count;
?>

これは、どうだろうか?

<?php
for ($count = 1; $count < 6; $count++) {
        $val = $count *2;
}

echo $count;
?>

答えは、どちらも「6」である。

条件式やループ内で定義した変数は、ループ終了後も解除されず、生きているので、同じ変数を再度利用する場合は、注意が必要である。

特に複数のwhile文やdo~while文で、条件式に使う変数を使い回す場合は、都度、再定義してリセットすること。

続いて、foreach構文の場合を検証してみよう。

<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => $age) {
	if ($name == "suzuki") {
		$members[$name] = $age * 2;
	}
}

echo "\$name:".$name."<br />";
echo "\$age:".$age."<br /><br />";
?>

上記のサンプルの実行結果は、

$name:tanaka
$age:46

となる。

つまり、キーや値の受け皿となる変数は解除されず、最後に取得した値が格納されたままになっている。

しかし、同様のforeach構文で同じ変数をキーや値の受け皿として使う場合は、再度、配列の先頭から取得し直すため、現状、どのような値が格納されているかは問題にならない。

とは言え、ループが終了した時点で、これらは基本的に不要な変数となるので、unset()関数で変数の割り当てを解除し、メモリから解放すると良い。

<?php
$members = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

foreach($members as $name => $age) {
	if ($name == "suzuki") {
		$members[$name] = $age * 2;
	}
}

unset($name);
unset($age);
?>
Posted in PHP, PHP講座, ネット・PC | Tagged | Leave a comment

PDFファイルを生成するためのPHPライブラリ「TCPDF」

昨年末にWordPressの投稿や固定ページをPDF形式でダウンロード出来るようにするプラグイン、「POST2PDF Converter」をリリースしたところ、予想外に反響があった。

そもそも、同様の機能を持つプラグインは既に複数存在しており、「POST2PDF Converter」は、特に目新しいプラグインではないのであるが・・・。

投稿や固定ページをPDFへ変換するプラグインのうち、人気のものは外部のオンラインサービスを利用してPDFファイルの変換している。

例えば、「Print Friendly and PDF Button」は、「printfriendly」と言うサービスを利用してPDFに変換している。

また、「PDF24 Article To PDF」は、「PDF24」というサービスを利用しており、「PDF & Print Button Joliprint」は、「joliprint」を利用している。

これらのサービスは、PDF変換以外の機能も提供しているケースが多く、概ね高機能である。

対して「POST2PDF Converter」は、「TCPDF」というオープンソースのPHPライブラリを利用しており、外部サービスに依存せず、サーバー上で変換を行う。

もっとも、「TCPDF」を利用したプラグインは、以前から他にも存在しており、この点でも「POST2PDF Converter」が特に目新しいものでは無いのであるが・・・。

どちらかと言えば、「TCPDF」を利用したプラグインは、WordPressのプラグインの中ではマイナーな部類になるが、それは「TCPDF」が機能的に劣ると言うことではなく、UTF-8のWordPressコンテンツとも基本的に相性が良い。

「TCPDF」は、イタリア人のNicola Asuni氏(Tecnick.com S.r.l)によって開発されたPHPライブラリであり、「FPDF」の派生である。

このライブラリを使用するには、PHP 5が必要であるが、PHP 4用のパッケージも用意されている。

PHPのライブラリであるが故に、WordPressとの相性も良く、簡単な記述でDBからHTML形式のコンテンツ取得し、それを「TCPDF」に渡してPDF形式に変換することが出来る。

また、グラフやQRコードなどのバーコードの描画も可能であり、工夫次第で、かなり凝ったPDFを生成できるようになっている。

APIは単純とは言えないが、僅かなコードの追加でHTMLをPDFに変換するための処理を記述できる。
WordPressのようにコンテンツをHTML形式で取得し易いシステムであれば、導入に苦はないはずである。

PDFへの変換処理に関しては「TCPDF Examples」でサンプルが用意されているので、これを真似て書くと手っ取り早いだろう。

少し版は古いが「MONZEN.ORG」で日本語ドキュメントが用意されているので、これも参考になる。

ディレクトリパス、フォント、フォントサイズと言った設定パラメーターは「/config/tcpdf_config.php」で定数として設定する形になっており、必要に応じてこれを編集する。

「/config/lang」ディレクトリには、各言語用の設定ファイルが格納されている。

バージョン5.9.145からは日本語用の設定ファイル「jpn.php」が同行されているので、これを使えば良いが、設定ファイルの記述自体は単純であり、足りない言語の設定ファイルも簡単に自作することが出来る。

$l['a_meta_charset'] で文字コード、$l['a_meta_dir']で記述方向(左から右ならltr、右から左ならrtl)、$l['a_meta_language']で言語コード定義する。

そして、$l['w_page']では、「page」の訳を定義する。

下記は、UTF-8、日本語の場合の記述例である。

// Japanese

global $l;
$l = Array();

// PAGE META DESCRIPTORS --------------------------------------

$l['a_meta_charset'] = 'UTF-8';
$l['a_meta_dir'] = 'ltr';
$l['a_meta_language'] = 'ja';

// TRANSLATIONS --------------------------------------
$l['w_page'] = 'ページ';

//============================================================+
// END OF FILE
//============================================================+

この設定ファイルは、最初にrequire_once()で読みこめば良い。

更にもう1つ、言語によって変更すべき要素があり、それがフォントである。

フォントは、setHeaderFont、setFooterFont、SetFont、SetDefaultMonospacedFontメソッドで指定する。

なお、SetDefaultMonospacedFontでは、プロポーショナルフォントを指定することは出来ず、等幅フォントを指定する必要がある。

標準の日本語フォントは、

  • cid0jp(ArialUnicodeMS)
  • kozgopromedium(Kozuka Gothic Pro)
  • kozminproregular(Kozuka Mincho Pro)

の3つであるが、残念ながら文字化け等が発生するケースがある。

場合によっては、オープンソースのTrueType日本語フォントなどをTCPDF用に変換して、それを使った方が良いかもしれない。

バージョン5.9.123からは、TrueTypeフォントをTCPDF用に変換するためのメソッド、addTTFfont()が追加されたので、フォントの変換の際にはこれを利用する。

また、5.9.122以前に同梱されていたツールを使っても良い。

なお、このサイトでもオープンソースのIPAフォントと梅フォントをTCPDF用に変換したものを公開している。

TCPDFは、HTMLタグを解釈し、タグに従ってレイアウトを行った上でPDFに変換するが、全てのタグや属性を正しく解釈できる訳ではない。

また、通常ウェブサイトは、別途CSSを読み込んでレイアウトを行なっているが、このCSSがPDFに反映される訳でもない。(あくまでHTMLのみ解釈する。)

そのため、生成したPDFは、実際のウェブサイトとレイアウトが異なってしまう場合が多い。

必要であれば、HTMLにstyle属性を付加するなどして、微調整する必要がある。

PDFに変換される事を意識してHTMLを書くのも良いし、HTMLをそのままTCPDFに渡すのではなく、その前の段階で、HTMLをTCPDFに最適化させる処理を入れても良い。

拘れば、ここが最も面倒な作業になるだろう。

Posted in PHP, WordPress, ネット・PC | Tagged , , | Leave a comment

Disqus Comment System for EZ zenback Ver. 2.70 modified 2.0 リリース

「Disqus Comment System for EZ zenback Ver. 2.70 modified 2.0」を公開した。

Ver. 2.70 modified 2.0 2012/1/28

最新の「Disqus Comment System for EZ zenback」をダウンロード

このバージョンは、リリース予定の「EZ zenback」(バージョン1.5.2を予定)に対応したバージョンであり、「EZ zenback」のユーザーは、事前にこのバージョンにアップデートして欲しい。

勿論、現行の「EZ zenback バージョン1.5」および過去のリリースも対応している。

「Disqus Comment System for EZ zenback Ver. 2.70 modified 2.0」は、「EZ zenback」との併用が前提となっているので、これ単体では使用しないこと。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | Leave a comment

POST2PDF Converter バージョン0.3 リリース

WordPressの投稿や固定ページをPDF形式でダウンロード出来るようにするプラグイン「POST2PDF Converter バージョン0.3」をリリースした。

バージョン0.3 2012/1/26

最新の「POST2PDF Converter」をダウンロード

「POST2PDF Converter」は、一度、変換されたPDFを保存せず、ダウンロードリンクがクリックされる度に、新たにPDFへの変換を行う方式を採用しており、この方法は、記事を変更した場合にも、リアルタイムでPDFにも反映されるというメリットがあるが、サーバーに負荷を掛けると言うデメリットもある。

このあたりは次のバージョンでの改善を考えているが、バージョン0.3では、この問題を解決する1つの手段として設定画面上で管理者が手動で記事をPDFに変換し、ダウンロード出来るようにした。

POST2PDF Converter PDFファイルの作成

設定画面で作成したPDFファイルに、記事に任意の場所でリンクを貼れば、サーバーに負荷を掛ける事なく、記事をPDF形式でダウンロード出来るようになる。

また、「POST2PDF Converter」がPDF作成のために利用してる「TCPDF」は、PC用のTrueTypeフォントを直接フォントとして使用することが出来ず、予め変換を行う必要があるが、バージョン0.3では、この変換作業を設定画面上で行うこと出来るようになった。

POST2PDF Converter フォントの変換

変換できるフォントは、TrueTypeフォント、OpenTypeフォント、Type1フォントなどである。

なお、変換テストは、TrueTypeフォントでしか行なっていない。

TCPDF用フォントへの変換は、プログラムの改変する行為であり、またPDFで使用すると言うことは、広く一般に配布されるドキュメントでフォントを埋め込む事を意味する。

そのため、変換が許されるフォントは、ライセンス上、改変が許され、PDFの埋め込みフォントとして利用でき、作成したPDFの配布が許されているフォントに限られる。

現実的は、オープンソースのフォントや自作のフォントに限られるだろう。

変換後のフォントを再配布する場合も、ラインセンス上、問題がないか確認すること。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | Leave a comment

Google Translate API v1の終了とWordPressの翻訳プラグイン

Googleが無料で提供している翻訳サービス「Google 翻訳」大変便利で、広く使われているが、その無料APIである「Google Translate API v1」が残念なことに昨年12月にサービスを終了し、有料の「Google Translate API v2」のみの提供となってしまった。

WordPressの翻訳系プラグインでも広く使われていたAPIであるので、WordPressへの影響は大きく、これを機に開発を終了してしまったプラグインや、公開されてはいるものの動作しないプラグインが出てきている状況である。

実際、私が使っていたWordPressプラグイン「Gtranslate」も「Google Translate API v1」を使っていたため、機能しなくなった。

また、WordPressプラグインではないが、このブログの下に表示される多機能ツールバー「Wibiya」の翻訳サービス「iTranslation」も同様の理由で機能しなくなってしまった。

そのため、代わりのプラグイン、サービスを探す必要が生じた。

APIが公開されている翻訳サービスは数多くあるようであるが、日本語に対応し、対応言語(翻訳可能な言語)が多く、使いやすく、サービスが継続されそうなものとなると殆ど皆無で、「Bing Translator」の「Microsoft Translator API」が良さそうである。

ただし、「Google Translate API v1」と比べると対応言語が37と少ないなど、機能面で見劣りすることは否めないが・・・。

そこで「Microsoft Translator API」をサポートするWordPressプラグインを探してみたが、多くのプラグインが「Google Translate API」を採用しており、予想外に見つからない。

それだけ「Google Translate API」が優れているということだろうが、私が探した範囲では、「Transposh Translation Filter」が、唯一「Microsoft Translator API」を採用し、まともに使えるプラグインだった。

厳密に言えば、「Transposh Translation Filter」は、「Google Translate API」と「Microsoft Translator API」の両方をサポートしており、「Microsoft Translator API」を使うなら、37の言語、日本語を除いて実質36の言語への翻訳が可能である。

設定画面上で、言語の有効化/無効化を行うが、言語と対応するAPIも分かりやすい。

Transposh WordPress Translation 言語の設定

ただし、言語名の表記が、その言語でされているため、何の言語なのか分からないという難点がある。

言語の選択を行うウィジェットを追加できる他、ブラウザの言語に応じて、予め翻訳済みの記事を自動表示するように設定することも出来る。

実際に「WordPressのショートコードAPI」を英語に翻訳してみると・・・

Transposh WordPress Translationで英語に翻訳

本文だけでなく、タイトル、メニューのラベル、カレンダーと言ったかなり細かなところまで翻訳されていることが分かる。

このプラグインの最大の特徴は、「Google Translate API」と「Microsoft Translator API」を利用した自動翻訳機能を備えながらも、サイトの訪問者などに翻訳して貰う機能を備えている点である。

サイトの訪問者は、自動翻訳による訳文に気に入らない部分があれば、そこを簡単に修正することが出来る。

これを利用すれば、人の手による翻訳で翻訳の精度を上げることが出来るが、もっとも、これは訪問者の協力が得られればの話である。

設定にもよるが、自動翻訳、または人の手による翻訳によって作られた訳文はデータベースに保存されるようで、翻訳の度に必ずしもAPIにアクセスするわけではないようである。

設定項目は多く、細かな設定が出来るプラグインであるが、基本的には、最初の「Supported languages」の設定さえ行えば、問題なく使えるはずだ。

ただし、「wp-config.php」で、$_SERVER['HTTP_ACCEPT_LANGUAGE']を使って定数「WPLANG」の設定を振り分けてローケルを切り替えている場合は、「Enable override for default locale」を無効にしないと、管理画面の表示が思わぬ結果になる。

ちなみに、今のところ、WordPressの翻訳系プラグインは選択肢不足の状況にあるので、もし、人気のプラグインを作りたいなら、翻訳系のプラグインは狙い目かもしれない。

Posted in WordPress, ネット・PC | Tagged , , | Leave a comment

Plugin Directoryの自分のプラグインページにバナーを設置する

WordPressのプラグイン公開サイトである「WORDPRESS.ORG Plugin Directory」を見ると昨年末より、バナーが表示されているページが増えて来たことに気づくだろう。

これは、昨年末より「Plugin Directory」がバナーの表示をサポートしたからであり、これに関する記事が「WordPress Development Updates」にMattの手で書かれている。

バナーを表示させるだけでも随分と見栄えが良くなり、プラグインの機能を端的に伝える事も出来る。

プラグインを開発し、「Plugin Directory」で公開しているなら、ぜひバナーを設置したい。

以下、バナーを表示させる方法をまとめる。

  1. まず、横772ピクセル、縦250ピクセルの画像を用意する。画像はjpegかpng形式でなければならない。ファイル名は、「banner-772x250.jpg」、または「banner-772x250.png」とすること。
  2. 続いて、「assets」というディレクトリを、SVNのルートの作成し、その中に作成した画像を入れてアップロードする。(ローカルで作成して、単にコミットすれば良い。)「assets」の作成場所は「trunk」の中ではない事に注意。

以上で、暫くするとバナーが表示されるはずである。

これらの情報は、「Developer FAQ」にも書かれており、ここを読むと更に面白いことが出来ることに気づく。

?banner_url=画像のURL

というパラメーターをプラグインページのURLに付加することで、指定した画像をバナーに使用して、プラグインページを表示させることが出来る。

以下のURLは、同じプラグインページへのURLであるが、パラメーターによるバナー画像の指定で、バナーが変化することが分かる。

http://wordpress.org/extend/plugins/wp-syntaxhighlighter/

http://wordpress.org/extend/plugins/wp-syntaxhighlighter/?banner_url=http://plugins.svn.wordpress.org/wp-wapuu-widget/assets/banner-772×250.png

※URL中の「×」が全角で表示されているが、正しくは半角。

Posted in WordPress, ネット・PC | Tagged , , , | Leave a comment

CodeMirror for CodeEditor バージョン0.5 リリース

「CodeMirror for CodeEditor バージョン0.5」をリリースした。

バージョン0.5 2012/1/12

最新の「CodeMirror for CodeEditor」をダウンロード

バージョン0.5では内包する「CodeMirror」ライブラリをアップデートしている。

新機能としては、タブをマーカーで表示して、タブによるインデントを見えるようにする機能が追加された。

また、検索、置換機能が新しくなり、キー操作によって必要な時だけ表示するタイプに変わった。

そのためツールバーは、以前のバージョンに比べてすっきりしている。

CodeMirror for CodeEditor 0.5のツールバー

例えば、検索機能は、CtrlとFキーの同時押しで起動する。(または、CmdとFキー)

CodeMirror for CodeEditor 0.5の検索機能

その他の操作は下記の通り。

  • 下候補:CtrlとGキーを同時に押す。(または、CmdとGキー)
  • 上候補:Shift、CtrlとGキーを同時に押す。(または、Shift、CmdとGキー)
  • 置換:Shift、CtrlとFキーを同時に押す。(または、Cmd、OptionとFキー)
  • 全置換:Shift、CtrlとRキーを同時に押す。(または、Shift、Cmd、OptionとFキー)

ただし、フルスクリーンモードでは、検索、置換機能が使えなくなった。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | Leave a comment

初心者による初心者のためのPHP講座 第7回 配列

「配列」は変数の一種であるが、通常の変数が、1つの変数に1つの値しか格納できないのに対して、「配列」とは、複数の値を格納する変数のことである。

配列は、格納する値同士の紐付けが容易であるため、重宝する場面が多く、出番も多いので必ずマスターしておく必要がある。

私の場合、それほど多用するわけではないが、設定パラメーターを格納する際には、よく配列を用いている。

配列の定義

例えば、年齢を変数に格納するとしよう。

複数の年齢を格納する場合は、今まで学んだ知識の範囲でこれを記述するとなると、

<?php
$age1 = 13;
$age2 = 25;
$age3 = 46;
?>

のように複数の変数を定義する必要がある。

値の数が少ない場合は、上記のような定義も悪くはないが、値の数が1,000個、10,000個となると、定義すべき変数の数が膨大になり、非常に効率が悪い。

しかし、配列を用いれば、複数の値を1つの変数に格納することが出来る。

実際に配列を使って定義すると以下のようになる。

<?php
$age[0] = 13;
$age[1] = 25;
$age[2] = 46;
?>

上記の例では、1つの変数と言うことも出来る配列$ageに全ての構成要素が格納されている。

配列と言っても通常の変数と書式に違いはないが、配列に格納される各要素(値)を定義する場合は、角括弧構文を用いて[キー]を指定する必要がある。

<?php
$変数名[キー1] = 値1;
$変数名[キー2] = 値2;
$変数名[キー3] = 値3;
?>

「キー」と「値」は、必ずペアになっており、「キー」に紐付けられた「値」を配列の要素と呼ぶ。

「要素」は「値」が住んでいる部屋で、そのルームナンバーが「キー」と理解すると良いだろう。

配列から値を取り出したい場合も、ルームナンバーである「キー」を使って取り出すことが出来る。

値としては、通常の変数同様に、整数値、浮動小数点、文字列、論理値、NULLが格納できる他、配列を格納することも出来る。

配列を格納する配列を、多次元配列と呼ぶが、これについては後ほど説明する。

以下の例では、配列$ageを定義し、$ageからキー「1」の値を取り出してecho()で表示させている。

<?php
$age[0] = 13;
$age[1] = 25;
$age[2] = 46;

echo $age[1];
?>

以上のように、特定の値を取り出す場合にも角括弧構文を用いて、キーで指定する。

キーに0から始まる整数値を使う場合は、下記のように角括弧構文の中のキーを省略して定義することも出来る。

<?php
$age[] = 13;
$age[] = 25;
$age[] = 46;

echo $age[1];
?>

上記の例では、キーは省略されているもの、各要素には先頭から順に0、1、2・・・と言った整数値がキーとして与えられており、「25」と表示される。

また、配列は角括弧構文以外でも定義でき、配列の定義のために用意されているarray()関数を使って配列を定義することも出来る。

<?php
$age = array(13, 25, 46);
?>

キーは、省略されているが、この場合も、各要素には0から始まる整数値のキーが自動的に割り当てられる。

明示的にキーを書くならば、下記のようになる。

<?php
$age = array(0 => 13, 1 => 25, 2 => 46);
?>

array()関数を用いる場合は、演算子「=>」を使って、キーと値の関係を記述し、要素を定義できる。

また、explode()関数を使えば、特定の文字で区切られた文字列を配列に格納することが出来る。

<?php
$str_age = "13,25,46";
$age = explode(",", $str_age);

echo $age[1];
?>

上記の例では、「,」を区切り文字として「,」で元の文字列を分解し、先頭から順に要素として格納している。結果、「25」と表示される。

その他、str_split()関数、preg_split()関数など、戻り値として配列を返す関数は、数多く有り、これらも配列の定義に利用することが出来る。

空の配列

array()関数を使って配列を定義し、下記のように引数を省略すれば、要素を持たない空の配列を定義することが出来る。

<?php
$var = array();

if ($var === NULL) {
	echo "NULLです。";
} else if (is_array($var)) {
	echo "配列です。";
}
?>

ただし、型としては配列であるため、型の違いまで考慮すれば、NULLとは本質的に異なる。

なお、is_array()関数は、変数が配列の場合はtrue、そうでない場合は、falseを返す。

予め空の配列を定義する行為に意味がないわけではなく、配列が要素を持たない場合にも、空の変数ではなく、空の配列として識別が可能であるため、例えば、条件分岐によって要素を与え、条件によっては、全く要素が追加されず、空になるケースが考えられる場合でも、型としては配列であり、それを判定することが出来る。

特に角括弧構文を用いて要素を定義し、配列を組み立てる場合は、1つ目の要素が定義されるまでは、仮に参照したとしても未定義の変数でしかないので、予め、空の配列として定義しておくと良い。

<?php
$age = array();
$age[0] = 13;
$age[1] = 25;
$age[2] = 46;

echo $age[1];
?>

些細な事ではあるが、空の変数と区別する場合は重要である。

配列全体を表示する

配列全体を表示させる処理を実際のプログラムの中で使うことは、少ないかもしれないが、デバッグ用に出力して配列の中身を確認する必要性が生じるケースは少なくないので、これも覚えておく必要がある。

しかし、下記の例は上手くいかない。

<?php
$age = array(13, 25, 46);

echo $age;
?>

それは単純にecho()関数が、キーを指定せずに配列全体を表示させることは出来ず、結果は「Array」と表示してしまうからである。

代わりにprint_r()関数、var_dump()関数、var_export()関数を使うと良い。

<?php
$age = array(13, 25, 46);

print_r($age);
?>

連想配列

「連想配列」と言っても特殊な配列ではなく、整数値ではなく、文字列をキーに持つ要素を格納する配列のことである。

<?php
$age['suzuki'] = 13;
$age['yamada'] = 25;
$age['tanaka'] = 46;
?>

<?php
$age = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);
?>

が「連想配列」になる。

「キー」には、アルファベット、数字、アンダースコアを使うことが出来るが、最初の1文字はアルファベットかアンダースコアである必要がある。

このようにキーに文字列を使い意味を持たせることで、配列の意図がより分かりやすいものになる。

連想配列の場合も、角括弧構文を用いて、キーを指定して配列から値を取り出すことができる。

<?php
$age = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);

echo $age['yamada'];
?>

多次元配列

多次元配列とは、値として配列を格納する多重構造の配列である。

値として配列を格納することで、より複雑なツリー構造を構築でき、構造自体は複雑になるかもしれないが、配列の持つ意味は、明示的なものであり、PHPのコードで考えるよりも構造を図示をした方理解しやすいかもしれない。

これまで例では、名前と年齢を紐付けた連想配列を作成したが、ここでは、加えて性別も格納するとする。

以下で、その構造を図示してみた。

  • suzuki
    • age:13
    • sex:male
  • yamada
    • age:25
    • sex:female
  • tanaka
    • age:46
    • sex:male

黒四角が各要素の「キー」であり、黒丸が値になるが、値は複数あるので、それぞれの黒丸のペアも独立した配列になる。

つまり、連想配列の中で、名前に紐付けられた形で年齢と性別の連想配列を格納する。

ちなみに、これは二次元配列である。

以下、3つの方法で連想配列を定義してみた。

<?php
// array()関数を使わずに定義
$prof['suzuki']['age'] = 13;
$prof['suzuki']['sex'] = 'male';
$prof['yamada']['age'] = 25;
$prof['yamada']['sex'] = 'female';
$prof['tanaka']['age'] = 46;
$prof['tanaka']['sex'] = 'male';

echo $prof['yamada']['sex'];
?>

<?php
// 内包する配列のみarray()関数を使って定義
$prof['suzuki'] = array('age' => 13, 'sex' => 'male');
$prof['yamada'] = array('age' => 25, 'sex' => 'female');
$prof['tanaka'] = array('age' => 46, 'sex' => 'male');

echo $prof['yamada']['sex'];
?>

<?php
// 全てにarray()関数を使って定義
$prof = array(
	'suzuki' => array('age' => 13, 'sex' => 'male'),
	'yamada'=> array('age' => 25, 'sex' => 'female'),
	'tanaka' => array('age' => 46, 'sex' => 'male'),
);

echo $prof['yamada']['sex'];
?>

おそらく3番目の方法が一番分かりやすいだろう。

末端の値を取り出す場合も、一次元の配列同様に角括弧構文を用いて「キー」で指定する。

ただし、複数のキーを記述する必要がある。

以下のように書いても良いし、以下の例のほうが、その意味が分かりやすいかもしれない。

<?php
$val = $prof['yamada'];
echo $val['sex'];
?>

キーの自動付与

キーを省略した場合は、自動的に0から始まる整数値がキーとして与えられることは前にも書いたが、ここでは少し複雑な例を扱う。

下記の例では、最後の要素に与えられるキーはどのようになるだろうか?

<?php
$color[3] = 'black';
$color[11] = 'white';
$color[] = 'blue';
?>

答えは、「12」である。

上の例では、キーの最大値が11であるため、その続きとして12となる。

これは、次のようにarray()関数を用いた場合も同様である。

<?php
$color = array(3 => 'black', 11 => 'white', 'blue');
?>

配列の操作

ここでは、様々な配列の操作について学ぶ。PHPでは、配列を扱う関数が充実しており、配列に対して様々な処理を簡単に行うことが出来る。

ここでは、一部ではあるが、それらを紹介する。

次の例では、キーとして「2」が与えられている要素が2度定義されている。

<?php
$color[0] = 'black';
$color[1] = 'white';
$color[2] = 'blue';

$color[2] = 'red';

echo $color[2];
?>

上記の例では、最終的に「red」と表示される。

つまり、要素を定義し直すことで、配列の要素を上書き出来るのである。

また、要素を削除するにはunset()関数を使えば良い。

<?php
$color[0] = 'black';
$color[1] = 'white';
$color[2] = 'blue';

unset($color[2]);

print_r($color);
?>

list()関数を使えば、配列を分解し、指定した変数に代入し直すことが出来る。

<?php
$color = array('black', 'white', 'blue');
list($val1, $val2, $val3) = $color;

echo $val2;
?>

extract()関数は、キーを変数名とした変数に値を格納し、配列を個別の変数に分解してくれる。

<?php
$age = array('suzuki' => 13, 'yamada'=> 25, 'tanaka' => 46);
extract($age);

echo $yamada;
?>

配列に格納される要素の数を知りたいなら、count()関数を使うと良い。

<?php
$color = array('black', 'white', 'blue');

echo count($color);
?>

implode()は、指定した文字列で要素の値を結合した文字列を返す。以下の例では「,」で結合されて「black,white,blue」となる。

<?php
$color = array('black', 'white', 'blue');
$color_list = implode(",", $color);

echo $color_list;
?>

配列を値でソートする場合は、昇順ならsort()関数、降順ならrsort()関数を使えば良い。ただし、キーと値との関係は維持されない。

<?php
$color = array('black', 'white', 'blue');
sort($color);

print_r($color);
?>

また、連想配列を値でソートする場合は、昇順ならasort()関数、降順ならarsort()関数を使う。キーと値の関係は維持される。

<?php
$name = array('suzuki' => 'taro', 'yamada'=> 'ichiro', 'tanaka' => 'ai');

asort($name);

print_r($name);
?>

連想配列をキーでソートするならksort()関数、krsort()関数を使う。この場合も、キーと値の関係は維持される。

<?php
$name = array('suzuki' => 'taro', 'yamada'=> 'ichiro', 'tanaka' => 'ai');

ksort($name);

print_r($name);
?>

複数の配列をマージ(結合)するなら、array_merge()関数を使えば良い。

<?php
$name1 = array('suzuki', 'yamada', 'tanaka');
$name2 = array('yamamoto', 'takahashi', 'honda');

$new_array = array_merge($name1, $name2);

print_r($new_array);
?>

以上は一例であり、配列を処理できる関数は数多く存在する。

Posted in PHP, PHP講座, ネット・PC | Tagged | Leave a comment