September 27, 2013

Bootstrapのプログレスバーの移動速度を変更する

BootstrapのCSSを見てみると
.progress-bar {
... 略 ...
  -webkit-transition: width 0.6s ease;
          transition: width 0.6s ease;
}
とあり
.progress-bar {
    -webkit-transition: width 0s ease;
    transition: width 0s ease;
}
のように、適当な場所でオーバーライドすれば変更出来ました。0にすると即時に移動する感じになりました。

参考:
http://stackoverflow.com/questions/12320669/how-do-you-animate-a-twitter-bootstrap-progress-bar-smoothly

JSでSoundCloudの曲を再生して、duration(総再生時間)を自動で取得、position(現在再生時間)も自動で取得する

前回、簡単な再生、一時停止、停止等のサンプルを書きました。
http://madroom-project.blogspot.jp/2013/09/javascriptsoundcloud.html

今回は、duration(総再生時間)とposition(現在再生時間)を自動で取得するメモです。先にサンプルです。
SC.stream('/tracks/293', {
    autoPlay: true,
    onload: function() {
        console.log(this.duration);
    },
    whileplaying: function() {
        console.log(this.position);
    }
});
autoPlayは、その名の通り自動再生フラグです。上記のソースをそのまま書いてしまうと、完全に自動で再生されてしまいます。再生ボタン押下イベントのコールバック等にすると良いと思います。

autoPlayをtrueにすると曲のローディングは自動で開始され、ローディング完了と思われるタイミングでonloadの処理が行われました。前回の記事で、ローディングに合わせてdurationが増えているようだと書きましたが、onloadで取得すれば一定でした。

whileplayingは、再生中、何度もコールされます。ですのでpositionは増えていきます。autoPlay、onload、whileplayingを組み合わせると、再生時間のプログレスバーを作成できそうです。尚、再生開始のタイミングとローディング完了のタイミングは全く別であることには注意が必要で、実は上記のサンプルだとonloadよりも先にwhileplayingが実行されました。(この辺はうまく調整しないと。。。)


ドキュメント(SoundManager 2)
http://www.schillmania.com/projects/soundmanager2/doc/


--
追記:
autoPlayフラグではなくautoLoadフラグを用いてローディングだけ自動で開始させ、onloadでdurationを取得しつつ再生(this.play()です。)できました。この方法であれば、whileplayingの初回実行は必ずonloadよりも後になります。

September 25, 2013

JavaScriptでSoundCloudの曲を再生してみる

なかなかまとまった情報も無さそうなので、簡単にですが、調べてみました。先に、サンプルです。client_id値は置換して下さい。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SoundCloud TEST</title>
<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script src="http://connect.soundcloud.com/sdk.js"></script>
</head>
<body>

<button id="play">再生</button>
<button id="pause">一時停止</button>
<button id="stop">停止</button>
<button id="duration">総再生時間をコンソールに出力</button>
<button id="position">現在の再生時間をコンソールに出力</button>

<script>
// 初期化
SC.initialize({client_id: 'xxxxxxxxxx'});

// ストリーミングオブジェクト(?)
var s = null;
SC.stream('/tracks/293', function(sound){
    s = sound;
});

// 再生
$('#play').click(function() {
    s.play();
});

// 一時停止
$('#pause').click(function() {
    s.pause();
});

// 停止
$('#stop').click(function() {
    s.stop();
});

// 総再生時間をコンソールに出力
$('#duration').click(function() {
    console.log(s.duration);
});

// 現在の再生時間をコンソールに出力
$('#position').click(function() {
    console.log(s.position);
});
</script>
</body>
</html>
上記サンプルのポイントは
* SC.initialize()にクライアントIDを渡して初期化する
* SC.stream()のコールバックでストリーミングオブジェクト(という表現が正しいのかわからない...)をグローバルな場所に保存
くらいでしょうか。

尚、durationは、再生直後に取得した場合と、少し間をおいた場合とで、値が変わりました。ローディングに合わせて増えていくように見えました。

SoundCloudのドキュメントは以下です。
http://developers.soundcloud.com/docs/api/sdks#streaming

ドキュメントに記載されているように、SoundCloudのJSライブラリは、SoundManager 2というライブラリを用いているようです。
(これが結構がっつりしてる気がする...)

September 24, 2013

ReflectionClassでpublicではないプロパティやメソッドにアクセスするメモ

ユニットテストでpublicではないメソッドのテストをする際に、結構使えたのでサンプルのソースをメモしておきます。
// ReflectionClassでプロパティをpublicにして取得する
function getProperty($object, $propertyName)
{
    $reflection = new ReflectionClass($object);
    $property = $reflection->getProperty($propertyName);
    $property->setAccessible(true);

    return $property->getValue($object);
}

// ReflectionClassでメソッドをpublicにして取得する
function getMethod($object, $methodName)
{
    $reflection = new ReflectionClass($object);
    $method = $reflection->getMethod($methodName);
    $method->setAccessible(true);

    return $method;
}

// publicではないプロパティとメソッドを持つクラス
class Foo
{
    private $bar = 'BAR';

    private function baz($arg)
    {
        return strtoupper($arg);
    }

}

// インスタンス
$foo = new Foo;

// エラーになります
// Fatal error: Cannot access private property Foo::$bar ...
echo $foo->bar;


// エラーになります
// Fatal error: Call to private method Foo::baz() ...
echo $foo->baz('test');

// 'BAR'と表示されます
echo getProperty($foo, 'bar');

// 'TEST'と表示されます
echo getMethod($foo, 'baz')->invokeArgs($foo, ['test']);

September 20, 2013

JSDuckでCoffeeScriptから生成したJSファイルのドキュメントを生成するメモ

メモです。

JSDuckは"/** ... */"の内容からドキュメントを生成するらしいのですが、CoffeeScriptのブロックコメントである"### ... ###"だと"/* ... */"になってしまいます。なので、CoffeeScriptのブロックコメントを"###* ... ###"にすればOKでした。
https://github.com/senchalabs/jsduck/issues/12