2015/02/01

Logicool Trackman Marble (TM-150r)のカップ安定化

LogicoolのMarbleはとても気に入って使っているが、自分のはボールを支えるカップがややガタついていた(個体差か?)。
特に日常作業に支障はないわけだが少し気になりだしたので、分解して固定性を高めることにした。ネジは底板の裏のラベルのところにある隠しネジを含めて5個。これらを外すとスムーズに開いた。開くと、カップは底板とは別にある程度自由に動く構造になっており、これがガタつきの原因と思われた。
瞬間接着剤で固定というのも考えたが、家に瞬間接着剤がなかったのと、やや非可逆的手段になるのが少しためらわれた。他の手段がないかと考えて、詰め物で固定する方法とした。紙で固定するのは、腐ったりカビが生えたりすると嫌だったので、ある程度の厚みがあるプラスチックということで、いらないクリアファイルを切って詰め物として使うことにした。
まず、上下方向のガタつきを抑制するため、底板とカップの間に、底にある穴を邪魔しないような形でクリアファイルを形にあうように切り、3枚重ねにした。
次に、カップと支柱のような構造との間にわずかなすきまがあり、これが前後左右方向のガタつきの原因と考えられたため、幅2mm、長さ8mmくらいに切った長方形のクリアファイルの破片を、これらの間に満遍なく差しこむように留置した。
十分にクリアファイルの破片を差し込み、カップのガタつきがないのを確認し、蓋をしめてネジを戻し、終了。しばらく使ってみたが、ガタつかず、だいぶ使いやすくなったと思った。もっと早くやってればよかった。

2014/05/13

LinuxでTrackballで左右同時押しスクロール

Kensington Slimbladeの左クリックのスイッチが壊れたので、今回は違うのを試してみようと思ってKensington Orbit Wireless Mobile Trackballを購入した(Slimbladeは機会があればハンダゴテで修理したいと思う)。
本機にはセンサースクロールがあるが、使い勝手があまりよろしくない。例えばWindowsとかの環境だと、トラックボールを使う場合は左右ボタン同時押し+ボール回転でスクロールするようにするのが一般的らしい。少し調べた限りでは、Linuxにおいては例えばLogicoolのTrackman Marble TM-150rとかの場合、ボタンの一つ(例えば左小ボタンなど)をスクロール用に割り当てる方法が一般的なようであった。

2ボタントラックボールでボールでスクロールをする場合どのようにすればいいかについて色々試してみたため、忘れないようメモしておく。

xorg.confでできるボタン設定について(evdev使用):
Option "Emulate3Buttons" "true/false"
Button 1,Button 3の同時押しでButton 2にできる。

Option "EmulateThirdButton" "true/false"
Button 1の長押し(EmulateThirdButtonTimeout)で任意のボタン(EmulateThirdButtonButton)にできる。

Option "EmulateWheel" "true/false"
任意のボタン(EmulateWheelButton)を押しながらのボール操作でスクロールできる。ただしそのボタンはEmulateされたボタンであってはならない。
例えば、
Option "Emulate3Buttons" "true" ← Button 2を1,3同時押しでエミュレートする
Option "EmulateWheel"  "true"
Option "EmulateWheelButton" "2"
の場合、「"EmulateWheelButton' "2"」 は無効である。これが一番やりたいんだが。


解決策1. 右ボタンをスクロール用に割り当てる。

xorg.conf -----
  Option     "ButtonMapping" "1 3 2 4 5 6 7 8"
 Option     "EmulateThirdButton" "true"
 Option     "EmulateThirdButtonTimeout" "400"
 Option     "EmulateThirdButtonButton" "2"
 Option     "EmulateThirdButtonMoveThreshold" "1"
 Option     "EmulateWheel"       "true"
 Option     "EmulateWheelButton" "3"
 Option     "EmulateWheelTimeout" "250"
 Option     "YAxisMapping"  "4 5"
 Option     "XAxisMapping"  "6 7"
-----

