関数名によく使われる英単語(動詞)の意味とニュアンス

PHP に限らず、プログラミングで使われる多くの関数名は「動詞+目的語」という命名規則になっていることが多く、「insertPost()」であれば投稿を挿入するという意味が名前から読み取れます。
では投稿を削除する場合は delete でしょうか? それとも remove でしょうか?

関数は基本的に英語を使うのが鉄則ですが、似たような意味を持つ単語などが多く厳密な意味の違いがわかりにくいことがあります。
そこで、プログラミングで関数名として一般的に使われている頻出語句をピックアップし、主な用途と細かい意味、ニュアンス、使い分けについて調べてみました。

追加・作成

set 主にクラスのプロパティに値を代入する場合に用いる。
add 追加。配列・リストにデータ、オブジェクトを加えるケースが多い。数値の加算もこちらを用いる。
put 配列・リストにデータ、オブジェクトを追加するという点では add に似ているが、こちらは連想配列(HashMap)などにキーを指定して追加するケースが多い。
あるいはストリームへ文字列を出力する。
insert 配列・リストなどの任意の位置に挿入する。データベースへの新規追加を指す場合もある。
append 末尾に追加する。
prepend 先頭に追加する。
register 登録。一覧や名簿への登録。イベントハンドラなどの割り当てや関連付け。
make 何かを加工することによって別の役目を持つものを作り出す。
generate ルール・現象に基づいて何かを生成するときに用いる。電気を流すことで熱を発生させる場合や、機械がプログラムのとおりに何かを作り出す場合など。
create 新しく作る。データベースへの追加処理まで行うケースも有る。天地創造(the Creation)にも使われるように、何もないところに新しく何かを生み出すニュアンスがある。
build クエリ、構文を組み立てる。ソースコードをバイナリ化することを指す場合もある。部品を組み合わせて築き上げる、積み重ねて何かを成すというのが本来の意味。

保存・出力

save オブジェクトやファイルに加えた変更を保存する場合などに使う。本来の意味は「失わないようにする」なので「貯金をする」、「命を助ける」場合にも使われる。
store 貯蔵する、蓄える。ストレージやデータベースへの保存。
export 書き出し。形式を変換したり任意の形式で保存する。
output 出力。スクリーンへの出力・ファイルへの出力を指すことが多いが用途の広い単語。
write ファイル、ストリームへの書き込み。一行単位で追加書込することを示すことが多い。
show 項目の内容を表示する。
render 画像などを編集した結果を表示したり、項目を HTML などに変換した上で返す。

読み込み・検索・解析・取得

get クラスプロパティなどを読み取る。データの取得。
load ファイル全体を読み込む場合など。
import ファイルを対応形式に変換して読み込む。
read ファイル、ストリームから一行取り出す。
parse 分解して解析する。XML を要素ごとに分ける場合など、何らかの区切りをもとに分析する。あるいは何らかのオブジェクトを特定の型として解釈する。
request データを要求する。ネットワークを通じてデータ送信を要求する事に使う場合が多い。
find 情報の中から探し出す。見つかることが前提。一般的にはデータベースからIDなどのユニークな情報を手がかりに一件のみ取得する場合によく使われる。
search 情報の中に存在するか探してみる。無いかもしれない。
retrieve インデックスや URL をたどって情報を取得する。
extract 条件による抽出。対象となる連想配列、オブジェクトから特定のキー、フィールドの値を取り出す。
filter 条件による除外。条件に合わないものを隠す。
seek 連続したデータの中からあるデータが見つかるまで順番に探査する。
fetch (別の場所から)情報を取ってくる。CPU がメモリから命令コードを取ってくることを指す場合もあるが、データベースから情報を取得することを指すことが多い。
query データベースなどの情報源からデータを引き出すためのルールや条件を指定する。または SQL 文の実行。本来の意味は「尋ねる・質問する」

編集・変更・修正

