EZ zenback バージョン1.5.2 リリース

「EZ zenback バージョン1.5.2」をリリースした。

Ver.1.5.2.2 2013/11/08

最新の「EZ zenback」をダウンロードする

このバージョンから新しい書式のzenbackタグをサポートした。

「EZ zenback」は任意のコード(JavaScript等)をWordPressが生成するHTMLソースに追加して書き出す機能があるが、ユーザーがネットで公開されているコードを盲目的に入力し、そのコードが悪意のあるものであれば最悪の結果を招く恐れがあるため、簡単なセキュリティチェックを行っている。

そのチェックが機能が新しいzenbackタグを拒絶してしまっていた。

Posted in PHP, WordPress, 自作アプリ | Tagged , , | Leave a comment

Disqus Comment System for EZ zenback Ver. 2.74 modified 1.0 リリース

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

Ver.2.74 for EZ zenback modified 1.0 2013/01/05

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

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

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

Disqus Comment System for EZ zenback Ver. 2.73 modified 1.1 リリース

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

Ver.2.73 for EZ zenback modified 1.1 2012/07/13

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

実は、前日にリリースした「Disqus Comment System for EZ zenback Ver. 2.73 modified 1.0」の公開作業でミスをしてしまい、「Disqus Comment System 2.73」そのものをアップロードしていまっていたようだ。

ご迷惑をお掛けしました。

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

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

Androidは使えるか?

最近、AndroidタブレットPCを手に入れた。

FRONTIER FT701W」と言う7インチタブレットPCである。

OSは、Android 2.3.4を搭載している。

FT701W ホーム画面

これが私にとって、初めてのタブレットPCであり、初めてのAndroid搭載マシンであるため、この記事には誤りを含んでいるかもしれないことを先に述べておく。

Androidとよく、比較されるAppleの「iOS」は、「Darwin」カーネルをベースとしたUnix系OSであり、携帯電話、タブレットをターゲットにしたOSであるのに対して、「Android」も、「Linux」カーネルをベースとしたUnix系OSであり、同様に携帯電話、タブレットをターゲットにしている。

その点では、両者は似ているとは言える。

しかし、「iOS」は、Apple製品にのみ搭載されるOSでり、現時点では、他社の製品に対して供給されていない。

対して、「Android」は、Apache v2ライセンスで配布されるオープンソースのOSであり、誰でも利用することが許されている。

また、Apache v2ライセンスは、GPLと異なり、コピーレフトなライセンスではない。

従って、Androidを改変した上で、また別のライセンス、つまりはフリーでないライセンスで配布しても構わない。

オープンソースのライセンスの中でも制限が多いGPLと異なり、商用利用しやすいライセンスと言える。

ただし、カーネルとライブラリは、GPLライセンスであるため、カーネルを改変し、再配布した場合は、GPLライセンスに従ってカーネルのソースコードの要求に応じる必要がある。

同様にブラウザで使われるレンダリングエンジン「WebKit」のラインセンスはLGPLとなっている。

「iOS」ではアプリケーションは、原則として「iTunes Store」で配布される。

専用のクライアント「iTunes」を使って、PCからダウンロードしても良いし、iPhone/iPad上の「App Store」などを使っても良い。

iTunes

Andoridでも「iTunes」に相当する「Google Play(旧Android Market)」というサイトが存在する。

Google Play

しかし、「iTunes」のようなクライアントアプリが提供されているわけではなく、ウェブサイトへ直接アクセスしてアプリのダウンロードを行うか、Android端末上の「Play ストア」を使って直接ダウンロードすることになる。

play ストア

「iTunes」が、そうであるように「Google Play」のサイトにアクセスし、アプリをダウンロードすれば、Android端末に自動的にインストールされるようになっている。

「Google Paly」の使い勝手は悪くない。

しかも、注文後 15 分以内であれば、端末側で注文をキャンセルできる。

しかし、「iTunes」ように細かな操作や同期をAndroid端末に対して行うことは出来ない。

些細な事にみえるが、これは、両者の大きな思想の違いと言える。

「iOSが」PCと接続して使うことを想定しているの対して、「Android」は、(接続できないという意味ではなく、PCがあれば更に便利であるが)これを想定しておらず、不自由なく単体での利用が可能である。

「iOS」は、かつての「Palm OS」、一方、「Android」は、かつての「ザウルス」と言える。

個人的には、「Palm OS」が好きであり、「iOS」に軍配を上げたいところであるが、アプリの管理に関して「Android」も洗練されたものになっている。

