HOME

Bluetoothシャッターボタンを求めて

最近、Android端末のカメラを使って、遠隔操作でシャッターを切りたいと思い立ち、最近数百円で販売されているBluetoothシャッターボタンを購入してみた。

シャッターボタン

…なぜ3つあるのかと言えば、諸事情に3つ買ったため。この3つ、外見が全部全く同じだけど、内部が全く別物になっている。

一番右側が最初に買った物。秋葉原のあきばおーに売ってた物を買ってみた。ところがこれ、ボタンが2つあるように見えて、Android側のボタンは押せないという酷い代物だった。分解してみたところ、基板にボタンの構造その物が存在しなかった。つまり、絶対押せない。ちなみに、iOS側のボタンを押すとカメラがズームする。

真ん中と左側のはAmazonで一緒に買った物。なんで2つ買ったかと言うと、いくつか買って比較してみるため。どっちがどっちかは忘れたけど、一方がこれで、もう一方がこれ
結果として、片方はどちらのボタンもズームボタンとして機能した。もう一方は、iOS側のボタンがズームボタン、Android側のボタンがシャッターボタンとして機能し、ようやく当たりを引き当てることができた。

そんなわけで、数百円で販売されているこの手のシャッターボタンは、外見が同じに見えて内部が全く異なる物がいくつか存在するため、余程確実な場合は以外は買わない方が良いと思う。恐らく、同じショップで購入しても確実に同じ物を引き当てらるとは限らないので、他人が当たりを引いたショップで買っても、同じ物は手に入らないと思われる。

ちなみに、最終的にはこのBLuetoothリモコンに落ち着いた。

リモコン

これは、ボタンの表示通りの動きが出来たし、シャッターの他、再生や停止と行ったメディア操作系のボタンも使うことができた。ボタンが多数で、最悪どれかのボタンが使える可能性が高いので、どちらかと言えばこちらの方をお勧めしたい。最近はAmazonでも取り扱いがあるので、買いやすくなっていると思われる。

ちなみに、このボタンで操作した端末は2つ。一つはSonyのXperia Z3 Compact、もう一つがSamsungのGalaxy K Zoom。Xperiaはシャッターボタンを押すと、自動的にフォーカスを合わせて撮影、という動作となった。一方のGalaxy K Zoomの方は、フォーカス合わせのみが行われ、シャッター動作は行われなかった。これは、端末側の仕様の問題と推測されるので、使用はあきらめた。

Google Play Music に楽曲をアップロードできない場合は一度タグをクリアすると良い

Googleには、Google Play Music というサービスがある。Google Playで販売されている楽曲の提供や、定額音楽配信サービスの他、自分の持っている曲を無料で50000曲までアップロードすることができるという、統合的な音楽管理サービスとなる。

ここで取り上げるのは、最後に挙げた曲のアップロードサービスについて。ここにアップロードできないファイルがあったので、それをアップロードするために悪戦苦闘したことについて書く。

最近ふと思い立って、手持ちの大量の曲をバックアップがてらGoogle Play Musicにアップロードすることにした。現状、Google Play Musicサービスに楽曲をアップロードする方法は2つ。一つはMusic Managerを利用すること、もう一つはGoogle拡張機能を利用する方法。

手持ちの曲は1万曲を超えていたので、ここでは放っておいてもアップロードされるMusic Managerを利用することとした。

手持ちの曲数

ところが、アップロードを開始してしばらく放置したところ、途中でアップロードが全く進まずにCPUに最大まで負荷かがかかる状態で留まる事象が発生した。原因がまったく分からず、Music Managerを再起動したところ、アップロードできなかった曲の一覧が表示されていた。曲は全てMP3だった。(アップロード中は表示されなかった)

同様の事象を探して以下に示したいくつかの対策を行ってみるが、いずれも効果無く相変わらずアップロードはできない。

  • Ghrome拡張機能を使う
  • キャッシュの削除
  • 再起動
  • 再インストール
  • アップロードフォルダの変更
  • その他諸々