update 情報の更新。データベースの既存レコードを変更する場合など。
edit データの書き換え。データベースのカラム単位で書き換える場合など。レコードの中心となるデータの書き換えのみを限定して指すこともある。
modify 部分的に修正する。edit より用途が広く、データのメインとなる箇所の変更はもちろん、それ以外の小さな変更であっても modify と表せる。
change 全く別の状態に変える。新しいデータで置き換えて古いデータは消滅する。
replace 順序・文字の入れ替え。
join データを前方又は後方に付け足す。
merge 複数のデータを結合する。データはソートにより混ざり合って継ぎ目がわからなくなる。
normalize 正規化。値を定められた範囲内に収めるなど、一定のルールに合うように加減する。
increase 数値・数量を増加させる。継続的に増加し続けるというニュアンスも持つため、増加を一定量進めるという意味合いが近い。
reduce 数値・数量を減らす。データ同士をまとめた結果として数が減るという場合にも使える。increase の反意語には decrease もあるが、そちらは徐々に減少するというニュアンスを持つ。
adjust 値を調整する。何らかの目的に合うまで値を増減させる。
fix 破損したデータを修復する。あるいは動かないように固定する。単純な修理から複雑な修理にまで使用できる。似た単語「repair」はよりフォーマルな言い回しで、より複雑で完全な修理にのみ用いられる。
restore 元の状態に復元する。保管場所から取り除いたものを再度保管し直す(re + store)。
correct 誤りのあるデータを正しく直す。
convert 別の形式に変換する。
enable 機能を有効にする。使用可能にする。
disable 機能を無効にする。使用を停止する。
toggle 状態を逆にする。有効であれば無効化し、無効であれば有効化する。
apply 適用する。当てはめる。

削除

delete データの削除。通常は元に戻すことができない。
remove データをリストや閲覧・アクセス可能な場所から取り除く。アクセス権のない領域への移動。取り除かれたデータが消滅するとは限らず、元に戻せる可能性がある。「帽子を脱ぐ」「靴を脱ぐ」も remove だが帽子や靴は消えない。
erase delete がデジタル色が強いのに対して、こちらは消しゴムでこすって消す場合などのアナログな用途にも使える。消しゴムで消すということは再びその場所に書き込めるようになるため、慣用的にメモリの内容を消す目的で使う場合がある。カセットテープ時代に erase を使っていた名残で CD-RW や DVD-RW の消去にも使う。
clear 中身を空にする。親となるオブジェクトや変数自体は消えない。
flush 溜まっているデータやログ、キャッシュを全て消す。流れている文字列などを一気に押し流して何もない状態にする。
dispose 処分。不必要なオブジェクトを片付けて専有していた領域を開放する。
destroy 完全かつ確実なオブジェクトの破棄。後始末をしてもう二度と使えない状態にする。再利用されたり、読み取られたりしないように破却する。終了処理。
unregister 登録を解除する。登記簿からの除外。イベントハンドラなどの割り当て・関連付けの解除。
unset セット済みのプロパティ、定義済みの変数をセット前、未定義の状態に戻す。あるいは参照を解除する。

検証・検査

is~ オブジェクトが特定の型、状態であるか調べて true/false を返す。isEmpty, isValid のように状態を表す語と組み合わせて使う。
has~ オブジェクトが特定のプロパティを持っているかを調べて true/false を返す。権限、属性の所有を確認する。
contains 配列に特定の値が含まれているかを調べて true/false を返す。
~exists 項目の有無を調べる。
check 広い意味での確認。validate が対象の正しさを検証するのに対し、check は対象が真か偽を調べたり、単に変数に何が入っているかを知るために使われる。
validate 正しいものであるか確かめる。決められたフォーマットや正しくルールに従っているか、要件や性能を満たしているかを調べる、妥当なら valid、過不足があれば invalid。(true/false)
verify 正しく動作しているか確かめる。入力に対し正しい出力が行われているか検証し、正しければ correct、問題があれば incorrect。(true/false)

許可・禁止

