海外のNode.js系スタートアップのニュースを紹介

今日は今までと雰囲気を変えて、Node.js 系スタートアップに関するニュースを紹介します。

Nodejitsu が GoDaddy にジョイン

これは昨日発表されたニュースです。 NodejitsuはHerokuのようなPaaSを提供しているスタートアップです。 Nodejitsuが公開している有名なnpmパッケージとしては forever, node-http-proxy, winston, flatiron.js がありますね。forever は node.js をデーモン化するために使ってる人も多いのではないでしょうか。node-http-proxy はプロキシとして定番ですね。 Nodejitsuが元々やっていたサービスは提供をやめるそうですが、Node.jsコミュニティへの貢献は引き続き行うと表明しています。

一方で、GoDaddyはドメイン登録、VPS、サーバホスティング、SSL証明書の発行といった、日本で言うお名前ドットコム的な存在ですね。GoDaddyは元々インフラを.Netで開発していて、インフラのサーバ台数を削減させるためにNode.jsに切り替えているんだそうです。このタイミングで、Node.jsのプロフェッショナルを多く抱えているNodejitsuを買収することで、Node.jsの開発力を高める狙いが合ったと見られます。また、GoDaddyはStrongLoopというNode.jsによるmBaaSを提供しているスタートアップを自社のAPI基盤として採用したことも昨日ニュースになりました

Joyent が Node.js Foundation を設立

こちらも昨日発表されたニュースです。 Node.jsを管理していて、Node.jsによるクラウドサービスを提供しているJoyentがIBM, Microsoft, PayPal, SAP, Linux Foundationなどと協力してNode.jsコミュニティでopen governance modelを進めるための組織の設立を発表しました

Joyentはio.jsというNode.jsのforkが出たこともあり、コミュニティからの求心力が下がっていました。 今回の発表で open governance model つまり議論をオープンにし、コミュニティの意見を尊重しますよという姿勢を見せることで、改めて求心力を取り戻そうという狙いが見えます。 ちなみに、io.js も同様に open governance model を採用しています。 今後 Joyent 側がどういう動きを取るか注目です。

NodeSourceの資金調達

Node.jsの開発ツールやトレーニング、コンサルサービスを提供するスタートアップであるNodeSourceVCから3百万ドルの資金調達を実現させました。 低コストでハイパフォーマンスなWebサーバであるNode.jsを導入してみたいという企業は多そうなので、今後もこういったサービスの需要は増えそうですね。

まとめ

Node.jsは今後も熱い!

node.jsにおけるcircular dependency問題に対処するための3つの方法

node.js でコードを書いている時にハマった circular dependency という問題とその対処法について紹介します。

circular dependency

この問題は cyclic dependency とも呼ばれ、日本語だと 循環参照 とか 循環依存関係と呼びます。これはどういう問題かというと、あるファイルを require したときにその結果が空のオブジェクトとして返される問題 です。 この問題に直面した時はなんでこうなるのか全く理解できなかったのですが、よくよくコードを見てみると、あるファイルとあるファイルがお互いにrequireし合っていることに気づき、色々調べてみるとこういう問題があることがわかりました。

以下にこの問題を再現させるサンプルコードを示します。

これらのコードを見ると、main.jsがa.jsを、a.jsがb.jsを、b.jsがa.jsをそれぞれrequireしていますね。 main.js を実行してみると、以下のように実行エラーになります。cyclic dependency のため A というオブジェクトが空オブジェクトになっています。空なので、getId というキーでアクセスしても undefined が返っています。

この問題は、モジュールAが読み込まれる前にそのモジュール自身が読み込まれた時に発生します。

上のサンプルコードの require の流れに着目してみましょう。

main.js(2行目)var A = require(‘./a’);
→→a.js(3行目)var B = require(‘./b’);
→→→→b.js(3行目)var A = require(‘./a’);
→→→→b.js 読み込み完了
→→a.js 読み込み完了

流れを見てわかるように、a.js の読み込みが完了する前に b.js の中で a.js が読み込まれています。a.js の読み込みは完了していないので、b.js の3行目では空のオブジェクトが返っています。

ではどうすべきか

この問題はかなりデバッグしづらいです。できれば事前にみつけたいですね。この問題を事前に見つけるためには、CIで自動テストを継続的に実行させることが重要ですね。ソースコードを眺めていてもこの問題を見つけるのが難しいためです。

