goo blog サービス終了のお知らせ 

4月29日(日)のつぶやき

2012-04-30 02:47:25 | Twitter
02:07 from Silver Bird
ID3 Mass Tagger のソースを見つけた。Boland C++ でコンパイルできそうだ。bcc32 は以前落としたのがどこかにあるはず。id3lib は放置かな(苦笑)。

03:05 from Silver Bird
MP3 のポッドキャスト化に対応した ID3 Mass Tagger のコンパイルに成功。もう寝る。

10:35 from Twitter for iPhone (Re: @momongatk
@momongatk それよく覚えてないんだよね。見たら思い出すのかもしれないけどさ。

20:06 from Silver Bird  [ 1 RT ]
Radikaで録音した番組をポッドキャスト化してiTunesに登録するツールadd2itunesを二年ぶりに全面書き換え。今回はRadikaが対応していないMP3のポッドキャスト化がウリです。相変わらずの玄人向けツールですが(苦笑)。 bit.ly/IBwbtP

by ghostwind_jp on Twitter

radiko.jp を iTunes/iPod でポッドキャストとして聴く! (MP3対応版)

2012-04-29 17:23:10 | iPhone, iPod & iTunes

add2itunes



add2itunes は radiko.jp の録音ツール Radika で録音した M4A/MP3 ファイルを iTunes にポッドキャスト形式で自動的に追加するツールです。Radika の「録音終了時実行コマンド」に指定して使います。ポッドキャスト形式は iTunes で番組ごとに管理され、また再生位置も記憶してくれるので、前回の続きから聴くことができます。追加されたファイルは通常のポッドキャスト同様「ライブラリ」の「ポッドキャスト」に表示されます。一連の処理はすべてバックグラウンドでリアルタイムに行われ、iTunes が起動中は即反映、起動していない場合は次回の起動時に反映されます。



準備
当然ながら RadikaiTunes は必須です。それぞれの基本的な使い方をマスターしておいてください。

add2itunes のインストール
1) 下記よりファイルをダウンロードして任意の場所に解凍します。
add2itunes_20120429A.zip

2) スクリプトファイル "add2itunes.js" と "id3.exe" を Radika の「プログラムディレクトリ」にコピーします(radika.exe のあるフォルダ)。前バージョンの「録音ディレクトリ」から変更になりましたので注意して下さい。環境によっては拡張子(.js)が見えない場合があります(下記参照)。
http://support.microsoft.com/kb/978449/ja

3) スクリプトファイルを実行して「iTunes に自動的に追加」フォルダを選択してください。アンチウイルスがスクリプトの実行を遮断する場合は適宜許可してください。また「iTunes に自動的に追加」フォルダについては下記を参照してください。
http://support.apple.com/kb/HT3832?viewlocale=ja_JP


4) プログラムディレクトリに "add2itunes" というショートカットが作成されるので、ショートカットをクリックしてリンク先が正しいかを確認して下さい。

※(3)がうまく行かない方は以下の手順を試してください。
[1] スクリプトファイルを右クリックして「プログラムから開く > プログラムの選択」を選択。
[2] 「Microsoft(R) Windows Based Script Host」を選択。
[3] 上記が見つからない場合は[参照]ボタンから以下のアプリケーションを選択。
C:\WINDOWS\system32\wscript.exe

※「iTunes に自動的に追加」フォルダを変更したい場合はプログラムディレクトリに作成されたショートカットを削除してください。

Radika の設定
「ツール>オプション>録音」で録音終了時実行コマンドを下記のように設定します(マウスを乗せると画像が拡大します)。それ以外は任意です。



[コピー用テキスト]
C:\WINDOWS\system32\wscript.exe
add2itunes.js "@FIL"

※デフォルトの処理は「移動」となっており、コマンド実行後は iTunes が管理するフォルダに音声ファイルが移動します。録音ディレクトリにファイルを残しておきたい場合は引数の最後に "copy" という文字列を追加してください。

[コピー用テキスト]
C:\WINDOWS\system32\wscript.exe
add2itunes.js "@FIL" copy


