0

crontabで日本語を使うのにLANGを設定し忘れてた

LANG=ja_JP.UTF-8
をcrontabの上の方に書いておけば良かった

書かないと、Rubyの場合ARGVに日本語を渡してcrontabから呼んだらencodingのエラーになる

incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)



crontabで定期的に時刻を読み上げる

これを動かそうとしていた
crontabで実行した時だけ引数に日本語渡せなくて困ってた

say-time
#!/usr/bin/env ruby
now = Time.now
s = now.min == 0 ? "#{now.hour}時" : "#{now.hour}時#{now.min}分"
cmd = "say #{s} #{ARGV.join ' '}"
puts cmd
system cmd

30分ごとに実行
SHELL=/usr/local/bin/zsh
HOME=/Users/sho
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/$HOME/bin:$PATH
LANG=ja_JP.UTF-8

0,30 * * * * say-time です -o otoya > /dev/null 2>&1
時刻の末尾に付けたい文字列や、sayに渡したいオプションはそのまま渡せる。
「8時30分です」とか言ってくれる。

0

rbenvやめてhomebrewでRubyインストールする事にした

rbenvでRubyインストールするのって色々オプションつけたり下準備が面倒だけど、brew install rubyで最新版入るし、1.8〜2.0の頃と違って2.0以上で動くコードは2.2でも問題ない感じがするからRuby処理系のバージョン切り替え要らないじゃん、homebrewで最新版インストールすればいいじゃんという気持ち

nginxアップデートしたらopensslも一緒に上がってRubyがぶっ壊れた

Yosemiteにアップデートしたので
MacをYosemiteにアップデートした

homebrewで入れてたnginxもアップデートした。

% brew tap marcqualie/nginx
% brew install nginx-full --with-mp4 --with-mp4-h264-module

最近のはデフォルトでwebsocket proxyが有効になっていて便利!とか思っていたら、homebrewのopensslもアップデートされて、rbenvでインストールしてたRubyからSSLが使えなくなった。Ruby全滅した。

そこでrbenv+ruby-buildでRuby 2.2.2をインストールしたのだが、SSLを使う処理を動かすと「digest/sha1.bundle, 9): Symbol not found: _rb_Digest_SHA1_Finish (LoadError)」というエラーで死んでしまう。

というかrbenvでRubyインストールしてopensslやらreadlineやらが動かなくて色々コンパイルしなおすの、OS入れ替える毎にやってていい加減アホくさいのでやめたい。
ここ4年ぐらい一度もストレートに成功したこと無い。


homebrewでインストールする


よく見たらhomebrewにrubyっていうパッケージがあって、ちゃんと2.2.2がインストールできる。
node.jsもhomebrewで最新版入れて使ってるし、特別Ruby 1.8.7で動かさないとならないアプリとかが無い限り別に言語処理系のバージョン管理いらないんじゃないのという気になって

% brew uninstall --force rbenv ruby-build
% brew install ruby
した。ruby 2.2.2とgem 2.4.5が入った。


jrubyも入れた。
% brew install Caskroom/cask/java
% brew install jruby

全く問題なく使えてる。


LaunchAgentからのRuby起動

PATHが消えてるので自分でEnvironmentVariablesを設定するのと最初のbundleを/usr/local/bin/bundleとフルパス指定さえすればhomebrewで入れたruby 2.2.2が使えた。

    <dict>
<key>RACK_ENV</key>
<string>production</string>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/bundle</string>
<string>exec</string>
<string>rackup</string>
<string>config.ru</string>
<string>-p</string>
<string>5000</string>
</array>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>sho</string>
<key>WorkingDirectory</key>
<string>/Users/sho/my/app/path</string>
<key>StandardOutPath</key>
<string>/var/log/myapp/myapp.log</string>
<key>StandardErrorPath</key>
<string>/var/log/myapp/myapp.log</string>
<key>UserName</key>
<string>sho</string>

0

capybara-webkitでWebページのスクリーンショットを撮る

縦長のwebページを画像として保存したかったので久しぶりにcapybara-webkitを使った。


インストール

Macで使うにはqtが必要
% brew install qt
% gem install capybara-webkit

% gem list | grep capybara
capybara (2.4.4)
capybara-webkit (1.5.2)


キャプチャ

久しぶりに使ったらインタフェースが変わってたけど、ドキュメントが無いみたいなのでlib/capybara/webkit/driver.rbを読んで適当にやったらキャプチャできた。

