2016-02-21

MongoDB 地理空間インデックス

MongoDB にて地理空間のインデックスを作成したい。

インデックスの作成は通常の方法で行えるよう。

1# 初期状態のインデックスを確認 2$ db.places.stats() 3 4# インデックスを作成 5$ db.places.createIndex({Bar: "2dsphere"}) 6 7# 作成したインデックスを確認 8$ db.places.getIndexes()

これでplacesのインデックスがBarのフィールド内に昇順で作成される。
平面空間なら2d、球面空間なら2dsphereを使用するらしい。
今回は地球という球面空間の経緯度を記録する用途で使用するので、2dsphereとなる。
ちなみに以前よく使用されていた ensureIndex() は3.0からは非推奨となったよう。今後は基本的にcreateIndex() を使うらしい。

ただGeoJsonのデータと通常のインデックスの違いとしてフォーマットが正しくなければ作成できないようなので、下記Linterなどを使用して事前にコレクションがGeoJsonの仕様に準拠しているか確認したほうがよさそう。

2016-02-21

MogoDB 3.0 => 3.2

開発環境のMongoDB(3.0)を3.2へアップデートした。
MogoDBを使ている以上はストレージエンジンをWiredTiger へ移行したいが、どうやら3.2 ではデフォルトで有効となる模様。

これは好都合なので、3.2での動作検証をしっかりと行っていく方向で準備を進めることにした。

yum リポジトリを作成

MongoDB は既に3.0で運用していたので、今回は直接3.2 へ上げられる。
もし2.6以前を使用しているなら一度3.0へと上げなければならない模様。

1$ sudo vi /etc/yum.repos.d/mongodb-org-3.2.repo 2 3#3.0 を 3.2 へ書き換え 4[mongodb-org-3.2] 5name=MongoDB 6Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/gpgcheck=0enabled=1

インストール

1# もし起動しているならMongoを停止 2$ sudo systemctl stop mongod 3 4# 更新を確認 5$ yum check-update 6 7# 実行 8$ sudo yum update

これで最新のMongoDB3.2 系が入った。

1# mongo を起動 2$ sudo systemctl start mongod 3 4# バージョンを確認 5$ mongo --version 6MongoDB shell version: 3.2.3

早速Webアプリを起動しなおした感じでは、今のところ問題は発生してない。
色々な記事やデータを見る限り性能が上がるのは間違いなさそうなので、テスト結果をしっかりと確認・整備して作業を進めたい。

2016-02-20

WebP

WebP を導入するべく簡易Modenizr もどきを使用してフォールバックを行った。

1function checkWebpSupport(fn) { 2 "use strict" 3 const html = document.documentElement, 4 WebP = new Image(); 5 WebP.onload = WebP.onerror = () => { 6 const isSupported = (WebP.width > 0 && WebP.height > 0); 7 8 if (isSupported) { 9 if (html.className.indexOf('no-webp') >= 0) { 10 html.className = html.className.replace(/\bno-webp\b/, 'webp'); 11 } else { 12 html.className += ' webp'; 13 } 14 } 15 16 fn(isSupported); 17 }; 18 WebP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; 19}

これをロード時に読み込ますことでhtml に付与されたクラスを切り替える。

他にNginx によるフォールバックの実装例も見つけた。

1location = /logo { 2 if ($http_accept ~* "webp") { 3 add_header Vary Accept; 4 rewrite (.*) $1.webp last; 5 } 6 7 if ($http_user_agent ~* "(Chrome|Opera|Android|Android.*Chrome)") { 8 add_header Vary User-Agent; 9 rewrite (.*) $1.webp last; 10 } 11 12 rewrite (.*) $1.png last; 13}

これは単純にUAを判別し、拡張しを書き換える手法のよう。

CSSのimage-setもHTMLの様にフォーマットによる切り替えができれば、こんな回りくどいことしなくていいのだが…。

2016-02-17

cssnano

cssの圧縮でgulp-minify-cssを利用していたのだが、どうやら開発止めてgulp-cssnanoへと移行を促いしている様子。

なので早速入れ替えてみた。

機能盛りだくさんと言いたいところだけど、minify-cssも結構色々やってくれてたので、実際使ってみないと何ともいえなさそう。とりあえずAutoprefixer は内包されているようだ。

使ってみた感じでは確かに少しサイズも縮小された。結構calcを多用しているので、単純な計算を事前にするのはいい感じ。

ただ一方でunsafe な機能はしっかり把握して使用しないと危険な匂いが…。
特にz-indexの再配置は環境によってはよからぬ影響が出そう。

効能と副作用をしっかり把握して使用していきたい。

2016-02-17

LetsEncryptとhttp2とNodeと

CloudFlare を利用してTLS化していたサイトを、Let’s Encrypt へ移行した。

参考にした記事ではWebroot プラグインを使用し、サーバーを停止せずに行う手法が多数でしたが、僕の環境(Node.js)だと少しハマったのでStandalone で取得を行った。

まずはCloudFlare を停止し、Aレコードを直接サーバーへ設定。

1# gitで取得 2$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
1# Nginx を停止 2$ sudo systemctl stop nginx 3 4# 80番ポートが塞がれていないかチャック 5$ netstat -na | grep ':80.*LISTEN'
1# Let' sencrypt フォルダへ移動 2$ cd /opt/letsencrypt 3 4# Stndalone プラグインを実行 5$ ./letsencrypt-auto certonly --standalone

情報を入力し規約に同意して完了。

1$ sudo ls /etc/letsencrypt/live/your_domain_nam
1# Nginx を起動 2$ sudo systemctl start nginx

導入のさいに参考となった文献は以下など。

また、証明書の更新は以下の手順で行う。

1# nginxを停止(80番ポートを開ける) 2$ sudo systemctl stop nginx 3 4# 更新 5$ ./letsencrypt-auto renew 6 7# nginxを起動 8$ sudo systemctl start nginx