仕方ないのでアップロードできないファイルを少し調べて見たところ、ファイルのサイズが明らかにおかしいことに気付いた。ただの数分のMP3ファイルなに、ファイルサイズが数十MBのサイズがある。よく見ると、曲の中にアルバムアートが複数枚埋まってるファイルだった。

とりあえず、タグを全て削除(自分はMP3tagを使用)し、再度タグを付け直したところ、問題なくアップロードすることができた。

結論

Google Play Musicに曲がアップロードできない場合は、一度ファイルのタグ情報をクリアすること。特にアルバムアート。

余談

上記はサラッと書いてるけど、この原因を特定するために凄く時間がかかった。今回は、他の人が同じように無駄な時間を費やさないように、ここに書き記しておくことにした。

ちなみに、アルバムアートが複数枚埋まっているのは、MusicBrainz Picardの設定で、「表紙画像のみを埋め込む」のチェックが外れていたため、ダウンロードされた複数枚のアルバムアートが全てMP3に埋め込まれていたことが原因だった。

MusicBrainz

リモート再生の手引き (C82発行) 公開

1個前のエントリに引き続き、コミックマーケット82 (2012/8/11) で発行した同人誌、「リモート再生の手引き」を公開します。

概要は次のページを参照。

コミックマーケット82 サークル参加のお知らせ

こちらも内容がだいぶ古いですが、参考までにどうぞ。
こちらも、印刷、配布、転載等。取り扱いはお好きなように。

ファイル

本体 (Microsoft Word)
本体 (Adobe PDF)

表紙 (Microsoft Word)
表紙 (Adobe PDF)

HTPC構築の手引き (C80発行) 公開

今さらですが、コミックマーケット80 (2011/8/13) で発行した本、「HTPC構築の手引き」を公開します。
本当はずっと前にアップロードしようと思ってたのですが、面倒で今まで放置していました…。
概要は次のページ参照。

コミックマーケット 80 参加のお知らせ

内容がだいぶ古いし上に中途半端なのでであまり役に立たないかもしれませんが、何かの参考になれば幸いです。取り扱いはご自由にどうぞ。
印刷、配布、転載等。取り扱いはお好きにどうぞ。

ファイル

本体 (Microsoft Word)
本体 (Adobe PDF)

表紙 (Microsoft Word)
表紙 (Adobe PDF)

コミックマーケット90 サークル参加のお知らせ

ほぼ告知用のサイトになってて誰が見ているのかは分かりませんが、コミックマーケット90への参加のお知らせです。

8月12~14日にビックサイトで開催される、コミックマーケット88にサークル参加します。何だかんだで5回目の参加です。
今回は気の赴くままに本を2冊作ってます。

[イベント情報]

コミックマーケット90
日付:2016/8/14(日) (3日目)
場所:西g-01a (西3・4)
サークル:Melog

出版物 その1

タイトル:ゲーマー向けオーディオインターフェースの話
ページ数:20ページ (オフセット)
価格:150円200円

gamer

出版物 その2

タイトル:レトロゲームでアイロンビーズを作ってみた本
ページ数:24ページ (オフセット)
価格:150円200円

beads

今回は、何を思ったかアイロンビーズの作り方みたいな本を作ってます。2ヶ月ほど前に、「ゲームレジェンド」というイベントに赴いた際に影響を受け、唐突に作りたくなったためです。

その他、過去に作った以下の本も持っていきます。

同期歌詞を作ろう!
音楽ファイル管理の手引き

相変わらず、自分の作りたい本を気の向くままに作っていくスタイルですが、もしご興味があればスペースに来ていただけると嬉しいです。

追記

当日は、スペースに以下のような感じのアイロンビーズを飾っておく予定です(すいませんが、売り物ではありません…)。よろしくお願いします。

ironbeads

また、当日のマップ画像を以下に示します。

map

2016-08-12 追記

見通しが甘く、50円玉を扱うのはやっぱり大変だったので、価格を200円に変更させていただきます。
申し訳ありません。

