カテゴリー : 2015年 9月

[Heroku] cedar-14 stack に migrate

手持ちの Heroku アプリを cedar-14 スタックにマイグレートしました。

cedar-14 スタックに変更

$ heroku stack:set cedar-14 -a your-app-name
Stack set. Next release on your-app-name will use cedar-14.
Run `git push heroku master` to create a new release on cedar-14.

git push するために空 commit

$ git commit --allow-empty -m "Upgrading to Cedar-14"
[master a9ae9cb] Upgrading to Cedar-14

Heroku へ deploy

$ git push heroku master

stack を確認

$ heroku stack
=== your-app-name Available Stacks
* cedar-14

手軽にマイグレートできる Heroku は素晴らしい。

Heroku コマンドのバージョンアップ

cedar-14 stack に変更しようとしたら stack:set がないというエラーが出たので heroku コマンドをバージョンアップしました。

エラーメッセージ

$ heroku stack:set cedar-14 -a your-app-name
 !    `stack:set` is not a heroku command.
 !    See `heroku help` for a list of available commands.

heroku コマンドのバージョン確認

$ heroku version
heroku-toolbelt/3.7.2 (x86_64-darwin10.8.0) ruby/1.9.3

heroku コマンドのバージョンアップ

$ heroku update
Installing Heroku Toolbelt v4... done.
For more information on Toolbelt v4: https://github.com/heroku/heroku-cli
Setting up node-v4.1.0...done
Installing core plugins heroku-apps, heroku-fork, heroku-git, heroku-local, heroku-run, heroku-status... done
Your version of git is 1.8.4.3. Which has serious security vulnerabilities.
More information here: https://blog.heroku.com/archives/2014/12/23/update_your_git_clients_on_windows_and_os_x
Setting up node-v4.1.0...done
Updating plugins... done

使えないコマンドでエラーが発生するというようなことが起こらないと heroku コマンドのバージョンアップなんて滅多にしないですよね。

[Node.js] Error: spawn ENOENT の解決方法

Node.js の child_process.spawn で Error: spawn ENOENT というエラーが発生したときの解決方法をご紹介します。

結論から書くと child_process.spawn の第一引数に渡していた path に実行するコマンドがないというのが原因でした。(今回のケースだと ImageMagick コマンド)

前提

エラーが発生したコード(一部のみ抜粋)

imagemagick = require 'imagemagick'
child_process = require 'child_process'
 
spawned_child_process = child_process.spawn imagemagick.identify.path

エラーメッセージ

Error: spawn ENOENT
  at errnoException (child_process.js:988:11)
  at Process.ChildProcess._handle.onexit (child_process.js:779:34)

Error: spawn ENOENT の解決方法

node-imagemagick という npm module はインストールしていたけど、肝心の ImageMagick がインストールされていないのが原因でした。

brew list コマンドで ImageMagick がインストールされているか確認してみてもありませんでした。

brew list | grep imagemagick

インストールされていない場合、ImageMagick をインストールしましょう。

brew install xz # ImageMagick Dependencies
brew install imagemagick

そうすれば Error: spawn ENOENT エラーは発生せず画像アップロードできるようになるはずです。

参考情報

[MongoDB] E11000 duplicate key error index の code 11000 と 11001 の違い

MongoDB version 2.4.5 で unique index による duplicate key error index エラー発生時の error code には 11000 と 11001 があるのですが、その違いについて調べてみました。

MongoDB

事前準備

> db.version()
2.4.5
 
> db.so.drop();
> db.so.insert( { foo: 5 } );
> db.so.ensureIndex( { foo: 1 }, { unique: true } );
> db.so.insert( { foo: 6 } );

新規追加系メソッド insert のケース

db.collection.insert() で duplicate key error index エラーが発生したときは 11000 のエラーコードを返します。

> db.so.insert( { foo: 5 } );
E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }
 
> db.getPrevError();
{
	"err" : "E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }",
	"code" : 11000,
	"n" : 0,
	"nPrev" : 1,
	"ok" : 1
}

更新系メソッド update / save のケース

db.collection.update()db.collection.save() などの更新系のメソッドで duplicate key error index エラーが発生したときは 11001 のエラーコードを返します。

このときに紛らわしいのは、エラーメッセージ E11000 duplicate key error index に含まれているエラーコードが 11000 ということです。

> db.so.update( { foo: 6 }, { $set: { foo: 5 } } );
E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }
 
> db.getPrevError();
{
	"err" : "E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }",
	"code" : 11001,
	"n" : 0,
	"nPrev" : 1,
	"ok" : 1
}
> var so6 = db.so.findOne( { foo: 6 } )
> so6.foo = 5
5
 
> db.so.save( so6 )
E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }
 
> db.getPrevError();
{
	"err" : "E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }",
	"code" : 11001,
	"n" : 0,
	"nPrev" : 1,
	"ok" : 1
}

まとめ

MongoDB version 2.4.5 では、エラーメッセージは E11000 duplicate key error index と同じだけど、エラーコードは 11000 と 11001 の2種類があるバグっぽい処理になっていました。

このため、プログラム上で duplicate key error を処理したいときは if(err.code === 11000 || err.code === 11001) みたいな感じで扱うといいかもしれません。

