devdev blog

なにかウェブサービスを作りたい

Cloud9でデータベースを使う

Cloud9はクラウドベースのIDEですが、データベースのサポートも進んでいるようです。 2014年2月時点では、

をサポートしているようです。

MongoDB

MongoDBは、ワークスペースにプリインストールされています。

  1. データフォルダと、起動スクリプトを作成(dataフォルダにデータが格納されます)
$ mkdir data
$ echo 'mongod --bind_ip=$IP --dbpath=data --nojournal --rest "$@"' > mongod
$ chmod a+x mongod
  1. 起動
$ ./mongod

詳細派こちら: https://docs.c9.io/setting_up_mongodb.html

MySQL

MySQLも、各ワークスペースに用意されており、各ワークスペースごとにデータベースが隔離されています。

# MySQLを起動する
$ mysql-ctl start

#  MySQLを停止する
$ mysql-ctl stop

# MySQLの対話式クライアントを起動する
$ mysql-ctl cli

詳細はこちら: https://docs.c9.io/setting_up_mysql.html

Redis

Redisはインストールが必要ですが、そんなに複雑でないので簡単そうです。

https://docs.c9.io/setting_up_redis.html

SQLite

これも既にワークプレースにインストール済みのようです。

$ sqlite3 hoge.db

で起動出来ます。

まとめ

最終的なデプロイ環境で使用するデータベースと同じであれば、これで足りてしまいそう。 Heroku+MongoHQ構成とかにする場合にマッチしそう。

OAuthやOpenIDでソーシャルログインするには

ウェブサービスを作るとき、その都度ユーザー管理(新規登録、パスワード再発行等々)を作るのは面倒です。そこでソーシャルメディア等が提供する外部認証サービスを利用するのがもはや一般的です。その仕組みとして思い当たるのは、OpenIDやOAuthとかではないでしょうか。

OpenIDってなんだろう

OpenID や OAuth の役割と、既存のシングル・サインオンとの違い

一方で OpenID と OAuth は、対象とする領域が、かなり意図的に絞り込まれた形でスタートして います。OpenID は、繰り返し、こう説明されています。 『Identity authentication not authorization』

仕様から学ぶOpenIDのキホン (2/3)

OpenID AuthenticationはEnd Userが所有するIdentity URLを証明する手段を提供します。

つまり「エンドユーザーが主張するID(=URL)が、確かにその人が所有するものである(=認証)」と保証するのが、Identity Providerで、これらの仕組がOpenIDです。そして、それ以外の機能は提供しない事がポイントです。 一方、

OAuthってなんだろ

OpenID や OAuth の役割と、既存のシングル・サインオンとの違い

一方の、OAuthについては、Pat Pattersonさんが上記のプレゼン中で、このように表現しています。 『Authorization rather than Authentication』 『認証というよりは、認可』

OAuthが提供する仕組みは、認証(ID等がその人の物であるという証明)ではなく、第三者に対してエンドユーザーの権限を与える仕組みです。

例えば、普通はFacebookへ投稿できるのは本人のみですが、とあるサービスが本人に代わってFacebookに投稿したい時には、OAuthで本人に投稿許可を尋ねる事ができます。

現在、OAuth 1.0, OAuth 2.0とあるが、最新かつ良く使われているのはOAuth 2.0みたいで、1.0を使う理由は特にないようです。

OAuthで認証はできるのか

ってことは、OAuthは認証には使えないのかなと思いますが、世の中OAuthで認証ぽい事をしているがよくあります。これはOAuth認証と呼ばれているようです。OAuthで認証する方法を調べてみると、、

なんか出来そうなんですが、使い方間違えると死ねるようです。なんか怖いですね。

ここで、「Implicit Flow」(Implicit Grant Flow)というワードが出てきました。さらに、この問題を解決するには「OpenID Connect使え」と言っています。

再び、OpenIDって

OpenIDについて調べが足りなかったようです。OpenID - Wikipediaによると、

などがあるようです。

OpenID Authentication 2.0は、いわゆるOpenID認証のことですね。

OpenID Connectは、次世代の認証システムのようです。HTTP上で使用する場合は、OAuth 2.0の仕組みの上で認証を行う仕組みのようです。

まとめ

OAuthを単純に認証に使った場合の危険性やメカニズムについてはまだあまり理解してませんが、どうやらOpenID Connectを使えば、ソーシャルなサービスを利用して安全に認証ができそうなことがわかってきました。

引き続きOAuth 2.0、OpenID Connectについて調べて行きたいと思います。

node.jsでGmailの新着メールの監視・取得する方法

