とりあえず暇だったし何となく始めたブログ このページをアンテナに追加 RSSフィード

UNIX 系企業のぺーぺー

2014/12/29

コミケEmacs 本出します

去年同様に Emacs 本を出します。

内容は、現状での新機能(25.1 で含まれるであろう機能)やブランチで実装実験されている機能の一部を解説するものとなります。

一昨年のキーボード本も持っていきます。


何も問題なければ、以下に居るはずです。

  • c87 火曜日 西地区 "く"-13b

数は、相変わらず宣伝しないので少数です。

コミケに行く用事があって暇なら寄っていただけたら、というところです。

更新時刻

  • 2014/12/29 22:15

2013/12/30

コミケEmacs 本出します

Emacs の NEWS を解説した本(24.4 の新機能を説明した本)を出します。全部解説しようとしましたが無理でした。いくつか抜粋してます。

去年のキーボード本も出す予定です。


何も問題なければ、以下に居るはずです。

  • c85 3日目 西す09b

去年以上に宣伝していないので、冊数は極少数です。

コミケに行く用事があって暇なら寄っていただけたらな、という感じです.

更新時刻

  • 2013/12/30 19:35

2013/03/29

[] thinkfan

Thinkpad X201 + (X)Ubuntu 12.10 で作業していると頻繁に再起動してくれるようになっちゃったので

thinkfan を入れて設定したら頻繁に再起動することはなくなったよというメモ。


家でのメイン環境は Thinkpad X201 + (X)Ubuntu 12.10 を使っていているのだけど、数ヶ月前からだいぶ調子が悪かった。

ニコ生(nsen)を裏でかけっぱなしにしながら作業とかしてると突然ノート PC が再起動する。調べたところどうやら熱らしい。


sensors で温度を見ると90度以上になっていて、100度に到達した瞬間に再起動がかかるっぽい。

当初は温度にがくぶるしながら凌いでたんだけど、Emacsリポジトリbzr pull しただけで再起動してくれやがったりして、

良い加減苦しくなってきたので重い腰を上げてちゃんと対処を調べてみた。


で、どうやら thinkfan という Thinkpad の fan speed を自動調節するプログラムを使うのが常道らしい(今まで困ってなかったから全然知らなかった…)。


まず、Thinkpad の fan speed を制御するために thinkpad_acpi の設定をする。/etc/modprobe.d/thinkpad_acpi.conf に以下のように記載する。

 $ cat /etc/modprobe.d/thinkpad_acpi.conf
options thinkpad_acpi fan_control=1

この上で、thinkpad_acpi モジュールを再読み込みするなり、PC を再起動するなりすれば OK。

# …のはず。やったのかなり前で記憶があやしい。


うまくいっていると、以下のようなコマンドを叩くと thinkpad の fan の speed が変わるはず。disengaged を指定すると fan が轟音を立てはじめて、Thinkpad の温度が急激に下がる。

 $ echo level 1 > /proc/acpi/ibm/fan
 $ echo level 7 > /proc/acpi/ibm/fan
 $ echo level auto > /proc/acpi/ibm/fan
 $ echo level disengaged > /proc/acpi/ibm/fan

普段から disengaged とかしていると煩くてかなわないので、この fan speed を Thinkpad の温度を元に自動調節するようにする。

これには thinkfan を使えば良く、thinkfan は、Ubuntu/Debian であれば、apt-get から簡単に導入が可能。

たぶん、事前に sensors を入れて設定しておく必要はあるような気は…する(lm-sensors パッケージ)。

 $ sudo apt-get install thinkfan

thinkfan の設定は、/etc/thinkfan.conf を参照する。適当にひろってきたサンプルを元に以下のように記載した。

(0,     0,      55)
(1,     48,     60)
(2,     50,     61)
(3,     52,     63)
(4,     56,     65)
(5,     59,     66)
# (7,   63,     32767)
(7,     63,     82)
(127, 80, 32767)

一番左が、level。真ん中と右が温度。Thinkpad の温度がだいたい59度を越えると fan speed の level が 5 になるという感じ。

温度がある程度高くなったときは、level 7 じゃなくて、やはり disengaged になってくれないと心配なのでその設定を追加しただけ。

ぐぐった内容を鵜呑みにした感じだと、127 と指定すると disengaged らしい (ちゃんと調べてない)。

# で、まあ、127 で 80 度越えると disengaged になってるっぽいから気にしていない。


あとは、適当に起動すれば OK。

 $ sudo service thinkfan start

# 起動時に自動起動するように、/etc/default/thinkfan をいじって START=yes とかしたような記憶があるけど、ちょっと定かじゃない…。


リハビリがてら、こんな内容で…(はてな記法を忘れていて愕然とした…)

更新時刻

  • 2013/3/30 00:40

[] tmux-mem-cpu-load

tmux のステータスラインに load average とかのっけたいなーと思ってぐぐったら、tmux-mem-cpu-load というそのものすばりなプログラムがあた。


github にあるのでソースコードgit clone してビルドする。

 $ git clone https://github.com/thewtex/tmux-mem-cpu-load.git
 $ cd tmux-mem-cpu-load
 $ cmake .
 $ make
 $ sudo make install

cmake とか使ってるけど、所詮 C++ ソース1ファイルだから、以下のように g++ 直接叩いてコンパイルしても良い。

 $ g++ -Wall tmux-mem-cpu-load.cpp -o tmux-mem-cpu-load

