MacBook のバッテリー充放電回数を CUI で取得

Date
2015-03-27 22:14
Author

Akihiro Uchida

tags

osx

category

memo

slug

battery-cycle-count-for-macbook

lang

ja

バッテリーの充放電回数は MacBook のバッテリー劣化を図る指標で Mac ノートブック:バッテリーの充放電回数を確認する には /Applications/Utilities/System Information.app による充放電回数の値の確認方法と、各世代の MacBook 最大充放電回数の表が掲載されています。

いちいちアプリケーションを開いて確認するのも面倒なので CUI のスクリプトで取得してみました。

System Information.app で取得できる情報は system_profiler(8) で取得できます。

手っ取り早く取得するならこんなワンライナー。

$ system_profiler SPPowerDataType | awk -F: '/Cycle Count/ { print $2 }'

もう少しきちんと xml 出力して xpath でパースすることも。

$ system_profiler SPPowerDataType -xml | xpath '/plist/array/dict/key[.="_items"]/following-sibling::*[1]/dict/key[.="sppower_battery_health_info"]/following-sibling::*[1]/key[.="sppower_battery_cycle_count"]/following-sibling::*[1]/text()' 2>/dev/null

複雑すぎですね。plist xml の要素取り出しは plutil で単純化できます。

$ system_profiler SPPowerDataType -xml | plutil -extract '0._items.0.sppower_battery_health_info.sppower_battery_cycle_count' xml1 -o - - | xpath '/plist/integer/text()' 2>/dev/null

plist xml を plutil で簡単に扱えます。まるで json を jq で扱うようです。

ちなみに私の環境だと MacBook Pro (Retina, 13-inch, Late 2013) で購入後276日経過時点で396回でした。このペースだと、だいたい2年程度で最大充放電回数とされる1000回に達しそう。

Plotly + iPython Notebook を試す

Date
2013-11-05 16:38
Author

Akihiro Uchida

tags

python

category

memo

slug

plotly-and-ipython-notebook

lang

ja

iPython Notebook は対話的に操作でき、メモを書けて、作業を記録に残すことができる。とても便利。

ただ、現状 iPython notebook でグラフを対話的に拡大、縮小するには matplotlib と qtconsole を使う方法がある。ただ、qtconsole を利用するには当然 Qt を入れる必要があり、 virtualenv を利用していたりするとインストールに一手間かかる。

そこで Plotly という Web サービスと iPython notebook を組み合わせると比較的手軽にグラフ操作ができるので紹介。 (matplotlib は version 1.3 で WebAgg が導入されたので、そのうち iPython notebook と WebAgg を組み合わせれば plotly と同様の操作ができるようになるはず。)

Plotly は Web 上でデータ分析や可視化ができる Web サービス。さらに、以下の言語用の API が提供されていてるので、グラフ用のライブラリとしても利用できる。

REST API も用意されているので、それを使えば他の言語からも利用できるはずです。特に Python は iPython Notebook で plotly の出力する HTML を埋め込むことで、拡大や縮小等を対話的に操作できます。

ただ、以下に示す方法では plotly 自体にアクセス制御機能があるにも関わらず、現状デフォルトでは public に設定されてしまうようです、注意。

インストール、ユーザ登録

pip からインストールできる。

$ pip install plotly

さらにユーザ登録して API キーを取得しておきます。

iPython Notebook から利用する

iPython notebook を起動

$ ipython notebook

plotly を import

import plotly
py = plotly.plotly(username='<your-username>', key='<your-api-key>')

とりあえずデータを作ってみました。

import numpy as np

N = 10000
K = 1.0
twopi = 2 * np.pi

q, p = np.zeros(N), np.zeros(N)
q[0], p[0] = [0.1, 0.1]
for i in range(1,N):
    q[i] = q[i-1] + p[i-1]
    q[i] = q[i] - np.floor(q[i] / twopi) * twopi
    p[i] = p[i-1] + K * np.sin(q[i])
    p[i] = p[i] - np.floor(p[i] / twopi) * twopi

プロットするため、データを plotly 用に json の中に用意します。

data = {'x': q, 'y': p, 'type': 'scatter', 'mode': 'markers', 'marker': {'size': 2}}

plotly にプロットさせてみます。

filename の部分は元データが Standard Map なので stdmap としました。これは plotly 上でデータセットを認識するための名前に利用されます。

response = py.plot(data, filename='stdmap', fileopt='overwrite')

下記のように表示されました、成功したようです:

High five! You successfuly sent some data to your account on plotly. View your plot in your browser at https://plot.ly/~<your-username>/0 or inside your plot.ly account where it is named 'stdmap'

iPython notebook 上に表示させます。

from IPython.display import HTML
src = '<iframe src="{}/600/600" width="650" height="650"></iframe>'.format(response['url'])
html = HTML(src)
html

こうすると iPython notebook 上でグラフが表示され、ドラッグして拡大、ダブルクリックで戻るなど、対話的に操作ができます。

こんな感じです。

参考

Sphinx と transifex を活用した翻訳手順

Date
2013-09-15 0:13
Author

Akihiro Uchida

tags

transl, sphinx, transifex

category

memo

slug

workflow-with-transifex-and-sphinx

lang

ja

2年程前から放置していた scipy-lecture-notes の翻訳 を再開した。いまや Sphinx は gettext を利用して翻訳できるようになり、さらに transifex という割と使いやすい翻訳サイトもあらわれ、翻訳元が更新されたときの差分翻訳がしやすくなったので、いろいろ試して翻訳手順が確立してきたので載せてみた。

