Nexus 7 32T (2012) 死亡

Nexus 7 32T (2012) が死亡した。2013年12月末(Asus Outlet で安売りが開始された時期)から使っていたので、1年2ヶ月の命であった。

ことの発端は、電車内で Google Play Music 経由で音楽を聴いていたら、突然フリーズしたことによる。その後、再起動できない状態(4色ボールのアニメーアニメーションが延々と続く)になってしまった。これは昨年の修理した筈のハードウェアの故障かと思ったが、自宅に帰ると何とか起動はするようになった(Recovery Mode から Factory Reset 済み)。

しかし、問題はその後に起こった。「問題が発生したため、Google Play 開発者サービスを終了します。」というエラーメッセージが何度も出るようになってしまった。その他に「com.google.process.location」と「com.google.process.gapps」のプロセスもエラーが加わることもあった。

このエラーは、Android 端末によくあるようで情報は豊富であった。ほぼ全部試したが駄目であった。それらを列挙すると――。

  • 端末の日付のチェック
  • 同期するアカウントの削除・再追加&再起動
  • 「Google Play 開発者サービス」「ダウンロードマネージャ」等のキャッシュ消去
  • 「Google Play 開発者サービス」「Google Play ストア」のアップデート
  • 同期するアプリのチェックを切る

このエラーはアカントの同期がうまくいかない際に起こすようだが、そもそも初期化してアカウントがない状態にしても、「ようこそ」画面ですでにエラーが出てくるのである。これではお手上げである。

もちろん「Google Play 開発者サービス」をオフにすると、当然この症状は収まる(無効化は、設定→「セキュリティ」→「端末管理者」→「Androidデバイスマネージャー」のチェックをはずすと可能になる)。しかし、これでは「Google Play ストア」からアプリをダウンロードできなくなるので、実質的には使えなくなる。

幸いにして、それ以外は問題がないようなので、パソコンと USB 接続し、Android SDK 経由でアプリをインストールすることはできる (adb install *.apk 上書きの場合は、-r オプションを付ける)。

野良 apk にはウイルスも多いので不安ではあるが、ソフトウェアの問題で「故障」と判断はしたくない。もしからしたら、その内の自然に直るのではないかと思っていた矢先――なんと、子供がプラスチックのおもちゃを Nexus 7 のディスプレイの上に落してしまった!

打ち所が悪かったのか、ガラスには派手にヒビが入り、タッチがしにくくなってしまった。

かくして、一年以上、かた時も離れることがなかった我が相棒 Nexus 7 が逝ったのである。R.I.P.

Emacs のミニバッファから(タイムラインを開かずに)Twitter に投稿する2

emacs_tweet.rb の設定

前回は、準備段階として Windows 7 (64bit) の Cygwin 上で Ruby とその Twitter パッケージを使えるようにした。今回は、Emacs の設定をする。

まず、emacs_tweet.rb というファイルを作り、以下の内容を記入した上で Path が通った場所に置く。


require 'rubygems'
require 'twitter'
require 'kconv'


USERNAME = '*****' # Twitter の自分のアカウント名
PASSWORD = '*****' # 同パスワード


client = Twitter::REST::Client.new do |config|
config.consumer_key = '******************************'
config.consumer_secret = '***************************'
config.oauth_token = '*******************************'
config.oauth_token_secret = '************************'
#config.proxy = 'http://proxy:port'
end


ARGV[0]&&(Twitter::Client.new())
client.update(Kconv.toutf8(ARGV[0])) rescue puts "error:"+$!.to_s


consumer_key, consumer_secret, oauth_token, oauth_token_secret の4つのキーは、Twitterで、emacs_tweet.rb を登録して取得したものを記す(この過程は、Ruby を使った bot 作成などでよく紹介されているので省略)。



なお、Ruby のバージョンアップに伴い、元々の emacs_tweet.rb の記述が使えなくなっているので、上記は次のような変更を行っている。


新:client = Twitter::REST::Client.new do |config|
旧:Twitter.configure do |config|


新:client.update(Kconv.toutf8(ARGV[0])) rescue puts "error:"+$!.to_s
旧:Twitter.update(Kconv.toutf8(ARGV[0])) rescue puts "error:"+$!.to_s


Emacs の設定

次に ~/.emacs(最近では ~/.emacs.d/init.el に書けと言われている)に、以下を記す。


