ニコニコ静画RSS運用終了

どうも3日ほど前からニコニコ静画にアクセスできなくなってたらしく、更新情報が作成できなくなっていたので、ニコニコ静画RSSのrss.phpをリネーム&削除しニコニコ静画RSSにアクセス出来ないようにしました。
(コミットログを見る限り)2011年12月5日に開発が始まり、丸3年運用してたことになるようです。
サーバーでw3mでアクセスしてもダメだったので、IPアドレスかドメインレベルで封じられてる模様です。ここで封じられたらもうどうしようもないので、再開はできないと思います。
正直、アカウント停止は覚悟してたけどアクセスごと封じられるとは思わなかった。
もっとも、先月頃からろくにログインもできなくなっていましたけど。(アカバンではなく、Cookieの仕様が変わったため。)
「俺んところで運用してやる」という方がいらっしゃいましたら、ソースを渡しますので、ご連絡ください。(居るかなぁ…)

javascriptのプラグイン機構のメモ書き

サーバーの負荷監視にプラグイン的な機構を付けたいと思ったんで、Javascript側の実装のメモ書き。
index.html
[javascript]
<script type="text/javascript">
<!–
/**
* プラグインインターフェース
*/
plugin = function(){}
// –>
</script>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="loadAverage.js"></script>
<script type="text/javascript">
<!–
$(function(){
//プラグインの実行
for (element in plugin){
if(eval(‘plugin.’ + element + ‘.init !== undefined’)){
eval(‘plugin.’ + element + ‘.init();’);
}
}
});
// –>
</script>
[/javascript]
loadAverage.js
[javascript]
/**
* loadAverage取得
* @date 2014/01/11
* @author まっちゃん
*/
(function(plugin){
plugin.loadaverage = function (){}
plugin.loadaverage.tabName = ‘LoadAverage’;
plugin.loadaverage.tabTitle = ‘LoadAverage’;
plugin.loadaverage.init = function (){
alert(‘ok’);
}
})(plugin);
[/javascript]
jqueryは$()の実行に要るだけなので、別の手段があるのなら別に無くてもいい。
pluginというクラス(オブジェクト)を定義して、プラグインのJSを読み込み。
プラグインのjsはplguinオブジェクトにどんどんメンバを追加していく。
ひと通り定義が終わったら、for inでメンバを列挙して取り出せたメンバの中にinitメンバがあったら実行。
for inでelementにはメンバ名が入ってるようなので、eval使って
[javascript]
eval(‘plugin.’ + element + ‘.init();’);
[/javascript]
としないとダメっぽい。

libexif使ってみた

カメラを縦にして撮ると、PCでみた時大抵のビュワーだと写真が横になるので、フォルダごとドラッグアンドドロップしたら中にあるjpgファイル手当たり次第に調べて回転してる写真は正しい向きになるように修正するツールがあると便利だなと思ってちょっと調べてみた。
回転情報はExifに記録されてるようなので、Exifで回転情報を調べて必要ならImageMagickで回せばいいやとなり、Exif操作ライブラリのlibexifを導入。
[cpp]
/**
* main.cpp
* exifのorientation情報取得
* @date 2014/01/02
* @author まっちゃん
*/
#include <libexif/exif-data.h>
#include <iostream>
int main(int argc, char *argv[]){
if(argc < 2){
return 0;
}
//Exif読み込み
ExifData *exifData = exif_data_new_from_file(argv[1]);
if(exifData == nullptr){
return 0;
}
//オリエンテーション情報取得
ExifEntry *entry = exif_content_get_entry(exifData->ifd[EXIF_IFD_0], EXIF_TAG_ORIENTATION);
int orientation = 0;
if(entry != nullptr){
std::cout << exif_get_short(entry->data, exif_data_get_byte_order (entry->parent->parent)) << std::endl;
}
exif_data_unref(exifData);
return 0;
}
[/cpp]
exif_data_new_from_fileに読み込むjpegファイルのパスを渡してExifData構造体のポインタを取得。
exif_content_get_entryでIFD0に入ってるORIENTATIONデータを取得。これが回転情報。
サンプルを見るとexif_entry_get_valueで取得するように見えるけど、これで取ってくると「左上」とか扱いに困るものが帰ってくるので、exif_get_short(entry->data, exif_data_get_byte_order (entry->parent->parent))で回転情報を取得。
最後にexif_data_unrefでexifデータを解放して終了。
で、ここまで調べて書いたところで、ImageMagickでその辺処理できることが判明してちょっと凹む。
libexifはなんか違うときに使おう。

clang3.2.1でstd::threadを使う時の注意

個人的メモ書き。
Ubuntu13.04のclang++ version 3.2.1でstd::threadを使うコードを書いた。
[cpp]
#include <iostream>
#include <thread>
void threadFunction(){
for(int i = 0; i < 10000; i++){
std::cout << "thread " << i << std::endl;
}
return;
}
int main(){
std::thread thr(threadFunction);
for(int i = 0; i < 10000; i++){
std::cout << i << std::endl;
}
std::cout << "thread end" << std::endl;
thr.join();
return 0;
}
[/cpp]
で、これを