ポッドキャスト化について
現バージョンの Radika は M4A ファイルのポッドキャスト化に対応しています。Radika 側でチューナーごとにポッドキャストフラグを立てておいて下さい。MP3 ファイルについては Radika が未対応のため add2itunes がポッドキャストフラグを立てます。また iTunes は「タイトル」及び「アルバム」タグでポッドキャストを分類するので(ファイル名、フォルダ名に対応) Radika での設定を忘れないようにしてください。これらのタグが書き込まれていないファイルはポッドキャストフラグを立ててもポッドキャスト扱いされません。

除外ファイルの設定
ファイル名が ^ (半角ハット) から始まる場合、add2itunes は iTunes への登録を行いません(処理後にファイル名から ^ を削除します)。登録の振り分けを行いたい場合にお使い下さい。


ID3 Mass Tagger
ソースが入手できたので PCST フレームに対応させた上で bcc32 でコンパイルしました。今まではバイナリにパッチを当てることで実現できましたが、それを同梱するわけにはいかなかったので(苦笑)。

過去の関連記事
radiko.jp を iTunes/iPod でポッドキャスト風に聴く!
radiko で配信される番組を iPhone や iPod でポッドキャストとして聴く方法
MP3 単体で iTunes にポッドキャストとして登録する方法




動作報告等、お待ちしております。

4月28日(土)のつぶやき

2012-04-29 02:48:38 | Twitter
13:07 from Silver Bird
久しぶりに Chrome の拡張機能をインストール。右クリックから Bookmarklet を実行する SpellBook。これは便利。

16:17 from Twitter for iPhone
ケルト系のネットラジオで Capercaillie と Nightnoise が流れる。いいねぇ。

17:00 from Twitter for iPhone
iPhoneってフリックから全角スペース入れられないのかね。単語登録もスペース系の文字だけはダメです!って叱られるし(苦笑)。

18:00 from Twitter for iPhone
前回の給油は8.77km/Lという燃費……というメモ。

18:02 from Twitter for iPhone
セルフのスタンドって給油後に小銭を追加できればいいのにな。

18:32 from Twitter for iPhone
Karan Casey の声はいつ聴いても美しいな。

18:33 from Twitter for iPhone
久しぶりに「青空レストラン」を観る。

by ghostwind_jp on Twitter

JScript について

2012-04-28 08:29:06 | Programming > JScript
はじめに
一般的に JavaScript はウェブブラウザで利用されるスクリプト言語という認識だと思うが、Microsoft 版の JScript は Windows 上で Active Scripting エンジンとして実装されており、WSH などで Windows プログラミングの言語としても利用される。例えば ActiveXObject というコンストラクタを用いて COM コンポーネントを利用することができるが、もちろんこれは JScript の独自拡張である。

JScript を使うにあたり、JavaScript(ECMAScript) との違いを把握しておくことは重要である。厄介なのは JScript が ECMAScript 準拠ではなく、あくまで「ベースにしている」に留まっているという点である。JavaScript としてコーディングする際、JScript だけがおかしな挙動を示すことは珍しくない。ウェブブラウザでの実行を前提とした場合、処理系の違いを吸収するためクロスブラウザを意識することになるが、JScript と JavaScript の違いを把握しておかないとコーディングに苦労することとなるだろう。両者はある程度切り分けて考えておくべきだというのが私の考えである。

ここでは主に Windows プログラミングとしての JScript を扱う。また一般的な JavaScript との違いについても言及していきたい。あくまで趣味範囲での記事内容であり、その正確さについては正式な文書の参照、あるいは各自の環境における動作確認を優先させていただきたい。


もくじ
JScript 用 Include コンポーネント
・JScript ファイルに一行加え、インクルードを実現する方法
・JScript で文字列内の変数を展開する関数を作ってみた
・JScript で関数を動的スコープ化する関数を作ってみた


SFC mini 拡張セット (近日公開予定)
・JScript で Windows API を利用するためのモジュールセット
・機能拡張版 SFC mini (sfcmini.dll) + モジュール (sfcmini.js)


COM コンポーネント用モジュール (近日公開予定)
・JScript から ActiveX コンポーネントではないCOM コンポーネント (IDispatch インターフェイス未実装) を利用する
・モジュール (comobj.js)

4月26日(木)のつぶやき

2012-04-27 02:42:19 | Twitter
17:49 from Twitter for iPhone
プログラミングやプロトコル解析は趣味。答えが決められていないクイズを解いているような楽しさがあるんだな。

