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で接続を切り替える使い方をしてるのでちょっと困りものです。
ドライバーのバージョンアップで早期に解決してくれるといいのですが・・・

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

コメント
planet-green.com

MacPro2010にGeForce GTX 750 Tiを取り付ける(追記あり)



MacPro 2010のグラフィックボードを純正のATI Radeon HD 5770からGeForce GTX 750 Tiに交換しました。

OS X YosemiteではGTX680や650TiなどKeplerアーキテクチャのNVIDIA製チップが動作することが知られているのですがKepler後継のMaxwellアーキテクチャについては日本語の情報がほとんどありません。
海外フォーラムを読むと750Tiへの換装に成功している人がいるようなので参考にして試してみました。

 ※ここに書いてあることを試すのは各自の自己責任でお願いします。(お約束)

注意点としては、グラフィックボードを交換する前にNVIDIAのドライバー(後述)をインストールしておかないといけません。
そうしないと、OS Xだけではグラフィックボードを認識できないので画面が真っ黒のままになります。
事前にリモートデスクトップを有効にしておけば、先にカードを交換して後からリモートでドライバーをインストール出来るかもしれませんが未検証です。

今回購入したのはELSAの GD750-2GERT。
750Tiにしたのは発熱と消費電力が少ないからです。性能を求めるならGTX 980や970も同じMaxwellコアなので動作する可能性が高いです。
(確信は無いので試すのは自己責任でお願いします。)

ELSA NVIDIA GeForce GD750Ti 2GB グラフィックボード GD750-2GERT

写真は交換前の純正ATI Radeon HD 5770

MacPRO2010の純正 ATI Radeon HD 5770

»続きを読む

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

[Photo] 札幌国際芸術祭2014/芸術の森美術館にて



先日は札幌国際芸術祭2014/芸術の森美術館会場に行ってきました。
中谷芙二子 霧の彫刻 FOGSCAPE#47412

中谷芙二子 霧の彫刻 FOGSCAPE#47412

この日は夜間公開日。
中谷芙二子氏の霧の彫刻「FOGSCAPE#47412」がライトアップされ、とても幻想的で面白かったです。

中谷芙二子 霧の彫刻 FOGSCAPE#47412

中谷芙二子 霧の彫刻 FOGSCAPE#47412

中谷芙二子 霧の彫刻 FOGSCAPE#47412

中谷芙二子 霧の彫刻 FOGSCAPE#47412

カールステン・ニコライ氏 unidisplay
壁面に電子的な映像が投影されているのですが、部屋の左右が向かい合わせの鏡になっていて、映像がどこまでも無限に続いていきます。

札幌国際芸術祭2014

札幌国際芸術祭2014

札幌国際芸術祭2014

宮永愛子氏 そらみみみそら(mine・札幌)

宮永愛子 そらみみみそら

札幌国際芸術祭は現代美術が中心のようで、難解な作品が多いのでは思っていたのですが、ダイナミックで見応えのある作品があり、私のようなニワカ芸術ファンでもとても楽しめました。

(尚、ここに掲載した写真は撮影が許可されている作品です。)

コメント
planet-green.com

[開発/備忘録] さくらのレンタルサーバーにPHPカレンダー関数をインストール



前回の記事で書いたように、仕事でさくらのレンタルサーバーの共用プラン(ビジネスプロ)を使っているのですが、PHPのカレンダー関数 が入ってないので、手動でインストールしてみました。

ちなみにカレンダー関数というのは、なかなか便利なもので、例えば 「2月1日から5月15日までを日次ループ処理したい」というような場合には、開始日と終了日をユリウス積算日に変換して単純なfor文のループに落とし込むことが出来ますし、ループの中では必要に応じてユリウス積算日からY-m-dやUnixタイムスタンプに変換して処理を行えます。しかも紀元前4713年以降であるなら、期間が数日でも数百年でも処理できるという優れものです。