2016-08-15 追記

ご来訪いただいた方、どうもありがとうございました。

通信回線をIIJmioに統合して通信料を月8000円ぐらい安くする話

最近になって、使用中の回線を見直している。主な理由としては、携帯を現在のauからMVNOの回線に変更することにしたため。
自分の使い方ではキャリアの通信量上限まで全然達することはないし、キャリアのサービスなんで全く利用しないし、通信料金高すぎるしで、現状のキャリアを使い続けるメリットは全くないので、MVNOに変更することにした次第。ちょっと引っかかるのは昔から使ってるキャリアメールと、三大キャリアのメール以外を受け付けないサービスの利用。ただ、キャリアメールは迷惑メールばかり届くのでもう要らないし、最近はgmailが普通にサービスで利用できたりするので問題ないかな、と。メールの変更は連絡がちょっと手間かも。

MVNOの変更先はIIJmio。すでにSIMを2枚契約している上に、固定回線のプロバイダもIIJmioなので、もう全部ここに統合してしまおうという計画。固定回線とIIJmioを統合すると、月々600円ぐらい割り引かれるというメリットも魅力だった。さらに言うと、3枚のSIMをまとめてファミリーシェアプランというプランにすると、個別に3枚契約するよりもちょと安くなって通信量が増えるというメリットもある。
また、現状のIIJmioで契約しているプロバイダを、フレッツ回線とプロバイダ登録がセットになった「IIJmioひかり」に変更することにする。

で、結局どのくらい安くなるのか計算してみた。価格は100円単位の大雑把な値。

まず現状。

  • NTTフレッツ回線:3000円
  • IIJmio FiberAccess/DF(プロバイダ):2000円
  • IIJmio データ通信専用SIM:900円
  • IIJmio 音声通話機能付きSIM:1600円
  • au :7500円
  • (計:15000円)

次に変更後。

  • mio ひかり:3400円 (mio割で-600円)
  • IIJmio ファミリーシェアプラン(音声2回線、データ1回線):4000円 (2560+700*2)
  • (計:7600円)

合計で、15000 – 7400 = 7600円程安くなる。ついでに、mioひかりとIIJmioを組み合わせると、2年間はsim 1枚当り150円引かれるキャンペーンが行われているので、450円安くなる。つまり、変更前に比べて8000円ぐらい安くなる。

1ヶ月辺り8000円安くなるのはなかなかのインパクトだと思う。通信を1会社に集中させるのはあまり良くないような気がするという懸念はあるのだけど、料金の安さと運用の簡易さの前にはあまりにも弱かった。
ついでに、ファミリーシェアプランだとLTEが10GB使えるので、変更前よりLTE通信量の上限は上がるというおまけ付きでもある。そんなに使わないけれど。

そんなわけで、通信回線を見直すとこれだけ安くなるよ、という話。というか、3大キャリアの携帯回線がぼったくりすぎなんだよな…。

ちなみに、IIJmioの契約は固定回線も携帯回線もビックカメラのBIC simカウンターで行えるので、直接IIJmioに連絡とるよりこちらの方が色々相談にも乗ってくれるのでお勧めです。むしろ直接IIJmioとやりとりすると、向こうからの手続き待ちやら連絡待ちやらで色々面倒でした…。

ところで、複数のIIJmio回線を一つのファミリーシェアプランにまとめる仕組みを用意しているとの話だったけれど、いつやるんでしょうか…。今回はsimの再発行でいいですが。

Windows 10 で SoundBlaster X-Fi Titaniumを使う

本日、メイン機のOSをWindows 7からWindows 10に変更。
近年はスマートフォン、タブレットが台頭したり、MacBookが流行したりして、「まだWindowsなんて使ってんの?」的な風潮が無きにしも非ずな昨今だけど、ゲームに使えて開発に使えてソフトウェアが豊富で過去の資産が活用できて、様々な作業がかなり高い水準で達成できる汎用性の高いOSなので、今後も重宝すると思う。

それはさておき、Windows10を導入するに当たり困ったのが、SoundBlasterのドライバ。Creative公式を見ると、現在刺さっているSoundBlaster X-Fi Titaniumは、10月までまともなドライバを出してくれない模様。

Windows 10 ドライバー対応状況

Windows8用のドライバが動くのだけど、Creativeのオーディオマネージャが起動しない。そのため、ステレオ音声を5.1chに振り分けて再生したり、バスリダイレクションでサブウーハーに振り分けたりできない。恐らく、サラウンド音声関連もダメダメだろう。
ちなみに、Windowsアップデートでダウンロードされるドライバはインストールしてはいけない。これをインストールすると音が鳴らなくなる。

そこで調べて見たところ、SoundBlasterシリーズの非公式ドライバ、Support PackがWindows10に対応していた。

SB X-Fi Series Support Pack 3.4 (07/08/2015) – Updated Auzentech drivers

これをインストールしたところ、無事各種設定が行えるようになった。X-Fi以外のドライバについては、下記を参考に最新ドライバを探す。

ドライバ – Sound Blaster Wiki*

ちなみに、nVIDIAのビデオカードからHDMI出力でアンプに直結しようと思ったのだけど、映像を出力しないと音声も出ないし、アンプのテレビをON/OFFすると音声が途切れて具合が悪いので諦めた。私にはまだサウンドカードが必要なようで。

コミックマーケット88 サークル参加のお知らせ

8月14~16日にビックサイトで開催される、コミックマーケット88にサークル参加します。4回目の参加です。
参加情報は以下の通り。

コミックマーケット88
日付:8/16(日) (3日目)
場所:東O-55a
サークル:Melog

今回の出版物は以下の通り。

タイトル:同期歌詞を作ろう!
ページ数:48ページ
価格:300円

拍子は以下のような感じです。適当すぎて何かもう…。

C88 同期歌詞を作ろう! 表紙

C88 同期歌詞を作ろう! 表紙

内容は、音楽と同期する歌詞についての本です。LRCやタイムタグ付き歌詞など、同期歌詞全般について書いてます。48ページと盛り沢山ですが、内容はそんなに多くないかもしれません。割と大雑把な内容なので、同期歌詞を作る時に参考にしていただければ、程度の内容です。

それから、今回初めて印刷屋を使いました。オフセットです。何かすげぇ(何が)。

そんなわけで、お暇でしたらスペースにいらしていただけると嬉しいです。

Google Play は他の商標から始まる名前のアプリはリジェクトされる

最近、Google Playにアプリを登録しようとしたところ、以下のようなメールが届く。

他の商品のブランドや商品名名前で始まるタイトルを無許可でアプリに使用してはいけません。その企業の関連商品であるとユーザーに勘違いされてしまうおそれがあります。代わりに、「for [ 商品名またはブランド名 ]」を使用してください。

今回は、頭に「Twitter」が入っていたのが良くなかった模様。もちろん、権利を侵害するつもりは毛頭無かったけど、よく考えたらそうだよね。逆に言うと、頭に入ってなければ割と自由に入る模様。

詳細:キーワード スパム – Google Play デベロッパー ヘルプ

TSファイルの自動エンコードスクリプト

最近、TVをTSで録画した後に自動的にMP4形式にエンコードするようバッチ処理させたいと思い立ったので、色々調べてみた。
ちなみに自分の方針としては、CM等は削らない、画質はあまり問わない、設定にあまり手間をかけない、です。とにかく、サイズが小さく出来れば良いし、CM無しや良い画質が欲しけりゃBD買うよ、というスタンスなので。むしろ録画当時のCMとか残しておきたいよねー、って思ってる。

録画完了後にバッチを走らせるパターンが多いようだけど、録画直後にエンコーダを走らせると、その負荷が次の録画等の処理に影響してしまったり、複数のエンコーダ同時に走って、いつまで経ってもエンコードが終わらず面倒な事になるかもしれない…と思い、タスクスケジューラで指定時刻に順次エンコードさせることにした。
…が、そのような処理をさせる人をネットであまり見かけない。負荷による影響はあまり気にしなくても良いのかなぁ…。しかしまぁ、せっかくなので当初の予定通り、タスクスケジューラで実行させる事にした。

スクリプトは以下のような感じのを自前で作った。余所ではバッチファイルが多いけれど、私はあんまりバッチファイルを書けないもので…。細かいことやろうとすると色々調べる事になるので、結局WSHとか使った方が楽かな、と。何れにせよWindowsなら間違いなく動くので、別に良いかと。


var Fso      = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");

/// User ///////////////////////////////////////////////////////////////////////

var InputDirPath = "D:\Record";
var OutputDirPath  = InputDirPath;
var WorkDirPath    = Fso.BuildPath(OutputDirPath, "work");
var ProgramDirPath = WScript.ScriptFullName.replace(WScript.ScriptName, "");
var Threshold      = 1000000; // re-encode threshold size.

// Split
function splitTs(inputFilePath, outputDirPath) {
	var tsSplitterPath = Fso.BuildPath(ProgramDirPath, "TsSplitter.exe");
	var tsSplitterCommand = " -ECM -SD -1SEG -SEP2 ";
	
	WshShell.Run(tsSplitterPath + tsSplitterCommand + " -OUT \"" + outputDirPath + "\" \"" + inputFilePath + "\"", 0, true);
}

// Encode
function encodeTs(inputFilePath, outputFilePath) {
	var encoderPath = Fso.BuildPath(ProgramDirPath, "HandBrakeCLI.exe");
	var encoderCommand = " -f mp4 -e x264 --x264-preset=medium --x264-tune=animation --h264-profile=high -q 22 --cfr -a 1 -E fdk_aac -6 stereo -B 160 -R auto --gain 10 -w 1280 -l 720 --crop 0:0:0:0 --decomb ";
	
	WshShell.Run(encoderPath + " -i \"" + inputFilePath + "\" -o \"" + outputFilePath + "\" " + encoderCommand, 0, true);
}

///////////////////////////////////////////////////////////////////////////////

var InputExt = ".ts";
var OutputExt = ".mp4";

// Exec cscript.
if (Fso.GetFileName(WScript.FullName).toLowerCase() != "cscript.exe") {
	WshShell.Run("cscript " + WScript.ScriptFullName);
	WScript.Quit();
}

try {
	var workExists = Fso.FolderExists(WorkDirPath);
	if (!workExists) {
		Fso.CreateFolder(WorkDirPath);
	}
	
	var folder = Fso.GetFolder(InputDirPath);
	var enumerator = new Enumerator(folder.Files);
	for( enumerator.moveFirst(); !enumerator.atEnd(); enumerator.moveNext() ) {
		// Input File
		var inputPath = enumerator.item().Path;
		var inputName = enumerator.item().Name
		if (inputName.match(".*" + InputExt + "$") == null) continue; // not .ts file
		
		// Output File
		var outputPath = Fso.BuildPath(OutputDirPath, inputName.substr(0, inputName.length - InputExt.length) + OutputExt);
		if (Fso.FileExists(outputPath) && Fso.GetFile(outputPath).Size > Threshold) continue; // completed
		
		// Split
		splitTs(inputPath, WorkDirPath);
		
		// Get max size file
		var files = new Enumerator(Fso.GetFolder(WorkDirPath).Files);
		var maxSize = 0;
		var maxSizeFilePath = "";
		for(files.moveFirst(); !files.atEnd(); files.moveNext()) {
			if (inputName.match(".*" + InputExt + "$") == null) continue;
			if ( files.item().Size > maxSize) {
				maxSize = files.item().Size;
				maxSizeFilePath = files.item().Path;
			}
		}
		
		// Encode
		try {
			if (maxSize > 0) {
				WScript.Echo(maxSizeFilePath +  " begin.");
				encodeTs(maxSizeFilePath, outputPath)
				WScript.Echo(maxSizeFilePath +  " end.");
			}
		} catch (e) {
			WScript.Echo(maxSizeFilePath +  " error.");
		} finally {
			// Delete files
			for(files.moveFirst(); !files.atEnd(); files.moveNext()) {
				if (inputName.match(".*" + InputExt + "$") == null) continue;
				Fso.DeleteFile(files.item().Path);
			}
		}
	}
	
	if (!workExists) {
		Fso.DeleteFolder(WorkDirPath);
	}

} catch(e) {
	WScript.Echo(e.message);
} finally {
	WshShell = null;
	Fso = null;
}

