10月の読書メーター

「万城目 学」って変な名前という認識でしかなかった(ごめんなさい万城目さん)。
それが、本名かつ面白いという認識に変わった十月だった。

読んだ本の数:6冊
読んだページ数:1714ページ

鴨川ホルモー (角川文庫)鴨川ホルモー (角川文庫)
変ったサークルに入った大学生のお話し.軽妙である.まず,文体がふわりとして読みやすい. そして,ストーリーはテンポ良く進んでいく.青春+スポーツ+恋愛+友情+ファンタジー+ツンデレ
読了日:10月27日 著者:万城目 学
群衆の悪魔 下 (デュパン第四の事件) (創元推理文庫)群衆の悪魔 下 (デュパン第四の事件) (創元推理文庫)
読了日:10月27日 著者:笠井 潔
群衆の悪魔 上 (デュパン第四の事件) (創元推理文庫)群衆の悪魔 上 (デュパン第四の事件) (創元推理文庫)
読了日:10月22日 著者:笠井 潔
再びラストホープ (パリの悪党たち) (創元推理文庫)再びラストホープ (パリの悪党たち) (創元推理文庫)
ラストホープという作品の続編らしいが,その前作は読んだことがない. クライムコメディ.極悪人は登場しない.文体が特徴的,寓話を読んでいるような気分になる, 別に全然そんなことはないのだが.雰囲気がファンタジーとミステリーの境界,悪くいえば御都合主義的 展開,良くいえば主人公達が置かれている状況が二転三転して面白い.主人公達が釣具屋からか,各章には釣り用語の タイトルが付けてある.これもまた,寓話っぽさを感じさせる.どうやら,著者はいろいろなタイプの 作品を書いているらしい.他の作品も気になる.
読了日:10月14日 著者:浅暮 三文
天使の屍 (集英社文庫)天使の屍 (集英社文庫)
読了日:10月12日 著者:貫井 徳郎
伊坂幸太郎選 スペシャル・ブレンド・ミステリー 謎005 (講談社文庫)伊坂幸太郎選 スペシャル・ブレンド・ミステリー 謎005 (講談社文庫)
「盗まれて」の腹黒さが妙に面白かった.
読了日:10月03日 著者:陳 舜臣,今邑 彩,泡坂 妻夫,夏樹 静子,真保 裕一,連城 三紀彦,小松 左京,鈴木 輝一郎

読書メーター

BUFFALO USB無線LAN WLI-UC-GN を Archlinux で使用する


標準のArchlinuxでは動作しないUSB無線LAN WLI-UC-GN
http://buffalo.jp/products/catalog/network/wli-uc-gn/
を使用するための方法。ドライバにパッチ当ててビルドし、設定ファイルを書く。
(追記,少なくともkernel 2.6.36.2ではモジュールの読み込みを禁止するだけでよい)

何もしない場合はうまく動かない

とりあえず,起動中のArchlinuxにさしてみた.

% dmesg | tail
wlan0: RX AssocResp from 00:24:a5:c5:1d:58 (capab=0x31 status=0 aid=1)
wlan0: associated
Intel AES-NI instructions are not detected.
padlock: VIA PadLock not detected.
usb 1-7: new high speed USB device using ehci_hcd and address 5
phy1: Selected rate control algorithm 'minstrel'
Registered led device: rt2800usb-phy1::radio
Registered led device: rt2800usb-phy1::assoc
Registered led device: rt2800usb-phy1::quality
usbcore: registered new interface driver rt2800usb

あれ,普通に認識してね?

% sudo netcfg airstation

// airstation がウチの無線LAN親機

:: airstation up                             [BUSY]
 > WPA Authentication/Association Failed     [FAIL]

が,ダメ!!

% lsusb
...
Bus 001 Device 005: ID 0411:015d MelCo., Inc. Buffalo WLI-UC-GN Wireless LAN Adapter [Ralink RT2870]
...

なんか認識できてるっぽいんだけどねー.

追記 (2010年 12月 27日 月曜日)

Archlinuxのkernel 2.6.36.2にあるrt2870staで動きました.
ただし次のモジュール読み込みを禁止:rt2800usb, rt2800lib, rt2x00usb.

環境等

  • Arch Linux (kernel 2.6.35.8)
  • wireless_tools 29-3

webで調べてみた

分かったこと
  • 使用チップは Ralink RT3070.RT2870ではないらしい.
  • Ralinkは公式でLinuxドライバを出している.

http://www.ralinktech.com/support.php?s=2

  • どうやら動くらしい
  • rt2800usb, rt2800lib, rt2x00usbを読み込まないようにすると良いかも?

AURにrt3070usbという,ドンピシャのパッケージがあるが,このパッケージに必要な
ドライバファイルは公式サイトにはもうない.もうないのだ.

よろしいならば,自分で作ろうではないか.

モジュールの作成

