#tng17 nodejs/nan v2のbreaking changeについてLTをした

Node学園 17時限目で発表聞いてたら自分も話したくなったので懇親会の会場設営中にLTした。

nan #tng17

資料には何も書いてないので、話した内容を書き起こす。


iojs v3.0.0が2015-08-04に出た
早速使って見てる人(挙手)
早速使ってみようと思ったけどnative moduleがbuild出来なくてあきらめた人(挙手)

自分はwebpack-dev-serverがbuild出来無くてあきらめた。ログ見てみたら、依存の先の先でこけてた。

webpack-dev-server\node_modules\socket.io\node_modules\engine.io\node_modules\ws\node_modules\utf-8-validate
webpack-dev-server\node_modules\socket.io\node_modules\engine.io\node_modules\ws\node_modules\bufferutil
wsが出たらengine.ioが出せて、engine.ioが出たらsocket.ioが出せて、socket.ioが出たらwebpack-dev-serverが出せて、なっが!

nan v2.0.0 2015-07-30でbreaking changeしてて、iojs v3に対応するにはnan v2にあげる必要がある。
だいたいのnative moduleはnanを使っているので、みんなしぬ。
c++出来る人nanたいおうたすけて

socket.ioまわりでいうと、2015-08-31時点では、wsまで出てる。
engine.ioを出すためには、engine.io-client, engine.io-parserが出ないとダメぽい。
c++はわからんのと、buffer, streamまわりもよくわからないので、せめて、対応しなければならないライブラリを絞り込むぐらいは出来るだろうと、pull request送ってみてる。

あとsocketio organizationの活動にぶくてつらい。


結論とかないし、自分でnan v2対応する気もあんまりない、c++は現時点だとわからない、と話をして、まあ人によれば「じゃあおまえがやれよ!!」って言われかねない与太話と感想だったけど、与太話と感想と断って話し始めたのでセーフ。

詳しい人がツッコミや質問入れてくれたり、話しかけてきてくれたりで、まさに俺得でした。
とても良かった。

俺得だけだともったいないので、やりとりを思い出せる範囲で。()が発言者。許可取ってないのと、自分が理解した範囲です。なので、便宜上idを載せてありますが、間違いなど全責任は私です。先にエクスキューズ。

(sanemat): socketio organizationのissue見てると、突っついてる人いるけど、マージするのは[rauchg] Guillermo Rauchがするような空気感を感じる。engine.ioはそんな感じ。
(sanemat): 一ヶ月ぐらいの空白を経てやっとここ数日動き出した感じがある。
(kysnm): nkzawa がコミッタに居る。nkzawaは日本のかた。相談してみたら?
(sanemat): その方がつついているのはissueで見てる
(kysnm): oh

(yujiosaka): socket.ioは新機能追加を嫌う、安定志向のライブラリ。pull request
送ったときそんな感じだった。

(kysnm): c++できるひとnan v2対応たすけてーってLTだけど、話聞くと今必要なのはc++出来る人だけではなく別の何かでは
(sanemat): ossうまく回せる人…

(kysnm): バージョンアップリリースしないと動かないの?
(sanemat): うろ覚えだけど、semverで厳し目だと動かないかも。apiのbreaking changesなければ、パッチレベルでいいのかな大丈夫かも

後日(今)調べた
https://github.com/socketio/engine.io/blob/f3fd4bb7eb25f3061b1b61b5453d56c83e71feb0/package.json#L29

“ws”: “0.7.2”,
あっ ^とか~とかですらない だめだ 0.8.0以上要る

(kysnm): masterでも動かないのかな
(sanemat): 動かないんじゃないかな

後日(今)調べた
https://github.com/socketio/socket.io/commit/ae5420b7275c61c87805e8e0ffa3698469fd5be5
リポジトリ直接指してるから動くのかな?
でもengine.ioのwsが0.8にならないとダメで、そうなってないからダメな気もする

(sanemat): socket.ioのalternativeってないんですか。
(yujiosaka): socket.ioがfallbackとか抽象化してくれるから、もっとprimitiveに使いたければengine.io, もっとならwsとか使うことは出来る。
(sanemat): (でもおれが使いたいのはsocket.ioというよりwebpack-dev-serverが使いたいだけなので…)
(yujiosaka): 他にはプリマスってのがあるよ。

後日(今)調べた
これかな
https://github.com/primus/primus

node-ffiのコントリビューターの方がいて、nanの話ができた。
kjunichi この方かな?

(kjunichi): node-ffiも今めっちゃ格闘してる最中で、まだnan v2では動いてない。
動作すると思われるpull requestはあるけど、まだ微妙にtestが通らない。