17:54 from Twitter for iPhone
音楽が右脳を満たし、アルゴリズムの創造が左脳を満たすことでバランスが取れている人間なんだろう。

by ghostwind_jp on Twitter

4月25日(水)のつぶやき

2012-04-26 02:39:20 | Twitter
21:07 from Silver Bird
id3lib を使って PCST フレームを入力しようとしたが、未定義のフレームは扱えないようだ。ソースを修正して再コンパイルするのが近道か。

21:09 from Silver Bird
ソースは Visual C++ 6.0 なのだが、Visual C++ 2010 ではプロジェクトのアップグレードができなかった。ネットを見てみると、どうやら 2008 を経由すると可能らしい。以前の 2008 をまた入れることになるとは……(苦笑)。

23:07 from Silver Bird
Carolyn Dawn Johnson の曲を聴いて Jo Dee Messina っぽく感じたが、まさに彼女の "Downtime" を書いている人だった。

23:15 from Silver Bird
ATL 使ってるのか。こっちは Express だからなぁ。どうやら Windows Driver Kit もインストールするといいらしい。プロジェクトのアップグレードごときでこんなに手間取るとは……(苦笑)。

by ghostwind_jp on Twitter

4月21日(土)のつぶやき

2012-04-22 02:41:37 | Twitter
09:32 from Silver Bird
札幌の三角山放送局というコミュニティFMでアイリッシュ・トラッドが聴けそうな番組を見つけた。タイトルはまんま「アイルランドを聴く」。サイマルラジオで配信しているのでradikaで録音可。今月の回は終わってしまったが来月は是非聴いてみたい。 bit.ly/Ib5Ouv

10:52 from Silver Bird
iTunes でシャッフル再生開始。まずは大御所 James Brown。Last.fm もちゃんと更新されてますわ。 bit.ly/IdDYkR

10:54 from Silver Bird
次は Ferenzik か。Todd Rundgren との活動が有名かな。私は Van Romaine 絡みで買いましたけど(苦笑)。

10:59 from Silver Bird
Whitesnake の The Deeper The Love のサウンドが好きな人は Street Talk とかイケると思う。

18:38 from Twitter for iPhone
Tunemark で SHOUTcast を聴くと Last.fm と連携出来るな。

by ghostwind_jp on Twitter

JScript で関数を動的スコープ化する関数を作ってみた

2012-04-21 19:13:14 | Programming > JScript
はじめに
スクリプト コンポーネントが持つスコープの独立性を活かし、ユーザー定義関数を動的スコープ化する関数を作ってみた。


Include コンポーネント
基本的な機能の紹介やダウンロード先は Include コンポーネントのページを参照のこと。

構文
Include コンポーネントをアクティブ化することで $local という動的スコープ化用の関数が使えるようになる。$local は関数オブジェクトを受け取り、動的スコープ化した関数オブジェクトを返す。
($=new ActiveXObject('JScript.Include'))(this);

function fn1(p) {
	return p+'->'+a;
};

var fn2 = $local(fn1);

function scopeA() {
	var a = 'scopeA';
	WScript.echo(fn1('fn1: scopeA'));
	WScript.echo(fn2('fn2: scopeA'));
	(function scopeB() {
		WScript.echo(fn1('fn1: scopeB'));
		WScript.echo(fn2('fn2: scopeB'));
	})();
}

var a = 'global';
WScript.echo(fn1('fn1: global'));
WScript.echo(fn2('fn2: global'));
scopeA();
上記は関数内から変数 a の値を取得するサンプルコードである。fn1、fn2 ともに同一のコードであるが、fn1 は常に "global" を返すのに対し、fn2 は動的スコープになっている。つまり fn2 は呼び出し側のスコープを参照可能ということである。動的スコープの概念についてはこちら


JSCript > Include コンポーネント

JScript で文字列内の変数を展開する関数を作ってみた

