[PHP]カレンダーを表示する

指定した月のカレンダーを表示してみます。

<?php
$year  = 2012;
$month = 8;

$datetime = new DateTime();
$datetime->setDate($year, $month, 1);
$lastday = (int)$datetime->format('t');
$w = (int)$datetime->format('w');
?>
<table>
<tr>
  <th>日</th>
  <th>月</th>
  <th>火</th>
  <th>水</th>
  <th>木</th>
  <th>金</th>
  <th>土</th>
</tr>
<tr>
<?php
//空白で埋める
for($i=0;$i < $w;$i++){
	echo "<td>-</td>\n";
}

$day = 1;
for($cell=$w;$cell < 35;$cell++){
	if($cell % 7 == 0){
		echo "</tr>\n<tr>\n";
	}

	if($day <= $lastday){
		echo "<td>{$day}</td>\n";
	} else {
		echo "<td>-</td>\n";
	}
	$day++;
}
?>
</tr>
</table>

結果(例):

Calender

[PHP]類似画像検索のアイディア

この記事は、ある画像と、それに似た画像を探す方法についてのアイディアをまとめたものです。
似た色の画像を探す実例については、こちらの記事をお読みください。


類似する画像を探すには、画像を区分けし、各区分ごとに色を比較するのが簡単です。
仮に画像を 3×3 ピクセルの小さなサムネイルにリサイズした場合、比較するべき場所は、
9ブロックにわかれることになります。

3x3

後はそれぞれのピクセルの色を採取し、他の画像の同じブロックにある色と比較します。

検索対象のファイルが大量にある場合は、あらかじめデータベースに色情報をインデックスしておき、
それと比較すればある程度早く検索できると思います。

