VirtualBoxにArchLinux入れてDocker入れてみた

ホームページのサーバーのOSのEOLが近づいてるのもあって次のサーバー環境をどうしようか検討中。
で、試しにArchLinux + DockerVirtualBoxに入れて遊んでみた。

ArchLinuxのインストール

archlinuxをVirtualBoxにインストール(1)(cocoa-tips.com様)を見てVirtualBoxにインストール。
再起動時に

 no such device ad41~

のエラーが出たけど、DVDイメージから入りなおして
[bash]
packam -S linux
[/bash]
で解決。

Dockerのインストール

[bash]
pacman -Ss docker
[/bash]
で探したら

community/docker 1:1.6.2-2
    Pack, ship and run any application as a lightweight container

とあっさり出てきたので
[bash]
packman -S docker
[/bash]
でサクッとインストール。
[bash]
docker search arch-linux
[/bash]
でArchLinuxのイメージ名探して
[bash]
docker run base/archlinux /bin/echo hello
[/bash]
で実行してみたら

Unable to find image 'base/archlinux:latest' locally
Pulling repository base/archlinux
dce0559daa1b: Download complete
511136ea3c5a: Download complete
9b0516337e5a: Download complete
Status: Downloaded newer image for base/archlinux:latest
hello

なんかできたっぽい。

オープンソースカンファレンスと小田急海老名車両基地一般公開に行ってきた

朝からオープンソースカンファレンスに行ってきた。
9時半位に中央大学・明星大学駅について30分ぐらい時間つぶしてから突入。したんだけど、開場10時の開催11時だったからほとんど準備中だったため、電車乗る前に買ったラノベ読んで待機。
11時から色々見て回って(今回もToshibaのFlashAirのゲームは失敗した(´・ω・`))12時頃に昼飯食って離脱。
その足で新百合ヶ丘経由で海老名の小田急海老名車両基地一般公開へ。
今年は3000形の公開はやっていなかったので真っ先に第1会場の車両展示へ。
事業用車両とMSE,4000形,16000系撮ってたところを相鉄のモヤ700が通過していったけど、場所が悪くてあまり撮れなかった…


その後少し見て回って14時頃に離脱。
明日は中央線撮りに行こうかな。

ニコニコ静画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のログを解析してみた