2013/07/30

[three.js] PerspectiveCameraの属性をイジる。

Three.jsには、Cameraがあります。
そこから派生した2つのカメラオブジェクト、
それぞれ、「正射影カメラ」、「透視投影カメラ」と呼ばれているようです。
今回は、後者のPerspectiveCamera、すなわち、「透視投影カメラ」のパラメータを弄ってみました。

Perspective Camera

人間の目で見えるように描画する。
つまり、同じ大きさの物体であれば、カメラから近いものほど大きく、遠いものほど小さく見える。

Perspective Cameraのパラメータには、

fov
field of view. y軸(縦)方向の画角(視野角)。
コレが大きいと、いわゆる広角になり、小さいと望遠になる。
aspect ratio
描画空間(xy面)のアスペクト比、つまり横/縦。
near
描画空間(手前側の面)の視点からの距離
far
描画空間(奥側側の面)の視点からの距離

があります。
これらの組み合わせが、描画する空間にどう作用するのかを確認するため、右のようなパラメータをイジる画面を表示するコードを書いてみました。

結果は、 let's play with cameras!にあります。
WebGLに対応したブラウザで見ていただければ、と思います。

2013/07/19

[three.js] Three.jsを使った最初のサンプル

一度は断念した Three.js を再び触り始めました。
上記サイトの documentation にある

というページにある超簡単なコードを書いてみました。結果は、 で確認できます。
WebGLに対応したブラウザで見ていただければ、と思います。

2013/07/16

[emacs] LESSのためのless-modeを導入!

など、CSSメタ言語(というのか)を利用する機会が増えています。
twitter-bootstrapは、LESSで書かれているし、 ExpressではLESSやStylusが使えます。
ということで、僕のemacsにもLESSを扱いやすくするlispを追加してみました。
ちなみに、SassとStylusに関しては、
[emacs] scss-mode
[emacs] jade-mode, stylus-mode
を見ていただければ、と思います。

LESSのlispは、

があります。 前者は、css-modeに依存しており、僕のemacsでは適切なcss-modeがインストールできず使えなかったため、 (次のような警告が出ました。 Wrong css-mode.el: please use the version by Stefan Monnier, bundled with Emacs >= 23.) 後者をインストールしました。

less-modeをダウンロードして、~/.emacsに、

(add-to-list 'load-path "/path/to/less-mode.el")
(require 'less-mode)
とすることで、*.lessのメジャーモードがLessになりました。 インデントも問題無さそうです。

2013/07/13

[fluentd] nginxのアクセスログをfluentdからmongodbに!

前々から気になっていたfluentdをようやく試しました。 fluentdは、rubyで書かれたオープンソースのログ収集デーモンです。

今回試したのは、nginxのアクセスログ(ltsv)をfluentdを使ってmongodbに集める、ということです。 (ここでは、mongodbのインストール方法などは書きません。)

fluentdのインストール

fluentdにはyumパッケージ、debianパッケージ、ruby gemなどいくつかあって、 僕はgemをインストールしました。

 $ ruby --version
 ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
 $ gem --version
 2.0.3
 $ sudo gem install fluentd

fluentdの設定

ディレクトリ /etc/fluent を作って、初期化コマンドを実行します。

 $ sudo mkdir /etc/fluent
 $ sudo fluentd --setup /etc/fluent

ltsv用プラグイン(input)

nginxのアクセスログは、ltsv形式で出力しています。
(nginxのアクセスログをltsv形式にする方法は、[nginx]アクセスログフォーマットにLTSVを適用する。にあります。)
stanaka/fluent-plugin-tail-labeled-tsvを使用させて頂いて、簡単にltsvなアクセスログをfluentdのinputとして扱うことができました。
in_tail_labeled_tsv.rbというRubyファイルを/etc/fluent/pluginsに配置します。

mongodb用プラグイン(output)

fluentdの出力を、mongodbへ格納するためのプラグインをインストールします。
fluent/fluent-plugin-mongoです。

 $ fluent-gem install fluent-plugin-mongo

fluent.conf

inputとoutputの定義をfluent.conf(/etc/fluent/fluent.conf)に書きます。
今回は、nginxとfluentd、mongodbを同じホスト上で動かしています。
そのため、↓のようなファイルになりました。

/etc/fluent/fluent.conf


  <source>
    type tail_labeled_tsv
    path /usr/local/nginx/logs/access.log
    tag nginx.access
    pos_file /var/log/fluent/access.log.pos
  </source>

  <match nginx.access>
    type       mongo
    database   fluent
    collection nginx
  </match>

fluentdの起動

fluentdのupstart用スクリプトを書いて起動します。

/etc/fluentd.conf


description "fluentd upstart script"

start on (local-filesystem and net-device-up)
stop  on shutdown

respawn
respawn limit 5 60

script
  exec sudo -u somebody /usr/local/rbenv/shims/fluentd -c /etc/fluent/fluent.conf
end script

 $ sudo start fluentd

これでmongodbにアクセスログがmongodbに蓄積されました。

参考にさせて頂いたサイト。

2013/07/10

[nginx]アクセスログフォーマットにLTSVを適用する。

以前、nginxのアクセスログフォーマットについて書きました。 ログ収集のためのツールであるfluentdが広まっており、サーバーログなどの扱い方も変わってきているように思います。

そういった中で、LTSVという形式でログを出力させることで、ログをアプリケーションで扱いやすくするという方法が広まっているようです。
LTSVに関する説明として、LTSV FAQ - LTSV って何? どういうところが良いの?がとても参考になります。

LTSV形式でnginxのログを出力させる場合、nginxの設定ファイル(一般的には、nginx.conf)に次のように記述します。
(http ディレクティブに書きました。)


    log_format ltsv "time:$time_local"
                    "\thost:$remote_addr"
                    "\tforwardedfor:$http_x_forwarded_for"
                    "\tuser:$remote_user"
                    "\treq:$request"
                    "\tmethod:$request_method"
                    "\turi:$request_uri"
                    "\tstatus:$status"
                    "\tsize:$body_bytes_sent"
                    "\treferer:$http_referer"
                    "\tua:$http_user_agent"
                    "\treqtime:$request_time"
                    "\tcache:$upstream_http_x_cache"
                    "\truntime:$upstream_http_x_runtime"
                    "\tapptime:$upstream_response_time"
                    "\tvhost:$host";



各項目のラベルは、上述のLTSVのサイトで推奨されているラベルを使っています。
そして、このログフォーマットを適用したいserverディレクティブ内で、
  server {
    listen 80;
    # 略
    access_log logs/access.log ltsv;
    # 略
  }
のように指定し、nginxを再起動することで、LTSV形式のログが出力されます。