色を比較すると言っても方法は幾つもあります。
一つはコンピュータのディスプレイで使われている RGB 値(赤・緑・青の光の割合)を比較する方法です。
実際にためしてみると、RGB 値が近くても、人間の知覚では余り似ていないように感じられます。(→RGBによる比較

そこで、HSV による比較を試みました。HSV とは、色を「色相」「彩度」「明度」の度合いで考える方法です。
RGB から HSV への変換は比較的容易にでき、計算速度も高速です。
これによって、色の差をより人間の感覚に近い尺度で捉えることが出来るようになります。(→HSVによる比較

ここで問題となるのが、濃すぎる色や薄すぎる色でもコンピュータは厳密に色相を区別しますが、
人間にとっては区別しにくいという点です。つまり、限りなく薄い赤と、限りなく薄い青を比べた時、
人間の感覚ではほとんど同じに見えますが、色相の数値はかなり差が開いてしまうということです。

これらの問題を解決するためには、RGB を Lab 色空間上の座標に置き換える必要があります。
計算量は格段に増えますが、色を3次元空間上の点として扱うことが出来れば、2つの点の距離を測ることで色の差を調べることができます。(→Labによる比較

より良い類似画像検索をするのであれば、ユーザーがどのようなキーワードで検索し、
どの画像を選択したのかを記録しておくのも良いと思います。
この辺りはナイーブベイズ(単純ベイズ分類器)でユーザーの行動を学習させることで実現できると思います。

高速化を目指すのであれば、HSV の V (明度)に着目し、明るい色のグループ、中間のグループ、暗い色のグループに分けておくことで、検索対象を絞り込むのもひとつの手だと思います。

PHP 開発に適したテキストエディタ比較(Windows)

大規模なプログラムを作るのであれば PhpStorm のような
IDE を使うのが一般的ですが、PHP の場合比較的小規模な内容が多く、
起動に10秒以上かかるような IDE を使い、「新規PHPプロジェクト」やら
「ワークスペース」を選択してようやく開発をはじめるのが面倒な事があります。

そのようなとき、プログラマ向きのテキストエディタがあると便利です。
テキストエディタは世の中に沢山ありますが、日本固有の文字コードをきちんと処理できるテキストエディタはそんなにありません。
今回は私がよく使っているいくつかのテキストエディタを比較してみます。

私がテキストエディタに求める機能は次のようなものです

  • 行番号が表示できる
  • 主要な言語のシンタックスハイライト機能を備えている
  • タブなどでたくさんのファイルを行き来できる
  • フォルダツリーでフォルダ内のファイルに移動できる
  • UTF-8、Shift-JIS に対応し、できれば EUC-JP も扱える
  • 左右の画面分割ができ、比較しながら作業しやすい
  • 黒背景で目にやさしい表示ができる
  • ファンクションリストがあり、関数が定義されている行にジャンプできる
  • よく使う作業フォルダを「お気に入り」などで登録できる
  • ディレクトリ内検索・置換ができ、正規表現が使える
  • 複数行選択して Tab キーを押すとインデントでき、逆もできる

そんなに欲張ったつもりはありませんが、こうして見ると随分要求が多いです。
しかし、それを実現するエディタはあります。


Visual Studio Code

Microsoft が始めたオープンソースのプロジェクトで、かなり人気の高いテキストエディタです。
無料で使うことができ、Windows, Mac, Linux などの OS に対応しています。
プラグインによる拡張が可能で高い拡張性があります。
標準で統合ターミナル(コンソール)が利用でき、Git などとの親和性も高いです。
後述の Atom と同じ Electron ベースで、登場時期も近いためライバルとして比較されることが多いです。Atom に比べるとメモリの消費が少なく、快適性が高く、安定感もあります。テキストエディタに迷ったときはまずこの Visual Studio Code(VS Code) か Atom を試してみるのが良いと思います。


Atom

atom

Github 主導でオープンソースによる開発が進められているマルチプラットフォームエディタです。
標準で各国の文字エンコーディングに対応し、オートインデントなどのプログラミングに必要な基本的な機能を備えています。
プラグインによる拡張が可能なため、矩形選択や文法エラーチェックなどの強力な拡張機能を加える事ができます。
後発なので洗練されている部分が多いですが、その分アップデート頻度が高くプラグインとの相性問題が起きやすく、やや不安定な面もあります。
ポテンシャルは Sublime Editor と互角かそれ以上で、十分な将来性が期待できます。反応速度と安定性が向上すればメインエディタとして十分な魅力があります。


NotePad++

notepad

フリーのテキストエディタで、大量のプラグインが利用できるのが利点です。
Plugin Manager から簡単に追加できるので、自分好みのテキストエディタを作るのに最適です。
よく使うのは、フォルダツリーを表示する「Light Explorer」と関数一覧を表示する「Source Cookifier」です。

バージョンは古いですが、日本語の自動認識に関しても改良されていて、
本家プラグインにも対応しているので実用上の問題はありません。

とはいえどちらのバージョンでも Shift-JIS 絡みのトラブルは時々起こります。
これに関しては海外製だから仕方ないと言う他ありません。


Sublime Text

sublimetext3
(※画像は開発版のものです)

今では後発の VS Code や Atom に押され気味ですが、かつては定番と言ってもいい程人気があったテキストエディタです。
オートインデントや入力補完が非常に優秀で、快適な入力ができるのが特徴です。
プラグインによる拡張が可能で、目的に合わせてカスタマイズが出来ます。
ただし本体は Shift-JIS, EUC-JP 等の文字コードには対応しておらず(Build 3059 現在)、ConvertToUtf8 となどのサードパーティー製プラグインを使って UTF-8 に変換しないと読み込めないという欠点があります。(保存時は自動的にもとの文字コードに再変換されます)
また、日本語 IME への対応も不十分で、IME Support というプラグインも合わせてインストールする必要があります。
プラグイン開発が停滞すると致命的な欠点となり得ますが、それ以上に入力時の快適さというメリットは大きいので、UTF-8 が中心の開発環境であればメインテキストエディタとして十分おすすめできます。


jEdit

jedit

Java で書かれたフリーのテキストエディタで、Windows, Mac, UNIX などでも動きます

こちらもプラグインマネージャによるプラグイン管理ができ、高い拡張性があります。

個人的にはタブ表示を実現する「Buffer Tabs」、関数等の構造を表示する「SideKick」
「PHPParserPlugin」を利用しています。

インターフェースはやや雑多な印象がありますが、レイアウト変更は可能です。
文字コードの問題に関しては、デフォルトで EUC-JP に対応しています。
Javaっぽさが苦手でなければ Notepad++ 同様なかなか優秀なエディタだと思います。


TeraPad

terapad

やや番外編的な気もしますが、こちらのテキストエディタも紹介しておきます。
上で紹介した2つに比べると、多機能が売りというより軽快さが売りのソフトウェアです。
また、国産なので日本語の自動認識に関してはかなりの安定感があります。

開発用と言うよりも Windows 標準のメモ帳代わりで使っています。
すぐ起動するので txt ファイルや ini ファイルなどを確認するにはちょうどいいと思います。

矩形選択ができる点もなかなか便利です。
CSV をタブ区切りに置換してから一気に矩形コピーする時活躍します。