Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@Layzie
Last active August 29, 2015 14:09
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Layzie/afc410d6635245a69d2d to your computer and use it in GitHub Desktop.
Save Layzie/afc410d6635245a69d2d to your computer and use it in GitHub Desktop.
Node学園祭2014メモ

Node学園祭2014

基調講演

ファイルアップロードについて

アップロードの歴史

  • HTTPはあんまりアップロードのこと考えてない
  • FTPはいまはあんまり使われてないけど、前は使われてた
  • TCPはファイルとHTMLを一緒には通信できない
  • 最近のHTTPはマルチパートアップロードサポートしてきたから良くなってきた

いろいろな問題

レジュームとかできないとかね

JavaScriptで解決

http://party.rauchg.com/

  • progress eventあったり
  • File APIもある
  • Blob#slice
  • Partyはこれらを使うシンプルなフレームワーク
  • ファイルアップロード専用
  • どちらかというとBitTorentみたいな感じ
  • setupとかdistributionを簡単にできるようになる
  • ファイルを分割して送るから速くアップロードできる
  • WebSocketでDEFLATE使う
  • ASM.js -> zlib.js使ったら速いかもね
  • Partyはここらの面倒な部分を全部やる
  • チャンクは独自に同期する感じ
  • ページがリフレッシュしても切断しない
  • Worker API使ってる
  • configが充実してるからフレキシブル
    • S3なんかも使えるよ

What’s coming in Node, Express & LoopBac

  • ナパの地震グラフをJSON APIで取得するという良い時代
  • Node使ったAPIサーバを使ったら夢が広がりんぐ
  • APIを使ったら色々なデバイスに応用できる
    • HTMLだけだとちょっとこうは行かない

Why Node

  • 速い
  • 色々な企業で使われてる

Node v0.12

  • クラスタとか
  • デバッグがしやすくなるとか
  • dispatcher
  • flow control

slc使ったクラスターのデモ

エラーマネージメント

Expressに何がくる?

  • サイトがリニューアルしたよ
  • Markdownでドキュメント書いてる
  • Express Generatorを搭載
  • APIゲートウェイ
  • ミドルウェアの順番決め
  • Zoneつかってエラーハンドリング

Loopbackに何がくる?

https://github.com/strongloop/loopback http://loopback.io/

  • 自動でREST APIになる
  • モダンなORM
  • AndroidとかJS SDKある
  • ビルトインでAPIエクスプローラある
  • APIなんかをGUIで扱えるStudio
  • 勝手にAngularとかで使えるようなModelが生成される

loopbackのデモ

すべてのノードトランスパイラーがひどい!ならば、ノードトランスパイラーをいかに改善できるか。

Transpiler

  • compilerのひとつ
  • source -> source compiler
  • EJS / Marked / Jade
  • Less / stylus / sass
  • みんな良く使ってるのに、なんで悪いわけ?

パフォーマンスの問題

  • Static Site Generatorの待つ時間が長い
  • Syncかつimportがある場合はasyncがないとツラたん
    • JSX / TypeScript
    • Jade / EJS
  • require('transpiler')のスピードが遅い
    • JSX / Jadeが特に悪い
  • importのキャッシュ
    • キャッシュない場合は全てのimportをコンパイルしないといけない

設定システム

  • 設定ファイルをこれだけ書かないといけない
    • 一般的な設定
    • 言語専用設定
    • 環境設定
    • (ファイル設定)
    • (ユーザー設定)
  • それぞれのtranspilerで別に設定しないといけない

ノティフィケーション

  • 例えばwatch
    • メインファイルしかwatchしないのがstage1
    • 依存ファイルもwatchするのがstage2
    • importしてるファイルもwatchするのがstage3
    • クロスコンパイラでwatchするのがstage4
    • コンフィグファイルもwatchするのがstage5
    • パイプで例えば、圧縮するのとかもstage6
  • 大体はstage1か2で3も少ない、4以上は絶対にない

CLIが統一されてない

  • CLIのオプションとかが各transpilerごとにバラバラ
  • Node.jsの世界の気持ちが悪くなるw
  • エラーコードやそのフォーマットがバラバラ

transpilerの合成

  • 1つのtranspilerと別のものの組み合わせがツラい

なんでこんな話をしたのか

  • ECOシステムとかを良くする
  • Nodeの世界を良くする
  • みんな使ってるしね

なんで今日なの?

みんな長いGruntfile書いてたりする人いるでしょ?

https://github.com/better-compiler/member

良いコンパイラ作るためのリポジトリを作ったよ

テスト用ライブラリ power-assert, その開発で学んだ npm モジュール設計の勘所

  • テスト書いてる?
  • テストライブラリのメソッドが多い。chaiでは33メソッド

Mocha + Chai のデモ

Power-Assertの目的

  • 覚えること少なくなった
  • コードの復権
  • 成功してるときは静かに、失敗したらうるさく
    • Unixの沈黙の原則

Power-Assertはなにをやってるのか

  • テストコードから情報を埋めこんでコンパイル
    • JavaScriptをASTに変換して実現している
    • Esprimaを使うとJSのオブジェクトツリーにしてる
  • ASTからコードに変換
    • escodegenを使って、esprimaからのASTをJSのコードに戻す
  • estraverseを使ってASTからJSまでで変更をかけるようにできる

ここら辺ライブコーディングしてて凄いです。emacsつよい

設計哲学

  • Nodeのモジュールの中にもUnix哲学が入ってる
    • 一つのことを、うまくやれ
    • モジュール間の原則
  • substack pattern
module.exports = function(arg) {
    // do one thing well
};

先程のライブコーディングしたコードをこの原則にしたがってリライト中。emacsつよいというか、t_wadaさんがつよい。

  • power-assertは12個のモジュールで構成されてる
  • Easy isn't simple.
    • Simple: objective
    • Easy: relative

ギャルでもゎかる node-webkit

話のスコープ

  • やばい、話のスコープはユーザーと企業の間に立ってるユーザー企業の話なんだが、カオス

Node-Webkitって何さ

  • 書きやすいので、ギャルでも書ける
  • セキュリティとかあんま関係なくいける

作ったアプリ

  • Node-webkit
    • Backbone.stickit
    • Backbone.localstorage
  • 外部サイト
    • jQuery
    • RemoteDebuggingProtcol
  • MailServer

使ってみてどうなの

  • 結構普通にアプリは負担すくない
  • 仕様変更以外特に問題ない

Contextってなんだし

  • WebKit Context
    • DOM要素
  • Node Context
    • requireで読みこんだもの
  • Node Contextだけ基本使う
    • どうしてもしょうがないのは場合のみ<script>タグ

node-webkit vs atom-shell

  • ぜんぜんちがうよ
  • atom-shellはwindowからDOM側にアクセスできねえ

bowerとかcomponentとか

  • まあ使えばいいじゃない

Unit Test

  • console.log()が標準入力にこない
  • そもそも標準入出力がでねえ(windows)

結合テスト

  • Nightwatch使ってる
  • node-webkit専用のバイナリもあるけど、普通のChrome driverも使える
  • remote-debugging-portの指定して接続できない

ソースコードプロテクション

  • node-weebkitでビルドしてもバイナリになるわけじゃない
  • devtool -> ひらくボタンなくす
  • Remote Debugging port -> メインウィンドウのinspect権を取っとく
  • ローカルのTMP_DIR -> 暗号化する
    • jsを暗号化して、ファイル名を変える
    • requireするときに復号する

いま作ってるの

  • D3のチューニングつらい
  • node.js v0.10のSSL
  • mogooseでハマる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment