タイムアウトつき url-retrieve-synchronously

SKK の ML に書いた内容をブログにもメモしときます。



url-retrieve-synchronously は同期的に HTTP で指定した URL にアクセスすることができますが、相手サイトが重いと反応が中々返ってこず、Emacs が固まってしまいます。


その問題を解決するために、タイムアウトつきの url-retrieve-synchronously を作ってみました。
単純に run-with-timer で url-retrieve のプロセスを監視するタイマを作り、タイマが励起されると url-retrieve のプロセスが殺される仕組みです。
タイマウトは、デフォルトで2秒で発生します。

(require 'url-http)

(defun my-url-retrieve-with-timeout (url coding-system &optional timeout-interval)
  (let ((url-max-redirections 0)	; URL リダイレクトを抑制する
	;; `url-retrieve' のためのコールバック関数
	(url-callback #'(lambda (status coding)
			  (let (p)
			    (setq done t)
			    (when (setq p (url-http-symbol-value-in-buffer
					   'url-http-end-of-headers
					   (current-buffer)))
			      (setq jsonp
				    (decode-coding-string
				     (buffer-substring (1+ p) (point-max))
				     coding))))))
	;; タイムアウト発生時に呼ばれるコールバック関数
	(timeout-callback #'(lambda ()
			      ;; `url-retrieve' のプロセスを止める
			      (when (processp proc)
				(delete-process proc))
			      ;; `url-retrieve' は終わったものと見做す
			      (unless done
				(setq done t))))
	;; タイムアウト時間
	(timeout-interval (if timeout-interval timeout-interval 2))
	(done nil)
	buf proc jsonp timeout)
    (unwind-protect
	;; condition-case を用いて全てのエラーを捕捉する。ここで、捕捉した
	;; エラーは無視する。開発、デバッグ時には condition-case のブロック
	;; を外す。
	(condition-case e
	    (when (setq buf
			(url-retrieve url url-callback (list coding-system)))
	      (setq proc (get-buffer-process buf)
		    ;; タイムアウト監視用の timer を設定する
		    timeout (run-with-timer timeout-interval timeout-interval
					    timeout-callback))
	      ;; `url-retrieve' は非同期なので、同期的に結果を得られるよ
	      ;; うに待ち合わせる。ここでは、
	      ;; `url-retrieve-synchronously' が行っていることとほぼ同等
	      ;; のことをしている。本関数では、URL リダイクレトはしない
	      ;; (はず)なので、URL リダイレクトに対する対策の部分のみ削除
	      ;; してある。
	      (while (null done)
		(when (and proc (memq (process-status proc)
				      '(closed exit signal failed))
			   (eq proc (or (get-buffer-process buf) proc)))
		  (delete-process proc)
		  (setq done t))
		(unless (or (with-local-quit
			      (accept-process-output proc))
			    (null proc))
		  (when quit-flag
		    (delete-process proc))
		  (setq proc (and (not quit-flag)
				  (get-buffer-process buf))))))
	  (error
	   ;; 全てのエラーは無視する
	   nil))
      (when (bufferp buf)
	(kill-buffer buf))
      ;; タイムアウト用の timer を削除する
      (when timeout
	(cancel-timer timeout)
	;; 一応、初期化をしておく
	(setq timeout nil)))
    jsonp))


利用例としては、social ime 相手に使うと以下のような感じです。
もし、2秒以内に social ime から応答が無ければ、my-url-retrieve-with-timeout は nil を返します。

(let ((url (concat "http://www.social-ime.com/api/"
		   "?string=" (url-hexify-string
			       (encode-coding-string "あ" 'utf-8))))
      res)
  (when (setq res (my-url-retrieve-with-timeout url 'euc-jp))
    (split-string (substring res 0 (1- (length res))) "\t" t)))
;; => ("亜" "唖" "娃" "阿" "蛙" "吾" "亞" "呀" "堊" "婀" "椏" "痾" "錏" "鐚" "閼" "鴉" "あ" "ア")


timeout の間隔を短くする場合、my-url-retrieve-with-timeout の第3引数に数値を指定します。
少数でもオッケーです。

(my-url-retrieve-with-timeout url 'euc-jp 0.5)


もっと上手いやり方があるだろうなーとか思いながら、そんなこんなで。

更新時刻

  • 2011/11/12 23:20

KBC Poker (Cherry Mini) 白軸化

気付いたら家に Cherry 軸搭載のミニキーボード KBC Poker が4枚もあったので、1枚白軸化してみました。


概要

KBC Poker とは Cherry 軸を搭載した HHKB ライクなメカニカルキーボードです。
日本では最近、Cherry Mini という名前で売られています。
8000円から9000円ぐらいで、HHKB (の Pro)と比べればはるかに安く、おすすめできるキーボードです。
KBC Poker は、軸の違う4種類があり、茶軸版、黒軸版、青軸版、赤軸版があります。


ただ、Cherry 軸は、白軸や灰軸、緑軸等、もっと多くの種類があります。
その中で白軸は、軸だけ簡単に手に入るので、買って植えかえてみました。
# 日本では白軸と言われていますが、海外では Clear みたいです。


画像

植えかえた後の画像が以下です。2枚持っていた赤軸版の KBC Poker 1枚に犠牲になってもらいました。

白軸を載せたキーボードを触った事なかったので、今回入れ替えたキーボードではじめて触りました。
感触は好きです。赤軸や茶軸と比べてはるかに軸の中のバネが強いので、反発力がそれなりにあります。


赤軸や黒軸のようなリニアな感触ではなく、青軸のようなクリック音はなく、茶軸に近い感じです。
ただし、茶軸よりかなり重いです。
茶軸の感触は好きだが、軽すぎてちょっと…という人に良いかもしれません。

まとめ

軸だけを単体で買った場合、キーボードの軸を入れ替える際に、軸自体を分解してダイオードを移植しなければならないのですが、KBC Poker ではダイオードが基板側についているようで、買った軸をそのまま何も考えずに植えかえられます。
軸の取り外しは、今回の場合、軸1つにつき2箇所のはんだを吸い取る必要があります。
はんだの吸い取りは、Twitter で教えてもらったのですが、はんだシュッ太郎という器具を使えばかなり楽に行えます。
かかった時間は、はんだの吸い取り、軸の入れ替え、はんだづけを全てのキーで、およそ2時間ほどでした。


白軸自体は Mouser から買いました。軸1個につきだいたい70円ぐらいでした。
7000円以上の購入で送料が無料となるので、Poker 2枚分の130個ぐらい買いました。


Cherry 軸の入れ替えはちょっと根気が必要ですが、作業自体は単純作業なので簡単です。
赤軸が好き等と好みの軸があって、手元に Cherry 軸を載せたキーボードがあるならやってみると楽しいかもです。
# 自分は手元の KINESIS コンタードキーボードを赤軸に入れ替えて使ってます。快適ですw


おまけ

KBC Poker にはキートップが ABS 樹脂版と PBT 樹脂版があります。
PBT 樹脂版の方が値段が高く、キートップがはるかに綺麗です。
ちなみに、Cherry Mini は ABS 樹脂版です。

両方の画像で上が ABS 版、下が PBT 版です。なお、上の ABS の KBC Poker は白軸に入れ替えたやつです。見た目上は分からないですねw
PBT 版は、Yahoo チャイナモールで買えます。


そんなこんなで。

追記


キートップを引き抜くだけの動画をとりました。ニコニコです。音声なしです。



更新時刻

  • 2011/20/19/21:45

Matias Dvorak キーボード買った

ハードウェアで Dvorak 配列をサポートすると謳っているキーボード「Matias Dvorak Keyboard」をある日見付けて面白そうだったので買ってみました。

画像

画像です。分解した画像も撮ろうと思ったのですが、分解したところ、
メンブレンのゴム製のキャップが散乱してそれどころではなくなってしまい、撮る気が失せてしまったのでこれだけです。

画像にあるように、キートップの印字は Dvorak がメインに書かれており、小さく Qwerty のも書かれています。

機能

以下の機能があります。

  • ハードウェアで Dvorak 配列
  • キートップには DvorakQwerty 両方の位置での文字が書いてある(Dvorak の方がメイン)
  • USB ポートが2つ付属
  • 配列を Qwerty に切り替えるボタンが付属しており、DvorakQwerty を切り替えられる。

雑感

適当に感じた事です。

  • タッチは良くない。Dell の PC についてくるようなキーボードの感触と大差ない感じ。
    # Matias Dvorak キーボードは、メンブレンです。
  • キーボードを繋いだ瞬間から Dvorak 配列で使える(メインが Dvorak)。

耐えられないものではありませんが、タッチは本当に良くないです。
Dvorak 配列のキーボードという点でみると、TyepMatirx や KINESIS は Fn+F1 を押したり、キーを入れ替えたりしなければ、Dvorak にできませんが、これはキーボードを繋いだ瞬間から Dvorak です。
Dvorak 配列をメインにすえた数少いキーボードと言えると思います。

まとめ

キーボードとして正直安っぽいですが、Dvorak 配列の練習、入門用と考えれば悪くないと言えると思います。
Dvorak 配列にハードウェアでできるキーボードは特殊な形状(まあ、格子配列です)だったり、プログラマブルであったりして、触る敷居が高かったり、値段が高かったりします(プログラマブルだと2万円以上がざら)。その点、このキーボードは、普通のキー配列(格子配列ではないという意味で)であり、かつ、困ったとき Qwerty に一発で切り替えられます。また、値段も $99 ほどですので、プログラマブルキーボードほど高くはありません。そういう意味で、練習や入門用に使うキーボードとしては良いと思います。また、キーボードの機能として Dvorak 配列は実現されているので、ソフトウェアで何も設定はいらず、さくっと使えるので、布教用にも良いかもしれませんw


なお、注文は Matias の Web ページから直接行いました。Kagi ストアというところです。値段は上でも書いたように $99 ほどでした。注文から到着までは、20日ほどかかってしまったので、注文する場合は来るのが遅いのでゆっくり待つと良いです。



それでは、このキーボードが店頭でも買えるようになってもっと Dvorak や Colemak 等の Qwerty 以外の配列が一般的になれば良いなあとか思いながら、そんなこんなで。

更新時刻

  • 2011/10/13/01/50

行頭と行の最初のインデント位置に移動を C-a でくりかえす

どこかで見たけれども、探すのが面倒だったので書いてみました。Emacs 24 でのみ動作をかくにん。

(global-set-key "\C-a" '(lambda (arg)
			  (interactive "^p")
			  (cond
			   ((bolp)
			    (call-interactively 'back-to-indentation))
			   (t
			    (move-beginning-of-line arg)))))

これで C-a を連打するだけで、「行頭」→「行の最初のインデント位置」→「行頭」以下繰り返しとなるはずー。
ただそれだけ。

更新時刻

- 2011/9/24/02:40

Qwerty US キーボードを Dvorak 配列に変換する USB デバイス QIDO を買った

geekhack を見ていたところ、QIDO という、Qwerty - Dvorak USB コンバータをみつけたので買ってみました。
1個 $89 で、送料は、$20 ほどでした。

画像


画像は、以下です。見た目何ら変哲の無い USB デバイスです。
下の方の写真のように Qwerty US (英字)配列のキーボードと挿す事で Qwerty 配列の出力を Dvorak 配列に変換して渡します。
つまり、Qwerty 配列のキーボードで、ソフトウェアの設定なしに Dvorak 配列が使えます。

雑感

色々と試してみての雑感は、以下です。

  • 遅延はまったく気にならない。普通に使える。
  • ただし、全ての USB キーボードで使えるというわけではなく、キーボードを選ぶ。

前者の遅延ですが、自分は Dvorak 配列をタッチタイプで打てはしますが非常に遅いです。
なので、開発環境勉強会に行った際にネイティブの Dvorak 使いの方に会ったので、気にならないか試してもらいました。
その結果、「問題ない。全く気にならない」という旨の感想を頂けたので十分に使いものになると言えると思います。


後者の「キーボードを選ぶ」が問題です。試したところ、HHK Pro 2 では動作しませんでした。
どういう条件ならば駄目という因果関係がよくわからないです。現在動作確認をしたキーボードは、以下にまとめてあります。
# 試して欲しいキーボードがあれば、持っていれば試します。

だいたいの英字配列のキーボードで動作するようですが、一部動作しないキーボードがあるようです。

まとめ


Dvorak 配列の実現というと、ソフトウェアで行う事が非常に多いと思いますがハードウェアで実現する事で以下の利点が得られます。

  • ソフトウェアでは何も設定する必要がない(Admin や root 権限不要!)
  • BIOS 画面や Live CD、 Login 画面上等あらゆる場所で Dvorak 配列が使える
  • QIDO を介して実現した Dvorak 配列のキーボードと Qwerty 配列のキーボードを PC にさす事で、QwertyDvorak 両方を同時に使える
    # Dvorak 配列を練習する際に最適

Dvorak 配列に変更できるキーボードとしては、KINESIS のコンタードキーボードや Typematrix 等いくつかありますが、
QIDO を使う事で使い慣れたキーボードをそのまま Dvorak 配列にできます。
# もちろん Qwerty US 配列でなければならず、一部のキーボードでは動作しないという制約はありますが。


$89 と少々高いですが、Dvorak 配列をメインで使っている人、Dvorak 配列に手を出してみたい人に十分おすすめできるデバイスだと思います。
また、Dvorak だけでなく、Dvorak-Qwerty、Single Handed left、Single Handed right もサポートしているようなので(まともに試してないです。すみません)、
そっちの配列に興味ある人やそっちの配列を使っている人にもおすすめです。

更新時刻

  • 2011/08/09/01:35

Unicomp のポインティングスティックつきキーボードと Dvorak 配列のキーボード買った

またまたキーボードです。キーボード買ったネタならいっぱいあります(6月は週1ぐらいのペースで買ってたり…)。どうもこんにちは。
Unicomp のポインティングスティックつきキーボードが買えるようになってたので、買ってみました。
ついでに他のキーボードも漁ってたところ、Dvorak 配列のタイプも買えるようだったので、これも買ってみました。
先に感想を一言書くと、「製品としては面白いけど、質はひどい」です。買う場合は、それなりに覚悟が必要です。



2枚しかありませんが、画像です。

左がポインティングスティックつきのキーボード (Endura)で Qwerty 配列です。
右が Dvorak 配列のタイプ(SpaceSaver PC)です。キートップの印字も実際に打たれるキーもちゃんと Dvorak です。
全て USB のタイプです。


感想とかです。

  • まず、出来がひどい。
    USB ポートに挿して入力しようとしたとき、スペースやエンターが入力できないときがある。
    こういうときは、挿し直したりしてるとふと入力できるようになる。
  • ポインティングスティックつきのモデルは、カーソル移動と左クリック、右クリックのみ。スクロールや中クリックはなし
  • キーボード自体がかなりでかい。
  • タッチは重くはなく、多少軽め。ただし、うるさい。
  • 買う際の送料がめちゃくちゃ高い($80)。

自分がひいたのがはずれなのかもしれませんが、1つ目の項目が全てです。これさえなければなあ…。
ちなみに、入力できないキーがあって、USB ポートにさし直したりして入力できるようになったら、基本的にまた入力できなくなるってのは起きてないです。
# 最初、手元の Linux PC に接続したときに起きて、Win PC を用意してそっちで実験したりしてたら、いつのまにか使えるようになってました…。なぞです。
なお、タッチは良いと思います。自分は好みです。



出来は中々ひどく、そうそう人に薦められるものではないですが、Dvorak 配列のタイプを選べたり、ポインティングスティックつきのタイプがあったりと、かなり面白いキーボードである事は事実です。
送料は Unicomp の推奨する海外配送用の業者を選ぶと $80 とかなり高く、個人、少量で買うにはちょっとつらい部分があります。
高い送料を払って、はずれをひいても良いという気概がある場合は、面白いキーボードですし、手を出しても良いのではないでしょうか。


個人で買うと送料高いし、またネオテックさんが販売してくんないかなーとか思いながら、
そんなこんなで。

更新時刻

  • 2011/07/02/23:50

Sony の PS3 用ワイヤレスキーボード買った

ほぼ月1のキーボード買ったブログになってます(買ってもブログに書いてないキーボードも多いけど…)。こんにちは。
Sony から PS3 向けのポインティングスティックつきワイヤレスキーボードという面白そうなモンが発売されると知ったので買ってみました。
amazon では、Playstation3専用 ワイヤレスキーボードとかいう名前ですが、ワイヤレスは独自のものではなくて、Bluetooth なので、PC でも普通に使えます。



例によって画像です。


だいたい機能とかちょっと使って感じた事とかです。

- 配列は、JIS。
- ワイヤレスは、Bluetooth 接続。手元の Linux PC で繋いで使える事を確認済。
- もちろん、ポインティングスティックも使える。
- マウスの機能としては最低限のみ。カーソル移動と左クリック、右クリックのみ。スクロールと中クリックはなし。
- 単3電池2個で稼動。
- キータッチは最高!とは言えないけど、ひっかかりとかないし悪くはない。
- キーボード自体はずっしりくる。持ち歩けない事はないだろうけど、ちょっと重い。
- キーボードの縦置きができるので、置き場所はあんまりとらなさそう。
- PS3 用なので、Fn キーとの組み合わせで「○ボタン」だったり、「×ボタン」だったりが打てて、コントローラとしても使えるみたい。



amazon で 4100 円ぐらいで買えたので、ポインティングスティックつき、ワイヤレスというだけで普通はそれなりに値段しますし、けっこうお買い得だと思います。
個人的には、英字配列が出ればいいなあと思ってます。
PS3 向けという事で海外展開もあるのではないかなー、そしたら英字もーとか勝手に想像してます。


しかし、それなりに使える bluetooth キーボードは、ポケモンタイピングのキーボードといい、何故ゲーム関係なんだろうとか思いながら、
そんなこんなで。

追記

試していて気付きましたが、たまに入力をとりこぼしますorz
それだけがちょっと残念です…。

更新時刻

  • 2011/07/02/21:45
  • 2011/07/03/01:15