planet-green.com

[開発/備忘録][PHP] 複数の画像を結合した1枚のサムネイル画像を自動作成する



複数の画像を入力すると結合された1枚のサムネイル画像を作成するPHP用のライブラリです。
SNSなどでよく見かけるタイプの結合サムネイルです。
サイズは自動計算してくれます。某SNS用に作りました。
create combine thumbnail from multiple images.

System Requirements:
PHP v5.3+
ImageMagick

【実行例】

4枚の元画像を入力 / source image files



↓↓↓↓↓↓↓↓
連結して1枚のサムネイル画像を出力 / output a thumbnail  image
combine thumbnail library for php

元画像は1〜4枚に対応。

・2枚の場合は上下に並びます。 / in case of two src images
combine thumbnail library for php.(two images)

・3枚の場合は横に。 / in case of three src images
combine thumbnail library for php.(three images images)

コードと使用例。試しにGithub Gistにコードを載せてみました。

コメント
planet-green.com

[Photo] 2月の函館 / 東アジアの人たちについて考えさせられたこと



函館山展望台からの函館の夜景

一昨年の2月に函館に行く機会があった時のことです。
日本人と、中国人・韓国人との国民性の違いについて考えさせられることがありました。

有名な函館山の展望台に登ったのですが、ちょうど春節のシーズンだったので、中国と韓国からの団体さんと鉢合わせしました。
その場にいた人のほとんどが中国人で、韓国人が少し、日本人はもっと少なくて20人に1人もいなかったと思います。

そこまでは別に問題なかったのですが、彼らは展望台の前の方のいい場所を集団で陣取ったまま、後ろの人に場所を譲ろうとしません・・・。
時刻は日の入りの前後、いわゆるマジックアワーと呼ばれる夕景の綺麗な絶好の時間帯だったのですが、30分以上は最前列を独占したまま、後ろの人のことは全く気にしていない様子でした。
もし日本人だったら、何分か経ったら後ろの人に譲るとか、「代わりましょうか?」と尋ねるかと思うのですが、その常識が通じないようで、私と同じように後ろの方に追いやられていた日本人を見つけて、お互い大変ですねと苦笑しあいました。

やがて日が沈んで暗くなると、最前列を独占していた人たちは飽きたのかいなくなり、私はやっと前の方に出ることが出来ました。
そうしてしばらく写真を撮っていたところ、背後から中国語と身振り手振りで話しかけてくるおばさんが。
どうやら、場所を代わってほしいと言ってるらしいです。そう来られると、日本人の私としては遠慮して譲らざるをえないです。

さらにその後 後ろの方で少し休んでいると、若い女性がカメラの三脚を貸して欲しいと頼んできました。
(その人は英語が話せたので簡単な意思疎通が出来ましたが香港の大学生とのこと。)

確かにカメラマン目線で考えるのなら、目の前に一生に一度の絶景があり、しかし三脚がなくてそれを綺麗に撮れないのであれば、貸してくれる人に借りるのは正しい選択だと思います。
しかし、言葉の通じない外国に行って、見ず知らずの人に貸してと頼む度胸は日本人にはなかなか無いのではないかと思います。

以上の体験を通じて考えさせられたのですが、日本人には決定的に欠けているアグレッシブさを彼の国の人たちは持っているのだなと。良くも悪くも。

日本人同士だと互いに相手のことを察して譲りあう文化があり、これは言い方を変えると、相手に察してもらうことを期待する、ある種の甘えの文化でもあるのですが、彼らの文化では、相手にそのような配慮を期待をしないで、まずはアグレッシブに自己主張するのだと強く感じました。

例えば、前述の、展望台の最前列を独占されたケースでは、独占することは彼らの価値観では全く悪いことでは無く、譲って欲しいと言わなかった私の方が悪いのかもしれません。(あくまで、彼らの価値観においてはということです。)

