mac bookのバッテリー状態をはてなグラフに記録してみよう

[2014.08.10追記]
記事が古く、Mavericks(ruby2.0)で動かない(gemのHatena::API::Graphが動かない)
はてなグラフAPIも2014年3月にOAuth認証以外は受け付けなくなって、グラフデータが追加できない、などぼろぼろなので、上記に対処したコードを投稿しました。
mac bookのバッテリー状態をはてなグラフに記録してみよう(OS X 10.9 Mavericks対応版) - mac日記
[追記ここまで]



だいぶ前から、このネタやってたんですけどね。。。
やっとコードを晒せる状態になったというか。
最初に、やりたいことができることを確認しちゃったら、そのあと、ほったらかしにしてました。
まともに動くようにコードを整理したので、公開してみたいと思います。
なにか新しい発明、という訳ではないし、だれでもささっとかけちゃうコードですが、、。


rubyでがっつりコード書いたことないんで、たぶん文化に沿ってないところとかはあると思うけど、
変なところあったら指摘してもらえるとうれしいです。)


gem の Hatena::API::Graph パッケージを使っているので、
はてなグラフapiとは - はてなキーワードを参考に
インストールしておく必要があります。
あとは、cron にでも登録しておけば、毎日自動ではてなグラフにバッテリーの寿命?を記録していってくれます。

MacBook Pro battery capacity (mAh)



MacBook Pro battery cycle (times)




#!/usr/bin/ruby
require 'rubygems'
require 'hatena/api/graph'