;; ミニバッファーから Tweet する。
(defun tweet (tweet)
(let* *1
(command (concat "ruby -Ku -W0 " ruby-script " \"" (encode-coding-string tweet shell-char-code) "\""))
(result (shell-command-to-string command)))
(if (equal "" result)
(message "投稿が完了しました。")
(message result))))


(defun tweet-from-minibuffer ()
(interactive)
(let ((tweet (read-from-minibuffer "tweet: ")))
(when tweet
(message "投稿中です。")
(tweet tweet))))
;; キーバインド
(global-set-key "\C-ct" 'tweet-from-minibuffer)

これで、M-x tweet-from-minibuffer(または上記の例では C-x t)とすると、ミニバッファから Twitter に投稿できる。制限文字数のカウントといったおしゃれなものはないが、私には十分である。



なお、Cygwin のインストーラ経由 Ruby の古いバージョンが残っていると、Emacs がそちらを参照してしまいエラーが出るようである。その場合は、~/.emacs で以下にように指定すれば良い。


;; rbenv でインストールした Ruby を使うための設定
(setenv "PATH" (concat (getenv "HOME") "/.rbenv/shims:"
(getenv "HOME") "/.rbenv/bin:" (getenv "PATH")))
(setq exec-path (cons (concat (getenv "HOME") "/.rbenv/shims")
(cons (concat (getenv "HOME") "/.rbenv/bin") exec-path)))



*1:ruby-script "c:/bin/emacs_tweet.rb") ;; emacs_tweet.rb へのパス (shell-char-code 'sjis) ;; シェルの文字コード: sjis, utf-8 or euc-jp (tweet (replace-regexp-in-string "\"" "\\\\\"" tweet

Emacs のミニバッファから(タイムラインを開かずに)Twitter に投稿する1

これは何か

自分は Twitter を「短いメモ置き場」として利用しており、SNS の本来(?)の使い方はしていない。つまり、コミュニケーションの手段としては使用しておらず、他のユーザーをフォローしたり、メッセージを送ったりはしないし、たまに来る他者からのコメントもほとんど反応しない(すみません)。

こうした利用法なので、タイムラインをいちいち表示しないで Tweet したい。そうなると、Emacs の Twittering-mode も xyzzy の xyttr もやや使いづらいものとなる。

少数派ながら同じようなことを考える人はいるもので、かつてタイムラインを表示せずに Emacs のミニバッファから Twitter に投稿できる拡張が公開されていた(現在は見れないリンク)。非常に便利に使わせていただいたのだが、いつの間にか投稿できなくなってしまった。

以下では、それを復活させた過程を書く。

Ruby のインストール&最新版に更新

環境が Windows XP Pro (32bit) から Windows 7 Pro (64bit) に変わったので、Ruby のインストールから始める。Cygwin を入れているので、同インストーラーから Ruby をインストールした。さらに、Ruby に Twitter ライブラリを入れなければならない。ここでまず躓いた。

Ruby のライブラリは、RubyGems というパッケージ管理システムを利用して簡単にインストールすることができる。ところが、以下にようなエラーが出て Twitter ライブラリをインストールできなかった。


$ gem install twitter
ERROR: While executing gem ... (ArgumentError)
invalid byte sequence in UTF-8

エラーメッセージを検索すると、Ruby のバージョンを 2.1.0 以上に上げなければならないようだ(参照)。Cygwin のインストーラーからは不可能なので、rbenv と ruby-build を使って最新の状態にする。

まず、このサイトの説明を参考にして、Cygwin 上で atp-cyg というコマンドが使えるようにする。

その後、以下にようなコマンドで必要なパッケージを入れる。


$ apt-cyg install git gcc-core gcc-g++ make zlib-devel curl \
autoconf libiconv libiconv-devel rsync patch unzip openssh openssl-\
devel libxml2-devel libxslt-devel libffi-devel libgdbm-devel

次に、rbenv と ruby-build を入れる(以下での ~/.bashrc は、人によっては ~/.zshrc にする)。


$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build


$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc


$ $SHELL --login


$ rbenv install 2.2.0
$ rbenv global 2.2.0
$ rbenv rehash

なお、利用可能な Ruby のバージョンは、rbenv install -l で確認できる。

これで次のように確認して、最新版が出れば問題ない。


$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-cygwin]


しかし、私の場合はそう簡単にはいかなかった。まず、~/.rbenv というディレクトリがないというエラーがでたが、これは何でもないので手動で作った。今度は問題ないように見えたが、以下のようなエラーが出てインストールが失敗してしまった。