右ボタンをスクロール用にしてしまうと、副作用として右クリックドラッグができなくなる。自分の場合、右クリックドラッグが必要であった。
EmulateThirdButtonとEmulate3Buttonsは同時に使用できないか(ソースちょっと見たが、あんまり詳しく読んでないw)?そのためButtonMappingで右ボタンを中クリック(Button 2)にする。"EmulateWheelButton" "3"の3は物理的な右ボタンを意味するので、右ボタンをスクロール用にする。こうすると右クリックに相当するものが必要になるので、左ボタン長押しで右クリックを出すようにする。"EmulateThirdButtonButton" "2"でButtonMappingの2番目、すなわちButton 3とする。
この設定なら、400ms以上左ボタンを長押しすれば右クリックが出せる。EmulateThirdButtonMoveThreshold (1px)以上ポインタを動かせば、左クリックドラッグ扱いとなる。

左ボタン→左クリック
左ボタン長押し→右クリック
右ボタン→中クリック
右ボタン+ボール操作→スクロール

となる。長押しに慣れれば結構便利かもしれないとは思った。


解決策2. やっぱり左右同時押しでスクロールしたい。

EmulateWheelButtonがEmulateされたボタンであってはならない、というのが制約である。ソースコード修正が必要となった。これを書いている時点で、gentooではxf86-input-evdev-2.8.2が最新っぽかったのでこれをget。/src/emuMB.c がMiddle Button Emulationをしている。むずかしいステートマシンになっているようで、ここの理解はあきらめたw。。。ただ、EvdevMBEmuFilterEvent()関数で、EvdevQueueButtonEventでエミュレートボタンをQueueしていることでボタンをエミュレートしていた。ここにEmulateWheelを行うEvdevWheelEmuFilterButton()をhookすればいいかもしれない。EvdevQueueButtonEvent()に投げる引数をそのまま投げることにした。

myemu.patch -----
diff -ur xf86-input-evdev-2.8.2/src/emuMB.c xf86-input-evdev-2.8.2-my/src/emuMB.c
--- xf86-input-evdev-2.8.2/src/emuMB.c 2013-08-29 14:10:43.000000000 +0900
+++ xf86-input-evdev-2.8.2-my/src/emuMB.c 2014-05-12 23:07:32.939481119 +0900
@@ -237,12 +237,14 @@
 
     if ((id = stateTab[pEvdev->emulateMB.state][*btstate][0]) != 0)
     {
-        EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
+ if (!EvdevWheelEmuFilterButton(pInfo, abs(id), (id >= 0)))
+     EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
         ret = TRUE;
     }
     if ((id = stateTab[pEvdev->emulateMB.state][*btstate][1]) != 0)
     {
-        EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
+ if (!EvdevWheelEmuFilterButton(pInfo, abs(id), (id >= 0)))
+     EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
         ret = TRUE;
     }
-----

xorg.conf -----
 Option     "Emulate3Buttons"       "true"
 Option     "Emulate3Timeout"       "100"
 Option     "EmulateWheel"       "true"
 Option     "EmulateWheelButton" "2"
 Option     "EmulateWheelTimeout" "250"
 Option     "YAxisMapping"  "4 5"
 Option     "XAxisMapping"  "6 7"
-----

ソースをくまなく読んだわけではないし、あまり深く考えてもいないが、これでなんとかいけてる(かもしれない)。引数は理論的にこれで正しいか、他の修正は本当に必要ないのか、等の質問には全く答えられないが、とりあえず下記のように動くようになった。

左ボタン→左クリック
右ボタン→右クリック
左右ボタン同時押し→中クリック
左右ボタン同時押し+ボール操作→スクロール

中クリックドラッグができないのは仕様ということになるか。
この方法だとやっぱ便利だわ。

2013/03/20

Buffalo LinkStation LS-X1.0TLJで遊ぶ。