こういう問題が起こること自体、ある意味モジュール化の仕方に問題があるとも言えるのですが、がっつり設計し直すことも難しい状況もあると思うので、 大きく構造を変えずにこの問題を解決させる方法について紹介してみます。方法の名前は勝手に命名していますw

方法1:module.exports first

require(‘./b’) する前に module.exports を書く方法です。

オリジナルのa.jsと上のコードを比べてみると、真っ先にmodule.exportsにオブジェクトを代入しています。requireよりも先にモジュールAをexportすることで、circluar dependencyを回避しています。

この方法でコードを書き換える場合、コーディングスタイルによっては上の例のように大幅なファイル変更が必要になる場合があります。ちなみに、普段からmodule.exports firstでコードを書く癖をつけておくと、circluar dependencyの問題にハマる可能性もグッと下がるのでオススメです。

方法2:lazy require

利用したいモジュールを先頭で require するのではなく、必要なときに初めてrequireする方法です。

この方法は最も既存のコードへの影響が少ない方法です。 このファイルがrequireされるときに、init関数自体は実行されないので、cyclic dependency は回避出来ています。init関数が呼ばれて初めて、b.jsが読み込まれます。

関数呼び出しのたびに、requireされるのでオーバーヘッドが若干気になりますが、 requireされた結果はキャッシュされるので大きなパフォーマンスの低下はないはずです。

実際のソースコード

方法3:dependency injection

dependency injection(DI; 依存性の注入)は、モジュール間の結合度を下げるためのデザインパターンの一種です。

「モジュールBがモジュールAを利用する」という依存関係をソースコードにハードコードするのではなく、外部からモジュールBの引数に注入しています。こうすることで、b.jsはa.jsをrequireする必要がなくなるということです。

上の例だとモジュールのI/Fに若干の変更は入りますが、DIのテクニックを活用することで、モジュール間の結合度が下がり、モジュールのテストが書きやすくなるので、こちらもいい方法なのかなと思います。

まとめ

node.js における circular dependency という問題とその対処法について紹介しました。一度この問題にハマって解決方法を知るとそれ以降は用心深くなれるのですが、知らないとかなり苦労します。まだこの問題にハマっていない方も是非知っておいて損はないと思います!

Reference

2014年を振り返る

2014年の年越しは新潟県の赤倉温泉という場所で過ごしました。 2泊3日で12/30から1/1まで滞在していました。主にスキーをして過ごしていました。1/1は猛吹雪でほとんど滑れませんでしたが。。。

年も越したなので、2014年を振り返ってみました。ちょっと長いですが、お付き合いください。

Continue reading

Loopbackフレームワーク入門

Node.js Advent Calendar 2014の9日目の記事です。 ブログ記事を上げるのが遅くなってすみません。

今回は、Node.jsのWAFであるLoopBackの使い方について簡単に紹介しようと思います。使ってみた感触としては、ORMがすごく優秀で、RestAPIを自動で生成してくれたりと非常に強力なフレームワークだと感じました!では紹介していきます。

Continue reading

東京Node学園祭2014 #nodefest

東京Node学園祭2014に参加してきました。

感想ですが、Node学園祭には初参加でしたが、色んな発表を見れたので勉強になりました。海外スピーカーの発表を中心に聞いていました。そこまで聞き取れたわけではないので、リスニングの勉強の必要性を痛感しました。。 次は何らかの形で発表できたらなと思います。

Node.jsコミッターを多く抱えているStrongloop CEOのIssac Roth(@ijroth)さんに英語で話して、グッズをもらえたのはいい思い出です。

以下は各発表の感想と資料をリンクしています。

Continue reading

イーモバイルでPCからプリンタに繋がらない時の対処法

家の回線をイーモバイルに切り替えてから、PCがプリンタを認識しなくなった!という方いませんか? PCにいくらプリンタのドライバをインストールしても、解決しない。。。 PCがおかしいのか、プリンタがおかしいのかわからない。。。と悩んでいるあなた! 今回はこの問題を私がどうやって解消したかを紹介します。

原因は、イーモバイルにあるかもしれません。 実は私もこの現象にハマっていた一人で、エプソン製のネットワーク印刷ができるプリンタを購入したのですが、PCからプリンタを使おうとしても一向にプリンタを認識してくれないということがありました。

プライバシーセパレータ機能