class BatteryLog
	HATENA_USER = '[はてなのidを書く]'
	HATENA_PASS = '[はてなのpasswordを書く]'
	GRAPH_NAME_CAPA = 'macbook pro battery capacity (mAh)'
	GRAPH_NAME_CYCLE = 'macbook pro battery cycle time'
	BATTERY_LOG = 'battery.log'
	DEBUG_LOG = 'battery.dbg.log'
	LOG_PATH = File.dirname(__FILE__)
	
	def run
		logging
		post
	end
	
	def logging
		if logged?
			_debug("no write log")
			return
		end
		
		capa, cycle = get_status
		_logging(Time.new, capa, cycle)
		_debug("write log")
	end
	
	def logged?
		Date.today == latest_log_date
	end
	
	def _logging(time, capa, cycle)
		l = sprintf("%s,%d,%d,*", time.strftime("%Y/%m/%d %H:%M:%S"), capa, cycle)
		
		io = open(battery_log(), "a")
		io.puts(l)
		io.close
	end
	
	def decode(l)
		if /(\d{4}\/\d{2}\/\d{2}).+?,(\d+),(\d+)/ =~ l
			[Date.parse($1), $2, $3]
		else
			nil
		end
	end
	
	def post
		temp_file_name = battery_log() + ".tmp";
		
		r = open(battery_log(), "r")
		w = open(temp_file_name, "w")
		while l = r.gets
			l.chomp!
			if !posted?(l)
				if _post(l)
					l = posted!(l)
				end
			end
			
			w.puts(l)
		end
		
		r.close
		w.close
		
		File.rename(temp_file_name, battery_log())
	end
	
	def _post(l)
		date, capa, cycle = decode(l)
		
		if date
			post_hatena(date, capa, cycle)
		else
			_debug("failure decode [" + l + "]")
		end
	end
	
	def posted?(l)
		/-$/ =~ l
	end
	
	def posted!(l)
		l.sub(/,\*$/, ",-")
	end
	
	def get_status
		s = eval(`/usr/sbin/ioreg -w0 -l | grep LegacyBatteryInfo`.gsub(/=/, '=>').gsub(/^.*\{/, '{'))
		capa = s["Capacity"]
		cycle = s["Cycle Count"]
		
		if (capa && cycle)
			[capa, cycle]
		else
			[-1, -1]
		end
	end
	
	def latest_log_date
		if (!File.file?(battery_log()))
			return nil;
		end
		
		log = battery_log()
		tail = `tail -n1 #{log}`
		
		if /(\d{4}\/\d{2}\/\d{2})/ =~ tail
			Date.parse($1)
		else
			nil
		end
	end
	
	def post_hatena(_date, capa, cycle)
		_debug(sprintf("post to hatena graph ... (%s, %d, %d)", _date, capa, cycle))
		
		ret = true
		
		graph = Hatena::API::Graph.new(HATENA_USER, HATENA_PASS)
		begin
			graph.post_data(GRAPH_NAME_CAPA, :date => _date, :value => capa)
			graph.post_data(GRAPH_NAME_CYCLE, :date => _date, :value => cycle)
		rescue
			ret = false
		end
		
		_debug(ret ? "success" : "failure")
		
		ret
	end
	
	def _debug(l)
		if debug_log().size > 0
			io = open(debug_log(), "a")
			io.puts(Time.new.strftime("%Y/%m/%d %H:%M:%S") + " " + l)
			io.close
		end
	end
	
	def battery_log()
		LOG_PATH + "/" + BATTERY_LOG
	end
	
	def debug_log()
		LOG_PATH + "/" + DEBUG_LOG
	end
end

BatteryLog.new.run

今更ながらgitの練習中(git diff編)

遅まきながら、gitを実践投入しようと思い、練習中です。
今まではsubversion使ってました。
ということで、今日理解したことのまとめ。


1. 作業ツリーとステージングエリアの差異
> git diff

2. ステージングエリアとリポジトリの差異
> git diff --cached

3. 作業ツリーとリポジトリの差異
> git diff HEAD

と、こんな感じかな。

新iMac (Late 2009) のグラフィックスチップとOpenCL

今回のiMacのスペックで気になったのが、ずばり「グラフィックスチップ」。
下のモデルから順番に、
GeForce 9400M
Radeon HD 4670
Radeon HD 4850
と3ランクある。


それぞれどのくらいの能力があるのかと見てみると、、、
GeForce 9400M - 54G flops
Radeon HD 4670 - 480G flops
Radeon HD 4850 - 1T(1000G) flops


と、圧倒的な大差!
おおざっぱに見て、GeForce 9400Mの10倍の能力をRadeon HD 4670が持っていて、
Radeon HD 4670の2倍の能力をRadeon HD 4850が持っている。


でも、多分今はこれらの数値の差がそのまんま何かの処理や画面描画のスピードの体感速度の差としては現れてないと思う。
今後、次期バージョンのiLifeやiTune、Final Cut など、続々とOpenCL対応アプリケーションとして出てきたとき、
スペックの差が大きく現れてくるんじゃないかと思う。

とくにHDムービーの編集などを行うときは、このスピード差が大きく効いてくると思う。
GeForce 9400MクラスのGPUでは、かなりストレスのかかる作業を強いられるのではないかな。

ちなみに、代表的なCPUのスピードを見てみると、
Core i7 Extream 965(3.2GHz) 69.18G flops
Core 2 Quad Q9650(3.00GHz) 40.71G flops
Core 2 Duo(2.6GHz) 14G flops

CPUがどんなに早くても、GPUの演算サポート(OpenCL)の有無、GPUのスペックによって
特定の処理(映像エンコード、デコードとか)の速度に雲泥の差が出てくると思われます。


ちなみに、おいらの持ってるMacBookProに搭載されてるのは、GeForce9400Mです。
おいらはHD映像の編集とかはしないから、今のところこれで十分さー。


2010-01-13 追記

                                                                                                                                          • -

いつもコアな情報でお世話になっているMb kuro logさんによると、
Radeon HD 4000番台はOpenCLではパフォーマンスが出ない模様。
GeForce 9400Mよりも遅いみたい。。
これはMacOSの将来のバージョンアップでも同じなのだろうか、、。
5000番台では、OpenCLに最適化される予定とのことです。
MB kuro log:OpenCL Bench, iMac (Core i7 2.8GHz, Radeon HD 4850) vs MacBook Pro (Core 2 Duo 2.53GHz, GeForce 9400M) - livedoor Blog(ブログ)

                                                                                                                                          • -

Windows用USBキーボードをMacで使うには

とあることから、USBキーボードを家のMacBookProに繋ぐ機会があった。
普通にUSB端子にさせば、キーボード認識ウィザードが立ち上がって使えるようになるんだけど、
日本語入力のON、OFFをどうやるのか、ちょっとだけはまったのでメモ。

ひらがな/カタカナキーとか変換キー、半角/全角キーを押しても日本語入力に切り替わってくれません。
ググって一発で答えが返ってきた。便利な世の中になったもんだ。
Widnwosキー+スペースで日本語入力ON、OFFを切り替えられた。
一件落着。
これって、Macで言うところのコマンドキー+スペースに相当するものですね。
Macでは普段日本語入力の切り替えに、かなキーとか英数キーを使っていたので、
気付きませんでした。

iTunesなどMacで鳴っている音をBGMにして、Skypeの会話をネットラジオで放送する時のサウンド設定の図

SoundflowerとLadiocastというフリーソフト2つを使って、うまくできるらしい。
最初、設定とかネットで見ても何が何だかよくわからなかったけど、なんとか理解できた。
理解したことを図に表わしてみた。(暇人、、)
ほんとは暇じゃないんだよ。仕事が遅れに遅れてるのに何やってんだおれ。

  1. iTunesなどMacで鳴っている音をBGMとして配信
  2. Skypeの会話を配信
  3. Skypeの通話相手にもBGMを聞こえるようにする

の場合の設定例

ねとらじなどのインターネットラジオの場合これでOK。
Mainに入ってくる音声をLadiocastが配信してくれるから。
ustreamで配信する場合、これではNGです。

(3)が出来なくてOKなら(Skypeの通話相手にBGMが聞こえなくてOKなら)、
うまく設定することができます。
ustreamで(3)まで含めてやりたいときの、配線図?がまだ思い浮かびません。
いろいろ考え中。


ところで、Soundflower(2ch)とSoundflower(16ch)ってなにか違いはあるんですかね?
上の図だと、2chと16chそっくり入れ替えても何も変わらないと思うんだけど。

CotEditorを試してみる

プログラマーにとってエディタは命の次に大切なもの?(いやいや、そこまでじゃないか。)
macのエディタもいくつかあって、シェアウェアも結構評価を得ているみたいなんだけど、
僕はフリーのが欲しかったんで、その中でも結構評判のよさそうな、CotEditorを試している最中。


いろいろ設定いじってみて、今のところ、やりたいことは全てできた。問題なし。
プログラマーなら、改行、タブ、全角スペース表示って必須だよね?


早く、「macbookのバッテリーの容量をはてなグラフにアップするスクリプト」アップしないとなぁ。
基礎的な部分は出来てて動いているんだけど、いちおう最低限のエラー処理とかね、書かないと。
コアな部分ができちゃって満足してる自分がいる。


winからmacにスイッチして強く思った。
viかemacs使いこなしてれば、どの環境に行ってもエディタで困ることはないなぁ、と。
ちなみにWindowsでは、ver1のころからEmEditorを使ってます。
かなり強力なエディタなんだけどな、いまいちメジャーにならないな、、。
秀丸強い。