ついに約1万円という大枚をはたいて念願のNAS(Buffalo Linkstation LS-X1.0TLJ)を購入。
これで家の中でファイル共有とかができる!!
早速分解。
実は、今まで購入を躊躇しつづけた理由はこうしてジャンクにしてしまうことで1万円をドブに捨てることが怖かったからだ!
キーボードとかモニタが繋げないシステムは怖い。シリアルコンソールとか持ってないし。。boot成功→ssh起動→接続までできなければすなわちjunkである。
PCから復元しようにも壊した後だとHW環境がわからなかったりしてお手上げ。。
今回、勇気を出して購入してみた。
分解したら、小さな基板とSATAの3.5inchHDDがくっついていた。HDDはTOSHIBA。
ちっちゃさに感動。
LS-X1.0TLJはLS-XLシリーズという種類であり、Linuxが動いている。ということがわかった。
まず、普通に本体を起動。きちんと動くことを確認。
Windows機(VMwareだが)にBuffaloのツールを入れる。
すなわち、Buffalo NAS Navigator2と、ファームウェアアップデータ(LSUpdater)だ。
http://buffalo.jp/download/driver/hd/ls_fw.html
特にLSUpdater.exeはBuffalo純正、改造の際必須のツールである(とのちに悟った)。

次に、nas_central.orgでacp_commander.jarというツールを入手。ググれば詳細が出てくるが、
root権限でコマンドを外から実行させることができる。sshを有効化する前のつなぎや復旧困難になったときの助けになる。

使い方はtargetが192.168.0.10として
$ java -jar acp_commander.jar -t 192.168.0.10 -ip 192.168.0.10 -pw password -c "whoami"
root
みたいな感じ。最後がroot権限で動作するコマンドである。


今回はまず、試行錯誤の末、LS-XLのHDD交換手順を把握したのでまとめたい。

1) HDDセットアップ
まず新品(でなくてもよいが)のHDDをPCにセット。/dev/sdbとする。
# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                              
Model: ATA TOSHIBA DT01ACA1 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      17.4kB  1000MB  1000MB  ext3         primary  boot

とりあえずpartedでこのような状態まで持ち込む。boot flagはparted上でset 1 boot onでsetできる。


2) HDDをlinkstationからブートできるようにする。
ファームウェアは今回はls_series-164を使用。v.1.64だ。
上記LSUpdater.exeに同梱されてきたuImage.img、initrd.imgをそれぞれcopy、zipにリネームしunzip。
パスワードは http://buffalo.nas-central.org/wiki/How_to_modify_an_initrd などネット上に書いてある。
initrd.zipからinitrd.buffaloを、uImage.zipからはuImage-lsp.5.x.buffaloを取り出す(uImage-88f5182はLS-XLの場合スルーでよい)。
uImage-lsp.5.x.buffaloをuImage.buffaloにrename。
こうして得たinitrd.buffal、uImiage.buffaloを上記partitionにぶち込む。
# mount /dev/sdb1 /mnt/hdd && mv initrd.buffalo uImage.buffalo /mnt/hdd
でOK。
ここでHDDをlinkstationにセット。linkstationの電源を投入する。

3) firmware書き込み
LSUpdate.exeの出番である。まず、LSUpdate.iniを編集し
[Flags]
VersionCheck = 0
NoFormatting = 0

[SpecialFlags]
Debug = 1
最後のほうをこのように書き換える。
LSUpdate.exeを起動したら左上のアイコンを右クリックし、デバッグモードを選択。
この段階でネットワーク上のlinkstationは検出されているべきだ。linkstationはu-bootというbootloaderを使用しており(ROM上にある)、先ほどのuImage.buffaloがu-boot対応kernelである。
initrdが立ち上がり、initrd環境内でdhcp clientが立ち上がるはずとなっている。linkstationが見つからない場合はネットワーク設定およびHDDの状態を見直す。
とりあえずチェックボックスに全部チェックをつけて(IPアドレス云々のところは無視してよい)、ファームウェア更新。
ここでfirmwareの書き換え、再起動などが始まるわけだが、かなり待っていると"Linkstationの起動完了を待っています" "しばらくお待ち下さい"の後に"LinkStationからの応答を1200秒間待機しましたが応答がありませんでした もう一度待機してよろしいですか?"と出るのでいいえとする。すると"LinkStationからの応答がありませんでした アップデートを中止します"となる。
その後、"LS-XL-EMD89からの応答を確認できませんでした"となりlinkstationが検出できなくなる。