capybara-capture.rb
require 'capybara-webkit'
require 'uri'

exit 1 if ARGV.empty?
url = ARGV.shift

driver = Capybara::Webkit::Driver.new 'capture'
driver.visit url
driver.save_screenshot "#{Time.now.to_i}_#{URI.parse(url).host}.png", :width => 1024, :height => 768
高さ指定しても縦長でキャプチャできる。

なおググるとせっかくDriverがbrowserをラップしているのになぜか直接driver.browserをいじっているコードがたくさん出てくる。



マウスを消したい

画面左上にマウスカーソルが出るのが気になる。消すAPIは用意されてない。
driver.execute_scriptでjavascriptが実行できるので、cssも書き換えられる。でもdocument.body.style.cursorや、driver.find(xpath)[0].hoverとか、画面外にdocument.createElementしてそこをhoverさせるとか色々やってみたけど無理だった。

今回はページ内の一部分が欲しかっただけなので、別にいいんだけど

他の手段

PhantomJSだとbody背景が透明になってしまうのでだめ。
Chrome拡張のFull Page Screen Captureだとページが長すぎるのか保存できなかった。

0

gyazo gemを公式APIに対応させた

https://rubygems.org/gems/gyazo

今まではGyazo.appの中にあったスクリプトを見て勝手にアップロードしてるみたいな感じでやってたので、正式なOAuth APIのほうを使うように修正した。upload,list,deleteのAPIが使える。version 2.0.0になった。

以前のバージョンとはインタフェースが違うので1.0系のgyazo gemを使っている人は注意してほしい


使い方

applicationを登録するとAccess tokenが取得できるので、それを用意してから

require 'gyazo'

gyazo = Gyazo::Client.new 'your-access-token'
res = gyazo.upload 'my_image.png'
puts res['permalink_url'] # => "http://gyazo.com/a1b2cdef345"

とても簡単に使える。

ただ、OAuth使うように変更したのに伴って、今まで同梱してたgyazoコマンドは削除した。CLIアプリでtoken取得するのをどうやるべきか考えてる。


ほぼ同じインタフェースのnode.js版もある

0

Web+DB Press vol.83でHueについて書いた

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


書いた

今日(10/24)発売のWeb+DB Press vol.83にphilips hueというプログラマブル電球について書いた。

WEB+DB PRESS Vol.83
WEB+DB PRESS Vol.83
posted with amazlet at 14.10.24
原田 騎郎 吉羽 龍太郎 山口 陽平 青木 雅弥 松下 誠太 三宅 英明 高橋 征義 南川 毅文 伊藤 直也 海野 弘成 高安 洋輝 佐藤 歩 泉水 翔吾 佐藤 太一 横江 直輔 舘野 祐一 橋本 翔 渡邊 恵太 中島 聡 はまちや2 小沢 邦雄 長沢 智治
技術評論社
売り上げランキング: 265

hueはフルカラーLED電球なんだけど、よくある専用のスマホアプリから調光できるLED電球と違ってHTTPから操作できるAPIがある。あとHSV/CIE/Mired色温度などで細かく色指定できたり、電球が点灯しているかどうかもAPIで取得できたりする。

記事ではcurlやRubyでhueを操作したりとか、俺が(家の外で)プログラム書いたりgit commitすると家の電球が明るくなったり暗くなったり色が変わったりして、家族に俺ががんばってる感が伝わるシステムを作ったりした。


天気を電球で表示するプログラムが動かない

3ページ目に書いてあるMSN天気のAPIが消滅してしまった。入稿時には確かに地域ごとにRSSが存在していたんだけど完全に無くなっちゃった


代わりにyahoo天気を使う例をここに書いておきます。weather-report gemを使うと、降水確率は取得できないけど傘が必要そうな天気かどうかはわかる。

require 'hue'
require 'weather-report'

weather = WeatherReport.get '東京'

light = Hue::Client.new.lights.find{|i| i.name == '居間' } # 居間の電球を使う
puts light.name

light.on = true
light.saturation = 80
light.brightness = 255

if weather.today.umbrella?
light.hue = 47000 # 青
else
light.hue = 60000 # 赤
end


これをcrontabとかにセットして朝実行すると、電気ついて起きれるうえに雨ふりそうかとかわかるので、傘を忘れない。