「iOS」において「iTunes Store」は絶対的なものであり、野良アプリは脱獄を目的としてものが多いが、「Android」にとっての「Google Play」は、ただの公式アプリマーケットでしかなく、非公式のマーケットが乱立している。

そもそも、全てのAndroid端末に「Play ストア」がインストールされているとは限らないと言う事実がある。

「Play ストア」は、後でインストールすれば良いといった種類のものではないので、無ければ、その先ずっと「Play ストア」でアプリをダウンロードできない「Google Play」未対応端末ということになる。

所謂、「中華タブレット」と呼ばれる並行輸入品は、その傾向が強い。

更に加えて、「Google Play」のウェブサイトにアクセスしてダウンロードすることも出来ない。

これは、タブレット上の「Play ストア」で登録しているGoogleアカウントでなければ、ウェブサイトからもアプリをダウンロード出来ない仕組みになっているからだ。

実際、私の購入した「FT701W」には「Play ストア」はインストールされておらず、代わりに「Tapnow Market」という非公式マーケットに対応したアプリがプリインストールされていた。

Tapnow Market

現時点では「Tapnow Market」には「Google Play」のように豊富にアプリが登録されているわけではないので、「Google Play」の代わりにもならない。

「Play ストア」がインストールされていないモデルが存在するのは何故かと言う疑問があるが、これは「Play ストア」のライセンスのせいではないかと考えている。

「Play ストア」、「GoogleMap」、「Gmail」などのアプリは、「Android」とはライセンスが異なり、フリーウェアではないため、カスタマイズした「Android」に無許可でバンドルすることが出来ない。

ただし、「CyanogenMod」との係争の結果を見ると「Android」Google提供の「Android」から、これらを引っこ抜いてインストールするのは構わないようである。

「Android」には、多くのアプリケーションの存在し、豊富なアプリケーションによって、その人気を支えている。

そして、「Android」用のアプリケーションは、誰でも作成する事ができ、作成したアプリを「Google Play」で公開することも出来る。

しかし、「Google Play」へのアプリの登録は、「iTunes Store」への登録に比べて容易であり、悪意のあるソフトウェアが公開され易い傾向があると言われている。

悪意のあるソフトウェアに対するリスクは、非公式マーケットを利用した場合には、更に高まる。

私の「FT701W」の場合、「Tapnow Market」以外の非公式マーケットを利用する以外に有用なアプリを揃える手段がなかったが、念のためフリーでありながら商用アプリより検出率が高いと言われる「avast! Mobile Security」をインストールしたところ、2度、マルウェアを検出している。

やはり、アプリの入手元は、よく吟味したほうが良い。

無論、「Google Play」からダウンロードする場合も注意が必要である。

残念ながら「Android」の場合、「iOS」ほどは、安心してアプリをダウンロードできる環境は整っていないと言える。

「Android」では、管理者権限、つまりはrootとしてOSを使用できない仕様になっているが、変更を加えてroot権限を得るための「root化」と呼ばれる手法が流行っている。

「iOS」で言うところの「脱獄」に近いニュアンスである。

「root化」すると、ファイルシステム全体、つまりは全てのファイルにアクセスできるようになり、システムファイルの書き換えが可能になる。

Google自身は、この「root化」をユーザーの権利として認めている。

しかし、メーカー側はこれを認めないことが通常なので、root化した時点で保証を含めてメーカーサポートは受けられなくなる。

「FT701W」は、あまりにマーケットが貧弱であるんので、結局、root化した。

多くのユーザーがroot化したくなる気持ちがよく分かった。

root化するとシステム領域にもアクセスでき、ファイルの書き換えが可能になるので「Play ストア」を無理やりインストールしている。

アプリあってのタブレットであるから、やはり、「Play ストア」はないと困る。

「iOS」の場合は、製品がApple、1社からリリースされているので、製品に一貫性があるが、オープンソース故に、Androidの場合は、各社でカスタマイズされており、見た目も異なり、予めインストールされているアプリも異なっている。

単純に、同じAndroid OSのタブレットだから、初期状態で、全てが同じというわけではない。

以上のような理由で、「iOS」の方がユーザーに優しいと言えるかもしれない。

しかし、これは「Android」を否定しているわけでなく、むしろ「Android」に好意的な印象を持っている。

一貫性がない点についても「Android」端末は複数のメーカーから発売されており、多様であるとも言える。

「iOS」と「Android」、どちらが洗練されているか、どちらが使いやすいかと言った議論もあるが、個人的には、どちらも高いレベルで洗練されており、どちらも使いやすいと考えている。