uncommon.mk:187: ターゲット 'build-ext' のレシピで失敗しました
make: *** [build-ext] エラー 2

CYGWIN/tmp/ 以下の ruby-build.<ビルド番号>.log には、次のように書いてあった。


make[2]: ディレクトリ '/tmp/ruby-build.20150228024619.4332/ruby-2.2.0/ext/-test-/printf' に入ります
compiling printf.c
printf.c:23:1: エラー: ‘utoa’ と型が競合しています
utoa(char *p, char *e, unsigned int x)
^
In file included from /usr/include/stdio.h:29:0,
from ../../.././include/ruby/defines.h:26,
from ../../.././include/ruby/ruby.h:29,
from ../../.././include/ruby.h:33,
from printf.c:1:
/usr/include/stdlib.h:184:8: 備考: 前の ‘utoa’ の宣言はここです
char * _EXFUN(utoa,(unsigned, char *, int));
^
Makefile:241: ターゲット 'printf.o' のレシピで失敗しました
make[2]: *** [printf.o] エラー 1
make[2]: ディレクトリ '/tmp/ruby-build.20150228024619.4332/ruby-2.2.0/ext/-test-/printf' から出ます
exts.mk:118: ターゲット 'ext/-test-/printf/all' のレシピで失敗しました

これは、CYGWIN/tmp/ruby-build.<ビルド番号>/ruby2.2.0/ext/-test-/printf/ 以下の printf.c というファイルで3箇所ある、utoa という定義名が問題だということ。このサイトを参考にして、上記ファイルを改名(名称は他と競合しなければ適当でいいようなので、my_utoa とした)し、その後、下記のように手動でインストールする。


$ cd /tmp/ruby-build.<ビルド番号>/ruby-2.2.0
$ make
$ make install

これでようやく、Cygwin 上の Ruby を最新にすることができた。



次回に続きます。

シェーバーの消耗品購入

単なる備忘録ですが、シェーバー (National ES804) の消耗品を一括購入した。

  • Panasonic 外刃と内刃のセット ES9012(3000円)
  • パナソニック シェーバー用蓄電池 ESLA50L2507N(890円)
  • Panasonic オイル ES003P(756円)
全部 Amazon で手に入れることができた。Amazon の購入履歴で、前回はいつ買ったのかわかるので便利だ(洗脳されてしまう危険性があるが…)。

それにして、このシェーバーも9年目となる。よく持つものだ。


[追記:2015-03-13]実際に交換した(内刃は2年、外刃は1年が寿命)。

外国語と日本語のキーボードレイアウトのトグル(切り替え)

NTEmacs で、 Windows のインプット・メソッドを使わずに、外国語(英語以外)と日本語の混在文書を書きたい。例えば、MS-IME(日本語)と French-alt-postfix(フランス語)を交互に使いながら入力する等。キーボード・レイアウトを簡単に切り替えながら行うには、どうしたらよいか。

少し迷ったが、以下のようにすればいいようだ。