mattyan@U24E:~$clang++ -g -std=c++11 threadtest.cpp -o threadtest -lpthread

でビルドして実行しようとしたら、

mattyan@U24E:~$ ./threadtest
pure virtual method called
terminate called without an active exception
中止 (コアダンプ)

と出て例外を吐いて落ちた。
ググってみたところどっかしらバグってるらしくて

mattyan@U24E:~$ clang++ -g -std=c++11 threadtest.cpp -o threadtest -lpthread -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8

こうしないといけないらしい。
追記:MinGW gcc 4.7.2はthreadが封鎖されているようだ…boost::thread安定か。

PixivRSSのログを解析してみた

ちょっと気になったこともあったので、PixivRSSのログを見てみた。

解析内容

・ユーザーエージェント(何を使って見ているか)
・タグ検索(何を見ているか)

前提

内容ごとにバラバラにデータをとっているため、「誰が」「何を」「何を使って」見ているかという情報はわからない。

解析方法

grep | sed | sort | uniqで重複なしのソート済みテキストを作成して、流し見。

解析対象

2013年6月10日のPixivRSSのログ

ユーザーエージェント

685種類(内、GoogleReaderだけで642種類。GoogleReaderを除けば43種類。)
GoogleReaderは来月止まるから放っとくとして、それ以外にもHatenaやYahoo Pipe,livedoor,tinytinyrssなどWebサービスが多かった。(と言いつつ自分もtinytinyrssユーザー)
デスクトップ用としては、各種ブラウザとWindows-RSS-Platform/2.0があった。どっちかわからないのが「Ruby」。Webサービスなのかデスクトップアプリなのか…
Windows XP+IE6という組み合わせらしきアクセスも。大きなお世話になるが、更新した方がいいぞ…

タグ検索

2桁程度ならどんな割合か出そうかと思ったけど、809種類あるんで諦めた。
パッと見た感じ「○○users入り」が多い。あとはR-18系。
意外と英語も混じってる。かと言って外国人が使ってるとは限らないけど。そのへんはIPアドレスから引いてこないとわからんし。

感想

「これ、どうせ俺か多くても数人だろう」とか考えてログ見てみたら、ユーザーエージェント基準で40人以上。GoogleReaderのfeed-idの基準がよくわからないけど、一人1個なら600人ってところか…バグ修正ミスるとこの人達全員に迷惑がかかるのか…((((;゚Д゚))))ガクガクブルブル
これサーバーからダウンロードするのに30分かかったからもうやらない。次やるときはサーバーサイドで欲しいデータ全部作ってからダウンロードすることにする。
以下ログデータ。結構膨大かつ一部R-18データに注意。
続きを読む PixivRSSのログを解析してみた

OpenCVのキャプチャ画像をwxWidgetsのイメージ形式に変換してみた

OpenCVのCvCaptureで取得したIplImage構造体のデータをwxImageに変換する方法を調べたけどあんまり見つからなかったから作ってみた。
続きを読む OpenCVのキャプチャ画像をwxWidgetsのイメージ形式に変換してみた

絵チャ、始めました。

…と言っても俺が絵を描くわけではなく。
ちょっと前から作ってたお絵描きチャットアプリケーションがβテストという名の放置長期間連続稼動試験を終わらせて、正式版にバージョンアップ。
クライアント側にhtml5とjavascriptを、サーバー側にpythonを用いてWebSocket通信でリアルタイムにお絵かきするようなシステムにしてみた。
仕様上、アンドゥ,リドゥは無い。
URL http://mattyan.net/pictchat/
あと、zlib/libpngライセンスでソースコードも公開。
ただし、どこのサーバーにでも設置できるわけではなく、pythonプログラムを任意に実行できるなど制限あり。

絵チャを作ってみた

WebSocketを使ってお絵描きチャットを作ってみた。
クライアントサイドのcanvasタグ上でのマウスの動きをサーバーに送って、接続済みクライアント全員にばら撒くくらいの簡単なものだけど。
クライアントはhtml5とJavascriptで殆どを実装。
サーバーはPHPとphp-websocketを使って実装。
php-websocketのライセンス文を見るといきなりFuck youとか言われるけど、よくよく読んでみると「PUBLIC LICENCEなんて糞食らえ」っぽいからそのまま採用。
簡単な仕様でクライアント側はhtml5ネイティブのおかげか、Androdid上のfirefoxでも動作。絵は描けないけど、ログ再生とチャットと他人が描いてるのを見てることくらいは可能。
昨日1日でGUI作って今日サーバーと細かい部分を実装。実際に絵を描く友だちに試してもらって意見もらいつつ調整。
深く設計せずに思いつきで作ったのを早速後悔中…この分だと将来的に修正できなくなる…
早速もらった要望を検討すると、今の仕様だと無理っぽいことが判明。さぁてどうするか…
あとサーバーが若干不安定だからそっちも直さないとな。
つうか、JavascriptからWacomの筆圧検知できるのか…レイヤーはcanvasタグを重ねるとしてカラーピッカーは…