後日(今)調べた
https://github.com/node-ffi/node-ffi/pull/231
これかー
diffが参考になるかもという話だが、うっ 閉じる という感じでツラそう。

(kjunichi)Node.js – nanに対応したのにnan,nanだ! – Qiita

(sanemat): …自分もなんてこったとか言ってたので人のことは言えない。

id載せた方々
sanemat
kysnm
rauchg
nkzawa
yujiosaka
kjunichi

多少雑な話題振りに反応してくださった皆さんありがとうございました。

OpenJTalkのnodejs bindingをnative moduleで

OpenJTalkのnodejsバインディングをネイティブモジュールでの話。nanが出てきたのにも加えて、以前softalk(いわゆるゆっくりのボイス)をmacやlinuxから使いたくて、調べてたことがあって、結局やらなかったけど実にタイムリー。
リンクするライブラリはライセンスとかちょっと気をつけないといけない、とかの説明を聞けた。
native moduleの作り方でこれ見るといいよとか。下のqiitaのエントリのリンク先の解説。
これも俺得。
JavaScript – Node.jsで音声合成するモジュールをつくった – Qiita
https://github.com/TanUkkii007/node-openjtalk

openjtalkはこれ使ってみたことがあったんだった。
https://github.com/hecomi/node-openjtalk/

広告

nan対応出来ると人気者になれそう

iojs v3が悪いわけじゃないんだがnanの古いバージョンで固定されてるnpmモジュールがビルドできなくて、nanのバージョン単純にあげるだけではapi変わってるからダメで、って感じなんかな メンテされてない死ぬべきモジュールが死んだだけ ふーむ

nanの古いバージョンで固定されてるnpmモジュールが軒並み死んでる。古いってほどでもないのか。nan v2.0出たのJul 31, 2015だし。
手元でwebpack-dev-serverがビルド失敗するんだけど、ログ見てたら果てしなく依存の奥のutf-8-validate, bufferutil がコケてる。

webpack-dev-server\node_modules\socket.io\node_modules\engine.io\node_modules\ws\node_modules\utf-8-validate
webpack-dev-server\node_modules\socket.io\node_modules\engine.io\node_modules\ws\node_modules\bufferutil

見に行ってみたら、それぞれはiojs v3用のリリース済みだった。wsがmasterでは対応済みっぽいけど、2015-08-18 23:18 時点で未リリース。v0.7.2
wsが出たらengine.ioが出せて、engine.ioが出たらsocket.ioが出せて、socket.ioが出たらwebpack-dev-serverが出せて、なっが!

diffみてもさっぱりなのでissueで突っつくぐらいしか出来ない。

nanエキスパートになれば引っ張りだこや

Run-Yo – Run the developing yeoman generator

yeomanのgeneratorを開発中にその場でガシガシビルドできる run-yo を作りました。
対話環境まで含めて何度も簡単に確認できるのがよいです。
run-yoは for windows, mac and linuxです。
pandawing/node-run-yo

run-yo-1-1

yeoman-generatorってメンテ続けていくのが果てしなく困難で作ってはろくに使わずに捨てしてたのですが、これで少しはましになりそうです。…といってもあんまりペイするとは思わない。

こんな感じでしゅっと生成する。

run-yo-6

実際の生成物を簡単に同じリポジトリに入れることもできるので、よいです。

pandawing/generator-nm5/example

yeomaniaの仕組みをかなり参考にしました。時間経過でscoped module出てるので、今
から使うならrun-yoをどうぞ。

Yeoman入門(第二部、generatorを作る) – from scratch
yeomania

オフィシャルのnpm linkしろ、はツライ。
Writing Your Own Yeoman Generator | Yeoman

Ship boolify-string v0.1.0 いい感じに文字列をboolにする

いい感じに文字列をboolにする boolify-string v0.1.0をリリースした。

ユースケース

環境変数に書いた設定(true/false/TRUE)などをいい感じに使える。

if (boolifyString(process.env.CI)){ something_do(); }

examples

var boolifyString = require('boolify-string');

boolifyString('true');// #=> true
boolifyString('TRUE');// #=> true
boolifyString('True');// #=> true
boolifyString('false');// #=> false

boolifyString('{}');// #=> true
boolifyString('foo');// #=> true
boolifyString('');// #=> false
boolifyString('1');// #=> true
boolifyString('-1');// #=> true
boolifyString('0');// #=> false
boolifyString('[]');// #=> true
boolifyString('undefined');// #=> false
boolifyString('null');// #=> false

node-boolify-string
boolify-string

yo angular-fullstackのアプリをherokuにdeployしようとして色々引っかかる

yo angular-fullstack:heroku

するとdistにいい感じにbuildして, dist以下が別git repositoryとなり、heroku にアプリ作って、pushしてくれる
おお

