凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

blink(1) をユーザーのアイコンっぽい色で光らせる earthquake.gem plugin 書いた

はじめに

USB ポートにつないで RGB 指定して光らせることの出来る LED ドングル blink(1) を3個買ったのですが、ifttt 連携してるだけではつまらないので色々いじってみてます。その一環として、ユーザーのアイコンに近い RGB で LED を光らせる earthquake.gem の plugin を書いてみました。
元ネタ: blink1_notifier.rb

私のアイコンの時


インストール

ダウンロード : blink(1) eartuqake.gem plugin to blink by each user's icon color
RMagick が必要です。インストールに詰まったのですが、以下のサイトのように pkgconfig を指定して解決。

gems 以下にゴミが残っていてインストール出来ない問題にもぶち当たったので、.zsh_history から手順をさらっておきました。

$ brew install imagemagick
$ export PKG_CONFIG_PATH=/usr/local/Cellar/imagemagick/6.8.0-10/lib/pkgconfig/
$ cd ~/.rvm/gems/ruby-1.9.3-head/gems/
$ sudo rm -rf rmagick-2.13.2
$ gem install rmagick

コード

# -*- coding: utf-8 -*-
# blink(1) eartuqake.gem plugin to blink by each user's icon color
#
require 'rubygems'
require 'rmagick'

def getRGB(url)
	@rgb ||= {}
	if (@rgb["#{url}"].nil?)
		image = Magick::Image.read(url).first.resize!(1, 1)
		color = image.get_pixels(0, 0, 1, 1)[0]
		@rgb["#{url}"] = [color.red/256, color.green/256, color.blue/256]
	end
	@rgb["#{url}"]
end

Earthquake.init do
	output do |item|
		next if item.nil? || item['user'].nil? || item['user']['profile_image_url'].nil?
		url = item['user']['profile_image_url']
		cmd = 'blink1-tool -q --rgb %d,%d,%d'
		EM.defer(lambda { system cmd % getRGB(url) })
	end
end

色の平均値を取れるメソッドあるのか分からなかったのですが、 1px × 1px に縮小して色見てみたらいい感じになってたので、コレを使いました。
ちなみに、blink(1) をコマンドラインから操作できる blink1-tool の引数は色々用意されているので妄想して面白いアイディア湧いたら買って何か作ってみて下さい。

$ blink1-tool
Usage: 
  blink1-tool <cmd> [options]
where <cmd> is one of:
  --blink <numtimes>          Blink on/off (specify --rgb before to blink a color)
  --random <numtimes>         Flash a number of random colors 
  --rgb <red>,<green>,<blue>  Fade to RGB value
  --on                        Turn blink(1) full-on white 
  --off                       Turn blink(1) off 
  --red                       Turn blink(1) red 
  --green                     Turn blink(1) green 
  --blue                      Turn blink(1) blue 
  --savergb <r>,<g>,<b>,<pos> Write pattern RGB value at pos
  --readrgb <pos>             Read pattern RGB value at pos
  --play <1/0,pos>            Start playing color sequence (at pos)
  --servertickle <1/0>        Turn on/off servertickle (uses -t msec) 
  --list                      List connected blink(1) devices 
 Nerd functions: (not used normally) 
  --hidread                   Read a blink(1) USB HID GetFeature report 
  --hidwrite <listofbytes>    Write a blink(1) USB HID SetFeature report 
  --eeread <addr>             Read an EEPROM byte from blink(1)
  --eewrite <addr>,<val>      Write an EEPROM byte to blink(1) 
  --version                   Display blink(1) firmware version 
and [options] are: 
  -d dNums --id all|deviceIds Use these blink(1) ids (from --list) 
  -g -nogamma                 Disable autogamma correction
  -m ms,   --millis=millis    Set millisecs for color fading (default 300)
  -q, --quiet                 Mutes all stdout output (supercedes --verbose)
  -t ms,   --delay=millis     Set millisecs between events (default 500)
  --vid=vid --pid=pid         Specifcy alternate USB VID & PID
  -v, --verbose               verbose debugging msgs

Examples 
  blink1-tool -m 100 --rgb 255,0,255    # fade to #FF00FF in 0.1 seconds 
  blink1-tool -t 2000 --random 100      # every 2 seconds new random color
  blink1-tool --rgb 0xff,0,00 --blink 3 # blink red 3 times

おわりに

@rgb["#{url}"] が 3 回とかコードダサいので、誰かエロイ人添削して下さい (-人-)。