東京Node学園祭2014 アウトラインメモ
東京Node学園祭2014
東京Node学園祭2014 に参加してきたのでその時のメモ
企業JavaScript飯
#企業JavaScript飯というご飯イベントをNode学園祭のお昼に(勝手に)やってました。
@teppeis、@ahomu、@kyosuke、Layzie (敬称略)で企業内でのJavaScript状況ですかという感じの話をしてきました。
質問テーマのスライド: https://github.com/azu/slide/raw/gh-pages/nodefest2014/lunch.pdf
という感じのテーマを元に話をしてきました。
参加していただいた皆さん興味深いお話ありがとうございました。
最近企業のJavaScript(er)ってどんな感じになってて、どういうものを求めているのかに興味を持ってるので、面白い話があったらお話きかせて下さい。(to @azu_re にmention)
基調講演
- Socket.io
- FTP
- テキストには圧縮が効くがバイナリには圧縮が効いてない
- 同じ事ができないのでオーバヘッドができてた(スイッチングコスト)
- HTTP
- HTTPは段々良くなってきた modifier
- ただ、回線では良くなってるけどウェブだとイマイチ
- 一番大切だと思ってるのでファイルトランスファー
- 一度途中で止まると、もう一度再開するのは手動
- また並列にダウンロードとかできない(回線が早くなったのでよかった)
- ダウンロードでは圧縮が効くけど、アップロードの時は効かない
- XHR Lv2
- バイナリサポートをしている
- Progressのイベントもある
- File APIを使ってアップロードする前にファイルを書き換えできる
- Blob#slice をつかう
- Party
- アップロードの機能に限定されたフレームワーク
- BitTorrentに似てる(一つのfile streamじゃなくて)
- S3に保存することもできる
- 細かいメタ情報がある
- 早くてシンプルなものを作りたい
- http://party.rauchg.com/
- テスト用のオプションを分けて
- サーバの機能によってどれを使うかを選べる
- 早くするためにファイルをパーツに分けている
- TCPをできるだけ使い切るようにしてる
- 圧縮は開発中 - ChromeではWebSocketでDeflateをサポートしてる
- zlibを作ってるので、他のでも早くなるかもしれない
- party側がやってくれるので細かい事を考えなくてもいい
- 通信が切れた時の再接続とか
- ライブラリ Automattic に公開予定
Front-end with Node.js for Beginners - @ahomu
スライド
メモ
- 属人化から自動化 - Node.js製のツールがでてきた
- パッケージマネージャー
- Before
- 配布サイトからダウンロード
- コピー
- After
- コマンド叩いてインストール
- アップデートも一発
- 依存関係も解決してくれる
- Before
- Node / ブラウザ でパッケージ管理
- npm
- Nodeの標準パッケージマネージャー
- Bower
- npmでインストールしてブラウザ向けのJSを管理
- 2つのリポジトリと設定ファイルを管理してるプロジェクトが多い
- 2つのまとめたい => npm にまとめる??
- まだブラウザ向けの情報がnpmのpackage.jsonには入ってない
- なのでNodeのエコシステムがそのままブラウザに持ってこれるのかは未定
- Tips
- npm i
- npm rm
- とか短縮オプションがある
npm-shrinkwrap
現在のnode_modules内のバージョンを記録して固定する
- Bower
- バージョンの競合が依存解決できないとき
resolutions
フィールドでデフォルトでどれを使うとかを指定できる
- Task Runner
- Before
- 手動で実行
- After
- まとめて自動で実行できる
- Before
- 多彩なタスクを実行してくれる
- GulpとGrunt
- 両方とも多くのタスクがある
- pluginの数に差はあるけど大体あるので同じ
- Grunt
- JSONを書いていくだけの宣言的な設定を書く
- Gruntはtmpにファイルを吐き出して変換を繰り返す
- 変換を繰り返すような設定は冗長な感じ
- Gulp
- JavaScriptのコードで設定を書く
- taskでタスクの定義、src,pipeで繋いでdestで出力
- Tips: Grunt
- Gruntに思う所がプラグインがされている
npm run <command>
- npm 2.0.0で引数の受け渡しも出来る
- 原始的なコマンド実行を行える
- 単純なタスクならnpm runでも十分にできる
- モジュールシステム
- レガシーコードをどうにかする仕組み
- Before
- 大きなファイルが普通にあった
- After
- FluxとかMVとかファイルを分ける = モジュール
- モジュールを管理する出来る
- Browserify
- CommonJSをブラウザで実行出来るようにビルドする
- 基本的には設定があまりなくてもいい
- 細かい設定はpackage.jsonにメタフィールドを追加する
- Require.js
- AMDと呼ばれる一連の仕組み
- ランタイムとモジュールの仕組み
- 設定をちゃんと書かないと解決しにくい
- webpack
- CommonJS、AMD両方対応
- Browserifyはひとつのファイル出力がデフォルト
- webpackは複数のファイル出力に対応してる
- 非同期ロード用にchunkデータとして吐き出せる
- 設定はやや複雑な
- Duo
- GitHubからモジュールを取得、ビルドまでをやってくれる
- GitHubのリポジトリをそのままコードに依存を記述出来る
- かんたんパッケージマネージャDuo|サイバーエージェント 公式エンジニアブログ
- まとめ
- Browserify
- 導入が簡単で入門にはいい
- RequreJS
- 非同期がデフォルト。モバイルだと通信が多いので相性微妙?
- r.jsでまとめられるけど、それならBrowserifyでもいいんじゃないか
- webpack
- Browserifyからの移行もできる。小さいプロジェクトだと適応しにくいかも
- Duo
- 流行ったら考えよう
- Browserify
すべてのノードトランスパイラーがひどい!ならば、ノードトランスパイラーをいかに改善できるか。 - @leichtgewicht
- Transpiler
- コンパイラの種類の一つ
- Source -> Source のコンパイラ
- JavaScript、CSS、HTML
- JavaScriptのContextでは一杯ある
- BrowserifyとかもひとつのTranspiler
- Transpilerの問題
- Transpilerパフォーマンス
- Static Site Generatorの待つ時間が長い
- 殆どのTranspilerは同期
- JavaScript、HTMLは殆ど同期
- 並列にコンパイルできないのでパフォーマンスが問題になる
- CSSはAsyncでできるやつがなぜか多い
- 起動するだけでも時間がかかるやつが多い
- 200msぐらいかかるものがある…
- import caching
- インポートのキャッシュが重要
- jadeはimport cachingしてる
- Transpiler設定体系
- source-map
- targe-encoding
- pre/post processing
- output path
- input path
- I/O piping
- import
- 設定入力システム
- 似たような設定なはずなのに、オプションとかバラバラ。
- 設定の保存
jade --out hoge.jade --save save.config
みたいな感じで設定ファイルを保存できると便利そう(提案)
- Transpiler 依存関係
- Watch : Stage 1
- そのファイルそのものだけを監視
- Watch : Stage 2
- そのファイルが依存してるものも監視
- Watch : Stage 3
- インポートパターンの対応
- Watch : Stage 4
- 別の言語依存も監視してコンパイル
- Watch : Stage 5
- Configファイルが変わったらもう一度コンパイル
- Watch : Stage 6
- パイプライン
- Watch : Stage 1
- TranspilerのCLIごっちゃごちゃ
- デフォルトが圧縮するしない?
- 引数なしの場合の挙動が違う
- それぞれのCLIで挙動が違うと気持ち悪い
- エラーコードやformatting
- Syntax Error
- Config Error
- どのようにエラーを出すのかの標準がないから辛い
- Transpiler 合成
- 一つのHTMLでインラインに書いてそれぞれTranspileをしたい時
- 合成システムがTranspilerにはない
- エコシステム
- Transpilerがよくなれば、エコシステムがよくなる
- ドキュメントが簡単になるので初心者に優しい
- みんなTranspilerを使ってる
- もっと良くするためには話しあおう
- better-compiler
FAQ
- アプローチに上にレイヤーをつくる or それぞれお願いする
- レイヤーを作る方向で検討してる
テスト用ライブラリ power-assert, その開発で学んだ npm モジュール設計の勘所 - @t_wada
アジェンダ
- power-assertの紹介
- 仕組み
- 設計思想
JavaScriptのつと
- JavaScriptにはテストのデファクトスタンダートがない
- アサーションライブラリもメソッド数が多い
- Nodeの
assert
モジュールが十分な情報を吐いてくれるなら問題ないのでは
DEMO
- Chaiのコードをassertに書き方に変える
- This is power-assert
- シンプルで十分な情報が出せればいい => power-assert
power-assert
- 成功してる時は静かに
- 失敗する時はうるさく伝える
- assertionメソッドが3つぐらいで十分になる
power-assertの仕組み
- 実行時にコードを変換して実行するようにしてる
- その変換時にエラーに必要な情報を埋め込む
- ASTを変換して、埋め込んでいる
DEMO : ASTを変換して -> コードに戻す(Generator)
- コードを標準入力で受け取る
- esprimaでコードをASTにパースする
- estraverseでASTを変更する
- escodegenでASTをコードに出力し直す
substack pattern
- モジュールから外部に公開する関数はひとつだけにする
- 複数返したくなったらもう一個モジュールを作る
DEMO2: 先ほどのデモのAST変換の部分をモジュール化する
- AST変換部分のコールバックを関数化
- 関数を別のファイルに分けてモジュール化
- substackパターンで関数を公開する
- requireでモジュールを読み込んで使う
DEMO3: パースして、変換、生成の3つなので、それぞれモジュールを分ける
- コードを受け取り、ASTを返す
- 変換はASTを受け取り、変換、ASTを返すとする
- ASTを受け取りコードを出力
これはpower-assertでやってることと同じ
- ASTを受け取り、変換、ASTを返す = espower
設計思想
- Easy is not simple
- SimpleとEasyは別である
- それぞれモジュールに分ける
- それぞれのコンテキストにあわせたEasyを提供する
- Grunt
- Gulp
- Node
- etc…
- Simpleが本質的な所
- どういう処理をするかという話
ギャルでもゎかる node-webkit - @upgrade_ayp
- ユーザ側の話
- node-webkitってなに
- デスクトップGUIアプリが作れる
- GUI(HTML/JS/CSS)
- Same originとかも突破出来るので楽
- デスクトップGUIアプリが作れる
- プロジェクト1 : 事務仕事で使うnode-webkit製のアプリ
- 色や画像を差し込んだりが簡単
- UIはBackbone.stickit
- Backbone
- RemoteDebuggingProtocol
- サーバ側のエラーもちゃんと取るために使ってる
- node-webkit & chrome-remote-interfaceでブラウザオートメーション
- タスク1週に1-2時間ぐらいかかる
- Contextの問題
- Differences of JavaScript contexts · rogerwang/node-webkit Wiki
- node-webkit特有の問題
- Node側に寄せて書いた
- node-webkit vs atom-shell
- node-webkitは両方のcontextを普通に扱える
- atom-shellのserverから見た時
- atom-shellはブラウザContextで実行しようとするときeval的なものが必要
- Firefox/Chromeの拡張と大体同じ
- https://twitter.com/mizchi/status/533522161659416576
- ユニットテスト
- Karmaにオプションあるけど使えなかった
- mochaのWikiにやり方あった
- node-webkit特有の問題
- console.logが潰されてた
- Using mocha with node webkit · mochajs/mocha Wiki
- E2Eテスト
- Nightwatch.js
- SeleniumのChromeDriverで動く
remote-debugging-port
を指定して起動する起動できない問題
- ソースコードプロテクション
- node-webkitはビルドするけどソースコードがそのまま見える
- Developer Tools 開くボタンを失くす
- Remote Debugger Port
- メインウィンドウのinspect権を先に奪う
- ユーザーのローカルTMP_DIR
- 暗号化で対処
- ビルド前に暗号化
- gulpとかでjsを暗号化してnwビルド
require
時に復元する(読み込むときに拡張子別でhookして複合する
- プロジェクト2
- リモートにデータベース置いてmongooseで接続
- Socket.ioで繋ぐ
- D3のチューニングが大切
- 常時起動してるのでメモリリークのチェック必要
- デスクトップNode.jsの世界
- JavaScriptで全部書けるのは楽
- Node、npmライブラリが使えるのが楽
- node始める時にウェブサービスじゃなくてアプリを作ることから始められる
LT
新しい並行計算ライブラリjs-cspをご紹介 - @niryuu
- node.jsで非同期プログラミングを繋いでいく問題
- Promise/Generatorベースになってきた
- 新しい書き方がでてきてるが、ちゃんと動いてるのかの検証が難しい
- 非同期処理の検証の問題
- 繋いで行く時に失敗する事がある
- 非同期に向いた計算モデルが必要 => CSP
##ド初心者が5000QPSの広告配信APIをNode.jsで構築したおはな死 - @zuqqhi2, @Jimisky
- 改善前の広告が色々やってた
- 複数のリクエスト
- CSSやJavaScriptが大量
- 改善: Node.js
- 複数のリクエストをNode側にまとめる
- APIオーケストレーション
- Tips1 :
child_process.exec
は使わない - Tips2 : ライブラリ
- CやC++のネイティブ処理を使う
- Tips3: ローカルオンメモリ
- ヒット率が8-9が高かったのでメモリキャッシュする
- Tips4: gwicke/nodegrind
- 指定した期間内にCPUの状態をダンプする
- Chrome Dev Toolsで確認出来る
- Heapダンプ を bnoordhuis/node-heapdump でした
node.js + socket.io + mongoDB で本格風リアルタイムWEBサイトを作ってみた - @ozatty96
- ファイル数が多いと詰まってしまう
- SEOの問題
- Google botはsocket.ioの通信を解釈してくれない
- 自分でPhantomJSみたいな仕組みを作った
- これからリアルタイムウェブになるのではないのか
node.jsでビッグデータを処理する - @neo6120
- ビッグデータのプリプロセス
- ログ解析
- 大量のログ解析をする話
- SQL
- 解析担当者
- iPythonでやってるんだけど、多くて上手く行かない
- 解析のプロプロセス
- データの分割結合
- バイナリ化
- フォーマット変換
- NodeはシンプルプロセスなのでCPU一つだけの処理だとCPUを使い切れない
- child_processで分割
- コアを使い切る
- キューが溢れてしまう事があった
- dripped dataがきて更にあふれたことがあった
- さらにキューが小さく…
- FAQ: clusterをなぜ使わなかったの?
- ドキュメントが良くわからなかった
- https://twitter.com/leader22/status/533536546574454784
A Profiling and Monitoring Method for Nodejs Applications - @setogit
- Concurix profiling and monitoring solution
- Concurix | Trial Offer
- Nodeアプリのプロファイリング出来るライブラリ
その他
メモ: FoldingText
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。