余談になりますが、私が以前にアメリカに住んでいた時も、アメリカは自己主張の強い社会だと痛感させられたのですが、しかしまだ他者への配慮はあったと思います。少なくとも後ろで待っている人に気軽に挨拶して場所を交代するくらいの配慮は。

これが観光地だけの問題であれば笑い話で済むのかもしれませんが、これから先、世界を舞台にビジネスや政治の世界で協力あるいは競争していかないといけない相手の人たちがこのようにアグレッシブで、かたや日本人の方は控えめで遠慮がちな性格だと、かなり不利になると思うのです。

はたして、このような隣人たちを相手に、日本人はうまく付き合っていけるのだろうかと考えさせられた体験でした。

函館ハリストス正教会
函館ハリストス正教会。
ここら辺は函館山ロープウェイの乗り場から近く、開拓時代の古い町並みが残っているので、ぶらりと散策するだけでも楽しいと思います。

函館・八幡坂 / 摩周丸
八幡坂と摩周丸

JR函館駅
JR函館駅

ラッキーピエロ 五稜郭公園前店
函館名物、ラッキーピエロの五稜郭公園前店。右の塔は五稜郭タワー。

ラッキーピエロのチャイチキ(チャイニーズチキンバーガー)セット
その人気メニュー、チャイチキ(チャイニーズチキンバーガー)セット

CANON EOS 5DMark2 / EF16-35mm F4L IS USM / TAMRON SP 24-70mm F/2.8 Di VC USD

コメント
planet-green.com

[Photo] サイクリングロード



豊平川サイクリングロードのコスモス

豊平川のサイクリングロードにて。
昨シーズンは何度かここを通って雁来から澄川のコーチャンフォーまで行きました。
(札幌市民にしかわからない話ですいません)
写真は秋頃のもので、脇に咲いてる花はコスモスです。

札幌市・豊平川のサイクリングロード

カモメが捕まえた魚をついばみ、その近くでカラスがおこぼれに預かろうと狙っている光景。
魚はけっこう大きかったので鮭だったかも。
豊平川のサイクリングロードにて

CANON EOS M2 + EF-M22mm F2 STM

コメント
planet-green.com

[Photo] 秋のモエレ沼公園



黄昏時のガラスのピラミッド

昨年の秋にモエレ沼公園で撮った写真です。
旧ブログでも書いていましたが、近所(田舎基準)にあるのでたまに散歩を兼ねて行ってます。

最近の散歩のお供は、一昨年の暮れくらいにサブカメラとして購入したCANON EOS M2です。
レンズはEF-M22mm F2 STMを付けっぱなしにしています。
ちょうどEOS M3が発売された時期だったので型落ちで安く買うことが出来ました。

最近、歳のせいかあちこちの関節が悲鳴を上げるようになり、重い一眼レフと機材一式を取り回すのがちょっとつらくなってきました。
それに比べて最近のミラーレスカメラは軽くて小さくて画質も綺麗、気軽に持ち歩けてなかなか便利ですね。
風景を撮るだけだったらもうこれだけでいいような気もしてきます。
とはいえ、動体や人物を撮る時、気合いを入れて撮る時はやはりまだまだ一眼レフが不可欠です。

モエレ沼の夕日

モエレ沼公園の黄昏

CANON EOS M2 + EF-M22mm F2 STM

コメント
planet-green.com

謹賀新年と昨年公開したボカロ曲



ニセコ某所からの雲海
新年あけましておめでとうございます。今年も宜しくお願い致します。

昨年は2つのボカロ曲を公開させていただきました。


コメント・感想はニコニコ動画の方に入れていただけるとありがたいですが、ニコニコはエコノミーモードの音質劣化が残念なことになっています😰

【ニコニコ動画】【初音ミク】 神さまではない僕らが【オリジナル】
【ニコニコ動画】【初音ミク】 朝まで君ドライブ 【オリジナル曲】