サーバサイドで、「Gmailの新着メールをチェックして、メールがあったら取得する」という処理をする方法について調べてみました。

  • サーバサイドは、node.jsで実装
  • Gmailとの通信は IMAPを使用

node.jsの IMAPクライアントライブラリ探し

「node.js imap」でググると、、

  1. mscdex/node-imap

    2014/01/23 - An IMAP client module for node.js. Contribute to node-imap development by creating an account on GitHub

  2. andris9/inbox

    Simple IMAP client for node.js. Contribute to inbox development by creating an account on GitHub.

  3. node.js - Get new email with node-imap nodejs - Stack Overflow

要約すると

  • 質問者 「gmailの新着メールを node-imap で取得してるんだけど、cron jobじゃなくって新着がきたらすぐ処理したいんだけど、どうしたらいいの?数分おきに見に行くとか嫌。」
  • 回答 「IMAP IDLEコマンドつかうといいよ。僕はIDLE使うのやめたけどね。」

IMAP IDLEコマンドという、新着メールをプッシュ通知する仕組みがあるんですね。但し、以下の様な注意点があるようです。

  1. IDLEコマンドは、メッセージを受信したことを教えてくれるけど、どのメッセージが新着かは教えてくれない。
  2. IDLEコマンド中は、他のコマンド(検索とか)は送信出来ないので、メッセージを取得するには、他のプロセスで行う必要がある。

node-imapとinbox

みつかった、有名そうなライブラリは node-imapとinboxというライブラリですが、node-imapは低レベルなAPIを提供し、inboxはより高レベルなAPIを提供しているようです。

今回やりたいことは inboxを使うと簡単にできそうです。サンプルに既に書いてありました。

Wait for new messages

You can listen for new incoming e-mails with event "new"

client.on("new", function(message){
    console.log("New incoming message " + message.title);
});

新着通知の際に、そのメッセージまで教えてくるようです。これを使えばOKそう!

脇道

inboxの new イベントはどういう実装をしてるのでしょうか。 https://github.com/andris9/inbox/blob/master/lib/client.js を読んでみると、 SELECTコマンド等でメールボックスを選択すると、自動的にIDLEコマンドを発行し、idleモードになり、コマンド送信時は、一旦IDLE状態を終了し、コマンド実行後に再度IDLEモードに入るようです。 新着メールの識別は、現在取得済みのメッセージのUIDの最大値+1から始まるUIDを対象にFETCHしているようです。

※UIDはメールボックスの中でユニークで、かつ、必ず昇順に割り当てられる、という仕様です。

Chromeで今見てるページのタイトルとリンクをまとめてコピーしたい

Chromeでサイトのリンクをタイトルと一緒にコピーしようとした時に、出来そうでできなかったのでメモ。

ちなみに、ブログを書くときは wri.peで下書きして出来たものは投稿&アーカイブとしてます。

探してみる

chrome ページタイトル リンク コピー」でぐぐってみる

Chromeウェブストアで「title url copy」で検索

以上3つくらい見つかりました。

試してみる

BlogLinkClipper

  • ☓クリックしてから開くまで1秒くらいかかる。0.5秒くらいで出て欲しい。
  • ☓リンク生成のオプションが毎回初期化される。
  • ○markdown形式でコピー出来る。

GetTabInfo

  • ☓テンプレートとかあって機能は多そうだけど、使い方がよくわからない。
  • ☓ちょっと遅い
  • ☓markdown形式でコピー出来ない

Copy Title+URL to clipboard

  • ○早い
  • ○シンプルでわかりやすい
  • ☓markdown形式でコピーできない

結論

  • GetTabInfoはよくわからないので却下。
  • BlogLinkClipperはmarkdownが使えていいけど遅くて、オプションを覚えてくれないのは致命的なので却下。
  • 消去法で Copy Title+URL to clipboardに決定。

ろくなのないなぁ・・・

はてなブログとBloggerを比較した結果

そろそろブログを書き始めようかと思ったけど、どのブログでやったらいいかわからなかったので調べつつ考えてみました。

Wordpressや無料ブログサービスを比較して、はてなブログを選んだ理由

これを読んだ上で個人的な理由で考えます。

希望:

  • 編集しやすい。
  • ひっそりとやりたいブログなので既存のGoogleアカウントとかと関連付けたくない。
  • 広告でお小遣いが増えたらいいな

で、

はてな

Blogger

    • 勝手な広告がはいらない
    • Markdownで書けない!
    • エンジニアっぽさがそれほどない

他のブログサービス

  • 調べるのがメンドイのでパス。

結果

いったんはBloggerでもいいかとおもったんですが、編集してみるとmarkdown形式で書けるはてなのほうが数倍魅力的でしたので、はてなにします。