allow 許可する。対象に利用権限を与える。
disallow 許可しない。対象に利用権限を与えない。あらかじめ持っている権限を奪うわけではない。
accept 申請・要求を承認する。受け入れる。refuse, reject, deny の反意語として使える。
deny 否定・否認する。真でない。信用出来ない。与えるのを拒む。反意語は accept や admit だが、コンピュータでは allow と対にして使われることが多い。
refuse 申請・要求をはっきりと断る。辞退する。要求に応じないことを選択する。障害やトラブルにより受理できない場合など、申請先の一方的な都合で断る場合にも使える。
reject 申請・要求を退ける。承認(accept)できない不備・不足があるため受け取らない。提案を支持するに値しない。refuse より強く、明確な理由をもとにした機械的な拒否の印象がある。
ban 危険なもの・悪質なものに対する禁止。
grant 信用して許可を与える。正しいと認める。慣用的にはユーザーに権限を持たせる意味で使われる場合がほとんど。
revoke 許可を取り消す。決定を撤回し無効化する。違反による罰則として剥奪するニュアンスはない。
forbid 何らかの行いを禁ずる。人や物を対象にした否定ではなく、動作に対しての禁止。
prohibit 法に反する行いや公共の利益を損なう行為の禁止。プログラミングではあまり見かけない。

その他

try 例外の発生する可能性のある処理を試みる。失敗時には例外が投げられる。致命的なエラーとはならず、エラー発生時用の処理も用意されていることが前提。
attempt 処理を試みる。言葉の意味としては try に近いが、やや硬く、より難易度の高いものに使われることが多い。正規の手続きを取らないかぎり失敗する。攻撃を試みるという意味合いも含むため、ログイン処理に対して使われることが多い。
exec 処理、命令、短期的なスクリプト、アプリケーションの実行。=execute。
run 継続性のある処理やスクリプト、アプリケーションの開始。「お店を経営する」という場合もこちらを使う。一般的にお店は一定期間運営され続ける。
process 手順に従って処理・加工する。一連を操作を順番に実行する。ちなみに次のステップに進むことを proceed という。
bind 結びつける。仮の要素を実際の内容で置き換える。
init 初期化する。デフォルトとなる値をセットする。=initialize。
reset 既に初期化されたものに初期値をセットし直す。
open ソケットなどの通信、ストリームへの接続。
close ソケットなどの通信、ストリームの終了・切断。
start 始動。対義語は stop。止まっていたものが動き始める。
名詞として始点・文頭という意味も持つ。移動、読み取りという「動き」の開始地点。
stop 停止。start あるいは run と対にして使う。動いているものを止める。
abort 中断・遮断。動作しているものを中止する。途中から再開されることはない。異常、障害による強制終了。
pause 一時停止。動作しているものを一時的に止める。すぐに再開する可能性がある。
suspend 保留・延期。時期や条件がそろうまで処理、公開を行わない。動作中の処理を中断し、再開を延期する。
begin 始める。対義語は end。時系列的なイベント、連続性のある作業を始める。名詞としては使えない。
end 終了。begin と対にして使う。始まったイベント、連続性のある作業を終える。成功・失敗については問わない。
始点・文頭を表す名詞 start に対してはこちらで対応させる事が多い。終点・文末。
terminate 終わりにする。とくに期間などが定まっていない継続的なものに対し限界を定める。
complete 必要な要素、要件を満たす。不足を補って完全な状態にする。補完。結果的に終わることになるかもしれない。類似のものとして「立派に仕上げる」という意味の finish もあるが達成条件に人間の主観が混じる。「宿題を仕上げる」などの漠然としたものに対しては finish で良いが、「解答欄(空欄=不完全)を埋めて提出物として完全な状態にする」というのが宿題の要件定義だとすれば complete のほうがプログラムとして適切。

もちろんここに載っている単語で全てカバーできるわけでもありませんし、英語圏のネイティブですら意味を区別せず使っている場合も多くあります。
とはいえどれもよく見かける単語ばかりなので覚えておいて損はないと思います。

参考:
Oxford Learner’s Dictionaries
http://www.oxfordlearnersdictionaries.com/

Longman English Dictionary
http://www.ldoceonline.com/

BBC LEARNING ENGLISH
http://www.bbc.co.uk/worldservice/learningenglish/radio/specials/1837_aae/index.shtml

[PHP]GDでアンチエイリアスのかかった綺麗な楕円を描く

PHP で正円・楕円を描画する場合、通常は GD の imageellipse() で描くことになるのですが、imageantialias() を使ってもアンチエイリアスがかからないため、ジャギーのあるギザギザした線になってしまいます。