あとは、README.rst を参考に ~/.tmux.conf に以下を追記すれば OK。

set -g status-interval 2
set -g status-right-length 100
set -g status-right "#[bg=colour189] #(tmux-mem-cpu-load 2)  %m/%d/%Y %H:%M "


tmux を起動すれば以下の画像のように表示される。

既に tmux の中に居たなら、「C-t : source-file ~/.tmux.conf」とかやれば OK (C-t は prefix キー)。

f:id:khiker:20130330005729p:image

ステータスラインの白背景の部分が tmux-mem-cpu-load の情報をのっけているところ。

左から、メモリ使用量、CPU 利用率棒グラフ、CPU 利用率(割合)、ロードアベレージ(過去 1分、5分、15分)、現在時刻の順。

2 秒間隔での更新となる。


ソースコードを見ると /proc/stat とか /proc/meminfo とか /proc/loadavg とかいう文字列があるので、Linux じゃないと動かないかも。

とりあえず、Solaris 版はぐぐったら見っかった。


そんな感じで。

更新時刻

  • 2013/3/30 01:07

2012/12/30

コミケキーボード本出します

購入したキーボードがけっこうな数になってきたので、キーボード本出します。

内容は、キーボードの写真と少しのコメントをまとめたカタログ的な感じです。


特に何も問題なければ、以下に居るはずです。

  • c83 3日目 東 Y-10a

まったく宣伝していないので、まあ、冊数も極々少数しか用意してないです。

コミケに行く用事があって暇なら寄っていただければな、という感じです。

更新時刻

  • 2012/12/30 20:15

2011/12/29

[] Python で stand-alone バイナリを作る freeze を試してみた

なんとなくふと、Python で stand-alone な実行ファイル作れんのかなーと思って、検索してみたら、以下の FAQ を見付けたので試してみました。

One is to use the freeze tool, which is included in the Python source tree as Tools/freeze. It converts Python byte code to C arrays; a C compiler you can embed all your modules into a new program, which is then linked with the standard Python modules.」とのことで、C ソースに変換してコンパイルできるみたいです。


これを試してみたので、そのメモです。


環境

なんとなく、さくらVPS 上で作業しました。Ubuntu 10.04 です。

 $ python -V
python 2.6.5

対象ファイル

Hello, World を吐く Python スクリプトを変換してみます。

 $ cat hello.py
#!/usr/bin/env python

print "Hello, World"

# hello.py ends here.

準備

以下のパッケージを入れます。これらの他に gccmake のようなツールが必要です。build-essential あたりを入れておけば大丈夫に思います。

  • python2.6-examples
  • python2.6-dev
  • libssl-dev

python2.6-examples は、freeze.py を手に入れるために入れます。freeze.py が無いとバイナリが作れません。

python2.6-dev は、こいつを入れていないと、python ファイルから C ソースファイルを変換するときに「config.c.in」が無いと言われて変換に失敗します。

libssl は、変換した C ファイルをビルドするときに必要となります。


ただし、これだけでも駄目です。以下の差分を /usr/share/doc/python2.6/examples/Tools/freeze/makeconfig.py に適用する必要があります。

これを適用しないと、「undefined reference to `init_warnings'」と言われ、ビルドが成功しません。

手順

以上の準備が完了したら、以下のようにコマンドを叩きます。

 $ python /usr/share/doc/python2.6/examples/Tools/freeze/freeze.py ./hello.py
 $ make

C ソースへの変換は、python コマンドにfreeze.py ファイル、変換したい Python ファイルの順に渡します。

すると問題がなければ、大量の C ファイルと Makefile が作られるはずです(計13万行ぐらい)。

あとは、make と実行するだけです。

成果物

出来上がったバイナリは以下のような感じです。

 $ file ./hello
./hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
 $ du -sh ./hello
4.3M    ./hello

とまあ、けっこう馬鹿でかいファイルができあがります。もちろん出来上がったモノは普通に実行できます。

まとめ

とまあ以上のような感じです。作成が目的だったので、実行速度の差等は全然計測していません。

strip してもバイナリは、4Mぐらいなので、やっぱりちょっと大きいのが気になります。

なんとかもっと小さくできないのかなあとか思いながら、そんなこんなで。

更新時刻

  • 2011/12/30/00:20

2011/12/22

[] EmacsSL

このエントリは、Emacs Advent Calendar jp 2011の22日目です。

前日は、id:dev-null さんの アーティストモードでメリークリスマス でした。

明日は、id:r_takaishi さんです。

概要

sl とは、UNIX の有名なジョークコマンドです。

ディレクトリの内容一覧を表示する ls と間違えて sl と打つと、SL 機関車アスキーアートが端末上をかけぬけます。

これを Emacs Lisp で作成してみました。

使用

EmacsWikiソースを置き、Launchpad の個人領域上に bzr リポジトリも作りました。以下より取得できます。

このファイルを load-path の通ったディレクトリに置き、以下のように読み込むだけ使えます。

(require 'sl)

使用方法は、M-x sl とするだけです。

画像

画像はこんな感じです。

f:id:khiker:20111223001508p:image

動画

動画をとって、ニコニコにアップしてみました。エンコードとか考えてないので、ちょっと見辛いです。

動画は、recordmydesktop の gtk 版でとってみました。

D

まとめ

ちょっと急ごしらえで問題があるかもしれませんが、よかったら遊んでみてくださいー。

リンク

更新時刻

  • 2011/12/23 00:16

2011/11/12

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

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


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
Connection: close