http://www.ralinktech.com/support.php?s=2
からRT3070USB(RT307x)の用のドライバファイル
DPO_RT3370_LinuxSTA_V2.4.0.1_20100831.tgz をもらう.
このとき,何故か名前とメールアドレスを入力しなくてはいけない
(メールにダウンロードURLが遅られてくるとか,そういうことはないので恐らくデタラメでもOK?)
基本的に
http://aur.archlinux.org/packages.php?ID=38021
に従う.

PKGBUILD

pkgname=rt3370
pkgver=2.4.0.1
_pkgdate=20100831
pkgrel=1
pkgdesc="Kernel module and firmware for RaLink RT3070USB WiFi adapter"
url="http://eng.ralinktech.com.tw/support.php?s=2"
license=('GPL')
arch=('i686' 'x86_64')
depends=('kernel26')
install=${pkgname}.install
backup=(etc/Wireless/RT2870STA/RT2870STA.dat)
source=(DPO_RT3370_LinuxSTA_V${pkgver}_${_pkgdate}.tgz
	WLI-UC-GN.patch)
build() {
  cd $srcdir/DPO_RT3370_LinuxSTA_V${pkgver}_${_pkgdate}

  sed -i /"tftpboot"/d Makefile
  patch -Np1 < ${srcdir}/WLI-UC-GN.patch
  make 

  install -D -m 644 -c RT2870STA.dat ${pkgdir}/etc/Wireless/RT2870STA/RT2870STA.dat
  install -D -m 755 -c os/linux/rt3370sta.ko ${pkgdir}/lib/modules/$(uname -r)/kernel/drivers/net/wireless/rt3370sta.ko
  install -D -m 644 -c README_STA_usb ${pkgdir}/usr/share/doc/${pkgname}/README_STA_usb
  install -m 644 -c *.txt ${pkgdir}/usr/share/doc/${pkgname}/
  install -m 644 -c *.dat ${pkgdir}/usr/share/doc/${pkgname}/
}
md5sums=('1f73af693f88f0bc468b5489bfbef282'
         '25f7cb8dd8155d4a5859e862f08ded96')

WLI-UC-GN.patch

diff -Naur DPO_RT3370_LinuxSTA_V2.4.0.1_20100831.orig/common/rtusb_dev_id.c DPO_RT3370_LinuxSTA_V2.4.0.1_20100831/common/rtusb_dev_id.c
--- DPO_RT3370_LinuxSTA_V2.4.0.1_20100831.orig/common/rtusb_dev_id.c	2010-09-01 10:47:30.000000000 +0900
+++ DPO_RT3370_LinuxSTA_V2.4.0.1_20100831/common/rtusb_dev_id.c	2010-10-30 22:33:04.371980004 +0900
@@ -109,6 +109,7 @@
 	{USB_DEVICE(0x0789,0x0166)}, /* Edimax */
 	{USB_DEVICE(0x0DB0,0x822B)}, /* MSI 3070*/

 	{USB_DEVICE(0x0DB0,0x871B)}, /* MSI 3070*/
+	{USB_DEVICE(0x0411,0x015d)}, /* WLI-UC-GN */
 #endif // RT3070 //
 #ifdef RT3370
 	{USB_DEVICE(0x148F,0x3370)}, /* Ralink 3370 */
diff -Naur DPO_RT3370_LinuxSTA_V2.4.0.1_20100831.orig/os/linux/config.mk DPO_RT3370_LinuxSTA_V2.4.0.1_20100831/os/linux/config.mk
--- DPO_RT3370_LinuxSTA_V2.4.0.1_20100831.orig/os/linux/config.mk	2010-08-31 18:12:20.000000000 +0900
+++ DPO_RT3370_LinuxSTA_V2.4.0.1_20100831/os/linux/config.mk	2010-10-30 22:29:37.478667450 +0900
@@ -26,10 +26,10 @@
 HAS_APCLI=n
 
 # Support Wpa_Supplicant
-HAS_WPA_SUPPLICANT=n
+HAS_WPA_SUPPLICANT=y
 
 # Support Native WpaSupplicant for Network Maganger
-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
 
 #Support Net interface block while Tx-Sw queue full
 HAS_BLOCK_NET_IF=n

rt3370.install

post_install() {
  /sbin/depmod -a
}

post_upgrade() {
  /sbin/depmod -a
}

post_remove() {
  /sbin/depmod -a
}

設定等

モジュールのロード

% sudo modprobe rt3370sta

邪魔なモジュールのロードを禁止するために
/etc/modprobe.d/modprobe.conf

# WLI-UC-GN
blacklist rt2800usb
blacklist rt2800lib
blacklist rt2x00usb

としておく.多分,/etc/rc.confでも設定できるはず.


ちょっとよく分からないのだが,どうやら
/etc/Wireless/RT2870STA/RT2870STA.dat
に色々書かないとうまく動かないみたい.

