moment-timezone のバージョンが古くてサマータイムの切り替わりで日付処理がバグった

Moment Timezone の古いバージョンを使っていて、先日のサマータイムの終了日時 2016年11月6日(日)02時00分 PDT を境目に UTC から PDT/PST への変換がバグってしまう問題にぶち当たった。

結果的には、使っていた moment-timezone のバージョンが古かったので、バージョンを最新にしたことで解決しました。

moment-timezone@0.0.3 を使った場合

超古いバージョン 0.0.3 を利用した場合、タイムゾーン America/Los_Angeles で 2016-11-07 のその日の終わりの日時を正しく取得することができません。

> var now = new Date("2016-11-09 17:30:00")
> var moment = require("moment-timezone")
 
> moment(now).tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-10 07:59:59'
> moment(now).subtract(1, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-09 07:59:59'
> moment(now).subtract(2, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-08 07:59:59'
> moment(now).subtract(3, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-06 07:59:59'
> moment(now).subtract(4, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-06 06:59:59'
> moment(now).subtract(5, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-05 06:59:59'

moment-timezone@0.5.9 を使った場合

最新バージョン 0.5.9 を利用した場合、2016-11-07 07:59:59 というように 2016-11-07 のその日の終わりの日時を正しく取得することができています。

> var now = new Date("2016-11-09 17:30:00")
> var moment = require("moment-timezone")
 
> moment(now).subtract(1, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-09 07:59:59'
> moment(now).subtract(2, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-08 07:59:59'
> moment(now).subtract(3, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-07 07:59:59'
> moment(now).subtract(4, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-06 06:59:59'
> moment(now).subtract(5, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-05 06:59:59'

moment-timezone は定期的に最新バージョンにアップデートしないと

moment-timezone は IANA Time Zone Database + Moment.js なライブラリなので、IANA Time Zone データベースを最新に更新するためにもバージョンのアップデートは定期的にしないといけませんね。

海外向けサービスを開発しているので、定期的にタイムゾーンに苦しんでいる気がする・・・。

[Heroku] サブディレクトリだけを deploy する

github のリポジトリを節約するために、アプリと API のリポジトリを1つにまとめて管理したいことがあると思います。

$ ls
android
api
ios

git subtree push を利用すると api ディレクトリ以下だけを Heroku に deploy できます。

git subtree push --prefix api/ heroku master

以上です。

参考情報

[Atom] getaddrinfo ENOTFOUND atom.io atom.io:443 エラーの解決方法

apm starred して getaddrinfo ENOTFOUND atom.io atom.io:443 というエラーが表示されたら、apm login して Token を保存すれば解決します。

エラーメッセージ

$ apm starred
getaddrinfo ENOTFOUND atom.io atom.io:443

apm login で解決

$ apm login
Welcome to Atom!
 
Before you can publish packages, you'll need an API token.
 
Visit your account page on Atom.io https://atom.io/account,
copy the token and paste it below when prompted.
 
Press [Enter] to open your account page on Atom.io. 
Token> xxxxx
Saving token to Keychain ✓

エラーメッセージが分かりにくい!

Ionic Framework でアイコンフォント Ionicons を利用する

Ionic Framework からデフォルトで利用できる icon フォント Ionicons の使い方を調べたメモ。

公式サイト http://ionicons.com/ から icon フォントを検索することができます。下記の画像は money というキーワードに近しい icon フォントの検索結果です。

ionicons

利用したい icon フォントが決まったら、肝心の使い方ですが、

<i class="icon ion-cash"></i>

というように icon クラスと ion-cash クラスを付与することで、アイコンを表示できます。

Ionic Framework の公式ドキュメントにもう少しだけ詳しい説明があるので読んでみるといいかもしれません。

いい感じのアイコンがあれば Ionicons をそのまま使うと楽でよさそうですね。

[Atom.io] atom-beauty で JavaScript ソースコードを整形する

JavaScript 使う新規プロジェクトでフォーマッターを使いたいなということで、Atom でソースコードを綺麗に整形してくれる atom-beautify を使ってみました。

atom-beauty のインストール

メニューバーから [Atom] → [Preferences] → [Install] にて、 atom-beautify パッケージを検索してインストールしましょう。

apm で管理しているなら apm install atom-beautify しましょう。

atom-beauty の設定方法

メニューバーから [Atom] → [Preferences] → [Packages] にて、atom-beautify の Settings から設定画面を開けます。

atom-beautify settings

僕の場合、JavaScript の設定は Indent size だけデフォルトの 4 から 2 に変更する以外は特に何もしていません。

atom-beauty の使い方

Atom エディタ上で、右クリックをして Beauty editor contents を押すと JavaScript のソースコードが整形されます。

Control + alt(option) + b のショートカットキーでも整形できます。 Mac も Windows も同じです。

フォーマッターのような便利ツールを導入して開発をどんどん楽にしていきたいですね。

sed コマンドでファイルを上書き保存する方法

sed コマンドでファイルを上書き保存する方法を調べたので自分用メモ。

-i オプションを付けて上書き保存

sed -i -e '1d' input.txt

リダイレクト > を使った上書き保存

sed -e '1d' input.txt > output.txt
cp output.txt input.txt

どう考えても sed -i の方が便利ですね。

アニメーション gif をループ再生させる設定方法

Mac の Finder 上でアニメーション gif ファイルをスペースキーで開くとエンドレスリピート再生されるのに、ブラウザで開くと1回しか再生されないのなんでだろう?と思って調べてみました。

Stack Overflow に同じような質問があって「gif ファイルに定義されているから、エンドレスアニメーションループを有効にする編集をするんだ」みたいな回答が書かれてあって、「あ、そりゃそうだよね」と妙に感心してしまいました。

gif ファイルの編集には Gifsicle というCommand-Line Animated GIFs ツールを利用しました。

gifsicle のインストール

brew install gifsicle

ループ設定方法

無限ループ

original.gif のループ回数を無限に設定するには -l, –loopcount オプションをつけて gifsicle コマンドを実行するだけです。

gifsicle --loopcount original.gif > output.gif
gifsicle -l original.gif > out.gif

-b, –batch オプションをつけることで original.gif に上書きすることもできます。

gifsicle --batch --loopcount original.gif
gifsicle -bl original.gif

ループ回数を指定する

original.gif のループ回数を指定したいときは -l=N, –loopcount=N というオプションで設定できます。

例えば、ループ回数 2 の場合、

gifsicle --loopcount=2 original.gif > out.gif
gifsicle -l=2 original.gif > out.gif

で設定できます。この場合、合計で3回アニメーション gif が再生されます。

日本企業と米国企業の文化的な違いと知っておくべきこと5つ

会社の同僚の Alex が Tech Talk Tokyo #4 というイベントで発表した資料がとてもよかったので、記事として残しておきます。

以下の5つのトピックについて「日本企業だと◯◯だけど、米国企業は☓☓だよね」という Alex の個人的な見解を聞いて、「良いと思ったポイントを自分のワークスタイルに取り込みたい」と思いました。

  1. Emails
  2. Working Time
  3. Giving Negative Feedback
  4. Making Decisions
  5. Performance and Appraisal

詳しい内容が知りたい方はスライド(英語)を読んでみてください。

Refused to display https://www.youtube.com/watch?v=xxx in a frame because it set X-Frame-Options to SAMEORIGIN. の解決方法

YouTube の動画ページの URL をそのまま iframe タグの src に指定すると、

Refused to display ‘https://www.youtube.com/watch?v=xxx’ in a frame because it set ‘X-Frame-Options’ to ‘SAMEORIGIN’.

というエラーが発生してしまいます。

Refused to display 'https://www.youtube.com/watch?v=xxx' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

間違った iframe src

<iframe src="https://www.youtube.com/watch?v=xxx"></iframe>

YouTube の [共有] – [埋め込みコード] に記載されている https://www.youtube.com/embed/xxx という形式の埋め込み用 URL を使えばエラーが発生しなくなります。

YouTube 埋め込みコード

正しい iframe src

<iframe src="https://www.youtube.com/embed/xxx"></iframe>

以上です。

[MongoDB] データベース名の変更方法

MongoDB でデータベース名を変更する手順をご紹介します。

MongoDB

前提

まず、MongoDB には DB 名をアトミックにリネームする方法はないので、コピーして古い DB を削除するという手順になります。

DB名の変更手順

以下、MongoDB でデータベース名を変更するコマンドです。

// データベースを変更したい名前をつけてコピーする
db.copyDatabase('old_name', 'new_name');
// 古いデータベースに切り替える
use old_name
// 古いデータベースを削除する
db.dropDatabase();

データベースの容量が大きいと db.copyDatabase に時間が掛かってしまいますが、気長に待つしかなさそうです。