ここでLinkStationの電源を切り、ふたたびHDDを取り外しPCに接続。
(parted) p                                                              
Model: ATA TOSHIBA DT01ACA1 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name     Flags
 1      1049kB  1026MB  1024MB  ext3            primary
 2      1026MB  6146MB  5120MB  ext3            primary
 3      6146MB  6147MB  1049kB                  primary
 4      6147MB  6148MB  1049kB                  primary
 5      6148MB  7172MB  1024MB  linux-swap(v1)  primary
 6      7172MB  992GB   985GB   xfs             primary
このようにformatしてくれたことがわかる。
ここで
(parted) set 1 boot on
し # mount /dev/sdb1 /mnt/hddでマウント。
# ls /mnt/hdd
builddate.txt              u-boot_lsxlv2_64mb.bin  uImage.map
hddrootfs.buffalo.updated  uImage-88f5182.buffalo
initrd.buffalo             uImage-lsp.5.x.buffalo
このような状態。最初にいれたuImageは消されてる。。。?ここで
# cp uImage-lsp.5.x.buffalo uImage.buffalo
で再びuImage.buffaloを作成(シンボリックリンクでいいかは試してない)
これが必要だと悟るまでしばらくかかった。
ふたたびumount、PCからHDDを取り外しlinkstationに戻し、電源投入。

4) 起動。
ここが最大のポイントなのだが、ここでしばらく待つ。5-6分は覚悟したほうがよい。
この時間は、おそらくhddrootfs.buffalo.updatedを/などに展開している時間である(/dev/sdb2に相当)。
電源ランプは青く点滅しておりboot失敗の状態やエラーと外から区別がつかないが、待ち続ける。ここが最大のハマりどころである。
すると電源ランプの点滅が終わり、青く点灯した状態となる。
BUFFALO NAS Navigatorで確認すると認識できており、正常起動したとわかる。めだたしめでたし。

NAS Navigatorからshutdown。パスワードはdefaultのpasswordである。

5) root passwordクリア、ssh導入
以上で終わってもよいが、とりあえず続ける。

rootパスワードクリア /etc/shadow編集
# sed -i 's/root:[^:]*:/root::/g' /etc/shadow

/etc/sshd_config編集、初回ログインのためPermitEmptyPasswordにしておく
# sed -i 'sed -i 's/UsePAM yes/UsePAM no/g' /etc/sshd_config'
# sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/sshd_config
# echo "PermitEmptyPassword yes" >> /etc/sshd_config

hosts.allow作成
# echo "sshd:ALL" >> /etc/hosts.allow

inetdに登録 -iはinetdから起動するオプション。sshdは/usr/local/sbin/にある。
# echo "ssh stream tcp nowait root /usr/local/sbin/sshd /usr/local/sbin/sshd -i" >> /etc/initd.conf

別に全部emacsでやってもいいです。

これでふたたびlinkstationにHDDを接続、起動。
ssh root@192.168.0.10でログインできる。めでたしめでたし。

6) sshログイン、rootパスワード設定ww
まず# passwd rootでパスワードを設定し、PermitEmptyPasswordをnoにする。

このLinkStationは11,000円くらいで購入した。1TB HDDの値段を7,000円前後としても、4,000程度でlinuxマシンを入手できたことになり、感動。

2013/02/10

vmware-player-5.0.1.894247が落ちる件について(curl)


ある日(今日だが)、突然vmware-playerが立ち上がらなくなっていた。vmware-player自体のversionを変更した覚えはない。
vmplayerのウィンドウが出ずに、zsh: abortとなって落ちる。segfaultっぽい。
おそらく日々のemergeでなんらかのパッケージが入れ替わったことによるのだろう。
しかしばらくvmwareを起動してなかったので原因パッケージは不明だった。
/tmp/vmware-metro/以下のログファイルを見ても、セグフォっている原因はいまいち不明だった。
gdbでトレースすることにした。

$ gdb vmplayer

(gdb) r
Starting program: /opt/vmware/bin/vmplayer
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7fffe1112700 (LWP 7096)]

Program received signal SIGSEGV, Segmentation fault.
0x00007fffe8c1d997 in curl_multi_cleanup () from /usr/lib64/libcurl.so.4

