0

nodeでテキストのdiff

wikiが更新されるごとにhubotに本文を送って、更新の差分だけslackに通知したかったのでテキストのdiffを取った

https://www.npmjs.org/package/diff

% npm i diff

diff = require 'diff'

str_a = """
ざんまい
かずすけ
まるたか
"""

str_b = """
ざんまい
かずどん
まるとも
まるたか
"""

result = diff.diffLines str_a, str_b
console.log result

console.log "*********"

for block in result
prefix = switch
when block.added then "+"
when block.removed then "-"
else " "

for line in block.value.trim().split(/[\r\n]+/)
console.log "#{prefix} #{line}"

行ごとじゃなくて追加されたブロックごとの配列で結果が返ってくる

[ { value: 'ざんまい\n', added: undefined, removed: undefined },
{ value: 'かずどん\nまるとも\n', added: true, removed: undefined },
{ value: 'かずすけ\n', added: undefined, removed: true },
{ value: 'まるたか', added: undefined, removed: undefined } ]
*********
ざんまい
+ かずどん
+ まるとも
- かずすけ
まるたか

0

Travis-CIがnodejs 0.1を使おうとして死ぬ

1時間ぐらい前からTravis-CIの挙動が変わった。
いきなりテスト通らなくなったので何事かと思ったら、node 0.1をインストールしようとして死んでた。

nvm use 0.1



.travis.ymlにこう書いていると、0.10が0.1になる。
language: node_js
node_js:
- 0.10

Travisのgemで.travis.ymlにtokenを暗号化して埋め込んだりしているとわかるけど、travisはyaml設定ファイルの値が数値だったら0.10とかを0.1にしてくる。
Rubyで0.10.to_fすると0.1になるみたいな感じ。


nvm use 0.10してくれるようにする

普通に文字列で”0.10″指定すればいい
language: node_js
node_js:
- "0.10"


俺のリポジトリけっこう色んな所で0.10と書いているので全部直すの面倒くさい


0.10を数値として扱うのはyamlの仕様なので、v0.10のように書いて文字列として認識させるというのもアリですね

0

mongooseにschema関係なくなんでも保存する

mongooseはスキーマで宣言されていないkey:valueは保存してくれない。MongoDBっぽくないけど安全ではある。
でも、webhookで色々なjsonがサーバープッシュされてくるAPIのデータを全部保存したい場合に困る。例えばtwitterやjawbone upのstream APIとかを、mongooseでスキーマレスになんでも保存したい。


方法1 Mixedを使う


調べると、Schema.Types.Mixedを使えとか書いてある。

var Any = new Schema({ any: Schema.Types.Mixed });
ただこの方法だと、なんでも保存できるanyの中に保存しろって事なんだけど、documentの中の深い部分を検索する事になってめんどい。


方法2 mongo driverを直接使う


mongoose.connections配列がnode-mongodb-nativeなので、ここに直接insertすればschema無いデータも保存できる。

例として、jawbone-up24がwebhookでプッシュしてくるjsonを全部eventsというcollectionに保存する。


model定義

## 空のschemaを作る
eventSchema = new mongoose.Schema

## 直接insert
eventSchema.statics.insert_webhook = (data, callback = ->) ->
mongoose.connections[0].collection('events').insert data, callback

mongoose.model 'Event', eventSchema
スキーマ関係なく直接保存するメソッドをmongooseのmodelに生やした。
mongooseのmodel Eventにスキーマ登録すると、mongoでは複数形のevents collectionになる


expressでwebhook受信してmongo driverに直接保存

Event = mongoose.model 'Event'
app.use bodyParser.json()

app.post '/webhook', (req, res) ->

## jawboneはevents[0]にデータが入ってるので、それを保存する
Event.insert_webhook req.body.events[0], (err, res) ->
console.log "保存した" unless err

return res.end "ok"


この方法だとcontroller側から使う部分もmongooseっぽいし、query投げるのもmongoose風に普通に書ける

eventSchema.statics.last_move_of_user = (user_id, callback) ->
@find
user_xid: user_id
type: 'move'
.sort
timestamp: 'desc'
.limit 1
.exec callback

0

express+socket.io+mongooseのテンプレ作った

作った
https://github.com/shokai/express-template

簡単なチャット。チャットログはMongoDBに保存する。
https://express-chat-template.herokuapp.com/


ガチwebサービスではなくゆるふわプロトタイピング用のテンプレになっている。expressあんまりよくわかってないから変な所あったらissueとか建てて盛大にdisって欲しい。
基本的にgeta6/coahを参考にしてるんだけど、ブラウザの為にcoffeeをコンパイルしてjsにするとか諸々の強烈なasset pipelineを取り外した。

構成はこんな感じ

  • express 4.4
  • socket.io 1.0
  • mongoose 3.8
  • coffee-script
  • ブラウザもcoffee-script.js
  • herokuにデプロイ
  • mocha + supertest + Travic CI
  • gruntでwatchしてcoffeelintとmocha回す


ブラウザでcoffeeコンパイルして実行してるけど、文法エラーはlintかけてるし、実行時エラーはコンソールにも下の様にちゃんと出るからsourcemapとかいらないしでだいぶすっきり構成になったと思う。

0

Node.jsで実世界UI

先週のReal.UIで発表してきたスライドです。ハードウェアとかNode.jsでやったほうが安定するしいいよという話をした。

会場のスマートニュース社は勉強会とかできる場所とオフィスとその真ん中にビールとか置いてあるカウンターがあってフロアがスコーンと抜けるように全部見えてて広々していた。ビール何種類もあってよかった。おいしかったです。



あと発表後にBlendMicroを買えるページがわからない、って言われて、その場で調べてみたらたしかにBlendMicroのサイトわかりづらい。

ここで買った。
Blend Micro [AH00007] – €25.40 : Arduino Store – community and electronics

通常のarduinoよりも低い3Vで駆動するので、太陽電池でも動かせたりする。面白い。