なお MongoDB version 3.0.2 で試してみたところエラーコードは 11000 に統一されているようでした。

なので、err.code === 11001 だけのコードは MongoBD を upgrade したタイミングで動かなくなってしまうので注意が必要そうです。

> db.version()
3.0.2
 
> db.so.insert( { foo: 5 } );
WriteResult({
	"nInserted" : 0,
	"writeError" : {
		"code" : 11000,
		"errmsg" : "E11000 duplicate key error index: test.so.$foo_1 dup key: { : 5.0 }"
	}
})
 
> db.so.update( { foo: 6 }, { $set: { foo: 5 } } );
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 0,
	"nModified" : 0,
	"writeError" : {
		"code" : 11000,
		"errmsg" : "E11000 duplicate key error index: test.so.$foo_1 dup key: { : 5.0 }"
	}
})
 
> var so6 = db.so.findOne( { foo: 6 } )
> so6.foo = 5
5
> db.so.save( so6 )
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 0,
	"nModified" : 0,
	"writeError" : {
		"code" : 11000,
		"errmsg" : "E11000 duplicate key error index: test.so.$foo_1 dup key: { : 5.0 }"
	}
})

以上です。

参考情報

全世界のメールクライアントのマーケットシェアが分かるサイト

HTML メールのデザイン確認をされたことがある方、「フリーメールは Gmail や Yahoo メールとかたくさんあるけど、どれをチェックすればいいんだろう?」って悩んだことありませんか?

そんな悩みを解決してくれそうな全世界のメールクライアントのマーケットシェアが分かるサイト emailclientmarketshare.com をご紹介します。

Email Client Market Share

2015年8月のマーケットシェアは上から、

#1 Apple iPhone 29% +0.41
#2 Gmail 16% -0.58
#3 Apple iPad 11% +0.1
#4 Google Android 9% +0.4
#5 Apple Mail 8% +0.2
#6 Outlook 8% -0.25
#7 Outlook.com 4% -0.37
#8 Yahoo! Mail 4% -0.09
#9 Windows Live Mail 2% -0.04
#10 Thunderbird 1% +0.53

という結果でした。上位 10 件でマーケットシェア全体の 92 % を占めています。

HTML メールのデザイン確認などはこれら上位 10 件をおこなえば、まず問題なさそうですね。

ちなみに、マーケットシェアの分析は Litmus Email Analytics の開封トラッキングデータ 10 億件を元に集計しているそうです。

参考情報

[Amazon Redshift] TEXT 型は VARCHAR(256) に変換される

Amazon Redshift でサイズの大きい文字列を扱いたい場合 TEXT 型を使うべきではなさそうです。

公式ドキュメント によると TEXT 型は VARCHAR(256) に変換されるそうなので、MySQL や PostgreSQL の感覚で使ってしまうと想定していたよりも短い文字列しか扱えなかったということになってしまいそうです。

TEXT 型

TEXT 列を使用して Amazon Redshift テーブルを作成できますが、この列は最大 256 文字の可変長値を受け入れる VARCHAR(256) 列に変換されます。

僕は Redshift に保存するデータが log だった場合、そこそこサイズが長くなりそうだけど正確には分からない column は VARCHAR(1024) で追加しています。

Note

CREATE TABLE 構文では、文字データ型の MAX キーワードをサポートします。以下に例を示します。

CREATE TABLE test(col1 VARCHAR(MAX));

MAX 設定は列幅を定義します。CHAR の場合は 4096 バイトであり、VARCHAR の場合は 65535 となります。

MAX も使えるみたいですが、ほとんどの場合 65535 byte も使わないんじゃないでしょうか。

この記事で伝えたかったことは、「思い込みで TEXT 型を使おうとするのではなく、ちゃんと公式ドキュメントを読みましょう」ということでした。

Scrum で Trello をもっと便利に使うための Chrome 拡張機能

今日から自分の所属するチームでスクラムが始まりました。

カンバンには Trello を使っていて、これを便利にするための Chrome 拡張機能をいくつかインストールしたのでご紹介します。

Bug 2 Trello

Bug 2 Trello は GitHub や BitBucket の issue を各サイトのページ上から Trello に追加することができます。

Bug 2 Trello

Card Color Titles for Trello

Card Color Titles for Trello は名前の通り、Trello の Label 名を Card に表示させることができます。

Card Color Titles for Trello

Scrum for Trello

Scrum for Trello を使うと、スクラム開発の見積もりに使うポイント数を Card の Title にカンタンに設定することができます。

ポイント数は通常、フィボナッチ数(1、2、3、5、8、13、…)を利用しますが、設定ページから扱えるポイント数にフィボナッチ数以外を追加することもできます。

Scrum for Trello

ちなみに Chrome 以外にも Firefox や Safari の拡張機能もあるみたいです。

Trello Checklist Point

Trello Checklist Point は、Trello の Checklist の Item に [3] [2] [1] みたいにポイントを書いておくと、足し算してくれる地味に便利な拡張機能です。

Trello Checklist Point

まとめ

Trello 向けの便利な Chrome 拡張機能がたくさんあるので、上手く活用して Scrum 開発を効率よく回していきたいですね。