書いてから気づいたが Using Transifex service for team translation - Sphinx document にだいたい書いてある、そっちを見た方が早い。

ドキュメントの取得

まずは、翻訳元の Sphinx ドキュメントを取得

$ git clone https://github.com/scipy-lectures/scipy-lecture-notes.git
...
$ cd scipy-lecture-notes

以降の操作は scipy-lecture-notes ディレクトリ以下で。

ついでに翻訳元のドキュメントが git で管理されている場合は、どのバージョンを翻訳するか決めておくこと。 (翻訳途中にファイル名変更や削除など構造が変わるとつらいことになる)以下のようにして tag: 2013.1 のコミットからブランチを切り、そこで作業するとかした方がいい。

$ git checkout -b 2013.1-transl 2013.1

gettext の生成

make のターゲットに gettext が無かったので追加し、 conf.py で gettext_compactFalse に設定。 gettext の出力先は他のターゲットに合わせて build 以下にした。また、翻訳した内容で build するために conf.py で locale_dirs = ['locale/'] も設定

diff --git a/Makefile b/Makefile
index e59b398..d949399 100644
--- a/Makefile
+++ b/Makefile
@@ -11,9 +11,10 @@ PYTHON        = python
 PAPEROPT_a4     = -D latex_paper_size=a4
 PAPEROPT_letter = -D latex_paper_size=letter
 ALLSPHINXOPTS   = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+I18NSPHINXOPTS  = $(SPHINXOPTS) .


-.PHONY: help clean html web pickle htmlhelp latex changes linkcheck zip
+.PHONY: help clean html web pickle htmlhelp latex changes linkcheck zip gettext

 help:
        @echo "Please use \`make <target>' where <target> is one of"
@@ -103,3 +104,8 @@ install: pdf html
        git commit -a -m 'Make install' && \
        git push

+gettext:
+       $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) build/locale
+       @echo
+       @echo "Build finished. The message catalogs are in build/locale."
diff --git a/conf.py b/conf.py
index efb63a9..19b99c5 100644
--- a/conf.py
+++ b/conf.py
@@ -304,3 +304,6 @@ extlinks = {

 pngmath_dvipng_args = ['-gamma 1.5', '-D 180', '-bg', 'Transparent']
 pngmath_use_preview = True
+
+gettext_compact = False
+
+locale_dirs = ['locale/']

make gettext して pot ファイルを作成し、

$ make gettext
...

transifex への追加

transifex のアカウント、組織、プロジェクトを作成。オープンソースプロジェクトに関しては Free Plan で組織を作れる。

transifex_clientsphinx-intl をインストール。

$ pip install transifex_client
...
$ pip install sphinx-intl
...

tx init コマンドで ~/.transifexrc と .tx/config を生成。途中で transifex のユーザ名とパスワードを聞かれるので入力。 ~/.transifexrc にパスワードがべた書きされているのがとても気持ち悪い。

$ tx init
Creating .tx folder...
Transifex instance [https://www.transifex.com]:
Creating skeleton...
Creating config file...
/path/to/home/.transifexrc not found.
No entry found for host https://www.transifex.com. Creating...
Please enter your transifex username: <transifex-username>
Password:
Updating /path/to/home/.transifexrc file...
Done.
$ cat ~/.transifexrc # 生成された ~/transifexrc を確認
[https://www.transifex.com]
hostname = https://www.transifex.com
password = <transifex-password>
username = <transifex-username>
token =
$ cat .tx/config # 生成された .tx/config を確認
[main]
host = https://www.transifex.com

sphinx-intl コマンドで .tx/config に各 po ファイルの内容について書き加え、 tx コマンドでリソースの登録。

$ sphinx-intl update-txconfig-resources --pot-dir build/locale --transifex-project-name="<project-name>"
Updating source for resource <project-name>.AUTHORS ( en -> locale/pot/AUTHORS.pot ).
Setting source file for resource <project-name>.AUTHORS ( en -> locale/pot/AUTHORS.pot ).
Updating file expression for resource <project-name>.AUTHORS ( locale/<lang>/LC_MESSAGES/AUTHORS.po ).
...
$ cat .tx/config # .tx/config の更新を確認
[main]
host = https://www.transifex.com
type = PO
...
[<project-name>.intro--summary-exercises--auto_examples--plot_sprog_annual_maxima]
file_filter = locale/<lang>/LC_MESSAGES/intro/summary-exercises/auto_examples/plot_sprog_annual_maxima.po
source_file = locale/pot/intro/summary-exercises/auto_examples/plot_sprog_annual_maxima.pot
source_lang = en
$ tx push -s
Pushing translations for resource <project-name>.AUTHORS:
Pushing source file (locale/pot/AUTHORS.pot)
Resource does not exist.  Creating...
...

transifex にソースとなる言語のリソースが追加されているので、言語を追加で日本語を追加します。

あとはひたすら翻訳。transifex の web UI 上でも翻訳できるし、ダウンロードしてエディタで翻訳もできる。

翻訳後にドキュメントを確認する場合は以下のようにして po ファイルを取得してビルド。

$ tx pull -l ja
...
$ sphinx-intl build
...
$ make -e SPHINXOPTS="-D language='ja'" html
...

バージョン管理

transifex には Release というバージョン機能のようなものがありますが、今のところ Web API が提供されていないので Web 上追加していくしかありません。ファイルが多いと追加も面倒なので、現状ではバージョン毎にプロジェクトを分けた方がよさそうです。

複数プロジェクトの場合でも翻訳メモリが共有されるので、近い原文の訳文を候補として提示してくれます。