おお、と思ったんだけどやっぱイマイチなのでイマイチなところを書く
そのうちもうちょっと理解したらどうにかしよう とりあえずはいいとして

自分の環境以外でこれどうやってdeployするんだろう? とひとまずdist消してみた。
で、yo angular-fullstack:herokuすると、名前がかぶって作れませんと。
うーむ。

なんかProcfileとか独自に作ってたのでどうするかな、と思って
herokuの画面開いてgitリポジトリコピーしてherokuから復旧した。

$ mkdir -p dist
$ cd dist
$ git clone foo/bar.git .

別リポジトリになるイマイチさは、結局productionに出たコードが何なのかよくわから
なくなる。distもgithubに作ってpushするんだろうなあ。二度手間。

github pagesならそういうgrunt/gulpタスクが合ったような気がした、けどnpm search herokuしてもあんまり良さそうなの無いな

これ結局deployこんなんになるのかだいぶツライな

$ grunt build && cd dist/ && git add -A && git commit -m 'Build' && git push heroku master

github pages使ってた時に良さそうだったのは、結局deploy用のshellで、これ。
https://github.com/X1011/git-directory-deploy
subtreeとかよくわからないので。

generator-herokuherokudirectory作ってgrunt のcopyタスクに追加するのがよ
さげ? grunt の書き方コピペして編集以外あんまりわかってないのでまだ出来ない。

figaro/dotenv相当のものってなんだろ figaroインスパイアのfigaroあるけどそんなに
メジャーじゃないっぽい? そのままconfigってmodule使うのが良さそうか
な? とかそのへんが全然わかんなくてツライ

node.jsの不要な試行錯誤インストール

なんかたのしそうなのでnode.js再挑戦してる。

node.jsとnpmのインストール – 自分の感受性くらい

かいてあるとおりnaveいれるといいんじゃないの。
以下は不要な試行錯誤のメモ。

はまったときにどうにもできなくなるからとりあえずそのまま使っておきたい。≒めんどくさい
rubyでlocal環境作るのにrvm使わないのはバカなんじゃないのと思うけど、こっちはそういう空気感もよくわからないからとりあえず。

node.js自体は
/usr/local/bin/node
になぜかいれてあって放置してあったのでそのままつかっていた。
$ node –version
v0.2.0

どうやってインストールしたかなんて忘れてしまったので、npmを入れるところから始めた。
とくにこまらず、npmは~/.node_libraries にいれるようにしてた。~/.npmrc をつくった。
npmをインストールする – スコトプリゴニエフスク通信

少なくともatmarkitのnode.jsのサンプルコードはv0.2.0で困らなかった。

twitter streamapiをsocket.io使って触ってみたくて、githubで探したら一番上に出てきたstreamieをつかってみようとして http://github.com/cramforce/streamie
sh deps で node-staticを入れようとしたら v.0.2.3 以上がrequireだっていうので、
$ npm install node-static@0.5.1
バージョン低いものを入れてみた。

で、とにかくさきに動かしてみようと思ったけど、やっぱり環境整える方がいいんじゃねーとおもって、やぱり方針転換。
~/.node_libraries をnodejsのバージョン違いで共有するのはまずいんじゃないかなと直感的に思うけどまあいい。

ここで、updateしようとしてやりかたわからなくてぐぐって冒頭のインストール方法にたどりついた。
が、なんとなくいろいろ天秤に掛けた結果このまますすむ。
uninstallわかんないしとりあえず消してみる
$ sudo rm -rf /usr/local/bin/node

/usr/local/lib/node のほうも多分これなんだと思うけどファイル名見てもわからないし消していいかわからなくて消せなかった。
nodeコマンドがいなくなったので0.2.3を入れ直してみる。今度は/usr/local/でなくて ~/にいれた。

$ cd ~/src/
$ tar xzvf node-v0.2.3.tar.gz
$ cd node-v0.2.3
$ ./configure –prefix=~/
$ make
$ make install

こんな?でこんななった。
$ which node
~/bin/node
$ node –version
v0.2.3

もいっかい sh deps
$ sh deps
deps: /home/sane/bin/npm: /usr/local/bin/node: bad interpreter: そのようなファイルやディレクトリはありません

あー。npmのuninstall ググる気もなかったのでまずもう一回npmインストールしてみる。ダメだったらググる。
$ curl http://npmjs.org/install.sh | sh
なんかインストールされたっぽい。
$ which npm
~/bin/npm

もいっかい sh deps
$ sh deps
これでnode-staticもはいった。よさそう。

今screenの別窓で $ node server.js やったら /usr/local/bin/node 見にいってありませんって言うので、実はnpmの再インストール不要だった可能性ある。
まあいい。