chrome Web Store のDL数は何時更新されるのか?

google chromeの拡張機能を提供するweb store。そこには「ユーザー数」、デベロッパーダッシュボードでは「一週間のユーザー数」が表示されます。

最初は「これ減らないから累計じゃねーの」と思ったのですが、ログを取ってみた所減ることもあるので 一週間のユーザー数で正しいようです。

このユーザー数、リアルタイム更新ではないのですが、じゃあ何時更新されるのかが気になります。
そこで数日ログを取ってみました。集計は1時間ごとです。
00:02:01
01:28:27
03:10:08
23:50:02
01:58:58
00:41:03
00:25:04
04:32:03
03:50:03
04:50:30
00:10:58
02:50:13
03:34:09
04:08:34
二週間のサンプルだと、00時~3時の間に更新されるようです。日本時間ね
また、同一アカウントで複数の拡張を公開していますが、全て同じタイミングでした。国際化し英語をデフォルト言語としている拡張もありましたが、同じでした。
しかし、見れる情報がDL数だけなのはちょっとな。せめて今までのログを表示して欲しい。analyticsと連携させれば出来るのかな。
投稿日時:2012/05/19(土)2:30 0件コメント

GooglechromeでページのURLを列挙する方法

一平くんと金太 - Togetter
こりゃ可愛い。着ぐるみは小さいと可愛さが加速度的に増していく。
よし保存保存っと・・・でも画像が多くて面倒だな。さてどうやってURLを取るか。
今までは一つ一つクリックするか、ソースを開いて秀丸で正規表現を使って抽出していたけど、デベロッパーツールとquerySelecterAllを使う方法を思いついた。
querySelecterAllは便利で便利でよく使うけど、ここでも活躍。

エレメントタブでセレクタを確認すると、".list_photo a"がセレクタらしい。
単純に書くとこうなるが
var e,i;
e=document.querySelectorAll(".list_photo a");
for(i=0;i<e.length;i++){
  console.log(e[i].href);
}
毎回これを書くのはちょっと長い。shift+enterで改行を入れるのも面倒。
コンソールでは独自の関数が使えるから、
document.querySelectorAll(".list_photo a");
//↓短縮
$(".list_photo a");
この様に短縮出来る。
  console.log(e[i].href);
  //↓短縮
  dir(e[i].href);
これでよし。コピペ出来ればそれでいいのだ。
多少のエラーは無視しても構わないからループも短く。
for(i=0;i<e.length;i++){
//↓短縮
for(i in e)
変数の宣言も取り除いて、ここまでを反映させると
o=$(".list_photo a");
for(i in o){
 dir(o[i].href);
}
一行で書くと
o=$(".list_photo a");for(i in o){dir(o[i].href);}
こうなる。これくらいならタイプするのも苦じゃないと思う。 URLを列挙出来れば、後は煮るなり焼くなり、時は金なり。
投稿日時:2012/05/13(日)0:02 タグ: 0件コメント

ZeroWatch、今後の対応について に、ついて

使いにくい使いにくいと評判のニコニコ動画Zeroの動画プレイヤー ZeroWatchですが、公式でアナウンス出ましたね!
結果、下記の項目について、
優先度をあげて見直す必要があると判断いたしました。

プレーヤーコントロールの表示方法
投稿者による動画説明の表示方法
タグの表示方法
ニコニコ市場の表示方法
コメント一覧と動画を合わせた表示方法
左右パネルなどプレイヤーまわりの挙動

ほうほう。どこが変わるのかな、画像で見てみよう。

えーと、ニコニコ動画Zero2は、ニコニコ動画何番目のバージョンになるのかな?

次バージョンが楽しみだ。


投稿日時:2012/05/10(木)7:16 タグ: 0件コメント

ニコニコ動画Zeroのプレイヤーから操作部分を取り出す

初期のニコニコ動画Zeroはコメント記入欄と動画コントロールバー(再生と音量とか)が両方とも動画領域の中にあった。
苦情が殺到したかは定かではないが、コメント記入欄は動画領域の下、以前の位置に戻ったものの、コントロールバーはいまだ動画領域の中に閉じ込められている。

幸い、ニコニコ動画Zeroはjsでかなりの操作が可能となったのでコントロールバーをそのままhtmlとして移植してみた。
これでflashは動画とコメントを表示するだけになった。

対応ブラウザはchromeに限定しました。Firefoxもと試してみたのですが、input type="range"がまだ対応していないらしい。
html5で色々な入力フォームが増えたのに、対応が遅いのはとても残念。何を差し置いても真っ先に対応して欲しい。特にinput dateとか。ブラウザから日付を入力させるのって本当に面倒なんです。
一応コードをuser.js形式でgithubに置いておくから、どうしても使いたい人や改造したい人、将来fireFoxがrangeに対応した時に希望を託す人はどうぞ。

input rangeで何をしたかと言うと、シークバーと音量バーに使った。
ただ、音量バーはともかくシークバーは一行のラインに現在の再生位置と読み込み量の二つを表示しないといけないので、cssを使った。
rangeタイプもCSSで外見を変えられるから、つまみで再生位置、背景で読み込み量を表現する事にした。

#zeroController2 input[type='range']::-webkit-slider-thumb{
	-webkit-appearance:none;
	width:10px;height:20px;
	background-color:#FFF;
	border:solid 1px;
}
#zeroController2 input[type='range']{
	-webkit-appearance:none;
	margin:0;
	background-color:red;
	background-image:-webkit-gradient(linear,right top,left top,color-stop(0,#CCC),color-stop(0.5,#CCC),color-stop(0.5,#0AA),color-stop(1,#0AA));
	height:15px;
	float:left;
}
外見が完成した動画プレイヤーの下に表示するコントロールバー。この状態でhtmlとCSSは完成していて、これを視聴ページの狙った場所にコンテンツスクリプトで追加し、スクリプトからイベントを追加する。
全てを囲むdivのIDにだけ気をつけて、スタイルシートも全てそのIDのみ適用させる。
コンテンツスクリプトで動かせるのはjavascriptだけだから、このhtmlをjsの変数に入れる。
今まではcreateElementで作ったりもしていたが、ここまでくるとやってられない。
javascriptにヒアドキュメントは無いから
here='あいうえお\
かきくけこ';

行末にエスケープを書くと一行扱いする方法を使う。これも面倒だけど正規表現で一発で出来るからマシ。
再生する、停止するなどの命令はjs一行で出来るけど、今の状態をリアルタイムで表示するのが手間取った。
公式でイベントを用意してくれればいいのだが、見つからなかったのでsetIntervalをしている。
WatchApp.namespace.model.player.NicoPlayerConnector.updatePlayerConfigを使うループやミュート、ボリューム関連の変更はレスポンスがとても遅い。
これは直接フラッシュへオプションを渡しても変わらないから、手の施しようがない。
個人的には、シークバーさえ操作出来ればいいから優先度は低い。
また、Zeroプレイヤーはイベントによってそのサイズが多種多様に変化するが、これもjsからの操作が調べきれなかった。
プレイヤーサイズを変更させる命令は

WatchApp.namespace.model.player.NicoPlayerConnector.playerScreenMode.changeMode("normal");
//"monitorFull","browserFull","normal","medium","small","notFull";
と分かっているのだが、smallが成功しない時がある。
恐らく、サイズの状態は一つではなく複数のオプションを設定する必要があるようだ。
と言うのも、プレイヤーのサイズらしき値が入っている変数が4つもあり
WatchApp.namespace.model.player.NicoPlayerConnector.playerScreenMode._mode;
WatchApp.namespace.model.player.NicoPlayerConnector.playerScreenMode._size;
WatchApp.namespace.model.player.NicoPlayerConnector.playerScreenMode.lastPlayerSize;
WatchApp.namespace.model.player.NicoPlayerConnector.playerScreenMode.mode;
同じ状態でも前の状態によって値が異なる。
全パターン試して表に纏めれば何か見えてくるかもしれない。
以上がコーディングの話。
次はchromeExtensionにする為に名前や説明文、アイコンを作る。
私のニコニコ関連の拡張は、何の拘りか「ニコニコ 漢字 カタカナ」で統一している。
こうして今回の拡張機能ニコニコ追加コントローラーが完成した。

2012-05-13追記 以前のはてブ
投稿日時:2012/05/09(水)13:04 タグ: 2d件のコメント

ニコニコ動画のwatch.jsについて

ニコニコ動画Zeroの視聴ページ(/watch)で読み込まれているスクリプトファイルhttp://res.nimg.jp/js/watch/watch.js
常に読み込まれるこのファイルには膨大な情報が収納されていた。

そもそも、ニコニコ動画Zeroは動画再生部分にしかフラッシュを使っておらず情報の大半をjavascript上で処理している。
そこでjsの調査を進めていたのだが、jsから直接動画プレイヤーを叩ける情報を手に入れ、調査が進んだ。
動画の長さを取得するには
WatchApp.namespace.model.player.NicoPlayerConnector.getVideoLength();
とコンソールで叩けば出てくる。
この処理は可読化したwatch.jsの
WatchApp.namespace("model.player", function () {
//中略
	b.getVideoLength = function () {
		return 1E3 * $("#external_nicoplayer")[0].ext_getTotalTime()
	};
//後略
	return b
}, "NicoPlayerConnector");
の部分に相当。
つまり、namespaceメソッドの第一引数、第三引数をプロパテイにする事で、第二引数の戻り値にアクセス出来る訳。
これを応用すれば、
WatchApp.namespace("model.player.comment", function () {
	var b = function () {};
	b.MAIN = "commentlist:main";
//中略
	return b
}, "CommentListNames");
の"commentlist:main"を呼び出したい時は
WatchApp.namespace.model.player.comment.CommentListNames.MAIN
と書けば呼び出せる。
watch.jsは可読化して1万3000行もある膨大なファイルだけど、これだけの情報があるとなるとやる気が出てくるものだ。
html5版動画プレイヤーもあるし、その内ごっそり視聴ページを書き換える拡張機能等が出てきそう。
しかし、ニコニコ解析まとめwikiなりスレなりが欲しいんだけど、どこかにあるんだろうか。今はトゥイッターでニコニコ javascriptで検索したりしているんだけど。
2012-05-09追記
ニコニコ動画Zeroのjsに関して、ニコニコ動画Zeroのプレイヤーから操作部分を取り出す でも調査を行いました。
2012-05-13追記
以前のはてブ
投稿日時:2012/05/08(火)3:56 タグ: 0件コメント

フルアニMAXの8日間の有料動画の再生数の伸び

みんな大好きフルアニMAX。毎週無料動画が更新されますが、課金は基本と言う通り「言っておくが金ならないぞ。それと、無料動画を見ておいてこんな事を言うのもなんだが、もっとアニメを配信してもらおう!」とはなかなかいきません。
そこでフルアニMAXで配信されている動画の2012年04月29日~2012年05月07日の8日間、動画の再生数、コメント数、マイリスト数の伸びを調べました。
一週間の7日感でないのは忘れていたからです。

省略された部分を全て読む»
投稿日時:2012/05/07(月)2:26 タグ: 0件コメント

拡張機能を一通りニコニコ動画Zeroに対応

ニコニコ直ダウンローダー
ニコニコ最前面コメント
ニコニコ除ニコレポ
の3つの拡張機能をニコニコ動画zeroに対応させました。もちろん原宿にも対応しています。

 

順番に開発後記を。先ずはダウンローダー。
ぼつぼつストリーミングサーバーが存在してきたので、公式配信モノがストリーミングに置き換わったらどうしよう と心配していましたが
その心配もなく今までどおりDL出来ます。
動画のタイトルやタグが取得できなくなったかと焦りましたが、/watchの下の方に書いてありました。
contentScriptでは、#watchAPIDataContainerのinnerTextを取ってJSON.parseすれば色々取れます。
オブジェクトで一気にあれこれ取れるので、見つけてからはラクチンでした。
今までは投稿の秒数は取得できなかったけど(もしかしたらスレッド番号で取れたかも)、秒数も取れるようになりました。
視聴ページを開いて、console.log(JSON.parse(document.querySelector("#watchAPIDataContainer").innerText));で取れると思います。
ユーザー投稿動画、運営投稿動画チャンネル投稿動画の三種類で確認しました。

 

先にニコレポ。
レイアウトは当然変わりましたが、ニコレポの内容はほぼ変化なし。ニコると動画レビューの項目が追加されただけかな。

 

最後に最前面。
これが最難関でした。原宿はaddVariableを上書きしてやればよかったのですが、Zeroでは出来ませんでした。
最前面の情報も前述の#watchAPIDataContainerに書いてあるのですが、最初に読み取ってグローバルオブジェクトに放り込んでるらしいんですよね。
グローバルオブジェクトを消して、無理やりjsを再読み込みさせると、DOMエレメントに対して二重に初期化され、コメント欄が消えたりして上手く行かず。
グローバルオブジェクトのどこに属性が記録されているかを調査したのですが、スキル不足で分かりませんでした。
結局、関数を切り貼りしたら無事動いたので、それでリリースしました。

 

動画プレイヤーの下にある動画のサムネイルから動画を切り替え出来ますが、結局ページを移動しているだけでした。
何が原点回帰なのか知らんけど、また慣れるかな。
ユーザに叩かれてレイアウトが変わるのが一番怖いということで。


投稿日時:2012/05/02(水)0:15 タグ: 3d件のコメント

phpとwindowsと日本語ファイル名で回避できない問題

mb_convert_encoding('日本語','sjis-win','UTF-8');
これでOK!という話ではありません

環境はwindows7 64bit+php 5.4.1。
この環境で"C:\ソースコード\test.php"にprint"hello world.";と書き込み実行します。
すると"Could not open input file: C:\ソースコード\test.php"と表示され、そもそもphpがファイルを読み込む事すら出来ていません。

つまり、典型的なダメ文字の症状です。
phpが英字が基本のwebサーバーで扱うことを前提としているとは言え、流石に困ったものです。


投稿日時:2012/05/01(火)6:16 タグ: 0件コメント

gist.githubがなかなか良い

望んでいた機能がここにある
https://gist.github.com/
embedも使える?


投稿日時:2012/04/06(金)21:25 タグ: 0件コメント

background_pageとoptions_pageは違う

バックグラウンドページ、オプションページ、コンテキストメニュー初期化スクリプトはこんな感じです。
chromeを起動して拡張が読み込まれた時も、オプションページを開いた時も、コンテキストメニュー初期化処理を実行させたくてこう書きました。

ところが、拡張を有効にした時はコンテキストメニューがちゃんと表示されるのですが、オプションページでコンテキストメニュー関連の設定を変更し、コンテキストメニューを初期化するとコンテキストメニューをクリックしても登録した関数のclick()が実行されません。

数分悩んだのですが、拡張を有効にした時はバックグラウンドページでコンテキストメニューの初期化処理が実行され、コンテキストメニューがクリックした時はバックグラウンドページでclick()が実行されます。
ところが、オプションページで再度コンテキストメニュー初期化処理を実行し、コンテキストメニューをクリックすると、オプションページでclick()が実行され、オプションページにclick()が無いのでエラーとなっていました。

この現象を改善するには、オプションページからではなく、バックグラウンドページでコンテキストメニュー初期化処理を実行させる必要があります。
そのためには、オプションページでchrome.extension.sendRequest({},function(){});の通信を行うと無事オプションページからバックグラウンドページに通信が行われ、バックグラウンドページでコンテキストメニューの初期化が行われ、コンテキストメニューをクリックした時にはバックグラウンドページのclick()が実行されました。


投稿日時:2012/04/03(火)5:02 タグ: 0件コメント