イーモバイル端末にはプライバシーセパレータという機能が備わっています。 これはイーモバイル端末から提供される無線LANで接続されるPCやスマホ、プリンタ間の通信を遮断するというセキュリティ保護のための機能です。 デフォルトではこの機能は有効になっています。

結論として、このプライバシーセパレータ機能をオフにすれば、この問題は解決します。

この機能をオフにする手順は公式のこのページでわかりやすく説明されているので、参考にしてみてください。

イー・モバイル GL04P ブラック
イー・モバイル
売り上げランキング: 3,611

Amazon Kindleでハイライト一覧をWeb上で見る方法

Amazon Kindleのハイライト機能活用してますか?「これは!」と思ったフレーズや文章をメモするのに便利ですよね。 でも活用しても、振り返らないともったいないです。人間は忘れてしまう生き物なので。

そこで、私はハイライトした文章をいつでも振り返られるように、Evernoteにまとめてようと思いました! このやり方をレバレッジメモと言うそうです。

そのハイライトした文章をWeb上で確認できるサイトがこちらです。

kindle.amazon.co.jp

私は今までKindle上やアプリ上でしか見れないと思っていたのですが、こういうサイトがオフィシャルに提供されているみたいです。 PCからも確認できるので、レバレッジメモ作りが捗りそうですね!

ちなみに、Kindleでハイライトするコツは気に入ったフレーズや文章だけでなく、その前後の文脈も含めてハイライトすることですね。

これは、フレーズだけハイライトしても、数日後に振り返って見た時に「あれ?なんでこれハイライトしたんだっけ?」と忘れないようにするためです。

USの方のKindleアカウントの人はkindle.amazon.comで同様に見れるみたいです。

参考

レバレッジ・リーディング
本田 直之
東洋経済新報社
売り上げランキング: 6,478
Kindle Paperwhite(ニューモデル)
Amazon (2013-10-22)
売り上げランキング: 4

passport-yj 1.0.5 released

Yahoo!JAPANのOAuth認証(YConnect)を簡単に行うためのnpm packageである passport-yj に pull request が来ていた。 依存モジュールである oauth2 のソースコードの中身が変わっていたのか、install後に実行されるパッチが期待通りに適用されていなかった。 動作確認も問題なかったのでマージ。

あと動作確認したときに、同梱しているサンプルで正常にユーザ情報を表示できていなかったので、それも合わせて修正。 どうやらYConnect の userinfo API のレスポンス仕様が変わっていることに気づいた。

作ってから1年も経つと、ライブラリのバージョンが上がったりして思わぬところで問題が起こるのだな。

passport-yj 1.0.5

2013年度を振り返る

備忘録として、2013年度を振り返ってみたいと思う。

新しく挑戦したこととしては、iOSアプリ開発。昨年に入った頃からネイティブアプリ開発に興味を持ち始めて、個人的に Objective-C の勉強を始めた。主に参考にした本は 詳解 Objective-C 2.0 第3版iPhoneアプリ開発のコツとツボ35。仕事でも前のプロジェクトでiOSアプリ開発したいと手をあげたら、開発をやらせてもらえた。そして、今のプロジェクトではiOSチームのリーディングを担当するようになった。 ただ、まだプライベートでiOSアプリをリリースで来ていないので、今年はアプリをリリースさせたい!

他には、英語の勉強とか社内外への情報発信とかもやりたいこととして挙げていたけど、結局ほとんどできなかった。でも少しずつ改善できているのでよしとする。

技術面以外で痛感したことは、サービスを成長させることの難しさ。すごいエンジニアが何人もいるプロジェクトだからといって、生み出されたサービスが成功するとは限らない。当たり前なんだけど、実際に新規サービスを立ち上げてからサービスを運用することの難しさを実感できた1年だった。ユーザが全然使ってくれなくて、終了したサービスもある。 私はどれだけ頑張っても数字で結果を残せないなら、ビジネス上は「価値がない」と思ってる。だから、この1年は技術面だけでなく、サービスで結果が残せる1年にしたい。そのため、「リーン・スタートアップ」とか「グロースハック」という分野に興味を持ち始めている。本格的な勉強はできていないけど。。

プライベートでは、結婚という1つの大きなイベントがあった。ハネムーンでハワイにいってきた。ハネムーン以外ではあまり旅行に行けなかったので、もうちょっと仕事とプライベートのバランスを重視して過ごしたい。

そんな1年でした。