2012-04-20 21:11:21 | Programming > JScript
はじめに
文字列の連結が込み入ってくるとソースコードの可読性が落ちる。
var url = 'http://' + hostname + '/image/' + id + '.cgi?w=' + x + '&h=' + y;
こういった記述法は連結後の文字列がイメージしにくいのが欠点である。JScript の用途からすれば、やはり見やすさも考慮しておきたい。例えば Perl では以下のように文字列に変数を埋め込み、それを展開させることができる。
http://${hostname}/image/${id}.cgi?w=${x}&h=${y}
直感的なわかりやすさではこちらのほうが上である。$q は JScript でこれを実現するための関数である。


Include コンポーネント
基本的な機能の紹介やダウンロード先は Include コンポーネントのページを参照のこと。

構文
Include コンポーネントをアクティブ化することで $q という変数展開用の関数が使えるようになる。
($=new ActiveXObject('JScript.Include'))(this);
var url = $q('http://${hostname}/image/${id}.cgi?w=${x}&h=${y}');

上記の場合、$q を呼び出したコンテキストにおいて hostname, id, x, y という変数の値が参照され、文字列中の変数部分が置き換えられる。未定義の変数はエラーとなるので注意。


パース
添え字にも対応できるよう変数のパースは緩めに作ってある(実際はコードとして認識できれば変数以外でも可)。
($=new ActiveXObject('JScript.Include'))(this);
var url = $q('http://${hostnames[0]}/image/${idlist[i]}.cgi?w=${rect[0]}&h=${rect[1]}');


スクリプト コントロール化が必要な理由
なぜスクリプト コントロール化が必要なのか。まずは Include コンポーネントに実装されている $q 関数をスクリプト上で定義した場合、どのような挙動を示すか確認してみる。
function $q(str) {
	return str.replace(/\${([^{}]+)}/g, function ($0, $1) {
		return eval($1);
	});
}

function scopeA() {
	var a = 'scopeA';
	var txt = $q('scopeA の変数 a の値は ${a} です。');
	WScript.echo(txt);
}

var a = 'global';
var txt = $q('global の変数 a の値は ${a} です。');
WScript.echo(txt);
scopeA();
このコードを実行すると変数 a の値はいずれも "global" となる。$q 関数はグローバル コンテキスト上で定義されているため、そのスコープチェーン(変数オブジェクトのリスト)は常に「$q 関数の Activation オブジェクト -> グローバル オブジェクト」となる。scopeA 内で $q 関数が呼ばれた場合、$q 関数の eval で参照してほしいのは scopeA のローカル変数であるが、scopeA の Activation オブジェクトは $q 関数のスコープチェーンに含まれないため、$q 関数が scopeA のローカル変数を参照することはない。ではどうするか。
function $q(str) {
	return str.replace(/\${([^{}]+)}/g, function ($0, $1) {
		return eval($1);
	});
}

function scopeA() {
	eval($q.toString());
	var a = 'scopeA';
	var txt = $q('scopeA の変数 a の値は ${a} です。');
	WScript.echo(txt);
}

var a = 'global';
var txt = $q('global の変数 a の値は ${a} です。');
WScript.echo(txt);
scopeA();
上記は scopeA 内で eval を使って $q を再定義する一行を追加し、スコープチェーンに scopeA が含まれるようにしたものである。こうすれば一応期待通りの動作は得られる。関数ごとに $q を再定義というのはコーディングとしてスマートではないが、JScript だけで実現しようとするとこうする他ない。そこでスクリプト コンポーネントを利用する。
($=new ActiveXObject('JScript.Include'))(this);

function scopeA() {
	var a = 'scopeA';
	var txt = $q('scopeA の変数 a の値は ${a} です。');
	WScript.echo(txt);
}

var a = 'global';
var txt = $q('global の変数 a の値は ${a} です。');
WScript.echo(txt);
scopeA();
$q 関数をコンポーネント側で定義し、それをスクリプト側から呼び出すと $q 内の eval が辿るスコープチェーンはコンポーネント側の $q のスコープチェーンではなく、呼び出し元コンテキストである scopeA のスコープチェーンとなる。これはコンポーネント側のスコープチェーンがスクリプト側のそれとは独立していることに起因する。つまり $q 関数はこの仕様を逆手にとり、動的スコープを実現している。スコープの独立性という点からすれば、スクリプト コントロールを使っても同様のことができると思われるが、コーディングの煩雑さを考えれば、あらかじめスクリプト コンポーネントを使ってモジュール化しておくほうが得策だろう。


JSCript > Include コンポーネント