#The word of "Default" must not be removed
Default
CountryRegion=0
CountryRegionABand=7
CountryCode=JP
ChannelGeography=1
SSID=<ESSID>
NetworkType=Infra
WirelessMode=5
Channel=0
BeaconPeriod=100
TxPower=100
BGProtection=0
TxPreamble=0
RTSThreshold=2347
FragThreshold=2346
TxBurst=1
PktAggregate=0
WmmCapable=1
AckPolicy=0;0;0;0
AuthMode=WPA2PSK
EncrypType=TKIP
WPAPSK=<PASS>
DefaultKeyID=1
Key1Type=0
Key1Str=
Key2Type=0
Key2Str=
Key3Type=0
Key3Str=
Key4Type=0
Key4Str=
PSMode=CAM
AutoRoaming=0
RoamThreshold=70
APSDCapable=0
APSDAC=0;0;0;0
HT_RDG=1
HT_EXTCHA=0
HT_OpMode=0
HT_MpduDensity=4
HT_BW=1
HT_BADecline=0
HT_AutoBA=1
HT_AMSDU=0
HT_BAWinSize=64
HT_GI=1
HT_MCS=33
HT_MIMOPSMode=3
HT_DisallowTKIP=1
HT_STBC=0
EthConvertMode=
EthCloneMac=
IEEE80211H=0
TGnWifiTest=0
WirelessEvent=0
MeshId=MESH
MeshAutoLink=1
MeshAuthMode=OPEN
MeshEncrypType=NONE
MeshWPAKEY=
MeshDefaultkey=1
MeshWEPKEY=
CarrierDetect=0
AntDiversity=0
BeaconLostTime=4
FtSupport=0
Wapiifname=ra0
WapiPsk=
WapiPskType=
WapiUserCertPath=
WapiAsCertPath=
PSP_XLINK_MODE=0
WscManufacturer=
WscModelName=
WscDeviceName=
WscModelNumber=
WscSerialNumber=
RadioOn=1

自分はnetcfgを使用している。
/etc/network.d/foo

CONNECTION="wireless"
DESCRIPTION="A simple WPA encrypted wireless connection"
INTERFACE="ra0"
SECURITY="wpa"

ねぇ,今どんな気持?