;; インプットメソッドのトグル
(defun my-toggle-input-method ()
"toggle methods"
(interactive)
(if (string= current-input-method "french-alt-postfix") ;; 特定の言語のキーボード・レイアウトを指定
(set-input-method "W32-IME") ;; nil だと input medthod なし
(set-input-method "french-alt-postfix") ;; 特定の言語のキーボード・レイアウトを指定
))
(global-set-key [f8] 'my-toggle-input-method) ;; キーバインディングの指定

UPSmini500 IIBのバッテリ交換

ユタカ電気のUPS(無停電電源装置)UPSmini500 IIB が突然、壊れた。警告音を短く発するやいなや、繋いでいたPCの電源が落ちてしまった。電源スイッチを押してみると、しばらくは普通に作動していたが、10分程度でまた切れてしまった。その後は、再起動しても警告音がちょっと鳴って切れてしまうという状態。当然、繋いでいる機器に電気は提供されない。

ごたぶんに漏れず、2011年の東日本大震災で「計画停電」をくらった時、衝動買いしてしまった奴だ。幸いにして、この三年間でUPSのごやっかいになったことは一度もなかった。しかし、バッテリの寿命は6〜7年と書いてあったので、一体どうしたことだろう。

調べてみると、ヒューズが切れてしまったという可能性が浮上した。過電流を流した覚えはないので、あやしいとは思いつつ一応、確認してみる。ヒューズはガワを開けなくても交換できる。電源部分に取り出し口があるのだ。ご丁寧にも予備のヒューズが付属していた。



ところが、ヒューズは切れていなかった。念のため予備のものに交換してみたが、症状は変わらず。機器を外してしばらく充電させても無駄であった。

その内、もしかしてバッテリが寿命となってしまったのではないかと思いついた。前述の通り、バッテリ駆動はほとんどしていないので、納得できない感もあるが、一応、試してみようとバッテリを外した状態で機器を繋いでみたら、何の問題もなく動いた。このUPSは「常時商用給電方式」なので、通常の使用ではバッテリは関係ない筈だが・・・。詳しい理由は分からないが、とりあえず私の状況ではバッテリが原因である可能性が高い。



それを確かめるためには、バッテリを交換してみるしかない。だが、この機種はバッテリ交換型ではない。メーカーに依頼すると、おそらく高くつくだろう。買った時の価格は1万円以下なので、これは新品(後継機種)を購入した方が無難である。

とはいえ、UPSというものは問題がない時はただの金食い虫であり、わざわざ新しいものを買いたくはない(「喉元すぎれば」という感じで恥ずかしいが・・・)。そこで調べてみると、内蔵バッテリとまったく同じサイズ、規格のものが秋月電気で売っていることが分かった。値段は1600円で送料込みで2100円。もし、失敗しても我慢できる価格だろう。さっそく注文してみることにした。



バッテリと本体はケーブルで接続されており、簡単に取り外しはできないようになっている。しかし、バッテリ側のケーブルは半田付けなどはされておらず、単に金属金具で挟んでいるだけなので、ラジオペンチでひっこ抜くことができた。テスターで調べてみると、案の定、バッテリは死んでいた。



次に新しいバッテリを取り付ける。これは注意が必要。最初、ペンチを金属部分が触れて火花が散ってあせった。交換後は、緑ランプが付き、UPSが見事復活。3年寿命だとすると、年間700円か。次にバッテリがへたったらどうしようか。おわり



NTEmacs 24.2 で google-translate を使う

最近のGoogle 翻訳って、結構使えますね。まあ、ダイレクトに日本語にするのはまだまだ難しいようですが、欧米系の言語だったら英語にしちゃえばそれほど問題なく理解できて便利です。

だから、Emacs 上から Google 翻訳が使える google-translate というのがあると、「これは絶対使いたい!」と思った訳です。ところが、かなり嵌ってしまった。

説明サイトによると、google-translate.el をダウンロードし、load-path が通った場所に置き、~/.emacs に以下を書けばOKなのですが。


;; google-translate.el
(require 'google-translate)
;; キーバインド
(global-set-key "\C-ct" 'google-translate-at-point)
(global-set-key "\C-cT" 'google-translate-query-translate)

自分の環境 (NTEmacs 24.2) では、\C-ct で元の言語を選んで、翻訳先の言語を指定しようとすると、以下のようなエラーが出てしまいます。


Debugger entered--Lisp error: (void-function cl-flet)
(cl-flet ((read-language nil (google-translate-completing-read prompt
[...]

"cl-flet" というのが空だよという意味で、これは Emacs 24.3 で採用されているもののようですが、私の環境では Emacs 24.3 だと skkserver と通信できないので、どうしても Emacs 24.2 で動かさなければならない。

そこで検索した結果、"cl-flet" を "flet" に書き換えればよいというので、google-translate.el の450行目を以下のように変えます。


; (cl-flet ((read-language () ;; コメントアウト
(flet ((read-language () ;; Emacs 24.2 対策

これで翻訳先の言語も指定できるようになったのですが、今度は


Debugger entered--Lisp error: (void-function mailcap-parse-mailcaps)
(mailcap-parse-mailcaps)

というエラーが出るわけです。これは google-translate.el の内部で使われている url.el の問題で、Emacs の組み込みの mailcap.el よりも flim パッケージの mailcap.el が先に読まれてしまうことが原因だとか(参考URL)。

解決策はよく分からなかったが、とりあえず flim の mailcap.el をリネームすれば google-translate が正常に動いた。

なお、重複する名前の Elisp ライブラリを表示する "M-x list-load-path-shadows" というコマンドがあり、自分の環境では300以上重複があった。これは整理しないと駄目だな…。