このスクリプトは、スクリプトが置かれたフォルダ上にTSSplitter.exeとHandBrakeCLI.exeが必要。このパスを変更する場合は、「ProgramDirPath」の値を弄る。
スクリプトの処理の概要は以下の通り。

  1. WorkDirPathフォルダが無ければ作成。
  2. InputDirPathフォルダ内にあるTSファイルを走査。
  3. 出力ファイル(TSファイル名.mp4)が既に存在し、Thresholdよりサイズが大きい場合は次のTSファイルへ。
  4. TSファイルを TSSplitterで分割し、WorkDirPathフォルダに出力。
  5. WorkDirPathフォルダに分割されたTSファイルのうち、一番サイズの大きなTSファイルを取得。
  6. 一番サイズの大きなTSファイルをエンコードし、OutputDirPathフォルダに出力(TSファイル名.mp4)。
  7. WorkDirPathフォルダ内の分割TSファイルを削除。
  8. 3に戻り、次のTSファイルを処理。これをInputDirPathフォルダ内のTSファイル分繰り返す。
  9. WorkDirPathフォルダを作成した場合は、フォルダを削除。

基本的には、他のサンプルと同様にTSファイル分割→エンコードの流れ。本当はエンコードだけでも良かったのだけど、TsSplitter噛まさないと、MXの録画がエラーで止まるもので…。常時マルチ編成になった後はどうなったのかは知らないけれど。
ここでは分割時に一番大きなサイズのファイルを採用してエンコードしている。必ずしも目的のファイルが一番大きなサイズのファイルになる保証は無いけれど、まぁ9割9分ぐらい問題ないと思う。
Threshold判定は、何らかの事情でエンコードに失敗し、サイズの小さいゴミファイルが生成されてしまった場合に再エンコードさせるためのも。1000000という数字は適当。おまじないみたいな物だけど、必ずエラーが起こる場合は毎日エンコードを試みることになるので、無駄な処理が発生するかもしれない。
ちなみに、本スクリプトは必ずcscriptで起動させるようにしているけれど、これは単に途中経過を示すコンソール画面が欲しかったため。

splitTsメソッドとencodeTsメソッドの中のパラメータは、必要に応じて適当に弄る。気が向いたら別のエンコーダに差し替えるかもしれない。
補足としては、スクリプトではTsSplitterをExecメソッドで実行し、HandBrakeCLIをRunメソッドで実行している。TsSplitterは、実行させてもすぐに処理が戻ってきてしまうため、処理が完了するまでStatusプロパティを監視する必要がある。一方のHandBrakeCLIはStatusプロパティは利用できないが、Runメソッドで実行させると完了するまで処理が戻ってこない。そんなわけで、ExecとRunを使い分けてる。
すいません、大嘘ついてました。Runメソッドで結果がすぐ帰って来てたのは、第3引数にtrue指定し忘れてただけだった。Runでいいです。むしろExecはTsSplitterが正しく終了ステータスを返さない場合がある事を確認しているので、やめた方がいいです。(これはTsSplitterの問題では無く、Execメソッドが昔から抱える問題の模様)

あとは、これをタスクスケジューラに登録する。
自分はとりあえず、毎日5時に実行されるようにしている。この時間なら、まぁ録画は行われていないだろう、という判断。

そんな感じで、タスクスケジューラでエンコードのバッチ処理を行う方法でした。
スクリプトはそんなに真面目に検証してないので、もしかしたら間違いがあるかもしれないです。