ねぇねぇ、君の研究結果よりも
良いものがこの論文にのってるけど
今どんな気持ち?
        ∩___∩                     ∩___∩
    ♪   | ノ ⌒  ⌒ヽハッ    __ _,, -ー ,,    ハッ   / ⌒  ⌒ 丶|
        /  (●)  (●)  ハッ   (/   "つ`..,:  ハッ (●)  (●) 丶     今、どんな気持ち?
       |     ( _●_) ミ    :/       :::::i:.   ミ (_●_ )    |        ねぇ、どんな気持ち?
 ___ 彡     |∪| ミ    :i        ─::!,,    ミ、 |∪|    、彡____
 ヽ___       ヽノ、`\     ヽ.....:::::::::  ::::ij(_::●   / ヽノ     ___/
       /       /ヽ <   r "     .r ミノ~.    〉 /\    丶
      /      /    ̄   :|::|    ::::| :::i ゚。     ̄♪   \    丶
     /     /    ♪    :|::|    ::::| :::|:            \   丶
     (_ ⌒丶...        :` |    ::::| :::|_:           /⌒_)
      | /ヽ }.          :.,'    ::(  :::}            } ヘ /
        し  )).         ::i      `.-‐"             J´((
          ソ  トントン                             ソ  トントン 



            ヾヽ'::::::::::::::::::::::::::'',    / 時 .あ ま ヽ
             ヾゝ:::::::::::::::::::::::::::::{     |  間 .わ だ  |
             ヽ::r----&#8212;‐;:::::|    | じ て    |
             ィ:f_、 、_,..,ヽrリ    .|  ゃ る     |
              L|` "'  ' " ´bノ     |  な よ     |
              ',  、,..   ,イ    ヽ い う    /
             _ト, ‐;:-  / トr-、_   \  な   /
       ,  __. ィイ´ |:|: ヽ-- '.: 〃   `i,r-- 、_  ̄ ̄
      〃/ '" !:!  |:| :、 . .: 〃  i // `   ヽヾ
     / /     |:|  ヾ,、`  ´// ヽ !:!     '、`
      !      |:| // ヾ==' '  i  i' |:|        ',
     |   ...://   l      / __ ,   |:|::..       |
  とニとヾ_-‐'  ∨ i l  '     l |< 天  ヾ,-、_: : : .ヽ
 と二ヽ`  ヽ、_::{:! l l         ! |' 夂__ -'_,ド ヽ、_}-、_:ヽ


それに,完全に包含されているわけでもないしね.


とは言ったものの,やべぇwww.
まぁ,面白くなってきたからいいかwww.

追記(2010年 10月 16日 土曜日 18:22:34 JST

冷静になって,良く読んだら,別にどうってことなかった.
まぎらわしいタイトルをつけないでほしいよな(と責任転嫁).

追記(2010年 10月 18日 月曜日 13:35:56 JST

と思ったら,ある論文で(以下略)
教訓.サーベイは超重要.

texlive2010のinstallとlyxの設定(Archlinux)

texlive2010には標準でplatex/ptexが同梱されている.
texlive-langcjkにはjsclassesが含まれている(@Archlinux).
ただ,pxdviはないっぽい.
しかし,dvi->pdfはdvipdf, dvipdfm, dvipdfmx のどれでも変換できてacroreadで閲覧するとちゃんと日本語表示された.
(どうやらdvipdf=dvips+gs, dvipdfm=dvipdfmxぽい)
つまり,実用にほぼ問題は無いので,texlive2010を使うことにした.

ptexliveのuninstall

% sudo rm -rf /usr/local/texlive
% sudo rm /etc/profile.d/ptexlive.sh

と思ったけど設定ファイルとか参考になるからpathを変更して(新しいtex環境の邪魔にならないように),texlive2010が問題なく
動くようにしてから,アンインストールが良いと思った.

texlive2010のinstall

とりあえず全部install.

% sudo pacman -S texlive-bin texlive-most texlive-lang

(なんか心配だったので,一端uninstallしてからinstallした.)

その他のクラスファイルなどのinstall

babelのjapanese
pkgname=texlive-babel-ja
pkgver=1
pkgrel=1
pkgdesc="Japanese options of babel"
arch=('any')
license=('unknown')
url="ftp://ftp.kddilabs.jp/CTAN/"
install=${pkgname}.install
source=(ftp://ftp.kddilabs.jp/CTAN/language/japanese/japanese/japanese.dtx
    ftp://ftp.kddilabs.jp/CTAN/language/japanese/japanese/japanese.ins)

build() {
    cd $srcdir
    ptex japanese.ins
    install -D ${srcdir}/japanese.dtx ${pkgdir}/usr/share/texmf-dist/tex/generic/babel/japanese.dtx
    install -D ${srcdir}/japanese.ins ${pkgdir}/usr/share/texmf-dist/tex/generic/babel/japanese.ins
    install -D ${srcdir}/japanese.ldf ${pkgdir}/usr/share/texmf-dist/tex/generic/babel/japanese.ldf
}
md5sums=('ebf783c563b6c17b940005ab030fa108'
         'd76d2f5d425eae8a0f5e9f87cc9c25f7')

.install

post_install() {
    texconfig-sys rehash 2>/dev/null
}

post_upgrade() {
    post_install $1
}

makepkg -fci するとyかnか聞かれるが,yで問題ないと思う.

suribt
pkgname=texlive-suribt
pkgver=20070118
pkgrel=1
pkgdesc="suribt"
arch=('any')
license=('unknown')
url="http://www.keisu.t.u-tokyo.ac.jp/research/suribt/"
install=${pkgname}.install
source=(http://www.misojiro.t.u-tokyo.ac.jp/suribt/suribt-20070118.zip)

build() {
    cd $srcdir
    install -d ${pkgdir}/usr/share/texmf-dist/tex/platex/suribt
    install -m 644 suribt.* ${pkgdir}/usr/share/texmf-dist/tex/platex/suribt
}
md5sums=('318364bf7af4e88cd83e9d0ad888a820')

.installは同上.

lyxの設定

変更は以下.

「設定」->「ファイル処理」->「変換子」-> 「DVI->Postscript」

変換子をdvipsに.

「設定」->「ファイル処理」->「ファイル書式」-> 「DVI」

閲覧プログラムをxdviに.
ちなみに,日本語表示方法は不明.

suribtを使う

suribtはマイナーなスタイルファイルなので,lyxで標準では用意されていない.
しかし,ほぼjsbookだろうということで
~/.lyx/layouts/suribt.layoutとして

#% Do not delete the line below; configure depends on this
#  \DeclareLaTeXClass{book (suribt)}
# Japanese new book textclass definition file.

# This style provides japanese features 
Provides japanese 1

# Input general definitions
Input book.layout

を作成し,lyxで「ツール」->「再初期設定」を実行すれば良い.
また,suribtで変更したtodayがbabelのjapaneseによって再度変更されるので,
プリアンブルに \title,\authourの他に

\def\datejapanese{%
  \def\today{%
    \if西暦%
      \number\year 年%
      \number\month 月%
      % \number\day 日%
    \else
      平成\the@heisei 年%
      \number\month 月%
      % \number\day 日%
    \fi}
}

と書いて,戻してやると幸せになれるはず.

dvipdfmxでのフォント埋め込み

dvipdfで作成したpdfはipaフォントが埋め込まれていた.
これは多分,/usr/share/ghostscript/8.71/Resource/Init/cidfmapに

/IPAMincho		<< /FileType /TrueType /Path (/usr/share/fonts/TTF/ipam.ttf) /CSI [(Japan1) 6] >> ;
/IPAGothic		<< /FileType /TrueType /Path (/usr/share/fonts/TTF/ipag.ttf) /CSI [(Japan1) 6] >> ;
/Ryumin-Light	   	/IPAMincho
/GothicBBB-Medium	/IPAGothic

という記述があるからだろう.多分.

しかし,dvipdfmxで

rml	H	ipam.ttf
rmlv	V	ipam.ttf
gbm	H	ipag.ttf
gbmv	V	ipag.ttf

のようなファイルを利用してIPAフォントを埋め込もうとするとipam.ttfとかipag.ttfが見つけられないと文句がでる.
kpsewhichとかいうやつが探すらしい.
どうやらサーチパスはtexmf.cnfで設定されているらしい.
通常は/usr/share/texmf/web2c/texmf.cnfにあるがArchlinuxではこれはシンボリックリンクになっている
実体は/etc/texmf/web2c/texmf.cnfにある(別にどちらを編集しも問題ないが).
このtexmf.cnfのOSFONTDIRをコメントアウトする.

% OSFONTDIR is to provide a convenient hook for allowing TeX to find
% fonts installed on the system (outside of TeX).  An empty default
% value would add "//" to the search paths, so we give it a dummy value.
OSFONTDIR = /usr/share/fonts

すると

% kpsewhich ipam.ttf
/usr/share/fonts/TTF/ipam.ttf

ところで,ptexlive2009ではこの設定をしてなかったし,こんな風な設定ファイルではなかった.
しかし,ipam.ttfは埋め込めた記憶がある.何故?


ptexliveの場合はdvipdfmx用fontmap(?)が(ptex-ipa-ttf.mapとか)
texmf/fonts/map/dvipdfm/ptexlive/
以下に存在した.
そこで,それらを
/usr/share/texmf-dist/fonts/map/dvipdfm/ptexlive
におくことにした.texmf-distなのは,jsclassesがtexmf-distにあるから.

pkgname=texlive-ptexlive-fontmap
pkgver=1
pkgrel=1
pkgdesc="dvipdfm fontmaps from ptexlive"
arch=('any')
license=('unknown')
install=${pkgname}.install
source=(ptexlive-fontmap.tar.gz)

build() {
    cd $srcdir
    install -d ${pkgdir}/usr/share/texmf-dist/fonts/map/dvipdfm/ptexlive
    install -m 644 ptexlive/*.map ${pkgdir}/usr/share/texmf-dist/fonts/map/dvipdfm/ptexlive
}
md5sums=('318364bf7af4e88cd83e9d0ad888a820')
md5sums=('d95468afa386fd63f76de95c023aeb79')

Cpufreq

時代はエコである.
うちのデスクトップPCは,ほとんどアイドル状態である.
しかし,アイドル状態でもCPUは動作周波数は最大値である.
ヒマなときは少しサボってもバチはあたらないんじゃない?
ということで動的にCPUの動作周波数を変更する設定を行う.

ツールのダウンロード.

% sudo pacman -S cpufrequtils

とりあえず,CPUの情報.

% sudo modprobe acpi-cpufreq
% cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0 1
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 10.0 us.
  hardware limits: 2.00 GHz - 3.17 GHz
  available frequency steps: 3.17 GHz, 2.67 GHz, 2.33 GHz, 2.00 GHz
  available cpufreq governors: performance
  current policy: frequency should be within 2.00 GHz and 3.17 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency is 3.17 GHz.
analyzing CPU 1:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 10.0 us.
  hardware limits: 2.00 GHz - 3.17 GHz
  available frequency steps: 3.17 GHz, 2.67 GHz, 2.33 GHz, 2.00 GHz
  available cpufreq governors: performance
  current policy: frequency should be within 2.00 GHz and 3.17 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency is 3.17 GHz.

今は performanceしか選択できないが,

% sudo modprobe cpufreq_ondemand

とすれば,ondemandも選択可能になる.

起動時に有効にするためデーモンにたのむ.
/etc/conf.d/cpufreq

governor="ondemand"

として,/etc/rc.confのDAEMONSの欄に追加.

MODULES=(acpi-cpufreq cpufreq_ondemand !pcspkr !acer-wmi !acerhdf !usblp)
(中略)
DAEMONS=(syslog-ng cpufreq !network @crond @hal @alsa @net-profiles !sshd)

9月の読書メーター

全然読んでない.内容重めの本を軽めの本でサンドイッチ.

読んだ本の数:6冊
読んだページ数:2471ページ

阪急電車 (幻冬舎文庫)阪急電車 (幻冬舎文庫)
読了日:09月26日 著者:有川 浩
空白の叫び〈下〉 (文春文庫)空白の叫び〈下〉 (文春文庫)
上中下読み終わった。上巻が一番面白かった。中下もつまらなかったわけでない。 しかし、帯に救いの物語的なことがあったので 「夜想」や「神のふたつの貌」のような救いを期待していたからかもしれない。 上巻は非常に読んでいて面白かった。これは自分がこれまで、犯罪者の内面を深く精緻に 描いた作品を読んだことがないからかもしれない。こういう作品はさがしてもなかなか無いのでは?
読了日:09月25日 著者:貫井 徳郎
空白の叫び〈中〉 (文春文庫)空白の叫び〈中〉 (文春文庫)
読了日:09月25日 著者:貫井 徳郎
空白の叫び〈上〉 (文春文庫)空白の叫び〈上〉 (文春文庫)
読了日:09月25日 著者:貫井 徳郎
神のふたつの貌 (文春文庫)神のふたつの貌 (文春文庫)
キリスト教の牧師とその息子の話.ちなみに,私のキリスト教に関する知識は皆無である. テーマが重く,主人公が人間離れしているのだが,読み難いことはなく,物語に引き込まれた. とりあえず,読んで,なぜだか,面白かったのだが,解説を読んで本作の特筆点を知り,その仕掛けに 驚いた.ただ,全面的に理解したわけではなく,まだよく分からないこともある. たとえば,輝はなぜ,最後に神の声を聞くことができたのか,など. ところで,現実の宗教は”神の沈黙”について,どう説明しているのかなぁ.
読了日:09月08日 著者:貫井 徳郎
有頂天家族 (幻冬舎文庫)有頂天家族 (幻冬舎文庫)
舞台は京都.登場するのは少しの人間と,少しの天狗と,沢山の狸. 雰囲気は,太陽の塔とか,四畳半神話大系に似ている. 主人公はある狸の家族の三男.立派な父から阿呆ぶりだけを受け継いだらしい. 矢三郎のように生活したいものだ.
読了日:09月04日 著者:森見 登美彦

読書メーター

xf86-input-evdev-2.5.0 のSandS用パッチ

追記(2011年2月21日)

定家さんこの記事のコードの改良版をgitに公開(下のURL)してくださいました。
http://gitorious.org/at-home-modifier
しっかりとしたREADMEなどが付随しているので、現状ではそちらのコードを使用したほうが良いでしょう。

(追記終わり)


Linux で SandS の実現を目指す : xf86-input-evdev の修正(メモ) - 落書き、時々落学 を最新用にした.
つまり,evdevがアップデートされたので,それに対応.
といっても,ほぼ何もしていない.
xcalloc が deprecated されたらしいので,とりあえず calloc に変えておいたぐらい.

PKGBUILD

pkgname=xf86-input-evdev
pkgver=2.5.0
pkgrel=1
pkgdesc="X.org evdev input driver"
arch=(i686 x86_64)
url="http://xorg.freedesktop.org/"
license=('custom')
depends=('glibc')
makedepends=('xorg-server-devel')
conflicts=('xorg-server<1.9.0')
options=('!libtool' !makeflags)
groups=('xorg-input-drivers')
source=(${url}/releases/individual/driver/${pkgname}-${pkgver}.tar.bz2
	${pkgname}-${pkgver}-mad-key.patch)

build() {
  cd "${srcdir}/${pkgname}-${pkgver}"
  patch -p0 -i ${srcdir}/${pkgname}-${pkgver}-mad-key.patch
  ./configure --prefix=/usr
  make
  make DESTDIR="${pkgdir}" install
  install -m755 -d "${pkgdir}/usr/share/licenses/${pkgname}"
  install -m644 COPYING "${pkgdir}/usr/share/licenses/${pkgname}/"
}
sha1sums=('fe83410d76830ec15c4a73ace385d66644c58944'
          'e5ed1217fb22594dffe6976883dae71427784ba6')

patch

http://dl.dropbox.com/u/662567/xf86-input-evdev-2.5.0-mad-key.patch
に置いてある.念の為,ここにもコードを載せておく.

diff -Naur src.orig/evdev.c src/evdev.c
--- src.orig/evdev.c	2010-10-02 11:34:25.213939676 +0900
+++ src/evdev.c	2010-10-02 11:42:23.187641557 +0900
@@ -115,6 +115,32 @@
  * cannot be used by evdev, leaving us with a space of 2 at the end. */
 static EvdevPtr evdev_devices[MAXDEVICES] = {NULL};
 
+static void AddMadKey(EvdevPtr pEvdev, int trigger, int transfer, MadKeyType type)
+{
+    MadKeyList *keyList = pEvdev->madKeyList;
+    MadKeyList *key;
+    if (keyList != NULL) {
+        while (keyList->next != NULL)
+            keyList = keyList->next;
+    }
+    
+
+    key = calloc(sizeof(MadKeyList), 1);
+    if (key == NULL)
+        return;
+
+    key->madKey = &key->madKeyEntity;
+    key->madKey->trigger = trigger;
+    key->madKey->transfer = transfer;
+    key->madKey->type = type;
+    key->next = NULL;
+
+    if (keyList == NULL)
+        pEvdev->madKeyList = key;
+    else
+        keyList->next = key;
+}
+
 static int EvdevSwitchMode(ClientPtr client, DeviceIntPtr device, int mode)
 {
     InputInfoPtr pInfo;
@@ -262,13 +288,25 @@
 static int wheel_left_button = 6;
 static int wheel_right_button = 7;
 
+static void
+EvdevEnqueKeyEvent(EvdevPtr pEvdev, int code, int value)
+{
+    EventQueuePtr pQueue = &pEvdev->queue[pEvdev->num_queue];
+    pQueue->type = EV_QUEUE_KEY;
+    pQueue->key = code + MIN_KEYCODE;
+    pQueue->val = value;
+    pEvdev->num_queue++;
+}
+
 void
 EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
 {
-    int code = ev->code + MIN_KEYCODE;
-    EventQueuePtr pQueue;
     EvdevPtr pEvdev = pInfo->private;
 
+    int scanCode = ev->code;
+    unsigned int tmpScanCode = scanCode;
+    unsigned int lastScanCode = pEvdev->lastScanCode;
+
     /* Filter all repeated events from device.
        We'll do softrepeat in the server, but only since 1.6 */
     if (value == 2
@@ -289,11 +327,88 @@
         return;
     }
 
-    pQueue = &pEvdev->queue[pEvdev->num_queue];
-    pQueue->type = EV_QUEUE_KEY;
-    pQueue->key = code;
-    pQueue->val = value;
-    pEvdev->num_queue++;
+
+   /*
+    * Sticky Key
+    */
+    if (value) {
+        if (pEvdev->stickyPhase == 1) {
+            pEvdev->stickyPhase = 2;
+            EvdevEnqueKeyEvent(pEvdev, pEvdev->stickyScanCode, TRUE);
+            goto madKeyFinish;
+        } else if (pEvdev->stickyPhase == 2) {
+            pEvdev->stickyPhase = 0;
+            EvdevEnqueKeyEvent(pEvdev, pEvdev->stickyScanCode, FALSE);
+            goto madKeyFinish;
+        }
+    } else {
+        MadKeyList *keyList;
+        for (keyList = pEvdev->madKeyList; keyList != NULL; keyList = keyList->next) {
+            MadKey *key = keyList->madKey;
+            if (key->type == MAD_KEY_STICKY
+                && key->trigger == scanCode
+                && lastScanCode == scanCode) {
+                if (pEvdev->stickyPhase == -1) { /* ignore */
+                    pEvdev->stickyPhase = 0;
+                    break;
+                } else {
+                    pEvdev->stickyPhase = 1;
+                    pEvdev->stickyScanCode = keyList->madKey->transfer;
+                    return;
+                }
+            }
+        }
+    }
+    
+    /*
+     * Pseudo Modifier
+     */
+    {
+        MadKeyList *keyList;
+        for (keyList = pEvdev->madKeyList; keyList != NULL; keyList = keyList->next) {
+            MadKey *key = keyList->madKey;
+            if (key->type == MAD_KEY_PSEUDO_MOD
+                && key->trigger == scanCode) {
+                if (lastScanCode == key->transfer) {
+                    tmpScanCode = lastScanCode;
+                    pEvdev->stickyPhase = -1;
+                } else if (value)
+                    scanCode = key->transfer;
+                else {
+                    if (lastScanCode == scanCode) {
+                        EvdevEnqueKeyEvent(pEvdev, key->transfer, FALSE);
+                        EvdevEnqueKeyEvent(pEvdev, key->trigger, TRUE);
+                    } else
+                        scanCode = key->transfer;
+                }
+                goto madKeyFinish;
+            }
+        }
+    }
+    
+    /*
+     * One Shot Modifier
+     */
+    if (!value) {
+        MadKeyList *keyList;
+        for (keyList = pEvdev->madKeyList; keyList != NULL; keyList = keyList->next) {
+            MadKey *key = keyList->madKey;
+            if (key->type == MAD_KEY_ONE_SHOT_MOD
+                && key->trigger == scanCode
+                && lastScanCode == scanCode) {
+                scanCode = key->transfer;
+                EvdevEnqueKeyEvent(pEvdev, lastScanCode, FALSE);
+                EvdevEnqueKeyEvent(pEvdev, scanCode, TRUE);
+                goto madKeyFinish;
+            }
+        }
+    }
+    
+  madKeyFinish:
+    if (value)
+        pEvdev->lastScanCode = tmpScanCode;
+    
+    EvdevEnqueKeyEvent(pEvdev, scanCode, value);
 }
 
 void
@@ -1100,6 +1215,8 @@
 
     pInfo = device->public.devicePrivate;
     pEvdev = pInfo->private;
+    pEvdev->lastScanCode = 0;
+    pEvdev->stickyPhase = 0;
 
     /* sorry, no rules change allowed for you */
     xf86ReplaceStrOption(pInfo->options, "xkb_rules", "evdev");
@@ -2126,6 +2243,62 @@
         EvdevDragLockPreInit(pInfo);
     }
 
+    if (pEvdev->flags & EVDEV_KEYBOARD_EVENTS)
+    {
+        pEvdev->madKeyList = NULL;
+        if (xf86FindOption(pInfo->options, "StickyShift")) {
+          AddMadKey(pEvdev, KEY_LEFTSHIFT, KEY_LEFTSHIFT, MAD_KEY_STICKY);
+          AddMadKey(pEvdev, KEY_RIGHTSHIFT, KEY_RIGHTSHIFT, MAD_KEY_STICKY);
+          xf86Msg(X_CONFIG, "%s: StickyShift enabled\n", pInfo->name);
+        }
+        if (xf86FindOption(pInfo->options, "StickyCtrl")) {
+          AddMadKey(pEvdev, KEY_LEFTCTRL, KEY_LEFTCTRL, MAD_KEY_STICKY);
+          AddMadKey(pEvdev, KEY_RIGHTCTRL, KEY_RIGHTCTRL, MAD_KEY_STICKY);
+          xf86Msg(X_CONFIG, "%s: StickyCtrl enabled\n", pInfo->name);
+        }
+        if (xf86FindOption(pInfo->options, "StickyAlt")) {
+          AddMadKey(pEvdev, KEY_LEFTALT, KEY_LEFTALT, MAD_KEY_STICKY);
+          AddMadKey(pEvdev, KEY_RIGHTALT, KEY_RIGHTALT, MAD_KEY_STICKY);
+          xf86Msg(X_CONFIG, "%s: StickyAlt enabled\n", pInfo->name);
+        }
+        if (xf86FindOption(pInfo->options, "PseudoModSpace")) {
+          int transfer = xf86SetIntOption(pInfo->options,
+                                          "PseudoModSpace",
+                                          MIN_KEYCODE) - MIN_KEYCODE;
+          AddMadKey(pEvdev, KEY_SPACE, transfer, MAD_KEY_PSEUDO_MOD);
+          xf86Msg(X_CONFIG, "%s: PseudoModSpace enabled\n", pInfo->name);
+        }
+        if (xf86FindOption(pInfo->options, "OneShotShift")) {
+          int transfer = xf86SetIntOption(pInfo->options,
+                                          "OneShotShift",
+                                          MIN_KEYCODE) - MIN_KEYCODE;
+          AddMadKey(pEvdev, KEY_LEFTSHIFT, transfer, MAD_KEY_ONE_SHOT_MOD);
+          AddMadKey(pEvdev, KEY_RIGHTSHIFT, transfer, MAD_KEY_ONE_SHOT_MOD);
+          xf86Msg(X_CONFIG, "%s: OneShotShift enabled\n", pInfo->name);
+        }
+        if (xf86FindOption(pInfo->options, "OneShotCtrl")) {
+          int transfer = xf86SetIntOption(pInfo->options,
+                                          "OneShotCtrl",
+                                          MIN_KEYCODE) - MIN_KEYCODE;
+          AddMadKey(pEvdev, KEY_LEFTCTRL, transfer, MAD_KEY_ONE_SHOT_MOD);
+          AddMadKey(pEvdev, KEY_RIGHTCTRL, transfer, MAD_KEY_ONE_SHOT_MOD);
+#ifdef XKB
+          if (xkb_options != NULL && strstr(xkb_options, "ctrl:swapcaps") != NULL)
+            AddMadKey(pEvdev, KEY_CAPSLOCK, transfer, MAD_KEY_ONE_SHOT_MOD);
+#endif
+          xf86Msg(X_CONFIG, "%s: OneShotCtrl enabled\n", pInfo->name);
+        }
+        if (xf86FindOption(pInfo->options, "OneShotAlt")) {
+          int transfer = xf86SetIntOption(pInfo->options,
+                                          "OneShotAlt",
+                                          MIN_KEYCODE) - MIN_KEYCODE;
+          AddMadKey(pEvdev, KEY_LEFTALT, transfer, MAD_KEY_ONE_SHOT_MOD);
+          AddMadKey(pEvdev, KEY_RIGHTALT, transfer, MAD_KEY_ONE_SHOT_MOD);
+          xf86Msg(X_CONFIG, "%s: OneShotAlt enabled\n", pInfo->name);
+        }
+
+				}
+
     return pInfo;
 
 error:
diff -Naur src.orig/evdev.h src/evdev.h
--- src.orig/evdev.h	2010-10-02 11:34:25.213939676 +0900
+++ src/evdev.h	2010-10-02 11:34:32.114356654 +0900
@@ -104,6 +104,25 @@
     int traveled_distance;
 } WheelAxis, *WheelAxisPtr;
 
+/* key status data for mad-key system  */
+typedef enum {
+     MAD_KEY_STICKY,
+     MAD_KEY_PSEUDO_MOD,
+     MAD_KEY_ONE_SHOT_MOD,
+} MadKeyType;
+ 
+typedef struct {
+     int        trigger;
+     int        transfer;
+     MadKeyType type;
+} MadKey;
+ 
+typedef struct MadKeyList {
+     MadKey             madKeyEntity;
+     MadKey            *madKey;
+     struct MadKeyList *next;
+} MadKeyList;
+
 /* Event queue used to defer keyboard/button events until EV_SYN time. */
 typedef struct {
     enum {
@@ -133,6 +152,17 @@
     int delta[REL_CNT];
     unsigned int abs, rel;
 
+    int                 lastScanCode;
+    int                 stickyScanCode;
+    /*
+     * -1: ignore
+     *  0: disabled
+     *  1: presss enabled
+     *  2: release enabled
+     */
+    int                 stickyPhase;
+    MadKeyList          *madKeyList;
+
     /* XKB stuff has to be per-device rather than per-driver */
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 5
     XkbComponentNamesRec    xkbnames;