0

GyazzにDeploy to Herokuボタンを付けた

githubにherokuへのデプロイボタンが付けれるようになった
Heroku | Introducing Heroku Button
Creating a 'Deploy to Heroku' Button | Heroku Dev Center


ので、node版gyazzのREADME.mdにDeploy to Herokuボタンを付けた。



ボタンを押すと、2分ぐらいで自分のHerokuアカウントでGyazzが動かせる。
アドオンも使える。

アドオンや環境変数の設定はapp.json Schema | Heroku Dev Centerで説明されているとおり、リポジトリのルートにapp.jsonを置いて指定する。city72のapp.jsonも参考になった。

Herokuボタンは https://heroku.com/deploy へアクセスした時のリファラがgithubのリポジトリだったらそれをcloneしてデプロイする、という簡単な仕様なので、もともとherokuで動かせるアプリなら本体のコードに手を入れること無く本当にREADMEにimgタグとaタグでボタン付けるだけで済んでしまっている

また、リファラのかわりにGETパラメータに?template=(githubのURL)を付けてもよい。
これ↓押すとgyazzが自分のherokuアカウントにデプロイされる。


すごい簡単に自分のところでprivate gyazzが動かせる。
簡単なツールみたいなwebアプリを、自分のところでサーバー建てて使ってねってのが言いやすいのはよい。気兼ねなくMongoDBとかmemcacheとか使うようにできるので、よくあるwikiやCMSとかみたいにSQLiteしか使わない縛りとか考えなくていい。

プルリクのメニューにある「browse code」でコミットのREADMEに飛んでからHerokuボタン押すと、そのプルリクをHerokuでデプロイして試せるのはすごい。例えばスマホWebアプリだったら、スマホでプルリク見てHerokuで試してmergeしてCI通して自動デプロイとかまでできる感じがある。ネイティブアプリよりプルリクを取り込みやすくなりそう。

設定


app.json
{
"name": "Node Gyazz",
"description": "Gyazz on Node.js",
"website": "https://github.com/masuilab/gyazz",
"success_url": "/memo/test",
"addons": [
"mongolab",
"memcachier"
],
"env": {
"NODE_ENV": "production",
"DEBUG": "gyazz:*",
"GYAZZ_URL": "https://(YOUR_APP_NAME).herokuapp.com",
"TZ": "Asia/Tokyo"
}
}

ボタン
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)

0

Web+DB Press vol.82にJawbone Up24について書いた

8/23発売のvol.82 Amazonで予約できるようになってた

WEB+DB PRESS Vol.82
WEB+DB PRESS Vol.82
posted with amazlet at 14.08.20
山口 徹 Jxck 佐々木 大輔 横路 隆 加来 純一 山本 伶 大平 武志 米川 健一 坂本 登史文 若原 祥正 和久田 龍 平栗 遵宜 伊藤 直也 佐藤 太一 高橋 俊幸 海野 弘成 五嶋 壮晃 佐藤 歩 吉村 総一郎 橋本 翔 舘野 祐一 中島 聡 渡邊 恵太 はまちや2 竹原 河合 宜文
技術評論社
売り上げランキング: 330


前の号から「Hack the Real World」という、オープンなAPIがあるガジェットで何か面白い・便利な物作ろうという連載をやってる。

今回はJawbone Up24という腕輪型のアクティビティロガーについて書いた。
Up24は睡眠や運動のログを記録して、BLEでスマホと同期し、さらにjawbone.comからそれを取得できるAPIがある。
webhook APIもあって、運動したり起床したりすると瞬時にデータをサーバーpushしてくれたりもしてすごい。似たようなロガーは色々あるけど一番APIが良かったのでUp24にした。


記事では基本的なAPIの解説と、起きたらMacからラジオ体操.mp3を流すとか、チャットで俺の状態が見れるようにするとかの例を作った。
Hubot使ったりした。(同じ号にHubotの解説記事もあるらしい)

アクティビティロガーがpushでデータ送ってくれると(ほぼ)完全にインタフェースの操作なしで起きたらエアコン付けるとか、寝てない奴にコードレビュー回さないとかできるわけで、システムを使うとか考えなくてよくなるからユビキタスコンピューティングっぽくて良いと思う。



ちょっと面倒だったのは、テザリング環境で原稿書いているとwebhookが受けられないのと、実際に寝たり起きたりしてデータ取る必要があって夜寝る前にプログラム動かしておいて朝確かめるとか、6月末にjawbone APIのバージョン上がったとか、色々あった。
まあ記事読めばそういう苦労はいらないと思います。


なお記事に出てくる「俺API」という、jawbone APIへのプロキシ的なwebアプリはクライアント(Hubot等)との接続にsocket.ioを使っているけど、別にwebhookでも構わないです。
家のMacで俺APIからのデータ受信してラジオ体操流すとかを作る時に、socket.ioの方がルータ超えとか便利だったのでそうした。

0

HubotでWiKiの更新通知

何度もメールをやりとりして結果をwiki等にまとめるのではなく、wikiに書いて適当に通知が飛ぶようになっていると便利だと思う。
実際便利なので研究室ではMLにメール月2,3通しか来てない。情報は全部ちゃんとしたフォーマットのストック情報になってて、それが適当にフロー情報として切りだされて流れてくるという感じで、自動的でよい。


gyazzをnodeで書き直してて、ページの更新がJSONのwebhookで通知されるようになった。「.通知」というページを作ってURLを改行区切りで書いておくとwebhookしてくる。

webhookをhubotで受信して、redisに貯めて前回とのdiffをslackに流すようにした。あまり同じページをまとめて通知しても細かすぎるので、webhookを受けてから1分間はデバウンシングする
gyazz-notify.coffee

# Description:
# Gyazz更新通知
#
# Dependencies:
# "diff": "*"
# "debug": "*"
#
# Author:
# @shokai

Diff = require 'diff'
debug = require('debug')('hubot:gyazz-notify')

config =
room: "#news"
header: ":star:"
interval: 60000

timeout_cids = {}

module.exports = (robot) ->

robot.router.post '/hubot/gyazz-webhook', (req, res) ->
url = req.body.url
wiki = req.body.wiki
title = req.body.title
text = req.body.text
unless wiki? and title? and text? and url?
res.status(400).send 'bad request'
return

res.send 'ok'

debug key = "#{url}/#{wiki}/#{title}"

clearTimeout timeout_cids[key]
timeout_cids[key] = setTimeout ->
notify url, wiki, title, text
, config.interval


notify = (url, wiki, title, text) ->
url = "#{url}/#{wiki}/#{title}".replace(' ', '%20')
cache = robot.brain.get url
robot.brain.set url, text

unless cache?.length > 0
debug notify_text = "#{config.header} 《新規》#{url} 《#{wiki}》\n#{text}"
robot.send {room: config.room}, notify_text
else
addeds = []
for block in Diff.diffLines cache, text
if block.added
addeds.push block.value.trim()
if addeds.length < 1
return
debug notify_text = "#{config.header} 《更新》#{url} 《#{wiki}》\n#{addeds.join('\n')}"
robot.send {room: config.room}, notify_text

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のように書いて文字列として認識させるというのもアリですね