高いレベルでの比較であるから、ある意味、このような議論は無意味である。

また、Androidタブレットを手にした時に「これならば自分でも作れるのではないか」と感じた。

実際、ハードは、中国を探せば、どこかのメーカーが作っているであろうし、それにAndroidを載せれば出来上がる。

こういったワクワク感は、残念ながら閉鎖的な「iOS」にはない。

PCがこれだけ普及した一因に、IBMがIBM PCの仕様をオープンにしたことが上げられるなら、「Android」の将来は、どのようなものになるだろうか?

Posted in Android | Tagged | Leave a comment

初心者による初心者のためのPHP講座 第9回 関数の定義

この講座でも、echo()を始めとして、date()、define()、array()、explode()、extract()などの様々な関数が登場している。(厳密には関数でないものも含まれるが・・・。)

これらは、PHPが標準で備えている関数であり、構文と並んでPHPでのプログラミングの基本となる要素であるが、「ユーザー定義関数」として自身で関数を定義することも出来る。

関数については「初心者による初心者のためのPHP講座 第2回 PHPの基本構造」で触れているので、もう一度おさらいして欲しい。

ユーザー定義関数は、比較的小規模な処理を1つにまとめたもので、PHPのプログラムは、複数の「ユーザー定義関数」を組み合わせて実行させることで成立しているとも言える。

他の言語では、PHPの関数のような、ひとまとまりの処理を「サブルーチン」と呼ぶ場合もある。

ユーザー定義関数は、下記のようにfunction文を用いて定義する。

function 関数名() {
	処理1;
	処理2;
	処理3;
	.
	.
	.
}

関数は、1つまたは複数の引数を取ることもあるが、その場合は

function 関数名(引数1, 引数2, 引数3...) {
	処理1;
	処理2;
	処理3;
	.
	.
	.
}

となる。

関数名には、英数字、アンダースコアを使用することが出来るが、最初の一文字は、アルファベットかアンダースコアでなければならない。

戻り値を参照渡しする場合に、「&」で始まる関数を定義することがあるが、厳密には「&」は変数名の一部ではなく、「&関数名」となっている。

ユーザー定義関数を実行する場合は、標準の関数を実行する場合と同様に

関数名();

または

関数名(引数1, 引数2, 引数3...);

とすれば良い。

また、ユーザー定義関数の戻り値を別の関数の引数として用いることも出来る。

<?php
echo my_string();
round(my_value(), 2);
// my_string()とmy_value()はユーザー定義関数
?>

このあたりは、PHPの標準関数と同じである。

下記の例では、get_date_yesterday()という関数を定義しているが、これは昨日が何曜日だったかを求め、それを戻り値として返す関数である。

<?php
echo get_date_yesterday();

function get_date_yesterday() {
	$yesterday = time() + (60 * 60 * 9) - (60 * 60 * 24 * 1);
	// $yesterday = time() + (60秒 * 60分 * 9時間) - (60秒 * 60分 * 24時間 * 1日);
	$date_yesterday = date('l', $yesterday);
	return $date_yesterday;
}
?>

time()関数は、現在の時刻が、1970年1月1日0時0分から何秒経過したか求める関数であるが、 GMT基準であるため、日本時間に修正した上で、1日分の秒数を引いている。

こうして補正した秒数をdate()関数で整形し、曜日を求めている。

最後にreturn()を使って、戻り値として変数$date_yesterdayの値を返している。

return()は、処理を中断し、その引数を戻り値として返すが、echo()などと同様に厳密には関数ではないため、通常は、()は使わずに

return 引数(戻り値となる値、変数);

のように記述する。

戻り値として値を返さず、echo()関数で表示することが前提なら

<?php
get_date_yesterday();

function get_date_yesterday() {
	$yesterday = time() + (60 * 60 * 9) - (60 * 60 * 24 * 1);
	// $yesterday = time() + (60秒 * 60分 * 9時間) - (60秒 * 60分 * 24時間 * 1日);
	$date_yesterday = date('l', $yesterday);
	echo $date_yesterday;
}
?>

としても良い。これは戻り値を返さない関数になる。

関数は引数を取ることで、更に柔軟になる。

以下の例では、GMTとの時差に部分と、何日前の部分を引数として指定出来るようになっている。

<?php
echo get_date_before(9, 2);

function get_date_before($diff, $ago) {
	$before = time() + (60 * 60 * $diff) - (60 * 60 * 24 * $ago);
	// $before = time() + (60秒 * 60分 * 9時間) - (60秒 * 60分 * 24時間 * 1日);
	$date_before = date('l', $before);
	return $date_before;
}
?>