アンチエイリアスのかかった直線を描くアルゴリズムの一つに Xiaolin Wu Line Algorithm というものがあり、そちらを応用する形で楕円を描くという手法を用いるとかなり綺麗な円を描くことができます。

wu_ellipsewu_ellipse2

様々な方法による円の描画を比較した記事 Drawing Antialiased Circles and Ellipses (by Stephan Brumme) を参考に imageellipse() と同じ使い方ができるように関数化してみました。

<?php
function wu_ellipse($image, $cx, $cy, $width, $height, $color){
	$rx = $width / 2;
	$ry = $height / 2;
	$rx2 = $rx * $rx;
	$ry2 = $ry * $ry;
	
	$quarter = round($rx2 / sqrt($rx2 + $ry2));
	for ($x = 0; $x <= $quarter; $x++)
	{
		$y = $ry * sqrt(1 - $x*$x / $rx2);
		$error = $y - floor($y);
		$transparency = round($error * 0x7F);
		$alpha  = $color | ($transparency << 24);
		$alpha2 = $color | ((0x7F - $transparency) << 24);
		plot4points($image, $cx, $cy, $x, floor($y),   $alpha);
		plot4points($image, $cx, $cy, $x, floor($y)+1, $alpha2);
	}
	
	$quarter = round($ry2 / sqrt($rx2 + $ry2));
	for ($y = 0; $y <= $quarter; $y++)
	{
		$x = $rx * sqrt(1 - $y*$y / $ry2);
		$error = $x - floor($x);
		$transparency = round($error * 0x7F);
		$alpha  = $color | ($transparency << 24);
		$alpha2 = $color | ((0x7F - $transparency) << 24);
		plot4points($image, $cx, $cy, floor($x),   $y, $alpha);
		plot4points($image, $cx, $cy, floor($x)+1, $y, $alpha2);
	}
}

function plot4points($image, $cx, $cy, $dx, $dy, $color)
{
	imagesetpixel($image, $cx + $dx, $cy + $dy, $color);
	imagesetpixel($image, $cx - $dx, $cy + $dy, $color);
	imagesetpixel($image, $cx + $dx, $cy - $dy, $color);
	imagesetpixel($image, $cx - $dx, $cy - $dy, $color);
}


$image = imagecreatetruecolor(300, 300);
$color = imagecolorallocate($image, 0x33, 0x33, 0x33);
$bg = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
imagefill ($image, 0, 0, $bg);

$width  = 240;
$height = 240;
$cx = 150;
$cy = 150;

wu_ellipse($image, $cx, $cy, $width, $height, $color);

header("Content-type: image/png");
imagepng($image);

【参考】
Fast, Antialiased Circles and Ellipses from Xiaolin Wu’s concepts
Drawing Antialiased Circles and Ellipses

[JS][jQuery]フォームから複数のファイルをアップロード(入力欄の動的追加)

フォームを使ってアップロードする際、ファイル数を制限することなくアップロードをする場合、たいていは jQuery UploadFilePlupload などの高性能なプログラムを利用するケースがほとんどだと思いますが、単純に必要な数だけファイル入力欄が表示されていれば良いという程度であれば次のようなものでも十分実現できます。

<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
<meta charset="utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$("document").ready(function(){
	$(".fileinput").change(fileInputChange);
});

function fileInputChange(){
	if($(".fileinput").last().val() != ""){
		$("#filelist").append('<li><input type="file" name="uploadfile[]" class="fileinput" /></li>')
		.bind('change', fileInputChange);
	}
}
</script>
</head>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
<ul id="filelist">
  <li><input type="file" name="uploadfile[]" class="fileinput" /></li>
</ul>
<p><input type="submit" value="Upload" /></p>
</form>

</body>
</html>

form

初期状態ではファイル入力フィールドは1つだけ表示されていますが、ファイルを指定すると新しいフィールドが動的に追加されます。原理的には最後の項目が空欄でなければ新しい input フィールドを自動追加するというものです。

万一ブラウザで JavaScript が無効化されていたとしても最低1つはアップロードできます。

もちろん <input> に「multiple」を指定するという方法でも一度に複数のファイルを選択できますが、フォルダをまたいだ選択や、順序が重要なケースでは使いにくいこともあるのでこういったシンプルな方法を取るのもひとつの手だと思います。