1曲目はクリプトンさんの某コンテストに応募するために作りましたが見事に撃沈(w
でも久々に曲作りできて楽しかったです。

冒頭の写真はニセコ某所にて。写真仲間に教えていただいたお気に入りの場所です。
でも雲海の発生する天候条件はおそらく年に数回だけなので運が良くないとなかなかこんな写真は撮れないのです。

 CANON EOS 5D2 + TAMRON SP 24-70mm F/2.8 Di VC USD

コメント(1)
planet-green.com

[D.I.Y.] SLINGBOX 350が熱暴走するのを改善する



少し前のことですが、自宅で居間から離れている部屋でもテレビを見たいと思い Sling Media SLINGBOX 350 を購入しました。

画質・操作性などはまずまずで快適に使っていたのですが、夏が近づくにつれ、使用中にフリーズする現象が多発。
おそらく熱暴走ではないかと思い、とりあえず中がどうなっているのか確認するために分解してみました。

Disassemble Sling Media SLINGBOX 350

ちなみに本体を開封するのが異様に難しかったです。真似したい人はプラスチックの爪を1,2本折るのを覚悟するべき。
基盤を見ると、穴の空いたアルミ板が中央に鎮座しており、これはヒートシンクではと思うかもしれませんが、チップには接触していないので、ただの電磁シールドだと思われます。
全てのチップにヒートシンクが付いていないので、とにかく冷却させることにします。

»続きを読む

コメント(2)
planet-green.com

[開発/備忘録] WordPress + Custom Fields に複雑な検索機能を実装する



先日、クライアントさんからの依頼でWordPress+カスタムフィールドで構築されたサイトに絞り込み検索機能を実装する必要が出てきました。
googleで検索すると下記のサイトに説明がありましたが、シンプルな全文検索にしか対応してないようなので、
これを参考にしつつ、もう少し複雑な検索(OR検索とAND検索の組み合わせ)に対応したものを作ってみました。

参考 http://www.deluxeblogtips.com/2012/04/search-all-custom-fields.html


global $wpdb;

//次のSQLに SQL_CACHE を含めているのは、レンタルサーバーによってはMySQLのクエリキャッシュの
//デフォルト設定を無効にしているところがあるので、明示的にクエリキャッシュを有効にするように指定している。
$sql = "SELECT SQL_CACHE DISTINCT posts.ID FROM {$wpdb->posts} posts";


//チェックボックスorセレクトボックスの検索(複数のAND検索)
//例えばcolorというフィールド名だとする。
//$_GET['color']にはカスタムフィールドの設定画面の選択肢の箇所で入力したラベルと値のうち、値の方が配列になって入ってくるとする。 
if( count($_GET['color']) )
{
	$flg_query = true;

	$sql .= " INNER JOIN {$wpdb->postmeta} tbl_color ON tbl_color.post_id=posts.ID AND tbl_color.meta_key = 'color'";

	$tmp_arr = array();
	foreach ($_GET['color'] as $item)
	{
		//シリアライズ化された文字列の中を全文検索する
		$keyword = '%' . $wpdb->esc_like( '"' . trim($item) . '"' ) . '%';
		$tmp_arr[] = "tbl_color.meta_value LIKE '{$keyword}'";
	}
	$sql .= " AND (" . implode(" AND ", $tmp_arr) . ") ";
	
	//↓ちなみにOR検索の場合はこうする
	//$sql .= " AND (" . implode(" OR ", $tmp_arr) . ") ";
}

//複数のチェックボックスorセレクトボックスがある場合は、ここに追記していく。


//注意点として、選択肢の値を 1,2,3・・や a,b,c・・のように設定すると
//他のフィールドと値が重複して正確な検索が出来ないので、全フィールドを通じてユニークな値にする必要がある。

$sql .= " WHERE posts.post_type='(※投稿タイプ名※)' AND posts.post_status='publish'";


//全文検索(AND検索)

//全文検索用キーワード
//$_GET['keyword']にはキーワードが半角スペース区切りで入っているとする。
$free_keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : "";    //「キーワード検索」

if( $free_keyword != "" )
{
	$arr_free_keyword = $free_keyword == "" ? array() : explode(" ", $free_keyword);
	$arr_free_keyword = array_unique($arr_free_keyword);

	if( count($arr_free_keyword) > 8 )
	{
		//検索キーワード数の上限をとりあえず8個までにする。
		//ここが無制限だと、意図的に膨大なキーワード数で検索を実行された時にサーバーの処理が追いつかなくなる危険性が生じるので。
		$arr_free_keyword = array_slice($arr_free_keyword, 0, 8);
	}

	$tbl_cnt = 1;
	foreach ($arr_free_keyword as $_key)
	{
		$tbl = "key" . $tbl_cnt++;
		$keyword = '%' . $wpdb->esc_like( trim($_key) ) . '%';
		
		$sql .= " AND (SELECT 1 FROM {$wpdb->postmeta} {$tbl} WHERE {$tbl}.post_id=posts.ID AND ( ({$tbl}.meta_key NOT LIKE '\_%' AND {$tbl}.meta_value LIKE '{$keyword}') OR posts.post_title LIKE '{$keyword}' OR posts.post_content LIKE '{$keyword}') LIMIT 1)";
		
		//↑DISTINCTにしてもいいのだが、LIMIT 1 の方が速度が早いと思われるので(ただし未検証)
	}
}


$post_ids = $wpdb->get_col($sql);	//検索でヒットした投稿データのIDが入る
$cnt = count($post_ids); //投稿数

if($cnt)
{
	$args = array(
		'post_type' => '(※投稿タイプ名※)',
		'post_status' => 'publish',
		'post__in' => $post_ids,
		
		//ページングする場合は次のパラメーターをお好みで
		'posts_per_page' => ****,
		'offset' => ***,
		
		//ソートする場合は	次のパラメーターをお好みで
		'meta_key' => '******',
		'order' => "ASC",	/* or DESC */
		'orderby' => "meta_value"
	);

	$posts = get_posts($args);
}
else
{
	$posts = array();
}

以下略

尚、テーブル wp_postmeta にインデックスを追加するとセレクトボックス・チェックボックスでの検索速度が向上すると思われます(ただしキーワードによる全文検索にはインデックスは効果ありません)。

例) ALTER TABLE wp_postmeta ADD INDEX idx_custom1 (post_id, meta_key(16), meta_value(16));

