10月の読書メーター
「万城目 学」って変な名前という認識でしかなかった(ごめんなさい万城目さん)。
それが、本名かつ面白いという認識に変わった十月だった。
読んだ本の数:6冊
読んだページ数:1714ページ
鴨川ホルモー (角川文庫)
変ったサークルに入った大学生のお話し.軽妙である.まず,文体がふわりとして読みやすい. そして,ストーリーはテンポ良く進んでいく.青春+スポーツ+恋愛+友情+ファンタジー+ツンデレ.
読了日:10月27日 著者:万城目 学
群衆の悪魔 下 (デュパン第四の事件) (創元推理文庫)
読了日:10月27日 著者:笠井 潔
群衆の悪魔 上 (デュパン第四の事件) (創元推理文庫)
読了日:10月22日 著者:笠井 潔
再びラストホープ (パリの悪党たち) (創元推理文庫)
ラストホープという作品の続編らしいが,その前作は読んだことがない. クライムコメディ.極悪人は登場しない.文体が特徴的,寓話を読んでいるような気分になる, 別に全然そんなことはないのだが.雰囲気がファンタジーとミステリーの境界,悪くいえば御都合主義的 展開,良くいえば主人公達が置かれている状況が二転三転して面白い.主人公達が釣具屋からか,各章には釣り用語の タイトルが付けてある.これもまた,寓話っぽさを感じさせる.どうやら,著者はいろいろなタイプの 作品を書いているらしい.他の作品も気になる.
読了日:10月14日 著者:浅暮 三文
天使の屍 (集英社文庫)
読了日:10月12日 著者:貫井 徳郎
伊坂幸太郎選 スペシャル・ブレンド・ミステリー 謎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で調べてみた
参考
http://slashdot.jp/~ymitsu/journal/494533
http://masaoo.blogspot.com/2009/06/ubuntu-usb-lan-buffalo-wli-uc-gn.html
https://forums.ubuntulinux.jp/viewtopic.php?id=7557
http://www.ansaldocomputing.com/ubuntu-10-10-maverick-issues-with-wli-uc-gn-wireless-adapter.html
分かったこと
- 使用チップは 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----—‐;:::::| | じ て | ィ: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)
冷静になって,良く読んだら,別にどうってことなかった.
まぎらわしいタイトルをつけないでほしいよな(と責任転嫁).
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;