上記のサンプルでは、日本時間での一昨日前の曜日が表示されるが、

echo get_date_before(-8, 1);

とすれば、(夏時間の時期を除く)アメリカ太平洋標準時での昨日の曜日となる。

また、下記のように関数の定義内で別の関数を定義し、それを実行することも出来る。

<?php
echo check_holiday(9, 1);

function check_holiday($diff, $ago){

	function get_date_before($diff, $ago) {
		$before = time() + (60 * 60 * $diff) - (60 * 60 * 24 * $ago);
		// $before = time() + (60秒 * 60分 * 9時間) - (60秒 * 60分 * 24時間 * 1日);
		$date_before = date('l', $before);
		return $date_before;
	}

	$date = get_date_before($diff, $ago);

	if ($date == 'Saturday' || $date == 'Sunday') {
		return "休日";
	} else {
		return "平日";
	}

}
?>

この関数は、曜日が土曜日か日曜日なら「休日」と返す。

このように別の関数の定義をネストする場合は、関数を呼び出す前に、関数を定義しておくことがポイントになる。

また、上記のサンプルは、下記のように記述することも出来る。

<?php
echo check_holiday(9, 1);

function check_holiday($diff, $ago){
	$date = get_date_before($diff, $ago);

	if ($date == 'Saturday' || $date == 'Sunday') {
		return "休日";
	} else {
		return "平日";
	}

}

function get_date_before($diff, $ago) {
	$before = time() + (60 * 60 * $diff) - (60 * 60 * 24 * $ago);
	// $before = time() + (60秒 * 60分 * 9時間) - (60秒 * 60分 * 24時間 * 1日);
	$date_before = date('l', $before);
	return $date_before;
}
?>

このように記述することでget_date_before()関数を別の処理でも再利用しやすくなる利点もある。

更に下記のように記述すれば、check_holiday()関数は、単に与えられた曜日が平日か休日かを判断する関数となり、汎用性が高くなる。

<?php
echo check_holiday(get_date_before(9, 1))."<br />";
echo check_holiday(get_date_before(-8, 2))."<br />";
echo get_date_before(-8, 2);

function check_holiday($date){

	if ($date == 'Saturday' || $date == 'Sunday') {
		return "休日";
	} else {
		return "平日";
	}

}

function get_date_before($diff, $ago) {
	$before = time() + (60 * 60 * $diff) - (60 * 60 * 24 * $ago);
	// $before = time() + (60秒 * 60分 * 9時間) - (60秒 * 60分 * 24時間 * 1日);
	$date_before = date('l', $before);
	return $date_before;
}
?>

関数を定義する際は、出来る限り再利用しやすい形にした方が、プログラミングの効率も良い。

また、似たような処理を複数回記述する必要がある場合は、その部分をユーザー定義関数として独立させた方が良い。

以上のような処理は、ユーザー定義関数を使わなくとも簡単に記述できる。

<?php
$diff = 9;
$ago = 1;

$before = time() + (60 * 60 * $diff) - (60 * 60 * 24 * $ago);
// $before = time() + (60秒 * 60分 * 9時間) - (60秒 * 60分 * 24時間 * 1日);
$date_before = date('l', $before);

if ($date_before == 'Saturday' || $date_before == 'Sunday') {
	echo "休日";
} else {
	echo "平日";
}
?>

しかし、処理の再利用を前提とした場合、ユーザー定義関数が重要であることの理解は難しくないだろう。

関数を自身で定義し、複雑な処理を記述出来るようになると、必ず「変数のスコープ」を意識する必要が生じる。

「変数のスコープ」については、別の機会にお話ししたいと考えている。

Posted in PHP, PHP講座, ネット・PC | Tagged | 2 Comments

Plugin Directoryの統計情報を記事で表示出来るようにするプラグイン「Plugin Directory Stats」

「WordPress.ORG」の「Plugin Directory」から統計情報を取得し、投稿、固定ページ、ウェイジェットの中で表示できるようにするプラグイン「Plugin Directory Stats」をリリースした。

Ver.0.1 2012/03/05

最新の「Plugin Directory Stats」をダウンロード

「Plugin Directory Stats」は、「Plugin Directory」からダウンロード数などの統計情報を取得し、ショートコードを使ってそれらを投稿、固定ページ、ウェイジェットの中で表示させることができる。

統計情報の取得にAPIと独自の仕組みを利用しているが、どちらもプラグインディレクトリのページをリクエストし、統計情報を取得する仕組みになっている。