と、ここまで書いておいて言うのもなんですが、今回の記事で書いた方法は、小規模〜中規模のサイトまでしか通用しないということにご留意ください。

カスタムフィールドを追加していくとテーブル wp_postmeta の行数が等比級数的に増えていきます。
(私の知ってるクライアントでの例だとカスタムフィールド数が約60、登録ページ数が約30で wp_postmeta が約40万行でした。)

これだけ膨大なデータの中から検索を実行するわけなので、かなりの負荷になります。

最近、なんでもかんでもWordPress+カスタムフィールドで実装すようとするIT屋さんが少なくないようですが、データ数やアクセス数(PV)がある程度まで増えると負荷が増大して破綻するのは火を見るよりも明らかです。

データ数やアクセス数が大規模になりそうなサイトはWordPressに頼らずフルスクラッチで開発するべきです。

 

コメント
planet-green.com

ZOOM UAC-2(オーディオインターフェース)のレビュー



オーディオインターフェースをZOOMのUAC-2に乗り換えました。

今まで使っていたオーディオインターフェースは2008年に購入したM-AUDIOの Fast Track Proでした。これも値段の割りにはいい製品で、海外サイトでのRMAAテストではそこそこいいスコアを出しているのですが、USB1.0にしか対応していないため実質的に48kHzまででしか同時入出力できずに限界を感じていたのと、DAWでの使用中に時々不安定になること、そして1ランク上の音のクオリティを体感してみたい気持ちなどがあってUAC-2購入に踏み切りました。
とは言え、UAC-2はまだ発売されたばかりの商品でネット上にほとんどレビューが無かったので、メーカーの宣伝文句を信じての人柱覚悟ではありましたが。

