HOME

リモート再生の手引き (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時に実行されるようにしている。この時間なら、まぁ録画は行われていないだろう、という判断。

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

Android端末をDynamic DNSクライアントにする

最近、ダイナミックDNSの更新に失敗して自宅サーバにアクセスできなくなる事態が発生した。更新ドメインは2重化していたのに、何れもアクセス出来ずに失敗してしまった。

その要因の一つに、有名なダイナミックDNSサービスであったDynDNSが有料化し、サービスが利用できなくなった事が挙げられる。今まで、DynDNSサービスはBUFFALOのルータから更新していたけれど、今後は有料サービスを使わないとBUFFALOルータのダイナミックDNS更新機能は利用できなくなってしまった事になる。
ちなみに、自宅のサーバでは別のダイナミックDNS更新ソフトが走っており、別のドメインを更新させているけれど、今回は何故か設定が消失して更新されなくなっていた。この対策は別途考えるとして、今回は置いておく。

使えなくなったDynDNSの代替手段を別途確保しようと色々頭を捻ってみたところ、まず思いついたのがRaspberry Piを使った更新処理。ただこれは、色々準備しないといけないので面倒臭い。
しかし背に腹は替えられない…と思って機器を揃えたところでふと思いついた、余ったAndroid端末を使えばいいんじゃね?と。Androidの携帯端末ならば、常時稼働が前提だし、省電力製に優れるし、電源の確保も簡単だし、ネットワークにも接続できるし、コンパクトだし、単独でメンテナンスもできるし、ソフトウェアのインストールも簡単だし、代替手段として全く申し分ない。もっと早く気付くべきだった…。

ダイナミックDNSの設定

で、ここからが本題。AndroidからダイナミックDNSの更新を行うために、アプリを導入する必要がある。今回利用したのは、「Dynamic DNS Update」というアプリ。

Dynamic DNS Update – Google Play の Android アプリ

またダイナミックDNSサービスは、DynDNSの代わりにVALUE DOMAINを利用することとする。自分の場合、元々Value Domainでドメインを取得していたため、ここで提供されているダイナミックDNSサービスを利用することにした。なお、Value DomainのダイナミックDNS更新については、ダイナミックDNS機能のご利用方法に情報がある。

Dynamic DNS Updateの設定画面は以下のような感じ。

Dynamic DNS Update

ここで設定するべき内容は以下の通り。各種情報は、Value Domainにあらかじいめ登録しておく。

Select Dyanamic DNS url
http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=[自分のドメイン]&p=%password%&h=%hostname%&i=%ip%
Update every (minutes)
更新間隔(分)。この間隔おきにIPアドレス変化のチェックが行われ、違っていれば更新処理が行われる。(デフォルト動作)
Hostname
更新対象のホスト名。あらかじめDNSレコードに登録しておく。
Password
更新用パスワード。あらかじいめValue Domainに登録しておく。

これを登録し、「Start」ボタンを押してDynamic DNS Updateをバックグラウンドで走らせておくことで、無事ダイナミックDNSの更新を行うことができた。注意点としては、パスワードとか丸見えなので、普段使ってるパスワードは絶対使わないこと。
ちなみに、アプリには複数の更新を登録することができる。あと、端末起動時にアプリを起動する場合は、設定の「Start the app on boot」にチェックを入れておく。

そんな感じで、Value DomainとDynamic DNS Updateを利用した、AndroidからのダイナミックDNS更新について書いてきたけど、他のサービスにも色々使える(テンプレートが用意されている)ため、AndroidでダイナミックDNS更新を行う場合は結構汎用性が高いと思われる。
そんなわけで、興味がある人は是非チャレンジをば。

Mouse Without Bordersのマウスホイールが効かない場合の対処

Microsoft download from The Garage: Mouse without Borders – Next at Microsoft – Site Home – TechNet Blogs
窓の杜 – 【NEWS】Microsoft、複数PCでマウス・キーボードをLAN共有する「Mouse Without Borders」

複数のPCでキーボード・マウスを共有できるMicrosoft製ソフトウェア「Mouse Without Borders」。もちろんWindows専用ソフトウェアだけれど、Windowsに特化しているためか反応も良く、自宅にあるサーバの操作にはなかなか重宝している。ところが、自分の環境ではマウスホイールが効かないという事象が発生していた。
以前から気にはなっていたけれど、最近少し調査してみたら。Logitechのドライバが悪さをしていることが分かった。

SetPoint

日本語ドライバなら「スムーズなスクロールの有効化」、英語ドライバなら「Enable Smooth Scrolling」のチェックを外す。これで治る模様。少なくとも自分の環境では治った。
と思う。