どうやらcurlで落ちてる?ということでcurlのversionを1個前にもどした。
emerge -1 "=net-misc/curl-7.28.1"
vmplayerは無事立ち上がる。
curlをふたたび7.29.0に戻したところやはり落ちる。
どうやら、自分の環境ではnet-misc/curl-7.29.0との相性(笑)がよくないよう。
特にこれ以上の原因追求をする気にはなれず終了とした。
やっぱ困った時はgdbか。
やっぱ琴浦さん面白いわ。

2012/11/23

gentoo mediatomb-0.12.1-r4.ebuild compile error


uPnP serverのmediatombを最近使い始めたが、mediatomb-0.12.1-r4.ebuildでコンパイルできなくなった。
bugzillaを見るとこれに相当するか。https://bugs.gentoo.org/show_bug.cgi?id=442602
error: ‘CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_CACHE_DIR’ was not declared in this scope
で止まる。
config_mangager.hでは次のように。

typedef enum
{
// 途中略
#if defined(HAVE_FFMPEG) && defined(HAVE_FFMPEGTHUMBNAILER)
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_ENABLED,
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_THUMBSIZE,
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_SEEK_PERCENTAGE,
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_FILMSTRIP_OVERLAY,
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_WORKAROUND_BUGS,
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_IMAGE_QUALITY,
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_CACHE_DIR_ENABLED,
    CFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_CACHE_DIR,
#endif
// 略
} config_option_t;

HAVE_FFMPEGTHUMBNAILERがないとCFG_SERVER_EXTOPTS_FFMPEGTHUMBNAILER_CACHE_DIRが宣言されずエラーになる模様。
最も簡単な解決法はUSE="thumbnail"とする事っぽかった。
ffmpegthumbnailerがインストールされ、無事mediatombとともにコンパイル終了。

GIRLS & PANZERすげえ面白いわ!!

2012/11/04

Gentooの/etc/make.conf

久しぶりにGentooの/etc/make.confの整理をした。
globalにおいとかなくてもいいUSE flagを削除しすっきりさせる方向で整理。例えば"python", "gnutls" use flagとかも現時点で必要がないので消した。

ACCEPT_KEYWORDS="~amd64"
CFLAGS="-O2 -march=core2 -mtune=core2 -pipe "

CHOST="x86_64-pc-linux-gnu"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j8"
USE="X gnome gtk3 alsa pulseaudio cups crypt dbus dvd \
     ipv6 threads \
     mp3 ogg flac wma mad aac a52 vorbis cdda x264 xvid mpeg ffmpeg \
     jpeg png gif svg tiff pdf truetype \
     cjk unicode cairo \
     opengl nvidia xv ncurses xinerama \
     mmx mmxext sse sse2 sse3 ssse3 \
     -qt3support -qt -qt4 -kde -oss -arts -esd -canna"

INPUT_DEVICES="evdev joystick wacom"
VIDEO_CARDS="nvidia"
FEATURES="splitdebug"
SYNC="rsync://rsync.gentoo.org/gentoo-portage/"
ACCEPT_LICENSE="*"
PORTDIR_OVERLAY="/usr/local/portage \
/var/lib/layman/vmware"
PORTAGE_ECLASS_WARNING_ENABLE="0"
source /var/lib/layman/make.conf

今のところこんな感じ。もっとすっきりさせていきたい。

2012/10/21

sambaのパスワード


samba 3.xのpasswordの格納場所としてsmbpasswdファイルは推奨されないようだ。
確かにgentooにportageからsambaをインストールした時もシステムにsmbpasswdファイルは存在しなかった。
testparm -v | grep passで/var/lib/samba/private/smbpasswdとは出てくるがw。
実態はpassdb backend = tdbsamとなっており、ユーザ情報の格納にはtdbファイルが使用されている。
TDB(Trivial Database)というユーザ管理データベースだそうだ。
自分の環境では/var/lib/samba/private/passdb.tdbだった。
tdbファイルはバイナリファイルだが、tdbファイルの内容をdumpするtdbdumpというコマンドがあるため、中をのぞくことができる。
$ tdbdump /var/lib/samba/private/passdb.tdb
でOK。