つまりは、訪問者には見えない部分で、自サイトのページ以外にプラグインディレクトリのページを閲覧することになるため、サイトのパフォーマンスに少なからず影響を与える。

度が過ぎればWordPress.COMに対しても影響は皆無ではない。

そのため、原則として、プラグインの作者が、自身のプラグインの統計情報を自分のサイトで表示させる用途に向くプラグインである。

ただし、大量のプラグインの統計情報を表示させるような用途には向かない。

プラグインの利用者のサイト、WordPress.COMへの負荷を軽減するため、取得した情報は一定時間(デフォルトで3時間)キャッシュし、頻繁にページのリクエストを発生させない仕様になっている。

そのため表示される統計情報はリアルタイムの情報ではない。

キャッシュする時間を短くすることも出来るが、そもそも、リアルタイム性が重要な情報ではないので、可能な限り長めに設定して欲しい。

なお、統計情報は、プラグイン毎、作者者毎に独立してキャッシュされる仕組みであり、全情報が同時に更新されるとは限らない。

キャッシュの有効時間を過ぎた場合以外にもキャッシュが更新のタイミングがあり、UTCの午前0時(日本時間 午前9時)を過ぎ、日付が変わった後に、このプラグインのショートコードが記述されたページに訪問があった場合にもキャッシュが更新される。

以下は、このプラグインを使って統計情報の表示させた場合の例である。

・特定のプラグインの統計情報

Version: 0.1.4
Last Updated: 2012-05-15
Relase: 2012-03-05
Requires: 2.8
Tested up to: 3.3.2
Downloads: 2,944
Average Rating: 4.5/5 (4 ratings)

・作者毎のプラグインリスト

  • none
    Downloads: none

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

トラックバックスパム対策に適したWordPressプラグイン

先日、突然、トラックバックスパムが急増して、削除しても直ぐにトラックバックスパムを受信してしまうような状況に陥ってしまった。

コメントは「DISQUS」を使用しているので、「DISQUS」側でコメントスパム対策を行なっているが、トラックバック(ピンバック)に関しては対策を行なっていなかった事が原因だが、やはり事前に対策を講じておくべきだったと反省している。

コメントスパムやトラックバックスパム対策と言えば「Akismet」が定番であるが、対象がトラックバックに絞られるため、もっとシンプルなトラックバックスパムに特化したプラグインの方が好ましい。

また、私のケースでは、記事へのリンクが含まれないサイトからのトラックバックを禁止する機能があれば十分だろうと思われたので、そのようなプラグインを探して見ると「Simple Trackback Validation」というプラグインが見つかった。

ところが、残念なことに「Simple Trackback Validation」は、長らくアップデートされていないので、出来れば使用は避けたい。

更に調べると、派生として「Simple Trackback Validation with Topsy Blocker」というプラグインが存在することが分かったので、こちらを使うことにした。

「Simple Trackback Validation with Topsy Blocker」は、「Simple Trackback Validation」の基本機能に加えて、「topsy.com blocker」という外部サービスを利用できるようになっている。

実際のところ、基本機能に違いがあるかは分からないが、単にリリースが新しいという理由で「Simple Trackback Validation with Topsy Blocker」を選んだ。

「Simple Trackback Validation with Topsy Blocker」では、トラックバックスパムの受信を拒否する以外に、承認待ちとして保存したり、スパムとしてマークして保存することも出来る。

スパム判定に「topsy.com blocker」という外部サービスを利用している点が、このプラグインの特徴であるが、これに加えて、次のような条件でもスパム判定を行う。

まず、IPアドレスをチェックする機能があり、トラックバックの送信元IPアドレスと、トラックバック元のサイトのIPアドレスを比較し、一致しなければスパムと判定される。

つまり、ツールなどを使って、実際のサイト以外からトラックバックが送信されたケースがこれに該当する。

また、トラックバック元のサイトに投稿へのリンクが含まれなければ、スパムと判定する。

これらの判定条件は、設定画面でON/OFFでき、かつ細かな設定が出来るようになっている。

Simple Trackback Validation with Topsy Blockerの設定

「Simple Trackback Validation with Topsy Blocker」は、シンプルなプラグインではあるが、トラックバックスパムに対抗するための機能は十分に備えており、実際、これでトラックバックスパムを完全に拒否することが出来た。

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

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」をリリースした。

Ver.0.4 2012/02/16

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

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

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

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

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

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

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

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

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

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | 5 Comments

初心者による初心者のための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