インストール方法ですが、実は私、FreeBSDを触るのは今回が初めてでして、正直、ここから先は正しいかどうかを保証できませんのでご了承ください(笑

portコマンドが使えれば一発でインストールできるようですが、さくらの共用プランなのでroot権限がありません。
そこでまずは下記ページからダウンロードします。(PHP5.3の場合)

http://portsmon.freebsd.org/portoverview.py?category=misc&portname#misc/php53-calendar
ちなみにPHP5.x系最新版用はこちら。
http://portsmon.freebsd.org/portoverview.py?category=misc&portname=php5-calendar

一覧表の build environment のところに 84amd64-default 、84i386-default、91amd64-defaultと並んでいますが、どれを選択するべきなのか・・
私の使っているサーバーの情報をみると FreeBSD 9.1-RELEASE-p15 (中略) amd64と書いてあるので、91amd64-default をダウンロードすることにしました。

%
uname -a
FreeBSD *****.sakura.ne.jp 9.1-RELEASE-p15 FreeBSD 9.1-RELEASE-p15 #1: Wed Jun 11 02:25:45 JST 2014     admin@*****.sakura.ne.jp:/usr/obj/home/pkg/src/sys/SAKURA17  amd64

では、インストール。

% cd ~/src
% wget http://pkg.freebsd.org/freebsd:9:x86:64/latest/All/php53-calendar-5.3.28_3.txz
% tar Jxvf php53-calendar-5.3.28_3.txz
(※ ディレクトリ階層を保ったまま解凍される)
%  cp usr/local/lib/php/20090626/calendar.so ~/modules/

尚、modulesディレクトリについては前回の記事を参照してください。

そして、さくらのレンタルサーバーのコントロールパネルから、php.iniに下記を追記します。

;Calendar
extension_dir = /home/*****/modules
extension=calendar.so

ここに書いてあることはイレギュラーな方法だと思いますので、各自の自己責任で行ってください。
どのような結果になろうと当サイトは一切の責任を負いかねます。

コメント
planet-green.com

[開発/備忘録] さくらのレンタルサーバーにAPCをインストール



仕事でさくらのレンタルサーバーをビジネスプロという共用プランで借りているのですが、そこのPHPにAPCをインストールした時の備忘録。
基本的には下記のサイトを参考にさせていただきました。

 [PHP] さくらインターネット 共用鯖にAPCインストール
さくらのレンタルサーバにPHPの拡張モジュールAPCをインストールする

互換性の関係でPHPは5.3で動かしたかったのですが、APCの最新stable版である3.1.9はPHP5.3で動作しない模様。
PHP5.3で動作する最新stableは3.1.6になるのですが、これはさすがに古いのでbeta最新版の3.1.13を使うことにしました。

ついでに検証した動作結果。

× PHP5.3 + APC-3.1.9
○ PHP5.3 + APC-3.1.13
○ PHP5.4 + APC-3.1.13
× PHP5.3 + APC-3.1.8
○ PHP5.3 + APC-3.1.6

上記では○と×でしか区分けしてませんが、実際には、APCが認識されないだけだったり、PHP実行時にエラーメッセージが出たりと様々。
尚、サーバー側の環境は FreeBSD *****.sakura.ne.jp 9.1-RELEASE-p15 FreeBSD 9.1-RELEASE-p15 #1: Wed Jun 11 02:25:45 JST 2014     admin@*****.sakura.ne.jp:/usr/obj/home/pkg/src/sys/SAKURA17  amd64
( uname -a コマンドで確認したもの。)

インストール作業では、まずmodulesというディレクトリを作成し、PHP用モジュールのデフォルトの場所をそこに置き換えるようにしています。
phpinfo()で元のextension_dirの場所を確認して、中のファイルを新しいmodulesフォルダにリンク。
私の借りてるサーバーだと下記のようになりました。

% mkdir ~/modules/
% ln -s /usr/local/php/5.3/lib/php/extensions/no-debug-non-zts-20090626/* ~/modules/

続いてAPCのインストール。
ソースのURLは http://pecl.php.net/package/APC から取得する。

% cd ~/src
% wget http://pecl.php.net/get/APC-3.1.13.tgz
% tar xzvf APC-3.1.13.tgz
% cd APC-3.1.13
% /usr/local/php/5.3/bin/phpize
% ./configure --with-php-config=/usr/local/php/5.3/bin/php-config
% gmake

テストを実行し、問題なければOK。
うちのPHP5.3+APC3.1.13だと、Tests skippedが30もあるので気になるところではありますが・・・

gmake test

モジュール用ディレクトリにコピー。

% cp ~/src/APC-3.1.13/modules/apc.so ~/modules/

さくらのコントロールパネルからphp.iniの設定を追加。
メモリ使用量はお好みで。

;APC
extension_dir = /home/****/modules
extension=apc.so
apc.shm_size=48M
apc.max_file_size=4M
apc.write_lock = 1

ちなみにソースファイル一式にはapc.phpも含まれているので、パスワードを設定しWEBディレクトリに設置するとAPCの効き具合を確認できます。

最後になりますが、ここに書いてあることはイレギュラーな方法だと思いますので、各自の自己責任で行ってください。
どのような結果になろうと当サイトは一切の責任を負いかねます。

コメント