で、結論から言うと音質には満足です。まだ録音は試してませんので再生のみでの評価です。
届いてから気がつきましたが、ZOOMのサイトには「Mac版ドライバは、2015年6月のリリース予定です。」と書いてあります(2015年5月5日現在)。
Mac使いの私としてはUAC-2 MixEfx(内部ミキシング等のコントロール用ソフト)を6月まで使えないのは辛いところですが、クラスコンプライアントモードにすることでドライバー無しでも問題なく使えています(iTunesとLogic Studio Proで確認)。
ちなみにMac Pro 2010にUSB2.0で接続しています。尚、付属のケーブルはUSB2.0では使えなかったのでご注意を。

最初に音を出した時は全体的に硬めの音という印象で、ハイが強調されているのかボーカルの歯擦音(サ行のノイズ成分)が耳についたのですが十数時間使ってるうちに丸くなっていい感じの音に落ち着きました。
この種のオーディオ機器では、製造時のハンダ熱でダメージを受けた固体コンデンサを通電によって自己修復させるエージングが必要なものがあるという話を聞いたことがありますが、これがそういうことなのでしょうか?  専門外なので自信はありませんが・・。

出音はとてもクリアで、今まで使っていたFast Track Proでは他の音に埋もれて団子になっていた音も分離して聞きとることが出来ました。
ここでFast Track Proと比較しても読んでる人にはわからないと思いますので、無謀ながらもあえてiPhone6のヘッドホン出力と聞き比べた感想を述べさせていただくなら(同じ音源ファイル・ヘッドホンはAKG K240MkII)、例えばクラシックの室内管弦楽の曲だとiPhone6ではテレビかFMラジオの音をスピーカーから流してるような平面的な印象で、UAC-2では自分と同じ部屋に楽団がいてカーテンを一枚挟んで生演奏を聴いているような印象で非常に立体的に感じます。

もっと高級なヘッドホンや高価格のオーディオインターフェースを使えばこのカーテンも取り払われて本当に目の前で演奏しているように聞こえるのかもしれませんが私のリスニング環境ではこれがベストかと思います。

今までハイエンドのオーディオインターフェースや高級オーディオを所有したことが無いので、これがフラットな音なのか、それとも、いわゆる味付けされた音なのかということは私には判断がつきませんが、良いか悪いかで言うなら確実に良い音です。

本製品はUSB3.0で真価が発揮されるようなので、気が向いたらMac ProにUSB3.0カードを増設して使うことになるかもしれません。

それにしても、ZOOMと言えば私の世代でバンドをやっていた人にとっては、YAMAHAやROLANDより1ランク下という認識で、今だと海外の某B社と同じような立ち位置のメーカーだったはずなのですが、気がつくと凄い製品を作るようになってたのですね。

#追記 2017/02/03
USB2.0までしか対応していないPCに接続してマイクを使うと、おそらく電力不足からか動作が不安定になることがありました。
私の環境では別売りのACアダプターを接続したら解決し、安定動作しています。


#追記 2017/08/06
MacOS XをSierraにアップデートしてから認識されない現象が発生するようになりました。
Mac起動時に最初からUAC-2を接続していると認識されるのですが、途中で抜き差しすると認識されません。
普通のユーザーは最初から最後までPCに接続しっぱなしだと思うので問題ないのかもしれませんが、
私は複数のMacで接続を切り替える使い方をしてるのでちょっと困りものです。
ドライバーのバージョンアップで早期に解決してくれるといいのですが・・・

上記の現象は常駐ソフトとの相性が原因でした。お騒がせしました。

コメント